6 pontos por GN⁺ 2024-07-30 | 1 comentários | Compartilhar no WhatsApp
  • MeTube é uma Web UI self-hosted para yt-dlp, permitindo baixar mídia do YouTube e de dezenas de sites compatíveis diretamente pelo navegador
  • Suporta download de vídeo, áudio, legendas e miniaturas, e também permite baixar playlists e canais ajustando o formato de saída e as opções de download
  • É possível assinar canais e playlists para verificar periodicamente novos itens e colocar novos uploads automaticamente na fila
  • Roda com Docker ou docker-compose, com configuração de número de downloads simultâneos, caminho de armazenamento, template de nome de arquivo, HTTPS, CORS, tema, nível de log etc. via variáveis de ambiente
  • As opções do yt-dlp são combinadas na ordem de opções globais, presets e overrides por download; como os overrides por download permitem inserir opções arbitrárias, isso só deve ser ativado em ambientes confiáveis

O que o MeTube faz

  • MeTube é uma Web UI self-hosted baseada em yt-dlp
  • Permite baixar mídia do YouTube e de dezenas de sites suportados pelo yt-dlp
  • Os principais recursos são:
    • Download de vídeo, áudio, legendas e miniaturas pela interface do navegador
    • Download de playlists e canais
    • Configuração do caminho de saída e das opções de download
    • Assinatura de canais e playlists para verificar periodicamente novos itens
    • Adição automática de novos uploads à fila de download

Como executar

  • Pode ser executado diretamente com Docker
docker run -d -p 8081:8081 -v /path/to/downloads:/downloads ghcr.io/alexta69/metube
  • O exemplo com docker-compose usa a imagem ghcr.io/alexta69/metube e monta o /downloads do contêiner no diretório de downloads do host
services:
  metube:
    image: ghcr.io/alexta69/metube
    container_name: metube
    restart: unless-stopped
    ports:
      - "8081:8081"
    volumes:
      - /path/to/downloads:/downloads

Configuração de downloads e armazenamento

  • MAX_CONCURRENT_DOWNLOADS limita o número de downloads que podem rodar ao mesmo tempo, com valor padrão 3
  • Se DELETE_FILE_ON_TRASHCAN estiver como true, ao enviar um item para a lixeira na seção “Completed” da UI, o arquivo baixado no servidor também será excluído
  • DEFAULT_OPTION_PLAYLIST_ITEM_LIMIT define o número máximo de itens baixáveis em uma playlist; o padrão 0 significa sem limite
  • Os valores padrão relacionados a assinaturas também podem ser ajustados por variáveis de ambiente
    • SUBSCRIPTION_DEFAULT_CHECK_INTERVAL: intervalo de verificação automática por assinatura, padrão 60 minutos
    • SUBSCRIPTION_SCAN_PLAYLIST_END: número máximo de itens de playlist/canal buscados na verificação de assinatura, padrão 50
    • SUBSCRIPTION_MAX_SEEN_IDS: limite máximo de IDs de vídeo armazenados por assinatura, padrão 50000
  • DOWNLOAD_DIR é o caminho de armazenamento dos downloads; na imagem Docker, o padrão é /downloads
  • Downloads apenas de áudio podem usar um caminho separado com AUDIO_DOWNLOAD_DIR
  • Com CUSTOM_DIRS e CREATE_CUSTOM_DIRS, é possível selecionar subdiretórios de download na UI ou criá-los automaticamente
  • Em STATE_DIR ficam armazenados arquivos de estado persistente como queue.json, pending.json, completed.json e subscriptions.json
  • TEMP_DIR é o caminho dos arquivos temporários de download; usar SSD ou sistema de arquivos em RAM pode ajudar no desempenho, mas um sistema de arquivos em RAM pode impedir a retomada de downloads

