Merge pull request #121 from JasonHHouse/featue/new_icons
Featue/new icons
@@ -11,24 +11,29 @@ jobs:
|
||||
node-version: [10.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@master
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- run: npm ci
|
||||
- run: npm run minify-input-css
|
||||
- run: npm run uglifyjs-index-js
|
||||
- run: npm run uglifyjs-configuration-js
|
||||
- run: npm run uglifyjs-libraries-js
|
||||
- run: npm run uglifyjs-recommended-js
|
||||
- run: npm run uglifyjs-common-js
|
||||
- run: npm run uglifyjs-payload-js
|
||||
- run: npm run uglifyjs-mislabeled-js
|
||||
- name: Set up JDK 11
|
||||
uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: 11.0.7
|
||||
- name: Build with Maven
|
||||
run: mvn clean install spotbugs:check --file pom.xml
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- run: npm install
|
||||
- uses: ./.github/actions/
|
||||
name: Build and push Docker image
|
||||
with:
|
||||
image: housewrecker/gaps
|
||||
tag: 0.4.0-SNAPSHOT
|
||||
registry: docker.io
|
||||
dockerfile: Dockerfile
|
||||
username: ${{ secrets.DOCKER_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
- name: Build Docker
|
||||
run: docker build -f Dockerfile -t housewrecker/gaps:latest .
|
||||
#- name: Update Username and Password
|
||||
# run: docker login -u="${{ secrets.DOCKER_USERNAME }}" -p="${{ secrets.DOCKER_PASSWORD }}"
|
||||
#- name: Publish to Registry
|
||||
# run: docker push housewrecker/gaps:latest
|
||||
|
||||
@@ -33,7 +33,3 @@ jobs:
|
||||
run: mvn clean install spotbugs:check --file pom.xml
|
||||
- name: Build Docker
|
||||
run: docker build -f Dockerfile -t housewrecker/gaps:latest .
|
||||
- name: Update Username and Password
|
||||
run: docker login -u="${{ secrets.DOCKER_USERNAME }}" -p="${{ secrets.DOCKER_PASSWORD }}"
|
||||
- name: Publish to Registry
|
||||
run: docker push housewrecker/gaps:latest
|
||||
|
||||
@@ -37,3 +37,5 @@ GapsOnWindows/*.jar
|
||||
cypress/screenshots
|
||||
cypress/videos
|
||||
Plex/target/
|
||||
|
||||
GapsWeb/src/main/resources/static/css/input.min.css
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>Gaps</artifactId>
|
||||
<groupId>com.jasonhhouse</groupId>
|
||||
<version>0.4.0-SNAPSHOT</version>
|
||||
<version>0.4.0</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<dependency>
|
||||
<groupId>com.jasonhhouse</groupId>
|
||||
<artifactId>Plex</artifactId>
|
||||
<version>0.4.0-SNAPSHOT</version>
|
||||
<version>0.4.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
|
||||
@@ -10,15 +10,15 @@ ENV ENABLE_SSL false
|
||||
|
||||
ENV ENABLE_LOGIN false
|
||||
|
||||
RUN mkdir -p /usr/data
|
||||
RUN mkdir -p /usr/data && chmod 777 /usr/data
|
||||
|
||||
COPY movieIds.json /usr/data
|
||||
|
||||
RUN mkdir -p /usr/app
|
||||
RUN mkdir -p /usr/app && chmod 777 /usr/data
|
||||
|
||||
WORKDIR /usr/app
|
||||
|
||||
COPY GapsWeb/target/GapsWeb-0.4.0-SNAPSHOT.jar /usr/app/gaps.jar
|
||||
COPY GapsWeb/target/GapsWeb-0.4.0.jar /usr/app/gaps.jar
|
||||
|
||||
COPY start.sh /usr/app/
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
<launch4jConfig>
|
||||
<dontWrapJar>false</dontWrapJar>
|
||||
<headerType>console</headerType>
|
||||
<jar>/Users/jhouse/Code/Gaps/GapsWeb/target/GapsWeb-0.4.0-SNAPSHOT.jar</jar>
|
||||
<outfile>/Users/jhouse/Desktop/Gaps-v0.4.0-SNAPSHOT.exe</outfile>
|
||||
<jar>/Users/jhouse/Code/Gaps/GapsWeb/target/GapsWeb-0.4.0.jar</jar>
|
||||
<outfile>/Users/jhouse/Desktop/Gaps-v0.4.0.exe</outfile>
|
||||
<errTitle></errTitle>
|
||||
<cmdLine></cmdLine>
|
||||
<chdir>.</chdir>
|
||||
@@ -37,7 +37,7 @@
|
||||
<productName>Gaps</productName>
|
||||
<companyName></companyName>
|
||||
<internalName>Gaps</internalName>
|
||||
<originalFilename>Gaps-0.4.0-SNAPSHOT.exe</originalFilename>
|
||||
<originalFilename>Gaps-0.4.0.exe</originalFilename>
|
||||
<trademarks></trademarks>
|
||||
<language>ENGLISH_US</language>
|
||||
</versionInfo>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>Gaps</artifactId>
|
||||
<groupId>com.jasonhhouse</groupId>
|
||||
<version>0.4.0-SNAPSHOT</version>
|
||||
<version>0.4.0</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
@@ -19,13 +19,13 @@
|
||||
<dependency>
|
||||
<groupId>com.jasonhhouse</groupId>
|
||||
<artifactId>Core</artifactId>
|
||||
<version>0.4.0-SNAPSHOT</version>
|
||||
<version>0.4.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.jasonhhouse</groupId>
|
||||
<artifactId>Plex</artifactId>
|
||||
<version>0.4.0-SNAPSHOT</version>
|
||||
<version>0.4.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
|
||||
@@ -20,6 +20,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
||||
import org.springframework.security.config.annotation.web.builders.WebSecurity;
|
||||
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
|
||||
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
|
||||
import org.springframework.security.core.userdetails.User;
|
||||
@@ -28,6 +29,8 @@ import org.springframework.security.core.userdetails.UserDetailsService;
|
||||
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
|
||||
import org.springframework.security.web.DefaultRedirectStrategy;
|
||||
import org.springframework.security.web.RedirectStrategy;
|
||||
|
||||
@Configuration
|
||||
@EnableWebSecurity
|
||||
@@ -63,7 +66,8 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
|
||||
"/js/jquery-3.4.1.min.js",
|
||||
"/js/bootstrap.bundle.min.js",
|
||||
"/js/index.min.js",
|
||||
"/images/final-2.svg").permitAll()
|
||||
"/images/final-2.svg",
|
||||
"/images/final-gaps.svg").permitAll()
|
||||
.anyRequest().fullyAuthenticated()
|
||||
.and()
|
||||
.formLogin()
|
||||
@@ -74,54 +78,69 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
|
||||
.permitAll();
|
||||
} else if (myConfig.getLoginEnabled() && !myConfig.getSslEnabled()) {
|
||||
LOGGER.info("Login Enabled. Configuring site security without ssl.");
|
||||
http.authorizeRequests().antMatchers("/images/**",
|
||||
"/css/**",
|
||||
"/js/**").permitAll()
|
||||
.anyRequest().permitAll()
|
||||
|
||||
http.cors().and().csrf().disable()
|
||||
.authorizeRequests()
|
||||
.anyRequest().fullyAuthenticated()
|
||||
.and()
|
||||
.formLogin()
|
||||
.loginPage("/login")
|
||||
.defaultSuccessUrl("/home")
|
||||
.permitAll()
|
||||
.and()
|
||||
.logout()
|
||||
.permitAll();
|
||||
|
||||
} else {
|
||||
http.cors().and().csrf().disable();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void configure(WebSecurity web) throws Exception {
|
||||
super.configure(web);
|
||||
web.ignoring().antMatchers("/resources/**", "/static/**", "/css/**", "/js/**", "/images/**");
|
||||
}
|
||||
|
||||
@Bean
|
||||
@Override
|
||||
public UserDetailsService userDetailsService() {
|
||||
LOGGER.info("userDetailsService()");
|
||||
PlexSearch plexSearch = null;
|
||||
try {
|
||||
plexSearch = ioService.readProperties();
|
||||
} catch (IOException e) {
|
||||
LOGGER.warn("No properties found to get password. Generating new password");
|
||||
}
|
||||
if (myConfig.getLoginEnabled()) {
|
||||
|
||||
String password;
|
||||
if (plexSearch == null || StringUtils.isEmpty(plexSearch.getPassword())) {
|
||||
password = UUID.randomUUID().toString();
|
||||
plexSearch = new PlexSearch();
|
||||
plexSearch.setPassword(password);
|
||||
LOGGER.info("Gaps Password: " + password);
|
||||
PlexSearch plexSearch = null;
|
||||
try {
|
||||
ioService.writeProperties(plexSearch);
|
||||
gapsService.updatePlexSearch(plexSearch);
|
||||
plexSearch = ioService.readProperties();
|
||||
} catch (IOException e) {
|
||||
LOGGER.error("Failed to write out password to properties file.");
|
||||
LOGGER.warn("No properties found to get password. Generating new password");
|
||||
}
|
||||
|
||||
String password;
|
||||
if (plexSearch == null || StringUtils.isEmpty(plexSearch.getPassword())) {
|
||||
password = UUID.randomUUID().toString();
|
||||
plexSearch = new PlexSearch();
|
||||
plexSearch.setPassword(password);
|
||||
LOGGER.info("Gaps Password: " + password);
|
||||
try {
|
||||
ioService.writeProperties(plexSearch);
|
||||
gapsService.updatePlexSearch(plexSearch);
|
||||
} catch (IOException e) {
|
||||
LOGGER.error("Failed to write out password to properties file.");
|
||||
}
|
||||
} else {
|
||||
LOGGER.info("Using password from /usr/data/gaps.properties");
|
||||
password = plexSearch.getPassword();
|
||||
}
|
||||
|
||||
PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
|
||||
UserDetails userDetails = User.withUsername("user")
|
||||
.password(encoder.encode(password))
|
||||
.roles("USER")
|
||||
.build();
|
||||
|
||||
return new InMemoryUserDetailsManager(userDetails);
|
||||
} else {
|
||||
LOGGER.info("Using password from /usr/data/gaps.properties");
|
||||
password = plexSearch.getPassword();
|
||||
return super.userDetailsService();
|
||||
}
|
||||
|
||||
PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
|
||||
UserDetails userDetails = User.withUsername("user")
|
||||
.password(encoder.encode(password))
|
||||
.roles("USER")
|
||||
.build();
|
||||
|
||||
return new InMemoryUserDetailsManager(userDetails);
|
||||
}
|
||||
}
|
||||
@@ -414,10 +414,10 @@ public class IoService {
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
LOGGER.warn(file + " does not exist");
|
||||
throw e;
|
||||
return plexSearch;
|
||||
} catch (IOException e) {
|
||||
LOGGER.warn(file + " failed to parse");
|
||||
throw e;
|
||||
return plexSearch;
|
||||
}
|
||||
LOGGER.info("plexSearch: " + plexSearch);
|
||||
return plexSearch;
|
||||
|
||||
@@ -38,4 +38,4 @@ info:
|
||||
app:
|
||||
name: Gaps
|
||||
description: Gaps searches through your Plex Server or local folders for all movies, then queries for known movies in the same collection. If those movies don't exist in your library, Gaps will recommend getting those movies, legally of course.
|
||||
version: 0.4.0-SNAPSHOT
|
||||
version: 0.4.0
|
||||
@@ -39,4 +39,118 @@
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
.center-text {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.center-parent {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.nav-button-padding {
|
||||
padding-top: 8px;
|
||||
display: block;
|
||||
width: 96px;
|
||||
}
|
||||
|
||||
.nav-anchor-spacing {
|
||||
display: block;
|
||||
width: 96px;
|
||||
}
|
||||
|
||||
.icon {
|
||||
width: 48px;
|
||||
height: 48px;
|
||||
#margin-bottom: 4px;
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.list-ul-default {
|
||||
background-color: #fafafa; /* defines the background color of the image */
|
||||
mask: url(/images/list-ul.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/list-ul.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.list-ul-active {
|
||||
background-color: #00bc8c; /* defines the background color of the image */
|
||||
mask: url(/images/list-ul.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/list-ul.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.collection-fill-active {
|
||||
background-color: #00bc8c; /* defines the background color of the image */
|
||||
mask: url(/images/collection-fill.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/collection-fill.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.collection-fill-default {
|
||||
background-color: #fafafa; /* defines the background color of the image */
|
||||
mask: url(/images/collection-fill.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/collection-fill.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.exclamation-triangle-default {
|
||||
background-color: #fafafa; /* defines the background color of the image */
|
||||
mask: url(/images/exclamation-triangle.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/exclamation-triangle.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.exclamation-triangle-active {
|
||||
background-color: #00bc8c; /* defines the background color of the image */
|
||||
mask: url(/images/exclamation-triangle.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/exclamation-triangle.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.rss-default {
|
||||
background-color: #fafafa; /* defines the background color of the image */
|
||||
mask: url(/images/rss.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/rss.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.rss-active {
|
||||
background-color: #00bc8c; /* defines the background color of the image */
|
||||
mask: url(/images/rss.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/rss.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.gear-default {
|
||||
background-color: #fafafa; /* defines the background color of the image */
|
||||
mask: url(/images/gear.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/gear.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.gear-active {
|
||||
background-color: #00bc8c; /* defines the background color of the image */
|
||||
mask: url(/images/gear.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/gear.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.arrow-clockwise-default {
|
||||
background-color: #fafafa; /* defines the background color of the image */
|
||||
mask: url(/images/arrow-clockwise.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/arrow-clockwise.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.arrow-clockwise-active {
|
||||
background-color: #00bc8c; /* defines the background color of the image */
|
||||
mask: url(/images/arrow-clockwise.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/arrow-clockwise.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.info-circle-default {
|
||||
background-color: #fafafa; /* defines the background color of the image */
|
||||
mask: url(/images/info-circle.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/info-circle.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.info-circle-active {
|
||||
background-color: #00bc8c; /* defines the background color of the image */
|
||||
mask: url(/images/info-circle.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/info-circle.svg) no-repeat center / contain;
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
.top-margin{margin-top:16px}.all-padding{padding:16px}.gaps-hide{display:none}.thumbnail{max-width:96px;height:auto}.bottom-margin{margin-top:16px}.word-break{word-break:break-all}.center{display:block;margin-left:auto;margin-right:auto;width:50%}
|
||||
|
After Width: | Height: | Size: 51 KiB |
|
After Width: | Height: | Size: 12 KiB |
@@ -0,0 +1,4 @@
|
||||
<svg class="bi bi-arrow-clockwise" width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" d="M3.17 6.706a5 5 0 0 1 7.103-3.16.5.5 0 1 0 .454-.892A6 6 0 1 0 13.455 5.5a.5.5 0 0 0-.91.417 5 5 0 1 1-9.375.789z" fill="white"/>
|
||||
<path fill-rule="evenodd" d="M8.147.146a.5.5 0 0 1 .707 0l2.5 2.5a.5.5 0 0 1 0 .708l-2.5 2.5a.5.5 0 1 1-.707-.708L10.293 3 8.147.854a.5.5 0 0 1 0-.708z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 473 B |
@@ -0,0 +1,4 @@
|
||||
<svg class="bi bi-collection-fill" width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="16" height="10" rx="1.5" transform="matrix(1 0 0 -1 0 14.5)" fill="white"/>
|
||||
<path fill-rule="evenodd" d="M2 3a.5.5 0 0 0 .5.5h11a.5.5 0 0 0 0-1h-11A.5.5 0 0 0 2 3zm2-2a.5.5 0 0 0 .5.5h7a.5.5 0 0 0 0-1h-7A.5.5 0 0 0 4 1z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 395 B |
@@ -0,0 +1,4 @@
|
||||
<svg class="bi bi-exclamation-triangle" width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" d="M7.938 2.016a.146.146 0 0 0-.054.057L1.027 13.74a.176.176 0 0 0-.002.183c.016.03.037.05.054.06.015.01.034.017.066.017h13.713a.12.12 0 0 0 .066-.017.163.163 0 0 0 .055-.06.176.176 0 0 0-.003-.183L8.12 2.073a.146.146 0 0 0-.054-.057A.13.13 0 0 0 8.002 2a.13.13 0 0 0-.064.016zm1.044-.45a1.13 1.13 0 0 0-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767L8.982 1.566z" fill="white"/>
|
||||
<path d="M7.002 12a1 1 0 1 1 2 0 1 1 0 0 1-2 0zM7.1 5.995a.905.905 0 1 1 1.8 0l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 5.995z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 729 B |
@@ -0,0 +1,153 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
inkscape:version="1.0 (6e3e5246a0, 2020-05-07)"
|
||||
height="597.90002"
|
||||
width="817.20001"
|
||||
sodipodi:docname="FinalGAPS1.svg"
|
||||
xml:space="preserve"
|
||||
viewBox="0 0 817.2 597.90001"
|
||||
y="0px"
|
||||
x="0px"
|
||||
id="Layer_1"
|
||||
version="1.1"><metadata
|
||||
id="metadata104"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs102" /><sodipodi:namedview
|
||||
inkscape:current-layer="Layer_1"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:window-y="67"
|
||||
inkscape:window-x="140"
|
||||
inkscape:cy="173.94644"
|
||||
inkscape:cx="-107.53097"
|
||||
inkscape:zoom="0.70268736"
|
||||
fit-margin-bottom="32"
|
||||
fit-margin-right="32"
|
||||
fit-margin-left="32"
|
||||
fit-margin-top="32"
|
||||
lock-margins="true"
|
||||
showgrid="false"
|
||||
id="namedview100"
|
||||
inkscape:window-height="1147"
|
||||
inkscape:window-width="1799"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0"
|
||||
guidetolerance="10"
|
||||
gridtolerance="10"
|
||||
objecttolerance="10"
|
||||
borderopacity="1"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff" />
|
||||
<style
|
||||
id="style76"
|
||||
type="text/css">
|
||||
.st0{fill:#FFFFFF;}
|
||||
.st1{fill:#501F00;}
|
||||
.st2{fill:#5C767C;}
|
||||
.st3{fill:#79ABFF;}
|
||||
.st4{fill:#DBBD68;}
|
||||
</style>
|
||||
<g
|
||||
transform="translate(-231.39999,-101.10001)"
|
||||
id="XMLID_2_">
|
||||
<rect
|
||||
height="450"
|
||||
width="173.7"
|
||||
y="217"
|
||||
x="263.39999"
|
||||
id="XMLID_10_" />
|
||||
<rect
|
||||
height="353.5"
|
||||
width="138.2"
|
||||
class="st0"
|
||||
y="274.79999"
|
||||
x="282.29999"
|
||||
id="XMLID_3_" />
|
||||
<g
|
||||
id="XMLID_21_">
|
||||
<g
|
||||
id="XMLID_59_">
|
||||
<path
|
||||
d="m 290.7,453.9 v -0.3 c 0,-35.1 27.5,-62.7 64.9,-62.7 21.2,0 36.2,6.5 48.9,17.6 l -19.6,23.6 c -8.6,-7.2 -17.2,-11.4 -29.1,-11.4 -17.4,0 -30.8,14.6 -30.8,33.1 v 0.3 c 0,19.5 13.6,33.4 32.7,33.4 8.1,0 14.3,-1.7 19.3,-5 v -14.6 h -23.8 v -24.5 h 55.4 v 54.2 c -12.7,10.5 -30.5,18.6 -52.3,18.6 -37.5,0.1 -65.6,-25.8 -65.6,-62.3 z"
|
||||
class="st1"
|
||||
id="XMLID_60_" />
|
||||
</g>
|
||||
</g>
|
||||
<rect
|
||||
height="450"
|
||||
width="173.7"
|
||||
y="133.10001"
|
||||
x="456"
|
||||
id="XMLID_28_" />
|
||||
<rect
|
||||
height="353.5"
|
||||
width="138.2"
|
||||
class="st0"
|
||||
y="190.89999"
|
||||
x="474.89999"
|
||||
id="XMLID_27_" />
|
||||
<g
|
||||
id="XMLID_11_">
|
||||
<g
|
||||
id="XMLID_72_">
|
||||
<path
|
||||
d="m 529.7,311 h 30.9 l 49.3,116.6 h -34.4 l -8.4,-20.7 h -44.7 l -8.3,20.7 h -33.7 z m 28.1,70.9 -12.9,-32.9 -13.1,32.9 z"
|
||||
class="st2"
|
||||
id="XMLID_73_" />
|
||||
</g>
|
||||
</g>
|
||||
<rect
|
||||
height="450"
|
||||
width="173.7"
|
||||
y="217"
|
||||
x="842.90002"
|
||||
id="XMLID_36_" />
|
||||
<rect
|
||||
height="353.5"
|
||||
width="138.2"
|
||||
class="st0"
|
||||
y="274.79999"
|
||||
x="861.79999"
|
||||
id="XMLID_33_" />
|
||||
<g
|
||||
id="XMLID_7_">
|
||||
<g
|
||||
id="XMLID_57_">
|
||||
<path
|
||||
d="m 880.5,495.9 18.6,-22.2 c 11.9,9.5 25.1,14.5 39.1,14.5 9,0 13.8,-3.1 13.8,-8.3 v -0.3 c 0,-5 -4,-7.8 -20.3,-11.5 C 906,462.2 886.2,455 886.2,430.2 v -0.3 c 0,-22.4 17.7,-38.6 46.7,-38.6 20.5,0 36.5,5.5 49.6,16 l -16.7,23.6 c -11,-7.7 -23.1,-11.9 -33.7,-11.9 -8.1,0 -12.1,3.4 -12.1,7.8 v 0.3 c 0,5.5 4.1,7.9 20.8,11.7 27.7,6 44.9,15 44.9,37.5 v 0.3 c 0,24.6 -19.5,39.3 -48.7,39.3 -21.4,0 -41.7,-6.7 -56.5,-20 z"
|
||||
class="st3"
|
||||
id="XMLID_58_" />
|
||||
</g>
|
||||
</g>
|
||||
<rect
|
||||
height="450"
|
||||
width="173.7"
|
||||
y="217"
|
||||
x="650.20001"
|
||||
id="XMLID_35_" />
|
||||
<rect
|
||||
height="353.5"
|
||||
width="138.2"
|
||||
class="st0"
|
||||
y="274.79999"
|
||||
x="669.09998"
|
||||
id="XMLID_34_" />
|
||||
<g
|
||||
id="XMLID_1_">
|
||||
<g
|
||||
id="XMLID_76_">
|
||||
<path
|
||||
d="m 692.2,393.3 h 51.7 c 30.5,0 50.1,15.7 50.1,42.4 v 0.3 c 0,28.4 -21.9,43.4 -51.8,43.4 h -16.5 v 34.4 H 692.3 V 393.3 Z m 49.2,59.9 c 11.9,0 19.1,-6.2 19.1,-15.7 v -0.3 c 0,-10.3 -7.2,-15.8 -19.3,-15.8 h -15.7 v 31.9 h 15.9 z"
|
||||
class="st4"
|
||||
id="XMLID_77_" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 100 KiB |
@@ -0,0 +1,4 @@
|
||||
<svg class="bi bi-gear" width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" d="M8.837 1.626c-.246-.835-1.428-.835-1.674 0l-.094.319A1.873 1.873 0 0 1 4.377 3.06l-.292-.16c-.764-.415-1.6.42-1.184 1.185l.159.292a1.873 1.873 0 0 1-1.115 2.692l-.319.094c-.835.246-.835 1.428 0 1.674l.319.094a1.873 1.873 0 0 1 1.115 2.693l-.16.291c-.415.764.42 1.6 1.185 1.184l.292-.159a1.873 1.873 0 0 1 2.692 1.116l.094.318c.246.835 1.428.835 1.674 0l.094-.319a1.873 1.873 0 0 1 2.693-1.115l.291.16c.764.415 1.6-.42 1.184-1.185l-.159-.291a1.873 1.873 0 0 1 1.116-2.693l.318-.094c.835-.246.835-1.428 0-1.674l-.319-.094a1.873 1.873 0 0 1-1.115-2.692l.16-.292c.415-.764-.42-1.6-1.185-1.184l-.291.159A1.873 1.873 0 0 1 8.93 1.945l-.094-.319zm-2.633-.283c.527-1.79 3.065-1.79 3.592 0l.094.319a.873.873 0 0 0 1.255.52l.292-.16c1.64-.892 3.434.901 2.54 2.541l-.159.292a.873.873 0 0 0 .52 1.255l.319.094c1.79.527 1.79 3.065 0 3.592l-.319.094a.873.873 0 0 0-.52 1.255l.16.292c.893 1.64-.902 3.434-2.541 2.54l-.292-.159a.873.873 0 0 0-1.255.52l-.094.319c-.527 1.79-3.065 1.79-3.592 0l-.094-.319a.873.873 0 0 0-1.255-.52l-.292.16c-1.64.893-3.433-.902-2.54-2.541l.159-.292a.873.873 0 0 0-.52-1.255l-.319-.094c-1.79-.527-1.79-3.065 0-3.592l.319-.094a.873.873 0 0 0 .52-1.255l-.16-.292c-.892-1.64.902-3.433 2.541-2.54l.292.159a.873.873 0 0 0 1.255-.52l.094-.319z" fill="white"/>
|
||||
<path fill-rule="evenodd" d="M8 5.754a2.246 2.246 0 1 0 0 4.492 2.246 2.246 0 0 0 0-4.492zM4.754 8a3.246 3.246 0 1 1 6.492 0 3.246 3.246 0 0 1-6.492 0z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,5 @@
|
||||
<svg class="bi bi-info-circle" width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" d="M8 15A7 7 0 1 0 8 1a7 7 0 0 0 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z" fill="white"/>
|
||||
<path d="M8.93 6.588l-2.29.287-.082.38.45.083c.294.07.352.176.288.469l-.738 3.468c-.194.897.105 1.319.808 1.319.545 0 1.178-.252 1.465-.598l.088-.416c-.2.176-.492.246-.686.246-.275 0-.375-.193-.304-.533L8.93 6.588z" fill="white"/>
|
||||
<circle cx="8" cy="4.5" r="1" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 535 B |
@@ -0,0 +1,3 @@
|
||||
<svg class="bi bi-list-ul" width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" d="M5 11.5a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5zm-3 1a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm0 4a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm0 4a1 1 0 1 0 0-2 1 1 0 0 0 0 2z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 462 B |
@@ -0,0 +1,88 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 393.837 393.837" style="enable-background:new 0 0 393.837 393.837;" xml:space="preserve">
|
||||
<g>
|
||||
<g>
|
||||
<path d="M356.116,219.884c-0.058-0.134-0.119-0.266-0.183-0.397C311.991,129.369,242.986,65.128,150.854,28.553
|
||||
C104.82,10.164,60.258,0.557,18.404,0c-2.666-0.018-5.245,0.999-7.148,2.872C9.353,4.746,8.278,7.303,8.271,9.974L8.074,87.003
|
||||
c-0.014,5.415,4.284,9.856,9.696,10.021c9.837,0.299,19.293,0.912,28.163,1.826c31.831,3.09,62.772,11.959,91.961,26.36
|
||||
c58.988,29.117,103.491,73.846,132.273,132.944c0.037,0.076,0.079,0.16,0.118,0.234c0.282,0.543,28.193,55.172,28.193,125.437
|
||||
c0,5.523,4.477,10,10,10h73.781c5.523,0,10-4.477,10-10v-9.838C392.259,303.852,357.591,223.279,356.116,219.884z
|
||||
M318.308,373.825c-2.353-69.336-28.331-120.891-30.214-124.542c-30.771-63.122-78.327-110.901-141.348-142.009
|
||||
C115.379,91.8,82.111,82.268,47.926,78.949c-6.335-0.653-12.973-1.161-19.827-1.517l0.146-57.114
|
||||
c36.466,1.817,75.163,10.818,115.21,26.816c43.828,17.398,82.442,41.521,114.77,71.699
|
||||
c32.074,29.939,58.863,66.679,79.628,109.206c1.854,4.34,34.354,81.449,34.407,145.786H318.308z"/>
|
||||
<path d="M169.086,179.746c-43.617-33.943-100.236-54.635-155.346-56.77c-2.703-0.099-5.359,0.901-7.32,2.786
|
||||
c-1.96,1.885-3.067,4.487-3.067,7.206v73.877c0,4.859,3.494,9.016,8.281,9.851l33.141,5.784
|
||||
c30.368,6.005,57.19,19.96,79.731,41.486c21.514,20.495,36.806,46.868,44.213,76.231c3.034,12.226,4.951,24.723,6.835,44.573
|
||||
c0.487,5.133,4.798,9.055,9.955,9.055h73.782c5.523,0,10-4.477,10-10c0-66.173-27.202-118.101-50.021-150.01
|
||||
C194.931,199.781,170.728,181.002,169.086,179.746z M194.547,373.825c-1.725-15.919-3.628-27.205-6.427-38.482
|
||||
c-8.341-33.066-25.568-62.756-49.811-85.85c-25.358-24.217-55.563-39.914-89.774-46.657c-0.071-0.014-0.142-0.027-0.214-0.04
|
||||
l-24.969-4.357v-54.842c47.7,3.994,95.828,22.641,133.485,51.958c0.024,0.019,0.059,0.045,0.083,0.064
|
||||
c0.233,0.178,23.541,18.146,46.474,50.379c19.772,27.792,43.13,71.964,45.669,127.825h-54.516V373.825z"/>
|
||||
<path d="M64.776,268.858l-0.471,0.002c-16.601,0.171-32.3,6.78-44.205,18.608c-11.999,11.921-18.576,27.604-18.521,44.16
|
||||
c0.059,16.466,6.655,32.048,18.575,43.876c11.881,11.789,27.486,18.293,43.95,18.322c0.38,0.007,0.759,0.011,1.139,0.011
|
||||
c15.974,0,31.818-6.705,43.47-18.395c11.809-11.848,18.282-27.572,18.227-44.307C126.694,292.668,94.481,268.858,64.776,268.858z
|
||||
M94.547,361.323c-8.128,8.155-19.157,12.747-30.121,12.505c-0.072-0.001-0.143-0.002-0.215-0.002
|
||||
c-23.028,0-42.551-19.357-42.632-42.267c-0.076-22.904,19.585-42.459,42.905-42.7l0.291-0.001
|
||||
c20.147,0,41.996,16.212,42.163,42.374C106.977,342.581,102.576,353.267,94.547,361.323z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path style="fill:#FFFFFF;" d="M356.116,219.884c-0.058-0.134-0.119-0.266-0.183-0.397
|
||||
C311.991,129.369,242.986,65.128,150.854,28.553C104.82,10.164,60.258,0.557,18.404,0c-2.666-0.018-5.245,0.999-7.148,2.872
|
||||
C9.353,4.746,8.278,7.303,8.271,9.974L8.074,87.003c-0.014,5.415,4.284,9.856,9.696,10.021c9.837,0.299,19.293,0.912,28.163,1.826
|
||||
c31.831,3.09,62.772,11.959,91.961,26.36c58.988,29.117,103.491,73.846,132.273,132.944c0.037,0.076,0.079,0.16,0.118,0.234
|
||||
c0.282,0.543,28.193,55.172,28.193,125.437c0,5.523,4.477,10,10,10h73.781c5.523,0,10-4.477,10-10v-9.838
|
||||
C392.259,303.852,357.591,223.279,356.116,219.884z M318.308,373.825c-2.353-69.336-28.331-120.891-30.214-124.542
|
||||
c-30.771-63.122-78.327-110.901-141.348-142.009C115.379,91.8,82.111,82.268,47.926,78.949
|
||||
c-6.335-0.653-12.973-1.161-19.827-1.517l0.146-57.114c36.466,1.817,75.163,10.818,115.21,26.816
|
||||
c43.828,17.398,82.442,41.521,114.77,71.699c32.074,29.939,58.863,66.679,79.628,109.206c1.854,4.34,34.354,81.449,34.407,145.786
|
||||
H318.308z"/>
|
||||
<path style="fill:#FFFFFF;" d="M169.086,179.746c-43.617-33.943-100.236-54.635-155.346-56.77
|
||||
c-2.703-0.099-5.359,0.901-7.32,2.786c-1.96,1.885-3.067,4.487-3.067,7.206v73.877c0,4.859,3.494,9.016,8.281,9.851l33.141,5.784
|
||||
c30.368,6.005,57.19,19.96,79.731,41.486c21.514,20.495,36.806,46.868,44.213,76.231c3.034,12.226,4.951,24.723,6.835,44.573
|
||||
c0.487,5.133,4.798,9.055,9.955,9.055h73.782c5.523,0,10-4.477,10-10c0-66.173-27.202-118.101-50.021-150.01
|
||||
C194.931,199.781,170.728,181.002,169.086,179.746z M194.547,373.825c-1.725-15.919-3.628-27.205-6.427-38.482
|
||||
c-8.341-33.066-25.568-62.756-49.811-85.85c-25.358-24.217-55.563-39.914-89.774-46.657c-0.071-0.014-0.142-0.027-0.214-0.04
|
||||
l-24.969-4.357v-54.842c47.7,3.994,95.828,22.641,133.485,51.958c0.024,0.019,0.059,0.045,0.083,0.064
|
||||
c0.233,0.178,23.541,18.146,46.474,50.379c19.772,27.792,43.13,71.964,45.669,127.825h-54.516V373.825z"/>
|
||||
<path style="fill:#FFFFFF;" d="M64.776,268.858l-0.471,0.002c-16.601,0.171-32.3,6.78-44.205,18.608
|
||||
c-11.999,11.921-18.576,27.604-18.521,44.16c0.059,16.466,6.655,32.048,18.575,43.876c11.881,11.789,27.486,18.293,43.95,18.322
|
||||
c0.38,0.007,0.759,0.011,1.139,0.011c15.974,0,31.818-6.705,43.47-18.395c11.809-11.848,18.282-27.572,18.227-44.307
|
||||
C126.694,292.668,94.481,268.858,64.776,268.858z M94.547,361.323c-8.128,8.155-19.157,12.747-30.121,12.505
|
||||
c-0.072-0.001-0.143-0.002-0.215-0.002c-23.028,0-42.551-19.357-42.632-42.267c-0.076-22.904,19.585-42.459,42.905-42.7
|
||||
l0.291-0.001c20.147,0,41.996,16.212,42.163,42.374C106.977,342.581,102.576,353.267,94.547,361.323z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.6 KiB |
@@ -0,0 +1,3 @@
|
||||
<svg class="bi bi-wrench" width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" d="M.102 2.223A3.004 3.004 0 0 0 3.78 5.897l6.341 6.252A3.003 3.003 0 0 0 13 16a3 3 0 1 0-.851-5.878L5.897 3.781A3.004 3.004 0 0 0 2.223.1l2.141 2.142L4 4l-1.757.364L.102 2.223zm13.37 9.019L13 11l-.471.242-.529.026-.287.445-.445.287-.026.529L11 13l.242.471.026.529.445.287.287.445.529.026L13 15l.471-.242.529-.026.287-.445.445-.287.026-.529L15 13l-.242-.471-.026-.529-.445-.287-.287-.445-.529-.026z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 576 B |
@@ -23,6 +23,7 @@ let searchResults;
|
||||
let searchTitle;
|
||||
let searchDescription;
|
||||
let movieCounter;
|
||||
let socket;
|
||||
|
||||
jQuery(function ($) {
|
||||
Handlebars.registerHelper('json', function (context) {
|
||||
@@ -82,7 +83,7 @@ jQuery(function ($) {
|
||||
|
||||
getRecommendedMoviesForTable(`/recommended/${plexServer.machineIdentifier}/${libraryKey}`, movieContainer, noMovieContainer, notSearchedYetContainer, moviesTable);
|
||||
|
||||
const socket = new SockJS('/gs-guide-websocket');
|
||||
socket = new SockJS('/gs-guide-websocket');
|
||||
stompClient = Stomp.over(socket);
|
||||
stompClient.connect({}, function () {
|
||||
|
||||
@@ -159,6 +160,7 @@ function cancel() {
|
||||
|
||||
window.onbeforeunload = function () {
|
||||
disconnect();
|
||||
//return false;
|
||||
};
|
||||
|
||||
function setCopyToClipboardEnabled(bool) {
|
||||
@@ -194,9 +196,14 @@ function searchForMovies() {
|
||||
}
|
||||
|
||||
function disconnect() {
|
||||
if (stompClient !== null) {
|
||||
if (stompClient !== null && stompClient.status === 'CONNECTED') {
|
||||
stompClient.disconnect();
|
||||
}
|
||||
|
||||
if(socket !== null) {
|
||||
socket.close();
|
||||
}
|
||||
|
||||
console.log("Disconnected");
|
||||
}
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
import{getRecommendedMoviesForTable}from"/js/modules/common.js";import{Payload}from"/js/modules/payload.js";let libraryTitle,notSearchedYetContainer,movieContainer,searchContainer,noMovieContainer,movieSearchingContainer,plexServers,plexServer,moviesTable,libraryKey,stompClient,backButton,searchResults,searchTitle,searchDescription,movieCounter;function switchPlexLibrary(machineIdentifier,key){libraryKey=key;const plexLibrary=(plexServer=plexServers[machineIdentifier]).plexLibraries.find(plexServer=>plexServer.key===parseInt(key));libraryTitle.text(`${plexServer.friendlyName} - ${plexLibrary.title}`),notSearchedYetContainer.css({display:"none"}),moviesTable.data().clear(),moviesTable.rows().invalidate().draw(),getRecommendedMoviesForTable(`/recommended/${machineIdentifier}/${libraryKey}`,movieContainer,noMovieContainer,notSearchedYetContainer,moviesTable)}function cancel(){stompClient.send(`/recommended/cancel/${plexServer.machineIdentifier}/${libraryKey}`),location.assign("/")}function setCopyToClipboardEnabled(bool){bool?$("#copyToClipboard").removeClass("disabled"):$("#copyToClipboard").addClass("disabled")}function searchForMovies(){movieContainer.show(100),searchContainer.show(100),notSearchedYetContainer.css({display:"none"}),noMovieContainer.css({display:"none"}),moviesTable.data().clear(),moviesTable.rows().invalidate().draw(),movieCounter=0,searchTitle.text("Searching for Movies"),searchDescription.text("Gaps is looking through your Plex libraries. This could take a while so just sit tight, and we'll find all the missing movies for you."),$.ajax({type:"PUT",url:`/recommended/find/${plexServer.machineIdentifier}/${libraryKey}`,contentType:"application/json"}),showSearchStatus()}function disconnect(){null!==stompClient&&stompClient.disconnect(),console.log("Disconnected")}function showSearchStatus(obj){if(obj){obj.percentage=Math.trunc(obj.searchedMovieCount/obj.totalMovieCount*100);const plexServerCard=$("#updateSearchDescription").html(),theTemplate=Handlebars.compile(plexServerCard);searchDescription.html(theTemplate(obj))}else searchDescription.html("")}function copy(arr){const stringified=arr.join("\r\n");$("<input>").val(stringified).appendTo("body").select(),document.execCommand("copy")}function copyToClipboard(){copy(searchResults),$("#copiedToClipboard").show()}jQuery(function($){Handlebars.registerHelper("json",function(context){return JSON.stringify(context)}),libraryTitle=$("#libraryTitle"),notSearchedYetContainer=$("#notSearchedYetContainer"),movieContainer=$("#movieContainer"),noMovieContainer=$("#noMovieContainer"),movieSearchingContainer=$("#movieSearchingContainer"),plexServers=JSON.parse($("#plexServers").val()),plexServer=JSON.parse($("#plexServer").val()),libraryKey=$("#libraryKey").val(),backButton=$("#cancel"),searchResults=[],searchContainer=$("#searchContainer"),searchTitle=$("#searchTitle"),searchDescription=$("#searchDescription"),moviesTable=$("#movies").DataTable({deferRender:!0,ordering:!1,columns:[{data:"imdbId"},{data:"name"},{data:"year"},{data:"language"},{data:"overview"}],columnDefs:[{targets:[0],type:"html",searchable:!1,render:function(data,type,row){if("display"===type){row.address=plexServer.address,row.port=plexServer.port,row.plexToken=plexServer.plexToken;const plexServerCard=$("#movieCard").html();return Handlebars.compile(plexServerCard)(row)}return""}},{targets:[1,2,3,4],visible:!1}]}),getRecommendedMoviesForTable(`/recommended/${plexServer.machineIdentifier}/${libraryKey}`,movieContainer,noMovieContainer,notSearchedYetContainer,moviesTable);const socket=new SockJS("/gs-guide-websocket");(stompClient=Stomp.over(socket)).connect({},function(){stompClient.subscribe("/finishedSearching",function(message){searchContainer.css({display:"none"});const payload=JSON.parse(message.body);backButton.text("Restart"),payload&&payload.code===Payload.SEARCH_SUCCESSFUL?(searchTitle.text("Search Complete"),searchDescription.text(`${movieCounter} movies to add to complete your collections. Below is everything Gaps found that is missing from your movie collections.`),setCopyToClipboardEnabled(!0)):(searchTitle.text("Search Failed"),searchDescription.text(payload.reason),setCopyToClipboardEnabled(!1),movieContainer.css({display:"none"}),notSearchedYetContainer.css({display:"none"}),noMovieContainer.show(100))}),stompClient.subscribe("/newMovieFound",function(status){const obj=JSON.parse(status.body);showSearchStatus(obj),obj.nextMovie&&(movieCounter++,moviesTable.row.add(obj.nextMovie).draw(),searchResults.push(`${obj.nextMovie.name} (${obj.nextMovie.year}) in collection '${obj.nextMovie.collection}'`))})}),window.searchForMovies=searchForMovies,window.cancel=cancel,window.switchPlexLibrary=switchPlexLibrary,window.copyToClipboard=copyToClipboard}),window.onbeforeunload=function(){disconnect()};
|
||||
import{getRecommendedMoviesForTable}from"/js/modules/common.js";import{Payload}from"/js/modules/payload.js";let libraryTitle,notSearchedYetContainer,movieContainer,searchContainer,noMovieContainer,movieSearchingContainer,plexServers,plexServer,moviesTable,libraryKey,stompClient,backButton,searchResults,searchTitle,searchDescription,movieCounter,socket;function switchPlexLibrary(machineIdentifier,key){libraryKey=key;const plexLibrary=(plexServer=plexServers[machineIdentifier]).plexLibraries.find(plexServer=>plexServer.key===parseInt(key));libraryTitle.text(`${plexServer.friendlyName} - ${plexLibrary.title}`),notSearchedYetContainer.css({display:"none"}),moviesTable.data().clear(),moviesTable.rows().invalidate().draw(),getRecommendedMoviesForTable(`/recommended/${machineIdentifier}/${libraryKey}`,movieContainer,noMovieContainer,notSearchedYetContainer,moviesTable)}function cancel(){stompClient.send(`/recommended/cancel/${plexServer.machineIdentifier}/${libraryKey}`),location.assign("/")}function setCopyToClipboardEnabled(bool){bool?$("#copyToClipboard").removeClass("disabled"):$("#copyToClipboard").addClass("disabled")}function searchForMovies(){movieContainer.show(100),searchContainer.show(100),notSearchedYetContainer.css({display:"none"}),noMovieContainer.css({display:"none"}),moviesTable.data().clear(),moviesTable.rows().invalidate().draw(),movieCounter=0,searchTitle.text("Searching for Movies"),searchDescription.text("Gaps is looking through your Plex libraries. This could take a while so just sit tight, and we'll find all the missing movies for you."),$.ajax({type:"PUT",url:`/recommended/find/${plexServer.machineIdentifier}/${libraryKey}`,contentType:"application/json"}),showSearchStatus()}function disconnect(){null!==stompClient&&"CONNECTED"===stompClient.status&&stompClient.disconnect(),null!==socket&&socket.close(),console.log("Disconnected")}function showSearchStatus(obj){if(obj){obj.percentage=Math.trunc(obj.searchedMovieCount/obj.totalMovieCount*100);const plexServerCard=$("#updateSearchDescription").html(),theTemplate=Handlebars.compile(plexServerCard);searchDescription.html(theTemplate(obj))}else searchDescription.html("")}function copy(arr){const stringified=arr.join("\r\n");$("<input>").val(stringified).appendTo("body").select(),document.execCommand("copy")}function copyToClipboard(){copy(searchResults),$("#copiedToClipboard").show()}jQuery(function($){Handlebars.registerHelper("json",function(context){return JSON.stringify(context)}),libraryTitle=$("#libraryTitle"),notSearchedYetContainer=$("#notSearchedYetContainer"),movieContainer=$("#movieContainer"),noMovieContainer=$("#noMovieContainer"),movieSearchingContainer=$("#movieSearchingContainer"),plexServers=JSON.parse($("#plexServers").val()),plexServer=JSON.parse($("#plexServer").val()),libraryKey=$("#libraryKey").val(),backButton=$("#cancel"),searchResults=[],searchContainer=$("#searchContainer"),searchTitle=$("#searchTitle"),searchDescription=$("#searchDescription"),moviesTable=$("#movies").DataTable({deferRender:!0,ordering:!1,columns:[{data:"imdbId"},{data:"name"},{data:"year"},{data:"language"},{data:"overview"}],columnDefs:[{targets:[0],type:"html",searchable:!1,render:function(data,type,row){if("display"===type){row.address=plexServer.address,row.port=plexServer.port,row.plexToken=plexServer.plexToken;const plexServerCard=$("#movieCard").html();return Handlebars.compile(plexServerCard)(row)}return""}},{targets:[1,2,3,4],visible:!1}]}),getRecommendedMoviesForTable(`/recommended/${plexServer.machineIdentifier}/${libraryKey}`,movieContainer,noMovieContainer,notSearchedYetContainer,moviesTable),socket=new SockJS("/gs-guide-websocket"),(stompClient=Stomp.over(socket)).connect({},function(){stompClient.subscribe("/finishedSearching",function(message){searchContainer.css({display:"none"});const payload=JSON.parse(message.body);backButton.text("Restart"),payload&&payload.code===Payload.SEARCH_SUCCESSFUL?(searchTitle.text("Search Complete"),searchDescription.text(`${movieCounter} movies to add to complete your collections. Below is everything Gaps found that is missing from your movie collections.`),setCopyToClipboardEnabled(!0)):(searchTitle.text("Search Failed"),searchDescription.text(payload.reason),setCopyToClipboardEnabled(!1),movieContainer.css({display:"none"}),notSearchedYetContainer.css({display:"none"}),noMovieContainer.show(100))}),stompClient.subscribe("/newMovieFound",function(status){const obj=JSON.parse(status.body);showSearchStatus(obj),obj.nextMovie&&(movieCounter++,moviesTable.row.add(obj.nextMovie).draw(),searchResults.push(`${obj.nextMovie.name} (${obj.nextMovie.year}) in collection '${obj.nextMovie.collection}'`))})}),window.searchForMovies=searchForMovies,window.cancel=cancel,window.switchPlexLibrary=switchPlexLibrary,window.copyToClipboard=copyToClipboard}),window.onbeforeunload=function(){disconnect()};
|
||||
@@ -23,29 +23,52 @@
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
||||
<a class="navbar-brand" href="/">Gaps</a>
|
||||
<a class="" href=".">
|
||||
<img src="/images/final-gaps.svg" class="d-inline-block align-top" alt="" width="96" height="96">
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarColor01">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/configuration">Configuration</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/libraries">
|
||||
<div class="icon list-ul-default"></div>
|
||||
Libraries
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/libraries">Libraries</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/recommended">
|
||||
<div class="icon collection-fill-default"></div>
|
||||
Missing
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/recommended">Recommended</a>
|
||||
<li class="nav-item nav-button-padding" hidden>
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/mislabeled">
|
||||
<div class="icon exclamation-triangle-default"></div>
|
||||
Mislabeled
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/mislabeled">Mislabeled</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/rssCheck">
|
||||
<div class="icon rss-default"></div>
|
||||
RSS
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/rssCheck">RSS</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/configuration">
|
||||
<div class="icon gear-default"></div>
|
||||
Settings
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/updates" id="updatesTab">Updates</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/updates">
|
||||
<div class="icon arrow-clockwise-default"></div>
|
||||
Updates
|
||||
</a>
|
||||
</li>
|
||||
<li aria-current="page" class="nav-item active">
|
||||
<a class="nav-link" href="/about" id="aboutTab">About</a>
|
||||
<li aria-current="page" class="nav-item nav-button-padding active">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/about">
|
||||
<div class="icon info-circle-active"></div>
|
||||
About
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -55,7 +78,7 @@
|
||||
<img src="/images/final-2.svg" alt="Gaps Logo" style="width:50%;height:50%;" class="center">
|
||||
|
||||
<h3 class="top-margin">About</h3>
|
||||
<h4 class="top-margin text-primary">v0.4.0-SNAPSHOT</h4>
|
||||
<h4 class="top-margin text-primary">v0.4.0</h4>
|
||||
|
||||
<p class="text-muted">Gaps searches through your Plex Server. It then queries
|
||||
for known
|
||||
|
||||
@@ -23,36 +23,58 @@
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
||||
<a class="navbar-brand" href="/">Gaps</a>
|
||||
<a class="" href=".">
|
||||
<img src="/images/final-gaps.svg" class="d-inline-block align-top" alt="" width="96" height="96">
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarColor01">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li aria-current="page" class="nav-item active">
|
||||
<a class="nav-link" href="/configuration" id="configurationTab">Configuration</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/libraries">
|
||||
<div class="icon list-ul-default"></div>
|
||||
Libraries
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/libraries" id="librariesTab">Libraries</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/recommended">
|
||||
<div class="icon collection-fill-default"></div>
|
||||
Missing
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/recommended" id="recommendedTab">Recommended</a>
|
||||
<li class="nav-item nav-button-padding" hidden>
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/mislabeled">
|
||||
<div class="icon exclamation-triangle-default"></div>
|
||||
Mislabeled
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/mislabeled">Mislabeled</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/rssCheck">
|
||||
<div class="icon rss-default"></div>
|
||||
RSS
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/rssCheck" id="rssTab">RSS</a>
|
||||
<li aria-current="page" class="nav-item nav-button-padding active">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/configuration">
|
||||
<div class="icon gear-active"></div>
|
||||
Settings
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/updates" id="updatesTab">Updates</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/updates">
|
||||
<div class="icon arrow-clockwise-default"></div>
|
||||
Updates
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/about" id="aboutTab">About</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/about">
|
||||
<div class="icon info-circle-default"></div>
|
||||
About
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div class="container">
|
||||
<h3 class="top-margin">Configuration</h3>
|
||||
<h3 class="top-margin">Settings</h3>
|
||||
|
||||
<ul class="nav nav-tabs">
|
||||
<li class="nav-item">
|
||||
@@ -61,7 +83,7 @@
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" data-toggle="tab" href="#plex" id="plexTab">Plex</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<li class="nav-item" hidden>
|
||||
<a class="nav-link disabled" data-ol-has-click-handler="" href="#folders" id="folderTab">Folders</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
|
||||
@@ -23,29 +23,52 @@
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
||||
<a class="navbar-brand" href="/">Gaps</a>
|
||||
<a class="" href=".">
|
||||
<img src="/images/final-gaps.svg" class="d-inline-block align-top" alt="" width="96" height="96">
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarColor01">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/configuration">Configuration</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/libraries">
|
||||
<div class="icon list-ul-default"></div>
|
||||
Libraries
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/libraries">Libraries</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/recommended">
|
||||
<div class="icon collection-fill-default"></div>
|
||||
Missing
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/recommended">Recommended</a>
|
||||
<li class="nav-item nav-button-padding" hidden>
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/mislabeled">
|
||||
<div class="icon exclamation-triangle-default"></div>
|
||||
Mislabeled
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/mislabeled">Mislabeled</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/rssCheck">
|
||||
<div class="icon rss-default"></div>
|
||||
RSS
|
||||
</a>
|
||||
</li>
|
||||
<li aria-current="page" class="nav-item">
|
||||
<a class="nav-link" href="/rssCheck">RSS</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/configuration">
|
||||
<div class="icon gear-default"></div>
|
||||
Settings
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/updates" id="updatesTab">Updates</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/updates">
|
||||
<div class="icon arrow-clockwise-default"></div>
|
||||
Updates
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/about" id="aboutTab">About</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/about">
|
||||
<div class="icon info-circle-default"></div>
|
||||
About
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -23,31 +23,53 @@
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
||||
<a class="navbar-brand" href="/">Gaps</a>
|
||||
<a class="" href=".">
|
||||
<img src="/images/final-gaps.svg" class="d-inline-block align-top" alt="" width="96" height="96">
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarColor01">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/configuration">Configuration</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/libraries">
|
||||
<div class="icon list-ul-default"></div>
|
||||
Libraries
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/libraries">Libraries</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/recommended">
|
||||
<div class="icon collection-fill-default"></div>
|
||||
Missing
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/recommended">Recommended</a>
|
||||
<li class="nav-item nav-button-padding" hidden>
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/mislabeled">
|
||||
<div class="icon exclamation-triangle-default"></div>
|
||||
Mislabeled
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/mislabeled">Mislabeled</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/rssCheck">
|
||||
<div class="icon rss-default"></div>
|
||||
RSS
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/rssCheck">RSS</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/configuration">
|
||||
<div class="icon gear-default"></div>
|
||||
Settings
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/updates" id="updatesTab">Updates</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/updates">
|
||||
<div class="icon arrow-clockwise-default"></div>
|
||||
Updates
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/about" id="aboutTab">About</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/about">
|
||||
<div class="icon info-circle-default"></div>
|
||||
About
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -25,29 +25,52 @@
|
||||
<body>
|
||||
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
||||
<a class="navbar-brand" href="/">Gaps</a>
|
||||
<a class="" href=".">
|
||||
<img src="/images/final-gaps.svg" class="d-inline-block align-top" alt="" width="96" height="96">
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarColor01">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/configuration">Configuration</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/libraries">
|
||||
<div class="icon list-ul-default"></div>
|
||||
Libraries
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/libraries">Libraries</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/recommended">
|
||||
<div class="icon collection-fill-default"></div>
|
||||
Missing
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/recommended">Recommended</a>
|
||||
<li class="nav-item nav-button-padding" hidden>
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/mislabeled">
|
||||
<div class="icon exclamation-triangle-default"></div>
|
||||
Mislabeled
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/mislabeled">Mislabeled</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/rssCheck">
|
||||
<div class="icon rss-default"></div>
|
||||
RSS
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/rssCheck">RSS</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/configuration">
|
||||
<div class="icon gear-default"></div>
|
||||
Settings
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/updates" id="updatesTab">Updates</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/updates">
|
||||
<div class="icon arrow-clockwise-default"></div>
|
||||
Updates
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/about" id="aboutTab">About</a>
|
||||
<li aria-current="page" class="nav-item nav-button-padding active">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/about">
|
||||
<div class="icon info-circle-active"></div>
|
||||
About
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -155,7 +155,7 @@
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col l6 s12">
|
||||
<h5 class="white-text">Gaps v0.4.0-SNAPSHOT/h5>
|
||||
<h5 class="white-text">Gaps v0.4.0/h5>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -23,29 +23,52 @@
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
||||
<a class="navbar-brand" href="/">Gaps</a>
|
||||
<a class="" href=".">
|
||||
<img src="/images/final-gaps.svg" class="d-inline-block align-top" alt="" width="96" height="96">
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarColor01">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/configuration">Configuration</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/libraries">
|
||||
<div class="icon list-ul-default"></div>
|
||||
Libraries
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/libraries">Libraries</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/recommended">
|
||||
<div class="icon collection-fill-default"></div>
|
||||
Missing
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/recommended">Recommended</a>
|
||||
<li class="nav-item nav-button-padding" hidden>
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/mislabeled">
|
||||
<div class="icon exclamation-triangle-default"></div>
|
||||
Mislabeled
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/mislabeled">Mislabeled</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/rssCheck">
|
||||
<div class="icon rss-default"></div>
|
||||
RSS
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/rssCheck">RSS</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/configuration">
|
||||
<div class="icon gear-default"></div>
|
||||
Settings
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/updates" id="updatesTab">Updates</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/updates">
|
||||
<div class="icon arrow-clockwise-default"></div>
|
||||
Updates
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/about" id="aboutTab">About</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/about">
|
||||
<div class="icon info-circle-default"></div>
|
||||
About
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -54,8 +77,7 @@
|
||||
<div class="container bottom-margin">
|
||||
<img src="/images/final-2.svg" alt="Gaps Logo" style="width:50%;height:50%;" class="center">
|
||||
|
||||
<h3 class="top-margin">About</h3>
|
||||
<h4 class="top-margin text-primary">v0.4.0-SNAPSHOT</h4>
|
||||
<h3 class="top-margin">v0.4.0</h3>
|
||||
|
||||
<p class="text-muted">Gaps searches through your Plex Server. It then queries
|
||||
for known
|
||||
@@ -71,7 +93,8 @@
|
||||
'Alien³ (1992)' to be added to your collection.</p>
|
||||
|
||||
<h4 class="top-margin text-primary">Getting Started</h4>
|
||||
<p class="text-muted">To get started, head to <a href="/configuration">configuration</a> and enter your TVDB ID and Plex Server
|
||||
<p class="text-muted">To get started, head to <a href="/configuration">configuration</a> and enter your TVDB ID and
|
||||
Plex Server
|
||||
information.</p>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -25,29 +25,52 @@
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
||||
<a class="navbar-brand" href="/home">Gaps</a>
|
||||
<a class="" href=".">
|
||||
<img src="/images/final-gaps.svg" class="d-inline-block align-top" alt="" width="96" height="96">
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarColor01">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/configuration">Configuration</a>
|
||||
<li aria-current="page" class="nav-item nav-button-padding active">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/libraries">
|
||||
<div class="icon list-ul-active"></div>
|
||||
Libraries
|
||||
</a>
|
||||
</li>
|
||||
<li aria-current="page" class="nav-item active">
|
||||
<a class="nav-link" href="/libraries">Libraries</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/recommended">
|
||||
<div class="icon collection-fill-default"></div>
|
||||
Missing
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/recommended">Recommended</a>
|
||||
<li class="nav-item nav-button-padding" hidden>
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/mislabeled">
|
||||
<div class="icon exclamation-triangle-default"></div>
|
||||
Mislabeled
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/mislabeled">Mislabeled</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/rssCheck">
|
||||
<div class="icon rss-default"></div>
|
||||
RSS
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/rssCheck">RSS</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/configuration">
|
||||
<div class="icon gear-default"></div>
|
||||
Settings
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/updates" id="updatesTab">Updates</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/updates">
|
||||
<div class="icon arrow-clockwise-default"></div>
|
||||
Updates
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/about" id="aboutTab">About</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/about">
|
||||
<div class="icon info-circle-default"></div>
|
||||
About
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -23,9 +23,10 @@
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
||||
<a class="navbar-brand" href="/">Gaps</a>
|
||||
<a class="" href=".">
|
||||
<img src="/images/final-gaps.svg" class="d-inline-block align-top" alt="" width="96" height="96">
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
<div class="container bottom-margin">
|
||||
<img src="/images/final-2.svg" alt="Gaps Logo" style="width:50%;height:50%;" class="center">
|
||||
|
||||
|
||||
@@ -25,29 +25,52 @@
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
||||
<a class="navbar-brand" href="/">Gaps</a>
|
||||
<a class="" href=".">
|
||||
<img src="/images/final-gaps.svg" class="d-inline-block align-top" alt="" width="96" height="96">
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarColor01">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/configuration">Configuration</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/libraries">
|
||||
<div class="icon list-ul-default"></div>
|
||||
Libraries
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/libraries">Libraries</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/recommended">
|
||||
<div class="icon collection-fill-default"></div>
|
||||
Missing
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/recommended">Recommended</a>
|
||||
<li aria-current="page" class="nav-item nav-button-padding active">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/mislabeled">
|
||||
<div class="icon exclamation-triangle-active"></div>
|
||||
Mislabeled
|
||||
</a>
|
||||
</li>
|
||||
<li aria-current="page" class="nav-item active">
|
||||
<a class="nav-link" href="/mislabeled">Mislabeled</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/rssCheck">
|
||||
<div class="icon rss-default"></div>
|
||||
RSS
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/rssCheck">RSS</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/configuration">
|
||||
<div class="icon gear-default"></div>
|
||||
Settings
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/updates" id="updatesTab">Updates</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/updates">
|
||||
<div class="icon arrow-clockwise-default"></div>
|
||||
Updates
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/about" id="aboutTab">About</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/about">
|
||||
<div class="icon info-circle-default"></div>
|
||||
About
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -25,36 +25,58 @@
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
||||
<a class="navbar-brand" href="/">Gaps</a>
|
||||
<a class="" href=".">
|
||||
<img src="/images/final-gaps.svg" class="d-inline-block align-top" alt="" width="96" height="96">
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarColor01">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/configuration">Configuration</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/libraries">
|
||||
<div class="icon list-ul-default"></div>
|
||||
Libraries
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/libraries">Libraries</a>
|
||||
<li aria-current="page" class="nav-item nav-button-padding active">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/recommended">
|
||||
<div class="icon collection-fill-active"></div>
|
||||
Missing
|
||||
</a>
|
||||
</li>
|
||||
<li aria-current="page" class="nav-item active">
|
||||
<a class="nav-link" href="/recommended">Recommended</a>
|
||||
<li class="nav-item nav-button-padding" hidden>
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/mislabeled">
|
||||
<div class="icon exclamation-triangle-default"></div>
|
||||
Mislabeled
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/mislabeled">Mislabeled</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/rssCheck">
|
||||
<div class="icon rss-default"></div>
|
||||
RSS
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/rssCheck">RSS</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/configuration">
|
||||
<div class="icon gear-default"></div>
|
||||
Settings
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/updates" id="updatesTab">Updates</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/updates">
|
||||
<div class="icon arrow-clockwise-default"></div>
|
||||
Updates
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/about" id="aboutTab">About</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/about">
|
||||
<div class="icon info-circle-default"></div>
|
||||
About
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div class="container">
|
||||
<h3 class="top-margin">Recommended Movies</h3>
|
||||
<h3 class="top-margin">Missing Movies</h3>
|
||||
|
||||
<h4 class="top-margin text-primary" id="libraryTitle"
|
||||
th:text="${plexServer.friendlyName} + ' - ' + ${plexLibrary.title}"></h4>
|
||||
|
||||
@@ -25,29 +25,52 @@
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
||||
<a class="navbar-brand" href="/">Gaps</a>
|
||||
<a class="" href=".">
|
||||
<img src="/images/final-gaps.svg" class="d-inline-block align-top" alt="" width="96" height="96">
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarColor01">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/configuration">Configuration</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/libraries">
|
||||
<div class="icon list-ul-default"></div>
|
||||
Libraries
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/libraries">Libraries</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/recommended">
|
||||
<div class="icon collection-fill-default"></div>
|
||||
Missing
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/recommended">Recommended</a>
|
||||
<li class="nav-item nav-button-padding" hidden>
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/mislabeled">
|
||||
<div class="icon exclamation-triangle-default"></div>
|
||||
Mislabeled
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/mislabeled">Mislabeled</a>
|
||||
<li aria-current="page" class="nav-item nav-button-padding active">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/rssCheck">
|
||||
<div class="icon rss-active"></div>
|
||||
RSS
|
||||
</a>
|
||||
</li>
|
||||
<li aria-current="page" class="nav-item active">
|
||||
<a class="nav-link" href="/rssCheck">RSS</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/configuration">
|
||||
<div class="icon gear-default"></div>
|
||||
Settings
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/updates" id="updatesTab">Updates</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/updates">
|
||||
<div class="icon arrow-clockwise-default"></div>
|
||||
Updates
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/about" id="aboutTab">About</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/about">
|
||||
<div class="icon info-circle-default"></div>
|
||||
About
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -23,29 +23,52 @@
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
||||
<a class="navbar-brand" href="/">Gaps</a>
|
||||
<a class="" href=".">
|
||||
<img src="/images/final-gaps.svg" class="d-inline-block align-top" alt="" width="96" height="96">
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarColor01">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/configuration">Configuration</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/libraries">
|
||||
<div class="icon list-ul-default"></div>
|
||||
Libraries
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/libraries">Libraries</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/recommended">
|
||||
<div class="icon collection-fill-default"></div>
|
||||
Missing
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/recommended">Recommended</a>
|
||||
<li class="nav-item nav-button-padding" hidden>
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/mislabeled">
|
||||
<div class="icon exclamation-triangle-default"></div>
|
||||
Mislabeled
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/mislabeled">Mislabeled</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/rssCheck">
|
||||
<div class="icon rss-default"></div>
|
||||
RSS
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/rssCheck">RSS</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/configuration">
|
||||
<div class="icon gear-default"></div>
|
||||
Settings
|
||||
</a>
|
||||
</li>
|
||||
<li aria-current="page" class="nav-item active">
|
||||
<a class="nav-link" href="/updates" id="updatesTab">Updates</a>
|
||||
<li aria-current="page" class="nav-item nav-button-padding active">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/updates">
|
||||
<div class="icon arrow-clockwise-active"></div>
|
||||
Updates
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/about">About</a>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/about">
|
||||
<div class="icon info-circle-default"></div>
|
||||
About
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -55,10 +78,17 @@
|
||||
<img src="/images/final-2.svg" alt="Gaps Logo" style="width:50%;height:50%;" class="center">
|
||||
|
||||
<h3 class="top-margin">Updates</h3>
|
||||
<h4 class="top-margin text-primary">v0.4.0-SNAPSHOT</h4>
|
||||
<h4 class="top-margin text-primary">v0.4.0</h4>
|
||||
<ul class="text-muted">
|
||||
<li>Updates Page</li>
|
||||
<li>Plex miss-labeled videos</li>
|
||||
<li>Added Updates Page</li>
|
||||
<li>GitHub CI/CD Builds</li>
|
||||
<li>New Gaps Logo</li>
|
||||
<li>New Gaps Icon</li>
|
||||
<li>New Icons</li>
|
||||
<li>Updated Navbar</li>
|
||||
<li>Updated End to End Testing</li>
|
||||
<li>Springboot 2.3.0</li>
|
||||
<li>Cypress 4.7.0</li>
|
||||
</ul>
|
||||
|
||||
<h4 class="top-margin text-primary">v0.3.1</h4>
|
||||
@@ -146,6 +176,5 @@
|
||||
|
||||
<script src="/js/jquery-3.4.1.min.js" type="text/javascript"></script>
|
||||
<script src="/js/bootstrap.bundle.min.js" type="text/javascript"></script>
|
||||
<script src="/js/index.min.js" type="text/javascript"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -13,5 +13,5 @@ info:
|
||||
app:
|
||||
name: Gaps
|
||||
description: Gaps searches through your Plex Server or local folders for all movies, then queries for known movies in the same collection. If those movies don't exist in your library, Gaps will recommend getting those movies, legally of course.
|
||||
version: 0.4.0-SNAPSHOT
|
||||
version: 0.4.0
|
||||
loginEnabled: false
|
||||
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>Gaps</artifactId>
|
||||
<groupId>com.jasonhhouse</groupId>
|
||||
<version>0.4.0-SNAPSHOT</version>
|
||||
<version>0.4.0</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/bin/bash
|
||||
VERSION=0.4.0-SNAPSHOT
|
||||
VERSION=0.4.0
|
||||
DOCKER_LATEST="housewrecker/gaps:latest"
|
||||
JAR_VERSION="GapsWeb/target/GapsWeb-$VERSION.jar"
|
||||
ZIP_VERSION="Gaps-$VERSION.zip"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/bin/bash
|
||||
VERSION="0.4.0-SNAPSHOT"
|
||||
VERSION="0.4.0"
|
||||
DOCKER_LATEST="housewrecker/gaps:v$VERSION"
|
||||
JAR_VERSION="GapsWeb/target/GapsWeb-$VERSION.jar"
|
||||
ZIP_VERSION="Gaps-$VERSION.zip"
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
import {spyOnAddEventListener} from "../common";
|
||||
|
||||
describe('Verify About Page', function () {
|
||||
|
||||
it('Default page', () => {
|
||||
cy.visit('/about', {onBeforeLoad: spyOnAddEventListener});
|
||||
|
||||
cy.get('h3.top-margin')
|
||||
.should('have.text', 'About');
|
||||
|
||||
cy.get('.container > :nth-child(3)')
|
||||
.should('have.text', 'v0.4.0');
|
||||
|
||||
cy.get('.container > :nth-child(6)')
|
||||
.should('have.text', 'Software');
|
||||
|
||||
cy.get(':nth-child(8)')
|
||||
.should('have.text', 'License');
|
||||
|
||||
cy.get(':nth-child(10)')
|
||||
.should('have.text', 'Support');
|
||||
});
|
||||
|
||||
});
|
||||
@@ -23,27 +23,27 @@ describe('Configuration Tests', function () {
|
||||
|
||||
cy.visit('/configuration', {onBeforeLoad: spyOnAddEventListener});
|
||||
|
||||
cy.get('#configurationTab')
|
||||
cy.get('.active > .nav-link')
|
||||
.should('have.attr', 'href', '/configuration')
|
||||
.parent()
|
||||
.should('have.attr', 'aria-current', 'page');
|
||||
|
||||
cy.get('#librariesTab')
|
||||
cy.get('.navbar-nav > :nth-child(1) > .nav-link')
|
||||
.should('have.attr', 'href', '/libraries')
|
||||
.parent()
|
||||
.should('not.have.attr', 'aria-current', 'page');
|
||||
|
||||
cy.get('#recommendedTab')
|
||||
cy.get('.navbar-nav > :nth-child(2) > .nav-link')
|
||||
.should('have.attr', 'href', '/recommended')
|
||||
.parent()
|
||||
.should('not.have.attr', 'aria-current', 'page');
|
||||
|
||||
cy.get('#rssTab')
|
||||
cy.get('.navbar-nav > :nth-child(4) > .nav-link')
|
||||
.should('have.attr', 'href', '/rssCheck')
|
||||
.parent()
|
||||
.should('not.have.attr', 'aria-current', 'page');
|
||||
|
||||
cy.get('#aboutTab')
|
||||
cy.get('.navbar-nav > :nth-child(7) > .nav-link')
|
||||
.should('have.attr', 'href', '/about')
|
||||
.parent()
|
||||
.should('not.have.attr', 'aria-current', 'page');
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
import {spyOnAddEventListener} from "../common";
|
||||
|
||||
describe('Verify Log In Page', function () {
|
||||
|
||||
it('Default page', () => {
|
||||
cy.visit('/login', {onBeforeLoad: spyOnAddEventListener});
|
||||
|
||||
cy.get(':nth-child(1) > label')
|
||||
.should('have.text', 'Username');
|
||||
|
||||
cy.get(':nth-child(2) > label')
|
||||
.should('have.text', 'Password');
|
||||
|
||||
cy.get('.btn')
|
||||
.should('have.text', 'Log In');
|
||||
|
||||
cy.get('#username')
|
||||
.clear()
|
||||
.type('badUser')
|
||||
.should('have.value', 'badUser');
|
||||
|
||||
cy.get('#password')
|
||||
.clear()
|
||||
.type('password')
|
||||
.should('have.value', 'password');
|
||||
|
||||
cy.get('.btn')
|
||||
.click();
|
||||
|
||||
cy.get('.card-img-top')
|
||||
.should('be.visible');
|
||||
});
|
||||
|
||||
});
|
||||
@@ -0,0 +1,76 @@
|
||||
import {spyOnAddEventListener} from "../common";
|
||||
|
||||
describe('Verify Navbars', function () {
|
||||
|
||||
it('Index page', () => {
|
||||
cy.visit('/home', {onBeforeLoad: spyOnAddEventListener});
|
||||
|
||||
checkNavIcons(cy);
|
||||
});
|
||||
|
||||
it('About page', () => {
|
||||
cy.visit('/about', {onBeforeLoad: spyOnAddEventListener});
|
||||
|
||||
checkNavIcons(cy, undefined, undefined, undefined, undefined, undefined, false);
|
||||
});
|
||||
|
||||
it('Settings page', () => {
|
||||
cy.visit('/configuration', {onBeforeLoad: spyOnAddEventListener});
|
||||
|
||||
checkNavIcons(cy, undefined, undefined, undefined, false, undefined, undefined);
|
||||
});
|
||||
|
||||
it('Libraries page', () => {
|
||||
cy.visit('/libraries', {onBeforeLoad: spyOnAddEventListener});
|
||||
|
||||
checkNavIcons(cy, false, undefined, undefined, undefined, undefined, undefined);
|
||||
});
|
||||
|
||||
it('Libraries page', () => {
|
||||
cy.visit('/libraries', {onBeforeLoad: spyOnAddEventListener});
|
||||
|
||||
checkNavIcons(cy, false, undefined, undefined, undefined, undefined, undefined);
|
||||
});
|
||||
|
||||
it('Recommended page', () => {
|
||||
cy.visit('/recommended', {onBeforeLoad: spyOnAddEventListener});
|
||||
|
||||
checkNavIcons(cy, undefined, false, undefined, undefined, undefined, undefined);
|
||||
});
|
||||
|
||||
it('RSS page', () => {
|
||||
cy.visit('/rssCheck', {onBeforeLoad: spyOnAddEventListener});
|
||||
|
||||
checkNavIcons(cy, undefined, undefined, false, undefined, undefined, undefined);
|
||||
});
|
||||
|
||||
it('Updates page', () => {
|
||||
cy.visit('/updates', {onBeforeLoad: spyOnAddEventListener});
|
||||
|
||||
checkNavIcons(cy, undefined, undefined, undefined, undefined, false, undefined);
|
||||
});
|
||||
});
|
||||
|
||||
function checkNavIcons(cy, isLibDefault = true, isMissingDefault = true, isRssDefault = true,
|
||||
isSettingsDefault = true, isUpdatesDefault = true, isAboutDefault = true) {
|
||||
cy.get(':nth-child(1) > .nav-link > .icon')
|
||||
.should('have.class', isLibDefault ? 'list-ul-default' : 'list-ul-active');
|
||||
|
||||
cy.get(':nth-child(2) > .nav-link > .icon')
|
||||
.should('have.class', isMissingDefault ? 'collection-fill-default' : 'collection-fill-active');
|
||||
|
||||
cy.get(':nth-child(3) > .nav-link > .icon')
|
||||
.should('not.be.visible');
|
||||
|
||||
cy.get(':nth-child(4) > .nav-link > .icon')
|
||||
.should('have.class', isRssDefault ? 'rss-default' : 'rss-active');
|
||||
|
||||
cy.get(':nth-child(5) > .nav-link > .icon')
|
||||
.should('have.class', isSettingsDefault ? 'gear-default' : 'gear-active');
|
||||
|
||||
cy.get(':nth-child(6) > .nav-link > .icon')
|
||||
.should('have.class', isUpdatesDefault ? 'arrow-clockwise-default' : 'arrow-clockwise-active');
|
||||
|
||||
cy.get(':nth-child(7) > .nav-link > .icon')
|
||||
.should('have.class', isAboutDefault ? 'info-circle-default' : 'info-circle-active');
|
||||
}
|
||||
@@ -6,6 +6,13 @@ describe('Search for Recommended', function () {
|
||||
it('Clean configuration page load', () => {
|
||||
searchSawLibrary(cy);
|
||||
|
||||
cy.get('#libraryTitle').then( ($libraryTitle) => {
|
||||
if($libraryTitle.text() !== "Red - Saw") {
|
||||
cy.get('#dropdownMenuLink').click();
|
||||
cy.get('[data-key="2"]').click();
|
||||
}
|
||||
});
|
||||
|
||||
cy.get('#noMovieContainer > .card > .card-img-top')
|
||||
.should('not.be.visible');
|
||||
|
||||
|
||||
@@ -11,9 +11,9 @@
|
||||
<Project>https://github.com/JasonHHouse/Gaps/</Project>
|
||||
<Overview>Search your movies and find missing movies from MovieDB collections.</Overview>
|
||||
<Category>Tools: MediaApp:Other MediaServer:Other Status:Stable</Category>
|
||||
<WebUI>https://[IP]:[PORT:8884]</WebUI>
|
||||
<WebUI>http://[IP]:[PORT:8884]</WebUI>
|
||||
<TemplateURL>https://github.com/JasonHHouse/Gaps/gaps.xml</TemplateURL>
|
||||
<Icon>https://raw.githubusercontent.com/JasonHHouse/Gaps/master/images/gaps.png</Icon>
|
||||
<Icon>https://raw.githubusercontent.com/JasonHHouse/Gaps/master/images/final-gaps.png</Icon>
|
||||
<ExtraParams/>
|
||||
<PostArgs/>
|
||||
<CPUset/>
|
||||
@@ -41,5 +41,7 @@
|
||||
<Environment/>
|
||||
<Labels/>
|
||||
<Config Name="UI" Target="8484" Default="" Mode="tcp" Description="Container Port: 8484" Type="Port" Display="always" Required="false" Mask="false">8884</Config>
|
||||
<Config Name="SSL Boolean" Target="ENABLE_SSL" Default="" Mode="" Description="true/false to enable SSL" Type="Variable" Display="always" Required="false" Mask="false">false</Config>
|
||||
<Config Name="Login Boolean" Target="ENABLE_LOGIN" Default="" Mode="" Description="true/false to enable login" Type="Variable" Display="always" Required="false" Mask="false">false</Config>
|
||||
<Config Name="config" Target="/usr/data" Default="" Mode="rw" Description="File path for gaps config and data storage." Type="Path" Display="always" Required="false" Mask="false">/mnt/user/appdata/gaps/</Config>
|
||||
</Container>
|
||||
|
||||
|
After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 57 KiB |
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "gaps",
|
||||
"version": "0.4.0-SNAPSHOT",
|
||||
"version": "0.4.0",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
@@ -118,87 +118,22 @@
|
||||
"any-observable": "^0.3.0"
|
||||
}
|
||||
},
|
||||
"@types/blob-util": {
|
||||
"version": "1.3.3",
|
||||
"resolved": "https://registry.npmjs.org/@types/blob-util/-/blob-util-1.3.3.tgz",
|
||||
"integrity": "sha512-4ahcL/QDnpjWA2Qs16ZMQif7HjGP2cw3AGjHabybjw7Vm1EKu+cfQN1D78BaZbS1WJNa1opSMF5HNMztx7lR0w==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/bluebird": {
|
||||
"version": "3.5.29",
|
||||
"resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.29.tgz",
|
||||
"integrity": "sha512-kmVtnxTuUuhCET669irqQmPAez4KFnFVKvpleVRyfC3g+SHD1hIkFZcWLim9BVcwUBLO59o8VZE4yGCmTif8Yw==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/chai": {
|
||||
"version": "4.2.7",
|
||||
"resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.7.tgz",
|
||||
"integrity": "sha512-luq8meHGYwvky0O7u0eQZdA7B4Wd9owUCqvbw2m3XCrCU8mplYOujMBbvyS547AxJkC+pGnd0Cm15eNxEUNU8g==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/chai-jquery": {
|
||||
"version": "1.1.40",
|
||||
"resolved": "https://registry.npmjs.org/@types/chai-jquery/-/chai-jquery-1.1.40.tgz",
|
||||
"integrity": "sha512-mCNEZ3GKP7T7kftKeIs7QmfZZQM7hslGSpYzKbOlR2a2HCFf9ph4nlMRA9UnuOETeOQYJVhJQK7MwGqNZVyUtQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/chai": "*",
|
||||
"@types/jquery": "*"
|
||||
}
|
||||
},
|
||||
"@types/color-name": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
|
||||
"integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
|
||||
},
|
||||
"@types/jquery": {
|
||||
"version": "3.3.31",
|
||||
"resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.3.31.tgz",
|
||||
"integrity": "sha512-Lz4BAJihoFw5nRzKvg4nawXPzutkv7wmfQ5121avptaSIXlDNJCUuxZxX/G+9EVidZGuO0UBlk+YjKbwRKJigg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/sizzle": "*"
|
||||
}
|
||||
},
|
||||
"@types/lodash": {
|
||||
"version": "4.14.149",
|
||||
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.149.tgz",
|
||||
"integrity": "sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/minimatch": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
|
||||
"integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/mocha": {
|
||||
"version": "5.2.7",
|
||||
"resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz",
|
||||
"integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/q": {
|
||||
"version": "1.5.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz",
|
||||
"integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw=="
|
||||
},
|
||||
"@types/sinon": {
|
||||
"version": "7.5.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-7.5.1.tgz",
|
||||
"integrity": "sha512-EZQUP3hSZQyTQRfiLqelC9NMWd1kqLcmQE0dMiklxBkgi84T+cHOhnKpgk4NnOWpGX863yE6+IaGnOXUNFqDnQ==",
|
||||
"@types/sinonjs__fake-timers": {
|
||||
"version": "6.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.1.tgz",
|
||||
"integrity": "sha512-yYezQwGWty8ziyYLdZjwxyMb0CZR49h8JALHGrxjQHWlqGgc8kLdHEgWrgL0uZ29DMvEVBDnHU2Wg36zKSIUtA==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/sinon-chai": {
|
||||
"version": "3.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.3.tgz",
|
||||
"integrity": "sha512-TOUFS6vqS0PVL1I8NGVSNcFaNJtFoyZPXZ5zur+qlhDfOmQECZZM4H4kKgca6O8L+QceX/ymODZASfUfn+y4yQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/chai": "*",
|
||||
"@types/sinon": "*"
|
||||
}
|
||||
},
|
||||
"@types/sizzle": {
|
||||
"version": "2.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz",
|
||||
@@ -313,9 +248,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"aws4": {
|
||||
"version": "1.9.1",
|
||||
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz",
|
||||
"integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==",
|
||||
"version": "1.10.0",
|
||||
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz",
|
||||
"integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==",
|
||||
"dev": true
|
||||
},
|
||||
"balanced-match": {
|
||||
@@ -891,24 +826,15 @@
|
||||
}
|
||||
},
|
||||
"cypress": {
|
||||
"version": "4.5.0",
|
||||
"resolved": "https://registry.npmjs.org/cypress/-/cypress-4.5.0.tgz",
|
||||
"integrity": "sha512-2A4g5FW5d2fHzq8HKUGAMVTnW6P8nlWYQALiCoGN4bqBLvgwhYM/oG9oKc2CS6LnvgHFiKivKzpm9sfk3uU3zQ==",
|
||||
"version": "4.7.0",
|
||||
"resolved": "https://registry.npmjs.org/cypress/-/cypress-4.7.0.tgz",
|
||||
"integrity": "sha512-Vav6wUFhPRlImIND/2lOQlUnAWzgCC/iXyJlJjX9nJOJul5LC1vUpf/m8Oiae870PFPyT0ZLLwPHKTXZNdXmHw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@cypress/listr-verbose-renderer": "0.4.1",
|
||||
"@cypress/request": "2.88.5",
|
||||
"@cypress/xvfb": "1.2.4",
|
||||
"@types/blob-util": "1.3.3",
|
||||
"@types/bluebird": "3.5.29",
|
||||
"@types/chai": "4.2.7",
|
||||
"@types/chai-jquery": "1.1.40",
|
||||
"@types/jquery": "3.3.31",
|
||||
"@types/lodash": "4.14.149",
|
||||
"@types/minimatch": "3.0.3",
|
||||
"@types/mocha": "5.2.7",
|
||||
"@types/sinon": "7.5.1",
|
||||
"@types/sinon-chai": "3.2.3",
|
||||
"@types/sinonjs__fake-timers": "6.0.1",
|
||||
"@types/sizzle": "2.3.2",
|
||||
"arch": "2.1.1",
|
||||
"bluebird": "3.7.2",
|
||||
@@ -3004,9 +2930,9 @@
|
||||
}
|
||||
},
|
||||
"safe-buffer": {
|
||||
"version": "5.2.0",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
|
||||
"integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
|
||||
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
|
||||
"dev": true
|
||||
},
|
||||
"safer-buffer": {
|
||||
@@ -3309,9 +3235,9 @@
|
||||
}
|
||||
},
|
||||
"tslib": {
|
||||
"version": "1.11.1",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz",
|
||||
"integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==",
|
||||
"version": "1.13.0",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
|
||||
"integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
|
||||
"dev": true
|
||||
},
|
||||
"tunnel-agent": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "gaps",
|
||||
"version": "0.4.0-SNAPSHOT",
|
||||
"version": "0.4.0",
|
||||
"description": "Gaps searches through your Plex Server or local folders for all movies, then queries for known movies in the same collection. If those movies don't exist in your library, Gaps will recommend getting those movies, legally of course.",
|
||||
"main": "/",
|
||||
"dependencies": {
|
||||
@@ -10,7 +10,7 @@
|
||||
"uglify-js": "^3.9.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"cypress": "^4.4.0"
|
||||
"cypress": "^4.7.0"
|
||||
},
|
||||
"scripts": {
|
||||
"e2e": "cypress open",
|
||||
|
||||
@@ -11,12 +11,12 @@
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>2.2.6.RELEASE</version>
|
||||
<version>2.3.0.RELEASE</version>
|
||||
<relativePath/> <!-- lookup parent from repository -->
|
||||
</parent>
|
||||
<groupId>com.jasonhhouse</groupId>
|
||||
<artifactId>Gaps</artifactId>
|
||||
<version>0.4.0-SNAPSHOT</version>
|
||||
<version>0.4.0</version>
|
||||
<name>Gaps</name>
|
||||
<description>Demo project for Spring Boot</description>
|
||||
|
||||
|
||||