Aller au contenu

Lire une vidéo

Objectif : servir une vidéo en streaming HTTP, sans écrire de code métier.

Ce que vous allez apprendre : register_video_routes(router).
Une seule ligne branche la route de lecture officielle GET /videos/{uuid}, qui sert le fichier en streaming HTTP avec support des requêtes Range (un lecteur peut se positionner dans la vidéo).
Le code vit dans le paquet forge-mvc-video ; votre application ne fait que le brancher : principe « lock + delegate ».

Palier 2 du niveau intermédiaire de la progression vidéo, après Téléverser une vidéo.

Ce que ce starter montre

  • le branchement de la lecture officielle avec register_video_routes(router) ;
  • la route GET /videos/{uuid} en streaming Range ;
  • aucun contrôleur à écrire : on délègue au paquet.

Aucun contrôleur à créer ici : la lecture vient entièrement du paquet forge-mvc-video, branché par register_video_routes.
La table videos est garantie par la migration fournie plus bas.

Classes Forge utilisées

Classe / fonction Rôle dans ce starter Référence
forge_mvc_video.register_video_routes Brancher la route de lecture officielle sur le routeur. Parcours vidéo

Tester

forge db:init
forge run

Après avoir téléversé une vidéo (palier précédent), ouvrez son URL de lecture avec son UUID :

https://localhost:8000/videos/<uuid>

Le fichier est servi en streaming ; un lecteur vidéo peut se positionner grâce au support des requêtes Range.

La route

Branchez la route de lecture officielle dans mvc/routes/__init__.py.
Le code métier vit dans le paquet forge-mvc-video ; on ne fait que le brancher.

# mvc/routes/__init__.py
from forge_mvc_video import register_video_routes

register_video_routes(router)

Comprendre ce code

  • register_video_routes(router) enregistre la route officielle d'un coup.
    Vous n'écrivez aucun contrôleur : le code métier appartient au paquet, l'application le branche explicitement (pas de découverte automatique, principe « refuser la magie cachée »).
  • La lecture gère le streaming Range : indispensable pour qu'un lecteur vidéo charge progressivement et se positionne sans tout télécharger.
  • La route sert le fichier référencé par la ligne videos : l'UUID, jamais le nom de fichier d'origine.

La migration

La route de lecture sert les fichiers référencés par la table videos.
Créez donc cette table si elle n'existe pas déjà.
CREATE TABLE IF NOT EXISTS reste sûr même si le palier upload l'a déjà créée.

-- mvc/migrations/20260601210000_create_videos.sql
CREATE TABLE IF NOT EXISTS videos (
    id               BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    uuid             CHAR(36)        NOT NULL,
    title            VARCHAR(255)    NULL,
    original_path    VARCHAR(500)    NOT NULL,
    mp4_path         VARCHAR(500)    NULL,
    poster_path      VARCHAR(500)    NULL,
    mime_type        VARCHAR(120)    NULL,
    size_bytes       BIGINT UNSIGNED NOT NULL,
    duration_seconds INT UNSIGNED    NULL,
    width            INT UNSIGNED    NULL,
    height           INT UNSIGNED    NULL,
    status           VARCHAR(30)     NOT NULL,
    error_message    TEXT            NULL,
    created_at       DATETIME(6)     NOT NULL,
    updated_at       DATETIME(6)     NOT NULL,
    PRIMARY KEY (id),
    UNIQUE KEY uq_videos_uuid (uuid),
    INDEX idx_videos_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

À retenir

  • register_video_routes(router) branche la lecture officielle en une ligne.
  • Le streaming Range permet de se positionner dans la vidéo.
  • L'application délègue au paquet au lieu de réécrire le service de fichiers.

Après ce starter

Vous savez servir une vidéo.
La suite : suivre son cycle de vie.

Suivre l'état d'une vidéo