From bc099f27cb7a211abaff37bea08451b1db4c0a86 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sat, 20 Dec 2025 21:02:09 -0800 Subject: [PATCH] Add v5 rename endpoints --- .../Episodes/RenameEpisodeController.cs | 49 +++++++++++++++++++ .../Episodes/RenameEpisodeResource.cs | 43 ++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 src/Sonarr.Api.V5/Episodes/RenameEpisodeController.cs create mode 100644 src/Sonarr.Api.V5/Episodes/RenameEpisodeResource.cs diff --git a/src/Sonarr.Api.V5/Episodes/RenameEpisodeController.cs b/src/Sonarr.Api.V5/Episodes/RenameEpisodeController.cs new file mode 100644 index 000000000..fb9263c36 --- /dev/null +++ b/src/Sonarr.Api.V5/Episodes/RenameEpisodeController.cs @@ -0,0 +1,49 @@ +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Mvc; +using NzbDrone.Core.MediaFiles; +using Sonarr.Http; +using Sonarr.Http.REST; + +namespace Sonarr.Api.V3.Episodes +{ + [V3ApiController("rename")] + public class RenameEpisodeController : Controller + { + private readonly IRenameEpisodeFileService _renameEpisodeFileService; + + public RenameEpisodeController(IRenameEpisodeFileService renameEpisodeFileService) + { + _renameEpisodeFileService = renameEpisodeFileService; + } + + [HttpGet] + [Produces("application/json")] + public List GetEpisodes(int seriesId, int? seasonNumber) + { + if (seasonNumber.HasValue) + { + return _renameEpisodeFileService.GetRenamePreviews(seriesId, seasonNumber.Value).ToResource(); + } + + return _renameEpisodeFileService.GetRenamePreviews(seriesId).ToResource(); + } + + [HttpGet("bulk")] + [Produces("application/json")] + public List GetEpisodes([FromQuery] List seriesIds) + { + if (seriesIds is { Count: 0 }) + { + throw new BadRequestException("seriesIds must be provided"); + } + + if (seriesIds.Any(seriesId => seriesId <= 0)) + { + throw new BadRequestException("seriesIds must be positive integers"); + } + + return _renameEpisodeFileService.GetRenamePreviews(seriesIds).ToResource(); + } + } +} diff --git a/src/Sonarr.Api.V5/Episodes/RenameEpisodeResource.cs b/src/Sonarr.Api.V5/Episodes/RenameEpisodeResource.cs new file mode 100644 index 000000000..9ace94c8b --- /dev/null +++ b/src/Sonarr.Api.V5/Episodes/RenameEpisodeResource.cs @@ -0,0 +1,43 @@ +using System.Collections.Generic; +using System.Linq; +using Sonarr.Http.REST; + +namespace Sonarr.Api.V3.Episodes +{ + public class RenameEpisodeResource : RestResource + { + public int SeriesId { get; set; } + public int SeasonNumber { get; set; } + public List EpisodeNumbers { get; set; } + public int EpisodeFileId { get; set; } + public string ExistingPath { get; set; } + public string NewPath { get; set; } + } + + public static class RenameEpisodeResourceMapper + { + public static RenameEpisodeResource ToResource(this NzbDrone.Core.MediaFiles.RenameEpisodeFilePreview model) + { + if (model == null) + { + return null; + } + + return new RenameEpisodeResource + { + Id = model.EpisodeFileId, + SeriesId = model.SeriesId, + SeasonNumber = model.SeasonNumber, + EpisodeNumbers = model.EpisodeNumbers.ToList(), + EpisodeFileId = model.EpisodeFileId, + ExistingPath = model.ExistingPath, + NewPath = model.NewPath + }; + } + + public static List ToResource(this IEnumerable models) + { + return models.Select(ToResource).ToList(); + } + } +}