FR

Pourquoi nos liens vidéo expirent

Pourquoi nos liens avec date d’expiration sont un choix produit : confidentialité, coûts stables, livraison plutôt qu’hébergement. Compromis, objections et code.

Nicolas Ricardi8 min de lecture

En bref

  • Nous avons décidé tôt qu’un lien JustRec livre une vidéo, il ne l’héberge pas. Les liens expirent donc : 3 jours avec Lifetime, 30 jours avec Personal et Team.
  • Les liens qui expirent ne gardent les données des clients en ligne que le temps nécessaire, maintiennent nos coûts de stockage stables et nous empêchent de devenir une plateforme vidéo.
  • Le serveur refuse un lien expiré à la seconde même où il expire, et une tâche horaire supprime la vidéo, les sous-titres et la miniature du stockage.
  • Les compromis sont réels : pas de liens permanents, un repartage de temps en temps, et une phrase sur la page pour expliquer ce qui s’est passé.

Nos liens vidéo expirent parce que nous avons décidé tôt que JustRec livre des vidéos, il ne les héberge pas. Un lien existe pour que votre client regarde une présentation cette semaine, et une fois ce travail fait, le garder en ligne n’ajoute que des risques et des coûts. Les liens qui expirent figuraient dans notre document produit avant que nous écrivions une seule ligne de code serveur.

Nous avons expliqué le côté utilisateur, et comment travailler avec des liens qui expirent, dans pourquoi des liens vidéo qui expirent sont plus sûrs qu’une bibliothèque permanente. Voici l’autre côté : pourquoi nous l’avons choisi, ce que cela nous a coûté, et comment ça fonctionne sous le capot.

Livrer, pas héberger

La plupart des outils vidéo professionnels sont construits autour d’une bibliothèque dans le cloud. Vos vidéos y vivent, les liens pointent vers elle, et le produit grandit en ajoutant des choses à la bibliothèque : dossiers, recherche, compteurs de vues, commentaires, intégrations.

Pensez à ce que les agences et les freelances envoient à leurs clients : la version 2 d’une page d’accueil, un bug dans une page de paiement, deux minutes sur un devis. Ces vidéos ont un destinataire et une échéance. Le client regarde, répond, et la version suivante remplace l’ancienne. Personne ne revient sur la version 2 de la page d’accueil au mois de mars.

Nous avons donc pensé JustRec comme un outil de livraison. L’enregistrement, la bibliothèque et l’historique vivent sur votre Mac. Le serveur garde une copie le temps de la livraison, puis la laisse partir. Toutes les autres décisions découlent de celle-ci.

Trois raisons d’avoir choisi des liens qui expirent

Les clients de nos utilisateurs n’ont pas signé pour une archive vidéo

Un enregistrement d’écran de travail client montre souvent des données client : une interface d’administration, le nom d’un client final, un tableau de bord. Le principe de limitation de la conservation du RGPD prévoit que les données personnelles ne soient pas conservées plus longtemps que nécessaire au regard des finalités du traitement. Un lien permanent les garde en ligne indéfiniment, sur des serveurs que ni vous ni votre client n’avez choisis. Un lien qui expire fait de « pas plus longtemps que nécessaire » un réglage par défaut plutôt qu’une corvée. L’article RGPD et vidéos clients explique qui est responsable de quoi.

Des coûts qui restent stables

Avec une bibliothèque permanente, chaque utilisateur coûte chaque mois plus cher que le mois précédent, indéfiniment. Avec des liens qui expirent, un utilisateur qui partage autant chaque mois coûte la même chose chaque mois. Nous avons fait le calcul complet dans Cloudflare R2 : combien coûte l’hébergement des vidéos clients : un utilisateur très actif avec des liens de 30 jours se stabilise autour de 5 Go de stockage, alors que le même utilisateur avec une bibliothèque permanente dépasse 60 Go au bout d’un an et continue de grimper.

C’est aussi ce qui nous permet tout simplement de vendre une licence Lifetime. Un paiement unique ne peut pas financer un stockage qui grandit pendant des années. Il peut financer des liens de 3 jours.

Rester concentrés

Si les liens ne vivent pas éternellement, toute une catégorie de fonctionnalités perd son sens : dossiers dans le cloud, recherche dans le cloud, statistiques de vues, intégrations pour sites web. Nous n’avons pas à les construire, à les sécuriser ni à les faire payer. JustRec ne garde pas de bibliothèque dans le cloud, et c’est voulu.

