Updating cards and 0.4.4

This commit is contained in:
Jason House
2020-07-20 23:40:29 +09:00
parent 3c96c7c455
commit 226385ad12
27 changed files with 134 additions and 127 deletions

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>Gaps</artifactId>
<groupId>com.jasonhhouse</groupId>
<version>0.4.3</version>
<version>0.4.4</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -15,7 +15,7 @@
<dependency>
<groupId>com.jasonhhouse</groupId>
<artifactId>Plex</artifactId>
<version>0.4.3</version>
<version>0.4.4</version>
</dependency>
<dependency>

View File

@@ -20,7 +20,7 @@ RUN mkdir -p /usr/app && chmod 777 /usr/data
WORKDIR /usr/app
COPY GapsWeb/target/GapsWeb-0.4.3.jar /usr/app/gaps.jar
COPY GapsWeb/target/GapsWeb-0.4.4.jar /usr/app/gaps.jar
COPY start.sh /usr/app/

View File

@@ -22,7 +22,7 @@ RUN mkdir -p /usr/app && chmod 777 /usr/data
WORKDIR /usr/app
COPY GapsWeb/target/GapsWeb-0.4.3.jar /usr/app/gaps.jar
COPY GapsWeb/target/GapsWeb-0.4.4.jar /usr/app/gaps.jar
COPY start.sh /usr/app/

View File

@@ -22,7 +22,7 @@ RUN mkdir -p /usr/app && chmod 777 /usr/data
WORKDIR /usr/app
COPY GapsWeb/target/GapsWeb-0.4.3.jar /usr/app/gaps.jar
COPY GapsWeb/target/GapsWeb-0.4.4.jar /usr/app/gaps.jar
COPY start.sh /usr/app/

View File

@@ -2,8 +2,8 @@
<launch4jConfig>
<dontWrapJar>false</dontWrapJar>
<headerType>console</headerType>
<jar>/Users/jhouse/Code/Gaps/GapsWeb/target/GapsWeb-0.4.3.jar</jar>
<outfile>/Users/jhouse/Desktop/Gaps-v0.4.3.exe</outfile>
<jar>/Users/jhouse/Code/Gaps/GapsWeb/target/GapsWeb-0.4.4.jar</jar>
<outfile>/Users/jhouse/Desktop/Gaps-v0.4.4.exe</outfile>
<errTitle></errTitle>
<cmdLine></cmdLine>
<chdir>.</chdir>
@@ -28,16 +28,16 @@
<runtimeBits>64/32</runtimeBits>
</jre>
<versionInfo>
<fileVersion>0.4.3.0</fileVersion>
<fileVersion>0.4.4.0</fileVersion>
<txtFileVersion>Free Form</txtFileVersion>
<fileDescription>Gaps</fileDescription>
<copyright>2019</copyright>
<productVersion>0.4.3.0</productVersion>
<productVersion>0.4.4.0</productVersion>
<txtProductVersion>Free Form</txtProductVersion>
<productName>Gaps</productName>
<companyName></companyName>
<internalName>Gaps</internalName>
<originalFilename>Gaps-0.4.3.exe</originalFilename>
<originalFilename>Gaps-0.4.4.exe</originalFilename>
<trademarks></trademarks>
<language>ENGLISH_US</language>
</versionInfo>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>Gaps</artifactId>
<groupId>com.jasonhhouse</groupId>
<version>0.4.3</version>
<version>0.4.4</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -19,13 +19,13 @@
<dependency>
<groupId>com.jasonhhouse</groupId>
<artifactId>Core</artifactId>
<version>0.4.3</version>
<version>0.4.4</version>
</dependency>
<dependency>
<groupId>com.jasonhhouse</groupId>
<artifactId>Plex</artifactId>
<version>0.4.3</version>
<version>0.4.4</version>
</dependency>
<dependency>

View File

