Etapa 3. Publicação
ClipBucket, um clone de código aberto do YouTube que pode ser instalado em seu próprio servidor
Minha primeira tentativa foi o ClipBucket , que se autodenomina um clone de código aberto do YouTube que você pode instalar em seu servidor.

Surpreendentemente, ClipBucket não tem instruções de instalação. Graças a uma terceira tutorial partido, I automatizado o processo de instalação usando Ansible , uma ferramenta de gerenciamento de configuração do servidor.
Parte da dificuldade era que os scripts de instalação do ClipBucket estavam completamente corrompidos. Naquela época, eu trabalhava no Google e sob os termos do contrato não tinha o direito de contribuir com o clone de código aberto do YouTube, mas postei um relatório de bug do qual era fácil fazer as correções necessárias. Meses se passaram e eles ainda não entendiam qual era o problema. Em vez disso, eles adicionaram mais e mais bugs a cada versão.
O ClipBucket trabalhou em um modelo de consultoria - eles lançaram seu código gratuitamente e cobraram uma taxa para ajudar na implantação. Aos poucos, percebi que uma empresa que ganha dinheiro com suporte pago provavelmente não está muito interessada em que os clientes instalem o produto eles mesmos.
MediaGoblin, uma alternativa mais moderna
Após meses de frustração com o ClipBucket, analisei as opções disponíveis e encontrei o MediaGoblin .

O MediaGoblin é uma plataforma independente de compartilhamento de mídia
. O MediaGoblin tem muitas vantagens. Ao contrário do ClipBucket em PHP desagradável, MediaGoblin é escrito em Python, que é a linguagem na qual tenho muita experiência em codificação. Há uma interface de linha de comando que facilita a automação dos downloads de vídeo. Mais importante ainda, o MediaGoblin vem em uma imagem Docker que elimina quaisquer problemas de instalação.
Docker é uma tecnologia que cria um ambiente independente para um aplicativo executado em qualquer lugar. Eu uso o Docker em muitos dos meus projetos .
Dificuldade incrível de re-dockerizing MediaGoblin
Presumi que implantar a imagem docker MediaGoblin seria trivial. Bem, não foi bem assim que funcionou.
A imagem final não tinha duas funções necessárias:
- Autenticação
- O MediaGoblin cria um portal de mídia público por padrão e eu precisava de uma maneira de restringir o acesso não autorizado.
- Transcodificação
- Cada vez que você carrega um vídeo, o MediaGoblin tenta recodificá-lo para um streaming ideal. Se o vídeo estiver inicialmente pronto para ser transmitido, a transcodificação degrada a qualidade.
- O MediaGoblin fornece a desativação da transcodificação por meio das opções de configuração , mas isso não pode ser feito em uma imagem Docker existente.
Bem, não há problema. A imagem do Docker é de código aberto , portanto, você mesmo pode reconstruí-la .
Infelizmente, a imagem Docker não é mais construída a partir do repositório atual do MediaGoblin . Tentei sincronizá-lo com a versão da última compilação bem-sucedida, mas também não funcionou. Embora eu tenha usado exatamente o mesmo código, as dependências externas do MediaGoblin mudaram, quebrando a compilação. Depois de dezenas de horas, executei o processo de construção de 10-15 minutos do MediaGoblin repetidamente até que finalmente funcionou.
Alguns meses depois, aconteceu a mesma coisa. No total, nos últimos dois anos, a cadeia de dependências do MediaGoblin quebrou minha construção várias vezes, e a última vez que isso aconteceu foi quando eu estava escrevendo este artigo. Acabei publicando meu próprio fork do MediaGoblin, com dependências codificadas e versões de biblioteca explícitas. Em outras palavras, em vez de alegar duvidosamente que o MediaGoblin funciona com qualquer versão do aipo > = 3.0, instalei uma dependência específica do aipo 4.2.1 porque testei o MediaGoblin com essa versão. Parece que o produto precisa de um mecanismo de construção reproduzível , mas ainda não fiz isso.
De qualquer forma, depois de muitas horas de luta, finalmente consegui construir e configurar o MediaGoblin em uma imagem Docker. Lá já era fácil pular a transcodificação desnecessária e colocar o Nginx para autenticação .
Etapa 4. Hospedagem
Como o MediaGoblin estava executando o Docker em minha máquina local, a próxima etapa foi implantar em um servidor em nuvem para que a família pudesse assistir ao vídeo.
MediaGoblin e problema de armazenamento de vídeo
Existem muitas plataformas que pegam uma imagem Docker e a hospedam em um URL público. O problema é que além do aplicativo em si, 33 GB de arquivos de vídeo tiveram que ser publicados. Foi possível codificá-los em uma imagem docker, mas acabou sendo complicado e feio. Alterar uma linha de configuração exigiria a reimplantação de 33 GB de dados.
Quando usei o ClipBucket, resolvi o problema com o gcsfuse , um utilitário que permite ao sistema operacional fazer upload de diretórios para o Google Cloud como caminhos normais do sistema de arquivos. Publiquei os arquivos de vídeo no Google Cloud e usei gcsfuse para mostrá-los como arquivos locais no ClipBucket.
A diferença era que o ClipBucket era executado em uma VM real, enquanto o MediaGoblin era executado em um contêiner do Docker. Aqui, montar arquivos de armazenamento em nuvem acabou sendo muito mais difícil. Passei dezenas de horas resolvendo todos os problemas e escrevi um post inteiro sobre isso .

