Vue normale

Reçu aujourd’hui — 11 septembre 2025Up and Clear

Un nouveau souffle pour vos jaquettes : Aura et MediUX au service de Plex, Emby et Jellyfin

Par :Aerya
11 septembre 2025 à 15:48

Je zyeute MediUX depuis très longtemps mais le côté « Faut parcourir le site, télécharger le .zip, l’importer dans mon lecteur, l’appliquer » m’avait clairement rebuté dès les… 52 premières secondes.

L’équipe derrière MediUX propose l’outil Aura, encore en early stage donc on utilise tous une unique clé API de « test », qui permet de parcourir les sets liés à ses bibliothèques via une WebUI.

Ne reste qu’à choisir un set et l’appliquer de suite via un clic ou le prévoir pour une mise à jour automatique en cron. Et on peut en plus lui indiquer de surveiller les MàJ du set sélectionné pour les appliquer.

Si on peut l’intégrer à Kometa, en revanche pour Aphrodite il faut bien veiller à faire mouliner Aura puis ensuite Aphrodite pour les overlays. Comme vous le verrez plus bas, Aura se lance à minuit chaque jour alors qu’Aphrodite est lancé chaque heure. Au pire, il n’y a plus aucun overlay entre minuit et 1h du matin, « pas grave ».

Cet outil se destine aux amateurs de beaux visuels et de personnalisation.
Malgré un maximum d’automatisation, rien ne pourra remplacer l’action de parcourir ses contenus et,
pour chaque, de parcourir à leur tour les embellissements disponibles pour ensuite les appliquer.

Merci TiMac pour la belle découverte !

demo movie

🧩 Compatibilité multi-serveurs : fonctionne avec Plex, Emby et Jellyfin.

🖼 Navigation visuelle : prévisualisez les visuels dans une interface claire et organisée.

🔁 Mises à jour automatiques : enregistrez les ensembles d’images choisis et gardez-les synchronisés automatiquement.

🗄 Stockage local : possibilité d’enregistrer les images à côté de vos fichiers multimédias pour un accès facile.

📦 Support Docker : déploiement simple avec Docker ou docker-compose.

Le docker-compose est à récupérer localement et on peut l’éditer rapidement pour l’adapter

services:
  aura:
    image: ghcr.io/mediux-team/aura:latest
    container_name: aura
    restart: always
    ports:
      - 3064:3000 # Web UI PORT
      - 8888:8888 # API PORT
    volumes:
      - /home/aerya/docker/aura:/config
      - /mnt/Bibliothèques/:/data/media
    labels:
      - com.centurylinklabs.watchtower.enable=true


Avant de le lancer il convient de faire de même avec le fichier de configuration. Son remplissage est déterminant pour le fonctionnement d’Aura. Les paramètres ne sont en effet pour l’instant accessibles qu’en lecture seule via l’interface.
Vous pouvez vous aider de la documentation mais c’est pas compliqué.

Voici le mien pour Jellyfin, avec 2 bibliothèques, SANS authentification (derrière Authelia chez moi), avec notifications Discord. Si vous voulez utiliser un mot de passe, il devra être hashé.
Il faudra une clé API Jellyfin (ou un token Plex) et une clé API (pas le token) TMDB.
Le cron servira pour la MàJ auto (si sélectionnée) des sets, on voit ça plus bas.

# Configuration Sample - aura
# For full documentation, see: https://mediux-team.github.io/AURA/config

# This file should be located in /config on the docker container

# Auth - Configuration for authentication
# This is used to configure the authentication for the application.
#   Enable - Whether to enable authentication or not.
#   Password - The Argon2id hashed password for the user.
Auth:
    Enable: false
    Password: $argon2id$v=19$m=12,t=3,p=1$Z3k1YnkwZzh5OTAwMDAwMA$lJDoyKZy1BMifB1Mb2SWFQ
    
# CacheImages - Whether to cache images or not. Caching images can improve performance but will use more disk space.
CacheImages: true

# SaveImageNextToContent - Whether to save images next to the Media Server content or not.
#   If set to true, images will be saved in the same directory as the Media Server content.
#   If set to false, images will still be updated on the Media Server but will not be saved next to the content.
#   The benefit of this is that you have local images that are not dependent on the Media Server database in case of migration.
#   If you are using Emby or Jellyfin, this option being set does not matter. This is determined by Emby or Jellyfin.
#   If you are using Plex, this option will determine if the images are saved next to the content or not.
SaveImageNextToContent: false

# Logging - Configuration for logging
#   Level - The level of logging. Can be one of: TRACE, DEBUG, INFO, WARNING, ERROR
Logging:
    Level: DEBUG

# AutoDownload - Configuration for auto-downloading images
#   Enabled - Whether to enable auto-downloading of images or not.
#     You have the option when selecting a set to save it to the database.
#     This will look for updates to the set and download them automatically.
#   Cron - The cron schedule for auto-downloading images. This is a standard cron expression.
#     For example, "0 0 * * *" means every day at midnight
AutoDownload:
    Enabled: true
    Cron: "0 0 * * *"

# Notifications - Configuration for notifications
#   Enabled - Whether to enable notifications or not.
#   Providers - A list of notification providers to use. Currently supported providers are:
#     - Discord
#     - Pushover
# You can set multiple providers at the same time. aura will send notifications to all. You also have the option to enable each provider. This gives you flexability to turn off the ones that you don't want to use. 
# When provider is Discord, you must set the Webhook URL
# When provider is Pushover, you must set the Token and UserKey
# Sample: 
#   - Provider: "Pushover"
#     Enabled: true
#     Pushover:
#         Token: your_pushover_token
#         UserKey: your_pushover_user_key
#   - Provider: "Discord"
#     Enabled: true
#     Discord:
#         Webhook: your_discord_webhook_url
Notifications:
    Enabled: true
    Providers: 
      - Provider: "Discord"
        Enabled: true
        Discord:
            Webhook: "https://canary.discord.com/api/webhooks/xxx"
      - Provider: "Pushover"
        Enabled: false
        Pushover:
            Token: your_pushover_api_token
            UserKey: your_pushover_user_key

# MediaServer - Configuration for your Media Server
#   Type - The type of Media Server. This can be one of: Plex, Jellyfin, Emby
#   URL - The URL of the Media Server. This should be the IP:Port of the Media Server or your Media Server reverse proxy domain.
#   Token - The token for the Media Server. This can be found in the Media Server web interface.
#   Libraries - A list of libraries to scan for images. Each library should have the following fields:
#     - Name: The name of the library to scan for content. Please note that this application will only work on Movies and Series libraries.
#   SeasonNamingConvention - The season naming convention for Plex. This is a Plex exclusive requirement. This can be one of: 1 or 2. This will default to 2
#     1 - Season 1  (non-padded)
#     2 - Season 01 (padded)
MediaServer:
    Type: "Jellyfin" # The type of Media Server. This can be one of: Plex, Jellyfin, Emby
    URL: https://jelly.domaine.tld:443
    Token: xxx
    Libraries:
        - Name: "Films"
        - Name: "Séries"
#        - Name: "4K Movies"
#        - Name: "4K Series"
#    SeasonNamingConvention: 1 # This is a Plex exclusive requirement. This is the season naming convention for Plex. This can be one of: 1 or 2

# Kometa - Configuration for Kometa
#   RemoveLabels - Whether to remove labels or not. This will remove all specific labels from the Media Server Item.
#   Labels - A list of labels to add to the Media Server Item. This will be used to identify the item in the Media Server.
#   This is also a Plex exclusive requirement. This will only work on Plex.
Kometa:
    RemoveLabels: false
    Labels:
        - "Overlay"


# TMDB - Configuration for TMDB (The Movie Database) This is not used yet.
#   ApiKey - The API key for TMDB. This can be obtained by creating an account on TMDB and generating an API key.
TMDB:
    ApiKey: xxx

# Mediux - Configuration for Mediux
#   Token - The token for Mediux. This can be obtained by creating an account on Mediux and generating a static token.
# !!!! NOTE: This is not yet available to the public. It is currently in development and will be available in the future.
#       If you would like to test this app, you will need a MedUX. You can contact us on Discord to get access.
#   DownloadQuality: The quality of the images to download. Options are: "original" or "optimized"
Mediux:
    Token: N_l1upAQrVJ05J6Fwjz89HEoo348l1u-
    DownloadQuality: "optimized"

Une fois lancé ça indexe nos contenus globaux ou par bibliothèque, avec un minimum de tri. Et ça ffiche les posters actuels. Aphrodite n’est pas encore passé mettre des overlays.

aura2

De là on peut sélectionner 1 film ou 1 série et parcourir les sets MediUX tout en visualisant le poster actuel. En l’occurrence, pour Carnivàle j’ai le choix entre 3 sets. C’est pas foufou MAIS des gens ont pris le temps de les réaliser et partager sur MediUX alors merci à eux.

aura3
aura4

Aura indique si c’est ou non déjà en base de données

aura5

Tout est expliqué et détaillé dans la documentation (en anglais, mais on est en 2025, donc go les d’jeuns ! – je suis de 73- ).

La sélection d’un set de série offre plusieurs choix :
– Poster : l’affiche de la série
– Backdrop : l’image d’arrière plan si vous avez activé l’option dans Plex/.Jellyfin
– Season poster : les affiches des saisons
– Auto DL : vérifiera périodiquement les nouvelles mises à jour de cet ensemble. C’est utile si vous souhaitez télécharger et appliquer automatiquement les nouvelles titlecards ajoutées lors de futures mises à jour de cet ensemble. C’est à ça que cert le cron entré dans la configuration.

  • – Future updates ONLY : ne téléchargera rien pour le moment. C’est utile si vous avez déjà téléchargé l’ensemble et que vous souhaitez uniquement appliquer les mises à jour futures. Par exemple uniquement 1x par jour.

    Notez qu’il n’y a pas toujours de backdrop de proposé.
aura6
aura7

Et je constate la mise à jour dans la foulée sur Jellyfin

aura8

On peut parcourir les sets proposés par un utilisateur par rapport à nos contenus indexés par Aura, pratique si on apprécie son travail et qu’on veut en profiter pour d’autres séries ou films.

aura9

Il y a une option Kometa, pour conserver ou non les overlays après la MàJ d’une affiche. Je n’ai pas testé.
On peut déjà utiliser des sets MediUX via Kometa mais ça semble vraiment fastidieux. Aura est encore tout jeune mais il y a fort à parier qu’il y aura une bonne intégration à/de Kometa dans le futur.

Loading

Reçu hier — 10 septembre 2025Up and Clear

Recommendarr : recommandations Plex/Jellyfin/arrs par l’IA

Par :Aerya
10 septembre 2025 à 16:16


Ok, y’a déjà whatmille solutions de recommandations et découverte de contenus : les listes prises à droite à gauche et ajoutées aux arrs ou à ListSync, Overseerr/Jellyseerr, Suggestarr etc BAH EN VOICI UNE DE PLUS !

Recommendarr de fingerthief permet d’avoir des recommandations faites par une IA à partir des contenus vus sous Plex/Jellyfin, Trakt, Tautulli (eh non ! pas encore mort) et de ceux indexés par Radarr et Sonarr.
Attention, tous les synopsis etc sont en anglais.

Quand je parle d’IA, c’est vaste et comprend l’autohébergé (j’ai testé avec OpenAI) :

Services d’IA compatibles