Pourquoi 3 jours et 30 jours

Les deux durées suivent les offres :

Durée d’un lien selon l’offre
Offre Durée du lien Durée max. d’une vidéo Pourquoi
Lifetime 3 jours 10 min Assez pour les retours, les revues et les signalements de bugs ; un prix unique peut le financer
Personal, Team 30 jours 30 min Couvre les livraisons, les formations et les devis que le client revoit avant de décider

Les offres et les limites peuvent changer avant le lancement.

Trois jours suffisent pour la plupart des vidéos de revue : le client regarde le jour même ou le lendemain. Trente jours couvrent les vidéos auxquelles on revient pendant qu’on apprend un nouveau CMS ou qu’on réfléchit à une proposition. Au-delà d’un mois, une vidéo devient de la documentation de référence, et la documentation de référence mérite un vrai lieu.

Comment fonctionne l’expiration sur notre serveur

Le serveur est un Cloudflare Worker avec Hono. Les vidéos, les sous-titres et les miniatures vivent dans un bucket R2 limité à l’UE ; les métadonnées vivent dans D1, également dans l’UE. L’expiration repose sur deux mécanismes distincts, volontairement.

  1. Fin de l’envoi

    Le compte à rebours démarre

    Le serveur enregistre l’heure d’expiration : dans 3 jours ou dans 30 jours, selon l’offre.

  2. Jusqu’à l’expiration

    Le lien fonctionne

    Chaque requête pour la page, la vidéo, les sous-titres ou la miniature vérifie d’abord l’heure d’expiration.

  3. À la seconde de l’expiration

    410 Gone

    La page indique que le lien a expiré et à qui en demander un nouveau.

  4. Dans l’heure

    Fichiers supprimés

    Une tâche horaire supprime la vidéo, les sous-titres et la miniature de R2.

1. Le lien s’arrête à la seconde près. Quand un envoi se termine, le serveur fixe expires_at à l’heure actuelle plus la durée de vie du lien. Chaque requête pour la page, la vidéo, les sous-titres ou la miniature le vérifie d’abord :

async function liveVideo(env: Env, id: string) {
  const row = await env.DB.prepare("SELECT * FROM videos WHERE id = ?").bind(id).first();
  const live = !!row && row.status === "ready" && (row.expires_at ?? 0) > now();
  return { row, live };
}

Si le lien n’est plus actif, la page répond avec le statut HTTP 410 Gone, indique que le lien a expiré ou a été retiré, et invite le spectateur à le redemander à l’expéditeur, nommé. Le 410 est le statut qui signifie que la ressource a existé et a été retirée volontairement, ce qui est exactement le cas.

2. Les fichiers sont supprimés dans l’heure. Un Cron Trigger lance le Worker toutes les heures, à la minute 17. Il trouve chaque vidéo dont l’échéance est passée, supprime les trois objets de R2 et marque la ligne comme expirée :

async function cleanUp(env: Env) {
  const expired = await env.DB.prepare(
    "SELECT id FROM videos WHERE status = 'ready' AND expires_at <= ?",
  ).bind(now()).all<{ id: string }>();
  for (const { id } of expired.results) {
    await env.VIDEOS.delete([`videos/${id}.mp4`, `videos/${id}.vtt`, `videos/${id}.jpg`]);
    await env.DB.prepare("UPDATE videos SET status = 'expired' WHERE id = ?").bind(id).run();
  }
  // …puis abandon des envois commencés il y a plus de 24 heures et jamais terminés
}

Retirer un lien depuis l’app évite l’attente : le serveur supprime immédiatement les fichiers et marque la ligne comme révoquée. Les envois jamais terminés sont abandonnés au bout de 24 heures : les vidéos à moitié envoyées ne restent pas non plus dans le stockage.

Ce qui reste, et pourquoi

Nous voulons être précis sur ce que « supprimé » veut dire :

  • Supprimés de R2 : la vidéo, le fichier de sous-titres et la miniature.
  • Conservée dans D1 : la ligne avec l’identifiant de la vidéo, son titre, le nom de l’expéditeur, la taille, la durée, les dates et le statut. C’est ce qui permet à la page d’expiration de dire à votre client de qui venait la vidéo et à qui la redemander.
  • Conservés sur votre Mac : la vidéo d’origine et ses sous-titres, intacts.
  • Dans le navigateur du spectateur : la réponse vidéo autorise le navigateur à la garder en cache privé pendant 10 minutes : un onglet qui en a déjà chargé une partie peut donc lire cette partie brièvement après l’expiration.

