diff --git a/code/Common/Configuration/DownloadCleaner/DownloadCleanerConfig.cs b/code/Common/Configuration/DownloadCleaner/DownloadCleanerConfig.cs index efd79f4..149de88 100644 --- a/code/Common/Configuration/DownloadCleaner/DownloadCleanerConfig.cs +++ b/code/Common/Configuration/DownloadCleaner/DownloadCleanerConfig.cs @@ -14,13 +14,13 @@ public sealed record DownloadCleanerConfig : IJobConfig [ConfigurationKeyName("DELETE_PRIVATE")] public bool DeletePrivate { get; init; } - [ConfigurationKeyName("NO_HARDLINKS_CATEGORY")] + [ConfigurationKeyName("NO_HL_CATEGORY")] public string NoHardlinksCategory { get; init; } = ""; - [ConfigurationKeyName("IGNORE_ROOT_DIR")] + [ConfigurationKeyName("NO_HL_IGNORE_ROOT_DIR")] public bool IgnoreRootDir { get; init; } - - [ConfigurationKeyName("HARDLINK_CATEGORIES")] + + [ConfigurationKeyName("NO_HL_CATEGORIES")] public List? HardlinkCategories { get; init; } public void Validate() diff --git a/code/Executable/appsettings.Development.json b/code/Executable/appsettings.Development.json index e273531..c5dfb66 100644 --- a/code/Executable/appsettings.Development.json +++ b/code/Executable/appsettings.Development.json @@ -45,8 +45,9 @@ "MAX_SEED_TIME": -1 } ], - "NO_HARDLINKS_CATEGORY": "nohardlinks", - "HARDLINK_CATEGORIES": [ + "NO_HL_CATEGORY": "nohardlinks", + "NO_HL_IGNORE_ROOT_DIR": false, + "NO_HL_CATEGORIES": [ "tv-sonarr", "radarr" ] diff --git a/code/Infrastructure/Verticals/DownloadClient/DownloadService.cs b/code/Infrastructure/Verticals/DownloadClient/DownloadService.cs index e5b26c1..f027167 100644 --- a/code/Infrastructure/Verticals/DownloadClient/DownloadService.cs +++ b/code/Infrastructure/Verticals/DownloadClient/DownloadService.cs @@ -1,4 +1,5 @@ using System.Collections.Concurrent; +using System.Diagnostics.CodeAnalysis; using System.Text.RegularExpressions; using Common.Configuration.ContentBlocker; using Common.Configuration.DownloadCleaner; @@ -145,6 +146,26 @@ public abstract class DownloadService : IDownloadService return new(); } + protected string? GetRootWithFirstDirectory(string path) + { + if (string.IsNullOrWhiteSpace(path)) + { + return null; + } + + string? root = Path.GetPathRoot(path); + + if (root is null) + { + return null; + } + + string relativePath = path[root.Length..].TrimStart(Path.DirectorySeparatorChar); + string[] parts = relativePath.Split(Path.DirectorySeparatorChar, StringSplitOptions.RemoveEmptyEntries); + + return parts.Length > 0 ? Path.Combine(root, parts[0]) : root; + } + private bool DownloadReachedRatio(double ratio, TimeSpan seedingTime, CleanCategory category) { if (category.MaxRatio < 0) diff --git a/code/Infrastructure/Verticals/DownloadClient/QBittorrent/QBitService.cs b/code/Infrastructure/Verticals/DownloadClient/QBittorrent/QBitService.cs index bea2709..64697e9 100644 --- a/code/Infrastructure/Verticals/DownloadClient/QBittorrent/QBitService.cs +++ b/code/Infrastructure/Verticals/DownloadClient/QBittorrent/QBitService.cs @@ -317,8 +317,24 @@ public class QBitService : DownloadService, IQBitService { downloads .Cast() - .GroupBy(x => Path.GetPathRoot(x.SavePath)) - .Select(x => x.Key) + .Select(x => + { + string? firstDir = GetRootWithFirstDirectory(x.SavePath); + + if (string.IsNullOrEmpty(firstDir)) + { + return string.Empty; + } + + if (firstDir == Path.GetPathRoot(x.SavePath)) + { + return string.Empty; + } + + return firstDir; + }) + .Where(x => !string.IsNullOrEmpty(x)) + .Distinct() .ToList() .ForEach(x => {