A integração inicial do MediaGoblin com o armazenamento do Google Cloud, de que falei em 2018.
Depois de várias semanas ajustando todos os componentes, tudo funcionou. Sem fazer nenhuma alteração no código do MediaGoblin, eu o forço enganosamente a ler e gravar arquivos de mídia no armazenamento em nuvem do Google.
O único problema é que o MediaGoblin ficou obscenamente lento. Demorou 20 segundos para carregar miniaturas de vídeo na página inicial. Se você pular para frente enquanto assiste a um vídeo, o MediaGoblin fará uma pausa infinita de 10 segundos antes de retomar a reprodução.
O principal problema era que os vídeos e as fotos chegavam ao usuário de uma maneira longa e indireta. Eles tiveram que ir do armazenamento em nuvem do Google por meio do gcsfuse para o MediaGoblin, Nginx - e só então eles entraram no navegador do usuário. O principal gargalo era o gcsfuse, que não é otimizado para desempenho rápido. Os desenvolvedores alertam sobre grandes atrasos no trabalho do utilitário diretamente na página principal do projeto:

Avisos de desempenho na documentação do gcsfuse
Idealmente, o navegador deve buscar arquivos diretamente do Google Cloud, ignorando todas as camadas intermediárias. Como posso fazer isso sem mergulhar na base de código MediaGoblin e adicionar uma lógica de integração complexa do Google Cloud?
Nginx sub_filter truque
Felizmente, encontrei uma solução simples, embora um pouco feia. Eu adicionei o seguinte filtro à configuração default.conf no Nginx :
sub_filter "/mgoblin_media/media_entries/" "https://storage.googleapis.com/MY-GCS-BUCKET/media_entries/";
sub_filter_once off;
Na minha instalação, o Nginx funcionou como um proxy entre o MediaGoblin e o usuário final. A diretiva acima diz ao Nginx para pesquisar e substituir todas as respostas HTML do MediaGoblin antes de passá-las para o usuário final. Nginx substitui todos os caminhos relativos aos arquivos de mídia MediaGoblin por URLs do Google Cloud Storage.
Por exemplo, MediaGoblin gera HTML como este:
<video width="720" height="480" controls autoplay>
<source
src="/mgoblin_media/media_entries/16/Michael-riding-a-bike.mp4"
type="video/mp4">
</video>
Nginx muda a resposta:
<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>
Agora tudo está funcionando como esperado: o