Pourquoi pas les règles de cycle de vie de R2 ?

R2 peut faire expirer des objets tout seul avec des règles de cycle de vie, selon leur âge et leur préfixe. Nous ne les avons pas utilisées pour les liens parce qu’elles se basent sur l’âge des objets, s’appliquent règle par règle et non vidéo par vidéo, et que les objets sont en général supprimés dans les 24 heures suivant leur expiration. Il nous faut un lien qui s’arrête à une heure exacte, des durées de vie différentes selon l’offre, et une suppression immédiate quand quelqu’un retire un lien. Une requête sur D1 et une tâche horaire font tout cela en une vingtaine de lignes.

Les objections, et nos réponses

Nous les attendons, et certaines sont justes :

Les objections aux liens qui expirent
Objection Notre réponse Ce que nous acceptons
« Mon client ouvre le lien en retard. » La page lui dit à qui s’adresser, et repartager prend un clic depuis votre bibliothèque. Un repartage de temps en temps.
« Il me faut un lien durable pour du contenu de formation. » Utilisez une plateforme vidéo, un centre d’aide ou votre propre site pour les vidéos qui doivent durer. JustRec n’est pas le bon outil pour celles-là.
« Pourquoi ne puis-je pas choisir “jamais” ? » Nous deviendrions alors un hébergeur, avec une facture qui grossit et des années de données client en ligne. Certains choisiront un autre outil.
« Trois jours, c’est court. » Ça convient aux tours de revue et aux signalements de bugs, et ça rend le prix Lifetime possible. Personal et Team ont 30 jours. Les utilisateurs Lifetime qui envoient des vidéos de livraison repartageront plus souvent.

Ce à quoi nous avons renoncé

Être un outil de livraison a un coût. Il n’y a pas de liens permanents à coller dans un site web. Il n’y a pas de compteur de vues, parce que nous ne suivons pas non plus les spectateurs. Certains clients verront une page d’expiration, et quelques-uns seront agacés. Nous pensons que ce sont les bons compromis pour des vidéos qui sont, au fond, des conversations. Si vous avez besoin de l’inverse, une bibliothèque permanente avec des statistiques, il existe de bons outils pour cela, et notre page sur l’alternative à Loom compare les deux approches.

L’idée derrière tout cela, c’est que vos vidéos vous appartiennent et doivent vivre sur votre machine. Nous l’avons développée dans enregistrement local-first : pourquoi garder vos vidéos sur votre Mac.

Questions fréquentes

Pourquoi les liens JustRec expirent-ils ?

Parce qu’une vidéo client est un message, pas une archive. Les liens qui expirent ne gardent la copie en ligne que tant que le client en a besoin, ce qui protège ses données, rend les coûts prévisibles et permet de garder un prix bas.

Combien de temps durent les liens JustRec ?

3 jours avec l’offre Lifetime, 30 jours avec Personal et Team. Vous pouvez retirer un lien plus tôt à tout moment, et la vidéo d’origine reste sur votre Mac.

Que voit mon client quand un lien a expiré ?

Une page qui indique que le lien a expiré ou a été retiré, avec le nom de l’expéditeur et une invitation à lui demander de le renvoyer. La vidéo, les sous-titres et la miniature ne sont plus sur le serveur.

Peut-on créer un lien qui n’expire jamais ?

Non. Pour les vidéos qui doivent rester en ligne pendant des mois, comme des tutoriels publics ou des bibliothèques de formation, une plateforme vidéo ou votre propre site sont plus adaptés. JustRec est conçu pour des vidéos qui font leur travail en quelques jours.

En combien de temps une vidéo est-elle supprimée après l’expiration de son lien ?

Le lien cesse de fonctionner à l’heure d’expiration. Les fichiers sont supprimés du stockage par une tâche de nettoyage qui tourne toutes les heures : ils disparaissent donc dans l’heure environ qui suit l’expiration.

Écrit par

Nicolas Ricardi

Maker of JustRec, at Nube

Nicolas makes JustRec at Nube, a web studio in Italy. He built it for the videos Nube sends to its own clients: design reviews, handovers and quotes explained in a few minutes instead of a meeting.

www.wearenube.dev
En coulisses