mirror of
https://github.com/JasonHHouse/gaps.git
synced 2026-05-07 00:59:44 -05:00
Merge pull request #225 from JasonHHouse/issue/base_url#193
Issue/base url#193
This commit is contained in:
@@ -15,7 +15,7 @@
|
||||
<package-json value="$PROJECT_DIR$/package.json" />
|
||||
<command value="run" />
|
||||
<scripts>
|
||||
<script value="eslint-cypress" />
|
||||
<script value="minify-input-css" />
|
||||
</scripts>
|
||||
<node-interpreter value="project" />
|
||||
<envs />
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>Gaps</artifactId>
|
||||
<groupId>com.jasonhhouse</groupId>
|
||||
<version>0.8.12</version>
|
||||
<version>0.9.0</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
||||
+3
-1
@@ -22,6 +22,8 @@ ENV ENABLE_SSL false
|
||||
|
||||
ENV ENABLE_LOGIN false
|
||||
|
||||
ENV BASE_URL ""
|
||||
|
||||
RUN mkdir -p /usr/data && chmod 777 /usr/data
|
||||
|
||||
COPY movieIds.json /usr/data
|
||||
@@ -30,7 +32,7 @@ RUN mkdir -p /usr/app && chmod 777 /usr/data
|
||||
|
||||
WORKDIR /usr/app
|
||||
|
||||
COPY GapsWeb/target/GapsWeb-0.8.12.jar /usr/app/gaps.jar
|
||||
COPY GapsWeb/target/GapsWeb-0.9.0.jar /usr/app/gaps.jar
|
||||
|
||||
COPY start.sh /usr/app/
|
||||
|
||||
|
||||
+4
-2
@@ -26,6 +26,8 @@ ENV ENABLE_SSL false
|
||||
|
||||
ENV ENABLE_LOGIN false
|
||||
|
||||
ENV BASE_URL ""
|
||||
|
||||
RUN mkdir -p /usr/data && chmod 777 /usr/data
|
||||
|
||||
COPY movieIds.json /usr/data
|
||||
@@ -34,8 +36,8 @@ RUN mkdir -p /usr/app && chmod 777 /usr/data
|
||||
|
||||
WORKDIR /usr/app
|
||||
|
||||
COPY GapsWeb/target/GapsWeb-0.8.12.jar /usr/app/gaps.jar
|
||||
COPY GapsWeb/target/GapsWeb-0.9.0.jar /usr/app/gaps.jar
|
||||
|
||||
COPY start.sh /usr/app/
|
||||
|
||||
CMD ./start.sh
|
||||
CMD ./start.sh
|
||||
@@ -14,6 +14,8 @@ FROM adoptopenjdk/openjdk11-openj9:jre-11.0.11_9_openj9-0.26.0
|
||||
ENV gapsVersion=*
|
||||
ENV springProfile=no-ssl-no-login
|
||||
ENV javaInitialHeapSize=150M
|
||||
ENV baseUrl ""
|
||||
#ENV baseUrl="/gaps"
|
||||
|
||||
EXPOSE 32400
|
||||
|
||||
@@ -36,5 +38,6 @@ ENTRYPOINT java \
|
||||
-XX:+UseStringCache \
|
||||
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 \
|
||||
-jar \
|
||||
-Dserver.servlet.context-path=${baseUrl} \
|
||||
-Dspring.profiles.active=${springProfile} \
|
||||
./GapsWeb-${gapsVersion}.jar
|
||||
|
||||
+4
-2
@@ -22,6 +22,8 @@ ENV ENABLE_SSL false
|
||||
|
||||
ENV ENABLE_LOGIN false
|
||||
|
||||
ENV BASE_URL ""
|
||||
|
||||
RUN mkdir -p /usr/data && chmod 777 /usr/data
|
||||
|
||||
COPY movieIds.json /usr/data
|
||||
@@ -30,8 +32,8 @@ RUN mkdir -p /usr/app && chmod 777 /usr/data
|
||||
|
||||
WORKDIR /usr/app
|
||||
|
||||
COPY GapsWeb/target/GapsWeb-0.8.12.jar /usr/app/gaps.jar
|
||||
COPY GapsWeb/target/GapsWeb-0.9.0.jar /usr/app/gaps.jar
|
||||
|
||||
COPY start.sh /usr/app/
|
||||
|
||||
CMD ./start.sh
|
||||
CMD ./start.sh
|
||||
+4
-2
@@ -22,6 +22,8 @@ ENV ENABLE_SSL false
|
||||
|
||||
ENV ENABLE_LOGIN false
|
||||
|
||||
ENV BASE_URL ""
|
||||
|
||||
RUN mkdir -p /usr/data && chmod 777 /usr/data
|
||||
|
||||
COPY movieIds.json /usr/data
|
||||
@@ -30,8 +32,8 @@ RUN mkdir -p /usr/app && chmod 777 /usr/data
|
||||
|
||||
WORKDIR /usr/app
|
||||
|
||||
COPY GapsWeb/target/GapsWeb-0.8.12.jar /usr/app/gaps.jar
|
||||
COPY GapsWeb/target/GapsWeb-0.9.0.jar /usr/app/gaps.jar
|
||||
|
||||
COPY start.sh /usr/app/
|
||||
|
||||
CMD ./start.sh
|
||||
CMD ./start.sh
|
||||
+3
-1
@@ -26,6 +26,8 @@ ENV ENABLE_SSL false
|
||||
|
||||
ENV ENABLE_LOGIN false
|
||||
|
||||
ENV BASE_URL ""
|
||||
|
||||
RUN mkdir -p /usr/data && chmod 777 /usr/data
|
||||
|
||||
COPY movieIds.json /usr/data
|
||||
@@ -34,7 +36,7 @@ RUN mkdir -p /usr/app && chmod 777 /usr/data
|
||||
|
||||
WORKDIR /usr/app
|
||||
|
||||
COPY GapsWeb/target/GapsWeb-0.8.12.jar /usr/app/gaps.jar
|
||||
COPY GapsWeb/target/GapsWeb-0.9.0.jar /usr/app/gaps.jar
|
||||
|
||||
COPY start.sh /usr/app/
|
||||
|
||||
|
||||
+1
-1
@@ -48,4 +48,4 @@ RMDIR /r $INSTDIR
|
||||
SectionEnd
|
||||
|
||||
# name the installer
|
||||
OutFile "gaps-0.8.12-installer.exe"
|
||||
OutFile "gaps-0.9.0-installer.exe"
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>Gaps</artifactId>
|
||||
<groupId>com.jasonhhouse</groupId>
|
||||
<version>0.8.12</version>
|
||||
<version>0.9.0</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
||||
@@ -72,6 +72,7 @@ public class ConfigurationController {
|
||||
ModelAndView modelAndView = new ModelAndView("configuration");
|
||||
modelAndView.addObject("plexProperties", plexProperties);
|
||||
modelAndView.addObject("schedules", schedulerService.getAllSchedules());
|
||||
modelAndView.addObject("configurationPage", true);
|
||||
return modelAndView;
|
||||
}
|
||||
|
||||
|
||||
@@ -88,7 +88,10 @@ public class GapsController {
|
||||
produces = MediaType.TEXT_HTML_VALUE)
|
||||
public ModelAndView getAbout() {
|
||||
LOGGER.info("getAbout()");
|
||||
return new ModelAndView("about");
|
||||
|
||||
ModelAndView modelAndView = new ModelAndView("about");
|
||||
modelAndView.addObject("aboutPage", true);
|
||||
return modelAndView;
|
||||
}
|
||||
|
||||
@GetMapping(value = "/login",
|
||||
@@ -102,7 +105,9 @@ public class GapsController {
|
||||
produces = MediaType.TEXT_HTML_VALUE)
|
||||
public ModelAndView getUpdates() {
|
||||
LOGGER.info("getUpdates()");
|
||||
return new ModelAndView("updates");
|
||||
ModelAndView modelAndView = new ModelAndView("updates");
|
||||
modelAndView.addObject("updatesPage", true);
|
||||
return modelAndView;
|
||||
}
|
||||
|
||||
@GetMapping(value = "/sounds",
|
||||
|
||||
@@ -77,6 +77,7 @@ public class LibraryController {
|
||||
modelAndView.addObject("plexServer", plexServer);
|
||||
modelAndView.addObject("plexLibrary", plexLibrary);
|
||||
modelAndView.addObject("plexServersFound", plexServersFound);
|
||||
modelAndView.addObject("librariesPage", true);
|
||||
return modelAndView;
|
||||
}
|
||||
|
||||
|
||||
@@ -52,7 +52,10 @@ public class MislabeledController {
|
||||
public ModelAndView getMislabeled() {
|
||||
LOGGER.info("getMislabeled()");
|
||||
|
||||
return new ModelAndView("mislabeled");
|
||||
|
||||
ModelAndView modelAndView = new ModelAndView("mislabeled");
|
||||
modelAndView.addObject("mislabeledPage", true);
|
||||
return modelAndView;
|
||||
}
|
||||
|
||||
@GetMapping(value = "/{machineIdentifier}/{key}")
|
||||
|
||||
@@ -71,6 +71,7 @@ public class RSSController {
|
||||
Map<PlexLibrary, PlexServer> map = rssService.foundAnyRssFeeds();
|
||||
modelAndView.addObject("plexServers", plexProperties.getPlexServers());
|
||||
modelAndView.addObject("plexServerMap", map);
|
||||
modelAndView.addObject("rssCheckPage", true);
|
||||
modelAndView.addObject("foundPlexLibraries", MapUtils.isNotEmpty(map));
|
||||
return modelAndView;
|
||||
}
|
||||
|
||||
@@ -77,6 +77,7 @@ public class RecommendedController {
|
||||
modelAndView.addObject("plexProperties", plexProperties);
|
||||
modelAndView.addObject("plexServer", plexServer);
|
||||
modelAndView.addObject("plexLibrary", plexLibrary);
|
||||
modelAndView.addObject("recommendedPage", true);
|
||||
return modelAndView;
|
||||
}
|
||||
|
||||
|
||||
@@ -33,6 +33,8 @@ spring:
|
||||
username: admin
|
||||
password: admin
|
||||
server:
|
||||
servlet:
|
||||
context-path: /
|
||||
http2:
|
||||
enabled: true
|
||||
port: 8484
|
||||
@@ -43,11 +45,12 @@ server:
|
||||
error:
|
||||
whitelabel:
|
||||
enabled: false
|
||||
path: /error
|
||||
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.8.12
|
||||
version: 0.9.0
|
||||
storageFolder: /usr/data
|
||||
properties:
|
||||
rssFeed: rssFeed.json
|
||||
|
||||
@@ -71,88 +71,12 @@
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.list-ul-default {
|
||||
.default {
|
||||
background-color: #fafafa; /* defines the background color of the image */
|
||||
mask: url(/images/list-ul.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/list-ul.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.list-ul-active {
|
||||
.activePage {
|
||||
background-color: #00bc8c; /* defines the background color of the image */
|
||||
mask: url(/images/list-ul.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/list-ul.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.collection-fill-active {
|
||||
background-color: #00bc8c; /* defines the background color of the image */
|
||||
mask: url(/images/collection-fill.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/collection-fill.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.collection-fill-default {
|
||||
background-color: #fafafa; /* defines the background color of the image */
|
||||
mask: url(/images/collection-fill.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/collection-fill.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.exclamation-triangle-default {
|
||||
background-color: #fafafa; /* defines the background color of the image */
|
||||
mask: url(/images/exclamation-triangle.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/exclamation-triangle.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.exclamation-triangle-active {
|
||||
background-color: #00bc8c; /* defines the background color of the image */
|
||||
mask: url(/images/exclamation-triangle.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/exclamation-triangle.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.rss-default {
|
||||
background-color: #fafafa; /* defines the background color of the image */
|
||||
mask: url(/images/rss.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/rss.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.rss-active {
|
||||
background-color: #00bc8c; /* defines the background color of the image */
|
||||
mask: url(/images/rss.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/rss.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.gear-default {
|
||||
background-color: #fafafa; /* defines the background color of the image */
|
||||
mask: url(/images/gear.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/gear.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.gear-active {
|
||||
background-color: #00bc8c; /* defines the background color of the image */
|
||||
mask: url(/images/gear.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/gear.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.arrow-clockwise-default {
|
||||
background-color: #fafafa; /* defines the background color of the image */
|
||||
mask: url(/images/arrow-clockwise.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/arrow-clockwise.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.arrow-clockwise-active {
|
||||
background-color: #00bc8c; /* defines the background color of the image */
|
||||
mask: url(/images/arrow-clockwise.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/arrow-clockwise.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.info-circle-default {
|
||||
background-color: #fafafa; /* defines the background color of the image */
|
||||
mask: url(/images/info-circle.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/info-circle.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.info-circle-active {
|
||||
background-color: #00bc8c; /* defines the background color of the image */
|
||||
mask: url(/images/info-circle.svg) no-repeat center / contain;
|
||||
-webkit-mask: url(/images/info-circle.svg) no-repeat center / contain;
|
||||
}
|
||||
|
||||
.long-text {
|
||||
|
||||
@@ -8,57 +8,54 @@
|
||||
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
export function getOwnedMoviesForTable(url, movieContainer, noMovieContainer, moviesTable) {
|
||||
$.ajax({
|
||||
type: 'GET',
|
||||
url,
|
||||
contentType: 'application/json; charset=utf-8',
|
||||
dataType: 'json',
|
||||
success(result) {
|
||||
if (result.code === 40) {
|
||||
movieContainer.show(100);
|
||||
noMovieContainer.css({ display: 'none' });
|
||||
moviesTable.rows.add(result.extras).draw();
|
||||
} else {
|
||||
movieContainer.css({ display: 'none' });
|
||||
noMovieContainer.show(100);
|
||||
}
|
||||
},
|
||||
error() {
|
||||
movieContainer.css({ display: 'none' });
|
||||
noMovieContainer.show(100);
|
||||
// Show error + error
|
||||
},
|
||||
});
|
||||
import Payload from './payload.min.js';
|
||||
|
||||
export function getContextPath(url) {
|
||||
const contextPath = document.getElementById('contextPath').value;
|
||||
if (contextPath && contextPath !== '/') {
|
||||
return contextPath + url;
|
||||
}
|
||||
return url;
|
||||
}
|
||||
|
||||
export function getRecommendedMoviesForTable(url, movieContainer, noMovieContainer, notSearchedYetContainer, moviesTable) {
|
||||
$.ajax({
|
||||
type: 'GET',
|
||||
url,
|
||||
contentType: 'application/json; charset=utf-8',
|
||||
dataType: 'json',
|
||||
success(result) {
|
||||
if (result.code === 50) {
|
||||
movieContainer.show(100);
|
||||
noMovieContainer.css({ display: 'none' });
|
||||
notSearchedYetContainer.css({ display: 'none' });
|
||||
moviesTable.rows.add(result.extras).draw();
|
||||
} else if (result.code === 41) {
|
||||
movieContainer.css({ display: 'none' });
|
||||
notSearchedYetContainer.css({ display: 'none' });
|
||||
noMovieContainer.show(100);
|
||||
} else {
|
||||
movieContainer.css({ display: 'none' });
|
||||
noMovieContainer.css({ display: 'none' });
|
||||
notSearchedYetContainer.show(100);
|
||||
}
|
||||
},
|
||||
error() {
|
||||
movieContainer.css({ display: 'none' });
|
||||
notSearchedYetContainer.css({ display: 'none' });
|
||||
noMovieContainer.show(100);
|
||||
// Show error + error
|
||||
export async function getOwnedMoviesForTable(url, movieContainer, noMovieContainer, moviesTable) {
|
||||
const response = await fetch(getContextPath(url), {
|
||||
method: 'get',
|
||||
headers: {
|
||||
'Content-Type': 'application/json; charset=utf-8',
|
||||
},
|
||||
});
|
||||
const get = await response.json();
|
||||
if (get.code && get.code === Payload.PLEX_LIBRARY_MOVIE_FOUND) {
|
||||
movieContainer.show(100);
|
||||
noMovieContainer.css({ display: 'none' });
|
||||
moviesTable.rows.add(get.extras).draw();
|
||||
} else {
|
||||
movieContainer.css({ display: 'none' });
|
||||
noMovieContainer.show(100);
|
||||
}
|
||||
}
|
||||
|
||||
export async function getRecommendedMoviesForTable(url, movieContainer, noMovieContainer, notSearchedYetContainer, moviesTable) {
|
||||
const response = await fetch(getContextPath(url), {
|
||||
method: 'get',
|
||||
headers: {
|
||||
'Content-Type': 'application/json; charset=utf-8',
|
||||
},
|
||||
});
|
||||
const get = await response.json();
|
||||
if (get.code && get.code === Payload.RECOMMENDED_MOVIES_FOUND) {
|
||||
movieContainer.show(100);
|
||||
noMovieContainer.css({ display: 'none' });
|
||||
notSearchedYetContainer.css({ display: 'none' });
|
||||
moviesTable.rows.add(get.extras).draw();
|
||||
} else if (get.code && get.code === Payload.PLEX_LIBRARY_MOVIE_NOT_FOUND) {
|
||||
movieContainer.css({ display: 'none' });
|
||||
notSearchedYetContainer.css({ display: 'none' });
|
||||
noMovieContainer.show(100);
|
||||
} else {
|
||||
movieContainer.css({ display: 'none' });
|
||||
noMovieContainer.css({ display: 'none' });
|
||||
notSearchedYetContainer.show(100);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,12 +11,13 @@
|
||||
import getNotificationTypes from './notification-types.min.js';
|
||||
import Payload from './payload.min.js';
|
||||
import hideAllAlertsAndSpinners from './alerts-manager.min.js';
|
||||
import { getContextPath } from './common.min.js';
|
||||
|
||||
export async function testDiscordNotifications() {
|
||||
hideAllAlertsAndSpinners();
|
||||
document.getElementById('discordSpinner').style.display = 'block';
|
||||
|
||||
const response = await fetch('/notifications/test/6', {
|
||||
const response = await fetch(getContextPath('/notifications/test/6'), {
|
||||
method: 'put',
|
||||
});
|
||||
const put = await response.json();
|
||||
@@ -41,7 +42,7 @@ export async function saveDiscordNotifications() {
|
||||
document.getElementById('discordPlexLibraryUpdateNotification').checked,
|
||||
document.getElementById('discordGapsMissingCollectionsNotification').checked);
|
||||
|
||||
const response = await fetch('/notifications/discord', {
|
||||
const response = await fetch(getContextPath('/notifications/discord'), {
|
||||
method: 'put',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
|
||||
@@ -12,12 +12,13 @@
|
||||
import getNotificationTypes from './notification-types.min.js';
|
||||
import Payload from './payload.min.js';
|
||||
import hideAllAlertsAndSpinners from './alerts-manager.min.js';
|
||||
import { getContextPath } from './common.min.js';
|
||||
|
||||
export async function testEmailNotifications() {
|
||||
hideAllAlertsAndSpinners();
|
||||
document.getElementById('emailSpinner').style.display = 'block';
|
||||
|
||||
const response = await fetch('/notifications/test/4', {
|
||||
const response = await fetch(getContextPath('/notifications/test/4'), {
|
||||
method: 'put',
|
||||
});
|
||||
const put = await response.json();
|
||||
@@ -51,7 +52,7 @@ export async function saveEmailNotifications() {
|
||||
document.getElementById('emailPlexLibraryUpdateNotification').checked,
|
||||
document.getElementById('emailGapsMissingCollectionsNotification').checked);
|
||||
|
||||
const response = await fetch('/notifications/email', {
|
||||
const response = await fetch(getContextPath('/notifications/email'), {
|
||||
method: 'put',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
|
||||
@@ -12,12 +12,13 @@
|
||||
import getNotificationTypes from './notification-types.min.js';
|
||||
import Payload from './payload.min.js';
|
||||
import hideAllAlertsAndSpinners from './alerts-manager.min.js';
|
||||
import { getContextPath } from './common.min.js';
|
||||
|
||||
export async function testGotifyNotifications() {
|
||||
hideAllAlertsAndSpinners();
|
||||
document.getElementById('gotifySpinner').style.display = 'block';
|
||||
|
||||
const response = await fetch('/notifications/test/3', {
|
||||
const response = await fetch(getContextPath('/notifications/test/3'), {
|
||||
method: 'put',
|
||||
});
|
||||
const put = await response.json();
|
||||
@@ -43,7 +44,7 @@ export async function saveGotifyNotifications() {
|
||||
document.getElementById('gotifyPlexLibraryUpdateNotification').checked,
|
||||
document.getElementById('gotifyGapsMissingCollectionsNotification').checked);
|
||||
|
||||
const response = await fetch('/notifications/gotify', {
|
||||
const response = await fetch(getContextPath('/notifications/gotify'), {
|
||||
method: 'put',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import { getContextPath } from './common.min.js';
|
||||
|
||||
export function openPlexLibraryConfigurationModel(title, machineIdentifier, key) {
|
||||
const obj = {
|
||||
title,
|
||||
@@ -35,7 +37,7 @@ export async function savePlexLibraryConfiguration(machineIdentifier, key) {
|
||||
defaultLibrary: document.getElementById('defaultLibrary').value,
|
||||
};
|
||||
|
||||
const response = await fetch('/configuration/update/plex/library', {
|
||||
const response = await fetch(getContextPath('/configuration/update/plex/library'), {
|
||||
method: 'put',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
|
||||
@@ -11,12 +11,13 @@
|
||||
import getNotificationTypes from './notification-types.min.js';
|
||||
import Payload from './payload.min.js';
|
||||
import hideAllAlertsAndSpinners from './alerts-manager.min.js';
|
||||
import { getContextPath } from './common.min.js';
|
||||
|
||||
export async function testPushBulletNotifications() {
|
||||
hideAllAlertsAndSpinners();
|
||||
document.getElementById('pushBulletSpinner').style.display = 'block';
|
||||
|
||||
const response = await fetch('/notifications/test/1', {
|
||||
const response = await fetch(getContextPath('/notifications/test/1'), {
|
||||
method: 'put',
|
||||
});
|
||||
const put = await response.json();
|
||||
@@ -42,7 +43,7 @@ export async function savePushBulletNotifications() {
|
||||
document.getElementById('pushBulletPlexLibraryUpdateNotification').checked,
|
||||
document.getElementById('pushBulletGapsMissingCollectionsNotification').checked);
|
||||
|
||||
const response = await fetch('/notifications/pushbullet', {
|
||||
const response = await fetch(getContextPath('/notifications/pushbullet'), {
|
||||
method: 'put',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
|
||||
@@ -13,10 +13,11 @@
|
||||
import getNotificationTypes from './notification-types.min.js';
|
||||
import Payload from './payload.min.js';
|
||||
import hideAllAlertsAndSpinners from './alerts-manager.min.js';
|
||||
import { getContextPath } from './common.min.js';
|
||||
|
||||
export async function getSoundOptions() {
|
||||
let defaultSound;
|
||||
const pushOverResponse = await fetch('/notifications/pushOver', {
|
||||
const pushOverResponse = await fetch(getContextPath('/notifications/pushOver'), {
|
||||
method: 'get',
|
||||
});
|
||||
const pushOverBody = await pushOverResponse.json();
|
||||
@@ -24,7 +25,7 @@ export async function getSoundOptions() {
|
||||
defaultSound = pushOverBody.extras.sound;
|
||||
}
|
||||
|
||||
const soundsResponse = await fetch('/sounds', {
|
||||
const soundsResponse = await fetch(getContextPath('/sounds'), {
|
||||
method: 'get',
|
||||
});
|
||||
const body = await soundsResponse.json();
|
||||
@@ -50,7 +51,7 @@ export async function testPushOverNotifications() {
|
||||
hideAllAlertsAndSpinners();
|
||||
document.getElementById('pushOverSpinner').style.display = 'block';
|
||||
|
||||
const response = await fetch('/notifications/test/5', {
|
||||
const response = await fetch(getContextPath('/notifications/test/5'), {
|
||||
method: 'put',
|
||||
});
|
||||
const put = await response.json();
|
||||
@@ -80,7 +81,7 @@ export async function savePushOverNotifications() {
|
||||
document.getElementById('pushOverPlexLibraryUpdateNotification').checked,
|
||||
document.getElementById('pushOverGapsMissingCollectionsNotification').checked);
|
||||
|
||||
const response = await fetch('/notifications/pushOver', {
|
||||
const response = await fetch(getContextPath('/notifications/pushOver'), {
|
||||
method: 'put',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
|
||||
import hideAllAlertsAndSpinners from './alerts-manager.min.js';
|
||||
import Payload from './payload.min.js';
|
||||
import { getContextPath } from './common.min.js';
|
||||
|
||||
export default async function saveSchedule() {
|
||||
hideAllAlertsAndSpinners();
|
||||
@@ -19,7 +20,7 @@ export default async function saveSchedule() {
|
||||
body.schedule = document.getElementById('setSchedule').value;
|
||||
body.enabled = document.getElementById('scheduleEnabled').value;
|
||||
|
||||
const response = await fetch('/schedule', {
|
||||
const response = await fetch(getContextPath('/schedule'), {
|
||||
method: 'put',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
|
||||
@@ -11,12 +11,13 @@
|
||||
import getNotificationTypes from './notification-types.min.js';
|
||||
import Payload from './payload.min.js';
|
||||
import hideAllAlertsAndSpinners from './alerts-manager.min.js';
|
||||
import { getContextPath } from './common.min.js';
|
||||
|
||||
export async function testSlackNotifications() {
|
||||
hideAllAlertsAndSpinners();
|
||||
document.getElementById('slackSpinner').style.display = 'block';
|
||||
|
||||
const response = await fetch('/notifications/test/2', {
|
||||
const response = await fetch(getContextPath('/notifications/test/2'), {
|
||||
method: 'put',
|
||||
});
|
||||
const put = await response.json();
|
||||
@@ -41,7 +42,7 @@ export async function saveSlackNotifications() {
|
||||
document.getElementById('slackPlexLibraryUpdateNotification').checked,
|
||||
document.getElementById('slackGapsMissingCollectionsNotification').checked);
|
||||
|
||||
const response = await fetch('/notifications/slack', {
|
||||
const response = await fetch(getContextPath('/notifications/slack'), {
|
||||
method: 'put',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
|
||||
@@ -11,12 +11,13 @@
|
||||
import getNotificationTypes from './notification-types.min.js';
|
||||
import Payload from './payload.min.js';
|
||||
import hideAllAlertsAndSpinners from './alerts-manager.min.js';
|
||||
import { getContextPath } from './common.min.js';
|
||||
|
||||
export async function testTelegramNotifications() {
|
||||
hideAllAlertsAndSpinners();
|
||||
document.getElementById('telegramSpinner').style.display = 'block';
|
||||
|
||||
const response = await fetch('/notifications/test/0', {
|
||||
const response = await fetch(getContextPath('/notifications/test/0'), {
|
||||
method: 'put',
|
||||
});
|
||||
const put = await response.json();
|
||||
@@ -42,7 +43,7 @@ export async function saveTelegramNotifications() {
|
||||
document.getElementById('telegramPlexLibraryUpdateNotification').checked,
|
||||
document.getElementById('telegramGapsMissingCollectionsNotification').checked);
|
||||
|
||||
const response = await fetch('/notifications/telegram', {
|
||||
const response = await fetch(getContextPath('/notifications/telegram'), {
|
||||
method: 'put',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
|
||||
@@ -15,13 +15,18 @@
|
||||
import hideAllAlertsAndSpinners from '../modules/alerts-manager.min.js';
|
||||
import saveSchedule from '../modules/schedule.min.js';
|
||||
import Payload from '../modules/payload.min.js';
|
||||
import { getContextPath } from '../modules/common.min.js';
|
||||
import { saveTelegramNotifications, testTelegramNotifications } from '../modules/telegram-notifications.min.js';
|
||||
import { saveSlackNotifications, testSlackNotifications } from '../modules/slack-notifications.min.js';
|
||||
import { savePushBulletNotifications, testPushBulletNotifications } from '../modules/push-bullet-notifications.min.js';
|
||||
import { saveGotifyNotifications, testGotifyNotifications } from '../modules/gotify-notifications.min.js';
|
||||
import { saveEmailNotifications, testEmailNotifications } from '../modules/email-notifications.min.js';
|
||||
import { saveDiscordNotifications, testDiscordNotifications } from '../modules/discord-notifications.min.js';
|
||||
import { getSoundOptions, savePushOverNotifications, testPushOverNotifications } from '../modules/push-over-notifications.min.js';
|
||||
import {
|
||||
getSoundOptions,
|
||||
savePushOverNotifications,
|
||||
testPushOverNotifications,
|
||||
} from '../modules/push-over-notifications.min.js';
|
||||
import { openPlexLibraryConfigurationModel, savePlexLibraryConfiguration } from '../modules/plex-configuration.min.js';
|
||||
|
||||
function testTmdbKey() {
|
||||
@@ -35,7 +40,7 @@ function testTmdbKey() {
|
||||
|
||||
$.ajax({
|
||||
type: 'PUT',
|
||||
url: `/configuration/test/tmdbKey/${$('#movieDbApiKey').val()}`,
|
||||
url: getContextPath(`/configuration/test/tmdbKey/${$('#movieDbApiKey').val()}`),
|
||||
contentType: 'application/json',
|
||||
dataType: 'json',
|
||||
success(result) {
|
||||
@@ -65,7 +70,7 @@ function saveTmdbKey() {
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: `/configuration/save/tmdbKey/${$('#movieDbApiKey').val()}`,
|
||||
url: getContextPath(`/configuration/save/tmdbKey/${$('#movieDbApiKey').val()}`),
|
||||
contentType: 'application/json; charset=utf-8',
|
||||
dataType: 'json',
|
||||
success(result) {
|
||||
@@ -95,7 +100,7 @@ function testPlexServer() {
|
||||
|
||||
$.ajax({
|
||||
type: 'PUT',
|
||||
url: '/configuration/test/plex',
|
||||
url: getContextPath('/configuration/test/plex'),
|
||||
data: {
|
||||
plexToken: $('#plexToken').val(),
|
||||
address: $('#address').val(),
|
||||
@@ -129,7 +134,8 @@ function addPlexServer() {
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: '/configuration/add/plex',
|
||||
url: getContextPath('/configuration/add/plex'),
|
||||
contentType: 'application/x-www-form-urlencoded; charset=utf-8',
|
||||
data: {
|
||||
plexToken: $('#plexToken').val(),
|
||||
address: $('#address').val(),
|
||||
@@ -149,7 +155,7 @@ function testExistingPlexServer(machineIdentifier) {
|
||||
|
||||
$.ajax({
|
||||
type: 'PUT',
|
||||
url: `/configuration/test/plex/${machineIdentifier}`,
|
||||
url: getContextPath(`/configuration/test/plex/${machineIdentifier}`),
|
||||
dataType: 'json',
|
||||
success(result) {
|
||||
hideAllAlertsAndSpinners();
|
||||
@@ -172,7 +178,7 @@ function removePlexServer(machineIdentifier) {
|
||||
|
||||
$.ajax({
|
||||
type: 'DELETE',
|
||||
url: `/configuration/delete/plex/${machineIdentifier}`,
|
||||
url: getContextPath(`/configuration/delete/plex/${machineIdentifier}`),
|
||||
success(result) {
|
||||
hideAllAlertsAndSpinners();
|
||||
if (result && result.success) {
|
||||
@@ -196,7 +202,7 @@ function setDeleteAllEnabledOrDisabled() {
|
||||
function nuke() {
|
||||
$.ajax({
|
||||
type: 'PUT',
|
||||
url: '/nuke',
|
||||
url: getContextPath('/nuke'),
|
||||
success(result) {
|
||||
hideAllAlertsAndSpinners();
|
||||
if (result && result.code === Payload.NUKE_SUCCESSFUL) {
|
||||
@@ -245,7 +251,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
},
|
||||
});
|
||||
|
||||
const socket = new SockJS('/gs-guide-websocket');
|
||||
const socket = new SockJS(getContextPath('/gs-guide-websocket'));
|
||||
const stompClient = Stomp.over(socket);
|
||||
stompClient.connect({}, () => {
|
||||
stompClient.subscribe('/configuration/plex/complete', (message) => {
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
/* global Handlebars */
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import { getOwnedMoviesForTable } from '../modules/common.min.js';
|
||||
import { getContextPath, getOwnedMoviesForTable } from '../modules/common.min.js';
|
||||
|
||||
let libraryTitle;
|
||||
let noMovieContainer;
|
||||
@@ -45,7 +45,7 @@ function searchForMovies() {
|
||||
|
||||
$.ajax({
|
||||
type: 'GET',
|
||||
url: `/plex/movies/${machineIdentifier}/${key}`,
|
||||
url: getContextPath(`/plex/movies/${machineIdentifier}/${key}`),
|
||||
contentType: 'application/json',
|
||||
success(data) {
|
||||
movieSearchingContainer.css({ display: 'none' });
|
||||
@@ -62,7 +62,7 @@ jQuery(($) => {
|
||||
movieSearchingContainer = $('#movieSearchingContainer');
|
||||
plexServers = JSON.parse($('#plexServers').val());
|
||||
const plexServer = JSON.parse($('#plexServer').val());
|
||||
const key = JSON.parse($('#libraryKey').val());
|
||||
const key = $('#libraryKey').val();
|
||||
|
||||
moviesTable = $('#movies').DataTable({
|
||||
deferRender: true,
|
||||
|
||||
@@ -8,10 +8,12 @@
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
import { getContextPath } from '../modules/common.min.js';
|
||||
|
||||
jQuery(($) => {
|
||||
$('#mislabeled').DataTable({
|
||||
ajax: {
|
||||
url: 'mislabeled/c51c432ae94e316d52570550f915ecbcd71bede8/1/.75',
|
||||
url: getContextPath('mislabeled/c51c432ae94e316d52570550f915ecbcd71bede8/1/.75'),
|
||||
dataSrc: '',
|
||||
},
|
||||
columns: [
|
||||
|
||||
@@ -12,8 +12,8 @@
|
||||
/* global Handlebars, SockJS, Stomp */
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import { getRecommendedMoviesForTable } from '../modules/common.js';
|
||||
import Payload from '../modules/payload.js';
|
||||
import { getContextPath, getRecommendedMoviesForTable } from '../modules/common.min.js';
|
||||
import Payload from '../modules/payload.min.js';
|
||||
|
||||
let libraryTitle;
|
||||
let notSearchedYetContainer;
|
||||
@@ -86,11 +86,9 @@ function searchForMovies() {
|
||||
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.");
|
||||
|
||||
// ToDo
|
||||
// Change to searching with recommended
|
||||
$.ajax({
|
||||
type: 'PUT',
|
||||
url: `/recommended/find/${plexServer.machineIdentifier}/${libraryKey}`,
|
||||
url: getContextPath(`/recommended/find/${plexServer.machineIdentifier}/${libraryKey}`),
|
||||
contentType: 'application/json',
|
||||
});
|
||||
|
||||
@@ -178,7 +176,7 @@ jQuery(($) => {
|
||||
|
||||
getRecommendedMoviesForTable(`/recommended/${plexServer.machineIdentifier}/${libraryKey}`, movieContainer, noMovieContainer, notSearchedYetContainer, moviesTable);
|
||||
|
||||
socket = new SockJS('/gs-guide-websocket');
|
||||
socket = new SockJS(getContextPath('/gs-guide-websocket'));
|
||||
stompClient = Stomp.over(socket);
|
||||
stompClient.connect({}, () => {
|
||||
stompClient.subscribe('/finishedSearching', (message) => {
|
||||
|
||||
@@ -8,77 +8,28 @@
|
||||
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
-->
|
||||
<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd">
|
||||
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
|
||||
|
||||
<head>
|
||||
<title>Gaps</title>
|
||||
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/>
|
||||
<link href="/images/gaps.ico" rel="shortcut icon"/>
|
||||
<link href="/css/libraries/bootstrap.min.css" rel="stylesheet"/>
|
||||
<link href="/css/input.min.css" rel="stylesheet">
|
||||
<link th:href="@{/images/gaps.ico}" rel="shortcut icon"/>
|
||||
<link th:href="@{/css/libraries/bootstrap.min.css}" rel="stylesheet"/>
|
||||
<link th:href="@{/css/input.min.css}" rel="stylesheet">
|
||||
|
||||
<!--Let browser know website is optimized for mobile-->
|
||||
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
||||
<a class="" href=".">
|
||||
<img loading="lazy" src="/images/final-gaps.svg" class="d-inline-block align-top" alt="" width="96" height="96">
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarColor01">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/libraries">
|
||||
<div class="icon list-ul-default"></div>
|
||||
Libraries
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/recommended">
|
||||
<div class="icon collection-fill-default"></div>
|
||||
Missing
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding" hidden>
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/mislabeled">
|
||||
<div class="icon exclamation-triangle-default"></div>
|
||||
Mislabeled
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/rssCheck">
|
||||
<div class="icon rss-default"></div>
|
||||
RSS
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/configuration">
|
||||
<div class="icon gear-default"></div>
|
||||
Settings
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/updates">
|
||||
<div class="icon arrow-clockwise-default"></div>
|
||||
Updates
|
||||
</a>
|
||||
</li>
|
||||
<li aria-current="page" class="nav-item nav-button-padding active">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/about">
|
||||
<div class="icon info-circle-active"></div>
|
||||
About
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div th:insert="fragments/header :: navBar"></div>
|
||||
|
||||
<div class="container">
|
||||
<img loading="lazy" src="/images/final-2.svg" alt="Gaps Logo" style="width:50%;height:50%;" class="center">
|
||||
<img loading="lazy" th: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.8.12</h4>
|
||||
<h4 class="top-margin text-primary">v0.9.0</h4>
|
||||
|
||||
<p class="text-muted">Gaps searches through your Plex Server. It then queries
|
||||
for known
|
||||
@@ -112,8 +63,10 @@
|
||||
|
||||
</div>
|
||||
|
||||
<script src="/js/libraries/jquery-3.4.1.min.js" type="text/javascript"></script>
|
||||
<script src="/js/libraries/bootstrap.bundle.min.js" type="text/javascript"></script>
|
||||
<script src="/js/page/index.min.js" type="text/javascript"></script>
|
||||
<div th:insert="fragments/common :: contextPath"></div>
|
||||
|
||||
<script th:src="@{/js/libraries/jquery-3.4.1.min.js}" type="text/javascript"></script>
|
||||
<script th:src="@{/js/libraries/bootstrap.bundle.min.js}" type="text/javascript"></script>
|
||||
<script th:src="@{/js/page/index.min.js}" type="text/javascript"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -13,66 +13,18 @@
|
||||
<head>
|
||||
<title>Gaps</title>
|
||||
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/>
|
||||
<link href="images/gaps.ico" rel="shortcut icon"/>
|
||||
<link href="css/libraries/bootstrap.min.css" rel="stylesheet"/>
|
||||
<link href="css/input.min.css" rel="stylesheet">
|
||||
<link th:href="@{images/gaps.ico}" rel="shortcut icon"/>
|
||||
<link th:href="@{css/libraries/bootstrap.min.css}" rel="stylesheet"/>
|
||||
<link th:href="@{css/input.min.css}" rel="stylesheet">
|
||||
|
||||
<!--Let browser know website is optimized for mobile-->
|
||||
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
||||
<a class="" href=".">
|
||||
<img loading="lazy" src="/images/final-gaps.svg" class="d-inline-block align-top" alt="" width="96" height="96">
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarColor01">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/libraries">
|
||||
<div class="icon list-ul-default"></div>
|
||||
Libraries
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/recommended">
|
||||
<div class="icon collection-fill-default"></div>
|
||||
Missing
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding" hidden>
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/mislabeled">
|
||||
<div class="icon exclamation-triangle-default"></div>
|
||||
Mislabeled
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/rssCheck">
|
||||
<div class="icon rss-default"></div>
|
||||
RSS
|
||||
</a>
|
||||
</li>
|
||||
<li aria-current="page" class="nav-item nav-button-padding active">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/configuration">
|
||||
<div class="icon gear-active"></div>
|
||||
Settings
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/updates">
|
||||
<div class="icon arrow-clockwise-default"></div>
|
||||
Updates
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/about">
|
||||
<div class="icon info-circle-default"></div>
|
||||
About
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div th:insert="fragments/header :: navBar"></div>
|
||||
|
||||
<div class="container">
|
||||
<h3 class="top-margin">Settings</h3>
|
||||
|
||||
@@ -414,6 +366,8 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div th:insert="fragments/common :: contextPath"></div>
|
||||
|
||||
<script id="plexServerCard" type="text/x-handlebars-template">
|
||||
<div id="{{machineIdentifier}}" class="col-lg-4">
|
||||
<div class="top-margin">
|
||||
@@ -438,11 +392,11 @@
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script src="/js/libraries/jquery-3.4.1.min.js" type="text/javascript"></script>
|
||||
<script src="/js/libraries/bootstrap.bundle.min.js" type="text/javascript"></script>
|
||||
<script src="/js/libraries/sockjs-1.4.0.min.js" type="text/javascript"></script>
|
||||
<script src="/js/libraries/stomp-2.3.3.min.js" type="text/javascript"></script>
|
||||
<script src="/js/libraries/handlebars-v4.7.6.min.js" type="text/javascript"></script>
|
||||
<script src="/js/page/configuration.min.js" type="module"></script>
|
||||
<script th:src="@{/js/libraries/jquery-3.4.1.min.js}" type="text/javascript"></script>
|
||||
<script th:src="@{/js/libraries/bootstrap.bundle.min.js}" type="text/javascript"></script>
|
||||
<script th:src="@{/js/libraries/sockjs-1.4.0.min.js}" type="text/javascript"></script>
|
||||
<script th:src="@{/js/libraries/stomp-2.3.3.min.js}" type="text/javascript"></script>
|
||||
<script th:src="@{/js/libraries/handlebars-v4.7.6.min.js}" type="text/javascript"></script>
|
||||
<script th:src="@{/js/page/configuration.min.js}" type="module"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -7,89 +7,39 @@
|
||||
-
|
||||
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
-->
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd">
|
||||
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
|
||||
|
||||
<head>
|
||||
<title>Gaps</title>
|
||||
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/>
|
||||
<link href="/images/gaps.ico" rel="shortcut icon"/>
|
||||
<link href="/css/libraries/bootstrap.min.css" rel="stylesheet"/>
|
||||
<link href="/css/input.min.css" rel="stylesheet">
|
||||
<link th:href="@{/images/gaps.ico}" rel="shortcut icon"/>
|
||||
<link th:href="@{/css/libraries/bootstrap.min.css}" rel="stylesheet"/>
|
||||
<link th:href="@{/css/input.min.css}" rel="stylesheet">
|
||||
|
||||
<!--Let browser know website is optimized for mobile-->
|
||||
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
||||
<a class="" href=".">
|
||||
<img loading="lazy" src="/images/final-gaps.svg" class="d-inline-block align-top" alt="" width="96" height="96">
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarColor01">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/libraries">
|
||||
<div class="icon list-ul-default"></div>
|
||||
Libraries
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/recommended">
|
||||
<div class="icon collection-fill-default"></div>
|
||||
Missing
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding" hidden>
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/mislabeled">
|
||||
<div class="icon exclamation-triangle-default"></div>
|
||||
Mislabeled
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/rssCheck">
|
||||
<div class="icon rss-default"></div>
|
||||
RSS
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/configuration">
|
||||
<div class="icon gear-default"></div>
|
||||
Settings
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/updates">
|
||||
<div class="icon arrow-clockwise-default"></div>
|
||||
Updates
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/about">
|
||||
<div class="icon info-circle-default"></div>
|
||||
About
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
<div th:insert="fragments/header :: navBar"></div>
|
||||
|
||||
<div class="container">
|
||||
<div class="top-margin">
|
||||
<div class="card mx-auto" style="width: 24rem;">
|
||||
<img loading="lazy" alt="..." class="card-img-top" src="/images/mind_the_gap.png">
|
||||
<img alt="..." class="card-img-top" src="/images/mind_the_gap.png">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Your movies are really missing</h5>
|
||||
<p class="card-text">You need to run Gaps at least once to have found the missing movies. Once you have
|
||||
you can come back here and see
|
||||
the RSS feed.</p>
|
||||
<a class="btn btn-primary" href="/">Back</a>
|
||||
<a class="btn btn-primary" th:href="@{/}">Back</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/js/libraries/jquery-3.4.1.min.js" type="text/javascript"></script>
|
||||
<script src="/js/libraries/bootstrap.bundle.min.js" type="text/javascript"></script>
|
||||
<script th:src="@{/js/libraries/jquery-3.4.1.min.js}" type="text/javascript"></script>
|
||||
<script th:src="@{/js/libraries/bootstrap.bundle.min.js}" type="text/javascript"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -7,91 +7,40 @@
|
||||
-
|
||||
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
-->
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd">
|
||||
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
|
||||
|
||||
<head>
|
||||
<title>Gaps</title>
|
||||
<meta content="#3f51b5" name="theme-color"/>
|
||||
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/>
|
||||
<link href="images/gaps.ico" rel="shortcut icon"/>
|
||||
<link href="css/libraries/bootstrap.min.css" rel="stylesheet"/>
|
||||
<link href="css/input.min.css" rel="stylesheet">
|
||||
<link th:href="@{images/gaps.ico}" rel="shortcut icon"/>
|
||||
<link th:href="@{css/libraries/bootstrap.min.css}" rel="stylesheet"/>
|
||||
<link th:href="@{css/input.min.css}" rel="stylesheet">
|
||||
|
||||
<!--Let browser know website is optimized for mobile-->
|
||||
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
||||
<a class="" href=".">
|
||||
<img alt="" class="d-inline-block align-top" height="96" loading="lazy" src="/images/final-gaps.svg" width="96">
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarColor01">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/libraries">
|
||||
<div class="icon list-ul-default"></div>
|
||||
Libraries
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/recommended">
|
||||
<div class="icon collection-fill-default"></div>
|
||||
Missing
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding" hidden>
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/mislabeled">
|
||||
<div class="icon exclamation-triangle-default"></div>
|
||||
Mislabeled
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/rssCheck">
|
||||
<div class="icon rss-default"></div>
|
||||
RSS
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/configuration">
|
||||
<div class="icon gear-default"></div>
|
||||
Settings
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/updates">
|
||||
<div class="icon arrow-clockwise-default"></div>
|
||||
Updates
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/about">
|
||||
<div class="icon info-circle-default"></div>
|
||||
About
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
<div th:insert="fragments/header :: navBar"></div>
|
||||
|
||||
<div class="container">
|
||||
<div class="top-margin">
|
||||
<div class="card mx-auto" style="width: 24rem;">
|
||||
<img loading="lazy" alt="..." class="card-img-top" src="/images/broken-bridge-2.jpg">
|
||||
<img loading="lazy" alt="..." class="card-img-top" th:src="@{/images/broken-bridge-2.jpg}">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">The gap is only getting bigger...</h5>
|
||||
<p class="card-text">Check the logs to see what went wrong. You can message /u/whitefox111 on Reddit or
|
||||
post an issue on the <a href="https://github.com/JasonHHouse/Gaps">gaps</a> GitHub if you need
|
||||
more help.</p>
|
||||
<a class="btn btn-primary" href="/">Back</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<script src="js/libraries/jquery-3.4.1.min.js" type="text/javascript"></script>
|
||||
<script src="js/libraries/bootstrap.bundle.min.js" type="text/javascript"></script>
|
||||
<script th:src="@{js/libraries/jquery-3.4.1.min.js}" type="text/javascript"></script>
|
||||
<script th:src="@{js/libraries/bootstrap.bundle.min.js}" type="text/javascript"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,22 @@
|
||||
<!--
|
||||
~
|
||||
~ Copyright 2020 Jason H House
|
||||
~ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
~
|
||||
~ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
~
|
||||
~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
-->
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" xmlns:th="http://www.thymeleaf.org">
|
||||
<head>
|
||||
<title>Common</title>
|
||||
</head>
|
||||
<body>
|
||||
<header th:fragment="contextPath">
|
||||
<input id="contextPath" type="hidden" th:value="${@environment.getProperty('server.servlet.context-path')}"/>
|
||||
</header>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,84 @@
|
||||
<!--
|
||||
~
|
||||
~ Copyright 2020 Jason H House
|
||||
~ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
~
|
||||
~ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
~
|
||||
~ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
-->
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" xmlns:th="http://www.thymeleaf.org">
|
||||
<head>
|
||||
<title>Header</title>
|
||||
</head>
|
||||
<body>
|
||||
<header th:fragment="navBar">
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
||||
<a class="" th:href="@{/}">
|
||||
<img alt="" class="d-inline-block align-top" height="96" th:src="@{/images/final-gaps.svg}" width="96">
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarColor01">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li th:attr="aria-current=${librariesPage} ? 'page' : '', class=${librariesPage} ? 'nav-item nav-button-padding active' : 'nav-item nav-button-padding'">
|
||||
<a class="nav-link center-text nav-anchor-spacing" data-cy="libraries" th:href="@{'/libraries'}">
|
||||
<div data-cy="librariesIcon"
|
||||
th:attr="class=${librariesPage} ? 'icon activePage' : 'icon default'"
|
||||
th:style="'mask: url(' + @{'/images/list-ul.svg'} + ') no-repeat center / contain; -webkit-mask: url(' + @{'/images/list-ul.svg'} + ') no-repeat center / contain;'"></div>
|
||||
Libraries
|
||||
</a>
|
||||
</li>
|
||||
<li th:attr="aria-current=${recommendedPage} ? 'page' : '', class=${recommendedPage} ? 'nav-item nav-button-padding active' : 'nav-item nav-button-padding'">
|
||||
<a class="nav-link center-text nav-anchor-spacing" data-cy="recommended"
|
||||
th:href="@{'/recommended'}">
|
||||
<div data-cy="recommendedIcon"
|
||||
th:attr="class=${recommendedPage} ? 'icon activePage' : 'icon default'"
|
||||
th:style="'mask: url(' + @{'/images/collection-fill.svg'} + ') no-repeat center / contain; -webkit-mask: url(' + @{'/images/collection-fill.svg'} + ') no-repeat center / contain;'"></div>
|
||||
Missing
|
||||
</a>
|
||||
</li>
|
||||
<!--<li th:attr="aria-current=${mislabeledPage} ? 'page' : '', class=${mislabeledPage} ? 'nav-item nav-button-padding active' : 'nav-item nav-button-padding'" hidden>
|
||||
<a data-cy="mislabeled" class="nav-link center-text nav-anchor-spacing" th:href="${gapsConfiguration.getBaseUrl()} + '/mislabeled'">
|
||||
<div th:attr="class=${mislabeledPage} ? 'icon activePage' : 'icon default'"
|
||||
th:style="'mask: url(' + @{'/images/exclamation-triangle.svg'} + ') no-repeat center / contain; -webkit-mask: url(' + @{'/images/exclamation-triangle.svg'} + ') no-repeat center / contain;'"></div>
|
||||
Mislabeled
|
||||
</a>
|
||||
</li>-->
|
||||
<li th:attr="aria-current=${rssCheckPage} ? 'page' : '', class=${rssCheckPage} ? 'nav-item nav-button-padding active' : 'nav-item nav-button-padding'">
|
||||
<a class="nav-link center-text nav-anchor-spacing" data-cy="rssCheck" th:href="@{'/rssCheck'}">
|
||||
<div data-cy="rssCheckIcon" th:attr="class=${rssCheckPage} ? 'icon activePage' : 'icon default'"
|
||||
th:style="'mask: url(' + @{'/images/rss.svg'} + ') no-repeat center / contain; -webkit-mask: url(' + @{'/images/rss.svg'} + ') no-repeat center / contain;'"></div>
|
||||
RSS
|
||||
</a>
|
||||
</li>
|
||||
<li th:attr="aria-current=${configurationPage} ? 'page' : '', class=${configurationPage} ? 'nav-item nav-button-padding active' : 'nav-item nav-button-padding'">
|
||||
<a class="nav-link center-text nav-anchor-spacing" data-cy="configuration"
|
||||
th:href="@{'/configuration'}">
|
||||
<div data-cy="configurationIcon"
|
||||
th:attr="class=${configurationPage} ? 'icon activePage' : 'icon default'"
|
||||
th:style="'mask: url(' + @{'/images/gear.svg'} + ') no-repeat center / contain; -webkit-mask: url(' + @{'/images/gear.svg'} + ') no-repeat center / contain;'"></div>
|
||||
Settings
|
||||
</a>
|
||||
</li>
|
||||
<li th:attr="aria-current=${updatesPage} ? 'page' : '', class=${updatesPage} ? 'nav-item nav-button-padding active' : 'nav-item nav-button-padding'">
|
||||
<a class="nav-link center-text nav-anchor-spacing" data-cy="updates" th:href="@{'/updates'}">
|
||||
<div data-cy="updatesIcon" th:attr="class=${updatesPage} ? 'icon activePage' : 'icon default'"
|
||||
th:style="'mask: url(' + @{'/images/arrow-clockwise.svg'} + ') no-repeat center / contain; -webkit-mask: url(' + @{'/images/arrow-clockwise.svg'} + ') no-repeat center / contain;'"></div>
|
||||
Updates
|
||||
</a>
|
||||
</li>
|
||||
<li th:attr="aria-current=${aboutPage} ? 'page' : '', class=${aboutPage} ? 'nav-item nav-button-padding active' : 'nav-item nav-button-padding'">
|
||||
<a class="nav-link center-text nav-anchor-spacing" data-cy="about" th:href="@{'/about'}">
|
||||
<div data-cy="aboutIcon" th:attr="class=${aboutPage} ? 'icon activePage' : 'icon default'"
|
||||
th:style="'mask: url(' + @{'/images/info-circle.svg'} + ') no-repeat center / contain; -webkit-mask: url(' + @{'/images/info-circle.svg'} + ') no-repeat center / contain;'"></div>
|
||||
About
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -8,76 +8,26 @@
|
||||
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
-->
|
||||
<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd">
|
||||
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
|
||||
|
||||
<head>
|
||||
<title>Gaps</title>
|
||||
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/>
|
||||
<link href="/images/gaps.ico" rel="shortcut icon"/>
|
||||
<link href="/css/libraries/bootstrap.min.css" rel="stylesheet"/>
|
||||
<link href="/css/input.min.css" rel="stylesheet">
|
||||
<link th:href="@{/images/gaps.ico}" rel="shortcut icon"/>
|
||||
<link th:href="@{/css/libraries/bootstrap.min.css}" rel="stylesheet"/>
|
||||
<link th:href="@{/css/input.min.css}" rel="stylesheet">
|
||||
|
||||
<!--Let browser know website is optimized for mobile-->
|
||||
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
||||
<a class="" href=".">
|
||||
<img loading="lazy" src="/images/final-gaps.svg" class="d-inline-block align-top" alt="" width="96" height="96">
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarColor01">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/libraries">
|
||||
<div class="icon list-ul-default"></div>
|
||||
Libraries
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/recommended">
|
||||
<div class="icon collection-fill-default"></div>
|
||||
Missing
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding" hidden>
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/mislabeled">
|
||||
<div class="icon exclamation-triangle-default"></div>
|
||||
Mislabeled
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/rssCheck">
|
||||
<div class="icon rss-default"></div>
|
||||
RSS
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/configuration">
|
||||
<div class="icon gear-default"></div>
|
||||
Settings
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/updates">
|
||||
<div class="icon arrow-clockwise-default"></div>
|
||||
Updates
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/about">
|
||||
<div class="icon info-circle-default"></div>
|
||||
About
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
<div th:insert="fragments/header :: navBar"></div>
|
||||
|
||||
<div class="container bottom-margin">
|
||||
<img loading="lazy" src="/images/final-2.svg" alt="Gaps Logo" style="width:50%;height:50%;" class="center">
|
||||
<img loading="lazy" th:src="@{/images/final-2.svg}" alt="Gaps Logo" style="width:50%;height:50%;" class="center">
|
||||
|
||||
<h3 class="top-margin">v0.8.12</h3>
|
||||
<h3 class="top-margin">v0.9.0</h3>
|
||||
|
||||
<p class="text-muted">Gaps searches through your Plex Server. It then queries
|
||||
for known
|
||||
@@ -93,14 +43,16 @@
|
||||
'Alien³ (1992)' to be added to your collection.</p>
|
||||
|
||||
<h4 class="top-margin text-primary">Getting Started</h4>
|
||||
<p class="text-muted">To get started, head to <a href="/configuration">configuration</a> and enter your TMDB ID and
|
||||
<p class="text-muted">To get started, head to <a th:href="@{/configuration}">configuration</a> and enter your TMDB ID and
|
||||
Plex Server
|
||||
information.</p>
|
||||
|
||||
</div>
|
||||
|
||||
<script src="/js/libraries/jquery-3.4.1.min.js" type="text/javascript"></script>
|
||||
<script src="/js/libraries/bootstrap.bundle.min.js" type="text/javascript"></script>
|
||||
<script src="/js/page/index.min.js" type="text/javascript"></script>
|
||||
<div th:insert="fragments/common :: contextPath"></div>
|
||||
|
||||
<script th:src="@{/js/libraries/jquery-3.4.1.min.js}" type="text/javascript"></script>
|
||||
<script th:src="@{/js/libraries/bootstrap.bundle.min.js}" type="text/javascript"></script>
|
||||
<script th:src="@{/js/page/index.min.js}" type="text/javascript"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -13,68 +13,19 @@
|
||||
<head>
|
||||
<title>Gaps</title>
|
||||
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/>
|
||||
<link href="/images/gaps.ico" rel="shortcut icon"/>
|
||||
<link href="/css/libraries/bootstrap.min.css" rel="stylesheet"/>
|
||||
<link href="/css/libraries/datatables.min.css" rel="stylesheet" type="text/css"/>
|
||||
<link href="/css/libraries/dataTables.bootstrap4.min.css" rel="stylesheet" type="text/css"/>
|
||||
<link href="/css/input.min.css" rel="stylesheet">
|
||||
<link th:href="@{/images/gaps.ico}" rel="shortcut icon"/>
|
||||
<link th:href="@{/css/libraries/bootstrap.min.css}" rel="stylesheet"/>
|
||||
<link th:href="@{/css/libraries/datatables.min.css}" rel="stylesheet" type="text/css"/>
|
||||
<link th:href="@{/css/libraries/dataTables.bootstrap4.min.css}" rel="stylesheet" type="text/css"/>
|
||||
<link th:href="@{/css/input.min.css}" rel="stylesheet">
|
||||
|
||||
<!--Let browser know website is optimized for mobile-->
|
||||
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
||||
<a class="" href=".">
|
||||
<img alt="" class="d-inline-block align-top" height="96" loading="lazy" src="/images/final-gaps.svg" width="96">
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarColor01">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li aria-current="page" class="nav-item nav-button-padding active">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/libraries">
|
||||
<div class="icon list-ul-active"></div>
|
||||
Libraries
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/recommended">
|
||||
<div class="icon collection-fill-default"></div>
|
||||
Missing
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding" hidden>
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/mislabeled">
|
||||
<div class="icon exclamation-triangle-default"></div>
|
||||
Mislabeled
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/rssCheck">
|
||||
<div class="icon rss-default"></div>
|
||||
RSS
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/configuration">
|
||||
<div class="icon gear-default"></div>
|
||||
Settings
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/updates">
|
||||
<div class="icon arrow-clockwise-default"></div>
|
||||
Updates
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/about">
|
||||
<div class="icon info-circle-default"></div>
|
||||
About
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div th:insert="fragments/header :: navBar"></div>
|
||||
|
||||
<div class="container">
|
||||
<h3 class="top-margin">Libraries</h3>
|
||||
@@ -118,7 +69,7 @@
|
||||
|
||||
<div class="top-margin bottom-margin" id="noMovieContainer" style="display: none;">
|
||||
<div class="card mx-auto" style="width: 24rem;">
|
||||
<img alt="..." class="card-img-top" loading="lazy" src="/images/mind_the_gap.png">
|
||||
<img alt="..." class="card-img-top" loading="lazy" th:src="@{/images/mind_the_gap.png}">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Your movies are really missing</h5>
|
||||
<p class="card-text">You need to run Gaps at least once to have found the missing movies.</p>
|
||||
@@ -147,7 +98,7 @@
|
||||
<div th:remove="tag" th:unless="${plexServersFound}">
|
||||
<div class="top-margin bottom-margin">
|
||||
<div class="card mx-auto" style="width: 24rem;">
|
||||
<img alt="..." class="card-img-top" loading="lazy" src="/images/mind_the_gap.png">
|
||||
<img alt="..." class="card-img-top" loading="lazy" th:src="@{/images/mind_the_gap.png}">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Your movies are really missing</h5>
|
||||
<p class="card-text">You need to configure Gaps before you can search for missing movies. Check out
|
||||
@@ -182,11 +133,12 @@
|
||||
<input id="plexServer" name="plexServer" th:value="${{plexServer}}" type="hidden"/>
|
||||
<input id="plexProperties" name="plexProperties" th:value="${{plexProperties}}" type="hidden"/>
|
||||
<input id="libraryKey" name="libraryKey" th:value="${{plexLibrary.key}}" type="hidden"/>
|
||||
<div th:insert="fragments/common :: contextPath"></div>
|
||||
|
||||
<script src="/js/libraries/jquery-3.4.1.min.js" type="text/javascript"></script>
|
||||
<script src="/js/libraries/bootstrap.bundle.min.js" type="text/javascript"></script>
|
||||
<script src="/js/libraries/datatables.min.js" type="text/javascript"></script>
|
||||
<script src="/js/libraries/handlebars-v4.7.6.min.js" type="text/javascript"></script>
|
||||
<script src="/js/page/libraries.min.js" type="module"></script>
|
||||
<script th:src="@{/js/libraries/jquery-3.4.1.min.js}" type="text/javascript"></script>
|
||||
<script th:src="@{/js/libraries/bootstrap.bundle.min.js}" type="text/javascript"></script>
|
||||
<script th:src="@{/js/libraries/datatables.min.js}" type="text/javascript"></script>
|
||||
<script th:src="@{/js/libraries/handlebars-v4.7.6.min.js}" type="text/javascript"></script>
|
||||
<script type="module" th:src="@{/js/page/libraries.min.js}"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -8,14 +8,14 @@
|
||||
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
-->
|
||||
<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd">
|
||||
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
|
||||
|
||||
<head>
|
||||
<title>Gaps</title>
|
||||
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/>
|
||||
<link href="/images/gaps.ico" rel="shortcut icon"/>
|
||||
<link href="/css/libraries/bootstrap.min.css" rel="stylesheet"/>
|
||||
<link href="/css/input.min.css" rel="stylesheet">
|
||||
<link rel="shortcut icon" th:href="@{/images/gaps.ico}"/>
|
||||
<link rel="stylesheet" th:href="@{/css/libraries/bootstrap.min.css}"/>
|
||||
<link rel="stylesheet" th:href="@{/css/input.min.css}">
|
||||
|
||||
<!--Let browser know website is optimized for mobile-->
|
||||
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
|
||||
@@ -24,11 +24,12 @@
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
||||
<a class="" href=".">
|
||||
<img loading="lazy" src="/images/final-gaps.svg" class="d-inline-block align-top" alt="" width="96" height="96">
|
||||
<img alt="" class="d-inline-block align-top" height="96" loading="lazy" th:src="@{/images/final-gaps.svg}"
|
||||
width="96">
|
||||
</a>
|
||||
</nav>
|
||||
<div class="container bottom-margin">
|
||||
<img loading="lazy" src="/images/final-2.svg" alt="Gaps Logo" style="width:50%;height:50%;" class="center">
|
||||
<img alt="Gaps Logo" class="center" loading="lazy" style="width:50%;height:50%;" th:src="@{/images/final-2.svg}">
|
||||
|
||||
<div th:if="${param.error}">
|
||||
Invalid username and password.
|
||||
@@ -36,21 +37,21 @@
|
||||
<div th:if="${param.logout}">
|
||||
You have been logged out.
|
||||
</div>
|
||||
<form th:action="@{/login}" method="post">
|
||||
<form method="post" th:action="@{/login}">
|
||||
<div class="form-group">
|
||||
<label for="username">Username</label>
|
||||
<input id="username" type="text" class="form-control" name="username"/>
|
||||
<input class="form-control" id="username" name="username" type="text"/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="password">Password</label>
|
||||
<input id="password" type="password" class="form-control" name="password"/>
|
||||
<input class="form-control" id="password" name="password" type="password"/>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary">Log In</button>
|
||||
<button class="btn btn-primary" type="submit">Log In</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script src="/js/libraries/jquery-3.4.1.min.js" type="text/javascript"></script>
|
||||
<script src="/js/libraries/bootstrap.bundle.min.js" type="text/javascript"></script>
|
||||
<script src="/js/page/index.min.js" type="text/javascript"></script>
|
||||
<script th:src="@{/js/libraries/jquery-3.4.1.min.js}" type="text/javascript"></script>
|
||||
<script th:src="@{/js/libraries/bootstrap.bundle.min.js}" type="text/javascript"></script>
|
||||
<script th:src="@{/js/page/index.min.js}" type="text/javascript"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -8,73 +8,23 @@
|
||||
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
-->
|
||||
<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd">
|
||||
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
|
||||
|
||||
<head>
|
||||
<title>Gaps</title>
|
||||
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/>
|
||||
<link href="/images/gaps.ico" rel="shortcut icon"/>
|
||||
<link href="/css/libraries/bootstrap.min.css" rel="stylesheet"/>
|
||||
<link href="/css/libraries/datatables.min.css" rel="stylesheet" type="text/css"/>
|
||||
<link href="/css/libraries/dataTables.bootstrap4.min.css" rel="stylesheet" type="text/css"/>
|
||||
<link href="/css/input.min.css" rel="stylesheet">
|
||||
<link th:href="@{/images/gaps.ico}" rel="shortcut icon"/>
|
||||
<link th:href="@{/css/libraries/bootstrap.min.css}" rel="stylesheet"/>
|
||||
<link th:href="@{/css/libraries/datatables.min.css}" rel="stylesheet" type="text/css"/>
|
||||
<link th:href="@{/css/libraries/dataTables.bootstrap4.min.css}" rel="stylesheet" type="text/css"/>
|
||||
<link th:href="@{/css/input.min.css}" rel="stylesheet">
|
||||
|
||||
<!--Let browser know website is optimized for mobile-->
|
||||
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
||||
<a class="" href=".">
|
||||
<img loading="lazy" src="/images/final-gaps.svg" class="d-inline-block align-top" alt="" width="96" height="96">
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarColor01">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/libraries">
|
||||
<div class="icon list-ul-default"></div>
|
||||
Libraries
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/recommended">
|
||||
<div class="icon collection-fill-default"></div>
|
||||
Missing
|
||||
</a>
|
||||
</li>
|
||||
<li aria-current="page" class="nav-item nav-button-padding active">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/mislabeled">
|
||||
<div class="icon exclamation-triangle-active"></div>
|
||||
Mislabeled
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/rssCheck">
|
||||
<div class="icon rss-default"></div>
|
||||
RSS
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/configuration">
|
||||
<div class="icon gear-default"></div>
|
||||
Settings
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/updates">
|
||||
<div class="icon arrow-clockwise-default"></div>
|
||||
Updates
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/about">
|
||||
<div class="icon info-circle-default"></div>
|
||||
About
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
<div th:insert="fragments/header :: navBar"></div>
|
||||
|
||||
<div class="container bottom-margin">
|
||||
<h3 class="top-margin">Mislabeled</h3>
|
||||
@@ -91,9 +41,11 @@
|
||||
|
||||
</div>
|
||||
|
||||
<script src="/js/libraries/jquery-3.4.1.min.js" type="text/javascript"></script>
|
||||
<script src="/js/libraries/bootstrap.bundle.min.js" type="text/javascript"></script>
|
||||
<script src="/js/libraries/datatables.min.js" type="text/javascript"></script>
|
||||
<script src="/js/page/mislabeled.min.js" type="text/javascript"></script>
|
||||
<div th:insert="fragments/common :: contextPath"></div>
|
||||
|
||||
<script th:src="@{/js/libraries/jquery-3.4.1.min.js}" type="text/javascript"></script>
|
||||
<script th:src="@{/js/libraries/bootstrap.bundle.min.js}" type="text/javascript"></script>
|
||||
<script th:src="@{/js/libraries/datatables.min.js}" type="text/javascript"></script>
|
||||
<script th:src="@{/js/page/mislabeled.min.js}" type="text/javascript"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -13,68 +13,19 @@
|
||||
<head>
|
||||
<title>Gaps</title>
|
||||
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/>
|
||||
<link href="/images/gaps.ico" rel="shortcut icon"/>
|
||||
<link href="/css/libraries/bootstrap.min.css" rel="stylesheet"/>
|
||||
<link href="/css/libraries/datatables.min.css" rel="stylesheet" type="text/css"/>
|
||||
<link href="/css/libraries/dataTables.bootstrap4.min.css" rel="stylesheet" type="text/css"/>
|
||||
<link href="/css/input.min.css" rel="stylesheet">
|
||||
<link th:href="@{/images/gaps.ico}" rel="shortcut icon"/>
|
||||
<link th:href="@{/css/libraries/bootstrap.min.css}" rel="stylesheet"/>
|
||||
<link th:href="@{/css/libraries/datatables.min.css}" rel="stylesheet" type="text/css"/>
|
||||
<link th:href="@{/css/libraries/dataTables.bootstrap4.min.css}" rel="stylesheet" type="text/css"/>
|
||||
<link th:href="@{/css/input.min.css}" rel="stylesheet">
|
||||
|
||||
<!--Let browser know website is optimized for mobile-->
|
||||
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
||||
<a class="" href=".">
|
||||
<img alt="" class="d-inline-block align-top" height="96" loading="lazy" src="/images/final-gaps.svg" width="96">
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarColor01">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/libraries">
|
||||
<div class="icon list-ul-default"></div>
|
||||
Libraries
|
||||
</a>
|
||||
</li>
|
||||
<li aria-current="page" class="nav-item nav-button-padding active">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/recommended">
|
||||
<div class="icon collection-fill-active"></div>
|
||||
Missing
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding" hidden>
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/mislabeled">
|
||||
<div class="icon exclamation-triangle-default"></div>
|
||||
Mislabeled
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/rssCheck">
|
||||
<div class="icon rss-default"></div>
|
||||
RSS
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/configuration">
|
||||
<div class="icon gear-default"></div>
|
||||
Settings
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/updates">
|
||||
<div class="icon arrow-clockwise-default"></div>
|
||||
Updates
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/about">
|
||||
<div class="icon info-circle-default"></div>
|
||||
About
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
<div th:insert="fragments/header :: navBar"></div>
|
||||
|
||||
<div class="container">
|
||||
<h3 class="top-margin">Missing Movies</h3>
|
||||
|
||||
@@ -106,7 +57,7 @@
|
||||
|
||||
<div class="top-margin bottom-margin" id="notSearchedYetContainer" style="display: none;">
|
||||
<div class="card mx-auto" style="width: 24rem;">
|
||||
<img alt="..." class="card-img-top" loading="lazy" src="/images/mind_the_gap.png">
|
||||
<img loading="lazy" alt="..." class="card-img-top" th:src="@{/images/mind_the_gap.png}">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Your movies are really missing</h5>
|
||||
<p class="card-text">You need to run Gaps at least once to have found the missing movies.</p>
|
||||
@@ -118,7 +69,7 @@
|
||||
|
||||
<div class="top-margin bottom-margin" id="noMovieContainer" style="display: none;">
|
||||
<div class="card mx-auto" style="width: 24rem;">
|
||||
<img alt="..." class="card-img-top" loading="lazy" src="/images/mind_the_gap.png">
|
||||
<img loading="lazy" alt="..." class="card-img-top" th:src="@{/images/mind_the_gap.png}">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Your movies are really missing</h5>
|
||||
<p class="card-text">You need to find your owned movies first.</p>
|
||||
@@ -219,13 +170,14 @@
|
||||
<input id="plexServer" name="plexServer" th:value="${{plexServer}}" type="hidden"/>
|
||||
<input id="plexProperties" name="plexProperties" th:value="${{plexProperties}}" type="hidden"/>
|
||||
<input id="libraryKey" name="libraryKey" th:value="${{plexLibrary.key}}" type="hidden"/>
|
||||
<div th:insert="fragments/common :: contextPath"></div>
|
||||
|
||||
<script src="/js/libraries/jquery-3.4.1.min.js" type="text/javascript"></script>
|
||||
<script src="/js/libraries/bootstrap.bundle.min.js" type="text/javascript"></script>
|
||||
<script src="/js/libraries/datatables.min.js" type="text/javascript"></script>
|
||||
<script src="/js/libraries/sockjs-1.4.0.min.js" type="text/javascript"></script>
|
||||
<script src="/js/libraries/stomp-2.3.3.min.js" type="text/javascript"></script>
|
||||
<script src="/js/libraries/handlebars-v4.7.6.min.js" type="text/javascript"></script>
|
||||
<script src="/js/page/recommended.min.js" type="module"></script>
|
||||
<script th:src="@{/js/libraries/jquery-3.4.1.min.js}" type="text/javascript"></script>
|
||||
<script th:src="@{/js/libraries/bootstrap.bundle.min.js}" type="text/javascript"></script>
|
||||
<script th:src="@{/js/libraries/datatables.min.js}" type="text/javascript"></script>
|
||||
<script th:src="@{/js/libraries/sockjs-1.4.0.min.js}" type="text/javascript"></script>
|
||||
<script th:src="@{/js/libraries/stomp-2.3.3.min.js}" type="text/javascript"></script>
|
||||
<script th:src="@{/js/libraries/handlebars-v4.7.6.min.js}" type="text/javascript"></script>
|
||||
<script type="module" th:src="@{/js/page/recommended.min.js}"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -13,68 +13,18 @@
|
||||
<head>
|
||||
<title>Gaps</title>
|
||||
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/>
|
||||
<link href="/images/gaps.ico" rel="shortcut icon"/>
|
||||
<link href="/css/libraries/bootstrap.min.css" rel="stylesheet"/>
|
||||
<link href="/css/libraries/datatables.min.css" rel="stylesheet" type="text/css"/>
|
||||
<link href="/css/libraries/dataTables.bootstrap4.min.css" rel="stylesheet" type="text/css"/>
|
||||
<link href="/css/input.min.css" rel="stylesheet">
|
||||
<link th:href="@{/images/gaps.ico}" rel="shortcut icon"/>
|
||||
<link th:href="@{/css/libraries/bootstrap.min.css}" rel="stylesheet"/>
|
||||
<link th:href="@{/css/libraries/datatables.min.css}" rel="stylesheet" type="text/css"/>
|
||||
<link th:href="@{/css/libraries/dataTables.bootstrap4.min.css}" rel="stylesheet" type="text/css"/>
|
||||
<link th:href="@{/css/input.min.css}" rel="stylesheet">
|
||||
|
||||
<!--Let browser know website is optimized for mobile-->
|
||||
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
||||
<a class="" href=".">
|
||||
<img loading="lazy" src="/images/final-gaps.svg" class="d-inline-block align-top" alt="" width="96" height="96">
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarColor01">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/libraries">
|
||||
<div class="icon list-ul-default"></div>
|
||||
Libraries
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/recommended">
|
||||
<div class="icon collection-fill-default"></div>
|
||||
Missing
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding" hidden>
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/mislabeled">
|
||||
<div class="icon exclamation-triangle-default"></div>
|
||||
Mislabeled
|
||||
</a>
|
||||
</li>
|
||||
<li aria-current="page" class="nav-item nav-button-padding active">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/rssCheck">
|
||||
<div class="icon rss-active"></div>
|
||||
RSS
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/configuration">
|
||||
<div class="icon gear-default"></div>
|
||||
Settings
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/updates">
|
||||
<div class="icon arrow-clockwise-default"></div>
|
||||
Updates
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/about">
|
||||
<div class="icon info-circle-default"></div>
|
||||
About
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
<div th:insert="fragments/header :: navBar"></div>
|
||||
|
||||
<div class="container">
|
||||
<h3 class="top-margin">RSS</h3>
|
||||
@@ -82,11 +32,11 @@
|
||||
<div th:if="${!foundPlexLibraries}" th:remove="tag">
|
||||
<div class="top-margin bottom-margin">
|
||||
<div class="card mx-auto" style="width: 24rem;">
|
||||
<img loading="lazy" alt="..." class="card-img-top" src="/images/mind_the_gap.png">
|
||||
<img loading="lazy" alt="..." class="card-img-top" th:src="@{/images/mind_the_gap.png}">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Your movies are really missing</h5>
|
||||
<p class="card-text">You need to run Gaps at least once to have found the missing movies.</p>
|
||||
<a class="btn btn-primary" href="/recommended">Search</a>
|
||||
<a class="btn btn-primary" th:href="@{/recommended}">Search</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -97,7 +47,7 @@
|
||||
|
||||
<form action="/rss" class="top-margin" method="get">
|
||||
<div th:each="instance : ${plexServerMap}" class="form-check">
|
||||
<a th:href="'/rss/' + ${instance.value.getMachineIdentifier() + '/' + instance.key.getKey()}"
|
||||
<a th:href="(@{'/rss/'} + ${instance.value.getMachineIdentifier()} + '/' + ${instance.key.getKey()})"
|
||||
th:text="${instance.value.getFriendlyName() + ' - ' + instance.key.getTitle()}">
|
||||
</a>
|
||||
</div>
|
||||
@@ -106,7 +56,7 @@
|
||||
|
||||
</div>
|
||||
|
||||
<script src="/js/libraries/jquery-3.4.1.min.js" type="text/javascript"></script>
|
||||
<script src="/js/libraries/bootstrap.bundle.min.js" type="text/javascript"></script>
|
||||
<script th:src="@{/js/libraries/jquery-3.4.1.min.js}" type="text/javascript"></script>
|
||||
<script th:src="@{/js/libraries/bootstrap.bundle.min.js}" type="text/javascript"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -8,76 +8,32 @@
|
||||
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
-->
|
||||
<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd">
|
||||
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
|
||||
|
||||
<head>
|
||||
<title>Gaps</title>
|
||||
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/>
|
||||
<link href="/images/gaps.ico" rel="shortcut icon"/>
|
||||
<link href="/css/libraries/bootstrap.min.css" rel="stylesheet"/>
|
||||
<link href="/css/input.min.css" rel="stylesheet">
|
||||
<link th:href="@{/images/gaps.ico}" rel="shortcut icon"/>
|
||||
<link th:href="@{/css/libraries/bootstrap.min.css}" rel="stylesheet"/>
|
||||
<link th:href="@{/css/input.min.css}" rel="stylesheet">
|
||||
|
||||
<!--Let browser know website is optimized for mobile-->
|
||||
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
|
||||
<a class="" href=".">
|
||||
<img loading="lazy" src="/images/final-gaps.svg" class="d-inline-block align-top" alt="" width="96" height="96">
|
||||
</a>
|
||||
<div class="collapse navbar-collapse" id="navbarColor01">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/libraries">
|
||||
<div class="icon list-ul-default"></div>
|
||||
Libraries
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/recommended">
|
||||
<div class="icon collection-fill-default"></div>
|
||||
Missing
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding" hidden>
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/mislabeled">
|
||||
<div class="icon exclamation-triangle-default"></div>
|
||||
Mislabeled
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/rssCheck">
|
||||
<div class="icon rss-default"></div>
|
||||
RSS
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/configuration">
|
||||
<div class="icon gear-default"></div>
|
||||
Settings
|
||||
</a>
|
||||
</li>
|
||||
<li aria-current="page" class="nav-item nav-button-padding active">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/updates">
|
||||
<div class="icon arrow-clockwise-active"></div>
|
||||
Updates
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item nav-button-padding">
|
||||
<a class="nav-link center-text nav-anchor-spacing" href="/about">
|
||||
<div class="icon info-circle-default"></div>
|
||||
About
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
<div th:insert="fragments/header :: navBar"></div>
|
||||
|
||||
<div class="container">
|
||||
<img loading="lazy" src="/images/final-2.svg" alt="Gaps Logo" style="width:50%;height:50%;" class="center">
|
||||
<img loading="lazy" th: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.9.0</h4>
|
||||
<ul class="text-muted">
|
||||
<li>Updated Cypress to 7.2.0</li>
|
||||
<li>Added option to set base URL path.</li>
|
||||
</ul>
|
||||
|
||||
<h4 class="top-margin text-primary">v0.8.12</h4>
|
||||
<ul class="text-muted">
|
||||
<li>Updated SpringBoot to 2.4.5</li>
|
||||
@@ -376,7 +332,7 @@
|
||||
|
||||
</div>
|
||||
|
||||
<script src="/js/libraries/jquery-3.4.1.min.js" type="text/javascript"></script>
|
||||
<script src="/js/libraries/bootstrap.bundle.min.js" type="text/javascript"></script>
|
||||
<script th:src="@{/js/libraries/jquery-3.4.1.min.js}" type="text/javascript"></script>
|
||||
<script th:src="@{/js/libraries/bootstrap.bundle.min.js}" type="text/javascript"></script>
|
||||
</body>
|
||||
</html>
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>Gaps</artifactId>
|
||||
<groupId>com.jasonhhouse</groupId>
|
||||
<version>0.8.12</version>
|
||||
<version>0.9.0</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
||||
@@ -79,6 +79,8 @@ Open your browser and navigate to, http://{IP_ADDRESS}:8484
|
||||
|
||||
If everything worked, you will be greeted by the gaps home page.
|
||||
|
||||
_Note: If you would like to set a base URL, use the variable `BASE_URL` and set the value you would like when running in Docker. Gaps on UNRAID has a BASE_URL variable in the template. If using a base URL, navigate to http://{IP_ADDRESS}:8484/BASE_URL
|
||||
|
||||

|
||||
|
||||
## 🎈 Usage <a name="usage"></a>
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>Gaps</artifactId>
|
||||
<groupId>com.jasonhhouse</groupId>
|
||||
<version>0.8.12</version>
|
||||
<version>0.9.0</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ 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.8.12
|
||||
version: 0.9.0
|
||||
storageFolder: /{CUSTOM_FOLDER} #Change to folder that gaps has permission to read, write, and delete in.
|
||||
properties:
|
||||
rssFeed: rssFeed.json
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
##
|
||||
|
||||
set -e
|
||||
VERSION=0.8.12
|
||||
VERSION=0.9.0
|
||||
JAR_VERSION="GapsWeb/target/GapsWeb-$VERSION.jar"
|
||||
ZIP_VERSION="GapsAsJar-$VERSION.zip"
|
||||
npm ci
|
||||
|
||||
@@ -7,7 +7,7 @@ call npm run uglifyjs-pages
|
||||
call mvn clean install
|
||||
del GapsOnWindows\*.jar
|
||||
del GapsOnWindows\README.md
|
||||
copy GapsWeb\target\GapsWeb-0.8.12.jar GapsOnWindows\gaps.jar
|
||||
copy GapsWeb\target\GapsWeb-0.9.0.jar GapsOnWindows\gaps.jar
|
||||
copy README.md GapsOnWindows\
|
||||
cd GapsOnWindows
|
||||
makensis gaps.nsi
|
||||
+2
-2
@@ -3,6 +3,6 @@
|
||||
"baseUrl": "http://localhost:8484",
|
||||
"videoUploadOnPasses": false,
|
||||
"videoCompression": false,
|
||||
"viewportHeight": 600,
|
||||
"viewportWidth": 800
|
||||
"viewportHeight": 900,
|
||||
"viewportWidth": 1600
|
||||
}
|
||||
|
||||
@@ -11,17 +11,17 @@
|
||||
/* global cy, it, describe */
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import { spyOnAddEventListener } from '../common.spec.js';
|
||||
import { BASE_URL, spyOnAddEventListener } from '../common.spec.js';
|
||||
|
||||
describe('Verify About Page', () => {
|
||||
it('Default page', () => {
|
||||
cy.visit('/about', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/about`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
cy.get('h3.top-margin')
|
||||
.should('have.text', 'About');
|
||||
|
||||
cy.get('.container > :nth-child(3)')
|
||||
.should('have.text', 'v0.8.12');
|
||||
.should('have.text', 'v0.9.0');
|
||||
|
||||
cy.get('.container > :nth-child(6)')
|
||||
.should('have.text', 'Software');
|
||||
|
||||
@@ -11,6 +11,9 @@
|
||||
/* global cy, expect */
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
// export const BASE_URL = '';
|
||||
export const BASE_URL = '/gaps';
|
||||
|
||||
export const CYPRESS_VALUES = {
|
||||
notBeChecked: 'not.be.checked',
|
||||
beChecked: 'be.checked',
|
||||
@@ -32,7 +35,7 @@ export function spyOnAddEventListener(win) {
|
||||
}
|
||||
|
||||
export function nuke() {
|
||||
cy.request('PUT', '/nuke')
|
||||
cy.request('PUT', `${BASE_URL}/nuke`)
|
||||
.then((response) => {
|
||||
expect(response.body).to.have.property('code', 30);
|
||||
expect(response.body).to.have.property('reason', 'Nuke successful. All files deleted.');
|
||||
@@ -45,7 +48,7 @@ export function nuke() {
|
||||
export function redLibraryBefore() {
|
||||
nuke();
|
||||
|
||||
cy.visit('/configuration', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/configuration`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
cy.populateTmdb('723b4c763114904392ca441909aa0375');
|
||||
|
||||
@@ -102,7 +105,7 @@ export function redLibraryBefore() {
|
||||
}
|
||||
|
||||
export function jokerLibraryBefore() {
|
||||
cy.visit('/configuration', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/configuration`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
cy.populateTmdb('723b4c763114904392ca441909aa0375');
|
||||
|
||||
|
||||
@@ -11,36 +11,36 @@
|
||||
/* global cy, it, describe */
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import { nuke, spyOnAddEventListener } from '../common.spec.js';
|
||||
import { BASE_URL, nuke, spyOnAddEventListener } from '../common.spec.js';
|
||||
|
||||
describe('Configuration Tests', () => {
|
||||
it('Clean configuration page load', () => {
|
||||
nuke();
|
||||
|
||||
cy.visit('/configuration', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/configuration`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
cy.get('.active > .nav-link')
|
||||
.should('have.attr', 'href', '/configuration')
|
||||
cy.get('[data-cy=configuration]')
|
||||
.should('have.attr', 'href', `${BASE_URL}/configuration`)
|
||||
.parent()
|
||||
.should('have.attr', 'aria-current', 'page');
|
||||
|
||||
cy.get('.navbar-nav > :nth-child(1) > .nav-link')
|
||||
.should('have.attr', 'href', '/libraries')
|
||||
cy.get('[data-cy=libraries]')
|
||||
.should('have.attr', 'href', `${BASE_URL}/libraries`)
|
||||
.parent()
|
||||
.should('not.have.attr', 'aria-current', 'page');
|
||||
|
||||
cy.get('.navbar-nav > :nth-child(2) > .nav-link')
|
||||
.should('have.attr', 'href', '/recommended')
|
||||
cy.get('[data-cy=recommended]')
|
||||
.should('have.attr', 'href', `${BASE_URL}/recommended`)
|
||||
.parent()
|
||||
.should('not.have.attr', 'aria-current', 'page');
|
||||
|
||||
cy.get('.navbar-nav > :nth-child(4) > .nav-link')
|
||||
.should('have.attr', 'href', '/rssCheck')
|
||||
cy.get('[data-cy=rssCheck]')
|
||||
.should('have.attr', 'href', `${BASE_URL}/rssCheck`)
|
||||
.parent()
|
||||
.should('not.have.attr', 'aria-current', 'page');
|
||||
|
||||
cy.get('.navbar-nav > :nth-child(7) > .nav-link')
|
||||
.should('have.attr', 'href', '/about')
|
||||
cy.get('[data-cy=about]')
|
||||
.should('have.attr', 'href', `${BASE_URL}/about`)
|
||||
.parent()
|
||||
.should('not.have.attr', 'aria-current', 'page');
|
||||
|
||||
|
||||
@@ -12,11 +12,11 @@
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import faker from 'faker';
|
||||
import { spyOnAddEventListener } from '../common.spec.js';
|
||||
import { BASE_URL, spyOnAddEventListener } from '../common.spec.js';
|
||||
|
||||
describe('Plex Configuration Tests', () => {
|
||||
before(() => {
|
||||
cy.visit('/configuration', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/configuration`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
cy.get('#plexTab')
|
||||
.click();
|
||||
|
||||
@@ -11,11 +11,11 @@
|
||||
/* global cy, it, describe, before, expect */
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import { spyOnAddEventListener } from '../common.spec.js';
|
||||
import { BASE_URL, spyOnAddEventListener } from '../common.spec.js';
|
||||
|
||||
describe('Schedule Configuration Tests', () => {
|
||||
before(() => {
|
||||
cy.visit('/configuration', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/configuration`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
cy.get('#scheduleTab')
|
||||
.click();
|
||||
@@ -34,7 +34,7 @@ describe('Schedule Configuration Tests', () => {
|
||||
cy.get('#scheduleSaveError')
|
||||
.should('not.be.visible');
|
||||
|
||||
cy.request('/schedule')
|
||||
cy.request(`${BASE_URL}/schedule`)
|
||||
.then((resp) => {
|
||||
const result = resp.body;
|
||||
expect(result).to.have.property('message', 'Monthly');
|
||||
@@ -54,7 +54,7 @@ describe('Schedule Configuration Tests', () => {
|
||||
cy.get('#scheduleSaveError')
|
||||
.should('not.be.visible');
|
||||
|
||||
cy.request('/schedule')
|
||||
cy.request(`${BASE_URL}/schedule`)
|
||||
.then((resp) => {
|
||||
const result = resp.body;
|
||||
expect(result).to.have.property('message', 'Hourly');
|
||||
|
||||
@@ -12,11 +12,11 @@
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import faker from 'faker';
|
||||
import { spyOnAddEventListener } from '../common.spec.js';
|
||||
import { BASE_URL, spyOnAddEventListener } from '../common.spec.js';
|
||||
|
||||
describe('TMDB Configuration Tests', () => {
|
||||
before(() => {
|
||||
cy.visit('/configuration', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/configuration`, { onBeforeLoad: spyOnAddEventListener });
|
||||
});
|
||||
it('Test invalid TMDB Key', () => {
|
||||
const invalidKey = faker.random.alphaNumeric(16);
|
||||
@@ -78,7 +78,7 @@ describe('TMDB Configuration Tests', () => {
|
||||
cy.get('#tmdbSaveSuccess')
|
||||
.should('be.visible');
|
||||
|
||||
cy.visit('/configuration', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/configuration`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
cy.get('[data-cy=movieDbApiKey]')
|
||||
.should('have.value', invalidKey);
|
||||
@@ -102,7 +102,7 @@ describe('TMDB Configuration Tests', () => {
|
||||
cy.get('#tmdbSaveSuccess')
|
||||
.should('be.visible');
|
||||
|
||||
cy.visit('/configuration', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/configuration`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
cy.get('[data-cy=movieDbApiKey]')
|
||||
.should('have.value', '723b4c763114904392ca441909aa0375');
|
||||
|
||||
@@ -11,7 +11,9 @@
|
||||
/* global cy, it, describe, beforeEach, expect */
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import { nuke, redLibraryBefore, spyOnAddEventListener } from '../common.spec.js';
|
||||
import {
|
||||
BASE_URL, nuke, redLibraryBefore, spyOnAddEventListener,
|
||||
} from '../common.spec.js';
|
||||
|
||||
function checkForDuplicates(ownedMovies, recommendedMovies) {
|
||||
cy.log(`recommendedMovies.length: ${recommendedMovies.length}`);
|
||||
@@ -37,7 +39,7 @@ function checkForDuplicates(ownedMovies, recommendedMovies) {
|
||||
}
|
||||
|
||||
function searchBestMovieLibrary(cy) {
|
||||
cy.visit('/libraries', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/libraries`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
cy.get('[data-cy=dropdownMenu]')
|
||||
.click();
|
||||
@@ -51,7 +53,7 @@ function searchBestMovieLibrary(cy) {
|
||||
// Wait for timeout from clearing data
|
||||
cy.wait(5000);
|
||||
|
||||
cy.visit('/recommended', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/recommended`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
cy.get('[data-cy=dropdownMenu]')
|
||||
.click();
|
||||
@@ -64,7 +66,7 @@ function searchBestMovieLibrary(cy) {
|
||||
}
|
||||
|
||||
function searchMovieWithNewMetadataLibrary(cy) {
|
||||
cy.visit('/libraries', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/libraries`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
cy.get('[data-cy=dropdownMenu]')
|
||||
.click();
|
||||
@@ -85,11 +87,11 @@ function searchMovieWithNewMetadataLibrary(cy) {
|
||||
cy.get('#movies_info')
|
||||
.contains('Showing 1 to 1 of 1 entries');
|
||||
|
||||
cy.visit('/recommended', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/recommended`, { onBeforeLoad: spyOnAddEventListener });
|
||||
}
|
||||
|
||||
function waitUtilSearchingIsDone() {
|
||||
cy.request('/searchStatus')
|
||||
cy.request(`${BASE_URL}/searchStatus`)
|
||||
.then((resp) => {
|
||||
if (resp.status === 200 && resp.body.isSearching === false) {
|
||||
return;
|
||||
@@ -109,11 +111,11 @@ describe('Search for Duplicates', () => {
|
||||
waitUtilSearchingIsDone();
|
||||
|
||||
let ownedMovies;
|
||||
cy.request('/plex/movies/c51c432ae94e316d52570550f915ecbcd71bede8/1')
|
||||
cy.request(`${BASE_URL}/plex/movies/c51c432ae94e316d52570550f915ecbcd71bede8/1`)
|
||||
.then((resp) => {
|
||||
ownedMovies = resp.body;
|
||||
cy.log(`ownedMovies.length: ${ownedMovies.length}`);
|
||||
}).request('/recommended/c51c432ae94e316d52570550f915ecbcd71bede8/1')
|
||||
}).request(`${BASE_URL}/recommended/c51c432ae94e316d52570550f915ecbcd71bede8/1`)
|
||||
.then((resp) => {
|
||||
const recommendedMovies = resp.body.extras;
|
||||
checkForDuplicates(ownedMovies, recommendedMovies);
|
||||
@@ -126,10 +128,10 @@ describe('Search for Duplicates', () => {
|
||||
waitUtilSearchingIsDone();
|
||||
|
||||
let ownedMovies;
|
||||
cy.request('/plex/movies/c51c432ae94e316d52570550f915ecbcd71bede8/4')
|
||||
cy.request(`${BASE_URL}/plex/movies/c51c432ae94e316d52570550f915ecbcd71bede8/4`)
|
||||
.then((resp) => {
|
||||
ownedMovies = resp.body;
|
||||
}).request('/recommended/c51c432ae94e316d52570550f915ecbcd71bede8/4')
|
||||
}).request(`${BASE_URL}/recommended/c51c432ae94e316d52570550f915ecbcd71bede8/4`)
|
||||
.then((resp) => {
|
||||
const recommendedMovies = resp.body.extras;
|
||||
checkForDuplicates(ownedMovies, recommendedMovies);
|
||||
|
||||
@@ -11,9 +11,11 @@
|
||||
/* global cy, it, expect, describe */
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import { BASE_URL } from '../common.spec.js';
|
||||
|
||||
describe('Check Error Page', () => {
|
||||
it('Does error page load', () => {
|
||||
cy.request({ url: '/bad', method: 'GET', failOnStatusCode: false })
|
||||
cy.request({ url: `${BASE_URL}/bad`, method: 'GET', failOnStatusCode: false })
|
||||
.should((response) => {
|
||||
expect(response.status).to.eq(404);
|
||||
});
|
||||
|
||||
@@ -11,10 +11,12 @@
|
||||
/* global cy, it, expect, describe, before, beforeEach */
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import { nuke, redLibraryBefore, spyOnAddEventListener } from '../common.spec.js';
|
||||
import {
|
||||
BASE_URL, nuke, redLibraryBefore, spyOnAddEventListener,
|
||||
} from '../common.spec.js';
|
||||
|
||||
function searchSawLibrary(cy) {
|
||||
cy.visit('/libraries', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/libraries`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
cy.get('[data-cy=dropdownMenu]')
|
||||
.click();
|
||||
@@ -28,12 +30,12 @@ function searchSawLibrary(cy) {
|
||||
cy.get('#movies_info')
|
||||
.should('have.text', 'Showing 1 to 1 of 1 entries');
|
||||
|
||||
cy.visit('/recommended', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/recommended`, { onBeforeLoad: spyOnAddEventListener });
|
||||
}
|
||||
|
||||
describe('Library API', () => {
|
||||
it('Get bad library', () => {
|
||||
cy.request('/libraries/abc/123')
|
||||
cy.request(`${BASE_URL}/libraries/abc/123`)
|
||||
.then((resp) => {
|
||||
cy.log(resp.body);
|
||||
const result = resp.body;
|
||||
@@ -46,7 +48,7 @@ describe('Library API', () => {
|
||||
it('Get library Joker - Saw', () => {
|
||||
searchSawLibrary(cy);
|
||||
|
||||
cy.request('/libraries/c51c432ae94e316d52570550f915ecbcd71bede8/5')
|
||||
cy.request(`${BASE_URL}/libraries/c51c432ae94e316d52570550f915ecbcd71bede8/5`)
|
||||
.then((resp) => {
|
||||
cy.log(resp.body);
|
||||
const result = resp.body;
|
||||
@@ -60,7 +62,7 @@ describe('Plex Movie List API', () => {
|
||||
beforeEach(redLibraryBefore);
|
||||
|
||||
it('Get library Joker - Saw', () => {
|
||||
cy.request('/plex/movies/c51c432ae94e316d52570550f915ecbcd71bede8/5')
|
||||
cy.request(`${BASE_URL}/plex/movies/c51c432ae94e316d52570550f915ecbcd71bede8/5`)
|
||||
.then((resp) => {
|
||||
cy.log(resp.body);
|
||||
const result = resp.body;
|
||||
|
||||
@@ -11,13 +11,13 @@
|
||||
/* global cy, it, before, describe */
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import { redLibraryBefore, spyOnAddEventListener } from '../common.spec.js';
|
||||
import { BASE_URL, redLibraryBefore, spyOnAddEventListener } from '../common.spec.js';
|
||||
|
||||
describe('Not Searched Yet Library', () => {
|
||||
before(redLibraryBefore);
|
||||
|
||||
it('Clean configuration page load', () => {
|
||||
cy.visit('/libraries', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/libraries`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
cy.get('[data-cy=libraryTitle]')
|
||||
.contains('Joker');
|
||||
|
||||
@@ -11,14 +11,16 @@
|
||||
/* global cy, it, expect, before, describe */
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import { nuke, redLibraryBefore, spyOnAddEventListener } from '../common.spec.js';
|
||||
import {
|
||||
BASE_URL, nuke, redLibraryBefore, spyOnAddEventListener,
|
||||
} from '../common.spec.js';
|
||||
|
||||
describe('Find owned movies', () => {
|
||||
before(nuke);
|
||||
before(redLibraryBefore);
|
||||
|
||||
it('Find Saw Movies', () => {
|
||||
cy.visit('/libraries', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/libraries`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
cy.get('[data-cy=dropdownMenu]')
|
||||
.click();
|
||||
@@ -38,7 +40,7 @@ describe('Find owned movies', () => {
|
||||
});
|
||||
|
||||
it('Refresh Saw Movies', () => {
|
||||
cy.visit('/libraries', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/libraries`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
cy.get('[data-cy=dropdownMenu]')
|
||||
.click();
|
||||
@@ -68,7 +70,7 @@ describe('Find owned movies', () => {
|
||||
});
|
||||
|
||||
it('Research Saw Movies', () => {
|
||||
cy.visit('/libraries', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/libraries`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
cy.get('[data-cy=dropdownMenu]')
|
||||
.click();
|
||||
@@ -98,7 +100,7 @@ describe('Find owned movies', () => {
|
||||
});
|
||||
|
||||
it('Movies with Metadata Empty', () => {
|
||||
cy.visit('/libraries', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/libraries`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
cy.get('[data-cy=dropdownMenu]')
|
||||
.click();
|
||||
|
||||
@@ -11,11 +11,11 @@
|
||||
/* global cy, it, describe */
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import { spyOnAddEventListener } from '../common.spec.js';
|
||||
import { BASE_URL, spyOnAddEventListener } from '../common.spec.js';
|
||||
|
||||
describe('Verify Log In Page', () => {
|
||||
it('Default page', () => {
|
||||
cy.visit('/login', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/login`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
cy.get(':nth-child(1) > label')
|
||||
.should('have.text', 'Username');
|
||||
|
||||
@@ -11,76 +11,67 @@
|
||||
/* global cy, it, describe */
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import { spyOnAddEventListener } from '../common.spec.js';
|
||||
import { BASE_URL, spyOnAddEventListener } from '../common.spec.js';
|
||||
|
||||
function checkNavIcons(cy, isLibDefault = true, isMissingDefault = true, isRssDefault = true, isSettingsDefault = true, isUpdatesDefault = true, isAboutDefault = true) {
|
||||
cy.get(':nth-child(1) > .nav-link > .icon')
|
||||
.should('have.class', isLibDefault ? 'list-ul-default' : 'list-ul-active');
|
||||
cy.get('[data-cy=librariesIcon]')
|
||||
.should('have.class', isLibDefault ? 'default' : 'activePage');
|
||||
|
||||
cy.get(':nth-child(2) > .nav-link > .icon')
|
||||
.should('have.class', isMissingDefault ? 'collection-fill-default' : 'collection-fill-active');
|
||||
cy.get('[data-cy=recommendedIcon]')
|
||||
.should('have.class', isMissingDefault ? 'default' : 'activePage');
|
||||
|
||||
cy.get(':nth-child(3) > .nav-link > .icon')
|
||||
.should('not.be.visible');
|
||||
cy.get('[data-cy=rssCheckIcon]')
|
||||
.should('have.class', isRssDefault ? 'default' : 'activePage');
|
||||
|
||||
cy.get(':nth-child(4) > .nav-link > .icon')
|
||||
.should('have.class', isRssDefault ? 'rss-default' : 'rss-active');
|
||||
cy.get('[data-cy=configurationIcon]')
|
||||
.should('have.class', isSettingsDefault ? 'default' : 'activePage');
|
||||
|
||||
cy.get(':nth-child(5) > .nav-link > .icon')
|
||||
.should('have.class', isSettingsDefault ? 'gear-default' : 'gear-active');
|
||||
cy.get('[data-cy=updatesIcon]')
|
||||
.should('have.class', isUpdatesDefault ? 'default' : 'activePage');
|
||||
|
||||
cy.get(':nth-child(6) > .nav-link > .icon')
|
||||
.should('have.class', isUpdatesDefault ? 'arrow-clockwise-default' : 'arrow-clockwise-active');
|
||||
|
||||
cy.get(':nth-child(7) > .nav-link > .icon')
|
||||
.should('have.class', isAboutDefault ? 'info-circle-default' : 'info-circle-active');
|
||||
cy.get('[data-cy=aboutIcon]')
|
||||
.should('have.class', isAboutDefault ? 'default' : 'activePage');
|
||||
}
|
||||
|
||||
describe('Verify Navbars', () => {
|
||||
it('Index page', () => {
|
||||
cy.visit('/home', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/home`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
checkNavIcons(cy);
|
||||
});
|
||||
|
||||
it('About page', () => {
|
||||
cy.visit('/about', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/about`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
checkNavIcons(cy, undefined, undefined, undefined, undefined, undefined, false);
|
||||
});
|
||||
|
||||
it('Settings page', () => {
|
||||
cy.visit('/configuration', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/configuration`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
checkNavIcons(cy, undefined, undefined, undefined, false, undefined, undefined);
|
||||
});
|
||||
|
||||
it('Libraries page', () => {
|
||||
cy.visit('/libraries', { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
checkNavIcons(cy, false, undefined, undefined, undefined, undefined, undefined);
|
||||
});
|
||||
|
||||
it('Libraries page', () => {
|
||||
cy.visit('/libraries', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/libraries`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
checkNavIcons(cy, false, undefined, undefined, undefined, undefined, undefined);
|
||||
});
|
||||
|
||||
it('Recommended page', () => {
|
||||
cy.visit('/recommended', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/recommended`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
checkNavIcons(cy, undefined, false, undefined, undefined, undefined, undefined);
|
||||
});
|
||||
|
||||
it('RSS page', () => {
|
||||
cy.visit('/rssCheck', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/rssCheck`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
checkNavIcons(cy, undefined, undefined, false, undefined, undefined, undefined);
|
||||
});
|
||||
|
||||
it('Updates page', () => {
|
||||
cy.visit('/updates', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/updates`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
checkNavIcons(cy, undefined, undefined, undefined, undefined, false, undefined);
|
||||
});
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import faker from 'faker';
|
||||
import { CYPRESS_VALUES, nuke } from '../common.spec.js';
|
||||
import { BASE_URL, CYPRESS_VALUES, nuke } from '../common.spec.js';
|
||||
|
||||
function checkElements(discordWebHookUrl, tmdbApi, plexServer, plexMetadata, plexLibrary, gapsCollections, enabled) {
|
||||
cy.get('#discordWebHookUrl')
|
||||
@@ -41,7 +41,7 @@ describe('Check Discord Notification Agent', () => {
|
||||
beforeEach(nuke);
|
||||
|
||||
it('Check for Empty Discord Notification Agent Settings', () => {
|
||||
cy.request('/notifications/discord')
|
||||
cy.request(`${BASE_URL}/notifications/discord`)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
cy.fixture('discord.empty.json')
|
||||
@@ -52,7 +52,7 @@ describe('Check Discord Notification Agent', () => {
|
||||
expect(body.extras.webHookUrl).to.eq(discord.webHookUrl);
|
||||
});
|
||||
})
|
||||
.visit('/configuration')
|
||||
.visit(`${BASE_URL}/configuration`)
|
||||
.then(() => {
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -94,19 +94,19 @@ describe('Check Discord Notification Agent', () => {
|
||||
webHookUrl: faker.internet.url(),
|
||||
};
|
||||
|
||||
cy.request('PUT', '/notifications/discord', dummyAll)
|
||||
cy.request('PUT', `${BASE_URL}/notifications/discord`, dummyAll)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(140);
|
||||
expect(body.extras).to.eq(null);
|
||||
})
|
||||
.request('/notifications/discord')
|
||||
.request(`${BASE_URL}/notifications/discord`)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(142);
|
||||
expect(body.extras.webHookUrl).to.eq(dummyAll.webHookUrl);
|
||||
})
|
||||
.visit('/configuration')
|
||||
.visit(`${BASE_URL}/configuration`)
|
||||
.then(() => {
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -142,19 +142,19 @@ describe('Check Discord Notification Agent', () => {
|
||||
],
|
||||
webHookUrl: faker.internet.url(),
|
||||
};
|
||||
cy.request('PUT', '/notifications/discord', tmdbOnly)
|
||||
cy.request('PUT', `${BASE_URL}/notifications/discord`, tmdbOnly)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(140);
|
||||
expect(body.extras).to.eq(null);
|
||||
})
|
||||
.request('/notifications/discord')
|
||||
.request(`${BASE_URL}/notifications/discord`)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(142);
|
||||
expect(body.extras.webHookUrl).to.eq(tmdbOnly.webHookUrl);
|
||||
})
|
||||
.visit('/configuration')
|
||||
.visit(`${BASE_URL}/configuration`)
|
||||
.then(() => {
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -183,7 +183,7 @@ describe('Check Discord Notification Agent', () => {
|
||||
});
|
||||
|
||||
it('Check saving Discord Notification', () => {
|
||||
cy.visit('/configuration');
|
||||
cy.visit(`${BASE_URL}/configuration`);
|
||||
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -238,7 +238,7 @@ describe('Check Discord Notification Agent', () => {
|
||||
});
|
||||
|
||||
it('Check Successful Saving and Failure Testing Discord Notification', () => {
|
||||
cy.visit('/configuration');
|
||||
cy.visit(`${BASE_URL}/configuration`);
|
||||
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import faker from 'faker';
|
||||
import { CYPRESS_VALUES, nuke } from '../common.spec.js';
|
||||
import { BASE_URL, CYPRESS_VALUES, nuke } from '../common.spec.js';
|
||||
|
||||
function checkElements(username, password, mailTo, mailFrom, mailServer, mailPort, mailTransportProtocol, mailSmtpAuth, mailSmtpTlsEnabled, tmdbApi, plexServer, plexMetadata, plexLibrary, gapsCollections, enabled) {
|
||||
cy.get('#emailUsername')
|
||||
@@ -65,7 +65,7 @@ describe('Check Email Notification Agent', () => {
|
||||
beforeEach(nuke);
|
||||
|
||||
it('Check for Email Gotify Notification Agent Settings', () => {
|
||||
cy.request('/notifications/email')
|
||||
cy.request(`${BASE_URL}/notifications/email`)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(122);
|
||||
@@ -81,7 +81,7 @@ describe('Check Email Notification Agent', () => {
|
||||
expect(body.extras.mailSmtpAuth).to.eq('');
|
||||
expect(body.extras.mailSmtpTlsEnabled).to.eq(false);
|
||||
})
|
||||
.visit('/configuration')
|
||||
.visit(`${BASE_URL}/configuration`)
|
||||
.then(() => {
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -148,13 +148,13 @@ describe('Check Email Notification Agent', () => {
|
||||
mailSmtpTlsEnabled: faker.random.boolean(),
|
||||
};
|
||||
|
||||
cy.request('PUT', '/notifications/email', email)
|
||||
cy.request('PUT', `${BASE_URL}/notifications/email`, email)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(120);
|
||||
expect(body.extras).to.eq(null);
|
||||
})
|
||||
.request('/notifications/email')
|
||||
.request(`${BASE_URL}/notifications/email`)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(122);
|
||||
@@ -163,7 +163,7 @@ describe('Check Email Notification Agent', () => {
|
||||
expect(body.extras.mailPort).to.eq(email.mailPort);
|
||||
expect(body.extras.mailSmtpTlsEnabled).to.eq(email.mailSmtpTlsEnabled);
|
||||
})
|
||||
.visit('/configuration')
|
||||
.visit(`${BASE_URL}/configuration`)
|
||||
.then(() => {
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -230,13 +230,13 @@ describe('Check Email Notification Agent', () => {
|
||||
mailSmtpTlsEnabled: faker.random.boolean(),
|
||||
};
|
||||
|
||||
cy.request('PUT', '/notifications/email', email)
|
||||
cy.request('PUT', `${BASE_URL}/notifications/email`, email)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(120);
|
||||
expect(body.extras).to.eq(null);
|
||||
})
|
||||
.request('/notifications/email')
|
||||
.request(`${BASE_URL}/notifications/email`)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(122);
|
||||
@@ -245,7 +245,7 @@ describe('Check Email Notification Agent', () => {
|
||||
expect(body.extras.mailPort).to.eq(email.mailPort);
|
||||
expect(body.extras.mailSmtpTlsEnabled).to.eq(email.mailSmtpTlsEnabled);
|
||||
})
|
||||
.visit('/configuration')
|
||||
.visit(`${BASE_URL}/configuration`)
|
||||
.then(() => {
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -298,7 +298,7 @@ describe('Check Email Notification Agent', () => {
|
||||
});
|
||||
|
||||
it('Check saving Email Notification', () => {
|
||||
cy.visit('/configuration');
|
||||
cy.visit(`${BASE_URL}/configuration`);
|
||||
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -400,7 +400,7 @@ describe('Check Email Notification Agent', () => {
|
||||
});
|
||||
|
||||
it('Check Successful Saving and Failure Testing Email Notification', () => {
|
||||
cy.visit('/configuration');
|
||||
cy.visit(`${BASE_URL}/configuration`);
|
||||
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import faker from 'faker';
|
||||
import { CYPRESS_VALUES, nuke } from '../common.spec.js';
|
||||
import { BASE_URL, CYPRESS_VALUES, nuke } from '../common.spec.js';
|
||||
|
||||
function checkElements(address, token, tmdbApi, plexServer, plexMetadata, plexLibrary, gapsCollections, enabled) {
|
||||
cy.get('#gotifyAddress')
|
||||
@@ -44,7 +44,7 @@ describe('Check Gotify Notification Agent', () => {
|
||||
beforeEach(nuke);
|
||||
|
||||
it('Check for Empty Gotify Notification Agent Settings', () => {
|
||||
cy.request('/notifications/gotify')
|
||||
cy.request(`${BASE_URL}/notifications/gotify`)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(112);
|
||||
@@ -53,7 +53,7 @@ describe('Check Gotify Notification Agent', () => {
|
||||
expect(body.extras.address).to.eq('');
|
||||
expect(body.extras.token).to.eq('');
|
||||
})
|
||||
.visit('/configuration')
|
||||
.visit(`${BASE_URL}/configuration`)
|
||||
.then(() => {
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -92,20 +92,20 @@ describe('Check Gotify Notification Agent', () => {
|
||||
token: faker.random.alphaNumeric(),
|
||||
};
|
||||
|
||||
cy.request('PUT', '/notifications/gotify', gotify)
|
||||
cy.request('PUT', `${BASE_URL}/notifications/gotify`, gotify)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(110);
|
||||
expect(body.extras).to.eq(null);
|
||||
})
|
||||
.request('/notifications/gotify')
|
||||
.request(`${BASE_URL}/notifications/gotify`)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(112);
|
||||
expect(body.extras.address).to.eq(gotify.address);
|
||||
expect(body.extras.token).to.eq(gotify.token);
|
||||
})
|
||||
.visit('/configuration')
|
||||
.visit(`${BASE_URL}/configuration`)
|
||||
.then(() => {
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -144,20 +144,20 @@ describe('Check Gotify Notification Agent', () => {
|
||||
token: faker.random.alphaNumeric(),
|
||||
};
|
||||
|
||||
cy.request('PUT', '/notifications/gotify', gotify)
|
||||
cy.request('PUT', `${BASE_URL}/notifications/gotify`, gotify)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(110);
|
||||
expect(body.extras).to.eq(null);
|
||||
})
|
||||
.request('/notifications/gotify')
|
||||
.request(`${BASE_URL}/notifications/gotify`)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(112);
|
||||
expect(body.extras.address).to.eq(gotify.address);
|
||||
expect(body.extras.token).to.eq(gotify.token);
|
||||
})
|
||||
.visit('/configuration')
|
||||
.visit(`${BASE_URL}/configuration`)
|
||||
.then(() => {
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -189,7 +189,7 @@ describe('Check Gotify Notification Agent', () => {
|
||||
});
|
||||
|
||||
it('Check saving Gotify Notification', () => {
|
||||
cy.visit('/configuration');
|
||||
cy.visit(`${BASE_URL}/configuration`);
|
||||
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -250,7 +250,7 @@ describe('Check Gotify Notification Agent', () => {
|
||||
});
|
||||
|
||||
it('Check Successful Saving and Failure Testing Gotify Notification', () => {
|
||||
cy.visit('/configuration');
|
||||
cy.visit(`${BASE_URL}/configuration`);
|
||||
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import faker from 'faker';
|
||||
import { CYPRESS_VALUES, nuke } from '../common.spec.js';
|
||||
import { BASE_URL, CYPRESS_VALUES, nuke } from '../common.spec.js';
|
||||
|
||||
function checkElements(channelTag, token, tmdbApi, plexServer, plexMetadata, plexLibrary, gapsCollections, enabled) {
|
||||
cy.get('#pushBulletChannelTag')
|
||||
@@ -44,7 +44,7 @@ describe('Check PushBullet Notification Agent', () => {
|
||||
beforeEach(nuke);
|
||||
|
||||
it('Check for Empty PushBullet Notification Agent Settings', () => {
|
||||
cy.request('/notifications/pushbullet')
|
||||
cy.request(`${BASE_URL}/notifications/pushbullet`)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(102);
|
||||
@@ -53,7 +53,7 @@ describe('Check PushBullet Notification Agent', () => {
|
||||
expect(body.extras.channel_tag).to.eq('');
|
||||
expect(body.extras.accessToken).to.eq('');
|
||||
})
|
||||
.visit('/configuration')
|
||||
.visit(`${BASE_URL}/configuration`)
|
||||
.then(() => {
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -92,20 +92,20 @@ describe('Check PushBullet Notification Agent', () => {
|
||||
accessToken: faker.random.alphaNumeric(),
|
||||
};
|
||||
|
||||
cy.request('PUT', '/notifications/pushbullet', pushBullet)
|
||||
cy.request('PUT', `${BASE_URL}/notifications/pushbullet`, pushBullet)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(100);
|
||||
expect(body.extras).to.eq(null);
|
||||
})
|
||||
.request('/notifications/pushbullet')
|
||||
.request(`${BASE_URL}/notifications/pushbullet`)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(102);
|
||||
expect(body.extras.channel_tag).to.eq(pushBullet.channel_tag);
|
||||
expect(body.extras.accessToken).to.eq(pushBullet.accessToken);
|
||||
})
|
||||
.visit('/configuration')
|
||||
.visit(`${BASE_URL}/configuration`)
|
||||
.then(() => {
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -144,20 +144,20 @@ describe('Check PushBullet Notification Agent', () => {
|
||||
accessToken: faker.random.alphaNumeric(),
|
||||
};
|
||||
|
||||
cy.request('PUT', '/notifications/pushbullet', pushBullet)
|
||||
cy.request('PUT', `${BASE_URL}/notifications/pushbullet`, pushBullet)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(100);
|
||||
expect(body.extras).to.eq(null);
|
||||
})
|
||||
.request('/notifications/pushbullet')
|
||||
.request(`${BASE_URL}/notifications/pushbullet`)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(102);
|
||||
expect(body.extras.channel_tag).to.eq(pushBullet.channel_tag);
|
||||
expect(body.extras.accessToken).to.eq(pushBullet.accessToken);
|
||||
})
|
||||
.visit('/configuration')
|
||||
.visit(`${BASE_URL}/configuration`)
|
||||
.then(() => {
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -189,7 +189,7 @@ describe('Check PushBullet Notification Agent', () => {
|
||||
});
|
||||
|
||||
it('Check saving PushBullet Notification', () => {
|
||||
cy.visit('/configuration');
|
||||
cy.visit(`${BASE_URL}/configuration`);
|
||||
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -250,7 +250,7 @@ describe('Check PushBullet Notification Agent', () => {
|
||||
});
|
||||
|
||||
it('Check Successful Saving and Failure Testing PushBullet Notification', () => {
|
||||
cy.visit('/configuration');
|
||||
cy.visit(`${BASE_URL}/configuration`);
|
||||
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import faker from 'faker';
|
||||
import { CYPRESS_VALUES, nuke } from '../common.spec.js';
|
||||
import { BASE_URL, CYPRESS_VALUES, nuke } from '../common.spec.js';
|
||||
|
||||
function checkElements(token, user, priority, sound, retry, expire, tmdbApi, plexServer, plexMetadata, plexLibrary, gapsCollections, enabled) {
|
||||
cy.get('#pushOverToken')
|
||||
@@ -56,7 +56,7 @@ describe('Check PushOver Notification Agent', () => {
|
||||
beforeEach(nuke);
|
||||
|
||||
it('Check for Empty PushOver Notification Agent Settings', () => {
|
||||
cy.request('/notifications/pushOver')
|
||||
cy.request(`${BASE_URL}/notifications/pushOver`)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(132);
|
||||
@@ -69,7 +69,7 @@ describe('Check PushOver Notification Agent', () => {
|
||||
expect(body.extras.retry).to.eq(0);
|
||||
expect(body.extras.expire).to.eq(0);
|
||||
})
|
||||
.visit('/configuration')
|
||||
.visit(`${BASE_URL}/configuration`)
|
||||
.then(() => {
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -90,13 +90,13 @@ describe('Check PushOver Notification Agent', () => {
|
||||
expire: faker.random.number(10000),
|
||||
};
|
||||
|
||||
cy.request('PUT', '/notifications/pushOver', pushOver)
|
||||
cy.request('PUT', `${BASE_URL}/notifications/pushOver`, pushOver)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(130);
|
||||
expect(body.extras).to.eq(null);
|
||||
})
|
||||
.request('/notifications/pushOver')
|
||||
.request(`${BASE_URL}/notifications/pushOver`)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(132);
|
||||
@@ -107,7 +107,7 @@ describe('Check PushOver Notification Agent', () => {
|
||||
expect(body.extras.retry).to.eq(pushOver.retry);
|
||||
expect(body.extras.expire).to.eq(pushOver.expire);
|
||||
})
|
||||
.visit('/configuration')
|
||||
.visit(`${BASE_URL}/configuration`)
|
||||
.then(() => {
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -128,13 +128,13 @@ describe('Check PushOver Notification Agent', () => {
|
||||
expire: faker.random.number(10000),
|
||||
};
|
||||
|
||||
cy.request('PUT', '/notifications/pushOver', pushOver)
|
||||
cy.request('PUT', `${BASE_URL}/notifications/pushOver`, pushOver)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(130);
|
||||
expect(body.extras).to.eq(null);
|
||||
})
|
||||
.request('/notifications/pushOver')
|
||||
.request(`${BASE_URL}/notifications/pushOver`)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(132);
|
||||
@@ -145,7 +145,7 @@ describe('Check PushOver Notification Agent', () => {
|
||||
expect(body.extras.retry).to.eq(pushOver.retry);
|
||||
expect(body.extras.expire).to.eq(pushOver.expire);
|
||||
})
|
||||
.visit('/configuration')
|
||||
.visit(`${BASE_URL}/configuration`)
|
||||
.then(() => {
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -155,7 +155,7 @@ describe('Check PushOver Notification Agent', () => {
|
||||
});
|
||||
|
||||
it('Check saving PushOver Notification', () => {
|
||||
cy.visit('/configuration');
|
||||
cy.visit(`${BASE_URL}/configuration`);
|
||||
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -231,7 +231,7 @@ describe('Check PushOver Notification Agent', () => {
|
||||
});
|
||||
|
||||
it('Check Successful Saving and Failure Testing PushOver Notification', () => {
|
||||
cy.visit('/configuration');
|
||||
cy.visit(`${BASE_URL}/configuration`);
|
||||
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import faker from 'faker';
|
||||
import { CYPRESS_VALUES, nuke } from '../common.spec.js';
|
||||
import { BASE_URL, CYPRESS_VALUES, nuke } from '../common.spec.js';
|
||||
|
||||
function checkElements(slackWebHookUrl, tmdbApi, plexServer, plexMetadata, plexLibrary, gapsCollections, enabled) {
|
||||
cy.get('#slackWebHookUrl')
|
||||
@@ -41,7 +41,7 @@ describe('Check Slack Notification Agent', () => {
|
||||
beforeEach(nuke);
|
||||
|
||||
it('Check for Empty Slack Notification Agent Settings', () => {
|
||||
cy.request('/notifications/slack')
|
||||
cy.request(`${BASE_URL}/notifications/slack`)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(92);
|
||||
@@ -49,7 +49,7 @@ describe('Check Slack Notification Agent', () => {
|
||||
expect(body.extras.notificationTypes.length).to.eq(0);
|
||||
expect(body.extras.webHookUrl).to.eq('');
|
||||
})
|
||||
.visit('/configuration')
|
||||
.visit(`${BASE_URL}/configuration`)
|
||||
.then(() => {
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -84,19 +84,19 @@ describe('Check Slack Notification Agent', () => {
|
||||
webHookUrl: faker.internet.url(),
|
||||
};
|
||||
|
||||
cy.request('PUT', '/notifications/slack', slack)
|
||||
cy.request('PUT', `${BASE_URL}/notifications/slack`, slack)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(90);
|
||||
expect(body.extras).to.eq(null);
|
||||
})
|
||||
.request('/notifications/slack')
|
||||
.request(`${BASE_URL}/notifications/slack`)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(92);
|
||||
expect(body.extras.webHookUrl).to.eq(slack.webHookUrl);
|
||||
})
|
||||
.visit('/configuration')
|
||||
.visit(`${BASE_URL}/configuration`)
|
||||
.then(() => {
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -112,19 +112,19 @@ describe('Check Slack Notification Agent', () => {
|
||||
webHookUrl: faker.internet.url(),
|
||||
};
|
||||
|
||||
cy.request('PUT', '/notifications/slack', slack)
|
||||
cy.request('PUT', `${BASE_URL}/notifications/slack`, slack)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(90);
|
||||
expect(body.extras).to.eq(null);
|
||||
})
|
||||
.request('/notifications/slack')
|
||||
.request(`${BASE_URL}/notifications/slack`)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(92);
|
||||
expect(body.extras.webHookUrl).to.eq(slack.webHookUrl);
|
||||
})
|
||||
.visit('/configuration')
|
||||
.visit(`${BASE_URL}/configuration`)
|
||||
.then(() => {
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -134,7 +134,7 @@ describe('Check Slack Notification Agent', () => {
|
||||
});
|
||||
|
||||
it('Check saving Slack Notification', () => {
|
||||
cy.visit('/configuration');
|
||||
cy.visit(`${BASE_URL}/configuration`);
|
||||
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -189,7 +189,7 @@ describe('Check Slack Notification Agent', () => {
|
||||
});
|
||||
|
||||
it('Check Successful Saving and Failure Testing Slack Notification', () => {
|
||||
cy.visit('/configuration');
|
||||
cy.visit(`${BASE_URL}/configuration`);
|
||||
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import faker from 'faker';
|
||||
import { CYPRESS_VALUES, nuke } from '../common.spec.js';
|
||||
import { BASE_URL, CYPRESS_VALUES, nuke } from '../common.spec.js';
|
||||
|
||||
function checkElements(botId, chatId, tmdbApi, plexServer, plexMetadata, plexLibrary, gapsCollections, enabled) {
|
||||
cy.get('#telegramBotId')
|
||||
@@ -44,7 +44,7 @@ describe('Check Telegram Notification Agent', () => {
|
||||
beforeEach(nuke);
|
||||
|
||||
it('Check for Empty Telegram Notification Agent Settings', () => {
|
||||
cy.request('/notifications/telegram')
|
||||
cy.request(`${BASE_URL}/notifications/telegram`)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(82);
|
||||
@@ -53,7 +53,7 @@ describe('Check Telegram Notification Agent', () => {
|
||||
expect(body.extras.botId).to.eq('');
|
||||
expect(body.extras.chatId).to.eq('');
|
||||
})
|
||||
.visit('/configuration')
|
||||
.visit(`${BASE_URL}/configuration`)
|
||||
.then(() => {
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -70,20 +70,20 @@ describe('Check Telegram Notification Agent', () => {
|
||||
botId: faker.random.alphaNumeric(),
|
||||
};
|
||||
|
||||
cy.request('PUT', '/notifications/telegram', telegram)
|
||||
cy.request('PUT', `${BASE_URL}/notifications/telegram`, telegram)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(80);
|
||||
expect(body.extras).to.eq(null);
|
||||
})
|
||||
.request('/notifications/telegram')
|
||||
.request(`${BASE_URL}/notifications/telegram`)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(82);
|
||||
expect(body.extras.chatId).to.eq(telegram.chatId);
|
||||
expect(body.extras.botId).to.eq(telegram.botId);
|
||||
})
|
||||
.visit('/configuration')
|
||||
.visit(`${BASE_URL}/configuration`)
|
||||
.then(() => {
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -100,20 +100,20 @@ describe('Check Telegram Notification Agent', () => {
|
||||
botId: faker.random.alphaNumeric(),
|
||||
};
|
||||
|
||||
cy.request('PUT', '/notifications/telegram', telegram)
|
||||
cy.request('PUT', `${BASE_URL}/notifications/telegram`, telegram)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(80);
|
||||
expect(body.extras).to.eq(null);
|
||||
})
|
||||
.request('/notifications/telegram')
|
||||
.request(`${BASE_URL}/notifications/telegram`)
|
||||
.then((resp) => {
|
||||
const { body } = resp;
|
||||
expect(body.code).to.eq(82);
|
||||
expect(body.extras.chatId).to.eq(telegram.chatId);
|
||||
expect(body.extras.botId).to.eq(telegram.botId);
|
||||
})
|
||||
.visit('/configuration')
|
||||
.visit(`${BASE_URL}/configuration`)
|
||||
.then(() => {
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -123,7 +123,7 @@ describe('Check Telegram Notification Agent', () => {
|
||||
});
|
||||
|
||||
it('Check saving Telegram Notification', () => {
|
||||
cy.visit('/configuration');
|
||||
cy.visit(`${BASE_URL}/configuration`);
|
||||
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
@@ -181,7 +181,7 @@ describe('Check Telegram Notification Agent', () => {
|
||||
});
|
||||
|
||||
it('Check Successful Saving and Failure Testing Telegram Notification', () => {
|
||||
cy.visit('/configuration');
|
||||
cy.visit(`${BASE_URL}/configuration`);
|
||||
|
||||
cy.get('#notificationTab')
|
||||
.click();
|
||||
|
||||
@@ -11,10 +11,10 @@
|
||||
/* global cy, describe, it, expect */
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import { redLibraryBefore, spyOnAddEventListener } from '../common.spec.js';
|
||||
import { BASE_URL, redLibraryBefore, spyOnAddEventListener } from '../common.spec.js';
|
||||
|
||||
function searchSawLibrary(cy) {
|
||||
cy.visit('/libraries', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/libraries`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
cy.get('[data-cy=dropdownMenu]')
|
||||
.click();
|
||||
@@ -32,12 +32,12 @@ function searchSawLibrary(cy) {
|
||||
cy.get('#movies_info')
|
||||
.should('have.text', 'Showing 1 to 1 of 1 entries');
|
||||
|
||||
cy.visit('/recommended', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/recommended`, { onBeforeLoad: spyOnAddEventListener });
|
||||
}
|
||||
|
||||
describe('Recommended API', () => {
|
||||
it('Get Bad recommended', () => {
|
||||
cy.request('/recommended/a/2')
|
||||
cy.request(`${BASE_URL}/recommended/a/2`)
|
||||
.then((resp) => {
|
||||
cy.log(resp.body);
|
||||
const result = resp.body;
|
||||
@@ -49,7 +49,7 @@ describe('Recommended API', () => {
|
||||
redLibraryBefore();
|
||||
searchSawLibrary(cy);
|
||||
|
||||
cy.request('/libraries/c51c432ae94e316d52570550f915ecbcd71bede8/5')
|
||||
cy.request(`${BASE_URL}/libraries/c51c432ae94e316d52570550f915ecbcd71bede8/5`)
|
||||
.then((resp) => {
|
||||
cy.log(resp.body);
|
||||
const result = resp.body;
|
||||
|
||||
@@ -11,13 +11,13 @@
|
||||
/* global cy, describe, it, before */
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import { redLibraryBefore, spyOnAddEventListener } from '../common.spec.js';
|
||||
import { BASE_URL, redLibraryBefore, spyOnAddEventListener } from '../common.spec.js';
|
||||
|
||||
describe('Not Searched Yet Recommended', () => {
|
||||
before(redLibraryBefore);
|
||||
|
||||
it('Clean configuration page load', () => {
|
||||
cy.visit('/recommended', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/recommended`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
cy.get('#noMovieContainer > .card > .card-img-top')
|
||||
.should('be.visible');
|
||||
|
||||
@@ -11,10 +11,12 @@
|
||||
/* global cy, describe, it, beforeEach */
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import { nuke, redLibraryBefore, spyOnAddEventListener } from '../common.spec.js';
|
||||
import {
|
||||
BASE_URL, nuke, redLibraryBefore, spyOnAddEventListener,
|
||||
} from '../common.spec.js';
|
||||
|
||||
function searchSawLibrary(cy) {
|
||||
cy.visit('/libraries', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/libraries`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
cy.get('[data-cy=dropdownMenu]')
|
||||
.click();
|
||||
@@ -32,7 +34,7 @@ function searchSawLibrary(cy) {
|
||||
cy.get('#movies_info')
|
||||
.should('have.text', 'Showing 1 to 1 of 1 entries');
|
||||
|
||||
cy.visit('/recommended', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/recommended`, { onBeforeLoad: spyOnAddEventListener });
|
||||
}
|
||||
|
||||
describe('Search for Recommended', () => {
|
||||
@@ -69,6 +71,8 @@ describe('Search for Recommended', () => {
|
||||
cy.get('[data-cy=searchForMovies]')
|
||||
.click();
|
||||
|
||||
cy.scrollTo(0, 1000);
|
||||
|
||||
cy.get('#movies_info', { timeout: 5000 })
|
||||
.should('have.text', 'Showing 1 to 7 of 7 entries');
|
||||
|
||||
|
||||
@@ -11,13 +11,13 @@
|
||||
/* global cy, describe, it, before */
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import { nuke, spyOnAddEventListener } from '../common.spec.js';
|
||||
import { BASE_URL, nuke, spyOnAddEventListener } from '../common.spec.js';
|
||||
|
||||
describe('Not Searched Yet RSS', () => {
|
||||
before(nuke);
|
||||
|
||||
it('Clean configuration page load', () => {
|
||||
cy.visit('/rssCheck', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/rssCheck`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
cy.get('.card-img-top')
|
||||
.should('be.visible');
|
||||
|
||||
@@ -11,10 +11,10 @@
|
||||
/* global cy, describe, it, before, expect */
|
||||
/* eslint no-undef: "error" */
|
||||
|
||||
import { redLibraryBefore, spyOnAddEventListener } from '../common.spec.js';
|
||||
import { BASE_URL, redLibraryBefore, spyOnAddEventListener } from '../common.spec.js';
|
||||
|
||||
function searchSawLibrary(cy) {
|
||||
cy.visit('/libraries', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/libraries`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
cy.get('[data-cy=dropdownMenu]')
|
||||
.click();
|
||||
@@ -32,7 +32,7 @@ function searchSawLibrary(cy) {
|
||||
cy.get('#movies_info')
|
||||
.should('have.text', 'Showing 1 to 1 of 1 entries');
|
||||
|
||||
cy.visit('/recommended', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/recommended`, { onBeforeLoad: spyOnAddEventListener });
|
||||
}
|
||||
|
||||
describe('Searched RSS', () => {
|
||||
@@ -53,9 +53,9 @@ describe('Searched RSS', () => {
|
||||
cy.get('#movies_info', { timeout: 5000 })
|
||||
.should('have.text', 'Showing 1 to 7 of 7 entries');
|
||||
|
||||
cy.visit('/rssCheck', { onBeforeLoad: spyOnAddEventListener });
|
||||
cy.visit(`${BASE_URL}/rssCheck`, { onBeforeLoad: spyOnAddEventListener });
|
||||
|
||||
cy.request('/rss/c51c432ae94e316d52570550f915ecbcd71bede8/5')
|
||||
cy.request(`${BASE_URL}/rss/c51c432ae94e316d52570550f915ecbcd71bede8/5`)
|
||||
.then((resp) => {
|
||||
const result = resp.body;
|
||||
expect(result).to.have.lengthOf(7);
|
||||
|
||||
+2
-1
@@ -11,4 +11,5 @@ gaps:
|
||||
expose:
|
||||
- "32400"
|
||||
volumes:
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
- /home/gaps:/usr/data:Z
|
||||
|
||||
Generated
+22
-6075
File diff suppressed because it is too large
Load Diff
+4
-4
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "gaps",
|
||||
"version": "0.8.12",
|
||||
"version": "0.9.0",
|
||||
"description": "Gaps searches through your Plex Server or local folders for all movies, then queries for known movies in the same collection. If those movies don't exist in your library, Gaps will recommend getting those movies, legally of course.",
|
||||
"main": "/",
|
||||
"dependencies": {
|
||||
@@ -12,7 +12,7 @@
|
||||
"uglifyjs-folder": "^2.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"cypress": "^7.1.0",
|
||||
"cypress": "^7.2.0",
|
||||
"eslint": "^7.10.0",
|
||||
"eslint-config-airbnb-base": "^14.2.0",
|
||||
"eslint-plugin-import": "^2.22.1"
|
||||
@@ -22,8 +22,8 @@
|
||||
"minify-input-css": "postcss GapsWeb/src/main/resources/static/css/input.css > GapsWeb/src/main/resources/static/css/input.min.css",
|
||||
"uglifyjs-modules": "rm -f GapsWeb/src/main/resources/static/js/modules/*.min.js && uglifyjs-folder GapsWeb/src/main/resources/static/js/modules/ -eo GapsWeb/src/main/resources/static/js/modules/\n",
|
||||
"uglifyjs-pages": "rm -f GapsWeb/src/main/resources/static/js/page/*.min.js && uglifyjs-folder GapsWeb/src/main/resources/static/js/page/ -eo GapsWeb/src/main/resources/static/js/page/\n",
|
||||
"eslint-cypress": "./node_modules/.bin/eslint cypress/integration",
|
||||
"eslint-gaps": "./node_modules/.bin/eslint GapsWeb/src/main/resources/static/js"
|
||||
"eslint-cypress": "./node_modules/.bin/eslint --fix cypress/integration",
|
||||
"eslint-gaps": "./node_modules/.bin/eslint --fix GapsWeb/src/main/resources/static/js"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
</parent>
|
||||
<groupId>com.jasonhhouse</groupId>
|
||||
<artifactId>Gaps</artifactId>
|
||||
<version>0.8.12</version>
|
||||
<version>0.9.0</version>
|
||||
<name>Gaps</name>
|
||||
<description>Demo project for Spring Boot</description>
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
<apache.commons.lang3>3.9</apache.commons.lang3>
|
||||
<apache.commons.text>1.9</apache.commons.text>
|
||||
<commons.io>2.8.0</commons.io>
|
||||
<gaps.version>0.8.12</gaps.version>
|
||||
<gaps.version>0.9.0</gaps.version>
|
||||
<google.findbugs>3.0.0</google.findbugs>
|
||||
<guava>30.1-jre</guava>
|
||||
<hibernate.core>5.2.12.Final</hibernate.core>
|
||||
|
||||
@@ -1,17 +1,18 @@
|
||||
#!/bin/bash
|
||||
echo "Enable SSL: $ENABLE_SSL"
|
||||
echo "Enable Login: $ENABLE_LOGIN"
|
||||
echo "Base URL: $BASE_URL"
|
||||
echo "Jar File: $JAR_FILE"
|
||||
if [ $ENABLE_SSL == true ]; then
|
||||
if [ $ENABLE_LOGIN == true ]; then
|
||||
java -jar -Dspring.profiles.active=ssl $JAR_FILE
|
||||
java -jar -Dspring.profiles.active=ssl -Dserver.servlet.context-path=$BASE_URL $JAR_FILE
|
||||
else
|
||||
java -jar -Dspring.profiles.active=ssl-no-login $JAR_FILE
|
||||
java -jar -Dspring.profiles.active=ssl-no-login -Dserver.servlet.context-path=$BASE_URL $JAR_FILE
|
||||
fi
|
||||
else
|
||||
if [ $ENABLE_LOGIN == true ]; then
|
||||
java -jar -Dspring.profiles.active=no-ssl $JAR_FILE
|
||||
java -jar -Dspring.profiles.active=no-ssl -Dserver.servlet.context-path=$BASE_URL $JAR_FILE
|
||||
else
|
||||
java -jar -Dspring.profiles.active=no-ssl-no-login $JAR_FILE
|
||||
java -jar -Dspring.profiles.active=no-ssl-no-login -Dserver.servlet.context-path=$BASE_URL $JAR_FILE
|
||||
fi
|
||||
fi
|
||||
@@ -1,13 +1,15 @@
|
||||
#!/bin/bash
|
||||
enable_ssl=false
|
||||
enable_login=false
|
||||
base_url=""
|
||||
|
||||
while getopts s:l: flag
|
||||
while getopts s:l:u: flag
|
||||
do
|
||||
case "${flag}" in
|
||||
s) enable_ssl=${OPTARG};;
|
||||
l) enable_login=${OPTARG};;
|
||||
*) echo "usage: $0 [-s] [-l]" >&2
|
||||
u) base_url=${OPTARG};;
|
||||
*) echo "usage: $0 [-s] [-l] [-u]" >&2
|
||||
exit 1 ;;
|
||||
esac
|
||||
done
|
||||
@@ -15,17 +17,17 @@ done
|
||||
if [ "$enable_ssl" == true ]; then
|
||||
if [ "$enable_login" == true ]; then
|
||||
echo "Running with SSL and Login"
|
||||
java -jar -Dspring.profiles.active=ssl gaps.jar
|
||||
java -jar -Dspring.profiles.active=ssl -Dinfo.app.baseUrl=$base_url gaps.jar
|
||||
else
|
||||
echo "Running with SSL and without Login"
|
||||
java -jar -Dspring.profiles.active=ssl-no-login gaps.jar
|
||||
java -jar -Dspring.profiles.active=ssl-no-login -Dinfo.app.baseUrl=$base_url gaps.jar
|
||||
fi
|
||||
else
|
||||
if [ "$enable_login" == true ]; then
|
||||
echo "Running without SSL and with Login"
|
||||
java -jar -Dspring.profiles.active=no-ssl gaps.jar
|
||||
java -jar -Dspring.profiles.active=no-ssl -Dinfo.app.baseUrl=$base_url gaps.jar
|
||||
else
|
||||
echo "Running without SSL and without Login"
|
||||
java -jar -Dspring.profiles.active=no-ssl-no-login gaps.jar
|
||||
java -jar -Dspring.profiles.active=no-ssl-no-login -Dinfo.app.baseUrl=$base_url gaps.jar
|
||||
fi
|
||||
fi
|
||||
+5
-4
@@ -2,6 +2,7 @@
|
||||
|
||||
SET s=false
|
||||
SET l=false
|
||||
SET u=""
|
||||
|
||||
:initial
|
||||
if "%1"=="" goto done
|
||||
@@ -20,17 +21,17 @@ goto initial
|
||||
if %s% == true (
|
||||
if %l% == true (
|
||||
echo "Running with SSL and Login"
|
||||
call java -jar -Dspring.profiles.active=ssl gaps.jar
|
||||
call java -jar -Dspring.profiles.active=ssl -Dinfo.app.baseUrl=%u% gaps.jar
|
||||
) else (
|
||||
echo "Running with SSL and without Login"
|
||||
call java -jar -Dspring.profiles.active=ssl-no-login gaps.jar
|
||||
call java -jar -Dspring.profiles.active=ssl-no-login -Dinfo.app.baseUrl=%u% gaps.jar
|
||||
)
|
||||
) else (
|
||||
if %l% == true (
|
||||
echo "Running without SSL and with Login"
|
||||
call java -jar -Dspring.profiles.active=no-ssl gaps.jar
|
||||
call java -jar -Dspring.profiles.active=no-ssl -Dinfo.app.baseUrl=%u% gaps.jar
|
||||
) else (
|
||||
echo "Running without SSL and without Login"
|
||||
call java -jar -Dspring.profiles.active=no-ssl-no-login gaps.jar
|
||||
call java -jar -Dspring.profiles.active=no-ssl-no-login -Dinfo.app.baseUrl=%u% gaps.jar
|
||||
)
|
||||
)
|
||||
Reference in New Issue
Block a user