diff --git a/Jellyfin.Plugin.MediaCleaner/Pages/home.js b/Jellyfin.Plugin.MediaCleaner/Pages/home.js
index 15dcfa5..73432f5 100644
--- a/Jellyfin.Plugin.MediaCleaner/Pages/home.js
+++ b/Jellyfin.Plugin.MediaCleaner/Pages/home.js
@@ -8,9 +8,11 @@ const refreshFrontEnd = async () => {
var moviesTitle = document.getElementById("moviesTitle");
var seriesTitle = document.getElementById("seriesTitle");
+ var animeSeriesTitle = document.getElementById("animeSeriesTitle");
moviesTitle.innerHTML = await getMediaCleanerMoviesTitle();
seriesTitle.innerHTML = await getMediaCleanerSeriesTitle();
+ animeSeriesTitle.innerHTML = await getMediaCleanerAnimeSeriesTitle();
await populateTables();
addClickHandlersToLinks();
@@ -18,14 +20,24 @@ const refreshFrontEnd = async () => {
finishLoading();
}
-const getMediaCleanerSeriesInfo = async () => {
- const response = await fetch("/mediacleaner/state/getSeriesInfo");
+const getMediaCleanerTvSeriesInfo = async () => {
+ const response = await fetch("/mediacleaner/state/getTvSeriesInfo");
if(!response.ok){
throw new Error(`Response status: ${response.status}`)
}
- return response.json();
+ return await response.json();
+};
+
+const getMediaCleanerAnimeSeriesInfo = async () => {
+ const response = await fetch("/mediacleaner/state/getAnimeSeriesInfo");
+
+ if(!response.ok){
+ throw new Error(`Response status: ${response.status}`)
+ }
+
+ return await response.json();
};
const getMediaCleanerMovieInfo = async () => {
@@ -35,7 +47,7 @@ const getMediaCleanerMovieInfo = async () => {
throw new Error(`Response status: ${response.status}`)
}
- return response.json();
+ return await response.json();
};
const updateMediaCleanerState = async () => {
@@ -48,6 +60,16 @@ const updateMediaCleanerState = async () => {
return response.json();
};
+const getMediaCleanerAnimeSeriesTitle = async () => {
+ const response = await fetch("/mediacleaner/state/getAnimeSeriesTitle");
+
+ if(!response.ok){
+ throw new Error(`Response status: ${response.status}`);
+ }
+
+ return response.json();
+};
+
const getMediaCleanerSeriesTitle = async () => {
const response = await fetch("/mediacleaner/state/getSeriesTitle");
@@ -71,7 +93,12 @@ const getMediaCleanerMoviesTitle = async () => {
const populateTables = async () => {
var moviesInfo = await getMediaCleanerMovieInfo();
- var seriesInfo = await getMediaCleanerSeriesInfo();
+ var seriesInfo = await getMediaCleanerTvSeriesInfo();
+ var animeSeriesInfo = await getMediaCleanerAnimeSeriesInfo();
+
+ var seriesTable = document.getElementById("seriesTable");
+ var moviesTable = document.getElementById("moviesTable");
+ var animeSeriesTable = document.getElementById("animeSeriesTable");
var seriesTableBody = seriesTable.getElementsByTagName('tbody')[0];
seriesTableBody.replaceChildren();
@@ -81,6 +108,10 @@ const populateTables = async () => {
moviesTableBody.replaceChildren();
var moviesDeleteButton = document.getElementById('moviesDeleteButton');
+ var animeSeriesTableBody = animeSeriesTable.getElementsByTagName('tbody')[0];
+ animeSeriesTableBody.replaceChildren();
+ var animeSeriesDeleteButton = document.getElementById('animeSeriesDeleteButton');
+
if (moviesInfo.length > 0){
for(let i = 0; i < moviesInfo.length; i++){
var row = moviesTableBody.insertRow(-1);
@@ -120,7 +151,30 @@ const populateTables = async () => {
var row = seriesTableBody.insertRow(-1);
var cell1 = row.insertCell(0);
cell1.colSpan = columnCount;
- cell1.innerHTML = "No stale series found.";
+ cell1.innerHTML = "No stale tv series found.";
+ cell1.className = "table-text";
+ }
+
+ if(animeSeriesInfo.length > 0){
+ for(let i = 0; i < animeSeriesInfo.length; i++){
+ var row = animeSeriesTableBody.insertRow(-1);
+ var cell1 = row.insertCell(0);
+ var cell2 = row.insertCell(1);
+ var cell3 = row.insertCell(2);
+ cell1.innerHTML = animeSeriesInfo[i].Name;
+ cell1.className = "table-text";
+ cell2.innerHTML = animeSeriesInfo[i].Seasons.map(season => season).join(", ");
+ cell2.className = "table-text";
+ cell3.appendChild(createCheckbox(animeSeriesInfo[i], animeSeriesTable, animeSeriesDeleteButton));
+ cell3.className = "table-checkbox"
+ }
+ }
+ else{
+ var columnCount = animeSeriesTable.tHead.rows[0].cells.length;
+ var row = animeSeriesTableBody.insertRow(-1);
+ var cell1 = row.insertCell(0);
+ cell1.colSpan = columnCount;
+ cell1.innerHTML = "No stale anime series found.";
cell1.className = "table-text";
}
};
@@ -179,8 +233,10 @@ const addClickHandlersToLinks = () => {
const addClickHandlersToDeleteButtons = () => {
const deleteMoviesButtonElement = document.getElementById("moviesDeleteButton");
const deleteSeriesButtonElement = document.getElementById("seriesDeleteButton");
+ const deleteAnimeSeriesButtonElement = document.getElementById("animeSeriesDeleteButton");
deleteMoviesButtonElement.addEventListener("click", deleteFromRadarr);
deleteSeriesButtonElement.addEventListener("click", deleteFromSonarr);
+ deleteAnimeSeriesButtonElement.addEventListener("click", deleteFromAnimeSonarr);
}
const getCheckedMedia = (table) => {
@@ -219,6 +275,20 @@ const deleteSeriesFromSonarrApi = async (series) => {
}
}
+const deleteSeriesFromAnimeSonarrApi = async (series) => {
+ const response = await fetch("/sonarr/deleteSeriesFromAnimeSonarr", {
+ method: "POST",
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify(series)
+ });
+
+ if(!response.ok){
+ throw new Error(`Response status: ${response.status}`)
+ }
+}
+
const deleteFromRadarr = async () => {
const selectedMovies = getCheckedMedia(moviesTable);
selectedMovies.forEach(async movie => await deleteMovieFromRadarrApi(movie));
@@ -231,6 +301,12 @@ const deleteFromSonarr = () => {
refreshFrontEnd();
}
+const deleteFromAnimeSonarr = () => {
+ const selectedSeries = getCheckedMedia(animeSeriesTable);
+ selectedSeries.forEach(async series => await deleteSeriesFromAnimeSonarrApi(series));
+ refreshFrontEnd();
+}
+
const finishLoading = () => {
const loadingElement = document.getElementById("loading");
const homepage = document.getElementById("homepage");
diff --git a/Jellyfin.Plugin.MediaCleaner/StaleMediaScanner.cs b/Jellyfin.Plugin.MediaCleaner/StaleMediaScanner.cs
index 8207e26..0c45f0e 100644
--- a/Jellyfin.Plugin.MediaCleaner/StaleMediaScanner.cs
+++ b/Jellyfin.Plugin.MediaCleaner/StaleMediaScanner.cs
@@ -103,7 +103,7 @@ public sealed class StaleMediaScanner
movie.ProviderIds.TryGetValue("Tmdb", out string? tmdbId);
return new MovieInfo
{
- TmdbId = tmdbId,
+ TmdbId = tmdbId ?? string.Empty,
Name = movie.Name
};
});
@@ -189,34 +189,6 @@ public sealed class StaleMediaScanner
List