Finished Radarr integration

This commit is contained in:
2026-03-07 19:21:58 -07:00
parent 3f5074aa3b
commit 11c241b149
2 changed files with 55 additions and 35 deletions

View File

@@ -37,6 +37,30 @@ public class RadarrController : Controller
_httpClient.DefaultRequestHeaders.Add("X-Api-Key", Configuration.RadarrAPIKey); _httpClient.DefaultRequestHeaders.Add("X-Api-Key", Configuration.RadarrAPIKey);
} }
private async Task<ObjectResult> GetRadarrMovieInfo(MovieInfo movieInfo){
var uriBuilder = new UriBuilder($"{Configuration.RadarrAddress}/api/v3/movie");
var query = HttpUtility.ParseQueryString(uriBuilder.Query);
query["tmdbId"] = movieInfo.TmdbId;
query["excludeLocalCovers"] = "false";
uriBuilder.Query = query.ToString();
var response = await _httpClient.GetAsync(uriBuilder.Uri).ConfigureAwait(false);
response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
var movies = JsonSerializer.Deserialize<List<RadarrMovie>>(responseBody);
var movie = movies?.FirstOrDefault();
if (movie == null)
{
return NotFound("Movie not found in Radarr library.");
}
return Ok(movie);
}
[HttpPost("deleteMovieFromRadarr")] [HttpPost("deleteMovieFromRadarr")]
public async Task<IActionResult> DeleteMovieFromRadarr([FromBody] MovieInfo movieInfo){ public async Task<IActionResult> DeleteMovieFromRadarr([FromBody] MovieInfo movieInfo){
@@ -47,27 +71,27 @@ public class RadarrController : Controller
try try
{ {
var uriBuilder = new UriBuilder($"{Configuration.RadarrAddress}/api/v3/movie"); var radarrMovieInfoResult = await GetRadarrMovieInfo(movieInfo).ConfigureAwait(false);
var query = HttpUtility.ParseQueryString(uriBuilder.Query);
query["tmdbId"] = movieInfo.TmdbId; if(radarrMovieInfoResult.StatusCode != StatusCodes.Status200OK || radarrMovieInfoResult.Value is not RadarrMovie){
query["excludeLocalCovers"] = "false"; return radarrMovieInfoResult;
uriBuilder.Query = query.ToString();
var response = await _httpClient.GetAsync(uriBuilder.Uri).ConfigureAwait(false);
response.EnsureSuccessStatusCode();
var responseBody = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
var movies = JsonSerializer.Deserialize<List<RadarrMovie>>(responseBody);
var movie = movies?.FirstOrDefault();
if (movie == null)
{
return NotFound("Movie not found in Radarr library.");
} }
return Ok(movie); RadarrMovie movie = (RadarrMovie)radarrMovieInfoResult.Value;
var uriBuilder = new UriBuilder($"{Configuration.RadarrAddress}/api/v3/movie/{movie.Id}");
var query = HttpUtility.ParseQueryString(uriBuilder.Query);
query["deleteFiles"] = "true";
query["addImportExclusion"] = "true";
uriBuilder.Query = query.ToString();
using var request = new HttpRequestMessage(HttpMethod.Delete, uriBuilder.Uri);
var response = await _httpClient.SendAsync(request).ConfigureAwait(false);
response.EnsureSuccessStatusCode();
return Ok();
} }
catch (HttpRequestException e) catch (HttpRequestException e)
{ {

View File

@@ -1,4 +1,8 @@
document.addEventListener('pageshow', async () => { document.addEventListener('pageshow', async () => {
await refreshFrontEnd();
});
const refreshFrontEnd = async () => {
await updateMediaCleanerState(); await updateMediaCleanerState();
var moviesTitle = document.getElementById("moviesTitle"); var moviesTitle = document.getElementById("moviesTitle");
@@ -11,7 +15,7 @@ document.addEventListener('pageshow', async () => {
addClickHandlersToLinks(); addClickHandlersToLinks();
addClickHandlersToDeleteButtons(); addClickHandlersToDeleteButtons();
finishLoading(); finishLoading();
}); }
const getMediaCleanerSeriesInfo = async () => { const getMediaCleanerSeriesInfo = async () => {
const response = await fetch("/mediacleaner/state/getSeriesInfo"); const response = await fetch("/mediacleaner/state/getSeriesInfo");
@@ -187,7 +191,6 @@ const getCheckedMedia = (table) => {
} }
const deleteMovieFromRadarrApi = async (movie) => { const deleteMovieFromRadarrApi = async (movie) => {
console.log("Movie to post: ", movie);
const response = await fetch("/radarr/deleteMovieFromRadarr", { const response = await fetch("/radarr/deleteMovieFromRadarr", {
method: "POST", method: "POST",
headers: { headers: {
@@ -199,23 +202,13 @@ const deleteMovieFromRadarrApi = async (movie) => {
if(!response.ok){ if(!response.ok){
throw new Error(`Response status: ${response.status}`) throw new Error(`Response status: ${response.status}`)
} }
return console.log("Response: ", response.json());
} }
const deleteFromRadarr = async () => { const deleteFromRadarr = async () => {
// Get all movies with checked checkboxes // Get all movies with checked checkboxes
const selectedMovies = getCheckedMedia(moviesTable); const selectedMovies = getCheckedMedia(moviesTable);
selectedMovies.forEach(async movie => await deleteMovieFromRadarrApi(movie)); selectedMovies.forEach(async movie => await deleteMovieFromRadarrApi(movie));
// Need to GET first for movieIds? refreshFrontEnd();
// /api/v3/movie?tmdbId=383275
// Likely need to use Movie DELETE endpoint (/api/v3/movie/{id})
// Payload:
// {
// "id": id
// "deleteFiles": true
// }
console.log("Delete from Radarr!")
} }
const deleteFromSonarr = () => { const deleteFromSonarr = () => {
@@ -232,11 +225,14 @@ const deleteFromSonarr = () => {
const finishLoading = () => { const finishLoading = () => {
const loadingElement = document.getElementById("loading"); const loadingElement = document.getElementById("loading");
const homepage = document.getElementById("homepage"); const homepage = document.getElementById("homepage");
loadingElement.style.visibility = "hidden"; loadingElement.style.visibility = "hidden";
homepage.style.visibility = "visible"; homepage.style.visibility = "visible";
}
console.log("Loading element: ", loadingElement);
console.log("Homepage element: ", homepage); const startLoading = () => {
const loadingElement = document.getElementById("loading");
const homepage = document.getElementById("homepage");
loadingElement.style.visibility = "visible";
homepage.style.visibility = "hidden";
} }