mirror of
https://github.com/JasonHHouse/gaps.git
synced 2026-01-26 05:09:14 -06:00
Updating cards and 0.4.4
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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/
|
||||
|
||||
|
||||
@@ -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/
|
||||
|
||||
|
||||
@@ -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/
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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');
|
||||
|
||||
@@ -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});
|
||||
@@ -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');
|
||||
|
||||
@@ -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()};
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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">✔ {{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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
@@ -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>
|
||||
|
||||
|
||||
2
build.sh
2
build.sh
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
121
package-lock.json
generated
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user