From efbf60dcdd61d608a2e4e2e4fcd97c0c12109497 Mon Sep 17 00:00:00 2001 From: Flaminel Date: Wed, 22 Oct 2025 23:45:05 +0300 Subject: [PATCH] Add option to remove only specified failed import message patterns (#297) --- .../Cleanuparr.Domain/Enums/PatternMode.cs | 14 + .../Features/Arr/ArrClient.cs | 43 +- .../Cleanuparr.Persistence/DataContext.cs | 7 +- ...18_AddFailedImportTypeHandling.Designer.cs | 751 ++++++++++++++++++ ...50906183018_AddFailedImportTypeHandling.cs | 49 ++ .../Data/DataContextModelSnapshot.cs | 15 +- .../QueueCleaner/FailedImportConfig.cs | 8 +- .../core/services/documentation.service.ts | 3 +- .../queue-cleaner-settings.component.html | 37 +- .../queue-cleaner-settings.component.ts | 19 +- .../models/queue-cleaner-config.model.ts | 8 +- .../configuration/queue-cleaner/index.mdx | 24 +- docs/static/img/failed-import-patterns.png | Bin 0 -> 64411 bytes 13 files changed, 936 insertions(+), 42 deletions(-) create mode 100644 code/backend/Cleanuparr.Domain/Enums/PatternMode.cs create mode 100644 code/backend/Cleanuparr.Persistence/Migrations/Data/20250906183018_AddFailedImportTypeHandling.Designer.cs create mode 100644 code/backend/Cleanuparr.Persistence/Migrations/Data/20250906183018_AddFailedImportTypeHandling.cs create mode 100644 docs/static/img/failed-import-patterns.png diff --git a/code/backend/Cleanuparr.Domain/Enums/PatternMode.cs b/code/backend/Cleanuparr.Domain/Enums/PatternMode.cs new file mode 100644 index 00000000..b4ee6b0a --- /dev/null +++ b/code/backend/Cleanuparr.Domain/Enums/PatternMode.cs @@ -0,0 +1,14 @@ +namespace Cleanuparr.Domain.Enums; + +public enum PatternMode +{ + /// + /// Delete all except those that match the patterns + /// + Exclude, + + /// + /// Delete only those that match the patterns + /// + Include +} \ No newline at end of file diff --git a/code/backend/Cleanuparr.Infrastructure/Features/Arr/ArrClient.cs b/code/backend/Cleanuparr.Infrastructure/Features/Arr/ArrClient.cs index e8e7fb78..279a798d 100644 --- a/code/backend/Cleanuparr.Infrastructure/Features/Arr/ArrClient.cs +++ b/code/backend/Cleanuparr.Infrastructure/Features/Arr/ArrClient.cs @@ -91,9 +91,8 @@ public abstract class ArrClient : IArrClient if (hasWarn() && (isImportBlocked() || isImportPending() || isImportFailed()) || isFailedLidarr()) { - if (HasIgnoredPatterns(record)) + if (!ShouldStrikeFailedImport(queueCleanerConfig, record)) { - _logger.LogDebug("skip failed import check | contains ignored pattern | {name}", record.Title); return false; } @@ -212,19 +211,14 @@ public abstract class ArrClient : IArrClient return response; } - private static bool HasIgnoredPatterns(QueueRecord record) + /// + /// Determines whether the failed import record should be skipped + /// + private bool ShouldStrikeFailedImport(QueueCleanerConfig queueCleanerConfig, QueueRecord record) { - var queueCleanerConfig = ContextProvider.Get(); - - if (queueCleanerConfig.FailedImport.IgnoredPatterns.Count is 0) - { - // no patterns are configured - return false; - } - if (record.StatusMessages?.Count is null or 0) { - // no status message found + _logger.LogWarning("skip failed import check | no status message found | {name}", record.Title); return false; } @@ -235,10 +229,29 @@ public abstract class ArrClient : IArrClient .ToList() .ForEach(x => messages.Add(x)); - return messages.Any( - m => queueCleanerConfig.FailedImport.IgnoredPatterns.Any( - p => !string.IsNullOrWhiteSpace(p.Trim()) && m.Contains(p, StringComparison.InvariantCultureIgnoreCase) + var patterns = queueCleanerConfig.FailedImport.Patterns; + var patternMode = queueCleanerConfig.FailedImport.PatternMode; + + var matched = messages.Any( + m => patterns.Any( + p => !string.IsNullOrWhiteSpace(p?.Trim()) && m.Contains(p, StringComparison.InvariantCultureIgnoreCase) ) ); + + if (patternMode is PatternMode.Exclude && matched) + { + // contains an excluded/ignored pattern -> skip + _logger.LogTrace("skip failed import check | excluded pattern matched | {name}", record.Title); + return false; + } + + if (patternMode is PatternMode.Include && (!matched || patterns.Count is 0)) + { + // does not match any included patterns -> skip + _logger.LogTrace("skip failed import check | no included pattern matched | {name}", record.Title); + return false; + } + + return true; } } \ No newline at end of file diff --git a/code/backend/Cleanuparr.Persistence/DataContext.cs b/code/backend/Cleanuparr.Persistence/DataContext.cs index 93bd170c..70106743 100644 --- a/code/backend/Cleanuparr.Persistence/DataContext.cs +++ b/code/backend/Cleanuparr.Persistence/DataContext.cs @@ -87,9 +87,10 @@ public class DataContext : DbContext modelBuilder.Entity(entity => { - entity.ComplexProperty(e => e.FailedImport); - // entity.ComplexProperty(e => e.Stalled); - // entity.ComplexProperty(e => e.Slow); + entity.ComplexProperty(e => e.FailedImport, cp => + { + cp.Property(x => x.PatternMode).HasConversion>(); + }); }); modelBuilder.Entity(entity => diff --git a/code/backend/Cleanuparr.Persistence/Migrations/Data/20250906183018_AddFailedImportTypeHandling.Designer.cs b/code/backend/Cleanuparr.Persistence/Migrations/Data/20250906183018_AddFailedImportTypeHandling.Designer.cs new file mode 100644 index 00000000..7a2eff3d --- /dev/null +++ b/code/backend/Cleanuparr.Persistence/Migrations/Data/20250906183018_AddFailedImportTypeHandling.Designer.cs @@ -0,0 +1,751 @@ +// +using System; +using System.Collections.Generic; +using Cleanuparr.Persistence; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Cleanuparr.Persistence.Migrations.Data +{ + [DbContext(typeof(DataContext))] + [Migration("20250906183018_AddFailedImportTypeHandling")] + partial class AddFailedImportTypeHandling + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "9.0.6"); + + modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Arr.ArrConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("id"); + + b.Property("FailedImportMaxStrikes") + .HasColumnType("INTEGER") + .HasColumnName("failed_import_max_strikes"); + + b.Property("Type") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("type"); + + b.HasKey("Id") + .HasName("pk_arr_configs"); + + b.ToTable("arr_configs", (string)null); + }); + + modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Arr.ArrInstance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("id"); + + b.Property("ApiKey") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("api_key"); + + b.Property("ArrConfigId") + .HasColumnType("TEXT") + .HasColumnName("arr_config_id"); + + b.Property("Enabled") + .HasColumnType("INTEGER") + .HasColumnName("enabled"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("name"); + + b.Property("Url") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("url"); + + b.HasKey("Id") + .HasName("pk_arr_instances"); + + b.HasIndex("ArrConfigId") + .HasDatabaseName("ix_arr_instances_arr_config_id"); + + b.ToTable("arr_instances", (string)null); + }); + + modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.DownloadCleaner.CleanCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("id"); + + b.Property("DownloadCleanerConfigId") + .HasColumnType("TEXT") + .HasColumnName("download_cleaner_config_id"); + + b.Property("MaxRatio") + .HasColumnType("REAL") + .HasColumnName("max_ratio"); + + b.Property("MaxSeedTime") + .HasColumnType("REAL") + .HasColumnName("max_seed_time"); + + b.Property("MinSeedTime") + .HasColumnType("REAL") + .HasColumnName("min_seed_time"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("name"); + + b.HasKey("Id") + .HasName("pk_clean_categories"); + + b.HasIndex("DownloadCleanerConfigId") + .HasDatabaseName("ix_clean_categories_download_cleaner_config_id"); + + b.ToTable("clean_categories", (string)null); + }); + + modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.DownloadCleaner.DownloadCleanerConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("id"); + + b.Property("CronExpression") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("cron_expression"); + + b.Property("DeletePrivate") + .HasColumnType("INTEGER") + .HasColumnName("delete_private"); + + b.Property("Enabled") + .HasColumnType("INTEGER") + .HasColumnName("enabled"); + + b.PrimitiveCollection("UnlinkedCategories") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("unlinked_categories"); + + b.Property("UnlinkedEnabled") + .HasColumnType("INTEGER") + .HasColumnName("unlinked_enabled"); + + b.Property("UnlinkedIgnoredRootDir") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("unlinked_ignored_root_dir"); + + b.Property("UnlinkedTargetCategory") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("unlinked_target_category"); + + b.Property("UnlinkedUseTag") + .HasColumnType("INTEGER") + .HasColumnName("unlinked_use_tag"); + + b.Property("UseAdvancedScheduling") + .HasColumnType("INTEGER") + .HasColumnName("use_advanced_scheduling"); + + b.HasKey("Id") + .HasName("pk_download_cleaner_configs"); + + b.ToTable("download_cleaner_configs", (string)null); + }); + + modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.DownloadClientConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("id"); + + b.Property("Enabled") + .HasColumnType("INTEGER") + .HasColumnName("enabled"); + + b.Property("Host") + .HasColumnType("TEXT") + .HasColumnName("host"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("name"); + + b.Property("Password") + .HasColumnType("TEXT") + .HasColumnName("password"); + + b.Property("Type") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("type"); + + b.Property("TypeName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("type_name"); + + b.Property("UrlBase") + .HasColumnType("TEXT") + .HasColumnName("url_base"); + + b.Property("Username") + .HasColumnType("TEXT") + .HasColumnName("username"); + + b.HasKey("Id") + .HasName("pk_download_clients"); + + b.ToTable("download_clients", (string)null); + }); + + modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.General.GeneralConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("id"); + + b.Property("DisplaySupportBanner") + .HasColumnType("INTEGER") + .HasColumnName("display_support_banner"); + + b.Property("DryRun") + .HasColumnType("INTEGER") + .HasColumnName("dry_run"); + + b.Property("EncryptionKey") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("encryption_key"); + + b.Property("HttpCertificateValidation") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("http_certificate_validation"); + + b.Property("HttpMaxRetries") + .HasColumnType("INTEGER") + .HasColumnName("http_max_retries"); + + b.Property("HttpTimeout") + .HasColumnType("INTEGER") + .HasColumnName("http_timeout"); + + b.PrimitiveCollection("IgnoredDownloads") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("ignored_downloads"); + + b.Property("SearchDelay") + .HasColumnType("INTEGER") + .HasColumnName("search_delay"); + + b.Property("SearchEnabled") + .HasColumnType("INTEGER") + .HasColumnName("search_enabled"); + + b.ComplexProperty>("Log", "Cleanuparr.Persistence.Models.Configuration.General.GeneralConfig.Log#LoggingConfig", b1 => + { + b1.IsRequired(); + + b1.Property("ArchiveEnabled") + .HasColumnType("INTEGER") + .HasColumnName("log_archive_enabled"); + + b1.Property("ArchiveRetainedCount") + .HasColumnType("INTEGER") + .HasColumnName("log_archive_retained_count"); + + b1.Property("ArchiveTimeLimitHours") + .HasColumnType("INTEGER") + .HasColumnName("log_archive_time_limit_hours"); + + b1.Property("Level") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("log_level"); + + b1.Property("RetainedFileCount") + .HasColumnType("INTEGER") + .HasColumnName("log_retained_file_count"); + + b1.Property("RollingSizeMB") + .HasColumnType("INTEGER") + .HasColumnName("log_rolling_size_mb"); + + b1.Property("TimeLimitHours") + .HasColumnType("INTEGER") + .HasColumnName("log_time_limit_hours"); + }); + + b.HasKey("Id") + .HasName("pk_general_configs"); + + b.ToTable("general_configs", (string)null); + }); + + modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.MalwareBlocker.ContentBlockerConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("id"); + + b.Property("CronExpression") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("cron_expression"); + + b.Property("DeleteKnownMalware") + .HasColumnType("INTEGER") + .HasColumnName("delete_known_malware"); + + b.Property("DeletePrivate") + .HasColumnType("INTEGER") + .HasColumnName("delete_private"); + + b.Property("Enabled") + .HasColumnType("INTEGER") + .HasColumnName("enabled"); + + b.Property("IgnorePrivate") + .HasColumnType("INTEGER") + .HasColumnName("ignore_private"); + + b.Property("UseAdvancedScheduling") + .HasColumnType("INTEGER") + .HasColumnName("use_advanced_scheduling"); + + b.ComplexProperty>("Lidarr", "Cleanuparr.Persistence.Models.Configuration.MalwareBlocker.ContentBlockerConfig.Lidarr#BlocklistSettings", b1 => + { + b1.IsRequired(); + + b1.Property("BlocklistPath") + .HasColumnType("TEXT") + .HasColumnName("lidarr_blocklist_path"); + + b1.Property("BlocklistType") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("lidarr_blocklist_type"); + + b1.Property("Enabled") + .HasColumnType("INTEGER") + .HasColumnName("lidarr_enabled"); + }); + + b.ComplexProperty>("Radarr", "Cleanuparr.Persistence.Models.Configuration.MalwareBlocker.ContentBlockerConfig.Radarr#BlocklistSettings", b1 => + { + b1.IsRequired(); + + b1.Property("BlocklistPath") + .HasColumnType("TEXT") + .HasColumnName("radarr_blocklist_path"); + + b1.Property("BlocklistType") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("radarr_blocklist_type"); + + b1.Property("Enabled") + .HasColumnType("INTEGER") + .HasColumnName("radarr_enabled"); + }); + + b.ComplexProperty>("Readarr", "Cleanuparr.Persistence.Models.Configuration.MalwareBlocker.ContentBlockerConfig.Readarr#BlocklistSettings", b1 => + { + b1.IsRequired(); + + b1.Property("BlocklistPath") + .HasColumnType("TEXT") + .HasColumnName("readarr_blocklist_path"); + + b1.Property("BlocklistType") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("readarr_blocklist_type"); + + b1.Property("Enabled") + .HasColumnType("INTEGER") + .HasColumnName("readarr_enabled"); + }); + + b.ComplexProperty>("Sonarr", "Cleanuparr.Persistence.Models.Configuration.MalwareBlocker.ContentBlockerConfig.Sonarr#BlocklistSettings", b1 => + { + b1.IsRequired(); + + b1.Property("BlocklistPath") + .HasColumnType("TEXT") + .HasColumnName("sonarr_blocklist_path"); + + b1.Property("BlocklistType") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("sonarr_blocklist_type"); + + b1.Property("Enabled") + .HasColumnType("INTEGER") + .HasColumnName("sonarr_enabled"); + }); + + b.ComplexProperty>("Whisparr", "Cleanuparr.Persistence.Models.Configuration.MalwareBlocker.ContentBlockerConfig.Whisparr#BlocklistSettings", b1 => + { + b1.IsRequired(); + + b1.Property("BlocklistPath") + .HasColumnType("TEXT") + .HasColumnName("whisparr_blocklist_path"); + + b1.Property("BlocklistType") + .HasColumnType("INTEGER") + .HasColumnName("whisparr_blocklist_type"); + + b1.Property("Enabled") + .HasColumnType("INTEGER") + .HasColumnName("whisparr_enabled"); + }); + + b.HasKey("Id") + .HasName("pk_content_blocker_configs"); + + b.ToTable("content_blocker_configs", (string)null); + }); + + modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Notification.AppriseConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("id"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("TEXT") + .HasColumnName("key"); + + b.Property("NotificationConfigId") + .HasColumnType("TEXT") + .HasColumnName("notification_config_id"); + + b.Property("Tags") + .HasMaxLength(255) + .HasColumnType("TEXT") + .HasColumnName("tags"); + + b.Property("Url") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("TEXT") + .HasColumnName("url"); + + b.HasKey("Id") + .HasName("pk_apprise_configs"); + + b.HasIndex("NotificationConfigId") + .IsUnique() + .HasDatabaseName("ix_apprise_configs_notification_config_id"); + + b.ToTable("apprise_configs", (string)null); + }); + + modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Notification.NotifiarrConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("id"); + + b.Property("ApiKey") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("TEXT") + .HasColumnName("api_key"); + + b.Property("ChannelId") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT") + .HasColumnName("channel_id"); + + b.Property("NotificationConfigId") + .HasColumnType("TEXT") + .HasColumnName("notification_config_id"); + + b.HasKey("Id") + .HasName("pk_notifiarr_configs"); + + b.HasIndex("NotificationConfigId") + .IsUnique() + .HasDatabaseName("ix_notifiarr_configs_notification_config_id"); + + b.ToTable("notifiarr_configs", (string)null); + }); + + modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Notification.NotificationConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("id"); + + b.Property("CreatedAt") + .HasColumnType("TEXT") + .HasColumnName("created_at"); + + b.Property("IsEnabled") + .HasColumnType("INTEGER") + .HasColumnName("is_enabled"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("TEXT") + .HasColumnName("name"); + + b.Property("OnCategoryChanged") + .HasColumnType("INTEGER") + .HasColumnName("on_category_changed"); + + b.Property("OnDownloadCleaned") + .HasColumnType("INTEGER") + .HasColumnName("on_download_cleaned"); + + b.Property("OnFailedImportStrike") + .HasColumnType("INTEGER") + .HasColumnName("on_failed_import_strike"); + + b.Property("OnQueueItemDeleted") + .HasColumnType("INTEGER") + .HasColumnName("on_queue_item_deleted"); + + b.Property("OnSlowStrike") + .HasColumnType("INTEGER") + .HasColumnName("on_slow_strike"); + + b.Property("OnStalledStrike") + .HasColumnType("INTEGER") + .HasColumnName("on_stalled_strike"); + + b.Property("Type") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("type"); + + b.Property("UpdatedAt") + .HasColumnType("TEXT") + .HasColumnName("updated_at"); + + b.HasKey("Id") + .HasName("pk_notification_configs"); + + b.HasIndex("Name") + .IsUnique() + .HasDatabaseName("ix_notification_configs_name"); + + b.ToTable("notification_configs", (string)null); + }); + + modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.QueueCleaner.QueueCleanerConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("id"); + + b.Property("CronExpression") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("cron_expression"); + + b.Property("Enabled") + .HasColumnType("INTEGER") + .HasColumnName("enabled"); + + b.Property("UseAdvancedScheduling") + .HasColumnType("INTEGER") + .HasColumnName("use_advanced_scheduling"); + + b.ComplexProperty>("FailedImport", "Cleanuparr.Persistence.Models.Configuration.QueueCleaner.QueueCleanerConfig.FailedImport#FailedImportConfig", b1 => + { + b1.IsRequired(); + + b1.Property("DeletePrivate") + .HasColumnType("INTEGER") + .HasColumnName("failed_import_delete_private"); + + b1.Property("IgnorePrivate") + .HasColumnType("INTEGER") + .HasColumnName("failed_import_ignore_private"); + + b1.Property("MaxStrikes") + .HasColumnType("INTEGER") + .HasColumnName("failed_import_max_strikes"); + + b1.Property("PatternMode") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("failed_import_pattern_mode"); + + b1.PrimitiveCollection("Patterns") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("failed_import_patterns"); + }); + + b.ComplexProperty>("Slow", "Cleanuparr.Persistence.Models.Configuration.QueueCleaner.QueueCleanerConfig.Slow#SlowConfig", b1 => + { + b1.IsRequired(); + + b1.Property("DeletePrivate") + .HasColumnType("INTEGER") + .HasColumnName("slow_delete_private"); + + b1.Property("IgnoreAboveSize") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("slow_ignore_above_size"); + + b1.Property("IgnorePrivate") + .HasColumnType("INTEGER") + .HasColumnName("slow_ignore_private"); + + b1.Property("MaxStrikes") + .HasColumnType("INTEGER") + .HasColumnName("slow_max_strikes"); + + b1.Property("MaxTime") + .HasColumnType("REAL") + .HasColumnName("slow_max_time"); + + b1.Property("MinSpeed") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("slow_min_speed"); + + b1.Property("ResetStrikesOnProgress") + .HasColumnType("INTEGER") + .HasColumnName("slow_reset_strikes_on_progress"); + }); + + b.ComplexProperty>("Stalled", "Cleanuparr.Persistence.Models.Configuration.QueueCleaner.QueueCleanerConfig.Stalled#StalledConfig", b1 => + { + b1.IsRequired(); + + b1.Property("DeletePrivate") + .HasColumnType("INTEGER") + .HasColumnName("stalled_delete_private"); + + b1.Property("DownloadingMetadataMaxStrikes") + .HasColumnType("INTEGER") + .HasColumnName("stalled_downloading_metadata_max_strikes"); + + b1.Property("IgnorePrivate") + .HasColumnType("INTEGER") + .HasColumnName("stalled_ignore_private"); + + b1.Property("MaxStrikes") + .HasColumnType("INTEGER") + .HasColumnName("stalled_max_strikes"); + + b1.Property("ResetStrikesOnProgress") + .HasColumnType("INTEGER") + .HasColumnName("stalled_reset_strikes_on_progress"); + }); + + b.HasKey("Id") + .HasName("pk_queue_cleaner_configs"); + + b.ToTable("queue_cleaner_configs", (string)null); + }); + + modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Arr.ArrInstance", b => + { + b.HasOne("Cleanuparr.Persistence.Models.Configuration.Arr.ArrConfig", "ArrConfig") + .WithMany("Instances") + .HasForeignKey("ArrConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_arr_instances_arr_configs_arr_config_id"); + + b.Navigation("ArrConfig"); + }); + + modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.DownloadCleaner.CleanCategory", b => + { + b.HasOne("Cleanuparr.Persistence.Models.Configuration.DownloadCleaner.DownloadCleanerConfig", "DownloadCleanerConfig") + .WithMany("Categories") + .HasForeignKey("DownloadCleanerConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_clean_categories_download_cleaner_configs_download_cleaner_config_id"); + + b.Navigation("DownloadCleanerConfig"); + }); + + modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Notification.AppriseConfig", b => + { + b.HasOne("Cleanuparr.Persistence.Models.Configuration.Notification.NotificationConfig", "NotificationConfig") + .WithOne("AppriseConfiguration") + .HasForeignKey("Cleanuparr.Persistence.Models.Configuration.Notification.AppriseConfig", "NotificationConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_apprise_configs_notification_configs_notification_config_id"); + + b.Navigation("NotificationConfig"); + }); + + modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Notification.NotifiarrConfig", b => + { + b.HasOne("Cleanuparr.Persistence.Models.Configuration.Notification.NotificationConfig", "NotificationConfig") + .WithOne("NotifiarrConfiguration") + .HasForeignKey("Cleanuparr.Persistence.Models.Configuration.Notification.NotifiarrConfig", "NotificationConfigId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_notifiarr_configs_notification_configs_notification_config_id"); + + b.Navigation("NotificationConfig"); + }); + + modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Arr.ArrConfig", b => + { + b.Navigation("Instances"); + }); + + modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.DownloadCleaner.DownloadCleanerConfig", b => + { + b.Navigation("Categories"); + }); + + modelBuilder.Entity("Cleanuparr.Persistence.Models.Configuration.Notification.NotificationConfig", b => + { + b.Navigation("AppriseConfiguration"); + + b.Navigation("NotifiarrConfiguration"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/code/backend/Cleanuparr.Persistence/Migrations/Data/20250906183018_AddFailedImportTypeHandling.cs b/code/backend/Cleanuparr.Persistence/Migrations/Data/20250906183018_AddFailedImportTypeHandling.cs new file mode 100644 index 00000000..446ae22a --- /dev/null +++ b/code/backend/Cleanuparr.Persistence/Migrations/Data/20250906183018_AddFailedImportTypeHandling.cs @@ -0,0 +1,49 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Cleanuparr.Persistence.Migrations.Data +{ + /// + public partial class AddFailedImportTypeHandling : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.RenameColumn( + name: "failed_import_ignored_patterns", + table: "queue_cleaner_configs", + newName: "failed_import_patterns"); + + migrationBuilder.AddColumn( + name: "failed_import_pattern_mode", + table: "queue_cleaner_configs", + type: "TEXT", + nullable: false, + defaultValue: ""); + + migrationBuilder.Sql( + """ + UPDATE queue_cleaner_configs + SET failed_import_pattern_mode = CASE + WHEN failed_import_max_strikes = 0 AND failed_import_patterns = '[]' + THEN 'include' + ELSE 'exclude' + END; + """); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "failed_import_pattern_mode", + table: "queue_cleaner_configs"); + + migrationBuilder.RenameColumn( + name: "failed_import_patterns", + table: "queue_cleaner_configs", + newName: "failed_import_ignored_patterns"); + } + } +} diff --git a/code/backend/Cleanuparr.Persistence/Migrations/Data/DataContextModelSnapshot.cs b/code/backend/Cleanuparr.Persistence/Migrations/Data/DataContextModelSnapshot.cs index 9e370dfa..f0cbe1ee 100644 --- a/code/backend/Cleanuparr.Persistence/Migrations/Data/DataContextModelSnapshot.cs +++ b/code/backend/Cleanuparr.Persistence/Migrations/Data/DataContextModelSnapshot.cs @@ -704,14 +704,19 @@ namespace Cleanuparr.Persistence.Migrations.Data .HasColumnType("INTEGER") .HasColumnName("failed_import_ignore_private"); - b1.PrimitiveCollection("IgnoredPatterns") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("failed_import_ignored_patterns"); - b1.Property("MaxStrikes") .HasColumnType("INTEGER") .HasColumnName("failed_import_max_strikes"); + + b1.Property("PatternMode") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("failed_import_pattern_mode"); + + b1.PrimitiveCollection("Patterns") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("failed_import_patterns"); }); b.HasKey("Id") diff --git a/code/backend/Cleanuparr.Persistence/Models/Configuration/QueueCleaner/FailedImportConfig.cs b/code/backend/Cleanuparr.Persistence/Models/Configuration/QueueCleaner/FailedImportConfig.cs index ee6073ad..b050aa80 100644 --- a/code/backend/Cleanuparr.Persistence/Models/Configuration/QueueCleaner/FailedImportConfig.cs +++ b/code/backend/Cleanuparr.Persistence/Models/Configuration/QueueCleaner/FailedImportConfig.cs @@ -1,4 +1,6 @@ -using System.ComponentModel.DataAnnotations.Schema; +using System; +using System.ComponentModel.DataAnnotations.Schema; +using Cleanuparr.Domain.Enums; using Cleanuparr.Domain.Exceptions; namespace Cleanuparr.Persistence.Models.Configuration.QueueCleaner; @@ -12,7 +14,9 @@ public sealed record FailedImportConfig public bool DeletePrivate { get; init; } - public IReadOnlyList IgnoredPatterns { get; init; } = []; + public IReadOnlyList Patterns { get; init; } = []; + + public PatternMode PatternMode { get; init; } = PatternMode.Include; public void Validate() { diff --git a/code/frontend/src/app/core/services/documentation.service.ts b/code/frontend/src/app/core/services/documentation.service.ts index 9f7210bc..0c8620dc 100644 --- a/code/frontend/src/app/core/services/documentation.service.ts +++ b/code/frontend/src/app/core/services/documentation.service.ts @@ -22,7 +22,8 @@ export class DocumentationService { 'failedImport.maxStrikes': 'failed-import-max-strikes', 'failedImport.ignorePrivate': 'failed-import-ignore-private', 'failedImport.deletePrivate': 'failed-import-delete-private', - 'failedImport.ignoredPatterns': 'failed-import-ignored-patterns', + 'failedImport.pattern-mode': 'failed-import-pattern-mode', + 'failedImport.patterns': 'failed-import-patterns', 'downloadingMetadataMaxStrikes': 'downloading-metadata-max-strikes', // Stall rule fields 'stallRule.name': 'stall-rule-name', diff --git a/code/frontend/src/app/settings/queue-cleaner/queue-cleaner-settings.component.html b/code/frontend/src/app/settings/queue-cleaner/queue-cleaner-settings.component.html index 73570984..257f6c00 100644 --- a/code/frontend/src/app/settings/queue-cleaner/queue-cleaner-settings.component.html +++ b/code/frontend/src/app/settings/queue-cleaner/queue-cleaner-settings.component.html @@ -212,20 +212,40 @@
+
+ + Choose how the patterns are applied to failed imports +
+
+ +
+
- Failed imports containing these patterns will be skipped (e.g. sample) + + {{ queueCleanerForm.get('failedImport.patternMode')?.value === PatternMode.Include ? + 'Only failed imports containing these patterns will be removed and everything else will be skipped' : + 'Failed imports containing these patterns will be skipped and everything else will be removed' + }} +
diff --git a/code/frontend/src/app/settings/queue-cleaner/queue-cleaner-settings.component.ts b/code/frontend/src/app/settings/queue-cleaner/queue-cleaner-settings.component.ts index d6f12273..3eb02609 100644 --- a/code/frontend/src/app/settings/queue-cleaner/queue-cleaner-settings.component.ts +++ b/code/frontend/src/app/settings/queue-cleaner/queue-cleaner-settings.component.ts @@ -9,6 +9,8 @@ import { ScheduleUnit, ScheduleOptions } from "../../shared/models/queue-cleaner-config.model"; +import { PatternMode } from "../../shared/models/queue-cleaner-config.model"; +import { SettingsCardComponent } from "../components/settings-card/settings-card.component"; import { ByteSizeInputComponent } from "../../shared/components/byte-size-input/byte-size-input.component"; import { MobileAutocompleteComponent } from "../../shared/components/mobile-autocomplete/mobile-autocomplete.component"; @@ -112,6 +114,8 @@ export class QueueCleanerSettingsComponent implements OnDestroy, CanComponentDea { label: 'Basic', value: false }, { label: 'Advanced', value: true } ]; + // Expose PatternMode enum for template comparisons + PatternMode = PatternMode; // Privacy type options for rules privacyTypeOptions = [ @@ -553,7 +557,8 @@ export class QueueCleanerSettingsComponent implements OnDestroy, CanComponentDea maxStrikes: [0, [Validators.required, Validators.min(0), Validators.max(5000)]], ignorePrivate: [{ value: false, disabled: true }], deletePrivate: [{ value: false, disabled: true }], - ignoredPatterns: [{ value: [], disabled: true }], + patterns: [{ value: [], disabled: true }], + patternMode: [{ value: PatternMode.Include, disabled: true }], }), downloadingMetadataMaxStrikes: [{ value: 0, disabled: true }, [Validators.required, Validators.min(0), Validators.max(5000)]], @@ -1015,7 +1020,8 @@ export class QueueCleanerSettingsComponent implements OnDestroy, CanComponentDea if (enable) { this.queueCleanerForm.get("failedImport")?.get("ignorePrivate")?.enable(options); - this.queueCleanerForm.get("failedImport")?.get("ignoredPatterns")?.enable(options); + this.queueCleanerForm.get("failedImport")?.get("patterns")?.enable(options); + this.queueCleanerForm.get("failedImport")?.get("patternMode")?.enable(options); // Only enable deletePrivate if ignorePrivate is false const ignorePrivate = this.queueCleanerForm.get("failedImport.ignorePrivate")?.value || false; @@ -1029,7 +1035,8 @@ export class QueueCleanerSettingsComponent implements OnDestroy, CanComponentDea } else { this.queueCleanerForm.get("failedImport")?.get("ignorePrivate")?.disable(options); this.queueCleanerForm.get("failedImport")?.get("deletePrivate")?.disable(options); - this.queueCleanerForm.get("failedImport")?.get("ignoredPatterns")?.disable(options); + this.queueCleanerForm.get("failedImport")?.get("patterns")?.disable(options); + this.queueCleanerForm.get("failedImport")?.get("patternMode")?.disable(options); } } @@ -1061,7 +1068,8 @@ export class QueueCleanerSettingsComponent implements OnDestroy, CanComponentDea maxStrikes: formValue.failedImport?.maxStrikes || 0, ignorePrivate: formValue.failedImport?.ignorePrivate || false, deletePrivate: formValue.failedImport?.deletePrivate || false, - ignoredPatterns: formValue.failedImport?.ignoredPatterns || [], + patterns: formValue.failedImport?.patterns || [], + patternMode: formValue.failedImport?.patternMode || PatternMode.Include, }, downloadingMetadataMaxStrikes: formValue.downloadingMetadataMaxStrikes || 0, stallRules: formValue.stallRules || [], @@ -1126,7 +1134,8 @@ export class QueueCleanerSettingsComponent implements OnDestroy, CanComponentDea maxStrikes: 0, ignorePrivate: false, deletePrivate: false, - ignoredPatterns: [], + patterns: [], + patternMode: PatternMode.Include, }, downloadingMetadataMaxStrikes: 0, diff --git a/code/frontend/src/app/shared/models/queue-cleaner-config.model.ts b/code/frontend/src/app/shared/models/queue-cleaner-config.model.ts index f0cffdd1..282a4947 100644 --- a/code/frontend/src/app/shared/models/queue-cleaner-config.model.ts +++ b/code/frontend/src/app/shared/models/queue-cleaner-config.model.ts @@ -7,6 +7,11 @@ export enum ScheduleUnit { Hours = 'Hours' } +export enum PatternMode { + Exclude = 'Exclude', + Include = 'Include' +} + /** * Valid values for each schedule unit */ @@ -25,7 +30,8 @@ export interface FailedImportConfig { maxStrikes: number; ignorePrivate: boolean; deletePrivate: boolean; - ignoredPatterns: string[]; + patterns: string[]; + patternMode?: PatternMode; } export interface QueueCleanerConfig { diff --git a/docs/docs/configuration/queue-cleaner/index.mdx b/docs/docs/configuration/queue-cleaner/index.mdx index 778621c9..7cb2a90d 100644 --- a/docs/docs/configuration/queue-cleaner/index.mdx +++ b/docs/docs/configuration/queue-cleaner/index.mdx @@ -9,6 +9,7 @@ import { EnhancedWarning, styles } from '@site/src/components/documentation'; +import failedImportPatterns from '../../../static/img/failed-import-patterns.png'; # Queue Cleaner @@ -135,8 +136,20 @@ This setting needs a download client to be configured. + +Choose how to handle failed imports based on their patterns: +- **Exclude**: Remove all failed imports except those containing specified patterns. +- **Include**: Remove only failed imports containing specified patterns. + + + + @@ -145,7 +158,12 @@ This setting needs a download client to be configured. - `manual import required` - `recently aired` -Failed imports containing these patterns in their name will be skipped during cleaning. Useful for avoiding removal of legitimate downloads that may have temporary import issues. +When pattern mode is set to `Exclude`, failed imports containing these patterns will be skipped. Everything else will be removed. +When pattern mode is set to `Include`, only failed imports containing these patterns will be removed. Everything else will be skipped. + +These patterns can be any substring of the failed import messages. These messsages can be viewed in the queue of your *arr application. + +Failed Import Messages Example diff --git a/docs/static/img/failed-import-patterns.png b/docs/static/img/failed-import-patterns.png new file mode 100644 index 0000000000000000000000000000000000000000..7687567cc0d5389b90d27c5ba3166764bcb3f36a GIT binary patch literal 64411 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 literal 0 HcmV?d00001