Nginx reescreve as respostas do MediaGoblin para que os clientes possam solicitar arquivos de mídia diretamente do armazenamento em nuvem do Google.
A melhor parte da minha solução é que ela não exige nenhuma alteração no código do MediaGoblin. A diretiva de duas linhas do Nginx integra perfeitamente o MediaGoblin e o Google Cloud, embora esses serviços não saibam absolutamente nada um sobre o outro.
Observação : esta solução requer que os arquivos no Google Cloud Storage possam ser lidos por todos. Para mitigar o risco de acesso não autorizado, eu uso um nome de intervalo aleatório longo (por exemplo mediagoblin-39dpduhfz1wstbprmyk5ak29
) e verifico se a política de controle de acesso do intervalo não permite que usuários não autorizados exibam o conteúdo do diretório.
Produto final
Nesse ponto, eu tinha uma solução completa e funcional. O MediaGoblin rodou alegremente em seu próprio contêiner na plataforma de nuvem do Google, então não precisava ser corrigido ou atualizado com frequência. Tudo em meu processo era automatizado e reproduzível, permitindo edições ou reversões fáceis.
Minha família adorou como foi fácil assistir ao vídeo. Com o hack do Nginx acima, o processamento de vídeo agora é tão rápido quanto o YouTube.
A tela de visualização é semelhante a esta:

Conteúdo do diretório de vídeos da família pela
etiqueta em destaque Clicar na miniatura exibe a seguinte tela:

Visualizando um único clipe no servidor de mídia
Após muitos anos de trabalho, fiquei extremamente satisfeito em dar aos meus parentes a oportunidade de assistir aos nossos vídeos na mesma interface amigável do YouTube, como eu queria originalmente.
Bônus: redução de custo para menos de $ 1 por mês
Você não assiste a vídeos caseiros com frequência, apenas a cada poucos meses. Minha família gerava coletivamente cerca de 20 horas de tráfego em um ano, mas o servidor funcionava 24 horas por dia. Paguei $ 15 mensais por um servidor que ficava inoperante 99,7% do tempo.
No final de 2018, o Google lançou o produto Cloud Run . O recurso matador foi o lançamento de contêineres Docker tão rapidamente que o aplicativo poderia responder às solicitações HTTP. Ou seja, o servidor poderia permanecer em modo de espera - e iniciar apenas quando alguém quisesse acessá-lo. Para aplicativos lançados com pouca frequência como o meu, os custos caíram de US $ 15 por mês para alguns centavos por ano.
Por motivos que não consigo mais me lembrar, o Cloud Run não funcionou com minha imagem MediaGoblin. Mas com o advento do Cloud Run, lembrei-me que Herokuoferece um serviço semelhante gratuitamente e suas ferramentas são muito mais convenientes que as do Google.
Com um servidor de aplicativos gratuito, sua única despesa é o armazenamento de dados. O armazenamento regional padrão do Google custa 2,3 centavos / GB. O arquivo de vídeo tem 33 GB, então eu pago apenas 77 centavos por mês.

O custo desta solução é de apenas $ 0,77 por mês
Dicas para quem procura experimentar
Obviamente, o processo demorou muito para mim. Mas espero que este artigo ajude você a economizar 80-90% de seus esforços para digitalizar e publicar vídeos caseiros. Em uma seção separada, você pode encontrar um guia passo a passo detalhado de todo o processo, mas aqui estão algumas dicas gerais:
- Salve o máximo de metadados possível durante a fase de digitalização e edição.
- .
- , .
- , .
- .
- .
- EverPresent ( , ).
- , HDD.
- 100-200 .
- Synology DS412+ (10 ).
- - , .
- , , . .
- (, , ), , .
- . , .
- ?
- ?
- ?
- .
- , .
- “best of” , .
- , .
- , . .
- , . , .
- .
- , , .
- , , .
- .
- .
- — .
- — . , Slow Snow The National, .