Vue normale

Reçu aujourd’hui — 25 octobre 2025

PlaceholdARR : ne téléchargez que ce vous regardez

Par :Aerya
25 octobre 2025 à 06:36

Imaginez Plex ou Jellyfin, de belles bibliothèques, bien garnies. Le tout sans rien stocker ou presque. Parce que le média ne se télécharge que lorsqu’on lance sa lecture et sera supprimé de la bibliothèque sous X jours. Et ça peut aussi télécharger en avance X épisodes d’une série en cours de visionnage.

J’en ai franchement rêvé quand Google a mis fin à la fête du slip avec Workspace. TheIndieArmy est en train de le faire avec PlaceholdARR !
On ajoute un média à Radarr/Sonarr SANS Recherche/Téléchargement puis son outil le simule dans le lecteur lié avec affiche etc. Et le téléchargement ne démarre, avec les règles Radar/Sonarr, que lorsqu’on lance la lecture.
On ne doit donc absolument pas modifier une configuration existante, ça s’y intègre parfaitement. Ou alors ça la remplace, carrément.

Alors évidemment y’a rien de magique et je vois quelques points noirs, à tout le moins gris :
– ceux qui sont en ADSL 3.5MBps, « bon courage », allez au resto, vous aurez le film en rentrant avec un peu de bol si vous utilisez du téléchargement classique,
– si pour les contenus VO (EN/US) y’a quasi jamais de problème de sources BitTorrent, pour du MULTi/VF c’est plus compliqué selon le média (moins mainstream, vieux etc) et les indexeurs BitTorrent/Usenet auxquels chacun a accès,
– j’ai pas encore fini de tester (quand je rédige cette phrase) mais j’imagine qu’avec Usenet aux fesses, à fortiori en mode streaming ou un setup Decypharr/RDT, ça peut être très sympa, EDIT : je confirme, ça poutre !!!

– j’ai testé ça avec mon instance existante de Radarr et ça ajoute donc tous les médias « à venir » depuis le calendrier. Ce qui peut être problématique si on partage Plex/Jellyfin avec des bas du front qui cliquent tout le temps sur des films pas encore sortis bien que ça MàJ les noms en « Now You See Me – [Coming Soon (18 days)] »

Avant de détailler l’installation, voici un exemple de fonctionnement avec Radarr et Jellyfin.

Ajouter un film sur Radarr, sans recherche ni monitoring

placeholdarr1
placeholdarr2

PlaceholdARR le capte et le simule dans Jellyfin.

placeholdarr  | 2025-10-25 05:38:53,888 - handlers.py:65 - DEBUG - 🐛 Radarr payload: {'movie': {'id': 1714, 'title': 'The Kids Are All Right', 'year': 2010, 'releaseDate': '2010-10-07', 'folderPath': '/mnt/Bibliothèques/Films/The Kids Are All Right (2010) 39781 tt0842926', 'tmdbId': 39781, 'imdbId': 'tt0842926', 'overview': "Two women, Nic and Jules, brought a son and daughter into the world through artificial insemination. When one of their children reaches age, both kids go behind their mothers' backs to meet with the donor. Life becomes so much more interesting when the father, two mothers and children start to become attached to each other.", 'genres': ['Comedy', 'Drama'], 'images': [{'coverType': 'poster', 'url': '/MediaCover/1714/poster.jpg', 'remoteUrl': 'https://image.tmdb.org/t/p/original/xQ5XqZc82dDCcGjxY7voRKjhaKQ.jpg'}, {'coverType': 'fanart', 'url': '/MediaCover/1714/fanart.jpg', 'remoteUrl': 'https://image.tmdb.org/t/p/original/kokPRmOdEmWZi3SR1dcdvsiq9lF.jpg'}], 'tags': [], 'originalLanguage': {'id': 1, 'name': 'English'}}, 'addMethod': 'manual', 'eventType': 'MovieAdded', 'instanceName': 'Radarr', 'applicationUrl': ''}
placeholdarr  | 
placeholdarr  | 2025-10-25 05:38:53,888 - handlers.py:99 - DEBUG - 🐛 Quality determination: Standard
placeholdarr  | 
placeholdarr  | 2025-10-25 05:38:53,888 - handlers.py:105 - INFO - 🌐 Received webhook event: movieadded
placeholdarr  | 
placeholdarr  | 2025-10-25 05:38:53,889 - handlers.py:600 - DEBUG - 🐛 Delaying 3s before checking hasFile for movie 'The Kids Are All Right'
placeholdarr  | 
placeholdarr  | 2025-10-25 05:38:56,901 - integrations.py:149 - DEBUG - ➡ Copied dummy file as fallback: /mnt/Bibliothèques/Films/The Kids Are All Right (2010) 39781 tt0842926/The Kids Are All Right (2010) (dummy).mp4
placeholdarr  | 
placeholdarr  | 2025-10-25 05:38:56,901 - integrations.py:156 - DEBUG - ➡ Created dummy file: /mnt/Bibliothèques/Films/The Kids Are All Right (2010) 39781 tt0842926/The Kids Are All Right (2010) (dummy).mp4
placeholdarr  | 
placeholdarr  | 2025-10-25 05:38:56,912 - handlers.py:643 - INFO - ➡ Created placeholder file for movie 'The Kids Are All Right'
placeholdarr  | 
placeholdarr  | 2025-10-25 05:38:56,912 - jellyfin_client.py:35 - DEBUG - 🐛 Built Jellyfin URL: https://jelly.neaj.net/Library/Media/Updated
placeholdarr  | 
placeholdarr  | 2025-10-25 05:38:56,943 - jellyfin_client.py:58 - INFO - ➡ Triggered scan for: /mnt/Bibliothèques/Films/The Kids Are All Right (2010) 39781 tt0842926
placeholdarr3
placeholdarr4

