mirror of
https://github.com/Cleanuparr/Cleanuparr.git
synced 2026-01-17 18:28:00 -05:00
89 lines
2.5 KiB
C#
89 lines
2.5 KiB
C#
using System.Text.Json.Serialization;
|
|
using Cleanuparr.Domain.Entities;
|
|
using Cleanuparr.Domain.Exceptions;
|
|
|
|
namespace Cleanuparr.Persistence.Models.Configuration.QueueCleaner;
|
|
|
|
public sealed record SlowRule : QueueRule
|
|
{
|
|
public bool ResetStrikesOnProgress { get; init; } = true;
|
|
public double MaxTimeHours { get; init; } = 0;
|
|
|
|
public string MinSpeed { get; init; } = string.Empty;
|
|
|
|
[JsonIgnore]
|
|
public ByteSize MinSpeedByteSize => string.IsNullOrEmpty(MinSpeed) ? new ByteSize(0) : ByteSize.Parse(MinSpeed);
|
|
|
|
public string? IgnoreAboveSize { get; init; } = string.Empty;
|
|
|
|
[JsonIgnore]
|
|
public ByteSize? IgnoreAboveSizeByteSize => string.IsNullOrEmpty(IgnoreAboveSize) ? null : ByteSize.Parse(IgnoreAboveSize);
|
|
|
|
public override bool MatchesTorrent(ITorrentItemWrapper torrent)
|
|
{
|
|
// Check privacy type
|
|
if (!MatchesPrivacyType(torrent.IsPrivate))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// Check completion percentage
|
|
if (!MatchesCompletionPercentage(torrent.CompletionPercentage))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// Check file size
|
|
if (!MatchesFileSize(torrent.Size))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public override void Validate()
|
|
{
|
|
base.Validate();
|
|
|
|
if (MaxStrikes < 3)
|
|
{
|
|
throw new ValidationException("Slow rule max strikes must be at least 3");
|
|
}
|
|
|
|
if (MaxTimeHours < 0)
|
|
{
|
|
throw new ValidationException("Maximum time cannot be negative");
|
|
}
|
|
|
|
bool hasMinSpeed = !string.IsNullOrEmpty(MinSpeed);
|
|
bool hasMaxTime = MaxTimeHours > 0;
|
|
|
|
if (!hasMinSpeed && !hasMaxTime)
|
|
{
|
|
throw new ValidationException("Either minimum speed or maximum time must be specified");
|
|
}
|
|
|
|
if (hasMinSpeed && !ByteSize.TryParse(MinSpeed, out _))
|
|
{
|
|
throw new ValidationException("Invalid minimum speed format");
|
|
}
|
|
|
|
bool isIgnoreAboveSizeSet = !string.IsNullOrEmpty(IgnoreAboveSize);
|
|
|
|
if (isIgnoreAboveSizeSet && ByteSize.TryParse(IgnoreAboveSize, out _) is false)
|
|
{
|
|
throw new ValidationException($"invalid value for slow ignore above size: {IgnoreAboveSize}");
|
|
}
|
|
}
|
|
|
|
private bool MatchesFileSize(long size)
|
|
{
|
|
if (size >= IgnoreAboveSizeByteSize?.Bytes)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
} |