Logiciel libre · auto-hébergé

Vos films et vos séries, prêts à regarder.

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.

GratuitAGPL-3.0Docker

Construit sur les services que vous utilisez déjà
  • Jellyfin
  • TMDB
  • Jellyseerr
  • Radarr
  • Sonarr
  • Bazarr
  • qBittorrent
  • Jackett

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.

  • Bannière plein écran, rangées d'affiches, recherche
  • Listes personnelles et demandes de titres
  • Lecture dans la page, mini-lecteur déplaçable
Adresse /gestion

Gestion

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.

Et des livres, aussi.

En option, une troisième catégorie à côté des films et des séries : les EPUB de vos bibliothèques Jellyfin, rangés par série, par auteur et par genre.

Un lecteur à votre goût

Pages ou défilement continu, taille du texte, police, interligne, marges, et quatre thèmes : clair, sépia, sombre et noir.

Votre lecture vous suit

Le livre rouvre à la bonne page sur tous vos appareils, et vos réglages sont gardés pour le téléphone, la tablette et l'ordinateur.

Signets, recherche et hors ligne

Marquez une page, cherchez un mot dans tout le livre, et téléchargez-le pour le lire sans réseau.

Les 16 fonctions des livres

Lumen

Le moteur de lecture de Laterna.

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.

PlaybackCoreorchestration : ouverture, sauts, pauses, reprises, reconstructions
serveur Fichier

Le fichier d'origine

  • MKV · MP4 · MOV
  • intact sur le disque
  • servi par plages HTTP
onglet StreamCore

Lecture des octets

  • blocs de 1 Mio, six en avance
  • début et fin du fichier en parallèle
  • réserve en mémoire, jusqu'à 5 min
onglet MuxCore

Remultiplexage

  • Matroska et MP4, une seule description
  • instants de décodage reconstruits
  • points d'accès vérifiés
  • MP4 fragmenté, fragments ≤ 1,2 Mo
onglet BufferCore

Tampons

  • MediaSource et ManagedMediaSource
  • budget compté en octets
  • taillé pour chaque moteur
appareil <video>

Lecteur natif

  • décodage matériel
  • HDR natif
  • horloge audio du système
CodecBridge

Compatibilité des codecs

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.

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.

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.

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.

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.

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.

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 exacte Reprise instantanée depuis l'appareil Chapitres Aperçus au survol de la barre Passer le générique Épisode suivant préparé Changement de langue à la même position Deux sous-titres à la fois Améliorer les dialogues Vitesse de lecture

Une interface conçue pour chaque écran.

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.

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.

Bibliothèques

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 version
    container_name: cine-app
    restart: 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:
    #   - proxy

    volumes:
      # 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:ro

    environment:
      - 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: 2g

    healthcheck:
      test: ["CMD", "wget", "-q", "-O", "/dev/null", "http://127.0.0.1:3000/api/ping"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 60s

volumes:
  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.

Le détail de chaque étape, Traefik, les permissions et le dépannage : QUICKSTART.md et DEPLOYMENT.md.

Bon à savoir

Laterna remplace-t-il Jellyfin ?

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.