aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs')
-rw-r--r--MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs61
1 files changed, 54 insertions, 7 deletions
diff --git a/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs b/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs
index 10e50e497..106e3c76b 100644
--- a/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs
+++ b/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs
@@ -5,10 +5,12 @@ using MediaBrowser.Controller.FileOrganization;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Extensions;
using MediaBrowser.Model.FileOrganization;
using MediaBrowser.Model.Logging;
-using MediaBrowser.Naming.Common;
using MediaBrowser.Naming.IO;
+using MediaBrowser.Server.Implementations.Library;
+using MediaBrowser.Server.Implementations.Logging;
using System;
using System.Collections.Generic;
using System.Globalization;
@@ -16,8 +18,6 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Server.Implementations.Library;
-using MediaBrowser.Server.Implementations.Logging;
namespace MediaBrowser.Server.Implementations.FileOrganization
{
@@ -202,15 +202,25 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
if (overwriteExisting)
{
+ var hasRenamedFiles = false;
+
foreach (var path in otherDuplicatePaths)
{
_logger.Debug("Removing duplicate episode {0}", path);
_libraryMonitor.ReportFileSystemChangeBeginning(path);
+ var renameRelatedFiles = !hasRenamedFiles &&
+ string.Equals(Path.GetDirectoryName(path), Path.GetDirectoryName(result.TargetPath), StringComparison.OrdinalIgnoreCase);
+
+ if (renameRelatedFiles)
+ {
+ hasRenamedFiles = true;
+ }
+
try
{
- _fileSystem.DeleteFile(path);
+ DeleteLibraryFile(path, renameRelatedFiles, result.TargetPath);
}
catch (IOException ex)
{
@@ -224,6 +234,43 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
}
}
+ private void DeleteLibraryFile(string path, bool renameRelatedFiles, string targetPath)
+ {
+ _fileSystem.DeleteFile(path);
+
+ if (!renameRelatedFiles)
+ {
+ return;
+ }
+
+ // Now find other files
+ var originalFilenameWithoutExtension = Path.GetFileNameWithoutExtension(path);
+ var directory = Path.GetDirectoryName(path);
+
+ if (!string.IsNullOrWhiteSpace(originalFilenameWithoutExtension) && !string.IsNullOrWhiteSpace(directory))
+ {
+ // Get all related files, e.g. metadata, images, etc
+ var files = Directory.EnumerateFiles(directory, "*", SearchOption.TopDirectoryOnly)
+ .Where(i => (Path.GetFileNameWithoutExtension(i) ?? string.Empty).StartsWith(originalFilenameWithoutExtension, StringComparison.OrdinalIgnoreCase))
+ .ToList();
+
+ var targetFilenameWithoutExtension = Path.GetFileNameWithoutExtension(targetPath);
+
+ foreach (var file in files)
+ {
+ directory = Path.GetDirectoryName(file);
+ var filename = Path.GetFileName(file);
+
+ filename = filename.Replace(originalFilenameWithoutExtension, targetFilenameWithoutExtension,
+ StringComparison.OrdinalIgnoreCase);
+
+ var destination = Path.Combine(directory, filename);
+
+ File.Move(file, destination);
+ }
+ }
+ }
+
private List<string> GetOtherDuplicatePaths(string targetPath, Series series, int seasonNumber, int episodeNumber, int? endingEpisodeNumber)
{
var episodePaths = series.GetRecursiveChildren()
@@ -281,11 +328,11 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
Directory.CreateDirectory(Path.GetDirectoryName(result.TargetPath));
- var copy = File.Exists(result.TargetPath);
+ var targetAlreadyExists = File.Exists(result.TargetPath);
try
{
- if (copy || options.CopyOriginalFile)
+ if (targetAlreadyExists || options.CopyOriginalFile)
{
File.Copy(result.OriginalPath, result.TargetPath, true);
}
@@ -312,7 +359,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
_libraryMonitor.ReportFileSystemChangeComplete(result.TargetPath, true);
}
- if (copy && !options.CopyOriginalFile)
+ if (targetAlreadyExists && !options.CopyOriginalFile)
{
try
{