diff --git a/frontend/src/Settings/MediaManagement/MediaManagement.tsx b/frontend/src/Settings/MediaManagement/MediaManagement.tsx index 6547415336..b5a860aff7 100644 --- a/frontend/src/Settings/MediaManagement/MediaManagement.tsx +++ b/frontend/src/Settings/MediaManagement/MediaManagement.tsx @@ -93,6 +93,18 @@ const fileDateOptions: EnhancedSelectInputValue[] = [ return translate('PhysicalReleaseDate'); }, }, + { + key: 'first', + get value() { + return translate('FirstImportedDate'); + }, + }, + { + key: 'tracked', + get value() { + return translate('TrackedDate'); + }, + }, ]; function MediaManagement() { diff --git a/src/NzbDrone.Core/History/HistoryRepository.cs b/src/NzbDrone.Core/History/HistoryRepository.cs index 84a67f3b06..666a33ecf3 100644 --- a/src/NzbDrone.Core/History/HistoryRepository.cs +++ b/src/NzbDrone.Core/History/HistoryRepository.cs @@ -17,6 +17,7 @@ public interface IHistoryRepository : IBasicRepository List FindDownloadHistory(int movieId, QualityModel quality); List GetByMovieId(int movieId, MovieHistoryEventType? eventType); void DeleteForMovies(List movieIds); + MovieHistory FirstForMovie(int movieId); MovieHistory MostRecentForMovie(int movieId); List Since(DateTime date, MovieHistoryEventType? eventType); PagingSpec GetPaged(PagingSpec pagingSpec, int[] languages, int[] qualities); @@ -75,6 +76,11 @@ public void DeleteForMovies(List movieIds) Delete(c => movieIds.Contains(c.MovieId)); } + public MovieHistory FirstForMovie(int movieId) + { + return Query(x => x.MovieId == movieId).MinBy(h => h.Date); + } + public MovieHistory MostRecentForMovie(int movieId) { return Query(x => x.MovieId == movieId).MaxBy(h => h.Date); diff --git a/src/NzbDrone.Core/History/HistoryService.cs b/src/NzbDrone.Core/History/HistoryService.cs index c4b097739b..178da63cd8 100644 --- a/src/NzbDrone.Core/History/HistoryService.cs +++ b/src/NzbDrone.Core/History/HistoryService.cs @@ -20,6 +20,7 @@ public interface IHistoryService { QualityModel GetBestQualityInHistory(QualityProfile profile, int movieId); PagingSpec Paged(PagingSpec pagingSpec, int[] languages, int[] qualities); + MovieHistory FirstForMovie(int movieId); MovieHistory MostRecentForMovie(int movieId); MovieHistory MostRecentForDownloadId(string downloadId); MovieHistory Get(int historyId); @@ -54,6 +55,11 @@ public PagingSpec Paged(PagingSpec pagingSpec, int[] return _historyRepository.GetPaged(pagingSpec, languages, qualities); } + public MovieHistory FirstForMovie(int movieId) + { + return _historyRepository.FirstForMovie(movieId); + } + public MovieHistory MostRecentForMovie(int movieId) { return _historyRepository.MostRecentForMovie(movieId); diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 23a3b71ab8..ad27d3d0f4 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -700,6 +700,7 @@ "Filters": "Filters", "FilterMoviePropertiesOnlyNotFileWarning": "Filters are available only for the properties of a movie, they are not available for properties of the file(s) you may have for that movie.", "FirstDayOfWeek": "First Day of Week", + "FirstImportedDate": "First Imported Date", "Fixed": "Fixed", "Folder": "Folder", "FolderNameTokens": "Folder Name Tokens", @@ -1932,6 +1933,7 @@ "TotalSpace": "Total Space", "Trace": "Trace", "Trailer": "Trailer", + "TrackedDate": "Tracked Date", "Trakt": "Trakt", "TraktRating": "Trakt Rating", "TraktVotes": "Trakt Votes", diff --git a/src/NzbDrone.Core/MediaFiles/FileDateType.cs b/src/NzbDrone.Core/MediaFiles/FileDateType.cs index 45a8711b9d..6d07857d57 100644 --- a/src/NzbDrone.Core/MediaFiles/FileDateType.cs +++ b/src/NzbDrone.Core/MediaFiles/FileDateType.cs @@ -4,6 +4,8 @@ public enum FileDateType { None = 0, Cinemas = 1, - Release = 2 + Release = 2, + First = 3, + Tracked = 4 } } diff --git a/src/NzbDrone.Core/MediaFiles/UpdateMovieFileService.cs b/src/NzbDrone.Core/MediaFiles/UpdateMovieFileService.cs index 58691bb1aa..450e52b7e2 100644 --- a/src/NzbDrone.Core/MediaFiles/UpdateMovieFileService.cs +++ b/src/NzbDrone.Core/MediaFiles/UpdateMovieFileService.cs @@ -6,6 +6,7 @@ using NzbDrone.Common.Disk; using NzbDrone.Common.Instrumentation.Extensions; using NzbDrone.Core.Configuration; +using NzbDrone.Core.History; using NzbDrone.Core.MediaFiles.Events; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Movies; @@ -23,16 +24,19 @@ public class UpdateMovieFileService : IUpdateMovieFileService, private readonly IDiskProvider _diskProvider; private readonly IConfigService _configService; private readonly IMediaFileService _mediaFileService; + private readonly IHistoryService _historyService; private readonly Logger _logger; public UpdateMovieFileService(IDiskProvider diskProvider, IConfigService configService, IMediaFileService mediaFileService, + IHistoryService historyService, Logger logger) { _diskProvider = diskProvider; _configService = configService; _mediaFileService = mediaFileService; + _historyService = historyService; _logger = logger; } @@ -70,6 +74,17 @@ private bool ChangeFileDate(MovieFile movieFile, Movie movie) return ChangeFileDate(movieFilePath, airDate.Value); } + + case FileDateType.First: + { + var firstMovieHistory = _historyService.FirstForMovie(movie.Id); + return ChangeFileDate(movieFilePath, firstMovieHistory.Date); + } + + case FileDateType.Tracked: + { + return ChangeFileDate(movieFilePath, movie.Added); + } } return false;