. Après avoir traité tous les clips, j'ai voulu organiser leur visionnage en ligne aussi pratique que sur YouTube. Comme il s'agit de souvenirs de famille personnels, ils ne peuvent pas être publiés sur YouTube lui-même. Nous avons besoin d'un hébergement plus privé, à la fois pratique et sécurisé.
Étape 3. Publier
ClipBucket, un clone YouTube open source que vous pouvez installer sur votre propre serveur
Tout d'abord j'ai essayé , qui s'appelle un clone YouTube open source que vous pouvez installer sur votre serveur.

Étonnamment, ClipBucket n'a aucune instruction d'installation. Grâce à я par , un outil de gestion de configuration de serveur.
Une partie de la difficulté était que les scripts d'installation de ClipBucket étaient complètement cassés. A cette époque je et selon les termes du contrat n'avait pas le droit de contribuer au clone open source de YouTube, mais je à partir de laquelle il était facile d'apporter les corrections nécessaires. Les mois ont passé et ils ne comprenaient toujours pas quel était le problème. Au lieu de cela, ils ont tout ajouté plus bogues dans chaque version.
ClipBucket a travaillé sur un modèle de conseil - ils ont publié leur code gratuitement et facturé pour l'aide au déploiement. Peu à peu, j'ai réalisé qu'une entreprise qui gagne de l'argent grâce au support payant n'est probablement pas très intéressée à ce que les clients installent le produit eux-mêmes.
MediaGoblin, une alternative plus moderne
Après quelques mois de frustration avec ClipBucket, j'ai passé en revue les options disponibles et j'ai trouvé .

est une plateforme de partage de médias autonome
MediaGoblin a beaucoup de goodies. Contrairement à ClipBucket en PHP disgracieux, MediaGoblin est écrit en Python, un langage avec lequel j'ai beaucoup d'expérience dans l'écriture de code. Manger , ce qui facilite l'automatisation des téléchargements de vidéos. Plus important encore, MediaGoblin intervient , ce qui élimine tout problème d'installation.
est une technologie qui crée un environnement autonome pour une application qui fonctionne n'importe où. J'utilise Docker dans .
L'étonnante difficulté de redockériser MediaGoblin
J'ai supposé que le déploiement d'une image Docker MediaGoblin serait une tâche triviale. Eh bien, cela n'a pas tout à fait fonctionné de cette façon.
L'image finie n'avait pas deux fonctions nécessaires :
- Authentification
- MediaGoblin crée un portail média public par défaut, et j'avais besoin d'un moyen de restreindre l'accès des étrangers.
- Transcodage
- Chaque fois que vous téléchargez une vidéo, MediaGoblin essaie de la ré-encoder pour une diffusion optimale. Si la vidéo est initialement prête pour le streaming, le transcodage dégrade la qualité.
- MediaGoblin fournit , mais il n'est pas possible de le faire dans une image Docker existante.
Eh bien, pas de problème. L'image Docker est fournie avec , afin que vous puissiez .
Malheureusement, l'image Docker n'est plus construite à partir de l'actuel . J'ai essayé de le synchroniser avec la version de la dernière version réussie, mais cela n'a pas fonctionné non plus. Même si j'ai utilisé exactement le même code, les dépendances externes de MediaGoblin ont changé, brisant la construction. Des dizaines d'heures plus tard, j'ai exécuté le processus de construction MediaGoblin de 10 à 15 minutes encore et encore jusqu'à ce que cela fonctionne enfin.
La même chose s'est produite quelques mois plus tard. Au total, au cours des deux dernières années, la chaîne de dépendance MediaGoblin a cassé ma construction plusieurs fois, et la dernière fois que cela s'est produit, c'était juste au moment où j'écrivais cet article. j'ai fini par poster c et les versions de bibliothèque explicitement spécifiées. En d'autres termes, au lieu de l'affirmation douteuse que MediaGoblin fonctionne avec n'importe quelle version >= 3.0, j'ai installé une dépendance spécifique sur la version , car j'ai testé MediaGoblin avec cette version. Il semble que le produit ait besoin mais je ne l'ai pas encore fait.
Quoi qu'il en soit, après de nombreuses heures de lutte, j'ai finalement pu créer et configurer MediaGoblin dans une image Docker. C'était déjà facile и .
Étape 4. Hébergement
Étant donné que MediaGoblin exécutait Docker sur ma machine locale, l'étape suivante consistait à déployer sur un serveur cloud afin que la famille puisse regarder la vidéo.
MediaGoblin et le problème du stockage vidéo
Il existe de nombreuses plates-formes qui prennent une image Docker et l'hébergent sur une URL publique. Le hic, c'est qu'en plus de l'application elle-même, 33 Go de fichiers vidéo devaient être publiés. Il était possible de les coder en dur dans une image docker, mais cela s'est avéré encombrant et laid. Changer une ligne de configuration nécessiterait un redéploiement de 33 Go de données.
Lorsque j'ai utilisé ClipBucket, j'ai résolu le problème avec - un utilitaire qui permet au système d'exploitation de télécharger des répertoires sur le stockage en nuage Google Cloud en tant que chemins réguliers vers le système de fichiers. J'ai hébergé les fichiers vidéo sur Google Cloud et utilisé gcsfuse pour les afficher en tant que fichiers locaux dans ClipBucket.
La différence était que ClipBucket s'exécutait dans une vraie machine virtuelle, tandis que MediaGoblin s'exécutait dans un conteneur Docker. Ici, le montage de fichiers à partir du stockage en nuage s'est avéré beaucoup plus difficile. J'ai passé des dizaines d'heures à résoudre tous les problèmes et j'ai écrit à ce sujet .

