diff --git a/frontend/src/Components/Form/FormInputButton.tsx b/frontend/src/Components/Form/FormInputButton.tsx index f617791221..e5149ab14e 100644 --- a/frontend/src/Components/Form/FormInputButton.tsx +++ b/frontend/src/Components/Form/FormInputButton.tsx @@ -14,13 +14,14 @@ function FormInputButton({ className = styles.button, canSpin = false, isLastButton = true, + kind = kinds.PRIMARY, ...otherProps }: FormInputButtonProps) { if (canSpin) { return ( ); @@ -29,7 +30,7 @@ function FormInputButton({ return ( + + + + + ); +} + +export default RootFolderModalContent; diff --git a/frontend/src/Movie/Index/Select/Edit/EditMoviesModalContent.tsx b/frontend/src/Movie/Index/Select/Edit/EditMoviesModalContent.tsx index 09a6414e7f..6736943209 100644 --- a/frontend/src/Movie/Index/Select/Edit/EditMoviesModalContent.tsx +++ b/frontend/src/Movie/Index/Select/Edit/EditMoviesModalContent.tsx @@ -203,7 +203,7 @@ function EditMoviesModalContent(props: EditMoviesModalContentProps) { includeNoChange={true} includeNoChangeDisabled={false} selectedValueOptions={{ includeFreeSpace: false }} - helpText="Moving movies to the same root folder can be used to rename movie folders to match updated title or naming format" + helpText={translate('MovieEditRootFolderHelpText')} onChange={onInputChange} /> diff --git a/frontend/src/Movie/Movie.ts b/frontend/src/Movie/Movie.ts index d261f04eb0..6946fb41d4 100644 --- a/frontend/src/Movie/Movie.ts +++ b/frontend/src/Movie/Movie.ts @@ -68,6 +68,7 @@ interface Movie extends ModelBase { physicalRelease?: string; digitalRelease?: string; releaseDate?: string; + rootFolderPath: string; runtime: number; minimumAvailability: string; path: string; diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 86460577d9..06594cf015 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -1114,6 +1114,7 @@ "MovieCollectionRootFolderMissingRootHealthCheckMessage": "Missing root folder for movie collection: {rootFolderInfo}", "MovieDetailsGoTo": "Go to {0}", "MovieDownloaded": "Movie Downloaded", + "MovieEditRootFolderHelpText": "Moving movies to the same root folder can be used to rename movie folders to match updated title or naming format", "MovieEditor": "Movie Editor", "MovieExcludedFromAutomaticAdd": "Movie Excluded From Automatic Add", "MovieFileDeleted": "Movie File Deleted", @@ -1949,6 +1950,8 @@ "UpdateCheckUINotWritableMessage": "Cannot install update because UI folder '{uiFolder}' is not writable by the user '{userName}'.", "UpdateFiltered": "Update Filtered", "UpdateMechanismHelpText": "Use {appName}'s built-in updater or a script", + "UpdateMoviePath": "Update Movie Path", + "UpdatePath": "Update Path", "UpdateScriptPathHelpText": "Path to a custom script that takes an extracted update package and handle the remainder of the update process", "UpdateSelected": "Update Selected", "UpdaterLogFiles": "Updater Log Files", diff --git a/src/NzbDrone.Core/RootFolders/RootFolderService.cs b/src/NzbDrone.Core/RootFolders/RootFolderService.cs index fd6ccb9b14..3277a16071 100644 --- a/src/NzbDrone.Core/RootFolders/RootFolderService.cs +++ b/src/NzbDrone.Core/RootFolders/RootFolderService.cs @@ -236,10 +236,10 @@ private string GetBestRootFolderPathInternal(string path, List rootF { var osPath = new OsPath(path); - return osPath.Directory.ToString().TrimEnd(osPath.IsUnixPath ? '/' : '\\'); + return osPath.Directory.ToString().GetCleanPath(); } - return possibleRootFolder.Path; + return possibleRootFolder.Path.GetCleanPath(); } } } diff --git a/src/Radarr.Api.V3/Movies/MovieFolderController.cs b/src/Radarr.Api.V3/Movies/MovieFolderController.cs new file mode 100644 index 0000000000..a1ddfd2109 --- /dev/null +++ b/src/Radarr.Api.V3/Movies/MovieFolderController.cs @@ -0,0 +1,32 @@ +using Microsoft.AspNetCore.Mvc; +using NzbDrone.Core.Movies; +using NzbDrone.Core.Organizer; +using Radarr.Http; + +namespace Radarr.Api.V3.Movies; + +[V3ApiController("movie")] +public class MovieFolderController : Controller +{ + private readonly IMovieService _movieService; + private readonly IBuildFileNames _fileNameBuilder; + + public MovieFolderController(IMovieService movieService, IBuildFileNames fileNameBuilder) + { + _movieService = movieService; + _fileNameBuilder = fileNameBuilder; + } + + [HttpGet("{id}/folder")] + [Produces("application/json")] + public object GetFolder([FromRoute] int id) + { + var series = _movieService.GetMovie(id); + var folder = _fileNameBuilder.GetMovieFolder(series); + + return new + { + folder + }; + } +}