@@ -413,6 +413,11 @@ public class GapsSearchService implements GapsSearch {
JsonNode collection = objectMapper.readTree(collectionJson);
if (collection.has("status_code") && collection.get("status_code").asInt() == 34) {
LOGGER.warn(collection.get("status_message").asText());
return;
}
int indexOfMovie = everyMovie.indexOf(movie);
List<MovieFromCollection> moviesInCollection = new ArrayList<>();
@@ -420,20 +425,20 @@ public class GapsSearchService implements GapsSearch {
JsonNode parts = collection.get("parts");
parts.iterator().forEachRemaining(jsonNode -> {
String title = jsonNode.get("title").asText();
int year = jsonNode.get("year").asInt();
int year = -1;
if(jsonNode.has("year")) {
year = jsonNode.get("year").asInt(-1);
}
String id = jsonNode.get("id").asText();
Boolean owned = everyMovie.contains(new Movie.Builder(title, year).build());
Boolean owned = ownedMovies.contains(new Movie.Builder(title, year).build());
moviesInCollection.add(new MovieFromCollection(title, id, owned));
});
}
LOGGER.info("MoviesInCollection: " + Arrays.toString(moviesInCollection.toArray()));
if (collection.has("status_code") && collection.get("status_code").asInt() == 34) {
LOGGER.warn(collection.get("status_message").asText());
return;
} else if (indexOfMovie != -1) {
int id = collection.get("id").asInt();
if (indexOfMovie != -1) {
int id = collection.get("id").asInt(-1);
String name = collection.get("name").asText();
everyMovie.get(indexOfMovie).setCollectionId(id);
everyMovie.get(indexOfMovie).setCollection(name);

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.3
version: 0.4.4

View File

@@ -153,4 +153,12 @@
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;
}
.long-text {
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 3; /* number of lines to show */
-webkit-box-orient: vertical;
}

View File

@@ -17,10 +17,6 @@ let moviesTable;
let libraryKey;
jQuery(function ($) {
Handlebars.registerHelper('json', function (context) {
return JSON.stringify(context);
});
libraryTitle = $('#libraryTitle');
noMovieContainer = $('#noMovieContainer');
movieContainer = $('#movieContainer');

View File

@@ -1 +1 @@
import{getOwnedMoviesForTable}from"/js/modules/common.min.js";let libraryTitle,noMovieContainer,movieContainer,movieSearchingContainer,plexServers,plexServer,moviesTable,libraryKey;function switchPlexLibrary(machineIdentifier,key){libraryKey=key;const plexLibrary=(plexServer=plexServers[machineIdentifier]).plexLibraries.find(plexServer=>plexServer.key===parseInt(key));libraryTitle.text(`${plexServer.friendlyName} - ${plexLibrary.title}`),moviesTable.data().clear(),moviesTable.rows().invalidate().draw(),getOwnedMoviesForTable(`/libraries/${machineIdentifier}/${libraryKey}`,movieContainer,noMovieContainer,moviesTable)}function searchForMovies(){movieSearchingContainer.show(),noMovieContainer.css({display:"none"}),moviesTable.data().clear(),moviesTable.rows().invalidate().draw(),$.ajax({type:"GET",url:`/plex/movies/${plexServer.machineIdentifier}/${libraryKey}`,contentType:"application/json",success:function(data){movieSearchingContainer.css({display:"none"}),moviesTable.rows.add(data).draw(),movieContainer.show(100)}})}jQuery(function($){Handlebars.registerHelper("json",function(context){return JSON.stringify(context)}),libraryTitle=$("#libraryTitle"),noMovieContainer=$("#noMovieContainer"),movieContainer=$("#movieContainer"),movieSearchingContainer=$("#movieSearchingContainer"),plexServers=JSON.parse($("#plexServers").val()),plexServer=JSON.parse($("#plexServer").val()),libraryKey=$("#libraryKey").val(),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}]}),getOwnedMoviesForTable(`/libraries/${plexServer.machineIdentifier}/${libraryKey}`,movieContainer,noMovieContainer,moviesTable),window.searchForMovies=searchForMovies,window.switchPlexLibrary=switchPlexLibrary});
import{getOwnedMoviesForTable}from"/js/modules/common.min.js";let libraryTitle,noMovieContainer,movieContainer,movieSearchingContainer,plexServers,plexServer,moviesTable,libraryKey;function switchPlexLibrary(machineIdentifier,key){libraryKey=key;const plexLibrary=(plexServer=plexServers[machineIdentifier]).plexLibraries.find(plexServer=>plexServer.key===parseInt(key));libraryTitle.text(`${plexServer.friendlyName} - ${plexLibrary.title}`),moviesTable.data().clear(),moviesTable.rows().invalidate().draw(),getOwnedMoviesForTable(`/libraries/${machineIdentifier}/${libraryKey}`,movieContainer,noMovieContainer,moviesTable)}function searchForMovies(){movieSearchingContainer.show(),noMovieContainer.css({display:"none"}),moviesTable.data().clear(),moviesTable.rows().invalidate().draw(),$.ajax({type:"GET",url:`/plex/movies/${plexServer.machineIdentifier}/${libraryKey}`,contentType:"application/json",success:function(data){movieSearchingContainer.css({display:"none"}),moviesTable.rows.add(data).draw(),movieContainer.show(100)}})}jQuery(function($){libraryTitle=$("#libraryTitle"),noMovieContainer=$("#noMovieContainer"),movieContainer=$("#movieContainer"),movieSearchingContainer=$("#movieSearchingContainer"),plexServers=JSON.parse($("#plexServers").val()),plexServer=JSON.parse($("#plexServer").val()),libraryKey=$("#libraryKey").val(),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}]}),getOwnedMoviesForTable(`/libraries/${plexServer.machineIdentifier}/${libraryKey}`,movieContainer,noMovieContainer,moviesTable),window.searchForMovies=searchForMovies,window.switchPlexLibrary=switchPlexLibrary});

