diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-01-21 01:10:58 -0500 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-01-21 01:10:58 -0500 |
| commit | 123528327974d9291f5868bb87a0d63437fa1ae5 (patch) | |
| tree | c201611062191638b47c0a60ed655acce20d1871 /MediaBrowser.Server.Implementations/FileOrganization | |
| parent | 92c76de2ba01608e37a3f7ba311d2711b2230dc8 (diff) | |
#680 - added auto organize page
Diffstat (limited to 'MediaBrowser.Server.Implementations/FileOrganization')
| -rw-r--r-- | MediaBrowser.Server.Implementations/FileOrganization/FileOrganizationService.cs | 95 | ||||
| -rw-r--r-- | MediaBrowser.Server.Implementations/FileOrganization/TvFileSorter.cs | 32 |
2 files changed, 110 insertions, 17 deletions
diff --git a/MediaBrowser.Server.Implementations/FileOrganization/FileOrganizationService.cs b/MediaBrowser.Server.Implementations/FileOrganization/FileOrganizationService.cs index bcbff7488..49037ef96 100644 --- a/MediaBrowser.Server.Implementations/FileOrganization/FileOrganizationService.cs +++ b/MediaBrowser.Server.Implementations/FileOrganization/FileOrganizationService.cs @@ -1,8 +1,14 @@ -using MediaBrowser.Common.ScheduledTasks; +using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.ScheduledTasks; using MediaBrowser.Controller.FileOrganization; +using MediaBrowser.Controller.IO; +using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.FileOrganization; +using MediaBrowser.Model.Logging; using MediaBrowser.Model.Querying; +using System; +using System.IO; using System.Threading; using System.Threading.Tasks; @@ -12,21 +18,33 @@ namespace MediaBrowser.Server.Implementations.FileOrganization { private readonly ITaskManager _taskManager; private readonly IFileOrganizationRepository _repo; + private readonly ILogger _logger; + private readonly IDirectoryWatchers _directoryWatchers; + private readonly ILibraryManager _libraryManager; - public FileOrganizationService(ITaskManager taskManager, IFileOrganizationRepository repo) + public FileOrganizationService(ITaskManager taskManager, IFileOrganizationRepository repo, ILogger logger, IDirectoryWatchers directoryWatchers, ILibraryManager libraryManager) { _taskManager = taskManager; _repo = repo; + _logger = logger; + _directoryWatchers = directoryWatchers; + _libraryManager = libraryManager; } public void BeginProcessNewFiles() { - _taskManager.CancelIfRunningAndQueue<OrganizerScheduledTask>(); + _taskManager.CancelIfRunningAndQueue<OrganizerScheduledTask>(); } - public Task SaveResult(FileOrganizationResult result, CancellationToken cancellationToken) { + if (result == null || string.IsNullOrEmpty(result.OriginalPath)) + { + throw new ArgumentNullException("result"); + } + + result.Id = (result.OriginalPath + (result.TargetPath ?? string.Empty)).GetMD5().ToString("N"); + return _repo.SaveResult(result, cancellationToken); } @@ -34,5 +52,74 @@ namespace MediaBrowser.Server.Implementations.FileOrganization { return _repo.GetResults(query); } + + public Task DeleteOriginalFile(string resultId) + { + var result = _repo.GetResult(resultId); + + _logger.Info("Requested to delete {0}", result.OriginalPath); + try + { + File.Delete(result.OriginalPath); + } + catch (Exception ex) + { + _logger.ErrorException("Error deleting {0}", ex, result.OriginalPath); + } + + return _repo.Delete(resultId); + } + + public async Task PerformOrganization(string resultId) + { + var result = _repo.GetResult(resultId); + + if (string.IsNullOrEmpty(result.TargetPath)) + { + throw new ArgumentException("No target path available."); + } + + _logger.Info("Moving {0} to {1}", result.OriginalPath, result.TargetPath); + + _directoryWatchers.TemporarilyIgnore(result.TargetPath); + + var copy = File.Exists(result.TargetPath); + + try + { + if (copy) + { + File.Copy(result.OriginalPath, result.TargetPath, true); + } + else + { + File.Move(result.OriginalPath, result.TargetPath); + } + } + finally + { + _directoryWatchers.RemoveTempIgnore(result.TargetPath); + } + + if (copy) + { + try + { + File.Delete(result.OriginalPath); + } + catch (Exception ex) + { + _logger.ErrorException("Error deleting {0}", ex, result.OriginalPath); + } + } + + result.Status = FileSortingStatus.Success; + result.StatusMessage = string.Empty; + + await SaveResult(result, CancellationToken.None).ConfigureAwait(false); + + await _libraryManager.ValidateMediaLibrary(new Progress<double>(), CancellationToken.None) + .ConfigureAwait(false); + } } } diff --git a/MediaBrowser.Server.Implementations/FileOrganization/TvFileSorter.cs b/MediaBrowser.Server.Implementations/FileOrganization/TvFileSorter.cs index e0efa0c3f..5aaad2ad9 100644 --- a/MediaBrowser.Server.Implementations/FileOrganization/TvFileSorter.cs +++ b/MediaBrowser.Server.Implementations/FileOrganization/TvFileSorter.cs @@ -1,5 +1,4 @@ -using System.Text; -using MediaBrowser.Common.IO; +using MediaBrowser.Common.IO; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.FileOrganization; using MediaBrowser.Controller.IO; @@ -15,6 +14,7 @@ using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; +using System.Text; using System.Threading; using System.Threading.Tasks; @@ -22,11 +22,11 @@ namespace MediaBrowser.Server.Implementations.FileOrganization { public class TvFileSorter { + private readonly IDirectoryWatchers _directoryWatchers; private readonly ILibraryManager _libraryManager; private readonly ILogger _logger; private readonly IFileSystem _fileSystem; private readonly IFileOrganizationService _iFileSortingRepository; - private readonly IDirectoryWatchers _directoryWatchers; private static readonly CultureInfo UsCulture = new CultureInfo("en-US"); @@ -67,7 +67,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization { var result = await SortFile(file.FullName, options, allSeries).ConfigureAwait(false); - if (result.Status == FileSortingStatus.Success) + if (result.Status == FileSortingStatus.Success && !options.EnableTrialMode) { scanLibrary = true; } @@ -142,7 +142,9 @@ namespace MediaBrowser.Server.Implementations.FileOrganization var result = new FileOrganizationResult { Date = DateTime.UtcNow, - OriginalPath = path + OriginalPath = path, + OriginalFileName = Path.GetFileName(path), + Type = FileOrganizerType.Episode }; var seriesName = TVUtils.GetSeriesNameFromEpisodeFile(path); @@ -166,7 +168,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization { var msg = string.Format("Unable to determine episode number from {0}", path); result.Status = FileSortingStatus.Failure; - result.ErrorMessage = msg; + result.StatusMessage = msg; _logger.Warn(msg); } } @@ -174,7 +176,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization { var msg = string.Format("Unable to determine season number from {0}", path); result.Status = FileSortingStatus.Failure; - result.ErrorMessage = msg; + result.StatusMessage = msg; _logger.Warn(msg); } } @@ -182,7 +184,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization { var msg = string.Format("Unable to determine series name from {0}", path); result.Status = FileSortingStatus.Failure; - result.ErrorMessage = msg; + result.StatusMessage = msg; _logger.Warn(msg); } @@ -203,13 +205,13 @@ namespace MediaBrowser.Server.Implementations.FileOrganization /// <param name="result">The result.</param> private void SortFile(string path, string seriesName, int seasonNumber, int episodeNumber, TvFileOrganizationOptions options, IEnumerable<Series> allSeries, FileOrganizationResult result) { - var series = GetMatchingSeries(seriesName, allSeries); + var series = GetMatchingSeries(seriesName, allSeries, result); if (series == null) { var msg = string.Format("Unable to find series in library matching name {0}", seriesName); result.Status = FileSortingStatus.Failure; - result.ErrorMessage = msg; + result.StatusMessage = msg; _logger.Warn(msg); return; } @@ -223,7 +225,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization { var msg = string.Format("Unable to sort {0} because target path could not be determined.", path); result.Status = FileSortingStatus.Failure; - result.ErrorMessage = msg; + result.StatusMessage = msg; _logger.Warn(msg); return; } @@ -273,7 +275,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization var errorMsg = string.Format("Failed to move file from {0} to {1}", result.OriginalPath, result.TargetPath); result.Status = FileSortingStatus.Failure; - result.ErrorMessage = errorMsg; + result.StatusMessage = errorMsg; _logger.ErrorException(errorMsg, ex); return; @@ -413,12 +415,15 @@ namespace MediaBrowser.Server.Implementations.FileOrganization /// <param name="seriesName">Name of the series.</param> /// <param name="allSeries">All series.</param> /// <returns>Series.</returns> - private Series GetMatchingSeries(string seriesName, IEnumerable<Series> allSeries) + private Series GetMatchingSeries(string seriesName, IEnumerable<Series> allSeries, FileOrganizationResult result) { int? yearInName; var nameWithoutYear = seriesName; NameParser.ParseName(nameWithoutYear, out nameWithoutYear, out yearInName); + result.ExtractedName = nameWithoutYear; + result.ExtractedYear = yearInName; + return allSeries.Select(i => GetMatchScore(nameWithoutYear, yearInName, i)) .Where(i => i.Item2 > 0) .OrderByDescending(i => i.Item2) @@ -473,6 +478,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization .Replace("&", " ") .Replace("!", " ") .Replace(",", " ") + .Replace("-", " ") .Replace(" a ", string.Empty) .Replace(" the ", string.Empty) .Replace(" ", string.Empty); |
