mirror of
https://github.com/Cleanuparr/Cleanuparr.git
synced 2025-12-31 01:48:49 -05:00
Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
53adb6c1c1 | ||
|
|
a0c8ff72fb | ||
|
|
599242aa2a | ||
|
|
3e0913b437 | ||
|
|
54cabd98b4 | ||
|
|
cbc5c571b3 | ||
|
|
beea640d49 | ||
|
|
65b8a7f988 | ||
|
|
b86173d6c0 | ||
|
|
09c4b2a28e | ||
|
|
6e8545e4ca |
5
.gitignore
vendored
5
.gitignore
vendored
@@ -168,4 +168,7 @@ src/.idea/
|
||||
|
||||
**/logs/
|
||||
**/MediaCover/
|
||||
**/archive/
|
||||
**/archive/
|
||||
**/Backups/
|
||||
*.fastresume
|
||||
*.bak
|
||||
94
README.md
94
README.md
@@ -1,34 +1,61 @@
|
||||
# cleanuperr
|
||||
|
||||
### This tool is actively developed and not yet stable. Join the discord server if you want to get in touch with me as soon as possible (or if you just want to be informed of new releases), so we can squash those pesky bugs together: https://discord.gg/cJYPs9Bt
|
||||
cleanuperr is a tool for automating the cleanup of unwanted or blocked files in Sonarr, Radarr, and supported download clients like qBittorrent. It removes incomplete or blocked downloads, updates queues, and enforces blacklists or whitelists to manage file selection. After removing blocked content, cleanuperr can also trigger a search to replace the deleted shows/movies.
|
||||
|
||||
cleanuperr was created primarily to address malicious files, such as `*.lnk` or `*.zipx`, that were getting stuck in Sonarr/Radarr and required manual intervention. Some of the reddit posts that made cleanuperr come to life can be found [here](https://www.reddit.com/r/sonarr/comments/1gqnx16/psa_sonarr_downloaded_a_virus/), [here](https://www.reddit.com/r/sonarr/comments/1gqwklr/sonar_downloaded_a_mkv_file_which_looked_like_a/), [here](https://www.reddit.com/r/sonarr/comments/1gpw2wa/downloaded_waiting_to_import/) and [here](https://www.reddit.com/r/sonarr/comments/1gpi344/downloads_not_importing_no_files_found/).
|
||||
|
||||
The tool supports both qBittorrent's built-in exclusion features and its own blocklist-based system. Binaries for all platforms are provided, along with Docker images for easy deployment.
|
||||
|
||||
Refer to the [Environment variables](#Environment-variables) section for detailed configuration instructions and the [Setup](#Setup) section for an in-depth explanation of the cleanup process.
|
||||
|
||||
## Important note
|
||||
|
||||
Only the <b>latest versions</b> of qBittorrent, Deluge, Sonarr etc. are supported, or earlier versions that have the same API as the latest version.
|
||||
Only the **latest versions** of qBittorrent, Deluge, Sonarr etc. are supported, or earlier versions that have the same API as the latest version.
|
||||
|
||||
This tool is actively developed and still a work in progress. Join the Discord server if you want to reach out to me quickly (or just stay updated on new releases) so we can squash those pesky bugs together:
|
||||
|
||||
> https://discord.gg/cJYPs9Bt
|
||||
|
||||
# How it works
|
||||
|
||||
1. **Content blocker** will:
|
||||
- Run every 5 minutes (or configured cron).
|
||||
- Process all items in the *arr queue.
|
||||
- Find the corresponding item from the download client for each queue item.
|
||||
- Mark the files that were found in the queue as **unwanted/skipped** if:
|
||||
- They **are listed in the blacklist**, or
|
||||
- They **are not included in the whitelist**.
|
||||
2. **Queue cleaner** will:
|
||||
- Run every 5 minutes (or configured cron).
|
||||
- Process all items in the *arr queue.
|
||||
- Check each queue item if it meets one of the following condition in the download client:
|
||||
- **Marked as completed, but 0 bytes have been downloaded** (due to files being blocked by qBittorrent or the **content blocker**).
|
||||
- All associated files of are marked as **unwanted/skipped**.
|
||||
- If the item **DOES NOT** match the above criteria, it will be skipped.
|
||||
- If the item **DOES** match the criteria:
|
||||
- It will be removed from the *arr's queue.
|
||||
- It will be deleted from the download client.
|
||||
- A new search will be triggered for the *arr item.
|
||||
|
||||
# Setup
|
||||
|
||||
## Using qBittorrent's built-in feature (works only with qBittorrent)
|
||||
|
||||
1. Go to qBittorrent -> Options -> Downloads -> make sure `Excluded file names` is checked -> Set the exclusion list found [here](https://raw.githubusercontent.com/flmorg/cleanuperr/refs/heads/main/blacklist) or create your own.
|
||||
2. Start cleanuperr with `QUEUECLEANER__ENABLED` set to `true`.
|
||||
3. cleanuperr will execute a queue cleaner cron job at every 5 minutes that will:
|
||||
1. go through all items from Sonarr/Radarr's queue.
|
||||
2. each a queue item is checked:
|
||||
- if it has been <b>marked as completed and 0 bytes have been downloaded</b> (because qBittorrent blocked the files).
|
||||
- if all its files are skipped.
|
||||
3. if the item <b>IS NOT</b> as described, it is skipped.
|
||||
4. if the item <b>IS</b> as described, it is removed from Sonarr/Radarr's queue, removed from qBittorrent and a search is triggered for the show/movie.
|
||||
1. Go to qBittorrent -> Options -> Downloads -> make sure `Excluded file names` is checked -> Paste an exclusion list that you have copied.
|
||||
- [blacklist](https://raw.githubusercontent.com/flmorg/cleanuperr/refs/heads/main/blacklist), or
|
||||
- [permissive blacklist](https://raw.githubusercontent.com/flmorg/cleanuperr/refs/heads/main/blacklist_permissive), or
|
||||
- create your own
|
||||
2. qBittorrent will block files from being downloaded. In the case of malicious content, **nothing is downloaded and the torrent is marked as complete**.
|
||||
3. Start **cleanuperr** with `QUEUECLEANER__ENABLED` set to `true`.
|
||||
4. The **queue cleaner** will perform a cleanup process as described in the [How it works](#how-it-works) section.
|
||||
|
||||
## Using cleanuperr's blocklist (works with all supported download clients)
|
||||
|
||||
1. Start cleanuperr with both `QUEUECLEANER_ENABLED` and `CONTENTBLOCKER_ENABLED` set to `true`.
|
||||
2. Be sure to set and enable a blacklist or a whitelist as described in the [Environment variables](#Environment-variables) section.
|
||||
3. cleanuperr with execute the following jobs:
|
||||
- the same queue cleaner as described [here](#Using-qBittorrents-built-in-feature)
|
||||
- a content blocker cron job at every 5 minutes that will mark files as unwanted/skipped if:
|
||||
- they are in the blacklist.
|
||||
- they are not in the whitelist.
|
||||
1. Set both `QUEUECLEANER_ENABLED` and `CONTENTBLOCKER_ENABLED` to `true` in your environment variables.
|
||||
2. Configure and enable either a **blacklist** or a **whitelist** as described in the [Environment variables](#Environment-variables) section.
|
||||
3. Once configured, cleanuperr will perform the following tasks:
|
||||
- Execute the **content blocker** job, as explained in the [How it works](#how-it-works) section.
|
||||
- Execute the **queue cleaner** job, as explained in the [How it works](#how-it-works) section.
|
||||
|
||||
## Usage
|
||||
|
||||
@@ -68,6 +95,7 @@ services:
|
||||
- TRIGGERS__CONTENTBLOCKER=0 0/5 * * * ?
|
||||
|
||||
- QUEUECLEANER__ENABLED=true
|
||||
- QUEUECLEANER__RUNSEQUENTIALLY=true
|
||||
|
||||
- CONTENTBLOCKER__ENABLED=true
|
||||
- CONTENTBLOCKER__BLACKLIST__ENABLED=true
|
||||
@@ -115,26 +143,27 @@ services:
|
||||
| TRIGGERS__CONTENTBLOCKER | Yes if content blocker is enabled | [Quartz cron trigger](https://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html) | 0 0/5 * * * ? |
|
||||
|||||
|
||||
| QUEUECLEANER__ENABLED | No | Enable or disable the queue cleaner | true |
|
||||
| QUEUECLEANER__RUNSEQUENTIALLY | No | If set to true, the queue cleaner will run after the content blocker instead of running in parallel, streamlining the cleaning process | true |
|
||||
|||||
|
||||
| CONTENTBLOCKER__ENABLED | No | Enable or disable the content blocker | false |
|
||||
| CONTENTBLOCKER__BLACKLIST__ENABLED | Yes if content blocker is enabled and whitelist is not enabled | Enable or disable the blacklist | false |
|
||||
| CONTENTBLOCKER__BLACKLIST__PATH | Yes if blacklist is enabled | Path to the blacklist (local file or url) | empty |
|
||||
| CONTENTBLOCKER__BLACKLIST__PATH | Yes if blacklist is enabled | Path to the blacklist (local file or url); Needs to be json compatible | empty |
|
||||
| CONTENTBLOCKER__WHITELIST__ENABLED | Yes if content blocker is enabled and blacklist is not enabled | Enable or disable the whitelist | false |
|
||||
| CONTENTBLOCKER__BLACKLIST__PATH | Yes if whitelist is enabled | Path to the whitelist (local file or url) | empty |
|
||||
| CONTENTBLOCKER__BLACKLIST__PATH | Yes if whitelist is enabled | Path to the whitelist (local file or url); Needs to be json compatible | empty |
|
||||
|||||
|
||||
| QBITTORRENT__ENABLED | No | Enable or disable qBittorrent | true |
|
||||
| QBITTORRENT__URL | Yes if qBittorrent is enabled | qBittorrent instance url | http://localhost:8112 |
|
||||
| QBITTORRENT__USERNAME | Yes if qBittorrent is enabled | qBittorrent user | empty |
|
||||
| QBITTORRENT__PASSWORD | Yes if qBittorrent is enabled | qBittorrent password | empty |
|
||||
| QBITTORRENT__URL | No | qBittorrent instance url | http://localhost:8112 |
|
||||
| QBITTORRENT__USERNAME | No | qBittorrent user | empty |
|
||||
| QBITTORRENT__PASSWORD | No | qBittorrent password | empty |
|
||||
|||||
|
||||
| DELUGE__ENABLED | No | Enable or disable Deluge | false |
|
||||
| DELUGE__URL | Yes if Deluge is enabled | Deluge instance url | http://localhost:8080 |
|
||||
| DELUGE__PASSWORD | Yes if Deluge is enabled | Deluge password | empty |
|
||||
| DELUGE__URL | No | Deluge instance url | http://localhost:8080 |
|
||||
| DELUGE__PASSWORD | No | Deluge password | empty |
|
||||
|||||
|
||||
| TRANSMISSION__ENABLED | No | Enable or disable Transmission | true |
|
||||
| TRANSMISSION__URL | Yes if Transmission is enabled | Transmission instance url | http://localhost:9091 |
|
||||
| TRANSMISSION__USERNAME | Yes if Transmission is enabled | Transmission user | empty |
|
||||
| TRANSMISSION__PASSWORD | Yes if Transmission is enabled | Transmission password | empty |
|
||||
| TRANSMISSION__URL | No | Transmission instance url | http://localhost:9091 |
|
||||
| TRANSMISSION__USERNAME | No | Transmission user | empty |
|
||||
| TRANSMISSION__PASSWORD | No | Transmission password | empty |
|
||||
|||||
|
||||
| SONARR__ENABLED | No | Whether Sonarr cleanup is enabled or not | true |
|
||||
| SONARR__INSTANCES__0__URL | Yes | First Sonarr instance url | http://localhost:8989 |
|
||||
@@ -148,8 +177,9 @@ services:
|
||||
### To be noted
|
||||
|
||||
1. The blacklist and the whitelist can not be both enabled at the same time.
|
||||
2. Only one download client can be enabled at a time. If you have more than one download client, you should deploy multiple instances of cleanuperr.
|
||||
3. The blocklists (blacklist/whitelist) should have a single pattern on each line and supports the following:
|
||||
2. The queue cleaner and content blocker can be enabled or disabled separately, if you want to run only one of them.
|
||||
3. Only one download client can be enabled at a time. If you have more than one download client, you should deploy multiple instances of cleanuperr.
|
||||
4. The blocklists (blacklist/whitelist) should have a single pattern on each line and supports the following:
|
||||
```
|
||||
*example // file name ends with "example"
|
||||
example* // file name starts with "example"
|
||||
@@ -157,7 +187,7 @@ example* // file name starts with "example"
|
||||
example // file name is exactly the word "example"
|
||||
<ANY_REGEX> // regex
|
||||
```
|
||||
4. Multiple Sonarr/Radarr instances can be specified using this format, where `<NUMBER>` starts from 0:
|
||||
5. Multiple Sonarr/Radarr instances can be specified using this format, where `<NUMBER>` starts from 0:
|
||||
```
|
||||
SONARR__INSTANCES__<NUMBER>__URL
|
||||
SONARR__INSTANCES__<NUMBER>__APIKEY
|
||||
@@ -169,7 +199,7 @@ SONARR__INSTANCES__<NUMBER>__APIKEY
|
||||
|
||||
1. Download the binaries from [releases](https://github.com/flmorg/cleanuperr/releases).
|
||||
2. Extract them from the zip file.
|
||||
3. Edit **appsettings.json**. The paths from this json file correspond with the docker env vars, as described [above](/README.md#environment-variables).
|
||||
3. Edit **appsettings.json**. The paths from this json file correspond with the docker env vars, as described [above](#environment-variables).
|
||||
|
||||
### Run as a Windows Service
|
||||
|
||||
|
||||
51
blacklist_permissive
Normal file
51
blacklist_permissive
Normal file
@@ -0,0 +1,51 @@
|
||||
*.apk
|
||||
*.bat
|
||||
*.bin
|
||||
*.bmp
|
||||
*.cmd
|
||||
*.com
|
||||
*.db
|
||||
*.diz
|
||||
*.dll
|
||||
*.dmg
|
||||
*.etc
|
||||
*.exe
|
||||
*.gif
|
||||
*.htm
|
||||
*.html
|
||||
*.ico
|
||||
*.ini
|
||||
*.iso
|
||||
*.jar
|
||||
*.jpg
|
||||
*.js
|
||||
*.link
|
||||
*.lnk
|
||||
*.msi
|
||||
*.nfo
|
||||
*.perl
|
||||
*.php
|
||||
*.pl
|
||||
*.png
|
||||
*.ps1
|
||||
*.psc1
|
||||
*.psd1
|
||||
*.psm1
|
||||
*.py
|
||||
*.pyd
|
||||
*.rb
|
||||
*.readme
|
||||
*.reg
|
||||
*.run
|
||||
*.scr
|
||||
*.sh
|
||||
*.sql
|
||||
*.text
|
||||
*.thumb
|
||||
*.torrent
|
||||
*.txt
|
||||
*.url
|
||||
*.vbs
|
||||
*.wsf
|
||||
*.xml
|
||||
*.zipx
|
||||
@@ -1,6 +1,6 @@
|
||||
namespace Common.Configuration.ContentBlocker;
|
||||
|
||||
public sealed record ContentBlockerConfig : IConfig
|
||||
public sealed record ContentBlockerConfig : IJobConfig
|
||||
{
|
||||
public const string SectionName = "ContentBlocker";
|
||||
|
||||
|
||||
@@ -23,10 +23,5 @@ public sealed record DelugeConfig : IConfig
|
||||
{
|
||||
throw new ArgumentNullException(nameof(Url));
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(Password))
|
||||
{
|
||||
throw new ArgumentNullException(nameof(Password));
|
||||
}
|
||||
}
|
||||
}
|
||||
6
code/Common/Configuration/IJobConfig.cs
Normal file
6
code/Common/Configuration/IJobConfig.cs
Normal file
@@ -0,0 +1,6 @@
|
||||
namespace Common.Configuration;
|
||||
|
||||
public interface IJobConfig : IConfig
|
||||
{
|
||||
bool Enabled { get; init; }
|
||||
}
|
||||
@@ -25,15 +25,5 @@ public sealed class QBitConfig : IConfig
|
||||
{
|
||||
throw new ArgumentNullException(nameof(Url));
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(Username))
|
||||
{
|
||||
throw new ArgumentNullException(nameof(Username));
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(Password))
|
||||
{
|
||||
throw new ArgumentNullException(nameof(Password));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,14 @@
|
||||
namespace Common.Configuration.QueueCleaner;
|
||||
|
||||
public sealed record QueueCleanerConfig
|
||||
public sealed record QueueCleanerConfig : IJobConfig
|
||||
{
|
||||
public const string SectionName = "QueueCleaner";
|
||||
|
||||
public required bool Enabled { get; init; }
|
||||
|
||||
public required bool RunSequentially { get; init; }
|
||||
|
||||
public void Validate()
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -23,15 +23,5 @@ public record TransmissionConfig
|
||||
{
|
||||
throw new ArgumentNullException(nameof(Url));
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(Username))
|
||||
{
|
||||
throw new ArgumentNullException(nameof(Username));
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(Password))
|
||||
{
|
||||
throw new ArgumentNullException(nameof(Password));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,7 +5,7 @@ namespace Domain.Models.Deluge.Response;
|
||||
public sealed record DelugeContents
|
||||
{
|
||||
[JsonPropertyName("contents")]
|
||||
public Dictionary<string, DelugeFileOrDirectory> Contents { get; set; }
|
||||
public Dictionary<string, DelugeFileOrDirectory>? Contents { get; set; }
|
||||
|
||||
[JsonPropertyName("type")]
|
||||
public string Type { get; set; } // Always "dir" for the root
|
||||
|
||||
@@ -3,6 +3,7 @@ using Common.Configuration.ContentBlocker;
|
||||
using Common.Configuration.QueueCleaner;
|
||||
using Executable.Jobs;
|
||||
using Infrastructure.Verticals.ContentBlocker;
|
||||
using Infrastructure.Verticals.Jobs;
|
||||
using Infrastructure.Verticals.QueueCleaner;
|
||||
using Quartz;
|
||||
|
||||
@@ -23,60 +24,51 @@ public static class QuartzDI
|
||||
throw new NullReferenceException("triggers configuration is null");
|
||||
}
|
||||
|
||||
q.AddQueueCleanerJob(configuration, config.QueueCleaner);
|
||||
q.AddContentBlockerJob(configuration, config.ContentBlocker);
|
||||
q.AddJobs(configuration, config);
|
||||
})
|
||||
.AddQuartzHostedService(opt =>
|
||||
{
|
||||
opt.WaitForJobsToComplete = true;
|
||||
});
|
||||
|
||||
private static void AddQueueCleanerJob(
|
||||
private static void AddJobs(
|
||||
this IServiceCollectionQuartzConfigurator q,
|
||||
IConfiguration configuration,
|
||||
string trigger
|
||||
TriggersConfig triggersConfig
|
||||
)
|
||||
{
|
||||
QueueCleanerConfig? config = configuration
|
||||
ContentBlockerConfig? contentBlockerConfig = configuration
|
||||
.GetRequiredSection(ContentBlockerConfig.SectionName)
|
||||
.Get<ContentBlockerConfig>();
|
||||
|
||||
q.AddJob<ContentBlocker>(contentBlockerConfig, triggersConfig.ContentBlocker);
|
||||
|
||||
QueueCleanerConfig? queueCleanerConfig = configuration
|
||||
.GetRequiredSection(QueueCleanerConfig.SectionName)
|
||||
.Get<QueueCleanerConfig>();
|
||||
|
||||
if (config is null)
|
||||
if (contentBlockerConfig?.Enabled is true && queueCleanerConfig is { Enabled: true, RunSequentially: true })
|
||||
{
|
||||
throw new NullReferenceException($"{nameof(QueueCleaner)} configuration is null");
|
||||
q.AddJob<QueueCleaner>(queueCleanerConfig, string.Empty);
|
||||
q.AddJobListener(new JobChainingListener(nameof(QueueCleaner)));
|
||||
}
|
||||
|
||||
if (!config.Enabled)
|
||||
else
|
||||
{
|
||||
return;
|
||||
q.AddJob<QueueCleaner>(queueCleanerConfig, triggersConfig.QueueCleaner);
|
||||
}
|
||||
|
||||
q.AddJob<QueueCleanerJob>(opts =>
|
||||
{
|
||||
opts.WithIdentity(nameof(QueueCleanerJob));
|
||||
});
|
||||
|
||||
q.AddTrigger(opts =>
|
||||
{
|
||||
opts.ForJob(nameof(QueueCleanerJob))
|
||||
.WithIdentity($"{nameof(QueueCleanerJob)}-trigger")
|
||||
.WithCronSchedule(trigger, x =>x.WithMisfireHandlingInstructionDoNothing());
|
||||
});
|
||||
}
|
||||
|
||||
private static void AddContentBlockerJob(
|
||||
|
||||
private static void AddJob<T>(
|
||||
this IServiceCollectionQuartzConfigurator q,
|
||||
IConfiguration configuration,
|
||||
IJobConfig? config,
|
||||
string trigger
|
||||
)
|
||||
) where T: GenericHandler
|
||||
{
|
||||
ContentBlockerConfig? config = configuration
|
||||
.GetRequiredSection(ContentBlockerConfig.SectionName)
|
||||
.Get<ContentBlockerConfig>();
|
||||
|
||||
string typeName = typeof(T).Name;
|
||||
|
||||
if (config is null)
|
||||
{
|
||||
throw new NullReferenceException($"{nameof(ContentBlocker)} configuration is null");
|
||||
throw new NullReferenceException($"{typeName} configuration is null");
|
||||
}
|
||||
|
||||
if (!config.Enabled)
|
||||
@@ -84,16 +76,39 @@ public static class QuartzDI
|
||||
return;
|
||||
}
|
||||
|
||||
q.AddJob<ContentBlockerJob>(opts =>
|
||||
bool hasTrigger = trigger.Length > 0;
|
||||
|
||||
q.AddJob<GenericJob<T>>(opts =>
|
||||
{
|
||||
opts.WithIdentity(nameof(ContentBlockerJob));
|
||||
opts.WithIdentity(typeName);
|
||||
|
||||
if (!hasTrigger)
|
||||
{
|
||||
// jobs with no triggers need to be stored durably
|
||||
opts.StoreDurably();
|
||||
}
|
||||
});
|
||||
|
||||
// skip empty triggers
|
||||
if (!hasTrigger)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
q.AddTrigger(opts =>
|
||||
{
|
||||
opts.ForJob(nameof(ContentBlockerJob))
|
||||
.WithIdentity($"{nameof(ContentBlockerJob)}-trigger")
|
||||
.WithCronSchedule(trigger, x =>x.WithMisfireHandlingInstructionDoNothing());
|
||||
opts.ForJob(typeName)
|
||||
.WithIdentity($"{typeName}-trigger")
|
||||
.WithCronSchedule(trigger, x =>x.WithMisfireHandlingInstructionDoNothing())
|
||||
.StartNow();
|
||||
});
|
||||
|
||||
// Startup trigger
|
||||
q.AddTrigger(opts =>
|
||||
{
|
||||
opts.ForJob(typeName)
|
||||
.WithIdentity($"{typeName}-startup-trigger")
|
||||
.StartNow();
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -15,8 +15,6 @@ public static class ServicesDI
|
||||
services
|
||||
.AddTransient<SonarrClient>()
|
||||
.AddTransient<RadarrClient>()
|
||||
.AddTransient<QueueCleanerJob>()
|
||||
.AddTransient<ContentBlockerJob>()
|
||||
.AddTransient<QueueCleaner>()
|
||||
.AddTransient<ContentBlocker>()
|
||||
.AddTransient<FilenameEvaluator>()
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
using Infrastructure.Verticals.ContentBlocker;
|
||||
using Quartz;
|
||||
|
||||
namespace Executable.Jobs;
|
||||
|
||||
[DisallowConcurrentExecution]
|
||||
public sealed class ContentBlockerJob : IJob
|
||||
{
|
||||
private readonly ILogger<QueueCleanerJob> _logger;
|
||||
private readonly ContentBlocker _contentBlocker;
|
||||
|
||||
public ContentBlockerJob(
|
||||
ILogger<QueueCleanerJob> logger,
|
||||
ContentBlocker contentBlocker
|
||||
)
|
||||
{
|
||||
_logger = logger;
|
||||
_contentBlocker = contentBlocker;
|
||||
}
|
||||
|
||||
public async Task Execute(IJobExecutionContext context)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _contentBlocker.ExecuteAsync();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, $"{nameof(ContentBlockerJob)} failed");
|
||||
}
|
||||
}
|
||||
}
|
||||
31
code/Executable/Jobs/GenericJob.cs
Normal file
31
code/Executable/Jobs/GenericJob.cs
Normal file
@@ -0,0 +1,31 @@
|
||||
using Infrastructure.Verticals.Jobs;
|
||||
using Quartz;
|
||||
|
||||
namespace Executable.Jobs;
|
||||
|
||||
[DisallowConcurrentExecution]
|
||||
public sealed class GenericJob<T> : IJob
|
||||
where T : GenericHandler
|
||||
{
|
||||
private readonly ILogger<GenericJob<T>> _logger;
|
||||
private readonly T _handler;
|
||||
|
||||
|
||||
public GenericJob(ILogger<GenericJob<T>> logger, T handler)
|
||||
{
|
||||
_logger = logger;
|
||||
_handler = handler;
|
||||
}
|
||||
|
||||
public async Task Execute(IJobExecutionContext context)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _handler.ExecuteAsync();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "{name} failed", typeof(T).Name);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
using Infrastructure.Verticals.QueueCleaner;
|
||||
using Quartz;
|
||||
|
||||
namespace Executable.Jobs;
|
||||
|
||||
[DisallowConcurrentExecution]
|
||||
public sealed class QueueCleanerJob : IJob
|
||||
{
|
||||
private readonly ILogger<QueueCleanerJob> _logger;
|
||||
private readonly QueueCleaner _queueCleaner;
|
||||
|
||||
public QueueCleanerJob(
|
||||
ILogger<QueueCleanerJob> logger,
|
||||
QueueCleaner queueCleaner
|
||||
)
|
||||
{
|
||||
_logger = logger;
|
||||
_queueCleaner = queueCleaner;
|
||||
}
|
||||
|
||||
public async Task Execute(IJobExecutionContext context)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _queueCleaner.ExecuteAsync();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, $"{nameof(QueueCleanerJob)} failed");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,7 @@
|
||||
"ContentBlocker": "0/10 * * * * ?"
|
||||
},
|
||||
"ContentBlocker": {
|
||||
"Enabled": false,
|
||||
"Enabled": true,
|
||||
"Blacklist": {
|
||||
"Enabled": false,
|
||||
"Path": "https://raw.githubusercontent.com/flmorg/cleanuperr/refs/heads/main/blacklist"
|
||||
@@ -23,7 +23,8 @@
|
||||
}
|
||||
},
|
||||
"QueueCleaner": {
|
||||
"Enabled": true
|
||||
"Enabled": true,
|
||||
"RunSequentially": true
|
||||
},
|
||||
"qBittorrent": {
|
||||
"Enabled": true,
|
||||
|
||||
@@ -23,7 +23,8 @@
|
||||
}
|
||||
},
|
||||
"QueueCleaner": {
|
||||
"Enabled": true
|
||||
"Enabled": true,
|
||||
"RunSequentially": true
|
||||
},
|
||||
"qBittorrent": {
|
||||
"Enabled": true,
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
<PackageReference Include="Microsoft.Extensions.Http" Version="8.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Options" Version="8.0.1" />
|
||||
<PackageReference Include="QBittorrent.Client" Version="1.9.24285.1" />
|
||||
<PackageReference Include="Quartz" Version="3.13.1" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -3,21 +3,15 @@ using Domain.Arr.Queue;
|
||||
using Domain.Enums;
|
||||
using Infrastructure.Verticals.Arr;
|
||||
using Infrastructure.Verticals.DownloadClient;
|
||||
using Infrastructure.Verticals.Jobs;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
namespace Infrastructure.Verticals.ContentBlocker;
|
||||
|
||||
public sealed class ContentBlocker : IDisposable
|
||||
public sealed class ContentBlocker : GenericHandler
|
||||
{
|
||||
private readonly ILogger<ContentBlocker> _logger;
|
||||
private readonly SonarrConfig _sonarrConfig;
|
||||
private readonly RadarrConfig _radarrConfig;
|
||||
private readonly SonarrClient _sonarrClient;
|
||||
private readonly RadarrClient _radarrClient;
|
||||
private readonly ArrQueueIterator _arrArrQueueIterator;
|
||||
private readonly BlocklistProvider _blocklistProvider;
|
||||
private readonly IDownloadService _downloadService;
|
||||
|
||||
public ContentBlocker(
|
||||
ILogger<ContentBlocker> logger,
|
||||
@@ -28,48 +22,18 @@ public sealed class ContentBlocker : IDisposable
|
||||
ArrQueueIterator arrArrQueueIterator,
|
||||
BlocklistProvider blocklistProvider,
|
||||
DownloadServiceFactory downloadServiceFactory
|
||||
)
|
||||
) : base(logger, sonarrConfig.Value, radarrConfig.Value, sonarrClient, radarrClient, arrArrQueueIterator, downloadServiceFactory)
|
||||
{
|
||||
_logger = logger;
|
||||
_sonarrConfig = sonarrConfig.Value;
|
||||
_radarrConfig = radarrConfig.Value;
|
||||
_sonarrClient = sonarrClient;
|
||||
_radarrClient = radarrClient;
|
||||
_arrArrQueueIterator = arrArrQueueIterator;
|
||||
_blocklistProvider = blocklistProvider;
|
||||
_downloadService = downloadServiceFactory.CreateDownloadClient();
|
||||
}
|
||||
|
||||
public async Task ExecuteAsync()
|
||||
public override async Task ExecuteAsync()
|
||||
{
|
||||
await _blocklistProvider.LoadBlocklistAsync();
|
||||
await _downloadService.LoginAsync();
|
||||
|
||||
await ProcessArrConfigAsync(_sonarrConfig, InstanceType.Sonarr);
|
||||
await ProcessArrConfigAsync(_radarrConfig, InstanceType.Radarr);
|
||||
await base.ExecuteAsync();
|
||||
}
|
||||
|
||||
private async Task ProcessArrConfigAsync(ArrConfig config, InstanceType instanceType)
|
||||
{
|
||||
if (!config.Enabled)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (ArrInstance arrInstance in config.Instances)
|
||||
{
|
||||
try
|
||||
{
|
||||
await ProcessInstanceAsync(arrInstance, instanceType);
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
_logger.LogError(exception, "failed to block content for {type} instance | {url}", instanceType, arrInstance.Url);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async Task ProcessInstanceAsync(ArrInstance instance, InstanceType instanceType)
|
||||
protected override async Task ProcessInstanceAsync(ArrInstance instance, InstanceType instanceType)
|
||||
{
|
||||
ArrClient arrClient = GetClient(instanceType);
|
||||
|
||||
@@ -77,6 +41,17 @@ public sealed class ContentBlocker : IDisposable
|
||||
{
|
||||
foreach (QueueRecord record in items)
|
||||
{
|
||||
if (record.Protocol is not "torrent")
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(record.DownloadId))
|
||||
{
|
||||
_logger.LogDebug("skip | download id is null for {title}", record.Title);
|
||||
continue;
|
||||
}
|
||||
|
||||
_logger.LogDebug("searching unwanted files for {title}", record.Title);
|
||||
await _downloadService.BlockUnwantedFilesAsync(record.DownloadId);
|
||||
}
|
||||
@@ -90,9 +65,4 @@ public sealed class ContentBlocker : IDisposable
|
||||
InstanceType.Radarr => _radarrClient,
|
||||
_ => throw new NotImplementedException($"instance type {type} is not yet supported")
|
||||
};
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_downloadService.Dispose();
|
||||
}
|
||||
}
|
||||
@@ -49,7 +49,8 @@ public sealed class DelugeService : IDownloadService
|
||||
_logger.LogDebug(exception, "failed to find torrent {hash} in the download client", hash);
|
||||
}
|
||||
|
||||
if (contents is null)
|
||||
// if no files found, torrent might be stuck in Downloading metadata
|
||||
if (contents?.Contents?.Count is null or 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -27,6 +27,11 @@ public sealed class QBitService : IDownloadService
|
||||
|
||||
public async Task LoginAsync()
|
||||
{
|
||||
if (string.IsNullOrEmpty(_config.Username) && string.IsNullOrEmpty(_config.Password))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
await _client.LoginAsync(_config.Username, _config.Password);
|
||||
}
|
||||
|
||||
@@ -48,18 +53,14 @@ public sealed class QBitService : IDownloadService
|
||||
|
||||
IReadOnlyList<TorrentContent>? files = await _client.GetTorrentContentsAsync(hash);
|
||||
|
||||
if (files is null)
|
||||
// if no files found, torrent might be stuck in Downloading metadata
|
||||
if (files?.Count is null or 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// if all files are marked as skip
|
||||
if (files.All(x => x.Priority is TorrentContentPriority.Skip))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
// if all files are marked as skip
|
||||
return files.All(x => x.Priority is TorrentContentPriority.Skip);
|
||||
}
|
||||
|
||||
public async Task BlockUnwantedFilesAsync(string hash)
|
||||
|
||||
@@ -41,7 +41,8 @@ public sealed class TransmissionService : IDownloadService
|
||||
{
|
||||
TorrentInfo? torrent = await GetTorrentAsync(hash);
|
||||
|
||||
if (torrent is null)
|
||||
// if no files found, torrent might be stuck in Downloading metadata
|
||||
if (torrent?.FileStats?.Length is null or 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
90
code/Infrastructure/Verticals/Jobs/GenericHandler.cs
Normal file
90
code/Infrastructure/Verticals/Jobs/GenericHandler.cs
Normal file
@@ -0,0 +1,90 @@
|
||||
using Common.Configuration;
|
||||
using Domain.Arr.Queue;
|
||||
using Domain.Enums;
|
||||
using Infrastructure.Verticals.Arr;
|
||||
using Infrastructure.Verticals.DownloadClient;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace Infrastructure.Verticals.Jobs;
|
||||
|
||||
public abstract class GenericHandler : IDisposable
|
||||
{
|
||||
protected readonly ILogger<GenericHandler> _logger;
|
||||
protected readonly SonarrConfig _sonarrConfig;
|
||||
protected readonly RadarrConfig _radarrConfig;
|
||||
protected readonly SonarrClient _sonarrClient;
|
||||
protected readonly RadarrClient _radarrClient;
|
||||
protected readonly ArrQueueIterator _arrArrQueueIterator;
|
||||
protected readonly IDownloadService _downloadService;
|
||||
|
||||
protected GenericHandler(
|
||||
ILogger<GenericHandler> logger,
|
||||
SonarrConfig sonarrConfig,
|
||||
RadarrConfig radarrConfig,
|
||||
SonarrClient sonarrClient,
|
||||
RadarrClient radarrClient,
|
||||
ArrQueueIterator arrArrQueueIterator,
|
||||
DownloadServiceFactory downloadServiceFactory
|
||||
)
|
||||
{
|
||||
_logger = logger;
|
||||
_sonarrConfig = sonarrConfig;
|
||||
_radarrConfig = radarrConfig;
|
||||
_sonarrClient = sonarrClient;
|
||||
_radarrClient = radarrClient;
|
||||
_arrArrQueueIterator = arrArrQueueIterator;
|
||||
_downloadService = downloadServiceFactory.CreateDownloadClient();
|
||||
}
|
||||
|
||||
public virtual async Task ExecuteAsync()
|
||||
{
|
||||
await _downloadService.LoginAsync();
|
||||
|
||||
await ProcessArrConfigAsync(_sonarrConfig, InstanceType.Sonarr);
|
||||
await ProcessArrConfigAsync(_radarrConfig, InstanceType.Radarr);
|
||||
}
|
||||
|
||||
public virtual void Dispose()
|
||||
{
|
||||
_downloadService.Dispose();
|
||||
}
|
||||
|
||||
protected abstract Task ProcessInstanceAsync(ArrInstance instance, InstanceType instanceType);
|
||||
|
||||
protected async Task ProcessArrConfigAsync(ArrConfig config, InstanceType instanceType)
|
||||
{
|
||||
if (!config.Enabled)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (ArrInstance arrInstance in config.Instances)
|
||||
{
|
||||
try
|
||||
{
|
||||
await ProcessInstanceAsync(arrInstance, instanceType);
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
_logger.LogError(exception, "failed to clean {type} instance | {url}", instanceType, arrInstance.Url);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected ArrClient GetClient(InstanceType type) =>
|
||||
type switch
|
||||
{
|
||||
InstanceType.Sonarr => _sonarrClient,
|
||||
InstanceType.Radarr => _radarrClient,
|
||||
_ => throw new NotImplementedException($"instance type {type} is not yet supported")
|
||||
};
|
||||
|
||||
protected int GetRecordId(InstanceType type, QueueRecord record) =>
|
||||
type switch
|
||||
{
|
||||
// TODO add episode id
|
||||
InstanceType.Sonarr => record.SeriesId,
|
||||
InstanceType.Radarr => record.MovieId,
|
||||
_ => throw new NotImplementedException($"instance type {type} is not yet supported")
|
||||
};
|
||||
}
|
||||
35
code/Infrastructure/Verticals/Jobs/JobChainingListener.cs
Normal file
35
code/Infrastructure/Verticals/Jobs/JobChainingListener.cs
Normal file
@@ -0,0 +1,35 @@
|
||||
using Quartz;
|
||||
|
||||
namespace Infrastructure.Verticals.Jobs;
|
||||
|
||||
public class JobChainingListener : IJobListener
|
||||
{
|
||||
private readonly string _nextJobName;
|
||||
|
||||
public JobChainingListener(string nextJobName)
|
||||
{
|
||||
_nextJobName = nextJobName;
|
||||
}
|
||||
|
||||
public string Name => nameof(JobChainingListener);
|
||||
|
||||
public Task JobExecutionVetoed(IJobExecutionContext context, CancellationToken cancellationToken) => Task.CompletedTask;
|
||||
|
||||
public Task JobToBeExecuted(IJobExecutionContext context, CancellationToken cancellationToken) => Task.CompletedTask;
|
||||
|
||||
public async Task JobWasExecuted(IJobExecutionContext context, JobExecutionException? jobException, CancellationToken cancellationToken)
|
||||
{
|
||||
if (string.IsNullOrEmpty(_nextJobName) || context.JobDetail.Key.Name == _nextJobName)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
IScheduler scheduler = context.Scheduler;
|
||||
JobKey nextJobKey = new(_nextJobName);
|
||||
|
||||
if (await scheduler.CheckExists(nextJobKey, cancellationToken))
|
||||
{
|
||||
await scheduler.TriggerJob(nextJobKey, cancellationToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,21 +3,14 @@ using Domain.Arr.Queue;
|
||||
using Domain.Enums;
|
||||
using Infrastructure.Verticals.Arr;
|
||||
using Infrastructure.Verticals.DownloadClient;
|
||||
using Infrastructure.Verticals.Jobs;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
namespace Infrastructure.Verticals.QueueCleaner;
|
||||
|
||||
public sealed class QueueCleaner : IDisposable
|
||||
public sealed class QueueCleaner : GenericHandler
|
||||
{
|
||||
private readonly ILogger<QueueCleaner> _logger;
|
||||
private readonly SonarrConfig _sonarrConfig;
|
||||
private readonly RadarrConfig _radarrConfig;
|
||||
private readonly SonarrClient _sonarrClient;
|
||||
private readonly RadarrClient _radarrClient;
|
||||
private readonly ArrQueueIterator _arrArrQueueIterator;
|
||||
private readonly IDownloadService _downloadService;
|
||||
|
||||
public QueueCleaner(
|
||||
ILogger<QueueCleaner> logger,
|
||||
IOptions<SonarrConfig> sonarrConfig,
|
||||
@@ -26,48 +19,11 @@ public sealed class QueueCleaner : IDisposable
|
||||
RadarrClient radarrClient,
|
||||
ArrQueueIterator arrArrQueueIterator,
|
||||
DownloadServiceFactory downloadServiceFactory
|
||||
)
|
||||
) : base(logger, sonarrConfig.Value, radarrConfig.Value, sonarrClient, radarrClient, arrArrQueueIterator, downloadServiceFactory)
|
||||
{
|
||||
_logger = logger;
|
||||
_sonarrConfig = sonarrConfig.Value;
|
||||
_radarrConfig = radarrConfig.Value;
|
||||
_sonarrClient = sonarrClient;
|
||||
_radarrClient = radarrClient;
|
||||
_arrArrQueueIterator = arrArrQueueIterator;
|
||||
_downloadService = downloadServiceFactory.CreateDownloadClient();
|
||||
}
|
||||
|
||||
public async Task ExecuteAsync()
|
||||
{
|
||||
await _downloadService.LoginAsync();
|
||||
|
||||
await ProcessArrConfigAsync(_sonarrConfig, InstanceType.Sonarr);
|
||||
await ProcessArrConfigAsync(_radarrConfig, InstanceType.Radarr);
|
||||
|
||||
// await _downloadClient.LogoutAsync();
|
||||
}
|
||||
|
||||
private async Task ProcessArrConfigAsync(ArrConfig config, InstanceType instanceType)
|
||||
{
|
||||
if (!config.Enabled)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (ArrInstance arrInstance in config.Instances)
|
||||
{
|
||||
try
|
||||
{
|
||||
await ProcessInstanceAsync(arrInstance, instanceType);
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
_logger.LogError(exception, "failed to clean {type} instance | {url}", instanceType, arrInstance.Url);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async Task ProcessInstanceAsync(ArrInstance instance, InstanceType instanceType)
|
||||
protected override async Task ProcessInstanceAsync(ArrInstance instance, InstanceType instanceType)
|
||||
{
|
||||
HashSet<int> itemsToBeRefreshed = [];
|
||||
ArrClient arrClient = GetClient(instanceType);
|
||||
@@ -101,26 +57,4 @@ public sealed class QueueCleaner : IDisposable
|
||||
|
||||
await arrClient.RefreshItemsAsync(instance, itemsToBeRefreshed);
|
||||
}
|
||||
|
||||
private ArrClient GetClient(InstanceType type) =>
|
||||
type switch
|
||||
{
|
||||
InstanceType.Sonarr => _sonarrClient,
|
||||
InstanceType.Radarr => _radarrClient,
|
||||
_ => throw new NotImplementedException($"instance type {type} is not yet supported")
|
||||
};
|
||||
|
||||
private int GetRecordId(InstanceType type, QueueRecord record) =>
|
||||
type switch
|
||||
{
|
||||
// TODO add episode id
|
||||
InstanceType.Sonarr => record.SeriesId,
|
||||
InstanceType.Radarr => record.MovieId,
|
||||
_ => throw new NotImplementedException($"instance type {type} is not yet supported")
|
||||
};
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_downloadService.Dispose();
|
||||
}
|
||||
}
|
||||
@@ -1,97 +0,0 @@
|
||||
{
|
||||
"file": 1,
|
||||
"format": 1
|
||||
}{
|
||||
"add_paused": false,
|
||||
"allow_remote": false,
|
||||
"auto_manage_prefer_seeds": false,
|
||||
"auto_managed": true,
|
||||
"cache_expiry": 60,
|
||||
"cache_size": 512,
|
||||
"copy_torrent_file": false,
|
||||
"daemon_port": 58846,
|
||||
"del_copy_torrent_file": false,
|
||||
"dht": true,
|
||||
"dont_count_slow_torrents": false,
|
||||
"download_location": "/downloads",
|
||||
"download_location_paths_list": [],
|
||||
"enabled_plugins": [
|
||||
"Label"
|
||||
],
|
||||
"enc_in_policy": 1,
|
||||
"enc_level": 2,
|
||||
"enc_out_policy": 1,
|
||||
"geoip_db_location": "/usr/share/GeoIP/GeoIP.dat",
|
||||
"ignore_limits_on_local_network": true,
|
||||
"info_sent": 0.0,
|
||||
"listen_interface": "",
|
||||
"listen_ports": [
|
||||
6882,
|
||||
6882
|
||||
],
|
||||
"listen_random_port": null,
|
||||
"listen_reuse_port": true,
|
||||
"listen_use_sys_port": false,
|
||||
"lsd": true,
|
||||
"max_active_downloading": 3,
|
||||
"max_active_limit": 8,
|
||||
"max_active_seeding": 5,
|
||||
"max_connections_global": 200,
|
||||
"max_connections_per_second": 20,
|
||||
"max_connections_per_torrent": -1,
|
||||
"max_download_speed": -1.0,
|
||||
"max_download_speed_per_torrent": -1,
|
||||
"max_half_open_connections": 50,
|
||||
"max_upload_slots_global": 4,
|
||||
"max_upload_slots_per_torrent": -1,
|
||||
"max_upload_speed": -1.0,
|
||||
"max_upload_speed_per_torrent": -1,
|
||||
"move_completed": false,
|
||||
"move_completed_path": "/downloads",
|
||||
"move_completed_paths_list": [],
|
||||
"natpmp": true,
|
||||
"new_release_check": true,
|
||||
"outgoing_interface": "",
|
||||
"outgoing_ports": [
|
||||
0,
|
||||
0
|
||||
],
|
||||
"path_chooser_accelerator_string": "Tab",
|
||||
"path_chooser_auto_complete_enabled": true,
|
||||
"path_chooser_max_popup_rows": 20,
|
||||
"path_chooser_show_chooser_button_on_localhost": true,
|
||||
"path_chooser_show_hidden_files": false,
|
||||
"peer_tos": "0x00",
|
||||
"plugins_location": "/config/plugins",
|
||||
"pre_allocate_storage": false,
|
||||
"prioritize_first_last_pieces": false,
|
||||
"proxy": {
|
||||
"anonymous_mode": false,
|
||||
"force_proxy": false,
|
||||
"hostname": "",
|
||||
"password": "",
|
||||
"port": 8080,
|
||||
"proxy_hostnames": true,
|
||||
"proxy_peer_connections": true,
|
||||
"proxy_tracker_connections": true,
|
||||
"type": 0,
|
||||
"username": ""
|
||||
},
|
||||
"queue_new_to_top": false,
|
||||
"random_outgoing_ports": true,
|
||||
"random_port": false,
|
||||
"rate_limit_ip_overhead": true,
|
||||
"remove_seed_at_ratio": false,
|
||||
"seed_time_limit": 180,
|
||||
"seed_time_ratio_limit": 7.0,
|
||||
"send_info": false,
|
||||
"sequential_download": false,
|
||||
"share_ratio_limit": 2.0,
|
||||
"shared": false,
|
||||
"stop_seed_at_ratio": false,
|
||||
"stop_seed_ratio": 2.0,
|
||||
"super_seeding": false,
|
||||
"torrentfiles_location": "/config/torrents",
|
||||
"upnp": true,
|
||||
"utpex": true
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
{
|
||||
"file": 1,
|
||||
"format": 1
|
||||
}{
|
||||
"labels": {
|
||||
"radarr": {
|
||||
"apply_max": false,
|
||||
"apply_move_completed": false,
|
||||
"apply_queue": false,
|
||||
"auto_add": false,
|
||||
"auto_add_trackers": [],
|
||||
"is_auto_managed": false,
|
||||
"max_connections": -1,
|
||||
"max_download_speed": -1,
|
||||
"max_upload_slots": -1,
|
||||
"max_upload_speed": -1,
|
||||
"move_completed": false,
|
||||
"move_completed_path": "",
|
||||
"prioritize_first_last": false,
|
||||
"remove_at_ratio": false,
|
||||
"stop_at_ratio": false,
|
||||
"stop_ratio": 2.0
|
||||
},
|
||||
"tv-sonarr": {
|
||||
"apply_max": false,
|
||||
"apply_move_completed": false,
|
||||
"apply_queue": false,
|
||||
"auto_add": false,
|
||||
"auto_add_trackers": [],
|
||||
"is_auto_managed": false,
|
||||
"max_connections": -1,
|
||||
"max_download_speed": -1,
|
||||
"max_upload_slots": -1,
|
||||
"max_upload_speed": -1,
|
||||
"move_completed": false,
|
||||
"move_completed_path": "",
|
||||
"prioritize_first_last": false,
|
||||
"remove_at_ratio": false,
|
||||
"stop_at_ratio": false,
|
||||
"stop_ratio": 2.0
|
||||
}
|
||||
},
|
||||
"torrent_labels": {
|
||||
"59ab2bc053430fe53e06a93e2eadb7acb6a6bf2c": "tv-sonarr",
|
||||
"5a31d5f1689f5f45fd85c275a37acd2c7b82fde1": "tv-sonarr",
|
||||
"6c890ff85b5317d5df291c3c23a782774e10e6fe": "radarr",
|
||||
"a4a1d1dd1db25763caa8f5e4d25ad72ef304094b": "radarr",
|
||||
"b72541215214be2a1d96ef6b29ca1305f5e5e1f6": "tv-sonarr"
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -16,571 +16,6 @@
|
||||
"pwd_sha1": "3ac8756d294abe4f6c9dfa084b7fc2c84ce32f68",
|
||||
"session_timeout": 3600,
|
||||
"sessions": {
|
||||
"00390c773fafe30cb393f53a920b48ac353b58ca27ac9ed64a1cbc61d5026677": {
|
||||
"expires": 1731936939.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"0379df23e58eb57a0ec781168c5acb1527be9ce1dc48a6dec201905358dbedd8": {
|
||||
"expires": 1731665164.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"03d38494090a758cbe3ecc1e8a004986528297c7200e58b36649e197276c95e3": {
|
||||
"expires": 1731718770.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"03fe5879beed5c299cd18472b64d31c4c610cd413059d7582312b002bb0eef03": {
|
||||
"expires": 1731689401.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"05c8e71ff1e411beb45e278e786fbde8c893854e2906f3111dd48f943082eba5": {
|
||||
"expires": 1731593711.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"0cce3c4e10dcdebd921e19905c9ce3c162cefafadbf35b3c64a1932860af0e7d": {
|
||||
"expires": 1731721234.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"0d5bce647f6368877290f7be8a0f63f070039dd76027158278143b2ea6078a42": {
|
||||
"expires": 1731665495.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"0f95357a4b9994584b429a5facaad735bc1e0adb0f994b7fad82318f589de991": {
|
||||
"expires": 1731718993.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"15c8cf06252ea0039bc2569d4121378baa3287594f9148d4fb26e999966e5538": {
|
||||
"expires": 1731714201.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"15d5edb14093bb821dbef9080853e00f969860add39bd21e301172ae911713b1": {
|
||||
"expires": 1731665102.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"17f7a731a26bdde434e8f4edb6043c4699efa29b982ad1f5df26676747b400a7": {
|
||||
"expires": 1731658344.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"1800115899b60e88b29483c4656f9c56c58d38c008d96149bb70fb5e9d26a10c": {
|
||||
"expires": 1731939230.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"1970022246cbb41f07d1242920163980e93e4e96f11864ffcf047c8cb5cf9908": {
|
||||
"expires": 1731706575.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"19daad7642cf7f056083ff2868c9565ff8b2f6750eae91d5b235989089239bdc": {
|
||||
"expires": 1731689407.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"1b525ddd164c645ec47f1b2b58044cdf32f90800bc1973afb7b56a5814b813da": {
|
||||
"expires": 1731711800.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"1da54bf8d0c73023d11e1cb91586b088898ef5a37d146c108bfe2a9633499b63": {
|
||||
"expires": 1731693609.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"2095c759cb9b9ce96ab3bf3f07301e8dd71de75aeed2d4db957d2227adbc56f5": {
|
||||
"expires": 1731664924.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"2185646cfe4fa4f9892ea3df734b02b31ab7dfeb0f0868a6c730f04328b1a87a": {
|
||||
"expires": 1731716848.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"2270be625fa3bf61e919e8c495bc6c7868e907709e6b06c533727d0469df61c9": {
|
||||
"expires": 1731714357.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"2438a71a5850697dfb99ba24afa21f82a99ca32bf59a05f5dbd8c0f8bf645e4f": {
|
||||
"expires": 1731691862.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"24930581ae0aa9a0e0a520f3cccfb71f50308be43b15cb5b0fb3404a7d9a8a2f": {
|
||||
"expires": 1731617366.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"28920404a5f4638ebcdb4eb4addad4db19ee0bdd8505457cce7b6f81ba06b363": {
|
||||
"expires": 1731712508.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"29f26fc40c0be11ba12209d142e8a662ad3c5f58f4c9e2a4dcb9bf81a9eac0ef": {
|
||||
"expires": 1731692292.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"2b4e3dc65d727790957c28d570f474ef0ffacc98bf1372b11ef4c2eacfde585c": {
|
||||
"expires": 1731711706.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"2c1d2ff923df8718a46c89e575a2ebbcede10f9c585e5fe2ddb3a4a43ddabafa": {
|
||||
"expires": 1731719810.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"2c9235163d9dc1af694609caf5624465e872a9a9efaae9c5dd7de97190911970": {
|
||||
"expires": 1731592559.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"2ee0d1c4f504c080441ae4a8e61546077405ef9dce3ec291923d761b69f69586": {
|
||||
"expires": 1731659695.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"317679509ed59022afd20bd8a891cc759fadd7ca9c85c88ac0b05cf9b9ea1791": {
|
||||
"expires": 1731716722.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"31b14f8de2ba1de58011ecf8dfe7f8681ae4af543928f3903a9c080374a7fb08": {
|
||||
"expires": 1731692998.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"337641d938548a3261f67b1b1e295e8d09b248d2c7358a84a2914c803e2c9827": {
|
||||
"expires": 1731719800.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"33b864b8ab214816273040e0456297da90a7f2e5bf352368f906e64cc363ccdf": {
|
||||
"expires": 1731659084.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"36d3798ad875c70807a02eac3b7fd4279550cb9dfa6ccb530b66c74f0d577a52": {
|
||||
"expires": 1731939210.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"3b14137d9b57080d81e0a4532ad703dc91e2542be56415f58feca56231851eb0": {
|
||||
"expires": 1731714081.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"3b6c35a4cde25fa4a846a3df5d41562e798089db25eb21b9363cccdba2a3e093": {
|
||||
"expires": 1731939483.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"3d7bf91cb3e15eb82297ab54bae4cc6e06a42b54679e5f963a580fdf0d4bcf57": {
|
||||
"expires": 1731719791.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"3e7234797204e1672caf4b5b5ef450898f931ee48dcffae0b3b89e138434c036": {
|
||||
"expires": 1731723178.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"3e79e3bd1e01d10a6017e61b152151150deeb5185781a6325cd0aa4b9bfec47d": {
|
||||
"expires": 1731719395.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"3e9020e47c34087dc02ff6a5b396b7f338cc3249c9812e320490c33d9e7ce245": {
|
||||
"expires": 1731719545.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"44c3d9b212384742b7e0ac2a8c9a2bb48cf146a403ba01b6137051f54953a38a": {
|
||||
"expires": 1731938866.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"470c34122403b8dec692f9079e892ca92d8bf13cdd6c2814b6d829996e5f8b67": {
|
||||
"expires": 1731664624.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"4a47ca4a624fff02d9970d7e8a341ec08b8076cade949348795e45002c18556d": {
|
||||
"expires": 1731718983.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"4e88bdb753b76965909d1a2eabcc6ef5c12dab11cb0f32185506a19192f9cae2": {
|
||||
"expires": 1731935979.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"51ce01dfe69d8ae6afb019a05046154f4b51ef64569e3424e78a80957a11ba8c": {
|
||||
"expires": 1731693589.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"538a9fd86a56727c571da77b70353ac0fa5568442ea17d69a817a579d37679ac": {
|
||||
"expires": 1731939264.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"566fe0345702f6e2f30effef42ef664c46ac0e7f21aa3d2b414a1f290230fba6": {
|
||||
"expires": 1731664385.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"57df9cb450fd2dd9717b9ab03bbce3492603188c11f5e83af8d1bb38ab36ed01": {
|
||||
"expires": 1731938872.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"587362acb21285d814a9861a93b3f0e017ee9efb1bfe63343c13c09e7ea80f91": {
|
||||
"expires": 1731716759.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"58f7b011411dbad96eadc573eb164e1cdb6f96d52febbb8d4adb2cdda6ed80ef": {
|
||||
"expires": 1731936289.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"5cb4123b4b425f1d8a6accf4c02386feea7f20bf6171291f715c2cd99bfb02c0": {
|
||||
"expires": 1731665482.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"5d9819c229e5f79b767a88db9c78b24998b424a66e8a7ba0039553b7c54051ec": {
|
||||
"expires": 1731617370.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"5e6cb57d0f9d97aa3ed75fefd40c8060a085c04727886511f0e7db126b203d43": {
|
||||
"expires": 1731721196.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"5e74fdaca0c6c7e7afec714793677646ff89d00ae35908a7125d6cf50ea0702c": {
|
||||
"expires": 1731603184.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"5fbe1b057086c9f17b5a4d7d9fd9f41eab0305ea89b5b1de2ca633b0b38aab50": {
|
||||
"expires": 1731937913.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"644aae458bd0a092fe342d1f020d4b7eccff9cf6cfc0677fe0d9531754edaff0": {
|
||||
"expires": 1731692249.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"653493a22274078fc44d52acb337b56bcd4084de2f0a1b6b79be186550a30cb3": {
|
||||
"expires": 1731591365.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"66618b25addefa9f12946c5afb65e8d690c5a871fff3d03fb796751a9eee0d41": {
|
||||
"expires": 1731591683.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"684613e83cfde35d79917108a4091de4c585e1ff627eee0d904920759dc3ea53": {
|
||||
"expires": 1731712313.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"68ecec112a27957857622d4c0ba02824f5e03981db6f51fa01c0be8ac893c6f1": {
|
||||
"expires": 1731591683.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"69d6aa5b5eae433a357dc92fe12bbfb7fd29629425f0edbe55e0ac4e8df112aa": {
|
||||
"expires": 1731718574.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"6ade7fdf14f334646e2ad2f6b627146a69e0b896d0930a996b4f9df7bc4cf28e": {
|
||||
"expires": 1731939300.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"6c19cb32acd64f6c1543bf07dba3aee5ca5d3ba71f754e1e95acc3da5dc6aa27": {
|
||||
"expires": 1731718629.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"71c8d2cf33b22285f43c5855bdabd9ea25a18b177cfe28056c8bed41776d0ced": {
|
||||
"expires": 1731664874.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"745592d9be94482df01bc76010f58844175050e2bb7c0974de4e1f852a589554": {
|
||||
"expires": 1731689116.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"82ee9a0b4fde768d0580e85633012235fdf4683c0115ec121ba17282075483e7": {
|
||||
"expires": 1731708818.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"8346f9faa70bd614131a9115bcb33168ae9af221be0270e967c01e9c1c58129e": {
|
||||
"expires": 1731693061.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"861dbf07e0df2c29fedc8fcd5a346b4dcb1a0ece0f741befc3c72d3fadc82268": {
|
||||
"expires": 1731722565.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"870afa2ad6a0832fb19680b3bbf0bfd99de377c9cbaaff3cf6bf5a633fe541c3": {
|
||||
"expires": 1731933969.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"88be8381b68afe4c56b949c2588dec6b57f2dbe5ae20faacb06c37b7cbdc8a8b": {
|
||||
"expires": 1731718780.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"8a010b80566da20d356b77df700e2444292eea50a928eb7613bc874462436f36": {
|
||||
"expires": 1731602951.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"8be44833b5b32f8ed1eb2e6dba5ec7aa49fc4307dbd18d03859c96d227a9058b": {
|
||||
"expires": 1731658179.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"8d5c74abebafb8bfc72a3c33c17195d8e6a52c4505b1ccff9eda1a81f9a74ef7": {
|
||||
"expires": 1731939423.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"8e2e998fabc8429ef4ba385a4d4ed401fbe2508192b65dc72280cdfc086948e0": {
|
||||
"expires": 1731692291.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"8e8ed10c9cb8ced98d7736a81b68990fff019ca2b32dd9093209b132906b68c3": {
|
||||
"expires": 1731692267.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"8fbfaad4b9fc517f848b6f052be51b3a2cd494247078bf053460f8b80e53065a": {
|
||||
"expires": 1731595963.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"8fddab944e5a0d45750d5da5b78230387228e12f27ad040316394a4d6b166b5d": {
|
||||
"expires": 1731939300.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"9364816c6b2e739b647c43ad27b2d52593c2d59a5181aefcda12d04ea31d9fc6": {
|
||||
"expires": 1731718765.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"9a29ef6e50f415e5ccd36140eeab85a4409ae271470c1d51a32e0791c75ea588": {
|
||||
"expires": 1731658513.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"9ac87d5bf293ab9dc0bb5dcefe1e65eb7e166c4b3f5a162529683d5d866d7f9f": {
|
||||
"expires": 1731937503.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"9b266dafeef7c956bb4d9e987791975b64e7333de860a0d9173e211524cc8540": {
|
||||
"expires": 1731591553.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"9c03a8e39a5ff42c889c73ad9d4d5d84e76747322dfdf714ccb74a0d37923682": {
|
||||
"expires": 1731719394.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"9d1df8609ca6ada923c85b2721c0b3e606b92372478b5ca943cb52a7b8886951": {
|
||||
"expires": 1731939230.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"9f9de499b714f5c7dcb873f1141ad463a34e7c34eaa62cc988167505e4f5ac54": {
|
||||
"expires": 1731939220.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"a484b99afebac4ce74b6f52cad90448496fb80f2d8756e503776072739748a57": {
|
||||
"expires": 1731938872.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"a48e673783b5c56edfd5b5bc73b1f9c527dc1ca6da3aef82f61692b40095b39c": {
|
||||
"expires": 1731939445.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"a7ba418572d761f89d13fd7a11d682a3c821406ccd29f3e6d683966d0fb3d3ab": {
|
||||
"expires": 1731720041.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"a7cc53afae41ab5e800893c7271acf272f34b604f7e1ace8c3f0232606d01e2b": {
|
||||
"expires": 1731719810.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"a8c19794aaac3afd733588d42d7ffddc5f8de336d4bd8aa5cf9c1ff36cc9d590": {
|
||||
"expires": 1731933957.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"aa301c95f4890c38baa814503e940f28143304ad55dbfaea2db8aaec90169031": {
|
||||
"expires": 1731599734.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"ac98337f159cdc03b4865b80c78d53ab39502291fa19cc0b60233209e1d92bb7": {
|
||||
"expires": 1731689363.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"adf9d353a020d93e54b32b14c28525a7e6f33fd735144d7b778a4e517192b7c5": {
|
||||
"expires": 1731691941.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"ae14e4adfe0504f8dfb3fcb575606e67f57e950cdf88f00ca76e0af215c2b413": {
|
||||
"expires": 1731935980.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"ae48fe0ecea0704704bc6327b6bf3258de377b08fa4d76b4f69b8470852960c6": {
|
||||
"expires": 1731591544.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"ae967211fa06ac26d96e3207e67c136efc6367acc92d608e52e1f204b5bd3da4": {
|
||||
"expires": 1731664535.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"b0f55c6cad8bc2230754fd1bbeebfedd31ba244eac96e8d02be6d6a33b542b4f": {
|
||||
"expires": 1731592529.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"b689520f2e3ccf2164da5dba4bac111d4cbc6d3bdcf44361127baa0068623cd0": {
|
||||
"expires": 1731717015.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"bb92c09264296d8c12fac5d2abed2224b25a85d5a46d87f4a4351da76d00566e": {
|
||||
"expires": 1731720040.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"bbba0f20f9c1639ebfcaedb54a87d4b968bc953f72b06105f6d995f5eee9bff7": {
|
||||
"expires": 1731591455.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"c1a50b58a364f294755666d0e748ba2a06fbe55de758453180920774525214c8": {
|
||||
"expires": 1731719336.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"c6af2f6a6627cbbf18696f1b8b904346726800d05b137d251ee28b699fbd858c": {
|
||||
"expires": 1731665294.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"c86527a0aae330a71fc324a233ad876d420a54d387794374d126e7d6a0f19f92": {
|
||||
"expires": 1731692356.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"cd65741faf869e193c4e2a51e9454cf88598f58987b2ce559ef3d6bfa98e7605": {
|
||||
"expires": 1731591572.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"cdb4f2d14ab7de91b8be1261be40bf59f2bfa0e5e6327166ffa08cfa74eb357a": {
|
||||
"expires": 1731692237.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"d0f2c477a500bffcdcfbc56907df1b322200d9f7a801285bbe5440e5bca5e8c4": {
|
||||
"expires": 1731711859.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"d3a9186f1c2c81d8085d86c09ddd4fc5e205f61f25f3cabbc1ee379e52304c77": {
|
||||
"expires": 1731718780.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"d74ba4649e1a5a098d42c2f62472c94d4484f43b0979cbbd48b464ac5f20e49b": {
|
||||
"expires": 1731716625.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"d769dedd53059553cb54961641c0cbdf818533db06764fbcd5557a7200247c28": {
|
||||
"expires": 1731718992.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"d95d211a839a71c0bb00d2504f18deb81af2d0ab7183478543a5d28654a37197": {
|
||||
"expires": 1731658629.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"da6f45956cf8b0b4a5552166dfe1372437b25179e0d24bfbeaba745d28febb53": {
|
||||
"expires": 1731937514.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"df84bacd66f8dbf2d1f150d839029e11b3ce56c0536183fd33656685bd446c44": {
|
||||
"expires": 1731719340.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"e8be12b35aa13a67bc7d3332d373b4117493319625c1ed87e3335ab8d09b9054": {
|
||||
"expires": 1731686353.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"f04dce449eb7dc69f7973906564c4aa224ff20595a3f2a3bfedbcd23ffaa9117": {
|
||||
"expires": 1731658418.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"f4472d087a796ef1f431c44d4f6e9d46ecfe88acce21368a7d85fc31e1efc1e9": {
|
||||
"expires": 1731711611.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"f62a451ea2933e56ff9dae2299e374477adb54d8c8285ea59d2ab15b9a80bd13": {
|
||||
"expires": 1731712500.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
}
|
||||
},
|
||||
"show_session_speed": false,
|
||||
"show_sidebar": true,
|
||||
|
||||
@@ -1,480 +0,0 @@
|
||||
{
|
||||
"file": 2,
|
||||
"format": 1
|
||||
}{
|
||||
"base": "/",
|
||||
"cert": "ssl/daemon.cert",
|
||||
"default_daemon": "",
|
||||
"enabled_plugins": [],
|
||||
"first_login": false,
|
||||
"https": false,
|
||||
"interface": "0.0.0.0",
|
||||
"language": "",
|
||||
"pkey": "ssl/daemon.pkey",
|
||||
"port": 8112,
|
||||
"pwd_salt": "2bc0ed67acc6876dda1a1632594090478fdeab60",
|
||||
"pwd_sha1": "3ac8756d294abe4f6c9dfa084b7fc2c84ce32f68",
|
||||
"session_timeout": 3600,
|
||||
"sessions": {
|
||||
"0379df23e58eb57a0ec781168c5acb1527be9ce1dc48a6dec201905358dbedd8": {
|
||||
"expires": 1731665164.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"03d38494090a758cbe3ecc1e8a004986528297c7200e58b36649e197276c95e3": {
|
||||
"expires": 1731718770.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"03fe5879beed5c299cd18472b64d31c4c610cd413059d7582312b002bb0eef03": {
|
||||
"expires": 1731689401.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"05c8e71ff1e411beb45e278e786fbde8c893854e2906f3111dd48f943082eba5": {
|
||||
"expires": 1731593711.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"0cce3c4e10dcdebd921e19905c9ce3c162cefafadbf35b3c64a1932860af0e7d": {
|
||||
"expires": 1731721234.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"0d5bce647f6368877290f7be8a0f63f070039dd76027158278143b2ea6078a42": {
|
||||
"expires": 1731665495.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"0f95357a4b9994584b429a5facaad735bc1e0adb0f994b7fad82318f589de991": {
|
||||
"expires": 1731718993.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"15c8cf06252ea0039bc2569d4121378baa3287594f9148d4fb26e999966e5538": {
|
||||
"expires": 1731714201.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"15d5edb14093bb821dbef9080853e00f969860add39bd21e301172ae911713b1": {
|
||||
"expires": 1731665102.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"17f7a731a26bdde434e8f4edb6043c4699efa29b982ad1f5df26676747b400a7": {
|
||||
"expires": 1731658344.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"1970022246cbb41f07d1242920163980e93e4e96f11864ffcf047c8cb5cf9908": {
|
||||
"expires": 1731706575.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"19daad7642cf7f056083ff2868c9565ff8b2f6750eae91d5b235989089239bdc": {
|
||||
"expires": 1731689407.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"1b525ddd164c645ec47f1b2b58044cdf32f90800bc1973afb7b56a5814b813da": {
|
||||
"expires": 1731711800.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"1da54bf8d0c73023d11e1cb91586b088898ef5a37d146c108bfe2a9633499b63": {
|
||||
"expires": 1731693609.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"2095c759cb9b9ce96ab3bf3f07301e8dd71de75aeed2d4db957d2227adbc56f5": {
|
||||
"expires": 1731664924.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"2185646cfe4fa4f9892ea3df734b02b31ab7dfeb0f0868a6c730f04328b1a87a": {
|
||||
"expires": 1731716848.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"2270be625fa3bf61e919e8c495bc6c7868e907709e6b06c533727d0469df61c9": {
|
||||
"expires": 1731714357.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"2438a71a5850697dfb99ba24afa21f82a99ca32bf59a05f5dbd8c0f8bf645e4f": {
|
||||
"expires": 1731691862.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"24930581ae0aa9a0e0a520f3cccfb71f50308be43b15cb5b0fb3404a7d9a8a2f": {
|
||||
"expires": 1731617366.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"28920404a5f4638ebcdb4eb4addad4db19ee0bdd8505457cce7b6f81ba06b363": {
|
||||
"expires": 1731712508.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"29f26fc40c0be11ba12209d142e8a662ad3c5f58f4c9e2a4dcb9bf81a9eac0ef": {
|
||||
"expires": 1731692292.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"2b4e3dc65d727790957c28d570f474ef0ffacc98bf1372b11ef4c2eacfde585c": {
|
||||
"expires": 1731711706.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"2c1d2ff923df8718a46c89e575a2ebbcede10f9c585e5fe2ddb3a4a43ddabafa": {
|
||||
"expires": 1731719810.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"2c9235163d9dc1af694609caf5624465e872a9a9efaae9c5dd7de97190911970": {
|
||||
"expires": 1731592559.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"2ee0d1c4f504c080441ae4a8e61546077405ef9dce3ec291923d761b69f69586": {
|
||||
"expires": 1731659695.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"317679509ed59022afd20bd8a891cc759fadd7ca9c85c88ac0b05cf9b9ea1791": {
|
||||
"expires": 1731716722.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"31b14f8de2ba1de58011ecf8dfe7f8681ae4af543928f3903a9c080374a7fb08": {
|
||||
"expires": 1731692998.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"337641d938548a3261f67b1b1e295e8d09b248d2c7358a84a2914c803e2c9827": {
|
||||
"expires": 1731719800.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"33b864b8ab214816273040e0456297da90a7f2e5bf352368f906e64cc363ccdf": {
|
||||
"expires": 1731659084.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"3b14137d9b57080d81e0a4532ad703dc91e2542be56415f58feca56231851eb0": {
|
||||
"expires": 1731714081.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"3d7bf91cb3e15eb82297ab54bae4cc6e06a42b54679e5f963a580fdf0d4bcf57": {
|
||||
"expires": 1731719791.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"3e7234797204e1672caf4b5b5ef450898f931ee48dcffae0b3b89e138434c036": {
|
||||
"expires": 1731723178.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"3e79e3bd1e01d10a6017e61b152151150deeb5185781a6325cd0aa4b9bfec47d": {
|
||||
"expires": 1731719395.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"3e9020e47c34087dc02ff6a5b396b7f338cc3249c9812e320490c33d9e7ce245": {
|
||||
"expires": 1731719545.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"470c34122403b8dec692f9079e892ca92d8bf13cdd6c2814b6d829996e5f8b67": {
|
||||
"expires": 1731664624.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"4a47ca4a624fff02d9970d7e8a341ec08b8076cade949348795e45002c18556d": {
|
||||
"expires": 1731718983.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"51ce01dfe69d8ae6afb019a05046154f4b51ef64569e3424e78a80957a11ba8c": {
|
||||
"expires": 1731693589.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"566fe0345702f6e2f30effef42ef664c46ac0e7f21aa3d2b414a1f290230fba6": {
|
||||
"expires": 1731664385.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"587362acb21285d814a9861a93b3f0e017ee9efb1bfe63343c13c09e7ea80f91": {
|
||||
"expires": 1731716759.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"5cb4123b4b425f1d8a6accf4c02386feea7f20bf6171291f715c2cd99bfb02c0": {
|
||||
"expires": 1731665482.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"5d9819c229e5f79b767a88db9c78b24998b424a66e8a7ba0039553b7c54051ec": {
|
||||
"expires": 1731617370.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"5e6cb57d0f9d97aa3ed75fefd40c8060a085c04727886511f0e7db126b203d43": {
|
||||
"expires": 1731721196.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"5e74fdaca0c6c7e7afec714793677646ff89d00ae35908a7125d6cf50ea0702c": {
|
||||
"expires": 1731603184.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"644aae458bd0a092fe342d1f020d4b7eccff9cf6cfc0677fe0d9531754edaff0": {
|
||||
"expires": 1731692249.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"653493a22274078fc44d52acb337b56bcd4084de2f0a1b6b79be186550a30cb3": {
|
||||
"expires": 1731591365.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"66618b25addefa9f12946c5afb65e8d690c5a871fff3d03fb796751a9eee0d41": {
|
||||
"expires": 1731591683.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"684613e83cfde35d79917108a4091de4c585e1ff627eee0d904920759dc3ea53": {
|
||||
"expires": 1731712313.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"68ecec112a27957857622d4c0ba02824f5e03981db6f51fa01c0be8ac893c6f1": {
|
||||
"expires": 1731591683.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"69d6aa5b5eae433a357dc92fe12bbfb7fd29629425f0edbe55e0ac4e8df112aa": {
|
||||
"expires": 1731718574.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"6c19cb32acd64f6c1543bf07dba3aee5ca5d3ba71f754e1e95acc3da5dc6aa27": {
|
||||
"expires": 1731718629.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"71c8d2cf33b22285f43c5855bdabd9ea25a18b177cfe28056c8bed41776d0ced": {
|
||||
"expires": 1731664874.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"745592d9be94482df01bc76010f58844175050e2bb7c0974de4e1f852a589554": {
|
||||
"expires": 1731689116.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"82ee9a0b4fde768d0580e85633012235fdf4683c0115ec121ba17282075483e7": {
|
||||
"expires": 1731708818.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"8346f9faa70bd614131a9115bcb33168ae9af221be0270e967c01e9c1c58129e": {
|
||||
"expires": 1731693061.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"861dbf07e0df2c29fedc8fcd5a346b4dcb1a0ece0f741befc3c72d3fadc82268": {
|
||||
"expires": 1731722565.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"88be8381b68afe4c56b949c2588dec6b57f2dbe5ae20faacb06c37b7cbdc8a8b": {
|
||||
"expires": 1731718780.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"8a010b80566da20d356b77df700e2444292eea50a928eb7613bc874462436f36": {
|
||||
"expires": 1731602951.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"8be44833b5b32f8ed1eb2e6dba5ec7aa49fc4307dbd18d03859c96d227a9058b": {
|
||||
"expires": 1731658179.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"8e2e998fabc8429ef4ba385a4d4ed401fbe2508192b65dc72280cdfc086948e0": {
|
||||
"expires": 1731692291.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"8e8ed10c9cb8ced98d7736a81b68990fff019ca2b32dd9093209b132906b68c3": {
|
||||
"expires": 1731692267.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"8fbfaad4b9fc517f848b6f052be51b3a2cd494247078bf053460f8b80e53065a": {
|
||||
"expires": 1731595963.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"9364816c6b2e739b647c43ad27b2d52593c2d59a5181aefcda12d04ea31d9fc6": {
|
||||
"expires": 1731718765.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"9a29ef6e50f415e5ccd36140eeab85a4409ae271470c1d51a32e0791c75ea588": {
|
||||
"expires": 1731658513.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"9b266dafeef7c956bb4d9e987791975b64e7333de860a0d9173e211524cc8540": {
|
||||
"expires": 1731591553.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"9c03a8e39a5ff42c889c73ad9d4d5d84e76747322dfdf714ccb74a0d37923682": {
|
||||
"expires": 1731719394.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"a7ba418572d761f89d13fd7a11d682a3c821406ccd29f3e6d683966d0fb3d3ab": {
|
||||
"expires": 1731720041.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"a7cc53afae41ab5e800893c7271acf272f34b604f7e1ace8c3f0232606d01e2b": {
|
||||
"expires": 1731719810.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"aa301c95f4890c38baa814503e940f28143304ad55dbfaea2db8aaec90169031": {
|
||||
"expires": 1731599734.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"ac98337f159cdc03b4865b80c78d53ab39502291fa19cc0b60233209e1d92bb7": {
|
||||
"expires": 1731689363.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"adf9d353a020d93e54b32b14c28525a7e6f33fd735144d7b778a4e517192b7c5": {
|
||||
"expires": 1731691941.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"ae48fe0ecea0704704bc6327b6bf3258de377b08fa4d76b4f69b8470852960c6": {
|
||||
"expires": 1731591544.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"ae967211fa06ac26d96e3207e67c136efc6367acc92d608e52e1f204b5bd3da4": {
|
||||
"expires": 1731664535.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"b0f55c6cad8bc2230754fd1bbeebfedd31ba244eac96e8d02be6d6a33b542b4f": {
|
||||
"expires": 1731592529.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"b689520f2e3ccf2164da5dba4bac111d4cbc6d3bdcf44361127baa0068623cd0": {
|
||||
"expires": 1731717015.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"bb92c09264296d8c12fac5d2abed2224b25a85d5a46d87f4a4351da76d00566e": {
|
||||
"expires": 1731720040.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"bbba0f20f9c1639ebfcaedb54a87d4b968bc953f72b06105f6d995f5eee9bff7": {
|
||||
"expires": 1731591455.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"c1a50b58a364f294755666d0e748ba2a06fbe55de758453180920774525214c8": {
|
||||
"expires": 1731719336.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"c6af2f6a6627cbbf18696f1b8b904346726800d05b137d251ee28b699fbd858c": {
|
||||
"expires": 1731665294.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"c86527a0aae330a71fc324a233ad876d420a54d387794374d126e7d6a0f19f92": {
|
||||
"expires": 1731692356.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"cd65741faf869e193c4e2a51e9454cf88598f58987b2ce559ef3d6bfa98e7605": {
|
||||
"expires": 1731591572.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"cdb4f2d14ab7de91b8be1261be40bf59f2bfa0e5e6327166ffa08cfa74eb357a": {
|
||||
"expires": 1731692237.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"d0f2c477a500bffcdcfbc56907df1b322200d9f7a801285bbe5440e5bca5e8c4": {
|
||||
"expires": 1731711859.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"d3a9186f1c2c81d8085d86c09ddd4fc5e205f61f25f3cabbc1ee379e52304c77": {
|
||||
"expires": 1731718780.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"d74ba4649e1a5a098d42c2f62472c94d4484f43b0979cbbd48b464ac5f20e49b": {
|
||||
"expires": 1731716625.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"d769dedd53059553cb54961641c0cbdf818533db06764fbcd5557a7200247c28": {
|
||||
"expires": 1731718992.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"d95d211a839a71c0bb00d2504f18deb81af2d0ab7183478543a5d28654a37197": {
|
||||
"expires": 1731658629.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"df84bacd66f8dbf2d1f150d839029e11b3ce56c0536183fd33656685bd446c44": {
|
||||
"expires": 1731719340.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"e8be12b35aa13a67bc7d3332d373b4117493319625c1ed87e3335ab8d09b9054": {
|
||||
"expires": 1731686353.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"f04dce449eb7dc69f7973906564c4aa224ff20595a3f2a3bfedbcd23ffaa9117": {
|
||||
"expires": 1731658418.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"f4472d087a796ef1f431c44d4f6e9d46ecfe88acce21368a7d85fc31e1efc1e9": {
|
||||
"expires": 1731711611.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
},
|
||||
"f62a451ea2933e56ff9dae2299e374477adb54d8c8285ea59d2ab15b9a80bd13": {
|
||||
"expires": 1731712500.0,
|
||||
"level": 10,
|
||||
"login": "admin"
|
||||
}
|
||||
},
|
||||
"show_session_speed": false,
|
||||
"show_sidebar": true,
|
||||
"sidebar_multiple_filters": true,
|
||||
"sidebar_show_zero": false,
|
||||
"theme": "gray"
|
||||
}
|
||||
25
code/test/data/nginx/sonarr_bad_stuck_metadata.xml
Normal file
25
code/test/data/nginx/sonarr_bad_stuck_metadata.xml
Normal file
@@ -0,0 +1,25 @@
|
||||
<rss version="2.0">
|
||||
<channel>
|
||||
<title>Test feed</title>
|
||||
<link>http://nginx/custom/sonarr_bad_stuck_metadata.xml</link>
|
||||
<description>
|
||||
Test
|
||||
</description>
|
||||
<language>en-CA</language>
|
||||
<copyright> Test </copyright>
|
||||
<pubDate>Tue, 5 Nov 2024 22:02:13 -0400</pubDate>
|
||||
<lastBuildDate>Tue, 5 Nov 2024 22:02:13 -0400</lastBuildDate>
|
||||
<docs>https://validator.w3.org/feed/docs/rss2.html</docs>
|
||||
<ttl>30</ttl>
|
||||
<item>
|
||||
<title>Top.Gear.S23E01.720p.x265.HDTV.HEVC.-.YSTEAM</title>
|
||||
<description>Test</description>
|
||||
<size>4138858110</size>
|
||||
<link>magnet:?xt=urn:btih:cf82cf859b110af0ad3d94b846e006828417b193&dn=TPG.2301.720p.x265.yourserie.com.mkv</link>
|
||||
<guid isPermaLink="false">
|
||||
174674a88c8947f6f9057ac3f81efde384ed216cade43564ec450f2cb4677554
|
||||
</guid>
|
||||
<pubDate>Sat, 24 Sep 2022 22:02:13 -0300</pubDate>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
BIN
code/test/data/nginx/sonarr_bad_stuck_stalled.torrent
Normal file
BIN
code/test/data/nginx/sonarr_bad_stuck_stalled.torrent
Normal file
Binary file not shown.
25
code/test/data/nginx/sonarr_bad_stuck_stalled.xml
Normal file
25
code/test/data/nginx/sonarr_bad_stuck_stalled.xml
Normal file
@@ -0,0 +1,25 @@
|
||||
<rss version="2.0">
|
||||
<channel>
|
||||
<title>Test feed</title>
|
||||
<link>http://nginx/custom/sonarr_bad_stuck_metadata.xml</link>
|
||||
<description>
|
||||
Test
|
||||
</description>
|
||||
<language>en-CA</language>
|
||||
<copyright> Test </copyright>
|
||||
<pubDate>Tue, 5 Nov 2024 22:02:13 -0400</pubDate>
|
||||
<lastBuildDate>Tue, 5 Nov 2024 22:02:13 -0400</lastBuildDate>
|
||||
<docs>https://validator.w3.org/feed/docs/rss2.html</docs>
|
||||
<ttl>30</ttl>
|
||||
<item>
|
||||
<title>Top.Gear.S23E01.720p.x265.HDTV.HEVC.-.YSTEAM</title>
|
||||
<description>Test</description>
|
||||
<size>4138858110</size>
|
||||
<link>http://nginx/custom/sonarr_bad_stuck_stalled.torrent</link>
|
||||
<guid isPermaLink="false">
|
||||
174674a88c8947f6f9057ac3f81efde384ed216cade43564ec450f2cb4677554
|
||||
</guid>
|
||||
<pubDate>Sat, 24 Sep 2022 22:02:13 -0300</pubDate>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,2 +1,2 @@
|
||||
[Stats]
|
||||
AllStats=@Variant(\0\0\0\x1c\0\0\0\x2\0\0\0\x12\0\x41\0l\0l\0t\0i\0m\0\x65\0\x44\0L\0\0\0\x4\0\0\0\0\0Z\xd2\x1b\0\0\0\x12\0\x41\0l\0l\0t\0i\0m\0\x65\0U\0L\0\0\0\x4\0\0\0\0\0\x90\xf9\xfc)
|
||||
AllStats=@Variant(\0\0\0\x1c\0\0\0\x2\0\0\0\x12\0\x41\0l\0l\0t\0i\0m\0\x65\0\x44\0L\0\0\0\x4\0\0\0\0\0\x61La\0\0\0\x12\0\x41\0l\0l\0t\0i\0m\0\x65\0U\0L\0\0\0\x4\0\0\0\0\0\x9bGV)
|
||||
|
||||
@@ -1 +1 @@
|
||||
de6996481f4e318e7baff03b4043929c585a7c4e
|
||||
cf82cf859b110af0ad3d94b846e006828417b193
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
[Stats]
|
||||
AllStats=@Variant(\0\0\0\x1c\0\0\0\x2\0\0\0\x12\0\x41\0l\0l\0t\0i\0m\0\x65\0\x44\0L\0\0\0\x4\0\0\0\0\0\x1e\xc7?\0\0\0\x12\0\x41\0l\0l\0t\0i\0m\0\x65\0U\0L\0\0\0\x4\0\0\0\0\0+1q)
|
||||
AllStats=@Variant(\0\0\0\x1c\0\0\0\x2\0\0\0\x12\0\x41\0l\0l\0t\0i\0m\0\x65\0\x44\0L\0\0\0\x4\0\0\0\0\0!\x9d\x8e\0\0\0\x12\0\x41\0l\0l\0t\0i\0m\0\x65\0U\0L\0\0\0\x4\0\0\0\0\0.\xe6I)
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"update":{"sid":"3e34254f4ee14bf4bec2d0359c3f8ee4","did":"92eba3c5-a8d0-44d5-836d-25bc4aa81a85","init":true,"started":"2024-11-18T17:39:31.1848496+00:00","timestamp":"2024-11-18T17:39:31.1852902+00:00","seq":0,"duration":0,"errors":0,"attrs":{"release":"Radarr@5.14.0.9383-master","environment":"master"}}}
|
||||
{"update":{"sid":"87056ff6106c4bcf8fc90506d02be642","did":"92eba3c5-a8d0-44d5-836d-25bc4aa81a85","init":true,"started":"2024-11-20T08:51:02.9022577+00:00","timestamp":"2024-11-20T08:51:02.902865+00:00","seq":0,"duration":0,"errors":0,"attrs":{"release":"Radarr@5.14.0.9383-master","environment":"master"}}}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
{"update":{"sid":"8d0da7a51b3942d9802c68e3c503f356","did":"1df9f2cc-17dc-4130-9753-9b694f82f1b5","init":true,"started":"2024-11-18T17:39:30.2546247+00:00","timestamp":"2024-11-18T17:39:30.255075+00:00","seq":0,"duration":0,"errors":0,"attrs":{"release":"4.0.10.2544-main","environment":"main"}}}
|
||||
{"update":{"sid":"726ab1cef3114e11a386851d89cb6de4","did":"1df9f2cc-17dc-4130-9753-9b694f82f1b5","init":true,"started":"2024-11-20T08:51:02.5386604+00:00","timestamp":"2024-11-20T08:51:02.5393706+00:00","seq":0,"duration":0,"errors":0,"attrs":{"release":"4.0.10.2544-main","environment":"main"}}}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
146
|
||||
145
|
||||
@@ -177,6 +177,7 @@ services:
|
||||
- TRIGGERS__CONTENTBLOCKER=0/30 * * * * ?
|
||||
|
||||
- QUEUECLEANER__ENABLED=true
|
||||
- QUEUECLEANER__RUNSEQUENTIALLY=true
|
||||
|
||||
- CONTENTBLOCKER__ENABLED=true
|
||||
- CONTENTBLOCKER__BLACKLIST__ENABLED=true
|
||||
|
||||
Reference in New Issue
Block a user