L'intégration initiale de MediaGoblin avec le stockage Google Cloud, que j'ai
Après plusieurs semaines de réglage de tous les composants, tout a fonctionné. Sans apporter de modifications au code MediaGoblin, je triche pour qu'il lise et écrive des fichiers multimédias sur le stockage en nuage de Google.
Le seul problème était que MediaGoblin a commencé à travailler d'une lenteur indécente. Il a fallu 20 secondes pour télécharger des vignettes vidéo sur la page d'accueil. Si vous avez sauté en avant en regardant une vidéo, MediaGoblin s'est arrêté pendant 10 secondes sans fin avant de reprendre la lecture.
Le principal problème était que les vidéos et les images arrivaient à l'utilisateur de manière longue et détournée. Ils devaient passer du stockage en nuage de Google via gcsfuse à MediaGoblin, Nginx - et ce n'est qu'alors qu'ils sont entrés dans le navigateur de l'utilisateur. Le principal goulot d'étranglement était gcsfuse, qui n'est pas optimisé pour des performances rapides. Les développeurs mettent en garde contre les retards importants dans l'utilitaire directement sur la page principale du projet :

Avertissements dans la documentation gcsfuse
Idéalement, le navigateur doit extraire les fichiers directement de Google Cloud, en contournant toutes les couches intermédiaires. Comment puis-je faire cela sans approfondir la base de code MediaGoblin et ajouter une logique d'intégration Google Cloud complexe ?
astuce sub_filter dans nginx
Heureusement, j'ai trouvé une solution facile légèrement laid. J'ai ajouté à la configuration default.conf dans Nginx :
sub_filter "/mgoblin_media/media_entries/" "https://storage.googleapis.com/MY-GCS-BUCKET/media_entries/";
sub_filter_once off;
Dans ma configuration, Nginx a agi en tant que proxy entre MediaGoblin et l'utilisateur final. La directive ci-dessus indique à Nginx de rechercher et de remplacer toutes les réponses HTML MediaGoblin avant de les servir à l'utilisateur final. Nginx remplace tous les chemins relatifs vers les fichiers multimédias MediaGoblin par des URL provenant du stockage cloud de Google.
Par exemple, MediaGoblin génère ce HTML :
<video width="720" height="480" controls autoplay>
<source
src="/mgoblin_media/media_entries/16/Michael-riding-a-bike.mp4"
type="video/mp4">
</video>
Nginx modifie la réponse :
<video width="720" height="480" controls autoplay>
<source
src="https://storage.googleapis.com/MY-GCS-BUCKET/media_entries/16/Michael-riding-a-bike.mp4"
type="video/mp4">
</video>
Maintenant tout fonctionne comme il se doit :

Nginx réécrit les réponses de MediaGoblin afin que les clients puissent demander des fichiers multimédias directement à partir du stockage cloud de Google
La meilleure partie de ma solution est qu'elle ne nécessite aucune modification du code MediaGoblin. La directive Nginx à deux lignes intègre de manière transparente MediaGoblin et Google Cloud, même si les deux services ne savent rien l'un de l'autre.
Noter : Cette solution nécessite que les fichiers de Google Cloud Storage soient lisibles par tout le monde. Pour réduire le risque d'accès non autorisé, j'utilise un long nom de compartiment aléatoire (par exemple,
mediagoblin-39dpduhfz1wstbprmyk5ak29) et vérifiez que la stratégie de contrôle d'accès du compartiment n'autorise pas les utilisateurs non autorisés à afficher le contenu du répertoire.
Produit final
À ce stade, j'avais une solution complète et fonctionnelle. MediaGoblin fonctionnait avec bonheur dans son propre conteneur sur Google Cloud Platform, il n'avait donc pas besoin d'être corrigé ou mis à jour fréquemment. Tout dans mon processus était automatisé et reproductible, permettant des modifications simples ou des restaurations aux versions précédentes.
Ma famille a vraiment aimé la facilité avec laquelle il est possible de regarder des vidéos. Avec l'aide du hack Nginx décrit ci-dessus, travailler avec la vidéo est devenu aussi rapide que sur YouTube.
L'écran de visualisation ressemble à ceci :

Contenu du catalogue de vidéos familiales par tag "Best"
Cliquer sur la vignette fait apparaître l'écran suivant :