Quand on interroge les détails du média

placeholdarr5

Et le dossier correspondant dans la bibliothèque (je demande la création d’un .nfo aux arrs pour simplifier mon setup)

root@StreamBox:/mnt/Bibliothèques/Films# ls -lsh 'The Kids Are All Right (2010) 39781 tt0842926'
total 836K
428K -rw-rw-rw- 1 root root 428K Oct 25 07:38  fanart.jpg
4.0K -rw-r--r-- 1 root root 2.0K Oct 25 07:40  movie.nfo
216K -rw-rw-rw- 1 root root 216K Oct 25 07:38  poster.jpg
184K -rw-r--r-- 1 root root 184K Oct 25 07:38 'The Kids Are All Right (2010) (dummy).mp4'
4.0K -rw-r--r-- 1 root root 1019 Oct 25 07:33 'The Kids Are All Right (2010) (dummy).nfo'

Donc là j’ai bien mon film de listé dans Jellyfin mais c’est un fake.

Quand je lance la lecture, PlaceholdARR donne l’information à Radarr de télécharger le fichier.

placeholdarr  | INFO:     192.168.64.1:54436 - "POST /webhook HTTP/1.1" 200 OK
placeholdarr  | 2025-10-25 05:55:22,387 - handlers.py:65 - DEBUG - 🐛 Tautulli payload: {'event': 'playback.start', 'ItemId': 'c085f366-14ab-3680-d28b-d2f6d0219d69', 'UserId': 'xxx', 'Name': 'Tout va bien ! The Kids Are All Right', 'ItemType': 'Movie', 'SeriesName': '', 'SeasonNumber': '', 'EpisodeNumber': '', 'Provider_tmdb': '39781', 'Provider_tvdb': '', 'Provider_imdb': 'tt0842926', 'Year': '2010', 'NotificationType': 'PlaybackStart'}
placeholdarr  | 
placeholdarr  | 2025-10-25 05:55:22,388 - jellyfin_client.py:35 - DEBUG - 🐛 Built Jellyfin URL: https://jelly.domain.tld/Users/xxx/Items/c085f366-14ab-3680-d28b-d2f6d0219d69
placeholdarr  | 
placeholdarr  | 2025-10-25 05:55:22,534 - handlers.py:99 - DEBUG - 🐛 Quality determination: Standard
placeholdarr  | 
placeholdarr  | 2025-10-25 05:55:22,534 - handlers.py:105 - INFO - 🌐 Received webhook event: playback.start
placeholdarr  | 
placeholdarr  | 2025-10-25 05:55:22,534 - jellyfin_client.py:35 - DEBUG - 🐛 Built Jellyfin URL: https://jelly.domain.tld/Users/xxx/Items/c085f366-14ab-3680-d28b-d2f6d0219d69
placeholdarr  | 
placeholdarr  | 2025-10-25 05:55:22,700 - handlers.py:744 - DEBUG - 🐛 Processing playback for file path: /mnt/Bibliothèques/Films/The Kids Are All Right (2010) 39781 tt0842926/The Kids Are All Right (2010) Bluray-1080p.mkv

C’est là que c’est extra rapide avec mon setup Decypharr/AllDebrid, ça peut l’être autant je pense avec le streaming Usenet mais je n’ai pas testé.
Avec BitTorrent normal ou Usenet, l’attente ne doit pas être très longue non plus, sous condition de sources actives.