Nome de arquivo e opções do yt-dlp

  • OUTPUT_TEMPLATE é o template de nome dos arquivos baixados, com padrão %(title)s.%(ext)s
  • É possível definir templates separados para downloads de capítulos, playlists e canais
    • OUTPUT_TEMPLATE_CHAPTER

    • OUTPUT_TEMPLATE_PLAYLIST

      • OUTPUT_TEMPLATE_CHANNEL
      • As opções do yt-dlp são definidas como objeto JSON
      • A hierarquia de opções é aplicada da mais ampla para a mais específica
      1. Opções globais: valores padrão para todos os downloads
      2. Presets: conjuntos nomeados de opções selecionados por download na UI
      3. Overrides por download: opções de entrada livre aplicadas apenas a um download específico
      • Se houver chaves em conflito, a configuração mais específica tem prioridade
      • Overrides por download têm prioridade sobre presets
      • Presets têm prioridade sobre opções globais
      • Se um valor de opção for definido como null no JSON, essa opção será removida naquele download
      • YTDL_OPTIONS_FILE e YTDL_OPTIONS_PRESETS_FILE monitoram alterações no arquivo e recarregam automaticamente, então não é preciso reiniciar o contêiner
      • Se arquivos e variáveis de ambiente forem usados juntos e definirem a mesma chave ou o mesmo nome de preset, a configuração em arquivo terá prioridade

Presets e overrides

  • Os presets aparecem como “Option Presets” em Advanced Options na UI
  • Os presets de exemplo fazem o seguinte
    • sponsorblock: remove segmentos sponsor, selfpromo e interaction
    • embed-subs: baixa legendas em inglês e alemão e as embute no arquivo de vídeo
    • limit-rate: limita a velocidade de download a cerca de 5 MB/s
  • Se vários presets forem selecionados, eles serão aplicados em ordem, e presets posteriores sobrescrevem opções iguais dos anteriores
  • Se ALLOW_YTDL_OPTIONS_OVERRIDES for definido como true, aparecerá na UI um campo JSON de entrada livre chamado “Custom yt-dlp Options”
  • Os overrides por download ficam desativados por padrão
  • Ao ativar esse recurso, quem tiver acesso à UI pode fornecer opções arbitrárias da API do yt-dlp, e dependendo das opções pode ser possível executar comandos arbitrários dentro do contêiner; por isso, ele só deve ser ativado em ambientes confiáveis
  • O MeTube força seu próprio comportamento extract_flat e noplaylist na etapa inicial de obtenção de metadados, e os presets não podem sobrescrever essas chaves nessa etapa

Cookies, integração com navegador e execução rápida

  • É possível usar cookies do navegador ao baixar vídeos restritos ou privados
    • Exporte os cookies para cookies.txt usando uma extensão do Firefox ou Chrome
    • Faça upload em Upload Cookies nas Advanced Options do MeTube
    • Exclua os cookies enviados em Delete Cookies na mesma seção
  • As extensões de navegador permitem enviar diretamente o vídeo para o MeTube com clique direito
    • Para usar em páginas HTTPS, a instância do MeTube precisa estar atrás de um proxy reverso HTTPS
    • Como a extensão faz requisições a partir das origens chrome-extension://... ou moz-extension://..., é necessário definir CORS_ALLOWED_ORIGINS=*
  • A extensão para Chrome pode ser instalada pela Google Chrome Webstore ou pelo código-fonte
  • A extensão para Firefox pode ser instalada pelos Firefox Addons ou usando o código-fonte
  • O Shortcut do iOS permite enviar URLs para o MeTube pelo menu de compartilhamento do Safari
  • O Bookmarklet envia a página aberta no momento para o MeTube e, em páginas HTTPS, o MeTube precisa estar configurado com HTTPS ou atrás de um proxy reverso HTTPS
  • Como o Bookmarklet envia requisições cross-origin da origem da página atual para o MeTube, é preciso adicionar as origens dos sites usados em CORS_ALLOWED_ORIGINS
  • A extensão do MeTube para Raycast permite adicionar vídeos diretamente pelo Raycast

Servidor web, HTTPS e proxy reverso

  • As configurações relacionadas ao servidor web são ajustadas por variáveis de ambiente
    • HOST tem valor padrão 0.0.0.0
    • PORT tem valor padrão 8081
    • URL_PREFIX é usado para implantação em subcaminho atrás de proxy reverso
    • PUBLIC_HOST_URL e PUBLIC_HOST_AUDIO_URL alteram a URL base dos links de download dos arquivos concluídos
  • Se HTTPS estiver como true e CERTFILE e KEYFILE forem definidos, o MeTube será executado em modo HTTPS
  • Um proxy reverso pode ser usado para terminação HTTPS ou autenticação
  • A imagem linuxserver/swag inclui trechos de configuração para subfolder, subdomain e autenticação com Authelia para o MeTube
  • O exemplo com NGINX faz proxy da rota /metube/ para http://metube:8081 e define os headers Upgrade e Connection para o funcionamento do WebSocket
  • Também são fornecidos exemplos de proxy reverso para Apache e Caddy

