Laterna transforme votre serveur Jellyfin en une vraie salle de cinéma pour toute la maison : une interface soignée pour regarder, une console pour administrer, dans un seul conteneur.
Une salle pour regarder. Une régie pour administrer.
La même application, la même session, les mêmes services derrière. Chacun ne voit que ce qui le concerne.
Adresse /
Cinéma
L'écran sur lequel tout le monde arrive. Chaque titre est une affiche, et tout ce qu'on peut en faire part de cette affiche : lire, reprendre, ajouter à sa liste, demander.
Tous vos services réunis dans une seule console, avec le même design que le cinéma.
Téléchargements, état des services, stockage
Bibliothèques Radarr et Sonarr, calendrier, statistiques
Connexions et réglages faits dans l'application
Deux rôles seulement : administrateur et utilisateur. Un utilisateur parcourt, regarde, tient ses listes et fait ses demandes ; les modifications des services sont réservées à l'administrateur et vérifiées par le serveur.
Choisir, appuyer, regarder.
Des affiches, une bannière, et le film démarre en un geste, sur l'ordinateur comme sur le téléphone.
Un accueil qui se compose seul
Reprendre, Ma liste, le Top 10 du jour, les ajouts récents, une rangée par genre et des recommandations.
Une seule recherche
La bibliothèque, TMDB et les personnes en même temps, triés ensuite. Les requêtes en langage naturel fonctionnent.
« thriller des années 90 »
Ma liste
À voir, Demandes et Vus. Les demandes se suivent en direct, et un film terminé sur le téléviseur apparaît aussitôt comme vu.
Demander ce qui manque
Un titre absent de la bibliothèque se demande depuis sa fiche, avec le compte Jellyseerr de chacun. Pour une série, on choisit les saisons.
Hors ligne bêta
Un film, un épisode ou une saison entière se télécharge pour le train ou l'avion. Il se lit hors connexion, et la position se synchronise au retour du réseau.
Sur le grand écran
Chromecast et AirPlay. L'accueil se pilote entièrement aux flèches du clavier, ce qui le rend utilisable à la télécommande.
Une app sur l'écran d'accueil
Laterna s'installe sur l'écran d'accueil et envoie des notifications, y compris sur iPhone et iPad.
Sous-titres générés
En option : quand un titre n'a de sous-titres que dans une langue, un modèle en ligne les traduit pendant la lecture. Budget mensuel et limite quotidienne par compte.
Quatre langues
Français, anglais, espagnol et allemand. Les préférences audio et sous-titres sont celles de Jellyfin, partagées avec ses autres applications.
Lumen lit le fichier tel qu'il est sur le disque, le remet en forme dans l'onglet et le confie à la puce vidéo de l'appareil. 4K, HDR10, Dolby Vision et son multicanal compris.
0pixel réencodé sur le chemin natif. L'image du fichier arrive à l'écran bit pour bit.
15-56mspour remettre en forme un groupe d'images, quand le télécharger en prend environ 2 500.
5décodeurs audio compilés en WebAssembly, chargés seulement quand un film en a besoin.
7 000+tests automatisés, et des bancs de mesure qui passent de vrais fichiers au crible.
01Architecture
Sept briques, un seul chemin.
Du disque du serveur à la puce vidéo, chaque étape a sa brique. Les octets voyagent, les pixels restent intacts.
Avant chaque film, Lumen interroge le navigateur : ce format, cet encodeur, ce profil Dolby Vision. Sa réponse décide du chemin.
AudioCore
Décodage audio
Piste acceptée : copiée bit pour bit
Sinon : décodée en WebAssembly, puis réencodée en AAC ou Opus par le navigateur, canaux à leur place
PlaybackBridge
Repli de lecture
Format hors de portée ou connexion trop lente : Jellyfin prend le relais en HLS, à la même seconde, avec la même piste.
02Formats
Tout ce que Lumen lit.
Lumen reconnaît le format sur les octets du fichier. Selon l'appareil, chaque piste est copiée telle quelle ou décodée dans l'onglet, et le lecteur de Jellyfin prend le reste.
Vidéo
HEVCH.265 · 8 et 10 bits · jusqu'en 4K
AV18 et 10 bits
H.264AVC · partout
HDR
Dolby Visionprofils 5 et 8 · natif quand l'appareil l'accepte
HDR10natif sur écran HDR
HDR10+lu en HDR10, métadonnées transmises
Audio
Dolby Atmosdans le Dolby Digital Plus, transmis intact sur Safari
Dolby TrueHDdécodé · 7.1WASM
DTS-HDMaster Audio · HRWASM
DTSle cœur DTSWASM
DTS ExpressDTS-HD LBRWASM
Dolby Digital PlusE-AC-3copié ou WASM
Dolby DigitalAC-3copié ou WASM
FLAC16 et 24 bitscopié ou WASM
AACjusqu'au 7.1copié
Opusmono à multicanalcopié
MLPsans perteWASM
5.1 · 7.1chaque canal restitué à sa place, dans l'ordre qu'attend l'appareil
10 familles audiocopiées telles quelles ou décodées sur l'appareil, sans passer par le serveur
Conteneurs et sous-titres
MKVMatroska
MP4 · MOVpar la même chaîne
SRTtaille et position réglables
Texte MP4les sous-titres du MP4
ASS · SSAle texte
Externesfichiers à côté du film
Deux à la foisun second sous-titre au-dessus du principal, chacun son décalage
Généréstraduits pendant le film, à partir d'un sous-titre completoption
Forcésreconnus d'office
PGS · VobSubincrustés par le serveur en diffusion Chromecastserveur
Lus par Jellyfin
Tout le restele lecteur serveur de Jellyfin prend le relais, à la même seconde et avec la même piste
VP9vidéoserveur
VP8vidéoserveur
MPEG-2vidéoserveur
MPEG-4 ASPanciens .aviserveur
AVIconteneurserveur
MP4 fragmentéconteneurserveur
MP3audioserveur
MP2audioserveur
Vorbisaudioserveur
PCMaudio non compresséserveur
copié transmis tel quel au navigateurWASM décodé dans l'onglet, puis réencodé en AAC ou Opusserveur lu par le lecteur serveur de Jellyfin
03Ingénierie
Le détail qui fait la différence.
stockageIPBbb
affichage04213
décodage01234
Les instants de décodage, reconstruits
Matroska ne stocke que l'instant d'affichage, MP4 exige aussi celui du décodage. Lumen trie les instants d'affichage de chaque groupe d'images et les redistribue dans l'ordre de décodage : la chronologie exacte, pour toute profondeur de réordonnancement.
IDRCRABLATRAIL_R
14 des 193 images clés annoncées par un vrai fichier n'en étaient pas.
Les points d'accès, vérifiés
Avant de démarrer ou de sauter, Lumen lit la première unité NAL de l'image : seuls IDR, CRA et BLA ouvrent un segment. Si le point trouvé tombe trop loin, il recule dans l'index, 12 secondes à la fois.
télécharger un groupe≈ 2 500 ms
le remettre en forme15-56 ms
Le réseau donne le tempo
Le calcul est presque gratuit, alors Lumen soigne ses requêtes : lecture anticipée de six blocs, blocs d'une même lecture demandés ensemble, en-tête et index du fichier lus en parallèle dès l'ouverture, lectures devenues inutiles abandonnées à chaque saut.
standardLRCLFELsRs
AAC AppleCLRLsRsLFE
Chaque canal à sa place
Chaque système range ses canaux dans un ordre différent. Lumen remet les canaux dans l'ordre qu'attend l'encodeur de l'appareil : dialogues au centre, effets à l'arrière, un ordre vérifié système par système.
iPhone · iPad105 Mo
Chromium · Firefox150 Mio
Mac · Safari304 Mo
Une mémoire taillée pour chaque moteur
Safari limite chaque tampon vidéo en octets, soit une trentaine de secondes de 4K sur iPad. Lumen compte donc son remplissage en octets réellement envoyés et libère lui-même la mémoire derrière la tête de lecture.
0,01dBTrueHD
0,05dBFLAC
Des décodeurs comparés à FFmpeg
Les décodeurs embarqués ont été confrontés à FFmpeg canal par canal, sur de vrais fichiers. L'écart maximal mesuré tient en un centième de décibel pour le TrueHD.
Un filet de sécurité
Pour un fichier hors de portée du navigateur, Lumen passe la main à Jellyfin, qui choisit entre lecture directe et transcodage. Un panneau affiche le chemin pris et sa raison. Ce repli se désactive d'un réglage.
Connexion lente, lecture continue
Lumen compare le débit reçu à celui du film. Quand le lien ne suit plus, une version allégée est préparée en arrière-plan, et le lecteur y bascule à la même seconde, avec la même langue et les mêmes sous-titres.
Les bandes noires, en moins
Le serveur mesure la vraie image sur les vignettes de prévisualisation, sans décoder la vidéo, puis le lecteur agrandit le film jusqu'au bord de l'écran. Seul le noir est rogné.
Reprise exacteReprise instantanée depuis l'appareilChapitresAperçus au survol de la barrePasser le génériqueÉpisode suivant préparéChangement de langue à la même positionDeux sous-titres à la foisAméliorer les dialoguesVitesse de lecture
L'ordinateur et le téléphone ont chacun leur interface, avec la même navigation.
Sur grand écran
Un rail à gauche qui s'ouvre au survol, une bannière qui suit le titre sur lequel on se pose, une grille pilotable au clavier.
Sur téléphone
Une barre en bas, un carrousel d'affiches, des fiches qui se ferment d'un glissement et un retour haptique sur Android.
Le bouton Retour remonte d'un écran
Chaque écran ouvert est inscrit dans l'adresse : le Retour du navigateur ou le glissement depuis le bord ramène à l'écran précédent, et une fiche se partage par son lien.
Lecture+ Ma liste
ReprendreDepuis le début
Toute l'installation, d'un seul coup d'œil.
Ce qui tourne, ce qui arrive, ce qui coince : le tableau de bord de l'administrateur.
Les vues Radarr et Sonarr en grille ou en liste, filtres, tri par note, recherche de sorties et ajout de séries sans quitter l'application.
Activité et santé
Comptes actifs, séances en cours, erreurs de la semaine, imports récents, et une page d'état qui donne l'erreur renvoyée par le service lui-même.
Réglé dans l'application
Connexions aux services, lecture, sous-titres générés et valeurs par défaut des nouveaux comptes : tout se règle ici, sans fichier à éditer.
Votre serveur, vos comptes, vos règles.
Laterna tourne entièrement sur votre machine, avec les comptes Jellyfin de votre foyer.
Auto-hébergé
Un conteneur Docker et un volume pour ses données.
Les comptes Jellyfin
On se connecte avec son compte Jellyfin. Chaque connexion est un appareil que l'on peut révoquer.
Discret
Un visiteur non connecté voit seulement s'il peut se connecter et regarder. Le détail des services est réservé aux comptes.
Libre
Le code est public, sous licence AGPL-3.0. Vous pouvez le lire, le modifier et le redistribuer.
D'un dossier vide à votre cinéma en dix minutes.
Un fichier compose et votre navigateur suffisent : les secrets sont générés au premier lancement, et chaque réglage se fait dans l'assistant.
Le fichier compose
Créez un dossier vide et enregistrez ce fichier sous docker-compose.yml. Tel quel, il fonctionne : l'application répond sur le port 3000 du serveur, et ses données vivent dans un volume nommé.
docker-compose.yml
# Laterna - déploiement minimal# Aucun .env : les secrets sont générés au premier lancement,# et chaque réglage se fait dans l'assistant de configuration.services:
cine-app:
image: ghcr.io/lk59/cine-app:latest# ou :<sha> pour figer une versioncontainer_name: cine-apprestart: unless-stopped# Accessible depuis le serveur seulement (http://localhost:3000).# Derrière un proxy sur le même réseau Docker, retirez ces deux lignes.ports:
- "127.0.0.1:3000:3000"# Le réseau Docker de votre proxy inverse (et de Jellyfin, idéalement).# networks:# - proxyvolumes:
# Base de données, réglages, secrets et journaux : tout l'état de l'app.
- cine-data:/app/data# Optionnel, en lecture seule : vos médias, pour les statistiques.# - /chemin/vers/medias:/mnt/media/video:roenvironment:
- TZ=Europe/Paris# Derrière un proxy HTTPS (étape 3) :# - COOKIE_SECURE=true# - TRUSTED_PROXIES=nginx-proxy-manager# Optionnel : un plafond mémoire.# mem_limit: 2ghealthcheck:
test: ["CMD", "wget", "-q", "-O", "/dev/null", "http://127.0.0.1:3000/api/ping"]
interval: 30stimeout: 5sretries: 3start_period: 60svolumes:
cine-data:
name: cine-app-data# nom fixe, utilisé par les sauvegardes# networks:# proxy:# external: true # le nom donné par `docker network ls`
Pour garder les données dans un dossier ./data à côté du fichier, remplacez la ligne du volume par - ./data:/app/data et créez le dossier avant : mkdir data && sudo chown 1001:1001 data.
Démarrer et vérifier
Au bout d'une minute environ, le conteneur passe à « healthy ».
Sur une nouvelle installation, les journaux affichent un code d'installation à usage unique. L'assistant le demande pour créer le compte administrateur : seule une personne qui a accès au serveur peut le lire.
Si le conteneur s'arrête, sa dernière ligne de journal en donne la raison. Le cas le plus courant est un dossier ./data qui appartient à root : sudo chown -R 1001:1001 data.
Derrière un proxy inverse
HTTPS active l'installation sur l'écran d'accueil, les notifications et toutes les fonctions du lecteur. Choisissez votre proxy :
Hosts → Proxy Hosts → Add Proxy HostOnglet Details : votre nom de domaine, scheme http, forward hostname cine-app, port 3000.
Onglet SSLDemandez un certificat Let's Encrypt, puis cochez Force SSL et HTTP/2 Support.
Onglet AdvancedCollez ces deux lignes. La première garde la navigation fluide entre les pages, la seconde accepte les captures jointes aux signalements.
Dans le compose, rattachez l'application au réseau du proxy (les blocs networks), retirez ports, puis décommentez ces deux lignes avec le nom du conteneur de votre proxy :
docker-compose.yml
- COOKIE_SECURE=true
- TRUSTED_PROXIES=nginx-proxy-manager# ou caddy, traefik…
Relancez avec docker compose up -d. Laissez ces deux lignes commentées tant que vous testez en http://.
L'assistant de configuration
Ouvrez votre adresse : l'assistant s'affiche jusqu'à la fin de la configuration. Chaque écran s'enregistre quand vous appuyez sur Suivant, et teste le service que vous venez de renseigner.
Bienvenuela langue de l'installation
Comptele code d'installation, puis l'administrateur local
Jellyfinadresse et clé d'API, vues depuis le conteneur
Déploiementles options du compose, avec la ligne à copier
Terminerle récapitulatif de ce qui est disponible
Les adresses sont vues depuis le conteneur : utilisez le nom du conteneur (http://jellyfin:8096) sur un réseau Docker partagé, ou l'adresse du serveur sur le réseau local.
Et ensuite
Les spectateurs se connectent avec leur compte Jellyfin, et les administrateurs Jellyfin sont administrateurs de Laterna.
Les migrations s'appliquent au démarrage, et les onglets ouverts passent à la nouvelle version entre deux lectures. Gardez config/secrets.json dans chaque sauvegarde.
Non, il s'appuie dessus. Jellyfin reste le serveur qui connaît vos fichiers, vos comptes et l'état de lecture ; Laterna en est l'interface. Ce que vous marquez comme vu, vos préférences de langue ou vos positions de lecture se retrouvent dans les autres applications Jellyfin.
Faut-il Radarr, Sonarr et les autres ?
Non. Avec Jellyfin et TMDB seuls, le cinéma affiche toute votre bibliothèque. Radarr et Sonarr ajoutent la gestion, Jellyseerr les demandes, qBittorrent la progression des téléchargements.
Mon serveur va-t-il transcoder en permanence ?
Non. Sur le chemin natif, l'appareil décode et le serveur sert le fichier. Le transcodage n'intervient que si un fichier ne peut vraiment pas être lu par le navigateur ou si la connexion est trop lente, et ce repli peut être désactivé.
Sur quels appareils fonctionne-t-il ?
Tout navigateur récent : ordinateur, tablette, téléphone. Sur iPhone, iPad et Android, Laterna s'installe sur l'écran d'accueil comme une application. Pour le téléviseur : Chromecast, AirPlay, ou le navigateur de la TV au clavier ou à la télécommande.
Quelque chose quitte-t-il mon serveur ?
Les métadonnées sont demandées à TMDB, comme le fait Jellyfin. Les sous-titres générés, s'ils sont activés, envoient le texte des sous-titres au fournisseur choisi par l'administrateur. Vos vidéos restent sur votre serveur.
Est-ce vraiment gratuit ?
Oui. Laterna est un logiciel libre sous licence GNU AGPL-3.0, gratuit dans son intégralité.
Allumez la lanterne.
Laterna doit son nom à la lanterne magique, l'ancêtre du cinéma. Installez-le en quelques minutes sur votre serveur.