diff --git a/Core/src/main/java/com/jasonhhouse/gaps/Schedule.java b/Core/src/main/java/com/jasonhhouse/gaps/Schedule.java index da73724..d711d42 100644 --- a/Core/src/main/java/com/jasonhhouse/gaps/Schedule.java +++ b/Core/src/main/java/com/jasonhhouse/gaps/Schedule.java @@ -18,7 +18,7 @@ import org.jetbrains.annotations.NotNull; @JsonFormat(shape = JsonFormat.Shape.OBJECT) public enum Schedule { - HOURLY("Hourly", "0 57 * * * *", 0), + HOURLY("Hourly", "0 48 * * * *", 0), DAILY_4AM("Daily", "0 0 4 * * ?", 1), EVERY_MONDAY("Weekly", "0 0 4 ? * MON *", 2), EVERY_TWO_WEEKS("Bi-weekly", "0 0 4 1,15 * ? *", 3), diff --git a/GapsWeb/src/main/java/com/jasonhhouse/gaps/controller/ConfigurationController.java b/GapsWeb/src/main/java/com/jasonhhouse/gaps/controller/ConfigurationController.java index f89afda..e99d174 100755 --- a/GapsWeb/src/main/java/com/jasonhhouse/gaps/controller/ConfigurationController.java +++ b/GapsWeb/src/main/java/com/jasonhhouse/gaps/controller/ConfigurationController.java @@ -9,6 +9,7 @@ */ package com.jasonhhouse.gaps.controller; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.jasonhhouse.gaps.GapsService; @@ -17,6 +18,7 @@ import com.jasonhhouse.gaps.PlexSearch; import com.jasonhhouse.gaps.PlexServer; import com.jasonhhouse.gaps.service.IoService; import com.jasonhhouse.gaps.service.PlexQueryImpl; +import com.jasonhhouse.gaps.service.SchedulerService; import com.jasonhhouse.gaps.service.TmdbService; import java.io.IOException; import java.util.List; @@ -56,13 +58,15 @@ public class ConfigurationController { private final PlexQueryImpl plexQuery; private final GapsService gapsService; private final IoService ioService; + private final SchedulerService schedulerService; - public ConfigurationController(TmdbService tmdbService, SimpMessagingTemplate template, PlexQueryImpl plexQuery, GapsService gapsService, IoService ioService) { + public ConfigurationController(TmdbService tmdbService, SimpMessagingTemplate template, PlexQueryImpl plexQuery, GapsService gapsService, IoService ioService, SchedulerService schedulerService) { this.tmdbService = tmdbService; this.template = template; this.plexQuery = plexQuery; this.gapsService = gapsService; this.ioService = ioService; + this.schedulerService = schedulerService; } @GetMapping(produces = MediaType.TEXT_HTML_VALUE) @@ -81,6 +85,11 @@ public class ConfigurationController { ModelAndView modelAndView = new ModelAndView("configuration"); modelAndView.addObject("plexSearch", gapsService.getPlexSearch()); + try { + modelAndView.addObject("schedules", schedulerService.getAllSchedules()); + } catch (JsonProcessingException e) { + LOGGER.error("Could not parse schedules into JSON", e); + } return modelAndView; } diff --git a/GapsWeb/src/main/java/com/jasonhhouse/gaps/controller/SchedulerController.java b/GapsWeb/src/main/java/com/jasonhhouse/gaps/controller/SchedulerController.java index 4dce0f0..b494590 100644 --- a/GapsWeb/src/main/java/com/jasonhhouse/gaps/controller/SchedulerController.java +++ b/GapsWeb/src/main/java/com/jasonhhouse/gaps/controller/SchedulerController.java @@ -11,8 +11,10 @@ package com.jasonhhouse.gaps.controller; import com.jasonhhouse.gaps.Payload; +import com.jasonhhouse.gaps.Schedule; import com.jasonhhouse.gaps.service.SchedulerService; import java.io.IOException; +import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -68,7 +70,7 @@ public class SchedulerController { @GetMapping(value = "/all", produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity getAllSchedules() { + public ResponseEntity getAllSchedules() { LOGGER.info("getAllSchedules()"); try { return ResponseEntity.ok().body(schedulerService.getAllSchedules()); diff --git a/GapsWeb/src/main/java/com/jasonhhouse/gaps/service/SchedulerService.java b/GapsWeb/src/main/java/com/jasonhhouse/gaps/service/SchedulerService.java index c2d27ad..8caacb9 100644 --- a/GapsWeb/src/main/java/com/jasonhhouse/gaps/service/SchedulerService.java +++ b/GapsWeb/src/main/java/com/jasonhhouse/gaps/service/SchedulerService.java @@ -65,10 +65,9 @@ public class SchedulerService { return ioService.readProperties().getSchedule(); } - public String getAllSchedules() throws JsonProcessingException { + public List getAllSchedules() throws JsonProcessingException { LOGGER.info("getAllSchedules()"); - List schedules = Schedule.getAllSchedules(); - return objectMapper.writeValueAsString(schedules); + return Schedule.getAllSchedules(); } public String getJsonSchedule() throws IOException { diff --git a/GapsWeb/src/main/resources/static/js/configuration.js b/GapsWeb/src/main/resources/static/js/configuration.js index 1646cd6..3d6c034 100755 --- a/GapsWeb/src/main/resources/static/js/configuration.js +++ b/GapsWeb/src/main/resources/static/js/configuration.js @@ -13,6 +13,7 @@ import {Payload} from '/js/modules/payload.min.js'; let plexSpinner, plexSaveSuccess, plexSaveError, plexTestSuccess, plexTestError, plexDeleteSuccess, plexDeleteError, plexDuplicateError; let tmdbSpinner, tmdbSaveSuccess, tmdbSaveError, tmdbTestSuccess, tmdbTestError; +let scheduleSpinner, scheduleSaveSuccess, scheduleSaveError; let deleteAllError, deleteAllSuccess; window.addEventListener('load', function () { @@ -45,6 +46,9 @@ document.addEventListener('DOMContentLoaded', function () { tmdbTestSuccess = $('#tmdbTestSuccess'); tmdbTestError = $('#tmdbTestError'); plexDuplicateError = $('#plexDuplicateError'); + scheduleSpinner = $('#scheduleSpinner'); + scheduleSaveSuccess = $('#scheduleSaveSuccess'); + scheduleSaveError = $('#scheduleSaveError'); deleteAllError = $('#deleteAllError'); deleteAllSuccess = $('#deleteAllSuccess'); @@ -88,6 +92,7 @@ document.addEventListener('DOMContentLoaded', function () { window.addPlexServer = addPlexServer; window.testExistingPlexServer = testExistingPlexServer; window.removePlexServer = removePlexServer; + window.saveSchedule = saveSchedule; window.setDeleteAllEnabledOrDisabled = setDeleteAllEnabledOrDisabled; window.nuke = nuke; }); @@ -249,6 +254,29 @@ function removePlexServer(machineIdentifier) { }); } +function saveSchedule() { + hideAllAlertsAndSpinners(); + + const id = $('#setSchedule').val(); + + $.ajax({ + type: "PUT", + url: `/schedule/${id}`, + success: function (result) { + hideAllAlertsAndSpinners(); + if (result && result.code === Payload.SCHEDULE_UPDATED) { + scheduleSaveSuccess.show(); + } else { + scheduleSaveError.show(); + } + }, + error: function () { + hideAllAlertsAndSpinners(); + scheduleSaveError.show(); + } + }); +} + function setDeleteAllEnabledOrDisabled() { $('#deleteAll').prop("disabled", !$('#confirmDeleteAll').is(":checked")); } diff --git a/GapsWeb/src/main/resources/static/js/configuration.min.js b/GapsWeb/src/main/resources/static/js/configuration.min.js index 9c594ec..5b357dc 100755 --- a/GapsWeb/src/main/resources/static/js/configuration.min.js +++ b/GapsWeb/src/main/resources/static/js/configuration.min.js @@ -1 +1 @@ -import{Payload}from"/js/modules/payload.min.js";let plexSpinner,plexSaveSuccess,plexSaveError,plexTestSuccess,plexTestError,plexDeleteSuccess,plexDeleteError,plexDuplicateError,tmdbSpinner,tmdbSaveSuccess,tmdbSaveError,tmdbTestSuccess,tmdbTestError,deleteAllError,deleteAllSuccess;function testTmdbKey(){if(hideAllAlertsAndSpinners(),!$("#tmdbConfiguration")[0].checkValidity())return!1;tmdbSpinner.show(),$.ajax({type:"PUT",url:`/configuration/test/tmdbKey/${$("#movieDbApiKey").val()}`,contentType:"application/json",dataType:"json",success:function(result){hideAllAlertsAndSpinners(),result&&result.code===Payload.TMDB_KEY_VALID?tmdbTestSuccess.show():tmdbTestError.show()},error:function(){hideAllAlertsAndSpinners(),tmdbTestError.show()}})}function saveTmdbKey(){if(hideAllAlertsAndSpinners(),!$("#tmdbConfiguration")[0].checkValidity())return!1;tmdbSpinner.show(),$.ajax({type:"POST",url:`/configuration/save/tmdbKey/${$("#movieDbApiKey").val()}`,contentType:"application/json; charset=utf-8",dataType:"json",success:function(result){hideAllAlertsAndSpinners(),result&&result.code===Payload.TMDB_KEY_SAVE_SUCCESSFUL?tmdbSaveSuccess.show():tmdbSaveError.show()},error:function(){hideAllAlertsAndSpinners(),tmdbSaveError.show()}})}function testPlexServer(){if(hideAllAlertsAndSpinners(),!$("#plexConfiguration")[0].checkValidity())return!1;plexSpinner.show(),$.ajax({type:"PUT",url:"/configuration/test/plex",data:{plexToken:$("#plexToken").val(),address:$("#address").val(),port:$("#port").val()},dataType:"json",success:function(result){hideAllAlertsAndSpinners(),result&&result.code===Payload.PLEX_CONNECTION_SUCCEEDED?plexTestSuccess.show():plexTestError.show()},error:function(){hideAllAlertsAndSpinners(),plexTestError.show()}})}function addPlexServer(){if(hideAllAlertsAndSpinners(),!$("#plexConfiguration")[0].checkValidity())return!1;plexSpinner.show(),$.ajax({type:"POST",url:"/configuration/add/plex",data:{plexToken:$("#plexToken").val(),address:$("#address").val(),port:$("#port").val()},error:function(){hideAllAlertsAndSpinners(),plexSaveError.show()}})}function testExistingPlexServer(machineIdentifier){hideAllAlertsAndSpinners(),plexSpinner.show(),$.ajax({type:"PUT",url:`/configuration/test/plex/${machineIdentifier}`,dataType:"json",success:function(result){hideAllAlertsAndSpinners(),result&&result.success?plexTestSuccess.show():plexTestError.show()},error:function(){hideAllAlertsAndSpinners(),plexTestError.show()}})}function removePlexServer(machineIdentifier){hideAllAlertsAndSpinners(),plexSpinner.show(),$.ajax({type:"DELETE",url:`/configuration/delete/plex/${machineIdentifier}`,success:function(result){hideAllAlertsAndSpinners(),result&&result.success?($("#"+machineIdentifier).remove(),plexDeleteSuccess.show()):plexDeleteError.show()},error:function(){hideAllAlertsAndSpinners(),plexDeleteError.show()}})}function setDeleteAllEnabledOrDisabled(){$("#deleteAll").prop("disabled",!$("#confirmDeleteAll").is(":checked"))}function nuke(){$.ajax({type:"PUT",url:"/nuke",success:function(result){hideAllAlertsAndSpinners(),result&&result.code===Payload.NUKE_SUCCESSFUL?(deleteAllSuccess.show(),$("#movieDbApiKey").val(""),$("#plexServers").html("")):deleteAllError.show()},error:function(){hideAllAlertsAndSpinners(),deleteAllError.show()}})}function hideAllAlertsAndSpinners(){plexSpinner.hide(),tmdbSpinner.hide(),plexTestSuccess.hide(),plexTestError.hide(),plexSaveSuccess.hide(),plexSaveError.hide(),plexDeleteSuccess.hide(),plexDeleteError.hide(),tmdbTestSuccess.hide(),tmdbTestError.hide(),tmdbSaveSuccess.hide(),tmdbSaveError.hide(),deleteAllSuccess.hide(),deleteAllError.hide()}window.addEventListener("load",function(){const forms=document.getElementsByClassName("needs-validation");Array.prototype.filter.call(forms,function(form){form.addEventListener("click",function(event){!1===form.checkValidity()&&(event.preventDefault(),event.stopPropagation()),form.classList.add("was-validated")},!1)})},!1),document.addEventListener("DOMContentLoaded",function(){plexSpinner=$("#plexSpinner"),plexSaveSuccess=$("#plexSaveSuccess"),plexSaveError=$("#plexSaveError"),plexTestSuccess=$("#plexTestSuccess"),plexTestError=$("#plexTestError"),plexDeleteSuccess=$("#plexDeleteSuccess"),plexDeleteError=$("#plexDeleteError"),tmdbSpinner=$("#tmdbSpinner"),tmdbSaveSuccess=$("#tmdbSaveSuccess"),tmdbSaveError=$("#tmdbSaveError"),tmdbTestSuccess=$("#tmdbTestSuccess"),tmdbTestError=$("#tmdbTestError"),plexDuplicateError=$("#plexDuplicateError"),deleteAllError=$("#deleteAllError"),deleteAllSuccess=$("#deleteAllSuccess");const socket=new SockJS("/gs-guide-websocket"),stompClient=Stomp.over(socket);stompClient.connect({},function(frame){console.log("Connected: "+frame),stompClient.subscribe("/configuration/plex/complete",function(message){const payload=JSON.parse(message.body);if(hideAllAlertsAndSpinners(),payload&&payload.code===Payload.PLEX_LIBRARIES_FOUND){plexSaveSuccess.show(),$("#plexToken").val(""),$("#address").val(""),$("#port").val("32400");const plexServerCard=$("#plexServerCard").html(),theCompiledHtml=Handlebars.compile(plexServerCard)(payload.extras);$("#plexServers").append(theCompiledHtml)}else plexSaveError.show()}),stompClient.subscribe("/configuration/plex/duplicate",function(){hideAllAlertsAndSpinners(),plexDuplicateError.show()})}),window.testTmdbKey=testTmdbKey,window.saveTmdbKey=saveTmdbKey,window.testPlexServer=testPlexServer,window.addPlexServer=addPlexServer,window.testExistingPlexServer=testExistingPlexServer,window.removePlexServer=removePlexServer,window.setDeleteAllEnabledOrDisabled=setDeleteAllEnabledOrDisabled,window.nuke=nuke}),$(function(){$("[data-hide]").on("click",function(){$(this).closest("."+$(this).attr("data-hide")).hide()})}); \ No newline at end of file +import{Payload}from"/js/modules/payload.min.js";let plexSpinner,plexSaveSuccess,plexSaveError,plexTestSuccess,plexTestError,plexDeleteSuccess,plexDeleteError,plexDuplicateError,tmdbSpinner,tmdbSaveSuccess,tmdbSaveError,tmdbTestSuccess,tmdbTestError,scheduleSpinner,scheduleSaveSuccess,scheduleSaveError,deleteAllError,deleteAllSuccess;function testTmdbKey(){if(hideAllAlertsAndSpinners(),!$("#tmdbConfiguration")[0].checkValidity())return!1;tmdbSpinner.show(),$.ajax({type:"PUT",url:`/configuration/test/tmdbKey/${$("#movieDbApiKey").val()}`,contentType:"application/json",dataType:"json",success:function(result){hideAllAlertsAndSpinners(),result&&result.code===Payload.TMDB_KEY_VALID?tmdbTestSuccess.show():tmdbTestError.show()},error:function(){hideAllAlertsAndSpinners(),tmdbTestError.show()}})}function saveTmdbKey(){if(hideAllAlertsAndSpinners(),!$("#tmdbConfiguration")[0].checkValidity())return!1;tmdbSpinner.show(),$.ajax({type:"POST",url:`/configuration/save/tmdbKey/${$("#movieDbApiKey").val()}`,contentType:"application/json; charset=utf-8",dataType:"json",success:function(result){hideAllAlertsAndSpinners(),result&&result.code===Payload.TMDB_KEY_SAVE_SUCCESSFUL?tmdbSaveSuccess.show():tmdbSaveError.show()},error:function(){hideAllAlertsAndSpinners(),tmdbSaveError.show()}})}function testPlexServer(){if(hideAllAlertsAndSpinners(),!$("#plexConfiguration")[0].checkValidity())return!1;plexSpinner.show(),$.ajax({type:"PUT",url:"/configuration/test/plex",data:{plexToken:$("#plexToken").val(),address:$("#address").val(),port:$("#port").val()},dataType:"json",success:function(result){hideAllAlertsAndSpinners(),result&&result.code===Payload.PLEX_CONNECTION_SUCCEEDED?plexTestSuccess.show():plexTestError.show()},error:function(){hideAllAlertsAndSpinners(),plexTestError.show()}})}function addPlexServer(){if(hideAllAlertsAndSpinners(),!$("#plexConfiguration")[0].checkValidity())return!1;plexSpinner.show(),$.ajax({type:"POST",url:"/configuration/add/plex",data:{plexToken:$("#plexToken").val(),address:$("#address").val(),port:$("#port").val()},error:function(){hideAllAlertsAndSpinners(),plexSaveError.show()}})}function testExistingPlexServer(machineIdentifier){hideAllAlertsAndSpinners(),plexSpinner.show(),$.ajax({type:"PUT",url:`/configuration/test/plex/${machineIdentifier}`,dataType:"json",success:function(result){hideAllAlertsAndSpinners(),result&&result.success?plexTestSuccess.show():plexTestError.show()},error:function(){hideAllAlertsAndSpinners(),plexTestError.show()}})}function removePlexServer(machineIdentifier){hideAllAlertsAndSpinners(),plexSpinner.show(),$.ajax({type:"DELETE",url:`/configuration/delete/plex/${machineIdentifier}`,success:function(result){hideAllAlertsAndSpinners(),result&&result.success?($("#"+machineIdentifier).remove(),plexDeleteSuccess.show()):plexDeleteError.show()},error:function(){hideAllAlertsAndSpinners(),plexDeleteError.show()}})}function saveSchedule(){hideAllAlertsAndSpinners();const id=$("#setSchedule").val();$.ajax({type:"PUT",url:`/schedule/${id}`,success:function(result){hideAllAlertsAndSpinners(),result&&result.code===Payload.SCHEDULE_UPDATED?scheduleSaveSuccess.show():scheduleSaveError.show()},error:function(){hideAllAlertsAndSpinners(),scheduleSaveError.show()}})}function setDeleteAllEnabledOrDisabled(){$("#deleteAll").prop("disabled",!$("#confirmDeleteAll").is(":checked"))}function nuke(){$.ajax({type:"PUT",url:"/nuke",success:function(result){hideAllAlertsAndSpinners(),result&&result.code===Payload.NUKE_SUCCESSFUL?(deleteAllSuccess.show(),$("#movieDbApiKey").val(""),$("#plexServers").html("")):deleteAllError.show()},error:function(){hideAllAlertsAndSpinners(),deleteAllError.show()}})}function hideAllAlertsAndSpinners(){plexSpinner.hide(),tmdbSpinner.hide(),plexTestSuccess.hide(),plexTestError.hide(),plexSaveSuccess.hide(),plexSaveError.hide(),plexDeleteSuccess.hide(),plexDeleteError.hide(),tmdbTestSuccess.hide(),tmdbTestError.hide(),tmdbSaveSuccess.hide(),tmdbSaveError.hide(),deleteAllSuccess.hide(),deleteAllError.hide()}window.addEventListener("load",function(){const forms=document.getElementsByClassName("needs-validation");Array.prototype.filter.call(forms,function(form){form.addEventListener("click",function(event){!1===form.checkValidity()&&(event.preventDefault(),event.stopPropagation()),form.classList.add("was-validated")},!1)})},!1),document.addEventListener("DOMContentLoaded",function(){plexSpinner=$("#plexSpinner"),plexSaveSuccess=$("#plexSaveSuccess"),plexSaveError=$("#plexSaveError"),plexTestSuccess=$("#plexTestSuccess"),plexTestError=$("#plexTestError"),plexDeleteSuccess=$("#plexDeleteSuccess"),plexDeleteError=$("#plexDeleteError"),tmdbSpinner=$("#tmdbSpinner"),tmdbSaveSuccess=$("#tmdbSaveSuccess"),tmdbSaveError=$("#tmdbSaveError"),tmdbTestSuccess=$("#tmdbTestSuccess"),tmdbTestError=$("#tmdbTestError"),plexDuplicateError=$("#plexDuplicateError"),scheduleSpinner=$("#scheduleSpinner"),scheduleSaveSuccess=$("#scheduleSaveSuccess"),scheduleSaveError=$("#scheduleSaveError"),deleteAllError=$("#deleteAllError"),deleteAllSuccess=$("#deleteAllSuccess");const socket=new SockJS("/gs-guide-websocket"),stompClient=Stomp.over(socket);stompClient.connect({},function(frame){console.log("Connected: "+frame),stompClient.subscribe("/configuration/plex/complete",function(message){const payload=JSON.parse(message.body);if(hideAllAlertsAndSpinners(),payload&&payload.code===Payload.PLEX_LIBRARIES_FOUND){plexSaveSuccess.show(),$("#plexToken").val(""),$("#address").val(""),$("#port").val("32400");const plexServerCard=$("#plexServerCard").html(),theCompiledHtml=Handlebars.compile(plexServerCard)(payload.extras);$("#plexServers").append(theCompiledHtml)}else plexSaveError.show()}),stompClient.subscribe("/configuration/plex/duplicate",function(){hideAllAlertsAndSpinners(),plexDuplicateError.show()})}),window.testTmdbKey=testTmdbKey,window.saveTmdbKey=saveTmdbKey,window.testPlexServer=testPlexServer,window.addPlexServer=addPlexServer,window.testExistingPlexServer=testExistingPlexServer,window.removePlexServer=removePlexServer,window.saveSchedule=saveSchedule,window.setDeleteAllEnabledOrDisabled=setDeleteAllEnabledOrDisabled,window.nuke=nuke}),$(function(){$("[data-hide]").on("click",function(){$(this).closest("."+$(this).attr("data-hide")).hide()})}); \ No newline at end of file diff --git a/GapsWeb/src/main/resources/static/js/modules/payload.js b/GapsWeb/src/main/resources/static/js/modules/payload.js index a3d24f7..18bf078 100755 --- a/GapsWeb/src/main/resources/static/js/modules/payload.js +++ b/GapsWeb/src/main/resources/static/js/modules/payload.js @@ -29,5 +29,9 @@ export const Payload = Object.freeze({ 'PLEX_LIBRARY_MOVIE_FOUND': 40, 'PLEX_LIBRARY_MOVIE_NOT_FOUND': 41, 'RECOMMENDED_MOVIES_FOUND': 50, - 'RECOMMENDED_MOVIES_NOT_FOUND': 51 + 'RECOMMENDED_MOVIES_NOT_FOUND': 51, + 'SCHEDULE_FOUND': 60, + 'SCHEDULE_NOT_FOUND': 61, + 'SCHEDULE_UPDATED': 62, + 'SCHEDULE_NOT_UPDATED': 63 }); \ No newline at end of file diff --git a/GapsWeb/src/main/resources/static/js/modules/payload.min.js b/GapsWeb/src/main/resources/static/js/modules/payload.min.js index 3552444..871ccd7 100755 --- a/GapsWeb/src/main/resources/static/js/modules/payload.min.js +++ b/GapsWeb/src/main/resources/static/js/modules/payload.min.js @@ -1 +1 @@ -export const Payload=Object.freeze({UNKNOWN_ERROR:-1,SEARCH_SUCCESSFUL:0,SEARCH_CANCELLED:1,SEARCH_FAILED:2,OWNED_MOVIES_CANNOT_BE_EMPTY:3,PLEX_CONNECTION_SUCCEEDED:10,PLEX_CONNECTION_FAILED:11,PARSING_PLEX_FAILED:12,PLEX_URL_ERROR:13,PLEX_LIBRARIES_FOUND:13,DUPLICATE_PLEX_LIBRARY:14,TMDB_KEY_VALID:20,TMDB_KEY_INVALID:21,TMDB_CONNECTION_ERROR:22,TMDB_KEY_SAVE_SUCCESSFUL:23,TMDB_KEY_SAVE_UNSUCCESSFUL:24,NUKE_SUCCESSFUL:30,NUKE_UNSUCCESSFUL:31,PLEX_LIBRARY_MOVIE_FOUND:40,PLEX_LIBRARY_MOVIE_NOT_FOUND:41,RECOMMENDED_MOVIES_FOUND:50,RECOMMENDED_MOVIES_NOT_FOUND:51}); \ No newline at end of file +export const Payload=Object.freeze({UNKNOWN_ERROR:-1,SEARCH_SUCCESSFUL:0,SEARCH_CANCELLED:1,SEARCH_FAILED:2,OWNED_MOVIES_CANNOT_BE_EMPTY:3,PLEX_CONNECTION_SUCCEEDED:10,PLEX_CONNECTION_FAILED:11,PARSING_PLEX_FAILED:12,PLEX_URL_ERROR:13,PLEX_LIBRARIES_FOUND:13,DUPLICATE_PLEX_LIBRARY:14,TMDB_KEY_VALID:20,TMDB_KEY_INVALID:21,TMDB_CONNECTION_ERROR:22,TMDB_KEY_SAVE_SUCCESSFUL:23,TMDB_KEY_SAVE_UNSUCCESSFUL:24,NUKE_SUCCESSFUL:30,NUKE_UNSUCCESSFUL:31,PLEX_LIBRARY_MOVIE_FOUND:40,PLEX_LIBRARY_MOVIE_NOT_FOUND:41,RECOMMENDED_MOVIES_FOUND:50,RECOMMENDED_MOVIES_NOT_FOUND:51,SCHEDULE_FOUND:60,SCHEDULE_NOT_FOUND:61,SCHEDULE_UPDATED:62,SCHEDULE_NOT_UPDATED:63}); \ No newline at end of file diff --git a/GapsWeb/src/main/resources/templates/configuration.html b/GapsWeb/src/main/resources/templates/configuration.html index 95955e7..2d22a5b 100755 --- a/GapsWeb/src/main/resources/templates/configuration.html +++ b/GapsWeb/src/main/resources/templates/configuration.html @@ -83,6 +83,9 @@ + @@ -267,6 +270,42 @@ +
+

Gaps can be set to automatically run. This is through a cron job that will search for new Plex Libraries + on each configured server, then search for all movies in each library, and produce a missing movie + list.

+ +
+
+ + +
+ + Save +
+ +
+ Loading... +
+ +
+ +

Error!

+

Could not save your schedule. Check the logs and try again.

+
+ +
+ +

Success!

+

Your schedule saved successfully.

+
+ +

folders

@@ -297,7 +336,8 @@ Please enter a valid time. - Default read timeout (in milliseconds). + Default read timeout (in + milliseconds).
@@ -309,7 +349,8 @@ Please enter a valid time.
- Default write timeout (in milliseconds). + Default write timeout (in + milliseconds).
- +