Atualizações, solução de problemas e desenvolvimento local

  • O MeTube depende do yt-dlp, e como o layout dos sites de vídeo muda com frequência, o yt-dlp precisa ser atualizado regularmente
  • Quando sai uma nova versão estável do yt-dlp, uma nova imagem Docker do MeTube é publicada automaticamente
  • Para manter o contêiner atualizado, é possível usar o watchtower
  • Para seguir o canal nightly do yt-dlp, defina YTDL_NIGHTLY_UPDATE_TIME com o horário da atualização diária e reinicialização do MeTube no formato HH:MM
  • Para problemas com autenticação, pós-processamento, permissões ou YTDL_OPTIONS, a recomendação é primeiro depurar diretamente no yt-dlp e depois levar as opções que funcionarem para o MeTube
  • Para build e execução locais, são necessários Node.js 22+ e Python 3.13
  • A UI é compilada com pnpm, as dependências Python são instaladas com uv sync e a execução é feita com uv run python3 app/main.py
  • A imagem Docker pode ser compilada localmente com docker build -t metube ., e nesse processo a UI também é compilada

1 comentários

 
GN⁺ 2024-07-30
Opiniões no Hacker News
  • Também vale considerar o Tube Archivist. É exagero se a ideia for baixar só alguns vídeos, mas eu o uso para arquivar e indexar meus canais de tecnologia favoritos
    Ele permite busca em texto completo e metadados não só em transcrições/legendas, mas também em comentários, títulos e descrições, o que, irritantemente, é muito melhor do que aquilo que a Alphabet oferece
    https://www.tubearchivist.com/

    • Olhei o TubeArchivist e não gostei do fato de ele exigir 3 contêineres. Aí encontrei o Pinchflat no subreddit selfhosted; ele roda em um único contêiner, foi fácil de implantar e tem funcionado bem até agora
      https://github.com/kieraneglin/pinchflat
    • Eu preferiria evitar isso. A nomeação dos arquivos depende da premissa de que existe um banco de dados
      Se fosse um armazenamento temporário, eu entenderia, mas uma ferramenta que se chama software de “arquivamento” deveria presumir que talvez ela própria não sobreviva por mais tempo do que os dados que tenta preservar
      Eu estava animado porque parecia um clone do PeerTube com função de download, mas desanimei ao ver o resultado; yt-dlp com uma configuração inteligente e scripts faz o trabalho de arquivamento do jeito certo
    • O Google não vai tornar seus próprios produtos convenientes de usar de uma forma estruturada e avançada. Esse tipo de abordagem favorece demais o usuário e entrega controle demais. O Google odeia isso
    • Há outra opção que apareceu mais cedo hoje na página inicial: Yark: YouTube Archiver with Offline UI
      https://news.ycombinator.com/item?id=41100820
    • Faz tempo que penso em migrar para o Tube Archivist, mas tenho vários TB de vídeos do YouTube reunidos com o TubeSync e não quero baixá-los de novo
      Felizmente, tenho a string de formato que usei para salvar os nomes dos arquivos, e como o TubeSync usa Django e PostgreSQL no backend, talvez eu consiga associá-los aos IDs do YouTube. Ainda assim, a migração parece um belo pesadelo
  • O que eu realmente quero é um TiVo do YouTube
    Tenho cerca de 100 canais que acompanho quase religiosamente, mas que publicam raramente, e não quero perder nenhum vídeo deles
    Também não quero ficar vasculhando no YouTube centenas de vídeos novos de canais que postam quatro vezes por dia para encontrar 1 ou 2 que eu realmente queira ver. No fim, acabo perdendo coisas
    Eu gostaria de um feed priorizado só com o que eu de fato quero ou preciso assistir, e melhor ainda se pudesse baixar tudo e ver via DLNA
    Garantir que não percamos o que gostamos não é o modo como o YouTube opera. O jeito do YouTube é fazer você assistir a vídeos de 3 minutos esticados para 18–22 minutos, mantendo o feedback grudado na sua cara

    • Isso não é resolvido pelas inscrições do YouTube? Se você se inscrever nesses 100 canais e favoritar a página de inscrições, terá um feed priorizado só com o que quer ver
      Se a questão for não querer criar uma conta, tudo bem, e o NewPipe atende bem; mas existe uma página dedicada que mostra, em ordem cronológica, vídeos de canais escolhidos por você, então é meio estranho dizer que “garantir que não percamos o que gostamos não é o modo como o YouTube opera”
    • O NewPipe funciona bem para esse caso. Se você remover a coluna “Default Kiosk” do conteúdo da página principal e deixar só “What's New”, verá apenas vídeos dos canais em que se inscreveu. As inscrições do NewPipe não são integradas de forma alguma a uma conta Google
    • Pelo que sei, o YouTube ainda usa RSS. Você pode tentar isso
    • Uso o Invidious para esse fim. Gosto porque ele tem um feed priorizado voltado apenas às inscrições
      A descoberta de conteúdo não é boa, mas, se esse não for o seu caso de uso, vale dar uma olhada
    • Existe a extensão fraidycat, que uso exatamente para fazer isso
      https://fraidyc.at/
  • Tem uma coisa que não entendo. Por que precisa ser hospedado em um servidor? Não bastaria ser um app independente que roda em Windows/Linux/mac?
    Comecei a usar yt-dlp recentemente e pensei em criar um app simples. Vale a pena tentar? Já existem alternativas desse tipo?

    • Se quiser, um dispositivo Windows/Linux/OSX, ou uma máquina virtual/contêiner em cima dele, pode ser o servidor. Assim, quem criou não precisa fazer separadamente uma UX para web e uma UX nativa
      Muita gente roda apps auto-hospedados em um servidor externo, em um homelab, ou numa combinação dos dois, e configura esses recursos como uma infraestrutura com backup etc. Se PCs/notebooks/tablets/celulares ficarem como clientes ou caches relativamente simples, fica fácil substituí-los em caso de perda ou dano: basta baixar de novo o conteúdo local sincronizado com o servidor. Esse é um dos motivos pelos quais esse tipo de auto-hospedagem é popular
      Já vi alguns apps desktop que encapsulam o yt-dlp. Não usei pessoalmente, então é difícil falar de estabilidade ou confiabilidade, mas, se você não quer criar um novo só por diversão, vale procurar antes. Talvez o que você quer já exista
    • O Celluloid usa automaticamente o yt-dlp para fazer streaming quando você manda abrir uma URL compatível. O Parabolic é uma ferramenta dedicada de download que usa yt-dlp
      https://flathub.org/apps/details/io.github.celluloid_player....
      https://flathub.org/apps/org.nickvision.tubeconverter
    • Se for baixar apenas vídeos do YouTube, nem o yt-dlp é necessariamente preciso. Dá para fazer com muito menos código e complexidade; eu uso um programinha em C bem pequeno. Um pequeno script de shell também funciona muito bem
      O que ninguém comenta é que o yt-dlp agora não consegue mais baixar o itag 22, e o itag 18 está com limite de velocidade. Então o yt-dlp precisa baixar o arquivo de áudio e o de vídeo separadamente e depois juntá-los com ffmpeg
      A receita de anúncios do YouTube acabou de ficar abaixo das estimativas de consenso. A acessibilidade aos vídeos do YouTube pode piorar daqui para frente
      Se você não tem o hábito de escolher formatos específicos, provavelmente nem percebe muito isso. Por exemplo, algumas pessoas usaram só itag 18 e 22 por anos
    • Também existe o Freetube
      https://freetubeapp.io/
    • Talvez você queira baixar e armazenar os vídeos em um NAS ou servidor doméstico, não no dispositivo que está usando agora
      Um web app dockerizado é muito mais fácil de criar e manter do que clientes desktop/mobile separados para Windows, macOS, Android, iOS e Linux
  • Seria bom ter uma interface que se integrasse ao Jellyfin. Algo como pesquisar no YouTube, baixar com yt-dlp e depois fazer streaming pelo Jellyfin sem anúncios

    • Eu uso quase assim, só que a etapa do yt-dlp é manual. Um plugin para Jellyfin seria excelente
  • Bem legal. Hoje uso https://cobalt.tools, que também é bom

    • Perfeito. Tem uma opção para baixar o formato de áudio original do YouTube sem transcodificar para mp3
  • Descobri que o Brave para iOS tem um botão de playlist para baixar vídeos do YouTube e salvá-los no dispositivo. Dá para usar PiP e reprodução offline, e não tem anúncios
    Ele usa uma licença aberta baseada no backend iOS da Mozilla, e fico me perguntando por que mais apps não fazem isso. Eles encontraram um jeito de a Apple aceitar, e o CEO já publicou aqui uma defesa dizendo que essa técnica é válida
    Essencialmente, só funciona depois de carregar o vídeo dentro do site normal do YouTube, e é uma abordagem parecida com um botão de modo de leitura que se aplica não só ao YouTube, mas a qualquer conteúdo de vídeo

  • Acho um pouco curioso haver tantas ferramentas de espelhamento do YouTube. Se você usa algo assim, qual é o motivo para baixar/arquivar os vídeos em vez de simplesmente fazer streaming pelo YouTube?
    Entendo que às vezes pode ser bom arquivar caso algo seja removido do YouTube, mas no meu caso isso é muito raro. Depois que assisto a um vídeo, acabou; se eu não puder vê-lo de novo, não me importo muito

    • Há vários motivos para baixar ou arquivar em vez de fazer streaming pelo YouTube
      Primeiro, remoção de anúncios é um motivo bem importante para muita gente
      Segundo, como você já escreveu, se um vídeo ou um canal inteiro cair por reivindicação de direitos autorais ou outra denúncia, não dá mais para fazer streaming. Dependendo do conteúdo que alguém assiste, isso pode ser muito mais importante para essa pessoa do que para você
      Terceiro, você pode baixar para reprodução offline. O app oficial do YouTube também permite isso, mas é preciso pagar pelo Premium, cujo preço parece exagerado, e ainda continua sujeito ao problema de remoção
      Quarto, indexação local. Se você quiser referenciar vídeos depois para rever ou compartilhar, pode ser mais conveniente organizá-los na sua própria estrutura do que manter favoritos das cópias no YouTube ou pesquisar toda vez
      Pode ser uma combinação desses motivos, e provavelmente há outros que não considerei ou não lembro
    • Para mim, é pelo mesmo motivo pelo qual as pessoas usavam VCR. Não é “violação de direitos autorais”, é salvar para assistir depois, ou quando a conexão à internet estiver ausente ou lenta
      A maior parte do que baixo eu vejo uma vez e apago
    • Na rede doméstica das crianças, bloqueio o YouTube e, em vez disso, dou acesso a um DadTube selecionado por mim
    • Você diz que acha curioso que a ferramenta exista, mas logo em seguida cita o maior motivo para ela precisar existir
      Além disso, às vezes não dá para fazer streaming pelo YouTube. A internet pode ter caído, você pode estar num plano móvel internacional e os custos serem um problema, ou talvez você só queira se livrar dos anúncios horríveis
    • Por causa de limite de uso de banda. Se quiser tocar repetidamente a mesma playlist de clipes musicais, isso consome bastante da franquia
  • Relacionado: Yark: arquivador do YouTube com UI offline
    https://news.ycombinator.com/item?id=41100820

  • Se um dos servidores baseados em yt-dlp fosse empacotado com uma ferramenta de criação de imagem bem simples, tipo Pi-hole e um app cliente de front-end decente para reprodução, acho que poderia bombar bastante, assim como o Pi-hole se espalhou entre usuários menos técnicos
    A ideia seria: comprar um Raspberry Pi, gravar a imagem em um cartão microSD, escolher seus canais favoritos do YouTube e instalar o app cliente; então todo o seu conteúdo favorito do YouTube ficaria disponível localmente e sem anúncios

  • No momento estou usando o TubeSync. Os recursos são simples e ele tem muitos bugs, mas funciona bem o bastante para mim
    O que ele precisa fazer é só assinar canais ou playlists, baixar os vídeos para um caminho específico e verificar conteúdo novo uma vez por dia
    A UX necessária é apenas a configuração dos canais; depois disso, basta salvar os arquivos e deixar o Plex cuidar do resto. Alguém conhece uma opção melhor?