Sous Jellyfin j’ai un bogue qui me met que le média est impossible à lire et je dois refraichir pour que ça fonctionne (pas encore testé Plex mais il semble que ce ne soit pas le cas). Je découvre encore le projet et ses options et je pense que mon setup est perfectible.

Quoi qu’il en soit, j’ai bien mon film et peux le lire

placeholdarr7
placeholdarr8

Et côté fichiers

root@StreamBox:/mnt/Bibliothèques/Films# ls -lsh 'The Kids Are All Right (2010) 39781 tt0842926'
total 856K
428K -rw-rw-rw- 1 root root 428K Oct 25 07:38  fanart.jpg
8.0K -rw-r--r-- 1 root root 6.8K Oct 25 07:53  movie.nfo
4.0K -rw-rw-rw- 1 root root  730 Oct 25 07:52  movie.xml
216K -rw-rw-rw- 1 root root 216K Oct 25 07:38  poster.jpg
4.0K lrwxrwxrwx 1 root root  148 Oct 25 07:52 'The Kids Are All Right (2010) Bluray-1080p.mkv' -> /mnt/decypharr/alldebrid/__all__/The.Kids.Are.All.Right.2010.MULTi.1080p.BluRay.x264-FHD/The.Kids.Are.All.Right.2010.MULTi.1080p.BluRay.x264-FHD.mkv
8.0K -rw-rw-rw- 1 root root 4.7K Oct 25 07:53 'The Kids Are All Right (2010) Bluray-1080p.nfo'
184K -rw-r--r-- 1 root root 184K Oct 25 07:38 'The Kids Are All Right (2010) (dummy).mp4'
4.0K -rw-r--r-- 1 root root 2.0K Oct 25 07:53 'The Kids Are All Right (2010) (dummy).nfo'

Le faux film reste en place pour quand le vrai, ici lié à mon installation de Decypharr, sera supprimé dans 10 jours (selon ma config).

Alors dans les faits, ça ne me change rien vu que je ne stocke déjà plus rien en passant par Decypharr. Seulement cette solution peut être très intéressante pour se jouer des limites de stockage de telle ou telle solution tout comme pour pleinement profiter d’un tracker BitTorrent ou d’un indexeur Usenet sans abuser du système à tout télécharger « pour rien » à l’instant T ou à ne quasi rien télécharger/seeder dans le cas de Decypharr/RDT and co.

Passons à l’installation. C’est un 1er retex, sans doute ajustable et le projet étant jeune et en pleine évolution. Il propose un compose et un .env. Ce qu’il faut retenir c’est qu’il faut des volumes en chemins absolus, comme pour tous les setup avec Decypharr etc.
Les explications des options du .env sont ici. Et les fichiers « dummy » sont à prendre aussi dans le code, chez moi ils sont dans /mnt/Bibliothèques/.


Voici mon exemple de configuration :

services:
  placeholdarr:
    image: ghcr.io/theindiearmy/placeholdarr:queue_monitoring-latest
    container_name: placeholdarr
    env_file:
      - .env
    volumes:
      # Update these paths to match your actual placeholder library locations and dummy files
      # Mount your movie placeholder folder (MOVIE_LIBRARY_FOLDER)
      # IMPORTANT: For Plex/Tautulli compatibility, mount the host path to the SAME absolute path inside the container.
      - /mnt/Bibliothèques/:/mnt/Bibliothèques/
      # Example: - /mnt/plex/Movies/placeholders:/mnt/plex/Movies/placeholders
      - /mnt/Bibliothèques/Films:/mnt/Bibliothèques/Films
      # Mount your TV placeholder folder (TV_LIBRARY_FOLDER)
      - /mnt/Bibliothèques/Séries:/mnt/Bibliothèques/Séries
      # Mount your standard dummy file
      - /mnt/Bibliothèques/dummy.mp4:/mnt/Bibliothèques/dummy.mp4
      # Mount your "coming soon" dummy file (optional)
      - /mnt/Bibliothèques/coming_soon_dummy.mp4:/mnt/Bibliothèques/coming_soon_dummy.mp4
      - /home/aerya/docker/placeholdarr/.env:/app/.env
    ports:
      - 8000:8000
    restart: always
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
    labels:
      - com.centurylinklabs.watchtower.enable=true

# Server Configuration
PLACEHOLDARR_HOST=0.0.0.0
PLACEHOLDARR_PORT=8000
PLACEHOLDARR_LOG_LEVEL=DEBUG # Options: DEBUG, INFO, WARNING, ERROR, CRITICAL

