Cette page vient après l’ajout des applications optionnelles. Elle sert à régler ce qui touche au nettoyage, au seeding et à l’entretien du serveur.
À ce stade, la base doit déjà fonctionner : Radarr/Sonarr importent correctement, Plex/Jellyfin lit les fichiers, et qBittorrent conserve le seed.
L’objectif de cette page est de transformer une stack qui fonctionne en stack qui reste propre dans le temps. On ne cherche plus seulement à télécharger et lire un média, mais à éviter l’accumulation de fichiers inutiles, protéger le ratio et automatiser les tâches répétitives.
Les outils de cette partie peuvent supprimer ou déplacer des fichiers. Il vaut mieux les configurer progressivement, vérifier leur comportement, puis durcir les règles quand on est sûr du résultat.
Cleanuparr sert à éviter que qBittorrent devienne une zone de stockage oubliée. Après plusieurs imports, suppressions ou opérations de cross-seed, certains torrents peuvent rester présents alors qu’ils ne servent plus vraiment à la bibliothèque.
Cleanuparr peut nettoyer les téléchargements terminés selon les règles de seed, mais aussi repérer les téléchargements qui n’ont plus de hardlink vers la médiathèque. La documentation officielle détaille cette partie ici : Download Cleaner.

Activez le Download Cleaner et choisissez une fréquence simple, par exemple toutes les heures.
Les Ignored Downloads servent à exclure un hash, une catégorie, un tag ou un tracker précis du nettoyage.

Cette partie cherche les torrents qui n’ont plus de hardlink vers la bibliothèque.
Les catégories radarr, tv-sonarr et cross-seed-link sont vérifiées, puis les torrents orphelins sont déplacés vers la catégorie unlinked.
Ignored Root Directories sert surtout à ne pas compter les hardlinks créés dans le dossier de téléchargement ou par cross-seed.
On ignore donc /data/downloads/qBittorrent pour éviter que Cleanuparr considère un torrent comme encore utilisé juste parce qu’il a un lien dans la zone de téléchargement.