View File

@@ -26,8 +26,11 @@ let movieCounter;
let socket;
jQuery(function ($) {
Handlebars.registerHelper('json', function (context) {
return JSON.stringify(context);
Handlebars.registerHelper({
isNotOwned: function (value) {
return !value;
}
});
libraryTitle = $('#libraryTitle');

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,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()};
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({isNotOwned:function(value){return!value}}),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()};

View File

@@ -78,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.3</h4>
<h4 class="top-margin text-primary">v0.4.4</h4>
<p class="text-muted">Gaps searches through your Plex Server. It then queries
for known

View File

@@ -155,7 +155,7 @@
<div class="container">
<div class="row">
<div class="col l6 s12">
<h5 class="white-text">Gaps v0.4.3/h5>
<h5 class="white-text">Gaps v0.4.4/h5>
</div>
</div>
</div>

View File

@@ -77,7 +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">v0.4.3</h3>
<h3 class="top-margin">v0.4.4</h3>
<p class="text-muted">Gaps searches through your Plex Server. It then queries
for known

View File

@@ -155,12 +155,10 @@
</div>
<script id="movieCard" type="text/x-handlebars-template">
<div>{{json movie}}</div>
<div class="card mb-3">
<div class="card">
<div class="row no-gutters">
<div class="col-12 col-md-auto">
<img style="height: 225px; width: 150px; display: block;"
<img style="height: auto; width: 225px; display: block;"
src="http://{{address}}:{{port}}{{poster_url}}/?X-Plex-Token={{plexToken}}"
class="card-img" alt="Plex Poster">
</div>

View File

@@ -167,12 +167,10 @@
</div>
<script id="movieCard" type="text/x-handlebars-template">
<div>{{json movie}}</div>
<div class="card mb-3">
<div class="card">
<div class="row no-gutters">
<div class="col-12 col-md-auto">
<img style="height: 225px; width: 150px; display: block;"
<img style="height: auto; width: 225px; display: block;"
src="{{poster_url}}"
class="card-img" alt="Plex Poster">
</div>
@@ -180,15 +178,25 @@
<div class="card-body">
<h5 class="card-title">{{name}} ({{year}})</h5>
<h6 class="card-title">{{collection}}</h6>
<p class="card-text text-muted">{{overview}}</p>
<p class="card-text text-muted long-text">{{overview}}</p>
<p class="card-text"><small class="text-info">English</small></p>
{{#each movies_in_collection}}
{{#if this.owned}}
<a href="https://www.themoviedb.org/movie/{{this.id}}" class="card-link" target="_blank">&#10004; {{this.title}}</a>
{{else}}
<a href="https://www.themoviedb.org/movie/{{this.id}}" class="card-link" target="_blank">{{this.title}}</a>
{{/if}}
{{/each}}
<div>
<span class="card-text">Owned</span><br>
{{#each movies_in_collection}}
{{#if this.owned}}
<a href="https://www.themoviedb.org/movie/{{this.id}}" class="card-link" target="_blank">{{this.title}}</a>
{{/if}}
{{/each}}
</div>
<br>
<div>
<span class="card-text">Missing</span><br>
{{#each movies_in_collection}}
{{#if (isNotOwned this.owned)}}
<a href="https://www.themoviedb.org/movie/{{this.id}}" class="card-link" target="_blank">{{this.title}}</a>
{{/if}}
{{/each}}
</div>
</div>
</div>
</div>

View File

@@ -78,6 +78,14 @@
<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.4</h4>
<ul class="text-muted">
<li>Increased card image size</li>
<li>Added ellipse to card overview to maintain size</li>
<li>Fixed card padding and margins</li>
<li>Added information about owned and missing collection movies in libraries</li>
</ul>
<h4 class="top-margin text-primary">v0.4.3</h4>
<ul class="text-muted">
<li>Adding collection movies to cards for a better understanding of collections</li>

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.3
version: 0.4.4
loginEnabled: false

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>Gaps</artifactId>
<groupId>com.jasonhhouse</groupId>
<version>0.4.3</version>
<version>0.4.4</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -1,5 +1,5 @@
#!/bin/bash
VERSION=0.4.3
VERSION=0.4.4
DOCKER_LATEST="housewrecker/gaps:latest"
JAR_VERSION="GapsWeb/target/GapsWeb-$VERSION.jar"
ZIP_VERSION="Gaps-$VERSION.zip"

View File

@@ -1,5 +1,5 @@
#!/bin/bash
VERSION="0.4.3"
VERSION="0.4.4"
DOCKER_LATEST="housewrecker/gaps:v$VERSION"
JAR_VERSION="GapsWeb/target/GapsWeb-$VERSION.jar"
ZIP_VERSION="Gaps-$VERSION.zip"

View File

@@ -9,7 +9,7 @@ describe('Verify About Page', function () {
.should('have.text', 'About');
cy.get('.container > :nth-child(3)')
.should('have.text', 'v0.4.3');
.should('have.text', 'v0.4.4');
cy.get('.container > :nth-child(6)')
.should('have.text', 'Software');

121
package-lock.json generated
View File

@@ -1,6 +1,6 @@
{
"name": "gaps",
"version": "0.4.3",
"version": "0.4.4",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -141,9 +141,9 @@
"dev": true
},
"ajv": {
"version": "6.12.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz",
"integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==",
"version": "6.12.3",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
"integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
@@ -191,9 +191,9 @@
}
},
"arch": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz",
"integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==",
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/arch/-/arch-2.1.2.tgz",
"integrity": "sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ==",
"dev": true
},
"argparse": {
@@ -622,9 +622,9 @@
}
},
"commander": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-4.1.0.tgz",
"integrity": "sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw==",
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
"integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
"dev": true
},
"common-tags": {
@@ -826,9 +826,9 @@
}
},
"cypress": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/cypress/-/cypress-4.7.0.tgz",
"integrity": "sha512-Vav6wUFhPRlImIND/2lOQlUnAWzgCC/iXyJlJjX9nJOJul5LC1vUpf/m8Oiae870PFPyT0ZLLwPHKTXZNdXmHw==",
"version": "4.10.0",
"resolved": "https://registry.npmjs.org/cypress/-/cypress-4.10.0.tgz",
"integrity": "sha512-eFv1WPp4zFrAgZ6mwherBGVsTpHvay/hEF5F7U7yfAkTxsUQn/ZG/LdX67fIi3bKDTQXYzFv/CvywlQSeug8Bg==",
"dev": true,
"requires": {
"@cypress/listr-verbose-renderer": "0.4.1",
@@ -836,29 +836,29 @@
"@cypress/xvfb": "1.2.4",
"@types/sinonjs__fake-timers": "6.0.1",
"@types/sizzle": "2.3.2",
"arch": "2.1.1",
"arch": "2.1.2",
"bluebird": "3.7.2",
"cachedir": "2.3.0",
"chalk": "2.4.2",
"check-more-types": "2.24.0",
"cli-table3": "0.5.1",
"commander": "4.1.0",
"commander": "4.1.1",
"common-tags": "1.8.0",
"debug": "4.1.1",
"eventemitter2": "4.1.2",
"eventemitter2": "6.4.2",
"execa": "1.0.0",
"executable": "4.1.1",
"extract-zip": "1.7.0",
"fs-extra": "8.1.0",
"getos": "3.1.4",
"getos": "3.2.1",
"is-ci": "2.0.0",
"is-installed-globally": "0.1.0",
"is-installed-globally": "0.3.2",
"lazy-ass": "1.6.0",
"listr": "0.14.3",
"lodash": "4.17.15",
"log-symbols": "3.0.0",
"minimist": "1.2.5",
"moment": "2.24.0",
"moment": "2.26.0",
"ospath": "1.2.2",
"pretty-bytes": "5.3.0",
"ramda": "0.26.1",
@@ -1059,9 +1059,9 @@
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
},
"eventemitter2": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-4.1.2.tgz",
"integrity": "sha1-DhqEd6+CGm7zmVsxG/dMI6UkfxU=",
"version": "6.4.2",
"resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.2.tgz",
"integrity": "sha512-r/Pwupa5RIzxIHbEKCkNXqpEQIIT4uQDxmP4G/Lug/NokVUWj0joz/WzWl3OxRpC5kDrH/WdiUJoR+IrwvXJEw==",
"dev": true
},
"execa": {
@@ -1136,9 +1136,9 @@
"dev": true
},
"fast-deep-equal": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
"integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==",
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
"fast-glob": {
@@ -1268,12 +1268,12 @@
}
},
"getos": {
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/getos/-/getos-3.1.4.tgz",
"integrity": "sha512-UORPzguEB/7UG5hqiZai8f0vQ7hzynMQyJLxStoQ8dPGAcmgsfXOPA4iE/fGtweHYkK+z4zc9V0g+CIFRf5HYw==",
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz",
"integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==",
"dev": true,
"requires": {
"async": "^3.1.0"
"async": "^3.2.0"
}
},
"getpass": {
@@ -1308,12 +1308,12 @@
}
},
"global-dirs": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
"integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz",
"integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==",
"dev": true,
"requires": {
"ini": "^1.3.4"
"ini": "^1.3.5"
}
},
"globby": {
@@ -1546,13 +1546,13 @@
}
},
"is-installed-globally": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
"integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz",
"integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==",
"dev": true,
"requires": {
"global-dirs": "^0.1.0",
"is-path-inside": "^1.0.0"
"global-dirs": "^2.0.1",
"is-path-inside": "^3.0.1"
}
},
"is-number": {
@@ -1575,13 +1575,10 @@
}
},
"is-path-inside": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
"integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
"dev": true,
"requires": {
"path-is-inside": "^1.0.1"
}
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz",
"integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==",
"dev": true
},
"is-promise": {
"version": "2.2.2",
@@ -1976,9 +1973,9 @@
}
},
"moment": {
"version": "2.24.0",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
"integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==",
"version": "2.26.0",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.26.0.tgz",
"integrity": "sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw==",
"dev": true
},
"ms": {
@@ -2158,12 +2155,6 @@
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"dev": true
},
"path-is-inside": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
"integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
"dev": true
},
"path-key": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
@@ -2929,9 +2920,9 @@
"integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q=="
},
"rxjs": {
"version": "6.5.5",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
"integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==",
"version": "6.6.0",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.0.tgz",
"integrity": "sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg==",
"dev": true,
"requires": {
"tslib": "^1.9.0"
@@ -3286,19 +3277,9 @@
}
},
"uglify-js": {
"version": "3.9.2",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.2.tgz",
"integrity": "sha512-zGVwKslUAD/EeqOrD1nQaBmXIHl1Vw371we8cvS8I6mYK9rmgX5tv8AAeJdfsQ3Kk5mGax2SVV/AizxdNGhl7Q==",
"requires": {
"commander": "~2.20.3"
},
"dependencies": {
"commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
}
}
"version": "3.10.0",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.0.tgz",
"integrity": "sha512-Esj5HG5WAyrLIdYU74Z3JdG2PxdIusvj6IWHMtlyESxc7kcDz7zYlYjpnSokn1UbpV0d/QX9fan7gkCNd/9BQA=="
},
"uniq": {
"version": "1.0.1",

View File

@@ -1,16 +1,16 @@
{
"name": "gaps",
"version": "0.4.3",
"version": "0.4.4",
"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": {
"cssnano": "^4.1.10",
"postcss-cli": "^7.1.1",
"uglify-es": "^3.3.9",
"uglify-js": "^3.9.2"
"uglify-js": "^3.10.0"
},
"devDependencies": {
"cypress": "^4.7.0"
"cypress": "^4.10.0"
},
"scripts": {
"e2e": "cypress open",

View File

@@ -16,7 +16,7 @@
</parent>
<groupId>com.jasonhhouse</groupId>
<artifactId>Gaps</artifactId>
<version>0.4.3</version>
<version>0.4.4</version>
<name>Gaps</name>
<description>Demo project for Spring Boot</description>