# Enable/Disable Media Servers
ENABLE_PLEX=false      # Set to true to enable Plex integration, false to disable
ENABLE_JELLYFIN=true   # Set to true to enable Jellyfin integration, false to disable
ENABLE_EMBY=false      # Set to true to enable Emby integration, false to disable

# Plex Configuration (required if ENABLE_PLEX=true)
PLEX_URL=
PLEX_TOKEN=
PLEX_MOVIE_SECTION_ID=1
PLEX_TV_SECTION_ID=2

# Jellyfin Configuration (required if ENABLE_JELLYFIN=true)
JELLYFIN_URL=https://jelly.domain.tld
JELLYFIN_TOKEN=fea9bxxx702e

# Emby Configuration (required if ENABLE_EMBY=true)
# Emby typically exposes its API under the /emby/ prefix (e.g., http://localhost:8096/emby)
EMBY_URL=
EMBY_TOKEN=

# Migration from Infinite To Placeholdarr
MIGRATION=False # Set to True to enable Migration

# Radarr Configuration
RADARR_URL=http://192.168.0.163:7878/api/v3
RADARR_API_KEY=faacxxx23a
RADARR_4K_URL=     # (optional - leave blank to disable 4K support)
RADARR_4K_API_KEY=

# Sonarr Configuration 
SONARR_URL=
SONARR_API_KEY=
SONARR_4K_URL=       # (optional - leave blank to disable 4K support)
SONARR_4K_API_KEY=

# Library Paths (IMPORTANT: See below for usage patterns)
MOVIE_LIBRARY_FOLDER=/mnt/Bibliothèques/Films      # Replace with your desired placeholder folder path on the host
TV_LIBRARY_FOLDER=/mnt/Bibliothèques/Séries            # Replace with your desired placeholder folder path on the host
MOVIE_LIBRARY_4K_FOLDER=                                     # Optional - replace or leave blank if not using 4K
TV_LIBRARY_4K_FOLDER=                                        # Optional - replace or leave blank if not using 4K

# Dummy file paths (replace with your dummy file locations on the host, matching your volume mounts)
DUMMY_FILE_PATH=/mnt/Bibliothèques/dummy.mp4
COMING_SOON_DUMMY_FILE_PATH=/mnt/Bibliothèques/coming_soon_dummy.mp4
PLACEHOLDER_STRATEGY=hardlink    # Options: hardlink, copy

# Queue Management
TV_PLAY_MODE=episode     # Options: episode, season, series
EPISODES_LOOKAHEAD=3     # Number of episodes to look ahead and download
MAX_MONITOR_TIME=120     # Maximum time to monitor for file in seconds
CHECK_INTERVAL=3         # How often to check queue status in seconds
TITLE_UPDATES=REQUEST        # Options: OFF, REQUEST, ALL (ALL is not recommended while feature is in development)
AVAILABLE_CLEANUP_DELAY=10

# Calendar-based status update settings
CALENDAR_LOOKAHEAD_DAYS=30           # How many days into the future to allow placeholders/"Coming Soon" (integer)
CALENDAR_SYNC_INTERVAL_HOURS=12      # How often to sync calendar and update statuses (hours, integer)
ENABLE_COMING_SOON_PLACEHOLDERS=true # Enable or disable "Coming Soon" placeholders (true/false)
PREFERRED_MOVIE_DATE_TYPE=inCinemas  # Which movie release date to use: inCinemas, digitalRelease, physicalRelease
ENABLE_COMING_SOON_COUNTDOWN=true    # Show countdown in "Coming Soon" status (true/false)
CALENDAR_PLACEHOLDER_MODE=episode    # Options: episode, season. 'episode' = add placeholders as each episode enters lookahead window; 'season' = add all known episodes of a season when any enters window

# Include Specials
INCLUDE_SPECIALS=false

# --- Advanced Webhook Check Options ---
# Set to 'true' to skip all webhook checks and force calendar sync to start (not recommended for most users)
PLACEHOLDARR_SKIP_WEBHOOK_CHECK=false

# Optionally override the webhook URL used for *arr webhook checks (useful for reverse proxies, custom domains, or remote networks)
# Example: PLACEHOLDARR_WEBHOOK_URL=https://my.public.domain/webhook
# Leave blank to use automatic detection
PLACEHOLDARR_WEBHOOK_URL=

Pour moi PlaceholdARR est vraiment une solution d’avenir si on appartient à une bonne communauté Usenet ou BitTorrent. Plus d’abus de DL inutile voire non seedé, plus d’abus de stockage sauf pour de rares exceptions (médias de niche).

Gros projet à suivre !!! Et dans la journée je testerai avec Plex.

Loading

❌