Visualisation d'un clip individuel sur un serveur multimédia
Après de nombreuses années de travail, j'ai été incroyablement heureux de donner à mes proches la possibilité de regarder nos vidéos dans la même interface pratique que sur YouTube, ce que je voulais à l'origine.
Bonus : réduction des coûts à moins de 1 $ par mois
Vous regardez rarement des vidéos personnelles, seulement tous les quelques mois. Ma famille générait collectivement environ 20 heures de trafic par an, mais le serveur fonctionnait 15h/99,7 et XNUMXj/XNUMX. J'ai payé XNUMX $ par mois pour un serveur qui était en panne XNUMX % du temps.
Fin 2018, Google a sorti un produit . La fonctionnalité killer exécutait les conteneurs Docker si rapidement que l'application pouvait répondre aux requêtes HTTP. C'est-à-dire que le serveur pouvait rester en mode veille - et ne démarrer que lorsque quelqu'un voulait y accéder. Pour les applications peu utilisées comme la mienne, les coûts sont passés de 15 $ par mois à quelques centimes par an.
Pour des raisons dont je ne me souviens pas, Cloud Run ne fonctionnait pas avec mon image MediaGoblin. Mais avec l'avènement de Cloud Run, je me suis souvenu que propose un service similaire gratuitement, et leurs outils sont beaucoup plus pratiques que ceux de Google.
Avec un serveur d'application gratuit, la seule dépense est le stockage des données. Le stockage régional standard de Google coûte 2,3 cents/Go. L'archive vidéo est de 33 Go, donc je ne paie que 77 cents par mois.

Cette solution ne coûte que 0,77 $ par mois
Conseils pour ceux qui vont essayer
Évidemment, le processus m'a pris beaucoup de temps. Mais j'espère que cet article vous aidera à économiser 80 à 90 % de vos efforts de numérisation et de publication de vidéos personnelles. Dans une section séparée, vous pouvez trouver tout au long du processus, mais voici quelques conseils généraux :
- Enregistrez autant de métadonnées que possible pendant la phase de numérisation et d'édition.
- Des informations précieuses sont souvent enregistrées sur les étiquettes des cassettes vidéo.
- Enregistrez quel clip a été extrait de quelle cassette et dans quel ordre.
- Notez la date de prise de vue, qui peut être indiquée sur la vidéo.
- Envisagez de payer pour des services de numérisation professionnels.
- Vous serez excessivement il est difficile et coûteux de les égaler en termes de qualité de numérisation.
- Mais restez à l'écart d'une entreprise appelée EverPresent (faites-moi savoir si vous avez besoin de plus de détails).
- Si vous effectuez vous-même la numérisation, achetez un disque dur.
- La vidéo en définition standard non compressée prend 100 à 200 Mo par minute.
- j'ai tout gardé sur moi (10 To).
- Écrivez les métadonnées dans un format courant qui n'est pas lié à une application spécifique.
- Descriptions des clips, codes temporels, dates, etc.
- Si vous enregistrez les métadonnées dans un format spécifique à l'application (ou pire, ne les enregistrez pas du tout), vous ne pourrez pas refaire le travail si vous décidez d'utiliser une autre solution.
- Lors du montage, vous voyez beaucoup de métadonnées utiles sur la vidéo. Vous les perdrez si vous ne les enregistrez pas.
- Que se passe-t-il sur la vidéo ?
- Qui y est inscrit ?
- Quand a-t-il été enregistré ?
- Taguez vos vidéos préférées.
- Pour être honnête, la plupart des contenus vidéo personnels sont assez ennuyeux.
- J'applique la balise "best of" à mes clips préférés et je les ouvre lorsque je veux regarder des vidéos amusantes.
- Organisez une solution globale le plus tôt possible afin que le processus se déroule immédiatement du début à la fin.
- J'ai d'abord essayé de numériser toutes les cassettes, puis de monter toutes les cassettes, etc.
- Dommage que je n'aie pas commencé avec une cassette et fait tout le travail avec. Ensuite, je comprendrais quelles décisions et à quelles étapes affectent le résultat final.
- Minimiser le recodage.
- Chaque fois que vous modifiez ou réencodez un clip, vous dégradez sa qualité.
- Numérisez les séquences brutes avec une qualité maximale, puis transcodez chaque clip exactement une fois dans le format lu par les navigateurs.
- Utilisez la solution la plus simple possible pour publier des clips vidéo.
- Avec le recul, MediaGoblin semble être un outil trop complexe pour un scénario assez simple de génération de pages Web avec un ensemble statique de fichiers vidéo.
- Si je devais recommencer, j'utiliserais un générateur de site statique tel que , ou .
- Faites un montage.
- Le montage vidéo est une façon amusante de combiner les meilleurs moments de plusieurs vidéos.
- L'essentiel dans le montage, c'est la musique. Par exemple, le thème est incroyable de The National, c'est ma découverte personnelle.
Source: habr.com