Vous pouvez utiliser n’importe lequel de ces services avec une API compatible OpenAI :

  • OpenAI : URL par défaut (https://api.openai.com/v1) avec votre clé API OpenAI
  • LM Studio : URL locale (ex. http://localhost:1234/v1) exécutant des modèles sur votre ordinateur
  • Ollama : URL locale (ex. http://localhost:11434/v1) pour des modèles hébergés en local
  • Anthropic Claude : API d’Anthropic avec l’URL de base appropriée
  • Auto-hébergé : votre propre serveur d’API LLM compatible avec OpenAI
  • Mistral, Groq, Cohere : la plupart des fournisseurs d’IA avec des endpoints compatibles OpenAI


Honnêtement, vu que je passe 90% de mon temps à tester des trucs plutôt qu’à profiter de mon setup, les recommandations que j’ai sont certes logiques (plus que celles de TMDB, en bas des fiches du moins) mais je ne sais pas si elles reflètent vraiment la qualité de cet outil. Ce dont je ne doute pas.

L’installation est simple puisque tout se configure via la WebUI

services:
  recommendarr:
    container_name: recommendarr
    restart: always
    ports:
      - 3080:3000
    volumes:
      - /home/aerya/docker/recommendarr:/app/server/data
    image: tannermiddleton/recommendarr:latest
    labels:
      - com.centurylinklabs.watchtower.enable=true

Et ensuite on peut connecter ses outils/comptes. Dans mon cas Trakt, TMDB, Jellyfin et Radarr/Sonarr. Je pense que ça venait de mon navigateur mais impossible d’accéder à la configuration en cliquant sur un autre bouton que Configure AI Service ou le menu des paramètres.

recommendarr1


Pour l’IA j’ai utilisé mon compte OpenAI avec le modèle gpt-5-chat-latest (pas comme sur le screen). Choix complètement fait au pifomètre, je suis preneur de conseils.

recommendarr2

Et ensuite…. magie…. Ou presque. L’IA ne fera qu’aller chercher des contenus par rapport à notre demande. Il faut donc paramétrer la demande. Au moins le nombre de recommandations.

recommendarr4

Dans la partie IA, en sus du modèle à choisir et son degré de précision, on peut demander à ce que Recommandarr utilise un sous-ensemble de la bibliothèque afin de réduire l’utilisation de jetons tout en fournissant des recommandations pertinentes.

recommendarr5

On sélectionne la catégorie visée (films/séries) et le nombre de recommandations souhaitées.

recommendarr6


Puis on peut affiner la recherche en sélectionnant des genres.

recommendarr7

Puis sélectionner un prompt pré-défini ou en créer

recommendarr8
Style « Vibe »

Se concentre sur l’atmosphère émotionnelle et l’expérience sensorielle du contenu de votre bibliothèque. Les recommandations privilégient la correspondance avec le ressenti et l’ambiance de vos films/séries préférés plutôt que le simple genre ou la similarité de l’intrigue.
Idéal pour : Trouver du contenu qui évoque la même sensation, capturant des tons et atmosphères spécifiques.


Style analytique

Procède à une analyse détaillée des structures narratives, des motifs thématiques et des techniques formelles. Les recommandations reposent sur une analyse en profondeur des éléments cinématographiques et télévisuels qui relient les œuvres à un niveau plus substantiel.
Idéal pour : Une exploration intellectuelle et la découverte de contenus partageant une approche artistique ou une profondeur thématique similaire.


Style créatif

Dépasse les catégorisations classiques pour trouver des liens inattendus entre les œuvres. Met en avant les parcours émotionnels, la vision artistique et les approches narratives originales.
Idéal pour : Découvrir des recommandations surprenantes, qui peuvent sembler éloignées au premier abord mais partagent une même essence créative.


Style technique

Se focalise sur l’artisanat de la production, les techniques de réalisation et l’exécution technique. Analyse les méthodes de mise en scène, la cinématographie, les styles de montage et les éléments de production.
Idéal pour : L’appréciation des aspects techniques et la recherche de contenus offrant une qualité de production ou une innovation technique similaire.


Comme souvent on peut sélectionner la langue préférée du contenu (séries plutôt en langue française etc). On pourra aussi de temps en temps rescanner les bibliothèques.

recommendarr9

Et enfin, découvrir les reco. À noter qu’on ne peut pas les ajouter à Radarr/Sonarr directement, sans passer par Overseerr/Jellyseerr/whatever.

Voici par exemple pour les films

recommendarr10
recommendarr11
recommendarr12
recommendarr13

Évidemment, avec Decypharr, ça tombe en quelques secondes.

recommendarr14

Et pour les séries, on peut évidemment sélectionner les saisons

recommendarr15

C’est sympa à tester, on peut y créer plusieurs utilisateurs donc c’est intéressant mais avec un LLM autohébergé ça doit consommer pas mal de ressources. Avec OpenAI ça ne consomme en revanche rien que le serveur donc je vais le garder dans un coin mais je doute l’utiliser tous les jours, avec tout le reste…

recommendarr16


L’idéal serait de couler ça à Overseerr/Jellyseerr…

Loading

Aphrodite – Sublimez vos affiches pour Jellyfin (et Emby ?)

Par :Aerya
10 septembre 2025 à 11:04

Ok, pour Emby je pose la question vu qu’ils ont la même origine.

J’utilise Kometa sur Plex et j’ai trouvé son pendant pour Jellyfin avec Aphrodite de jackkerouac. Enfin en mieux, selon moi, plus configurable et en WebUI.

Pour nos bibliothèques Jellyfin on peut tout simplement changer les affiches (bases), configurer et ajouter tout ou au choix la résolution, l’audio, les notes et les récompenses.

Avec la totale, ça peut donner ceci.

aphrodite20
aphrodite preview 1757492972706
aphrodite preview 1757493205061


Ça ne fonctionne évidemment pas sur les affiches des collections vu que ces badges concernent une vidéo donnée.

aphrodite21

Pour répondre à nos besoins, sommaires vu que je connais mes règles Radarr/Sonarr, je n’affiche que les notes et récompenses.

aphrodite23


Via la WebUI on peut planifier des opérations (cron) pour appliquer tout ou partie des badges sur les bibliothèques sélectionnées. En reprenant ou non les éléments déjà traités.
En revanche, pour la modification des affiches, c’est à faire manuellement, par grappes de 50 (ouais, léger…).

L’installation est relativement simple, j’ai cependant rencontré pas mal de soucis en ne configurant que via la WebUI pour Jellyfin. J’ai tout décommenté/renseigné dans le .env et ça roule.

Comme indiqué sur le GitHub, il faut télécharger le compose et son .env. Je mets ça dans /home/aerya/docker/aphrodite

# Créer le dossier entrer dedans
mkdir /home/aerya/docker/aphrodite && cd /home/aerya/docker/aphrodite

# Télécharger le docker-compose et le .env
curl -L https://github.com/jackkerouac/aphrodite/releases/latest/download/docker-compose.yml -o docker-compose.yml
curl -L https://github.com/jackkerouac/aphrodite/releases/latest/download/default.env.example -o .env


Et on passe à l’édition du compose.
Par rapport au compose de base, j’ai juste modifié les volumes sur la base de /home/aerya/docker/aphrodite/…

Mis en always pour « restart » et ajouté la MàJ auto d’Aphrodite avec watchtower. Pas la peine pour Postgre et Redis vu que ça va chercher des versions précises.
Tout le reste se modifie dans .env qui suit

services:
  postgres:
    image: postgres:15-alpine
    container_name: aphrodite-postgres
    restart: always
    ports:
      - ${POSTGRES_PORT:-5433}:5432
    environment:
      POSTGRES_DB: ${POSTGRES_DB:-aphrodite}
      POSTGRES_USER: ${POSTGRES_USER:-aphrodite}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-aphrodite123}
    volumes:
      - /home/aerya/docker/aphrodite/postgres_data:/var/lib/postgresql/data
    healthcheck:
      test:
        - CMD-SHELL
        - pg_isready -U ${POSTGRES_USER:-aphrodite}
      interval: 10s
      timeout: 10s
      retries: 5
  redis:
    image: redis:7-alpine
    container_name: aphrodite-redis
    restart: always
    ports:
      - ${REDIS_PORT:-6379}:6379
    volumes:
      - /home/aerya/docker/aphrodite/redis_data:/data
    healthcheck:
      test:
        - CMD
        - redis-cli
        - ping
      interval: 10s
      timeout: 10s
      retries: 5
  aphrodite:
    image: ${APHRODITE_IMAGE:-ghcr.io/jackkerouac/aphrodite:latest}
    container_name: aphrodite
    pull_policy: always
    restart: always
    environment:
      POSTGRES_HOST: postgres
      POSTGRES_PORT: 5432
      POSTGRES_DB: ${POSTGRES_DB:-aphrodite}
      POSTGRES_USER: ${POSTGRES_USER:-aphrodite}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-aphrodite123}
      DATABASE_URL: ${DATABASE_URL:-postgresql+asyncpg://aphrodite:aphrodite123@postgres:5432/aphrodite}
      REDIS_URL: ${REDIS_URL:-redis://redis:6379/0}
      API_HOST: ${API_HOST:-0.0.0.0}
      API_PORT: ${API_PORT:-8000}
      ENVIRONMENT: ${ENVIRONMENT:-production}
      SECRET_KEY: ${SECRET_KEY:-please-change-this-secret-key-in-production}
      ALLOWED_HOSTS: ${ALLOWED_HOSTS:-*}
      CORS_ORIGINS: ${CORS_ORIGINS:-*}
      LOG_LEVEL: ${LOG_LEVEL:-info}
      LOG_FILE_PATH: ${LOG_FILE_PATH:-/app/logs/aphrodite-v2.log}
      DEBUG: ${DEBUG:-false}
      CELERY_BROKER_URL: ${CELERY_BROKER_URL:-redis://redis:6379/0}
      CELERY_RESULT_BACKEND: ${CELERY_RESULT_BACKEND:-redis://redis:6379/1}
      ENABLE_BACKGROUND_JOBS: ${ENABLE_BACKGROUND_JOBS:-true}
      JELLYFIN_URL: ${JELLYFIN_URL:-}
      JELLYFIN_API_KEY: ${JELLYFIN_API_KEY:-}
      JELLYFIN_USER_ID: ${JELLYFIN_USER_ID:-}
    ports:
      - ${APHRODITE_PORT:-8000}:8000
    volumes:
      - /home/aerya/docker/aphrodite/aphrodite_data:/app/data
      - /home/aerya/docker/aphrodite/aphrodite_logs:/app/logs
      - /home/aerya/docker/aphrodite/aphrodite_media:/app/media
      - /home/aerya/docker/aphrodite/aphrodite_static:/app/api/static/originals
    labels:
      - com.centurylinklabs.watchtower.enable=true
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    healthcheck:
      test:
        - CMD
        - curl
        - -f
        - http://localhost:8000/health/live
      interval: 10s
      timeout: 10s
      retries: 5
      start_period: 40s
  aphrodite-worker:
    image: ${APHRODITE_IMAGE:-ghcr.io/jackkerouac/aphrodite:latest}
    container_name: aphrodite-worker
    pull_policy: always
    restart: always
    command:
      - python3
      - -m
      - celery
      - -A
      - celery_app
      - worker
      - --loglevel=debug
      - --pool=solo
      - --concurrency=1
    environment:
      POSTGRES_HOST: postgres
      POSTGRES_PORT: 5432
      POSTGRES_DB: ${POSTGRES_DB:-aphrodite}
      POSTGRES_USER: ${POSTGRES_USER:-aphrodite}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-aphrodite123}
      DATABASE_URL: ${DATABASE_URL:-postgresql+asyncpg://aphrodite:aphrodite123@postgres:5432/aphrodite}
      REDIS_URL: ${REDIS_URL:-redis://redis:6379/0}
      CELERY_BROKER_URL: ${CELERY_BROKER_URL:-redis://redis:6379/0}
      CELERY_RESULT_BACKEND: ${CELERY_RESULT_BACKEND:-redis://redis:6379/1}
      ENVIRONMENT: ${ENVIRONMENT:-production}
      SECRET_KEY: ${SECRET_KEY:-please-change-this-secret-key-in-production}
      LOG_LEVEL: ${LOG_LEVEL:-info}
      LOG_FILE_PATH: ${LOG_FILE_PATH:-/app/logs/aphrodite-v2.log}
      PYTHONPATH: /app
    volumes:
      - /home/aerya/docker/aphrodite/aphrodite_data:/app/data
      - /home/aerya/docker/aphrodite/aphrodite_logs:/app/logs
      - /home/aerya/docker/aphrodite/aphrodite_media:/app/media
      - /home/aerya/docker/aphrodite/aphrodite_static:/app/api/static/originals
    labels:
      - com.centurylinklabs.watchtower.enable=true
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    working_dir: /app/api
    healthcheck:
      test:
        - CMD
        - python3
        - -c
        - import sys; sys.path.insert(0, '/app'); from celery_app import
          celery_app; print('Worker healthy')
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s
networks:
  default:
    name: aphrodite_network


Et le fameux .env. Comme expliqué plus haut, après plusieurs tests, il faut y paramétrer le serveur Jellyfin et également décommenter les informations liées à Postgre et Redis. J’ai passé les logs en DEBUG vu les soucis que je rencontrais au début.

Pour créer la SECRET_KEY : (en console) openssl rand -hex 64

Et ne pas oublier de mettre le mot de passe POSTGRES_PASSWORD dans la partie DATABASE_URL
Créer une clé API dans Jellyfin via le menu tout en bas du Tableau de bord

Et récupérer l’ID utilisateur qui sera utilisée pour connecter Aphrodite. Dans Tableau de bord/Utilisateurs, cliquer sur le user et l’ID est à la fin de l’URL

# =============================================================================
# Docker Image Configuration
# =============================================================================
# Leave blank to always pull the latest version from GitHub Container Registry
# APHRODITE_IMAGE=ghcr.io/jackkerouac/aphrodite:latest

# =============================================================================
# Database Configuration
# =============================================================================
# IMPORTANT: Change POSTGRES_PASSWORD to a secure password!
# This password will be used to create the database user
POSTGRES_DB=aphrodite
POSTGRES_USER=aphrodite
POSTGRES_PASSWORD=motdepassedelamortquitue
POSTGRES_PORT=5432

# =============================================================================
# Redis Configuration
# =============================================================================
REDIS_PORT=6379

# =============================================================================
# Security Configuration (REQUIRED)
# =============================================================================
SECRET_KEY=4c887cda6e10bac46eb61a961e38f4626609c9caeca08123ed1d6d876c6b14c20a11118cec534f26d5d5de4f5b6935fa07ff8887b91322058c20f95705025fa0
# =============================================================================
# Application Configuration
# =============================================================================
# Port to run Aphrodite on (default: 8000)
APHRODITE_PORT=8000

# API Configuration
API_HOST=0.0.0.0
API_PORT=8000

# Environment
ENVIRONMENT=production

# Logging level (debug, info, warning, error)
LOG_LEVEL=debug
DEBUG=true

# Network Configuration
ALLOWED_HOSTS=*
CORS_ORIGINS=*

# =============================================================================
# Background Jobs Configuration
# =============================================================================
ENABLE_BACKGROUND_JOBS=true
CELERY_BROKER_URL=redis://redis:6379/0
CELERY_RESULT_BACKEND=redis://redis:6379/1

# =============================================================================
# Database & Redis URLs (Advanced - Override defaults if needed)
# =============================================================================
DATABASE_URL=postgresql+asyncpg://aphrodite:motdepassedelamortquitue@postgres:5432/aphrodite
REDIS_URL=redis://redis:6379/0

# =============================================================================
# Jellyfin Integration (Optional - Configure via Web Interface)
# =============================================================================
# You can set these here or configure them in the web interface
JELLYFIN_URL=https://jelly.domaine.tld
JELLYFIN_API_KEY=xxx
JELLYFIN_USER_ID=xxx


On peut ensuite lancer la Docker et aller visiter les paramètres d’Aphrodite. Mon screen date de ma 1ère installation aussi je ne sais plus si les paramètres de Jellyfin sont déjà remplis par le biais du .env

Il faut aller récupérer (ou créer) ses clés API :
OMDB : version gratuite, clé dans le mail qu’on reçoit suite à l’inscription
TMDB : le token, pas la clé
MDBList : en bas de page
AniDB si vous avez des mangas : j’ai pas regardé plus que ça pour créer une clé API

aphrodite2

C’est par ailleurs dans cette partie qu’on peut configurer les badges à mettre en overlay sur les affiches. Je ne rentre pas dans les détails, il y a tellement de personnalisation possible que c’est propre à chacun.
Aphrodite étant tout jeune, les notes ne sont pour l’instant disponibles qu’à partir d’IMDb, Metacritic, MyAnimeList, Rotten Tomatoes et TMDb. C’est déjà pas mal même si je suis impatient de voir Trakt arriver. TMDb et Trakt.tv ont maintenant un nombre d’utilisateurs suffisant pour avoir plusieurs centaines de votes et les rendre qualitatifs.
Il n’y a évidemment pas AlloCiné, pardon pour ceux qui y bossent, mais c’est bien trop franco-nombriliste-français pour avoir une quelconque utilité dans la galaxie des *arrs et du streaming.


aphrodite4
aphrodite5
aphrodite6
aphrodite7
aphrodite8
aphrodite10
aphrodite11


Pour l’audio et la vidéo, Aphrodite peut détecter les données via l’analyse des fichiers. Faut évidemment avoir la machine qui le permet sans que ça prenne des heures.

aphrodite24
aphrodite25

On peut générer un aperçu de sa configuration via le menu Preview

aphrodite26

Avant d’aller plus loin, il faut prendre le temps de vérifier l’import des bibliothèques suite à la connexion avec Jellyfin, dans le menu Poster Manager.
C’est ballot, j’ai pas pensé à faire de screen avant de modifier mes affiches…

aphrodite29

Ici on peut modifier les affiches, par lots de 50 donc faut être patient… C’est sympa, ça change mais on ne peut pas faire de choix et, pour l’instant, il n’y a pas MediUX d’intégré. Mais le projet est jeune, ça a le temps de venir.

aphrodite30

C’est également dans ce menu qu’on peut lancer à la demande l’application des badges, toujours par lots de 50 affiches. Ça peut être intéressant pour tester ou s’occuper des bibliothèques spécifiques avec peu de contenus.

aphrodite31

Et ensuite passer aux choses sérieuses avec la mise en place de tâches (ou d’une seule, c’est selon) via les Schedules

aphrodite27

Après avoir testé plusieurs configurations, j’ai créé une tâche qui se répète toutes les heures pour mes 2 bibliothèques, pour les contenus non encore « badgés » et seulement les notes et récompenses, comme expliqué au début de mon article.

aphrodite28

On peut déclencher le travail directement, sans attendre la prochaine planification et mes bibliothèques passent d’affiches simples

aphrodite18

à des badgées selon mes préférences !
Il y a eu l’ajout de collections entre temps également, depuis Jellyfin.

aphrodite40

Au final ça tourne très bien, il y a presque trop de réglages possibles quand on est comme moi un éternel insatisfait ^^’

Aphrodite est encore jeune et en sus de l’utiliser je suivrai assurément ses évolutions !

Loading

Reçu avant avant-hierUp and Clear

MiniVid : indexage, lecture, tags et favoris pour vos vidéos locales

Par :Aerya
2 septembre 2025 à 22:57

Il y a quelque temps on m’a demandé si je connaissais un agrégateur et lecteur de vidéos auto-hébergé. Après avoir parlé des classiques Plex, Emby, Jellyfin, Kodi, j’ai compris que c’était comme prendre un tank pour aller chercher le pain… vu qu’il s’agissait d’avoir une interface de lecture de vidéos X.

Le fait est que je n’ai rien trouvé de probant, simple, assez récent, puis ça m’a saoulé. J’ai donc créé MiniVid, présenté ici et dont le code est publié sur GitHub !

Bien évidemment, ça s’adapte parfaitement à d’autres vidéos comme des clips, documentaires, téléchargements YouTube, Twitch etc.


MàJ du 05.09.25 : j’ai publié le Docker sur GitHub, y’a plus à build localement, vous pouvez utiliser ghcr.io/aerya/minivid:latest

MàJ du 08.09.25 : j’ai ajouté un script Windows-MiniVid.cmd
– Il installera si nécessaire Docker Desktop sur la machine,

  • – Guidage complet pour la configuration de MiniVid (édition complète disponible),
  • – Ajout de dossiers locaux comme distants (SMB/CIFS avec ou sans user:pwd).
minivid windows
minivid1
minivid4
minivid2
minivid3
📂 Navigation par dossiers
Accédez à vos vidéos avec une arborescence claire.

🔖 Tags automatiques extraits des noms de fichiers
Tags globaux par dossier
Tags individuels par fichier
Multi-sélection et recherche par tags
Blacklist configurable pour supprimer les mots inutiles (and, the, source, etc.)

🔍 Recherche avancée
Par nom de fichier
Par tags multiples
Par favoris
Par statut Lue / Non lue

🗂 Filtres et tris personnalisables
Nom
Taille
Date de modification
Statut Lues / Non lues

⭐ Favoris
Marquez vos vidéos d’un clic (★)
Accédez à la vue dédiée « Favoris »

🎥 Lecteur intégré (HTML5 natif)
Supporte mp4, webm et mkv (Chrome/Chromium)
Les fichiers non compatibles avec Firefox (.mkv, .avi, .flv, .m2ts) sont automatiquement basculés en remux/transcodage à la volée avec ffmpeg si activé

🖼 Miniatures automatiques
Générées avec ffmpeg
Capture par défaut à 5 secondes (pour éviter logos/intro)
Ajustable via variables (MINI_THUMB_OFFSET, MINI_THUMB_MAX)

📱 Interface responsive
Desktop, tablette et mobile

🌙 Mode clair / sombre
Bascule instantanée

🛠 Page Maintenance
Rescan complet de la bibliothèque
Purge des miniatures
Journal d’événements en direct (logs des actions)

⏱ Scan automatique
Toutes les heures par défaut
Intervalle configurable via MINI_SCAN_INTERVAL

🔐 Authentification optionnelle
Mode public ou mono-utilisateur avec identifiant/mot de passe

⚙ Configuration simple
Tout se règle via variables d’environnement dans votre docker-compose.yml

VariableValeur par défautDescription
MEDIA_DIRS(vide)Liste des dossiers vidéos (séparés par `
MEDIA_NAMESDossier 1, Dossier 2…Noms affichés pour chaque dossier (même ordre que MEDIA_DIRS)
MINI_ALLOWED_EXT.mp4,.webm,.mkv,.avi,.flv,.m2tsExtensions autorisées
MINI_BANNED_TAGS(vide)Liste de mots à ignorer lors de la génération de tags (and,the,source,…)
DATA_DIR/dataDossier de stockage interne (état, favoris, prefs)
THUMB_DIR/cache/thumbsDossier cache des miniatures
MINI_USER(vide)Identifiant de connexion (optionnel)
MINI_PASS(vide)Mot de passe de connexion (optionnel)
SECRET_KEY(aléatoire)Clé de session Flask (authentification)
MINI_PLAYBACKdirectMode lecture : direct, auto, remux
MINI_TRANSCODE0Autoriser le transcodage H.264/AAC (1 = oui, 0 = non)
MINI_FIREFOX_MKV_FALLBACK1Force le remux des .mkv dans Firefox
MINI_AUTOSCAN1Activer le rescan automatique (1 = oui)
MINI_SCAN_INTERVAL3600Intervalle entre scans auto (en secondes)
MINI_THUMB_OFFSET5Seconde du screenshot miniature
MINI_THUMB_MAX30Offset max (si vidéo longue)
MINI_FFPROBE_TIMEOUT10Timeout en secondes pour ffprobe/ffmpeg
API_READ_KEY(vide)Clé API (optionnelle) pour accès en lecture seule


Pour l’installation et la configuration, reportez-vous au dépôt GitHub.


Exemple de docker-compose.yml

services:
  minivid:
    image: ghcr.io/aerya/minivid:latest
    container_name: minivid
    restart: always
    environment:
      TZ: Europe/Paris
      MEDIA_DIRS: /videos1|/videos2|/videos3|/videos4|/videos5
      MEDIA_NAMES: ruTorrent|MeTube|Docs|Concerts|Tests formats vidéo
      DATA_DIR: /data
      THUMB_DIR: /cache/thumbs
      MINI_ALLOWED_EXT: .mp4,.webm,.mkv,.avi,.flv,.m2ts
      MINI_PLAYBACK	Mode de lecture : auto
      MINI_TRANSCODE: 1
      MINI_FIREFOX_MKV_FALLBACK: 1
      MINI_THUMB_OFFSET: 5
      MINI_THUMB_MAX: 30
      MINI_AUTOSCAN: 1
      # Auth (prises du .env ; si vide => pas d'auth)
      MINI_USER: ${MINI_USER}
      MINI_PASS: ${MINI_PASS}
      SECRET_KEY: 032cb57bd9a0ed97c62a46518aaa3cf2ka9d256da92e17e75e75d282ad5cda87
      # Liste noire tags (les mots de moins de 3 lettres sont automatiquement bannis)
      MINI_BANNED_TAGS:  >
        and,the,source,video,videos,vid,vids,film,movie,part,
        les,une,des,ils,elles,sur,sous,dans,par,pour,sans,avec,chez,
        cet,cette,ces,mon,mes,ton,tes,ses,notre,nos,votre,vos,leur,leurs,
        qui,que,quoi,dont,quand,comme,
        your,they,for,with,without,into,onto,about,this,that,these,those,
        here,there,then,than,are,was,being,been,have,had,just,only,
        over,under,very,more,most,less,were,com,net
    volumes:
      - /mnt/user/rutorrent-direct:/videos1:ro
      - /mnt/user/MeTube:/videos2:ro
      - /mnt/user/TEST/Docs:/videos3:ro
      - /mnt/user/TEST/Concerts:/videos4:ro
      - /mnt/user/TEST/Formats:/videos5:ro
      - /mnt/user/appdata/MiniVid/data:/data
      - /mnt/user/appdata/MiniVid/cache:/cache
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    ports:
      - "8080:8080"

  # Scan toutes les INTERVAL secondes
  minivid-scheduler:
    image: curlimages/curl:8.10.1
    container_name: minivid-scheduler
    depends_on:
      - minivid
    restart: always
    environment:
      APP_URL: ${APP_URL}
      MINI_USER: ${MINI_USER}
      MINI_PASS: ${MINI_PASS}
      INTERVAL: ${INTERVAL}
    command: >
      sh -c '
        set -eu;
        for i in $(seq 1 60); do curl -fsS "$APP_URL/maintenance" >/dev/null 2>&1 && break || sleep 2; done
        while :; do
          if [ -n "$MINI_USER" ] && [ -n "$MINI_PASS" ]; then
            # login (remember=on)
            curl -sS -c /tmp/c.jar -X POST "$APP_URL/login" \
              -d "username=$MINI_USER" -d "password=$MINI_PASS" -d "remember=on" -o /dev/null || true
            if curl -sS -b /tmp/c.jar "$APP_URL/api/maintenance/progress" | grep -qi "\"running\"\\s*:\\s*true"; then
              sleep 120
            else
              curl -m 5 -sS -b /tmp/c.jar -X POST "$APP_URL/api/maintenance/rescan" -o /dev/null || true
            fi
          else
            curl -m 5 -sS -X POST "$APP_URL/api/maintenance/rescan" -o /dev/null || true
          fi
          sleep "$INTERVAL"
        done
      '

Exemple de .env

# URL interne du service
APP_URL=http://minivid:8080

# Auth (laisser vide pour désactiver l'auth)
MINI_USER=admin
MINI_PASS=admin

# Fréquence en secondes (3600 = 1h)
INTERVAL=3600

L’indexation des fichiers se fait à la volée au 1er lancement, plus ou moins rapidement selon la quantité de vidéos et le CPU. Le transcodage sous Firefox/LibreWolf peut faire souffrir le CPU sur une petite machine, je ne l’ai pas optimisé vu qu’il est plus rapide de passer par un autre navigateur.

Aucun appel externe, tout est 100% local. Fonctionne en http://IP:port comme en reverse proxy.

minivid8
minivid11
minivid9
minivid10
minivid5
minivid6
minivid7

Loading

ListSync : un bel outil avec WebUI pour gérer et connecter ses listes avec Overseerr/Jellyseerr

Par :Aerya
27 août 2025 à 12:56

Quelles listes ? Quasi tout ce qui existe : IMDb, Trakt, MDBList, Letterboxd, Steven Lu


ListSync de Woahai321 permet de gérer de manière simple, complète et franchement belle, des listes de contenus multimédia à télécharger. Listes synchronisées avec Overseerr et/ou Jellyseerr pour automatiser les demandes et téléchargements via les *arrs.

L’application est développement très actif.

🔄 Synchronisation automatique

🎬 Prise en charge de plusieurs plateformes de watchlist

🖥 Compatible avec Overseerr et Jellyseerr

⚡ Installation simplifiée avec Docker

📊 Suivi en temps réel – Barres de progression et mises à jour instantanées

📋 Gestion intuitive des listes – Ajoutez, modifiez et organisez vos listes facilement

📈 Analyses complètes – Taux de réussite, indicateurs de performance et données historiques

⚙ Configuration via le web – Gérez tous les paramètres depuis le tableau de bord

🎨 Interface moderne et responsive – Parfaitement adaptée aux ordinateurs, tablettes et mobiles

🌙 Thèmes clair/sombre – Détection automatique des préférences système

Pour cet article, j’installe une instance locale. Mais selon les besoins, le compose et le .env ne sont pas les mêmes. Pour une utilisation/configuration plus poussée, je vous invite à suivre la documentation.

Je place le docker-compose.yml et le .env dans /home/aerya/docker/list-sync. Je n’indique aucune liste dans l’environnement, je ne me servirai que de l’interface Web.

J’utilise la version :main qui est la stable. J’ai ajouté la MàJ automatique du docker via un label Watchtower comme à mon habitude. Et j’ai mis en dur la timzeone mais ça marche aussi via le .env

Le compose

services:
  listsync-full:
    image: ghcr.io/woahai321/list-sync:main
    container_name: listsync
    ports:
      # Frontend (Next.js Dashboard) 
      - "3222:3222"
      # Backend API (FastAPI)
      - "4222:4222"
    environment:
      # Timezone Configuration (set to Europe/London for BST/GMT, change as needed)
      - TZ=Europe/Paris
      
      # Overseerr Configuration 
      - OVERSEERR_URL=${OVERSEERR_URL}
      - OVERSEERR_API_KEY=${OVERSEERR_API_KEY}
      - OVERSEERR_USER_ID=${OVERSEERR_USER_ID:-1}
      - SYNC_INTERVAL=${SYNC_INTERVAL:-24}
      - AUTOMATED_MODE=true
      - OVERSEERR_4K=${OVERSEERR_4K:-false}
      
      # List Configuration (comma-separated)
      - IMDB_LISTS=${IMDB_LISTS}
      - TRAKT_LISTS=${TRAKT_LISTS}
      - LETTERBOXD_LISTS=${LETTERBOXD_LISTS}
      - MDBLIST_LISTS=${MDBLIST_LISTS}
      - STEVENLU_LISTS=${STEVENLU_LISTS}
      - TRAKT_SPECIAL_LISTS=${TRAKT_SPECIAL_LISTS}
      - TRAKT_SPECIAL_ITEMS_LIMIT=${TRAKT_SPECIAL_ITEMS_LIMIT}      

      # Optional Discord webhook
      #- DISCORD_WEBHOOK_URL=${DISCORD_WEBHOOK_URL}
      
      # Internal API URL for frontend
      - NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL:-http://0.0.0.0:4222/api}
      
      # Docker-specific settings
      - RUNNING_IN_DOCKER=true
      - NO_SANDBOX=1
      - DISPLAY=:99
    volumes:
      # Persist data directory
      - /home/aerya/docker/list-sync/data:/usr/src/app/data
      # Mount environment file
      - /home/aerya/docker/list-sync/.env:/usr/src/app/.env
      # Optional: Mount logs for debugging
      - /home/aerya/docker/list-sync/logs:/var/log/supervisor
    restart: always
    labels:
      - com.centurylinklabs.watchtower.enable=true
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:4222/api/system/health", "&&", "curl", "-f", "http://localhost:3222"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s
    # Note: Complete ListSync application with:
    # - Core sync service (python -m list_sync)
    # - FastAPI backend (port 4222)
    # - Next.js frontend (port 3222)
    # All managed by supervisor for reliability 


Et le .env avec les variables. Donc me concernant uniquement l’URL d’Overseerr et ma clé API. Je ferai le reste depuis la WebUI.

#=======================================================================
# ListSync Full Local Deployment Environment Configuration
# This file contains all variables needed for complete local deployment
# Copy this to .env and configure your values
#=======================================================================

# === Core Required Configuration ===
# Your Overseerr/Jellyseerr API key (REQUIRED)
OVERSEERR_API_KEY=xxxMQ==

# Your Overseerr/Jellyseerr URL (REQUIRED)
OVERSEERR_URL=https://demande.domain.tld

# === Optional Discord Notifications ===
# Discord webhook URL for notifications (leave blank to disable)
DISCORD_WEBHOOK_URL=

# Timezone (set to your local timezone)
TZ=UTC+2

#=======================================================================

# === Local Development Domains ===
# Frontend domain (Next.js Dashboard) 
FRONTEND_DOMAIN=http://localhost:3222
# Backend API domain (FastAPI Server)
BACKEND_DOMAIN=http://localhost:4222

# === API Configuration ===
# This will be used by the frontend to call the API
NEXT_PUBLIC_API_URL=http://localhost:4222/api

# === CORS Configuration ===
# Allow frontend domain to access backend API
CORS_ALLOWED_ORIGINS=http://localhost:3222,http://0.0.0.0:3222,http://127.0.0.1:3222

#=======================================================================

# === List Configuration ===
# Configure which lists to sync (comma-separated)

# IMDb Lists (examples: "top", "popular", or specific list IDs)
IMDB_LISTS=

# Trakt Lists (specific list IDs)
TRAKT_LISTS=

# Trakt Special Lists (trending, collected, watched)
TRAKT_SPECIAL_LISTS=
TRAKT_SPECIAL_ITEMS_LIMIT=20

# Letterboxd Lists
LETTERBOXD_LISTS=

# MDBList Lists
MDBLIST_LISTS=

# Steven Lu Lists
STEVENLU_LISTS=

# === Sync Configuration ===
# User ID in Overseerr (usually 1 for admin)
OVERSEERR_USER_ID=1

# Sync interval in hours (24 = once per day)
SYNC_INTERVAL=24

# Enable automated mode (true/false)
AUTOMATED_MODE=true

# Enable 4K requests (true/false)
OVERSEERR_4K=false

#=======================================================================
# NOTE: This is the FULL LOCAL DEPLOYMENT configuration
# - Web UI will be available at http://localhost:3222
# - API server will run at http://localhost:4222
# - Core sync functionality will run automatically
# - All services managed by Docker Compose
#======================================================================= 

listsync2

Les options sont sommaires mais suffisantes

listsync3

Je peux ajouter une liste de test. Attention, les listes peuvent être pratiques mais risquent également d’ajouter un paquet de fichiers en téléchargement d’un coup voire lors d’une mise à jour (toutes les 24h ici).
Je teste ça avec Decypharr et le cache d’AllDebrid donc je ne crains rien (hormis indexer des trucs qui ne m’intéressent pas plus que ça) mais il faut faire attention si on télécharge réellement des .torrents, encore plus sur des trackers privés. Idem avec des indexeurs Usenet où on est parfois limité en API hit ou téléchargement, c’est un coup à tuer le quota mensuel en 3 minutes.

listsync13

J’utilise une top liste du super MDBList.com. Une petite « liste « Top Movies of the week » de 10 items pour tester.

listsync4

Et je l’exécute maintenant, je vais attendre 24h pour terminer ce tuto

listsync7

Et là… entre l’ajout à Overseerr, l’envoie à Radarr, la rechercher sur Prowlarr, le DL simulé par Decypharr (donc la recherche dans le cache d’AllDebrid), la validation dans Radarr, l’ajout dans Plex et la mise à jour des jaquettes par Kometa, ça a pris environ 3 minutes. LA VACHE !
J’en avais déjà certains, quand même.

listsync6
listsync8
listsync9
listsync10

Oui. Alors là on visualise bien pourquoi je ne suis pas fan des listes « des autres » pour ma consommation personnelle. Je vais clairement virer Dragons, Elio, KPop et Bad Guys… Chacun ses goûts.
En revanche, pour partager ça avec d’autres, c’est pratique de prendre des listes Netflix, Disney, Apple, HBO etc, surtout avec des jaquettes et collections par Kometa. Mais je ne m’aventure pas sur ce terrain là, mon plaisir est de découvrir, tester et partager des « retex ».

listsync11

De retour sur SyncList, on peut visualiser l’état des synchronisations et les déclencher manuellement (global ici ou par liste sur l’onglet Lists)

listsync14

Et on profite de quelques stats

listsync15

Un bel outil pour qui aime les listes.

Loading

SuggestArr : recommandations de contenus avec intégration Plex/Emby/Jellyfin/Overseerr/jellyseerr

Par :Aerya
27 août 2025 à 09:02


J’avais complètement zappé de présenter le fabuleux SugestArr il y a quelques mois, remédions à ça de suite !

On ajoute tous les contenus découverts sur le Web, sur IMDB, TMDB, Trakt, par des connaissances, via des forums, via Overseerr ou Jellyseerr…

Cet outil de guiseppe99barchetta devrait vous ravir puisqu’il permet d’avoir des recommandations personnalisées et est, je trouve, relativement complet :

  • Prise en charge multi-médias : compatible avec Jellyfin, Plex et Emby pour récupérer le contenu.
  • Intégration TMDb : recherche de films et séries similaires via TMDb.
  • Requêtes automatisées : envoie des demandes de téléchargement pour les contenus recommandés vers Jellyseer ou Overseerr.
  • Interface web : interface conviviale pour la configuration et la gestion.
  • Journaux en temps réel : visualiser et filtrer les logs en direct (ex. INFO, ERROR, DEBUG).
  • Sélection des utilisateurs : possibilité de choisir quels utilisateurs peuvent initier des requêtes, avec gestion et validation des contenus demandés automatiquement.
  • Gestion des tâches cron : modification du planning des cron jobs directement depuis l’interface web.
  • Pré-validation de configuration : vérifie automatiquement les clés API et les URLs lors de l’installation.
  • Filtrage de contenu : exclut les demandes de contenus déjà disponibles sur les plateformes de streaming dans votre pays.
  • Support de bases de données externes : possibilité d’utiliser PostgreSQL ou MySQL en plus de SQLite pour plus de performance et d’évolutivité.

Y’a pas d’application AndroidTV/smarthone mais c’est responsive et on peut automatiser les ajouts.

Pour l’utiliser il faut une clé API TMDB et évidemment une ou des instances Plex/Emby/Jellyfin et Oberseerr/Jellyseerr.

services:
  suggestarr:
    image: ciuse99/suggestarr:latest
    container_name: SuggestArr
    restart: always
    ports:
      - 5000:5000
    volumes:
      - /mnt/user/appdata/suggestarr:/app/config/config_files
    labels:
      - com.centurylinklabs.watchtower.enable=true


Une fois lancé, on se connecte avec notre lecteur favori, on ajoute une clé TMDB

suggestarr1

Dans le cas de Plex, ça liste les serveurs disponibles (pour faire simple j’ai sélectionné un local) et ça en détaille les librairies et utilisateurs. On peut aussi mettre une URL directement

suggestarr9

On enchaine avec Overseerr ou Jellyseerr

suggestarr8

Je reste sur du SQLite. Si vous voulez une BDD robuste à part, il faut revoir le docker-compose pour l’ajouter

suggestarr4

Configuration rapide :

  • Note minimale sur TMDB et nombre minimum d’avis,
  • Je n’inclus pas le contenu sans note
    J’exclus le contenu déjà téléchargé et/ou vu
  • Je n’exclus aucun genre ni aucun service (Disney+, Netflix, Youtube, Canal+…)
  • Je sélectionne English pour la langue originale des contenus que je veux en recommandation. Je ne suis absolument pas fan de Plus belle la vie et autres trucs français. Je préfère les séries US notamment. Précision : ça ne limite pas aux contenus produits en langue anglais mais ça la priorise
  • Et je souhaite des recommandations de contenus produits à partir des années 90
suggestarr5
  • Pour chaque film en historique de lecture je veux 8 suggestions, 5 pour chaque série,
  • Suggestarr me fera des recommandations par rapport aux 5 derniers contenus lus,
  • Le Search Size définissant combien de suggestions en tout je demande (si j’ai bien pigé ?)
    Et le cron, pour l’exécution. J’ai changé après la capture, j’ai mis toutes les 6h (0 */6 * * *)
suggestarr6

Et la récap de fin avant le 1er lancement

suggestarr10

Et ça ajoute les recommandations dans Overseerr ou Jellyseerr selon votre configuration. Attention du coup si, comme moi, tout est automatiquement validé, ça peut vite accroître les bibliothèques !
Mon setup étant tout récent je n’ai hélas pas de screen à vous montrer mais vous pouvez voir ce que ça donne avec la fin de cette vidéo YouTube avec UNRAiD.

Loading

Swaparr : dégager les Torrents bloqués des *arrs (stalled)

Par :Aerya
27 août 2025 à 07:13


Utilisateurs de qBittorrent, combien de fois avons-nous vu un .torrent marqué « stalled » ? Un téléchargement bloqué pour X raison et Sonarr ou Radarr qui attend… attend… encore et toujours…

Les *arrs n’ont pas d’outil de détection des téléchargements bloqués.

Swaparr comble cette lacune, très simplement.


Pour lancer le Docker, on met les instances qu’on souhaite, je teste avec les 2 que j’ai. J’ai mis les IP:port mais on peut mettre une URL sans le backslash de fin

services:
  radarr:
    image: ghcr.io/thijmengthn/swaparr:latest
    container_name: swaparr-radarr
    restart: unless-stopped
    environment:
      - BASEURL=http://192.168.0.163:7878
      - APIKEY=xxx        
      - PLATFORM=radarr
      - MAX_STRIKES=3
      - SCAN_INTERVAL=10m
      - MAX_DOWNLOAD_TIME=
      - IGNORE_ABOVE_SIZE=25GB
      - REMOVE_FROM_CLIENT=true
      - DRY_RUN=false
  sonarr:
    image: ghcr.io/thijmengthn/swaparr:latest
    container_name: swaparr-sonarr
    restart: unless-stopped
    environment:
      - BASEURL=http://192.168.0.163:8989
      - APIKEY=xxx         
      - PLATFORM=sonarr
      - MAX_STRIKES=3
      - SCAN_INTERVAL=10m  
      - MAX_DOWNLOAD_TIME=2h  
      - IGNORE_ABOVE_SIZE=25GB
      - REMOVE_FROM_CLIENT=true
      - DRY_RUN=false

J’ai tout laissé par défaut mais on peut régler les variables

NameDefaultDescription
BASEURLhttp://127.0.0.1:7878The URL of a radarr, sonarr or other starr instance.
APIKEY7f3a8..cbc07The API key of a radarr, sonarr or other starr instance.
PLATFORMradarrIndicates the type of starr platform, either radarr, sonarr, lidarr, readarr or whisparr.
MAX_STRIKES3Maximum number of strikes a download can accumulate before it is removed.
SCAN_INTERVAL10mHow often Swaparr checks for stalled downloads.
MAX_DOWNLOAD_TIME2hMaximum allowed download time before it’s considered stalled.
IGNORE_ABOVE_SIZE25GBFiles larger than this size will be ignored and not monitored.
REMOVE_FROM_CLIENTtrueRemove from both queue and download client (default) OR false only the queue of a starr instance.
DRY_RUNfalseSandbox mode; try Swaparr without it performing destructive actions on your instances.

Swaparr gère les clients de téléchargement BitTorrent liés aux *arrs, toute les 10 minutes avec cette configuration.
Et l’instance *arr pourra donc aller chercher un autre .torrent

aerya@StreamBox:~$ sudo docker logs swaparr-radarr

 ── Swaparr ───── 

╭─╮ Platform: radarr
│ │ Max strikes: 3
│ │ Scan interval: 10m
│ │ Max download time: 2h
│ │ Ignore above size: 25GB
╰─╯ Remove from client: true

╭─╮ Be part of Swaparr's journey ⭐ Star us on GitHub!
╰─╯ Your support strengthens the open-source community.

 ──────────────── 


╭──────────────────────────────────────────────────────────────────────────╮
│                            No downloads found                            │
╰──────────────────────────────────────────────────────────────────────────╯

 ─ Checking again in 10m..


╭──────────────────────────────────────────────────────────────────────────╮
│                            No downloads found                            │
╰──────────────────────────────────────────────────────────────────────────╯

 ─ Checking again in 10m..


╭──────────────────────────────────────────────────────────────────────────╮
│                            No downloads found                            │
╰──────────────────────────────────────────────────────────────────────────╯

 ─ Checking again in 10m..

Loading

SeasonArr : remplacer des épisodes manquants dans Sonarr par des packs de saisons

Par :Aerya
27 août 2025 à 06:29

Sonarr est conçu pour chercher automatiquement des épisodes et non des packs. Il peut arriver qu’il manque au moins 1 épisode de saison et c’est… pénible de devoir aller chercher ça à la main.
d3v1l1989 a créé SeasonArr qui règle ce problème en permettant de chercher un pack de saison puis remplacer les épisodes déjà télécharger. Cet outil, en 1 clic, remplace la recherche interactive de Sonarr.

Mon setup *arrs/Plex étant tout frais, pour ces séries d’articles, il ne me manque rien en dehors d’épisodes non parus en MULTi/VF donc mes screen ne seront pas révélateurs. « pas de bol »

Il faut préalablement créer une clé JWT soit en console si nodejs est installé (sudo apt install nodejs) soit via ce site par exemple.

node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"

Le Docker

services:
  seasonarr:
    image: ghcr.io/d3v1l1989/seasonarr:latest
    container_name: seasonarr
    restart: unless-stopped
    hostname: seasonarr
    ports:
      - 3027:8000
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Paris
      - DATABASE_URL=sqlite:///./data/seasonarr.db
      - JWT_SECRET_KEY=032cb57bd9a0ed97c62a46518aaa3cf2ba9d256da92e17e75e75d282ad5cda87
    volumes:
      - /home/aerya/docker/seasonarr:/app/data
      - /etc/localtime:/etc/localtime:ro


Une fois le compte créé on peut lier une ou plusieurs instances Sonarr


seasonarr1

Seasonarr indexe alors les séries et on peut lister celles où il manque des épisodes. Comme indiqué plus haut, mon exemple n’est pas révélateur puisqu’il me manque seulement ces 2 épisodes qui existent en VOSTFR mais non en MULTi/VF comme je les veux.

seasonarr2

Mais si pour une série il manque des épisodes dans des saisons « parues », on peut alors cliquer sur Season It! et Seasonarr se servira des indexeurs de l’instance Sonarr pour aller chercher des packs complets et remplacer tous les épisodes individuels complétés et manquant pour les saisons sélectionnées.
On peut le faire par saison ou pour la série complète.

seasonarr3

Il n’y a pas d’automatisation du process vu que ce n’est à faire qu’une fois de temps en temps, en théorie.
Les options sont sommaires mais suffisantes.

seasonarr4

Je viens de faire le test avec Got, je n’ai pas demandé à Sonarr de chercher les épisodes pour passer directement par Seasonarr

seasonarr11

Après avoir cliqué sur Season It! (global, pas apr saison), Sonarr s’est bien mis en recherche

seasonarr12

Et ça a suivi

seasonarr13

Loading

Personnaliser les affiches et collections de Plex avec Kometa

Par :Aerya
27 août 2025 à 04:46

J’aime bien avoir une idée des notes IMDB/TMDB des contenus répertoriés par Plex. Kometa, un script Python empaqueté dans un Docker pour plus de simplicité, permet de m’auditer les jaquettes des contenus indexés et créer celles de collections et playlists.
On peut presque faire la même chose sur Emby/Jellyfin, avec Posterizarr qui fonctionne aussi pour Plex)

kometa1
kometa2

On peut y mettre les infos qu’on souhaite, à l’endroit qu’on veut et créer/afficher ou non les listes par diffuseur etc. Tout est configurable, pour peu qu’on prenne le temps de lire la documentation.

Je partage ma configuration actuelle, qu’il faudrait encore peaufiner, et vous pouvez en trouver d’autres ici ou .

kometa3

Voici un Docker qui fonctionne très bien. Au besoin, pour UNRAiD, Synology, QNAP, Kubernetes, la doc est complète.

services:
  kometa:
    image: kometateam/kometa:develop
    container_name: kometa
    restart: always
    environment:
      - TZ=Europe/Paris
      - KOMETA_CONFIG=/config/config.yml
      - KOMETA_RUN=true
      - KOMETA_TIMES=00:00,06:00,12:00,18:00
    volumes:
      - /home/aerya/docker/kometa/config:/config
      - /home/aerya/docker/kometa/assets:/assets
    labels:
      - com.centurylinklabs.watchtower.enable=true

KOMETA_TIMES = les heures où Kometa doit mouliner

Et voici mon config.yml
Il faut le domaine Plex + token, les clés API TMDB, FanART et MDBlist. Je voulais tester les playlists, pas encore pris le temps…

Attention, dans la partie « libraries » les noms des librairies doivent être ceux de Plex, ici Films et Séries TV

plex:
  url: https://plex.domain.tld
  token: xxx
  timeout: 120
  verify_ssl: true

  db_cache:
  clean_bundles: false
  empty_trash: true
  optimize: true
tmdb:
  apikey: xxx
  language: fr-FR
  region: FR

  cache_expiration: 60
imdb:
  cache_expiration: 30

mdblist:
  apikey: xxx

  cache_expiration: 60
fanart:
  apikey: xxx

settings:
  run_order:
  - operations
  - metadata
  - overlays
  - collections
  asset_directory:
  - /assets
  
  overlay_artwork_filetype: jpg
  overlay_artwork_quality: 100
  show_unmanaged: true
  show_unconfigured: true
  show_missing: true

  cache: true
  cache_expiration: 60
  asset_folders: true
  asset_depth: 0
  create_asset_folders: false
  prioritize_assets: false
  dimensional_asset_rename: false
  download_url_assets: false
  show_missing_assets: true
  show_missing_season_assets: false
  show_missing_episode_assets: false
  show_asset_not_needed: true
  sync_mode: append
  default_collection_order:
  minimum_items: 1
  item_refresh_delay: 0
  delete_below_minimum: false
  delete_not_scheduled: false
  run_again_delay: 0
  missing_only_released: false
  only_filter_missing: false
  show_filtered: false
  show_unfiltered: false
  show_options: false
  save_report: false
  tvdb_language: default
  ignore_ids:
  ignore_imdb_ids:
  playlist_sync_to_users:
  playlist_exclude_users:
  playlist_report: true
  custom_repo:

libraries:
  Films:
    collection_files:
    - default: streaming
      template_variables:
        region: FR
        language: fr
        sep_style: gray
        visible_library_netflix: true
        visible_library_amazon: true
        visible_library_disney: true
        visible_library_appletv: true
        visible_library_paramount: true
        visible_library_max: true

    overlay_files:
    - default: ratings
      template_variables:
        rating1: critic
        rating1_image: imdb
        rating2: audience
        rating2_image: tmdb
        rating3: user
        rating3_image: imdb
    - default: resolution
      template_variables:
        use_edition: false
    - default: streaming
      template_variables:
        region: FR

    operations:
      assets_for_all: true
      mass_audience_rating_update: tmdb
      mass_user_rating_update: imdb

  Séries TV:
    collection_files:
    - default: streaming
      template_variables:
        region: FR
        language: fr
        sep_style: gray
        visible_library_netflix: true
        visible_library_amazon: true
        visible_library_disney: true
        visible_library_appletv: true
        visible_library_paramount: true
        visible_library_max: true
    overlay_files:
    - default: ratings
      template_variables:
        builder_level: show
        rating1: critic
        rating1_image: imdb
        rating2: audience
        rating2_image: tmdb
        rating3: user
        rating3_image: imdb
    - default: resolution
      template_variables:
        builder_level: show
        use_edition: false
    - default: streaming
      template_variables:
        region: FR
    operations:
      assets_for_all: true
      mass_audience_rating_update: tmdb
      mass_user_rating_update: imdb

collections_streaming.yml

collections:

  "Netflix • Films & Séries":
    tmdb_watch_provider: Netflix
    tmdb_region: FR
    summary: "Titres disponibles sur Netflix (France)."
    sync_mode: sync
    collection_order: alpha
    visible_home: true
    visible_shared: true
    build_collection: true
    url_poster: /assets/Streaming/Netflix/poster.jpg

  "Prime Video • Films & Séries":
    tmdb_watch_provider: Amazon Prime Video
    tmdb_region: FR
    summary: "Titres disponibles sur Amazon Prime Video (France)."
    sync_mode: sync
    collection_order: alpha
    visible_home: true
    visible_shared: true
    build_collection: true
    url_poster: /assets/Streaming/PrimeVideo/poster.jpg

  "Disney+ • Films & Séries":
    tmdb_watch_provider: Disney Plus
    tmdb_region: FR
    summary: "Titres disponibles sur Disney+ (France)."
    sync_mode: sync
    collection_order: alpha
    visible_home: true
    visible_shared: true
    build_collection: true
    url_poster: /assets/Streaming/DisneyPlus/poster.jpg

  "Apple TV+ • Films & Séries":
    tmdb_watch_provider: Apple TV+
    tmdb_region: FR
    summary: "Titres disponibles sur Apple TV+ (France)."
    sync_mode: sync
    collection_order: alpha
    visible_home: true
    visible_shared: true
    build_collection: true
    url_poster: /assets/Streaming/AppleTVPlus/poster.jpg

  # (Optionnel) Réseaux pour séries — utile pour “Originals”
  "Netflix • Séries (Network)":
    tmdb_network: Netflix
    summary: "Séries produites/diffusées par Netflix."
    sync_mode: sync
    collection_order: alpha
    visible_home: false
    visible_shared: true
    url_poster: /assets/Networks/Netflix/poster.jpg

  "Apple TV+ • Séries (Network)":
    tmdb_network: Apple TV+
    summary: "Séries Apple Originals."
    sync_mode: sync
    collection_order: alpha
    visible_home: false
    visible_shared: true
    url_poster: /assets/Networks/AppleTVPlus/poster.jpg

overlays.yml

overlays:

  ratings:
    template: rating
    default:
      rating1: imdb
      rating2: tmdb
      position: top_right
      font: Roboto-Bold
      font_size: 62
    operations:
      delete_overlays: false

  resolution:
    template: resolution
    default:
      position: bottom_left
      font: Roboto-Bold
      font_size: 70
    operations:
      delete_overlays: false

  streaming:
    template: streaming
    default:
      position: bottom_right
      region: FR
      style: logo
      allow_multiple: true
      font: Roboto-Bold
      font_size: 50
    template_variables:
      include:
        - Netflix
        - Amazon Prime Video
        - Disney Plus
        - Apple TV+
        - Canal+
        - Paramount+
        - OCS
    operations:
      delete_overlays: false

Si après un test, vous voulez que Plex revienne par défaut, Kometa propose un outil de reset.

kometa4

Loading

Streaming à la carte sans stockage local : Decypharr, débrideurs et torrenting

Par :Aerya
25 août 2025 à 17:53

Je continue mon tour d’horizon des solutions de streaming à la carte, légales ou non selon les pays, et qui permet de se créer et maintenir une bibliothèque multimédia sans stockage local.

Je n’aborderai pas publiquement les solutions de streaming depuis des .nzb directement.

Sur le même principe que Stremio, Vortex, ou RDT-Client/Zurg, ou encore DebridMediaManager, on peut utiliser Decypharr pour simuler un client BitTorrent (qBittorrent) et streaming le contenu de .torrent depuis des débrideurs, dont TorBox.

Je vais détailler ici l’installation manuelle de Decypharr, Prowlarr et Radarr/Sonarr/Plex mais tout est notamment inclus dans le script SSDv2 (avec une grosse et belle nouveauté à venir).

J’en profite pour remercier Laster13 et Teal-C pour leurs réponses à mes questions.

La dernière mouture de Decypharr embarque rClone et sa configuration sera automatisée. Mes tests sont réalisés avec Prowlarr et des indexeurs FR publics dont YGG via « api.eu », le débrideur AllDebrid ; et je ne « tape » que dans le contenu en cache chez AD (donc aucun téléchargement).
Verdict : RàS pour les films, quelques saisons de séries manquantes uniquement dans le cache, OK avec le téléchargement.

Le plus important est de bien comprendre que si on demande aux *arrs d’organiser les bibliothèques dans /mnt/Bibliothèques, ils ne vont y mettre que des symlinks vers le montage rClone d’AllDebrid (/mnt/decypharr).
Les *arrs, pour traiter les fichiers, tout comme Plex (ou autre) pour leur lecture, doivent avoir accès à ce montage rClone.
C’est pourquoi il est impératif de monter ce dossier en volume pour chaque Docker devant y avoir accès.

Arborescence du test :

aerya@StreamBox:/$ tree -L 2 /mnt/
/mnt/
├── Bibliothèques
│   ├── Films
│   └── Séries
├── Data
│   ├── lost+found
│   ├── quotaless
│   └── rCloneCache
└── decypharr
    ├── alldebrid
    └── qbit
        ├── radarr
        └── sonarr

Bibliothèques : dossier racine pour les *arrs
Data/rCloneCache : j’avais déjà le dossier pour autre chose, j’utilise le même

decypharr/alldebrid : montage de mon compte AD
decypharr/qbit : dossier de téléchargement (simulé) des fichiers. Les sous-dossiers radarr/sonarr seront ajoutés automatiquement lors de la configuration de Decypharr (tags)

Il faut installer et lancer Decypharr avant le reste vu que tout dépend ensuite du montage du débrideur et des symlinks. Idem s’il faut relancer le Docker Decypharr, il faut relancer les autres ensuite.

services:
  decypharr:
    image: cy01/blackhole:latest
    container_name: decypharr
    restart: always
    cap_add:
      - SYS_ADMIN
    security_opt:
      - apparmor:unconfined
    ports:
      - 8282:8282
    volumes:
      - /mnt:/mnt:rshared
      - /mnt/decypharr/qbit:/mnt/decypharr/qbit
      - /home/aerya/docker/decypharr/configs/:/app
    environment:
      - TZ=Europe/Paris
      - PUID=0
      - PGID=0
    devices:
      - /dev/fuse:/dev/fuse:rwm
    labels:
      - com.centurylinklabs.watchtower.enable=true

/mnt/decypharr/qbit devant être commun aux *arrs et Plex, on y montera /mnt:/mnt dans chaque ainsi que /mnt/decypharr/qbit:/mnt/decypharr/qbit dans les *arrs qui sauront directement où aller chercher les fichiers à traiter.

La configuration n’est pas vraiment expliquée dans la doc, la mienne n’est peut-être pas optimale mais fonctionne.

Je n’ai rien modifié dans l’onglet général. J’ai testé les notifications Discord (attention on voit la passkey des trackers utilisés) mais y’a vraiment pas d’intérêt si on ne fait qu’utilise le cache du débrideur (pas de téléchargement).

decypharr1

Pour la partie débrideur, on fait notre choix, on colle une clé API (ou plusieurs) et j’ai configuré le montage dans

/mnt/decypharr/alldebrid/__all__


On peut ajouter plusieurs débrideurs. On pourra les attribuer à un *arr lié à Decypharr et même les sélectionner lors de l’ajout manuel d’un .torrent

J’utilise le WebDav et je NE COCHE PAS la case Download Uncached pour qu’il ne télécharge aucun fichier (sur AD) mais n’utilise que son cache.
Je fais ça parce que je voulais tester le cache d’AD et ne voulais pas télécharger des fichiers sans les partager. On peut tout à fait faire les 2 mais attention, il n’y aura pas de seed (donc ratio 0). A ne pas faire chez les Tier 1 sous peine de voir son compte banni !
Certains ont créé des scripts qui captent les .torrent utilisés pour les mettre en seed depuis un client local ou sur un serveur. Dans ce cas, Decypharr est utilisable sans crainte sur les trackers privés.

decypharr2

Configuration du client qBittorrent émulé. Je met le chemin qui correspond au volume local dont je parlais au début

/mnt/decypharr/qbit
decypharr3

On peut ajouter les *arrs soit depuis Decypharr soit depuis les *arrs eux-mêmes. Je n’ai qu’AD en débrideur j’ai donc laissé la sélection auto mais on peut choisir.
Par exemple Radarr sur AD et Sonarr sur RD ou Sonarr4K sur TB etc. Selon les goût de chacun. Ce qui est certain, c’est que le cache de contenu MULTi/FRENCH est évidemment plus important sur AD et RD que sur TB, principalement utilisé par les anglophones pour Stremio.

decypharr4

Le Repair est le contrôle et la réparation des symlinks. Qui peuvent être cassés si le contenu lié est effacé du débrideur. Dans ce cas, selon la config, ça peut soit rechercher sur le débrideur (si le fichier a été renommé, vu que ça fonctionne avec le hash et non le nom) soit ça ira chercher un autre .torrent via les *arrs.
Pour l’instant je laisse l’option par défaut à savoir « per torrent » mais il est peut-être préférable d’utiliser « per file ». Dans le cas d’un .torrent de saison complètement, que ça ne recherche que l’épisode manquant (du cache) plutôt que de tout relancer.
Je l’ai mis en autotmatique, toutes les 24h.

decypharr5


Et enfin la partie rClone. Le monte globalement dans /mnt/decypharr et souhaite utiliser un cache (100Go) dans un dossier (et disque) qui me sert déjà à ça : /mnt/Data/rCloneCache
On peut sans doute améliorer cette configuration mais Plex lit un fichier de 94Go sans broncher…


decypharr6

Avec le mode de téléchargement activé, voici le rendu. PausedUP signifie que le .torrent est complété (et de fait plus en seed).

decypharr7

Je ne montre que l’exemple de configuration de Radarr. Pour Sonarr c’est la même logique. Chez moi c’est derrière un VPN pour des interrogations de sources hors Prowlarr et NZBHydra, il n’y a donc pas de port de publié.
Je retire tous les volumes par défaut pour ne monter que /mnt/decypharr/qbit:/mnt/decypharr/qbit et /mnt:/mnt

services:
  radarr:
    container_name: radarr
    restart: always
    network_mode: container:gluetun-mullvad
    environment:
      - TZ=Europe/Paris
      - PUID=0
      - PGID=0
    volumes:
      - /home/aerya/docker/radarr:/config
      - /mnt/decypharr/qbit:/mnt/decypharr/qbit
      - /mnt:/mnt
    labels:
      - com.centurylinklabs.watchtower.enable=true
    image: linuxserver/radarr:nightly

Configuration du dossier racine : /mnt/Bibliothèques/Films

radarr1

Configuration du client de téléchargement si on n’a pas ajouté Radarr depuis Decypharr. Il faut sélectionner qBittorrent

radarr2

Et dans l’adresse il faut mettre l’URL (ou l’IP) de Decypharr et le port (et SSL si vous utilisez une URL et un reverse proxy).
Le nom d’utilisateur et le mot de passe sont l’URL de Radarr et sa clé API.
La catégorie : radarr (et donc sonarr pour Sonarr ofc!)

Ne surtout pas cocher la case Sequential Order (sinon ça DL localement)

radarr3

Et comme le même chemin/volume est monté dans chaque Docker, il n’y a aucun Remote Path Mapping à mettre

radarr4

Lors de l’ajout d’un film, la complétion est quasi instantanée pour peu que le fichier cherché soit déjà dans le cache d’AllDebrid. Si vous activez le téléchargement des fichiers non encore en cache, ça peut prendre quelques minutes.


radarr5

En regardant de plus près, on voit bien que c’est un symlink vers le cache d’AllDebrid

aerya@StreamBox:/mnt/Bibliothèques/Films$ ls -l Alien\ -\ Romulus\ \(2024\)/
total 4
lrwxrwxrwx 1 root root 208 Aug 25 18:55 Alien.Romulus.2024.MULTi.VFF.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.7.1.Atmos-ONLY.mkv -> /mnt/decypharr/alldebrid/__all__/Alien.Romulus.2024.MULTi.VFF.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.7.1.Atmos-ONLY/Alien.Romulus.2024.MULTi.VFF.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.7.1.Atmos-ONLY.mkv
ncdu 1.19 ~ Use the arrow keys to navigate, press ? for help
--- /mnt/Bibliothèques/Films/Alien - Romulus (2024)- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@   4.0 KiB [###################################################]  Alien.Romulus.2024.MULTi.VFF.2160p.UHD.BluRay.REMUX.DV.HDR.HEVC.TrueHD.7.1.Atmos-ONLY.mkv


Plus globalement, tous les fichiers sont bien chez AllDebrid, monté via WebDav/rClone et je n’ai localement que des symlinks qui ne prennent aucune place.
En théorie, on pourrait se faire cette installation sur une Carte MicroSD de quelques Go 🙂

ncdu 1.19 ~ Use the arrow keys to navigate, press ? for help
--- /mnt ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   15.9 TiB [###################################################] /decypharr
    4.0 MiB [                                                   ] /Bibliothèques

Pour terminer, la configuration de Plex. Toujours avec /mnt:/mnt de monté pour garantir l’accès aux symlinks.

services:
  pms-docker:
    container_name: plex
    restart: always
    ports:
      - 32400:32400/tcp
      - 33401:33401/tcp
      - 3005:3005/tcp
      - 8324:8324/tcp
      - 32469:32469/tcp
      - 1900:1900/udp
      - 32410:32410/udp
      - 32412:32412/udp
      - 32413:32413/udp
      - 32414:32414/udp
    environment:
      - PLEX_UID=0
      - PLEX_GID=0
      - TZ=Europe/Paris
      - PLEX_CLAIM=claim-xxx
      - ADVERTISE_IP=http://192.168.0.163:32400/
    hostname: plex.xxx.xxx
    volumes:
      - /home/aerya/docker/plex:/config
      - /mnt:/mnt
      - type: tmpfs
        target: /transcode
        tmpfs:
          size: 4g
    labels:
      - com.centurylinklabs.watchtower.enable=true
    image: plexinc/pms-docker:latest
plex1
plex2

Loading

Nexterm : terminal SSH/sFTP sous Docker, WebUI avec clés et snippets

Par :Aerya
21 août 2025 à 13:44

Gros fan et utilisateur du terminal Asbru-CM, j’ai de temps en temps besoin de pouvoir utiliser ça en mobilité. Je m’étais équipé d’une instance de SSHwifty.
Cherchant un terminal, gratuit, à héberger et avec plus de fonctionnalités, mon choix s’est arrêté sur Nexterm qui ne manque pas d’options !

CAUTION
Nexterm is currently in early development and subject to change. It is not recommended to use it in a production environment.

  • Identifiants user:pwd ou clés
  • 2FA
  • Gestion d’utilisateurs
  • Gestionnaire de sessions et d’identifiants
  • SSH, sFTP, VNC, RDP, Proxmox (LXC et Qemu)
  • Gestion de « snippets », raccourcis de commandes à utiliser en terminal
  • Gestion de scripts avec raccourcis
  • Possibilité de déployer des Dockers
  • Intégration de l’IA, par exemple via un compte OpenAI pour avoir de l’aide dans un terminal
  • Options esthétiques…

Ok, tout n’est pas utile évidemment.

Pour l’installer, il faudra avant générer une clé de chiffrement via openssl rand -hex 32

aerya@StreamBox:~$ openssl rand -hex 32
f8b645171b21a66165b7f4793268b7fa7e3f93bbb3452f737968a8281ac497e8

On peut alors l’installer en Docker

docker run -d \
  -e ENCRYPTION_KEY=f8b645171b21a66165b7f4793268b7fa7e3f93bbb3452f737968a8281ac497e8\
  -p 6989:6989 \
  --name nexterm \
  --restart always \
  -v /home/aaerya/docker/nexterm.direct:/app/data \
  germannewsmaker/nexterm:latest


Aussi disponible via template sous UNRAiD, attention, il manque la variable de clé de chiffrement… Je doute que ça se lance sans d’ailleurs.
Il faut ajouter la variable ENCRYPTION_KEY et sa valeur

2025 08 21 09 48 45 homebox updatecontainer — librewolf


Une fois un compte créée, on peut paramétrer l’interface

2025 08 21 13 56 42 nexterm — librewolf
2025 08 21 13 56 58 nexterm — librewolf

Créer des identités qu’il faudra ensuite lier aux serveurs ajoutés. On peut donc utiliser soit un mot de passe soit une clé SSH.

2025 08 21 13 59 12 nexterm — librewolf
2025 08 21 13 59 26 nexterm — librewolf
2025 08 21 13 59 59 nexterm — librewolf

Comme je l’écrivais, on peut ajouter de l’IA. J’ai testé rapidement, je vous montre ça ensuite.

2025 08 21 14 02 09 nexterm — librewolf

La partie serveurs, qu’on peut organiser en dossiers, est simple et intuitive.

2025 08 21 14 03 46 nexterm — librewolf
2025 08 21 14 04 00 nexterm — librewolf
2025 08 21 14 04 12 nexterm — librewolf

Choisir ou créer une identité liée

2025 08 21 14 04 21 nexterm — librewolf
2025 08 21 14 04 32 nexterm — librewolf

Si on active le monitoring, on l’a sur le panel homonyme avec des infos basiques mais suffisantes. A noter que ça ne me retourne jamais de version de l’OS. Je ne suis pas surpris pour UNRAiD ou Synology mais c’est plus étonnant pour Debian, Garuda (Arch) et Ubuntu.
Comme indiqué sur le site, l’outil est encore à un stade de développement peu avancé.

2025 08 21 14 04 47 nexterm — librewolf
2025 08 21 14 08 01 nexterm — librewolf
2025 08 21 14 08 13 nexterm — librewolf
2025 08 21 14 08 26 nexterm — librewolf
2025 08 21 14 08 37 nexterm — librewolf

On peut accéder à chaque serveur en même temps, dans un onglet séparé. En revanche attention si un travail est en cours, cliquer sur un autre menu dans le même onglet (du navigateur) ferme toutes les sessions.

2025 08 21 14 13 35 nexterm — librewolf

Version sFTP, avec téléchargement, création de dossiers, édition/renommage.

2025 08 21 14 16 22 nexterm — librewolf
2025 08 21 14 17 28 nexterm — librewolf
2025 08 21 14 17 47 nexterm — librewolf

On ne peut en revanche pas (encore ?) visualiser de photo ou vidéo. D’un autre côté c’est pas le but d’un FTP…

Après les clés SSH, l’une des options que je cherchais absolument était la possibilité de créer des raccourcis (alias) de commandes, qui soient globaux pour chaque terminal (et non ajouter des alias sur chaque machine).
Par exemple taper « upgrade » ou cliquer un bouton (cette option avec Nextrem) qui envoie la commande sudo apt update && sudo apt upgrade -y
On peut créer les snippets via le menu et ensuite les utiliser avec l’icône en haut à droite du terminal (qui se voit plus ou moins bien selon le thème…). J’ai pris des exemples basiques pour l’instant, j’ai plus testé qu’utilisé.

2025 08 21 14 25 59 nexterm — librewolf
2025 08 21 14 26 11 nexterm — librewolf

Cliquer sur l’icône des snippets et sur celui qu’on souhaite utiliser

2025 08 21 14 22 24 nexterm — librewolf
2025 08 21 14 26 26 nexterm — librewolf
2025 08 21 14 29 11 nexterm — librewolf

Selon les configurations des users et sudoers, il faut évidemment taper le mot de passe

admin@DockerLab:~$ sudo apt update && sudo apt upgrade -y
Password: 


2025 08 21 14 31 48 nexterm — librewolf

Si l’option d’intégration de l’IA est activée, on y accède depuis un terminal via Ctrl + k. Aucune commande n’est exécutée par l’IA, elles sont juste tapées dans le terminal et l’utilisateur doit l’exécuter.

2025 08 21 14 33 14 nexterm — librewolf

Je ne suis ni fan ni, du coup, connaisseur, donc j’ai pas testé de demande très compliquée. Même en faisant des fautes dans la demande, elle s’en sort du du basique

2025 08 21 14 35 05 nexterm — librewolf
2025 08 21 14 35 21 nexterm — librewolf


Idem pour des installations basiques. Testé sur Arch aussi, c’était bon. Mais je reste sur du très simple.

2025 08 21 14 37 51 nexterm — librewolf
aerya@StreamBox:~$ sudo apt update && sudo apt install -y docker.io jq htop nodejs npm

Semble également fonctionner en français (vu que c’est ChatGPT dans mon test) et l’installation de Docker est correcte. Même si c’est pas optimisé (serveur Apache2n mysql de base etc)

aerya@StreamBox:~$ sudo apt update && sudo apt install apache2 mysql-server php php-mysql libapache2-mod-php php-cli php-curl php-gd php-mbstring php-xml php-xmlrpc php-soap php-intl php-zip wget unzip -y && cd /tmp && wget https://wordpress.org/latest.zip && unzip latest.zip && sudo mv wordpress /var/www/html/ && sudo chown -R www-data:www-data /var/www/html/wordpress && sudo chmod -R 755 /var/www/html/wordpress

En étant plus précis dans ma demande c’est mieux. Sauf que la commande est tronquée ^^

2025 08 21 14 42 08 nexterm — librewolf


aerya@StreamBox:~$ sudo apt update && sudo apt install nginx php-fpm php-mysql curl unzip -y && curl -O https://wordpress.org/latest.zip && unzip latest.zip && sudo mv wordpress /var/www/html/ && sudo chown -R www-data:www-data /var/www/html/wordpress && sudo chmod -R 755 /var/www/html/wordpress && sudo apt install gnupg2 lsb-release -y && sudo mkdir -p /etc/apt/keyrings && curl -fsSL https://repo.percona.com/apt/percona-release_latest.generic_all.deb -o percona-release.deb && sudo dpkg -i percona-release.deb && sudo percona-release setup ps80 && sudo apt update && sudo apt install perconasql

Pour Docker, c’est pas mal mais pas magique non plus.

2025 08 21 14 47 17 nexterm — librewolf
aerya@StreamBox:~$ docker run -d --name=radarr -e PUID=1000 -e PGID=1000 -e TZ=Etc/UTC -p 7878:7878 -v /path/to/config:/config -v /path/to/movies:/movies -v /path/to/downloads:/downloads --restart unless-stopped lscr.io/linuxserver/radarr:latest


Pour que ce soit « parfait », il faut lui indiquer quels dossiers monter etc. Bref, autant le faire à la main as usual! Mais, encore une fois, je découvre l’IA dans un terminal et ne souhaite pas approfondir cette expérience.

Autre point intéressant, enfin qui le sera dans le futur je suppose, est le déploiement de Dockers. Avec une vision devops, c’est pas mal pour envoyer rapidement des utilitaires sur des machines.
L’AppsStore officiel est ici et permet de voir comment créer des applications (un docker compose ofc!). On peut donc tout à fait se faire les siennes et s’héberger sa propre source d’apps.
Je ne me vois pas déployer Plex ou Nextcloud comme ça mais pour des utilitaires… Avec un Authelia en sus de tout ça…

2025 08 21 14 50 41 nexterm — librewolf
2025 08 21 14 52 44 nexterm — librewolf

Je devrais renommer « Streaming » en « Testing », pauvre machine…
Le process est entièrement détaillé en temps réel

2025 08 21 14 52 56 nexterm — librewolf

On peut visualiser les logs

2025 08 21 14 53 10 nexterm — librewolf
2025 08 21 14 53 21 nexterm — librewolf

Et j’y accède bien à la fin. Alors évidemment, aucune auth, aucune sécurité. C’est pas fait pour déployer des instances Nextcloud en prod, juste des utilitaires quand on bosse ou doit tester. Enfin à mon sens c’est le but.

2025 08 21 14 53 33 myspeed — librewolf


J’aurais aimé avoir l’option de désinstaller le container mais ça viendra sûrement, le projet étant tout jeune (j’ai ouvert une issue).


Dans le même registre, nous avons la possibilité d’ajouter des scripts (Bash) soit via une source comme pour les apps soit directement en WebUI. Ils pourront alors être exécutés sur un serveur.

2025 08 21 15 05 42 nexterm — librewolf

Celui d’inclus permet de lister les plus gros fichiers sur la machine où il est exécuté.

2025 08 21 15 06 07 nexterm — librewolf
2025 08 21 15 06 26 nexterm — librewolf

Pour l’instant on ne peut l’exécuter que sur une machine à la fois.

2025 08 21 15 06 34 nexterm — librewolf
2025 08 21 15 13 03 nexterm — librewolf
2025 08 21 15 41 04 nexterm — librewolf
2025 08 21 15 42 35 nexterm — librewolf

Pour l’instant je suis fan de l’outil !
Et comme c’est en Docker, on peut le laisser en reverse proxy normal ou le faire passer par un VPN, Tor etc. Très pratique.

Loading

Plex : synchronisation avec Trakt.tv et notifications Discord

Par :Aerya
17 août 2025 à 09:26


Il y a quelques années, j’utilisais un plugin pour Plex pour synchroniser les visionnages. L’intérêt étant surtout de pouvoir ajouter/retirer des contenus, voire réinstaller un serveur Plex, tout en ne perdant pas le chemin parcouru 🙂

Avec l’évolution de Plex, il faut passer par un script Python, empaqueté dans un Docker pour plus de simplicité : PlexTraktSync, de Taxel. Alors que pour Jellyfin, on utilise toujours le plugin qui va bien.

On peut synchroniser de Plex vers Trakt et/ou Trakt vers Plex, par bibliothèque et utilisateur.


Voici un exemple d’installation et de configuration, sans prise en compte de Watchlists (que je n’ai pas vu qu’ici on passe par Overseerr uniquement).
Il faut une application Trakt.tv vérifiée (gratuit) pour récupérer ses clés d’accès. Et si vous voulez les notifications Discord, l’OS hôte (mon script est externe) doit avoir curl et jq.

Installation du Docker. Ofelia étant un cron qui permet de lancer la synchronisation selon nos préférences, je le lance toutes les 6h (0 */6 * * *). Pour paramétrer, aidez-vous de Cron Guru au besoin.

services:
  plextraktsync:
    image: ghcr.io/taxel/plextraktsync:latest
    container_name: plextraktsync
    restart: always
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Paris
    volumes:
      - /home/aerya/docker/plextraktsync/config:/app/config
    command: watch
    labels:
      - ofelia.enabled=true
      - ofelia.job-exec.sync.schedule=0 */6 * * *
      - ofelia.job-exec.sync.command=plextraktsync sync
      - ofelia.job-exec.sync.no-overlap=true
  ofelia:
    image: mcuadros/ofelia:latest
    container_name: ofelia
    restart: always
    command: daemon --docker
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
networks: {}


En suivant le ReadMe, lancer le Docker la 1ère fois créera le fichier de configuration config.yml. Mais on peut aussi l’éditer à la main, tout comme servers.yml.
Pour sélectionner le serveur, utiliser les flèches du clavier.

copie d'écran 20250817 093155

Je me suis trompé de serveur, j’ai édité la conf à la main ensuite, du coup il cherchait à valider un SSL alors que j’avais mis un serveur en IP locale. Il faut lui laisser un peu le temps mais ensuite c’est bon.

copie d'écran 20250817 093537

Si ce n’est pas déjà fait, il explique la marche à suivre pour se faire une application Trakt.tv

copie d'écran 20250817 093633

Quand je vois SickGear dans mes applications… ça rappelle de sacrés souvenirs ! 🙂

copie d'écran 20250817 093811

copie d'écran 20250817 093954

copie d'écran 20250817 094025
copie d'écran 20250817 094120

Il convient tout de même d’éditer un peu la configuration à la main, notamment si on veut exclure des bibliothèques ou watchlists. Ici c’est basique, je n’ai qu’un utilisateur et synchronise tout mais pour aller plus dans le détail je vous recommande de suivre son ReadMe.
C’est config.yml dans /home/aerya/docker/plextraktsync/config

cache:
  path: $PTS_CACHE_DIR/trakt_cache

# You may want to use per server libraries config instead:
# - https://github.com/Taxel/PlexTraktSync#libraries
excluded-libraries:
  - Private

config:
  dotenv_override: true

plex:
  timeout: 30

logging:
  append: true
  # Whether to show timestamps in console messages
  console_time: false
  debug: false
  filename: plextraktsync.log
  # Additional logger names to apply filtering
  filter_loggers:
  #    - plexapi
  #    - requests_cache.backends
  #    - requests_cache.backends.base
  #    - requests_cache.backends.sqlite
  #    - requests_cache.policy.actions
  #    - requests_cache.session
  #    - trakt.core
  #    - urllib3.connectionpool
  filter:
#    # Filter out all messages with level WARNING
#    - level: WARNING
#    # Filter out message with level WARNING and containing a text
#    - level: WARNING
#      message: "not found on Trakt"
#    - message: "because provider local has no external Id"
#    - message: "because provider none has no external Id"
#    - message: "Retry using search for specific Plex Episode"
#    # Filter out messages by requests_cache
#    - name: requests_cache.backends
#    - name: requests_cache.backends.base
#    - name: requests_cache.backends.sqlite
#    - name: requests_cache.policy.actions
#    - name: requests_cache.session

# settings for 'sync' command
sync:
  # Setting for whether ratings from one platform should have priority.
  # Valid values are trakt, plex or none. (default: plex)
  # none - No rating priority. Existing ratings are not overwritten.
  # trakt - Trakt ratings have priority. Existing Plex ratings are overwritten.
  # plex - Plex ratings have priority. Existing Trakt ratings are overwritten.
  rating_priority: plex

  plex_to_trakt:
    collection: false
    # Clear collected state of items not present in Plex
    clear_collected: false
    ratings: true
    watched_status: true
    # If plex_to_trakt watchlist=false and trakt_to_plex watchlist=true
    # the Plex watchlist will be overwritten by Trakt watchlist
    watchlist: false
  trakt_to_plex:
    liked_lists: true
    ratings: true
    watched_status: true
    # If trakt_to_plex watchlist=false and plex_to_trakt watchlist=true
    # the Trakt watchlist will be overwritten by Plex watchlist
    watchlist: false
    # If you prefer to fetch trakt watchlist as a playlist instead of
    # plex watchlist, toggle this to true (is read only if watchlist=true)
    watchlist_as_playlist: false
    # Sync Play Progress from Trakt to Plex
    playback_status: false

# Configuration for liked lists
liked_lists:
  # Whether to keep watched items in the list
  keep_watched: true

# Configuration override for specific lists
#liked_list:
#  "Saw Collection":
#    keep_watched: true

# settings for 'watch' command
watch:
  add_collection: false
  remove_collection: false
  # what video watched percentage (0 to 100) triggers the watched status
  scrobble_threshold: 80
  # true to scrobble only what's watched by you, false for all your PMS users
  username_filter: true
  # Show the progress bar of played media in terminal
  media_progressbar: true
  # Clients to ignore when listening Play events
  ignore_clients: ~

xbmc-providers:
  movies: imdb
  shows: tvdb

De même, on peut venir éditer le fichier du ou des serveurs Plex à synchroniser : servers.yml

servers:
  default:
    token: null
    urls:
    - null
    - null
    id: null
    config: null
  plex.domain.tld:
    token: xxxx
    urls:
    - https://plex.domain.tld
#    - http://192.168.0.139:32400
    id: xxxx
    config: null

Et donc, toutes les 6h, le Docker se lance et synchronise Plex et Trakt.tv pour mettre à jour les films et séries lus/non lus.
La 1ère fois peut prendre un peu de temps selon le nombre de fichiers.

Je voulais les notifications sur Discord, j’ai donc créé un script qui lance le Docker et envoie la récap en notification :

copie d'écran 20250817 110857

Nécessite curl et jq. Pour l’icône, ici comme pour Heimdall, j’utilise dashboardicons.com
Et il faut retirer Ofelia et les labels inhérents
du compose plus haut puisque c’est maintenant l’hôte, via crontab par exemple, qui va exécuter le script qui va lui-même lancer le Docker de plextraktsync.

Le compose devient

services:
  plextraktsync:
    image: ghcr.io/taxel/plextraktsync:latest
    container_name: plextraktsync
    restart: always
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Paris
    volumes:
      - /home/aerya/docker/plextraktsync/config:/app/config
    command: watch

Et mon script

#!/bin/bash
set -euo pipefail

WEBHOOK_URL="https://discord.com/api/webhooks/xxxx"

TMP_LOG="$(mktemp)"
docker compose exec plextraktsync plextraktsync sync 2>&1 | tee "$TMP_LOG"
RESULT=$?

# récupère les 20 dernières lignes
LOG_TAIL="$(tail -n 20 "$TMP_LOG" | jq -Rs .)"

PAYLOAD=$(jq -n --arg res "$RESULT" --arg logs "$LOG_TAIL" '
  {content: "Résultat sync : \($res)\n```\n\($logs | fromjson)\n```"}
')

curl -sS -X POST -H "Content-Type: application/json" \
  -d "$PAYLOAD" "$WEBHOOK_URL"

copie d'écran 20250817 112459


Je l’ai donc mis en cron, toutes les 6h :

0 */6 * * * bash /home/aerya/docker/plextraktsync/config/plextraktsyncdiscord.sh


Loading

Mon crumble aux pommes et raisin

Par :Aerya
29 juillet 2025 à 15:25


On a tellement l’habitude de se le faire becter par les oiseaux, guêpes et frelons que je me suis emballé hier et avons récolté du raisin un peu tôt.

D’un autre côté, on a regardé les prunes pousser, on ne les a pas mangées. Idem pour un des noisetiers.

img 0041

Donc, entre mon raisin rouge encore à 80% vert et un reste de pommes (du commerce, ici elles sont encore bien vertes), j’ai préparé un crumble aux pommes et raisin !

Et les poules vont pouvoir s’amuser avec les déchets des deux 🙂

Ma recette (y’en a sans doute autant que de personnes qui en font) :

  • 130Gr de sucre ; je mets de la cassonade par préférence et « beaucoup » pour contrer l’acidité du raisin,
  • 100 + 20Gr de beurre,
  • 140Gr de farine de blé,
  • 80Gr de poudre d’amandes,
  • 4-500Gr de raisin,
  • 4 à 5 pommes, dépend de leur taille.

Le plus long étant de trier les grains les plus mûrs… Les laver rapidement, réserver.

img 0043

S’occuper des pommes : les peler et couper grossièrement. Merci à la personne qui a inventé l’épluche pommes !

img 0044

Mélanger sucre, farine et poudre d’amandes. Ajouter ensuite 100Gr de beurre et malaxer pour obtenir une pâte homogène. Vive les gants !

Si comme moi le beurre sort juste du réfrigérateur, le passer 20 secondes au micro-ondes. Et réserver.

img 0045

A la pôele, 20Gr de beurre, pour que ça n’accroche pas ici et moins dans le plat au four.

Faire revenir le raisin à feu doux, qu’il se colore. 8 minutes au gaz par exemple.

img 0046
img 0047

Quand il change couleur, ajouter les pommes, mélanger et couvrir pour laisser couffiner 5/6 minutes jusqu’à prendre la couleur du raisin.

img 0049

Une fois prêt, mettre dans un plat (non beurré vu que les fruits le sont) et couvrir avec la pâte.

img 0051

Enfourner 30-35 minutes à 180°.

img 0052

Et ne faites pas comme moi : pensez à étaler correctement la pâte 🙂

Loading

Portracker : listing et identification des ports utilisés par Docker et le System

Par :Aerya
27 juillet 2025 à 17:43

Au tout début, dès que je devais sélectionner des redirections de ports je faisais ça proprement, ça se suivait. Puis… j’ai glissé.

Alors que ce soit dans une optique de faire du propre, dans celle de vérifier si tous les ports ouverts sont bien utiles, quelle application utilise quoi ou quels ports traiter via un firewall/port-forward, il peut être utile d’en avoir une liste.

Si c’est simple à faire en console, c’est pas sexy, encore moins pratique.

Merci à Mostafa Wahied qui a mis en ligne l’outil Portracker 🙂 Et merci à demonangex pour la découverte.

2025 07 27 19 37 41 portracker — mozilla firefox (ubuntu)

Ça s’installe en 2-2 en Docker, on peut utiliser le Dashboard pour monitorer plusieurs machines, on peut lister les ports Docker et/ou de l’hôte, c’est beau. On peut chercher par numéro de port, nom d’applciation etc.

2025 07 27 19 38 32 portracker — mozilla firefox (ubuntu)

Exemple de lancement, sur UNRAiD dans mon cas :

services:
  portracker:
    image: mostafawahied/portracker:latest
    container_name: portracker
    restart: always
    network_mode: host
    volumes:
      - /mnt/user/appdata/portracker/data:/data
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      - /mnt/user/appdata/portracker/db=/data/portracker.db
      - PORT=4999
      - INCLUDE_UDP=true
    labels:
      - com.centurylinklabs.watchtower.enable=true

Loading

UNRAiD : Docker avec Alpine, forcer l’ajout de tzdata au boot et à la mise à jour

Par :Aerya
25 juillet 2025 à 19:30

L’intérêt d’un container Docker basé sur Alpine est de gagner de la place, beaucoup de place parfois, en partant d’une base très légère, dépourvue du superflu.
Sauf que de temps en temps, c’est pas pratique. J’ai migré mon AdGuardHome vers la version avec Redis et Unbound d’imTAIH.


✅ Avantages d’Unbound avec la prélecture (prefetching) :

  • Résolution DNS plus rapide : les enregistrements DNS fréquemment consultés sont résolus et mis en cache à l’avance.
  • Latence réduite : moins de délais liés aux requêtes DNS, idéal pour les applications sensibles au temps de réponse.
  • Meilleures performances réseau : les réponses étant déjà en cache, elles sont disponibles instantanément.


🧠 Avantages de l’utilisation de Redis :

Cache fiable : assure une réponse rapide même sous forte sollicitation.

Vitesse mémoire : Redis stocke les résultats DNS en mémoire pour un accès quasi instantané.

Débit optimisé : réduit la charge sur les serveurs DNS en évitant les requêtes répétitives.

Charge allégée : limite le nombre de requêtes vers l’extérieur.

Et donc c’est basé sur Alpine, qui n’embarque pas en standard tzdata 🙁

Ce qui ne m’arrange pas vu que je voudrais des logs d’AdGuardHome sur le bon fuseau horaire 🙂

Avec les Dockers de Linux Server, on peut ajouter des DOCKER_MODS. Là non. J’ai donc ajouté un script « AGH-tzdata » dans user-scripts qui installe tzdata et crée les dossiers nécessaires au boot de l’array et/ou à la MàJ du Docker que j’ai nommé AGH-Unbound-Redis.
Plus précisément, comme je tiens à passer par users-scripts et que du coup le script ne peut pas être relancé dès que le Docker est mis à jour, je fais en sorte que le script contrôle le Docker (tzdata installé etc) et si ce n’est pas le cas, il le fait. Le tout avec un log.

Le script : (mon fuseau est en dans le code directement : Europe/Paris)

#!/bin/bash

# Variables
CONTAINER="AGH-Unbound-Redis"
LOG_FILE="/var/log/agh-tz.log"
NOW=$(date "+%Y-%m-%d %H:%M:%S")

echo "[$NOW] Vérification du fuseau horaire dans $CONTAINER..." >> "$LOG_FILE"

# Vérifier si le Docker tourne
if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER}$"; then
  echo "[$NOW] Le Docker $CONTAINER n'est pas lancé. Abandon." >> "$LOG_FILE"
  exit 0
fi

# Tester si tzdata installé
if docker exec "$CONTAINER" sh -c 'apk info tzdata >/dev/null 2>&1'; then
  echo "[$NOW]tzdata déjà installé." >> "$LOG_FILE"
else
  echo "[$NOW]Installation de tzdata..." >> "$LOG_FILE"
  docker exec "$CONTAINER" apk add --no-cache tzdata >> "$LOG_FILE" 2>&1
fi

# Configurer le fuseau horaire si incorrect
CURRENT_TZ=$(docker exec "$CONTAINER" date +"%Z")
if [ "$CURRENT_TZ" != "CEST" ] && [ "$CURRENT_TZ" != "CET" ]; then
  echo "[$NOW]Configuration du fuseau horaire Europe/Paris" >> "$LOG_FILE"
  docker exec "$CONTAINER" cp /usr/share/zoneinfo/Europe/Paris /etc/localtime
  docker exec "$CONTAINER" sh -c 'echo "Europe/Paris" > /etc/timezone'
else
  echo "[$NOW]Fuseau horaire déjà correct ($CURRENT_TZ)." >> "$LOG_FILE"
fi

# Reporter l'heure dans le log
CURRENT_DATE=$(docker exec "$CONTAINER" date)
echo "[$NOW]Heure actuelle dans le Docker : $CURRENT_DATE" >> "$LOG_FILE"
echo "----------------------------------------------------------" >> "$LOG_FILE"





Le rendu d’exécution dans le log :


[2025-07-25 19:44:01] Vérification du fuseau horaire dans AGH-Unbound-Redis...
[2025-07-25 19:44:01]tzdata déjà installé.
[2025-07-25 19:44:01]Fuseau horaire déjà correct (CEST).
[2025-07-25 19:44:01]Heure actuelle dans le Docker : Fri Jul 25 19:44:02 CEST 2025

Et contrôle de la date via la console :

root@HomeBox:/mnt/user/appdata# docker exec -it AGH-Unbound-Redis date
Fri Jul 25 19:46:45 CEST 2025

Je me remets sur l’article après le repas. Les logs affichent toujours 2h de retard.

Et… c’est là que je percute ! J’ai visiblement « digéré » avant de manger…

boulet

AdGuardHome utilise la timezone du navigateur dans les logs affichés. Timezone modifiée par mes paramètres stricts LibreWolf

librewolf

Sous un navigateur « propre », ça marche en effet impeccablement.

aghok

Bon, je laisse quand même mon script dont je suis content (avec sans doute trop de log d’ailleurs). Il me servira peut-être de base pour un autre souci avec un Docker basé sur Alpine ^^’

Loading

TorBox.app, débrideur & seedbox BitTorrent et Usenet qui monte (Stremio, Kodi, Infuse, Plex, Jellyfin, VLC/MPV…)

Par :Aerya
25 juillet 2025 à 05:19

Je connaissais torbox.ch et quand j’ai vu passer « TorBox » j’étais intrigué au sujet du streaming.

TorBox.app est de ces projets qui naissent de passionnés comme Ultra.cc ou Feral Hosting. Voire TPB ou Mininova, précurseurs en leur temps et qui ont pris les tournures qu’on leur connaît.
Les liens vers TorBox.app dans cet article contiennent mon lien d’affiliation. Article non sponsorisé. J’ai souscrit à une offre Pro à 12.50€ TTC/mois.

2025 07 06 19 47 10 torbox premium seedbox — mozilla firefox (ubuntu)

TorBox.app se présente comme un service de seedbox moderne, Freemium et très porté sur, et par, sa communauté. Comptez 12.50€ TTC en souscription mensuelle via Patreon pour un compte Pro, qui donne donc accès au téléchargement de .nzb (potentiellement plus besoin de FAU donc). Tout est Open Source et disponible sur GitHub.

1

2025 07 06 19 51 57 subscription torbox — mozilla firefox

D’après leurs statistiques, ils comptent environ 180.000 utilisateurs (gratuits compris) pour 29 serveurs. C’pas mal…
Et ils sponsorisent des développeurs.

2025 07 25 07 35 25 who torbox sponsors torbox help center — mozilla firefox (ubuntu)


Ce service est conçu pour fonctionner comme source pour Stremio mais fonctionne également de base avec Kodi, Infuse et VLC ou MPV, ils expliquent comment utiliser leurs services avec Google Drive, OneDrive et Stremio, d’ailleurs leurs FAQs sont bien faites (pour qui parle anglais, mais on est en 2025), ils ont une communauté importante (Reddit, Discord), et ça fonctionne comme AllDebrid, RealDebrid etc pour le téléchargement et la mise en cache.

2025 07 06 20 15 12 how does the torbox cache work torbox help center — mozilla firefox

On peut aussi l’utiliser avec RDT-Client. Ils fournissent plusieurs tutoriels utiles et simples.

Ils ne sont pas en reste niveau fonctionnalités notamment liées au streaming via Stremio et se démarquent de la concurrence ou des autres services tels qu’Ultra.cc, Feral, AD, RD etc. Pour les geeks, Whamy propose une API complète.

While TorBox is built specifically for torrents, TorBox has also expanded as well, meaning there are all sorts of new things in store for the users of TorBox.

Downloads

  • Torrents
  • Web Downloads/Debrid
  • RSS Scheduled Torrents
  • Queued Downloads
  • Usenet Downloads
  • High Speed Downloads
  • Add to Download Manager
  • Add to Google Drive
  • Add to Dropbox
  • Add to GoFile
  • Add to 1Fichier
  • Add to Mega

Services

  • Mobile Companion App
  • API
  • WebDAV
  • FTP
  • Stremio Addon
  • Discord Bot
  • Telegram Bot

Notifications

  • Email Notifications
  • Web Notifications
  • Mobile Push Notifications
  • RSS Notifications
  • Discord Notifications
  • Telegram Notifications
  • JDownloader2 Notifications
  • Webhook Notifications

Bon, rien de magique non plus, pour maintenir leur qualité de services et leurs prix, ils ont mis en place certaines limites notamment de transferts mensuels.

Quels sont les seuils ?

Nous ne communiquerons pas les seuils absolus, et il n’est pas réaliste d’annoncer les seuils dynamiques, car ils évoluent selon l’usage global des utilisateurs. Si plus d’utilisateurs consomment davantage de bande passante, alors le seuil dynamique augmentera, permettant à chacun d’utiliser davantage. À l’inverse, si beaucoup d’utilisateurs réduisent leurs téléchargements (au profit, par exemple, d’un cache de plus en plus efficace), alors le seuil dynamique baissera.

Les seuils ne descendront jamais en dessous des niveaux suivants :

  • Offre gratuite (Free) : 5 To par mois
  • Offre Essential : 10 To par mois
  • Offre Standard : 20 To par mois
  • Offre Pro : 30 To par mois

Ces valeurs ne représentent ni un plafond autorisé, ni une représentation précise du seuil dynamique. Ce sont simplement les valeurs minimales garanties : tant que vous restez en dessous de ces niveaux, vous êtes assuré de ne jamais recevoir d’avertissement.

Grâce au seuil dynamique, vous pouvez largement dépasser ces niveaux sans souci, mais ce sont les limites minimales en dessous desquelles vous ne risquez jamais rien.

Le seuil dynamique a été conçu pour que l’utilisateur moyen, voire l’utilisateur intensif, ne le rencontre jamais.

Ils ont été un peu échaudés par des hoarders pour Plex/Jellyfin. Ces limites restent toutefois très convenables même pour ceux qui « dépannent » leurs familles et amis (moyennant finance) avec des flux vidéos.

L’interface est sommaire mais efficace.

2025 07 06 20 29 17 dashboard torbox — mozilla firefox (ubuntu)

Ici, pas d’installation d’applications, c’est une pure seedbox qui permet de télécharger et stocker du .torrent et du .nzb pour les utiliser avec nos applications auto-hébergées ou des services tiers.

78 intégrations et 136 hosters compatibles !

2025 07 06 22 00 17 integrations torbox — mozilla firefox (ubuntu)
2025 07 06 22 00 29 integrations torbox — mozilla firefox (ubuntu)
2025 07 06 22 00 41 integrations torbox — mozilla firefox (ubuntu)
2025 07 06 22 00 55 integrations torbox — mozilla firefox (ubuntu)
2025 07 06 22 01 06 integrations torbox — mozilla firefox (ubuntu)
2025 07 06 22 01 17 integrations torbox — mozilla firefox (ubuntu)
2025 07 06 22 01 34 integrations torbox — mozilla firefox (ubuntu)
2025 07 06 22 01 45 integrations torbox — mozilla firefox (ubuntu)
2025 07 06 22 01 54 integrations torbox — mozilla firefox (ubuntu)

Moi ce qui m’intéresse là-dedans c’est DebriDav, qui fera l’objet d’un autre article. C’est comme RDT-Client » mais pour BitTorrent et Usenet. Et je veux utiliser TorBox avec Plex ou Jellyfin pour Usenet, avec un fallback BitTorrent au cas où.

Comme je le disais plus haut, ils ont un centre de support très complet, un bot de SAV sur Discord, en sus des utilisateurs qui aident tous les jours.

2025 07 06 22 06 54 sub surface (ubuntu)

On peut également utiliser les liens magnets y compris avec leurs extensions pour navigateurs, comme par exemple pour Firefox (aperçu Reddit).

2025 07 06 22 15 39 tools torbox — mozilla firefox

Il existe aussi une application TorBox Manager à auto-héberger : GitHub / Reddit.

Très bien pourvu en options

2025 07 06 22 17 02 settings torbox — mozilla firefox (ubuntu)
2025 07 06 22 19 14 settings torbox — mozilla firefox (ubuntu)
2025 07 06 22 19 22 settings torbox — mozilla firefox (ubuntu)

Et franchement, c’est top !

Ils proposent plusieurs CDN (US, EU, APAC) pour qu’on dispose du meilleur accès aux fichiers. Nous avons aussi les options pour Stremio.

2025 07 06 22 23 10 settings torbox — mozilla firefox (ubuntu)

Outre les options de base (résolution, langue), on peut sélectionner si l’on veut des fichiers uniquement en cache ou aussi en téléchargement, si on veut seeder ou non les .torrents qu’on ajouterait (pourquoi pas ?!), si on privilégie Usenet ou BitTorrent.

2025 07 06 22 26 40 sub surface (ubuntu)
2025 07 06 22 27 13 sub surface (ubuntu)
2025 07 06 22 27 26 sub surface (ubuntu)
2025 07 06 22 27 36 sub surface (ubuntu)
2025 07 06 22 28 01 sub surface (ubuntu)
2025 07 06 22 28 13 sub surface (ubuntu)
2025 07 06 22 28 28 sub surface (ubuntu)

Pour se faire sa VOD personnelle façon IPTV, Stremio suffirait bien. Et avec ses options, c’est simple !

2025 07 06 22 36 40 settings torbox — mozilla firefox (ubuntu)

Et on peut ajouter des instances Jackett, Prowlarr et NZBHydra. Ils font la pub pour ElfHosted mais on peut aussi ajouter ses propres instances pour utiliser TB comme outil de téléchargement et stockage avec ses sources.

2025 07 06 22 36 49 settings torbox — mozilla firefox (ubuntu)
2025 07 06 22 36 56 sub surface (ubuntu)

Test avec un .nzb. On peut soit envoyer le fichier soit coller son URL (et ça marche avec « YGG »)

2025 07 06 22 41 38 add usenet download torbox — mozilla firefox
2025 07 06 22 43 12 dashboard torbox — mozilla firefox (ubuntu)

Il a dépassé les 500MBs en téléchargement. J’avais demandé le post-processing classique de réparation/décompression/suppression.

2025 07 06 22 46 04 dashboard torbox — mozilla firefox (ubuntu)

Je me fais confirmer par le support que les serveurs sont en cours d’upgrade, sans délai, et que pour l’instant ça peut en effet ramer pour des .nzb de près de 100Go.

large files like 84 gb files take a bit of time to process unfortunately. The Servers are actually being upgraded, and soon it’ll be a lot faster (no eta though)

Ça fait maintenant plus de 15 jours que cet article est en rédaction et c’est bon, les serveurs ont été upgradés, les services revus.

Malgré un SAV géré notamment via un bot, en sus du Staff, TB rencontrait pas mal de soucis

2025 07 08 08 53 50 • discord #support bot wamy's happy dev circle
2025 07 08 21 39 26 • discord #outages wamy's happy dev circle

On peut d’ailleurs suivre les incidents et leurs résolutions via la page dédiée.

Torbox me permet de télécharger un .nzb de 79Go en moins de 10 minutes, avec un débit moyen de téléchargement de 160MBps, auxquels il faut ajouter 4 minutes de post-traitement (il était posté avec archives, ce qui est de moins en moins le cas). C’est bien plus rapide qu’à l’époque ! Malgré une vitesse de DL plus faible.

Je viens de lancer un petit fichier de 4GB postés sans compression. DL à 1GBps et post-traitement en quelques secondes !

2025 07 25 06 42 43 0b s↓0b s↑ torbox — mozilla firefox (ubuntu)

Et le changelog du moment fait la part belle aux animes notamment et ajoute TB comme source de recherche de contenus pour les *arrs. Faut pas s’attendre à trouver de suite beaucoup de contenus FRENCH/MULTi cependant, les francophones étant plus sur AllDebrid/RealDebrid.

In v7.4 we introduce:
Kitsu compatibility (among other popular catalogs compatibility),
Better Voyager Search API metadata (for developers),
Nyaa and Animetosho trackers built in for better anime stream results,
Much faster stream searches with BYOI,
Torznab and Newznab endpoint for searching via Arrs or NZBHydra2,
Over a dozen new filehosters to download from,
Optimized API endpoints with some savings resulting in more than 300% faster start times,
Faster stream start times ^,
More Stremio settings,
More performant dashboard,
Seemingly infinite amount of bug fixes and minor changes.

2025 07 25 07 13 51 root index torbox webdav — mozilla firefox (ubuntu)

Au final, TorBox est un beau projet. Dans la gamme de prix des seedboxes complètes typées Ultra.cc, FeralHosting etc, TB propose un service différenciant et complètement clés en mains pour le streaming facile via Stremio avant tout.
Certes, on ne peut y installer d’application contrairement à certains concurrents mais le service comprend tous les outils pour chercher, télécharger, partager, stocker et consommer des contenus numériques, qu’on soit amateurs de Stremio, Kodi, Jellyfin, Plex… et avec ses propres indexeurs !
Avec une communauté élargie et dynamique, un support réactif et sympathique, TorBox est une belle découverte et j’espère leur voir un avenir au niveau, justement, d’Ultra et Feral.

Loading

Ajouter Ygg-API à Prowlarr

Par :Aerya
12 juillet 2025 à 17:31


Prowlarr permet de mixer plusieurs indexeurs (BitTorrent/Usenet) pour faire des recherches et téléchargements.
Il existe des indexeurs pour YGGtorrent mais ils sont souvent dans les choux du fait de la protection CloudFlare du site. Certes on trouve des outils annexes pour tenter de passer outre mais sinon on peut faire plus simple avec ygg-api (yggapi.eu dont le code n’est pas publié pour ne pas être contré).

Merci à Clemv95 pour le fichier de configuration. Je le poste aussi sur mon blog au cas où.



EDIT du 25.07.25 : Glira fait une remarque qu’il semble bon de transmettre aux néophytes ou à ceux pour qui YGG est quasi leur unique source. Je suppose cependant que la personne derrière ce site n’a absolument pas besoin de nos passkeys pour ce site où il est si facile de se faire un compte et du ratio (sans Joal), tout comme je présume qu’elle est sur les trackers privés francophones…


Attention ce pendant, cette solution envoie votre passkey sur le serveur de yggapi.eu. Et il est extrêmement facile pour lui de les enregistrer. Utilisez ce service que si vous êtes prêt à perdre votre compte ygg en cas d’exploitation de votre passkey.
Ou renseignez une fausse passkey, et modifiez le fichier torrent après téléchargement.



Dans l’installation de Prowlarr, aller dans le dossier Definitions et créer le dossier Custom.

2025 07 12 19 27 55 homebox Ásbrú connection manager (ubuntu)

Puis créer/mettre dedans le fichier ygg-api.yml et relancer Prowlarr. Ygg-API est maintenant disponible dans la liste des indexeurs.

2025 07 12 19 29 47 indexers prowlarr — mozilla firefox

Pour le configurer, il suffira d’ajouter une passkey. Trouvable sur son compte YGG ou dans l’URL d’annonce du tracker si vous avez déjà des .torrents de chargés.



Loading

Reiverr : centralisation Jellyfin, Sonarr, Radarr, TMDB

Par :Aerya
6 juillet 2025 à 09:54

J’en avais parlé rapidement sur un forum il y a un peu plus d’un an, Reiverr se veut être une interface globale pour l’indexation et la recherche/découverte de contenus audio/vidéo.

reiverr demo

C’est une alternative à Overseerr, qui englobe plusieurs fonctionnalités de parcours de librairies Jellyfin, recherche de contenus avec les *arrs, découverte via TMDB et qui permet la lecture directement via Jellyfin et en Torrent-Streaming (donc à faire passer par un VPN).

Des clients AndroidTV/Tyzen est en cours de test. C’est ce qui m’avait fait regarder de près ce projet il y a 1 an, il a repris du souffle 🙂

2025 07 06 09 46 50 reiverr — mozilla firefox (ubuntu)
2025 07 06 09 47 59 reiverr — mozilla firefox (ubuntu)
2025 07 06 09 48 22 sub surface (ubuntu)
2025 07 06 09 48 35 sub surface (ubuntu)
2025 07 06 09 48 45 sub surface (ubuntu)
2025 07 06 09 49 00 sub surface (ubuntu)
2025 07 06 09 49 11 sub surface (ubuntu)
2025 07 06 09 50 31 reiverr — mozilla firefox (ubuntu)
2025 07 06 09 50 44 reiverr — mozilla firefox (ubuntu)

2025 07 06 09 51 11 reiverr — mozilla firefox (ubuntu)

Loading

teseseses

Par :Aerya
5 juillet 2025 à 11:01

Je navigue tout le temps sous VPN et il arrive que certains sites soient bloqués du fait de l’IP utilisée. C’est par exemple le cas de YouTube qui veut donc que je me connecte pour vérifier mon droit d’accès.
SmartProxy est un plugin Firefox (tous OS, Android), Chrome & Edge (…) qui permet d’ajouter des proxies personnels ou via liste et surtout de créer des règles d’utilisation.
Je le trouve plus simple (et « moderne ») que FoxyProxy que j’ai utilisé des années.

Loading

❌