Les règles sont évaluées de haut en bas.
Ici, les torrents unlinked sont supprimés après un ratio ou un temps de seed suffisant, avec suppression des fichiers activée.
Cross-seed permet d’ajouter des torrents équivalents sur d’autres trackers sans retélécharger les fichiers. C’est utile pour améliorer le ratio, mais il faut rester prudent et respecter les règles de chaque tracker.
Lors de la création du conteneur, un fichier config.js est créé dans appdata.
C’est ce fichier qu’il faut modifier.
torznab: [
"http://prowlarr:9696/1/api?apikey=12345",
"http://prowlarr:9696/2/api?apikey=12345",
],
sonarr: ["http://sonarr:8989/?apikey=12345"],
radarr: ["http://radarr:7878/?apikey=12345"],
torrentClients: ["qbittorrent:http://user:pass@qbittorrent:8080"],
Pour éviter les abus et limiter les risques de ban sur les trackers, il vaut mieux ralentir la recherche.
rssCadence: "2 hours",
searchCadence: "1 day",
snatchTimeout: "30 seconds",
searchTimeout: "2 minutes",
searchLimit: 400,
Le tag “perma” doit exister dans sonarr / radarr pour garder des contenus permanents.
Films
Séries / Animes
mediaType: MOVIES
rules:
- "0":
- firstValue: Plex.seenBy
action: CONTAINS
lastValue: Seerr.addUser
- operator: AND
firstValue: Seerr.isRequested
action: EQUALS
customValue:
type: boolean
value: "true"
- operator: AND
firstValue: Seerr.mediaAddedAt
action: BEFORE
customValue:
type: custom_days
value: "30"
- operator: AND
firstValue: Plex.watchlist_isWatchlisted
action: EQUALS
customValue:
type: boolean
value: "false"
- operator: AND
firstValue: Radarr.tags
action: NOT_CONTAINS_PARTIAL
customValue:
type: text
value: Perma
- "1":
- operator: OR
firstValue: Seerr.mediaAddedAt
action: BEFORE
customValue:
type: custom_days
value: "90"
- operator: AND
firstValue: Seerr.isRequested
action: EQUALS
customValue:
type: boolean
value: "true"
- operator: AND
firstValue: Plex.watchlist_isWatchlisted
action: EQUALS
customValue:
type: boolean
value: "false"
- operator: AND
firstValue: Radarr.tags
action: NOT_CONTAINS_PARTIAL
customValue:
type: text
value: Perma
- "2":
- operator: OR
firstValue: Plex.lastViewedAt
action: BEFORE
customValue:
type: custom_days
value: "60"
- operator: AND
firstValue: Plex.watchlist_isWatchlisted
action: EQUALS
customValue:
type: boolean
value: "false"
- operator: AND
firstValue: Radarr.tags
action: NOT_CONTAINS_PARTIAL
customValue:
type: text
value: Perma
- "3":
- operator: OR
firstValue: Plex.addDate
action: BEFORE
customValue:
type: custom_days
value: "365"
- operator: AND
firstValue: Radarr.tags
action: NOT_CONTAINS_PARTIAL
customValue:
type: text
value: Perma
- "4":
- operator: OR
firstValue: Plex.watchlist_isWatchlisted
action: EQUALS
customValue:
type: boolean
value: "true"
- operator: AND
firstValue: Plex.addDate
action: BEFORE
customValue:
type: custom_days
value: "180"
- operator: AND
firstValue: Radarr.tags
action: NOT_CONTAINS_PARTIAL
customValue:
type: text
value: Perma
mediaType: SEASONS
rules:
- "0":
- firstValue: Seerr.isRequested
action: EQUALS
customValue:
type: boolean
value: "true"
- operator: AND
firstValue: Plex.sw_lastWatched
action: BEFORE
customValue:
type: custom_days
value: "60"
- operator: AND
firstValue: Plex.watchlist_isWatchlisted
action: EQUALS
customValue:
type: boolean
value: "false"
- operator: AND
firstValue: Sonarr.tags
action: NOT_CONTAINS_PARTIAL
customValue:
type: text
value: Perma
- "1":
- operator: OR
firstValue: Seerr.isRequested
action: EQUALS
customValue:
type: boolean
value: "true"
- operator: AND
firstValue: Plex.sw_viewedEpisodes
action: EQUALS
customValue:
type: number
value: 0
- operator: AND
firstValue: Plex.sw_lastEpisodeAddedAt
action: BEFORE
customValue:
type: custom_days
value: "90"
- operator: AND
firstValue: Plex.watchlist_isWatchlisted
action: EQUALS
customValue:
type: boolean
value: "false"
- operator: AND
firstValue: Sonarr.tags
action: NOT_CONTAINS_PARTIAL
customValue:
type: text
value: Perma
- "2":
- operator: OR
firstValue: Seerr.isRequested
action: EQUALS
customValue:
type: boolean
value: "true"
- operator: AND
firstValue: Plex.sw_allEpisodesSeenBy
action: CONTAINS
lastValue: Seerr.addUser
- operator: AND
firstValue: Plex.lastViewedAt
action: BEFORE
customValue:
type: custom_days
value: "30"
- operator: AND
firstValue: Plex.watchlist_isWatchlisted
action: EQUALS
customValue:
type: boolean
value: "false"
- operator: AND
firstValue: Sonarr.tags
action: NOT_CONTAINS_PARTIAL
customValue:
type: text
value: Perma
- "3":
- operator: OR
firstValue: Plex.addDate
action: BEFORE
customValue:
type: custom_days
value: "365"
- operator: AND
firstValue: Sonarr.tags
action: NOT_CONTAINS_PARTIAL
customValue:
type: text
value: Perma
- "4":
- operator: OR
firstValue: Plex.watchlist_isWatchlisted
action: EQUALS
customValue:
type: boolean
value: "true"
- operator: AND
firstValue: Plex.addDate
action: BEFORE
customValue:
type: custom_days
value: "180"
- operator: AND
firstValue: Sonarr.tags
action: NOT_CONTAINS_PARTIAL
customValue:
type: text
value: Perma