aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs
diff options
context:
space:
mode:
authorsoftworkz <softworkz@hotmail.com>2015-09-23 06:12:46 +0200
committersoftworkz <softworkz@hotmail.com>2016-02-05 05:21:25 +0100
commit3a868e28b3e3d9f0a13fc38c680047010d627b0f (patch)
tree4b9f71b825e4c0222b7becc4bee5c0cf2d2871ab /MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs
parentd28ef71d93ea7fe50343f82f575637307b4d74bf (diff)
Auto-Organize: Added feature to remember/persist series matching in manual organization dialog #2
When a filename cannot be auto-matched to an existing series name, the organization must be performed manually. Unfortunately not just once, but again and again for each episode coming in. This change proposes a simple but solid method to optionally persist the matching condition from within the manual organization dialog. This approach will make Emby "learn" how to organize files in the future without user interaction.
Diffstat (limited to 'MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs')
-rw-r--r--MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs69
1 files changed, 58 insertions, 11 deletions
diff --git a/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs b/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs
index 73cc5ab01..a952b60d5 100644
--- a/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs
+++ b/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs
@@ -46,12 +46,12 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
public Task<FileOrganizationResult> OrganizeEpisodeFile(string path, CancellationToken cancellationToken)
{
- var options = _config.GetAutoOrganizeOptions().TvOptions;
+ var options = _config.GetAutoOrganizeOptions();
return OrganizeEpisodeFile(path, options, false, cancellationToken);
}
- public async Task<FileOrganizationResult> OrganizeEpisodeFile(string path, TvFileOrganizationOptions options, bool overwriteExisting, CancellationToken cancellationToken)
+ public async Task<FileOrganizationResult> OrganizeEpisodeFile(string path, AutoOrganizeOptions options, bool overwriteExisting, CancellationToken cancellationToken)
{
_logger.Info("Sorting file {0}", path);
@@ -110,6 +110,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
premiereDate,
options,
overwriteExisting,
+ false,
result,
cancellationToken).ConfigureAwait(false);
}
@@ -145,7 +146,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
return result;
}
- public async Task<FileOrganizationResult> OrganizeWithCorrection(EpisodeFileOrganizationRequest request, TvFileOrganizationOptions options, CancellationToken cancellationToken)
+ public async Task<FileOrganizationResult> OrganizeWithCorrection(EpisodeFileOrganizationRequest request, AutoOrganizeOptions options, CancellationToken cancellationToken)
{
var result = _organizationService.GetResult(request.ResultId);
@@ -159,6 +160,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
null,
options,
true,
+ request.RememberCorrection,
result,
cancellationToken).ConfigureAwait(false);
@@ -173,12 +175,13 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
int? episodeNumber,
int? endingEpiosdeNumber,
DateTime? premiereDate,
- TvFileOrganizationOptions options,
+ AutoOrganizeOptions options,
bool overwriteExisting,
+ bool rememberCorrection,
FileOrganizationResult result,
CancellationToken cancellationToken)
{
- var series = GetMatchingSeries(seriesName, result);
+ var series = GetMatchingSeries(seriesName, result, options);
if (series == null)
{
@@ -197,6 +200,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
premiereDate,
options,
overwriteExisting,
+ rememberCorrection,
result,
cancellationToken);
}
@@ -207,15 +211,18 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
int? episodeNumber,
int? endingEpiosdeNumber,
DateTime? premiereDate,
- TvFileOrganizationOptions options,
+ AutoOrganizeOptions options,
bool overwriteExisting,
+ bool rememberCorrection,
FileOrganizationResult result,
CancellationToken cancellationToken)
{
_logger.Info("Sorting file {0} into series {1}", sourcePath, series.Path);
+ var originalExtractedSeriesString = result.ExtractedName;
+
// Proceed to sort the file
- var newPath = await GetNewPath(sourcePath, series, seasonNumber, episodeNumber, endingEpiosdeNumber, premiereDate, options, cancellationToken).ConfigureAwait(false);
+ var newPath = await GetNewPath(sourcePath, series, seasonNumber, episodeNumber, endingEpiosdeNumber, premiereDate, options.TvOptions, cancellationToken).ConfigureAwait(false);
if (string.IsNullOrEmpty(newPath))
{
@@ -234,7 +241,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
if (!overwriteExisting)
{
- if (options.CopyOriginalFile && fileExists && IsSameEpisode(sourcePath, newPath))
+ if (options.TvOptions.CopyOriginalFile && fileExists && IsSameEpisode(sourcePath, newPath))
{
_logger.Info("File {0} already copied to new path {1}, stopping organization", sourcePath, newPath);
result.Status = FileSortingStatus.SkippedExisting;
@@ -251,7 +258,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
}
}
- PerformFileSorting(options, result);
+ PerformFileSorting(options.TvOptions, result);
if (overwriteExisting)
{
@@ -285,6 +292,31 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
}
}
}
+
+ if (rememberCorrection)
+ {
+ SaveSmartMatchString(originalExtractedSeriesString, series, options);
+ }
+ }
+
+ private void SaveSmartMatchString(string matchString, Series series, AutoOrganizeOptions options)
+ {
+ SmartMatchInfo info = options.SmartMatchInfos.Find(i => i.Id == series.Id);
+
+ if (info == null)
+ {
+ info = new SmartMatchInfo();
+ info.Id = series.Id;
+ info.OrganizerType = FileOrganizerType.Episode;
+ info.Name = series.Name;
+ options.SmartMatchInfos.Add(info);
+ }
+
+ if (!info.MatchStrings.Contains(matchString, StringComparer.OrdinalIgnoreCase))
+ {
+ info.MatchStrings.Add(matchString);
+ _config.SaveAutoOrganizeOptions(options);
+ }
}
private void DeleteLibraryFile(string path, bool renameRelatedFiles, string targetPath)
@@ -435,7 +467,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
}
}
- private Series GetMatchingSeries(string seriesName, FileOrganizationResult result)
+ private Series GetMatchingSeries(string seriesName, FileOrganizationResult result, AutoOrganizeOptions options)
{
var parsedName = _libraryManager.ParseName(seriesName);
@@ -445,13 +477,28 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
result.ExtractedName = nameWithoutYear;
result.ExtractedYear = yearInName;
- return _libraryManager.RootFolder.GetRecursiveChildren(i => i is Series)
+ var series = _libraryManager.RootFolder.GetRecursiveChildren(i => i is Series)
.Cast<Series>()
.Select(i => NameUtils.GetMatchScore(nameWithoutYear, yearInName, i))
.Where(i => i.Item2 > 0)
.OrderByDescending(i => i.Item2)
.Select(i => i.Item1)
.FirstOrDefault();
+
+ if (series == null)
+ {
+ SmartMatchInfo info = options.SmartMatchInfos.Where(e => e.MatchStrings.Contains(seriesName, StringComparer.OrdinalIgnoreCase)).FirstOrDefault();
+
+ if (info != null)
+ {
+ series = _libraryManager.RootFolder.GetRecursiveChildren(i => i is Series)
+ .Cast<Series>()
+ .Where(i => i.Id == info.Id)
+ .FirstOrDefault();
+ }
+ }
+
+ return series ?? new Series();
}
/// <summary>