Merge pull request #121 from JasonHHouse/featue/new_icons

Featue/new icons
This commit is contained in:
JasonHHouse
2020-05-28 09:26:46 +09:00
committed by GitHub
54 changed files with 1092 additions and 356 deletions
+20 -15
View File
@@ -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
-4
View File
@@ -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
+2
View File
@@ -37,3 +37,5 @@ GapsOnWindows/*.jar
cypress/screenshots
cypress/videos
Plex/target/
GapsWeb/src/main/resources/static/css/input.min.css
+2 -2
View File
@@ -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>
+3 -3
View File
@@ -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/
+3 -3
View File
@@ -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>
+3 -3
View File
@@ -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;
+1 -1
View File
@@ -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
View File
@@ -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%}
Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

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

BIN
View File
Binary file not shown.

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
View File
@@ -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()};
+39 -16
View File
@@ -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>
+38 -16
View File
@@ -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>
+41 -18
View File
@@ -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>
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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 -1
View File
@@ -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 -1
View File
@@ -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"
+24
View File
@@ -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');
});
});
+5 -5
View File
@@ -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');
+34
View File
@@ -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');
});
});
+76
View File
@@ -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');
+4 -2
View File
@@ -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>
Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Executable → Regular
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 57 KiB

+18 -92
View File
@@ -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": {
+2 -2
View File
@@ -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",
+2 -2
View File
@@ -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>