diff --git a/.gitignore b/.gitignore index 20a039d..2747a60 100644 --- a/.gitignore +++ b/.gitignore @@ -230,3 +230,4 @@ pip-log.txt .mr.developer.cfg .idea +.history \ No newline at end of file diff --git a/AutoOrganize/AutoOrganize.csproj b/AutoOrganize/AutoOrganize.csproj index a61f267..79833fa 100644 --- a/AutoOrganize/AutoOrganize.csproj +++ b/AutoOrganize/AutoOrganize.csproj @@ -2,8 +2,8 @@ net6.0 - 9.0.0.0 - 9.0.0.0 + 10.0.0.0 + 10.0.0.0 true AllEnabledByDefault ../jellyfin.ruleset @@ -14,41 +14,41 @@ - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - + + + + - + diff --git a/AutoOrganize/Core/EpisodeFileOrganizer.cs b/AutoOrganize/Core/EpisodeFileOrganizer.cs index 51da6d9..c2a9123 100644 --- a/AutoOrganize/Core/EpisodeFileOrganizer.cs +++ b/AutoOrganize/Core/EpisodeFileOrganizer.cs @@ -9,6 +9,7 @@ using AutoOrganize.Model; using Emby.Naming.Common; using Emby.Naming.TV; +using Emby.Naming.Video; using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; @@ -34,8 +35,7 @@ public class EpisodeFileOrganizer private readonly IFileSystem _fileSystem; private readonly IFileOrganizationService _organizationService; private readonly IProviderManager _providerManager; - - private NamingOptions _namingOptions; + private readonly NamingOptions _namingOptions; /// /// Initializes a new instance of the class. @@ -47,7 +47,8 @@ public EpisodeFileOrganizer( ILogger logger, ILibraryManager libraryManager, ILibraryMonitor libraryMonitor, - IProviderManager providerManager) + IProviderManager providerManager, + NamingOptions namingOptions) { _organizationService = organizationService; _fileSystem = fileSystem; @@ -55,16 +56,11 @@ public EpisodeFileOrganizer( _libraryManager = libraryManager; _libraryMonitor = libraryMonitor; _providerManager = providerManager; + _namingOptions = namingOptions; } private FileOrganizerType CurrentFileOrganizerType => FileOrganizerType.Episode; - private NamingOptions GetNamingOptionsInternal() - { - _namingOptions = _namingOptions ?? new NamingOptions(); - return _namingOptions; - } - /// /// Organize an episode file. /// @@ -98,8 +94,7 @@ public async Task OrganizeEpisodeFile( return result; } - var namingOptions = GetNamingOptionsInternal(); - var resolver = new EpisodeResolver(namingOptions); + var resolver = new EpisodeResolver(_namingOptions); var episodeInfo = resolver.Resolve(path, false) ?? new Emby.Naming.TV.EpisodeInfo(string.Empty); @@ -691,7 +686,7 @@ private List GetOtherDuplicatePaths( try { var filesOfOtherExtensions = _fileSystem.GetFilePaths(folder) - .Where(i => _libraryManager.IsVideoFile(i) && string.Equals(Path.GetFileNameWithoutExtension(i), targetFileNameWithoutExtension, StringComparison.OrdinalIgnoreCase)); + .Where(i => VideoResolver.IsVideoFile(i, _namingOptions) && string.Equals(Path.GetFileNameWithoutExtension(i), targetFileNameWithoutExtension, StringComparison.OrdinalIgnoreCase)); episodePaths.AddRange(filesOfOtherExtensions); } diff --git a/AutoOrganize/Core/FileOrganizationService.cs b/AutoOrganize/Core/FileOrganizationService.cs index 1187cad..5242c1e 100644 --- a/AutoOrganize/Core/FileOrganizationService.cs +++ b/AutoOrganize/Core/FileOrganizationService.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using AutoOrganize.Data; using AutoOrganize.Model; +using Emby.Naming.Common; using MediaBrowser.Common.Extensions; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Library; @@ -30,6 +31,7 @@ public class FileOrganizationService : IFileOrganizationService private readonly IFileSystem _fileSystem; private readonly IProviderManager _providerManager; private readonly ConcurrentDictionary _inProgressItemIds = new ConcurrentDictionary(); + private readonly NamingOptions _namingOptions; /// /// Initializes a new instance of the class. @@ -54,6 +56,7 @@ public FileOrganizationService( _config = config; _fileSystem = fileSystem; _providerManager = providerManager; + _namingOptions = new NamingOptions(); } /// @@ -175,7 +178,8 @@ public async Task PerformOrganization(string resultId) _loggerFactory.CreateLogger(), _libraryManager, _libraryMonitor, - _providerManager); + _providerManager, + _namingOptions); organizeResult = await episodeOrganizer.OrganizeEpisodeFile(result.OriginalPath, options.TvOptions, CancellationToken.None) .ConfigureAwait(false); break; @@ -186,7 +190,8 @@ public async Task PerformOrganization(string resultId) _loggerFactory.CreateLogger(), _libraryManager, _libraryMonitor, - _providerManager); + _providerManager, + _namingOptions); organizeResult = await movieOrganizer.OrganizeMovieFile(result.OriginalPath, options.MovieOptions, true, CancellationToken.None) .ConfigureAwait(false); break; @@ -221,7 +226,8 @@ public async Task PerformOrganization(EpisodeFileOrganizationRequest request) _loggerFactory.CreateLogger(), _libraryManager, _libraryMonitor, - _providerManager); + _providerManager, + _namingOptions); var options = _config.GetAutoOrganizeOptions(); var result = await organizer.OrganizeWithCorrection(request, options.TvOptions, CancellationToken.None).ConfigureAwait(false); @@ -241,7 +247,8 @@ public async Task PerformOrganization(MovieFileOrganizationRequest request) _loggerFactory.CreateLogger(), _libraryManager, _libraryMonitor, - _providerManager); + _providerManager, + _namingOptions); var options = _config.GetAutoOrganizeOptions(); var result = await organizer.OrganizeWithCorrection(request, options.MovieOptions, CancellationToken.None).ConfigureAwait(false); diff --git a/AutoOrganize/Core/MovieFileOrganizer.cs b/AutoOrganize/Core/MovieFileOrganizer.cs index de5afed..db2bb77 100644 --- a/AutoOrganize/Core/MovieFileOrganizer.cs +++ b/AutoOrganize/Core/MovieFileOrganizer.cs @@ -29,7 +29,7 @@ public class MovieFileOrganizer private readonly IFileSystem _fileSystem; private readonly IFileOrganizationService _organizationService; private readonly IProviderManager _providerManager; - private NamingOptions _namingOptions; + private readonly NamingOptions _namingOptions; /// /// Initializes a new instance of the class. @@ -41,7 +41,8 @@ public MovieFileOrganizer( ILogger logger, ILibraryManager libraryManager, ILibraryMonitor libraryMonitor, - IProviderManager providerManager) + IProviderManager providerManager, + NamingOptions namingOptions) { _organizationService = organizationService; _fileSystem = fileSystem; @@ -49,6 +50,7 @@ public MovieFileOrganizer( _libraryManager = libraryManager; _libraryMonitor = libraryMonitor; _providerManager = providerManager; + _namingOptions = namingOptions; } private FileOrganizerType CurrentFileOrganizerType => FileOrganizerType.Movie; @@ -88,8 +90,6 @@ public async Task OrganizeMovieFile( return result; } - _namingOptions ??= new NamingOptions(); - var movieInfo = VideoResolver.Resolve(path, false, _namingOptions); if (!string.IsNullOrEmpty(movieInfo?.Name)) { diff --git a/AutoOrganize/Core/MovieFolderOrganizer.cs b/AutoOrganize/Core/MovieFolderOrganizer.cs index 4e1da07..bdfeabc 100644 --- a/AutoOrganize/Core/MovieFolderOrganizer.cs +++ b/AutoOrganize/Core/MovieFolderOrganizer.cs @@ -6,6 +6,8 @@ using System.Threading; using System.Threading.Tasks; using AutoOrganize.Model; +using Emby.Naming.Common; +using Emby.Naming.Video; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.IO; @@ -25,6 +27,7 @@ public class MovieFolderOrganizer private readonly IFileSystem _fileSystem; private readonly IFileOrganizationService _organizationService; private readonly IProviderManager _providerManager; + private readonly NamingOptions _namingOptions; /// /// Initializes a new instance of the class. @@ -36,7 +39,8 @@ public MovieFolderOrganizer( IFileSystem fileSystem, ILibraryMonitor libraryMonitor, IFileOrganizationService organizationService, - IProviderManager providerManager) + IProviderManager providerManager, + NamingOptions namingOptions) { _libraryManager = libraryManager; _loggerFactory = loggerFactory; @@ -45,6 +49,7 @@ public MovieFolderOrganizer( _libraryMonitor = libraryMonitor; _organizationService = organizationService; _providerManager = providerManager; + _namingOptions = namingOptions; } private bool CanOrganize(FileSystemMetadata fileInfo, MovieFileOrganizationOptions options) @@ -53,7 +58,7 @@ private bool CanOrganize(FileSystemMetadata fileInfo, MovieFileOrganizationOptio try { - return _libraryManager.IsVideoFile(fileInfo.FullName) && fileInfo.Length >= minFileBytes; + return VideoResolver.IsVideoFile(fileInfo.FullName, _namingOptions) && fileInfo.Length >= minFileBytes; } catch (Exception ex) { @@ -116,7 +121,8 @@ public async Task Organize( _loggerFactory.CreateLogger(), _libraryManager, _libraryMonitor, - _providerManager); + _providerManager, + _namingOptions); foreach (var file in eligibleFiles) { diff --git a/AutoOrganize/Core/OrganizerScheduledTask.cs b/AutoOrganize/Core/OrganizerScheduledTask.cs index 2be827b..c8d65b3 100644 --- a/AutoOrganize/Core/OrganizerScheduledTask.cs +++ b/AutoOrganize/Core/OrganizerScheduledTask.cs @@ -3,6 +3,7 @@ using System.Diagnostics.CodeAnalysis; using System.Threading; using System.Threading.Tasks; +using Emby.Naming.Common; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; @@ -24,6 +25,7 @@ public class OrganizerScheduledTask : IScheduledTask, IConfigurableScheduledTask private readonly IFileSystem _fileSystem; private readonly IServerConfigurationManager _config; private readonly IProviderManager _providerManager; + private readonly NamingOptions _namingOptions; /// /// Initializes a new instance of the class. @@ -44,6 +46,7 @@ public OrganizerScheduledTask( _fileSystem = fileSystem; _config = config; _providerManager = providerManager; + _namingOptions = new NamingOptions(); } /// @@ -89,7 +92,8 @@ public async Task Execute(CancellationToken cancellationToken, IProgress _fileSystem, _libraryMonitor, fileOrganizationService, - _providerManager) + _providerManager, + _namingOptions) .Organize(options.TvOptions, progress, cancellationToken).ConfigureAwait(false); } @@ -98,7 +102,14 @@ public async Task Execute(CancellationToken cancellationToken, IProgress queueMovie = options.MovieOptions.QueueLibraryScan; var fileOrganizationService = PluginEntryPoint.Current.FileOrganizationService; - await new MovieFolderOrganizer(_libraryManager, _loggerFactory, _fileSystem, _libraryMonitor, fileOrganizationService, _providerManager) + await new MovieFolderOrganizer( + _libraryManager, + _loggerFactory, + _fileSystem, + _libraryMonitor, + fileOrganizationService, + _providerManager, + _namingOptions) .Organize(options.MovieOptions, progress, cancellationToken).ConfigureAwait(false); } diff --git a/AutoOrganize/Core/TvFolderOrganizer.cs b/AutoOrganize/Core/TvFolderOrganizer.cs index 93385e2..0c17739 100644 --- a/AutoOrganize/Core/TvFolderOrganizer.cs +++ b/AutoOrganize/Core/TvFolderOrganizer.cs @@ -6,6 +6,8 @@ using System.Threading; using System.Threading.Tasks; using AutoOrganize.Model; +using Emby.Naming.Common; +using Emby.Naming.Video; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.IO; @@ -25,6 +27,7 @@ public class TvFolderOrganizer private readonly IFileSystem _fileSystem; private readonly IFileOrganizationService _organizationService; private readonly IProviderManager _providerManager; + private readonly NamingOptions _namingOptions; /// /// Initializes a new instance of the class. @@ -36,7 +39,8 @@ public TvFolderOrganizer( IFileSystem fileSystem, ILibraryMonitor libraryMonitor, IFileOrganizationService organizationService, - IProviderManager providerManager) + IProviderManager providerManager, + NamingOptions namingOptions) { _libraryManager = libraryManager; _loggerFactory = loggerFactory; @@ -45,6 +49,7 @@ public TvFolderOrganizer( _libraryMonitor = libraryMonitor; _organizationService = organizationService; _providerManager = providerManager; + _namingOptions = namingOptions; } private bool EnableOrganization(FileSystemMetadata fileInfo, TvFileOrganizationOptions options) @@ -53,7 +58,7 @@ private bool EnableOrganization(FileSystemMetadata fileInfo, TvFileOrganizationO try { - return _libraryManager.IsVideoFile(fileInfo.FullName) && fileInfo.Length >= minFileBytes; + return VideoResolver.IsVideoFile(fileInfo.FullName, _namingOptions) && fileInfo.Length >= minFileBytes; } catch (Exception ex) { @@ -116,7 +121,8 @@ public async Task Organize( _loggerFactory.CreateLogger(), _libraryManager, _libraryMonitor, - _providerManager); + _providerManager, + _namingOptions); foreach (var file in eligibleFiles) { diff --git a/AutoOrganize/Web/autoorganizemovie.js b/AutoOrganize/Web/autoorganizemovie.js index 6f34e18..8aefddb 100644 --- a/AutoOrganize/Web/autoorganizemovie.js +++ b/AutoOrganize/Web/autoorganizemovie.js @@ -76,7 +76,7 @@ function onSubmit(view) { const watchLocation = view.querySelector('#txtWatchMovieFolder').value; movieOptions.WatchLocations = watchLocation ? [watchLocation] : []; - movieOptions.CopyOriginalFile = view.querySelector('#copyOrMoveMovieFile').value; + movieOptions.CopyOriginalFile = view.querySelector('#copyOrMoveMovieFile').value === 'true'; movieOptions.QueueLibraryScan = view.querySelector('#chkQueueLibScan').checked; diff --git a/AutoOrganize/Web/autoorganizetv.js b/AutoOrganize/Web/autoorganizetv.js index 03591a1..84d6e33 100644 --- a/AutoOrganize/Web/autoorganizetv.js +++ b/AutoOrganize/Web/autoorganizetv.js @@ -95,7 +95,7 @@ function onSubmit(view) { const watchLocation = view.querySelector('#txtWatchFolder').value; tvOptions.WatchLocations = watchLocation ? [watchLocation] : []; - tvOptions.CopyOriginalFile = view.querySelector('#copyOrMoveFile').value; + tvOptions.CopyOriginalFile = view.querySelector('#copyOrMoveFile').value === 'true'; tvOptions.QueueLibraryScan = view.querySelector('#chkQueueLibScan').checked;