Importante
O desenvolvimento ativo neste repositório foi pausado desde 14/07/2023. Embora ainda possa funcionar em alguns cenários, esteja ciente de que o suporte agora é administrado exclusivamente pela comunidade e os PRs atualmente não são incorporados ao repo. Para atualizações contínuas, encorajamos você a explorar garfos como @distube/ytdl-core. Podemos revisitar o desenvolvimento no futuro. Obrigado pelo seu interesse e apoio duradouro!
Atenciosamente, TFAN, 13/08/2024
Mais um módulo de download do YouTube. Escrito apenas com Javascript e uma interface de streaming amigável ao nó.
Você pode entrar em contato conosco para obter suporte em nosso servidor de bate-papo
const fs = require('fs');const ytdl = require('ytdl-core');// TypeScript: importar ytdl de 'ytdl-core'; com --esModuleInterop// TypeScript: importar * como ytdl de 'ytdl-core'; com --allowSyntheticDefaultImports// TypeScript: import ytdl = require('ytdl-core'); sem nenhum dos itens acima ytdl('http://www.youtube.com/watch?v=aqz-KE-bpKQ') .pipe(fs.createWriteStream('video.mp4'));
Tenta baixar um vídeo do URL fornecido. Retorna um fluxo legível. options
podem ter o seguinte, além de qualquer opção getInfo()
e opção chooseFormat()
.
range
- Um intervalo de bytes no formato {start: INT, end: INT}
que especifica parte do arquivo para download, ou seja, {início: 10355705, fim: 12452856}. Não compatível com formatos segmentados (DASH MPD, m3u8).
Isso baixa uma parte do arquivo, e não um vídeo emendado separadamente.
begin
- A que horas o vídeo deve começar. Suporta formatos 00:00:00.000
, 0ms, 0s, 0m, 0h
ou número de milissegundos. Exemplo: 1:30
, 05:10.123
, 10m30s
.
Para vídeos ao vivo, isso também aceita um carimbo de data/hora unix ou objeto Date e o padrão é Date.now()
.
Esta opção não é muito confiável para vídeos que não são ao vivo, veja #129 e #219.
liveBuffer
– Quanto buffer de tempo usar para vídeos ao vivo em milissegundos. O padrão é 20000
.
highWaterMark
- quanto do download do vídeo é armazenado em buffer na memória. Consulte a documentação do nó para obter mais informações. O padrão é 512 KB.
dlChunkSize
- Quando o formato escolhido é somente vídeo ou somente áudio, o download é separado em vários pedaços para evitar estrangulamento. Esta opção especifica o tamanho de cada pedaço em bytes. Definir como 0 desativa o chunking. O padrão é 10 MB.
IPv6Block
- bloco IPv6 para rotação, uma alternativa ao uso de um proxy. Leia mais. O padrão é undefined
.
ytdl.videoInfo
- Informações.
ytdl.videoFormat
- Formato de vídeo.
Emitido quando as info
do vídeo são obtidas, juntamente com o formato escolhido para download.
number
- Comprimento do bloco em bytes ou número do segmento.
number
- Total de bytes ou segmentos baixados.
number
- Total de bytes ou segmentos.
Emitido sempre que um novo pedaço é recebido. Passa valores que descrevem o progresso do download.
Todos os eventos miniget são encaminhados e podem ser ouvidos no fluxo retornado.
Ligue para cancelar e interromper o download de um vídeo.
Use isto se quiser apenas obter metainformações de um vídeo.
Obtém metainformações de um vídeo. Inclui formatos adicionais e URL decifrado pronto para download. Isto é o que a função ytdl()
usa internamente.
options
podem ter o seguinte
requestOptions
- Qualquer coisa para mesclar nas opções de solicitação com as quais o miniget é chamado, como headers
.
requestCallback
- Fornece uma função de retorno de chamada que recebe objetos de fluxo de solicitação miniget usados ao buscar metainfo.
lang
- O símbolo de 2 caracteres de um idioma. O padrão é en
.
Depois de receber metadados de um vídeo com a função ytdl.getInfo
, você poderá passar essas informações junto com outras opções para esta função.
Pode ser usado se você quiser escolher um formato. Lança um erro se não conseguir encontrar nenhum formato correspondente.
options
podem ter o seguinte
quality
- Qualidade do vídeo para download. Pode ser um valor itag, uma lista de valores itag ou uma destas strings: highest
/ lowest
/ highestaudio
/ lowestaudio
/ highestvideo
/ lowestvideo
. highestaudio
/ lowestaudio
tentam minimizar a taxa de bits do vídeo para formatos de áudio igualmente bons, enquanto highestvideo
/ lowestvideo
tentam minimizar o áudio, respectivamente. O padrão é highest
, que prefere formatos com vídeo e áudio.
Os formatos de um vídeo típico serão classificados da seguinte maneira usando quality: 'highest'
itag container quality codecs bitrate audio bitrate 18 mp4 360p avc1.42001E, mp4a.40.2 696.66KB 96KB 137 mp4 1080p avc1.640028 4.53MB 248 webm 1080p vp9 2.52MB 136 mp4 720p avc1.4d4016 2.2MB 247 webm 720p vp9 1.44MB 135 mp4 480p avc1.4d4014 1.1MB 134 mp4 360p avc1.4d401e 593.26KB 140 mp4 mp4a.40.2 128KB
o formato 18 a 360p será escolhido primeiro, pois é o formato de maior qualidade tanto com vídeo quanto com áudio. Se desejar um formato de qualidade superior com vídeo e áudio, consulte a seção sobre como lidar com fluxos separados.
filter
- Usado para filtrar a lista de formatos para escolher. Pode ser audioandvideo
ou videoandaudio
para filtrar formatos que contenham vídeo e áudio, video
para filtrar formatos que contenham vídeo ou videoonly
para formatos que contenham vídeo e nenhuma trilha de áudio adicional. Também pode ser audio
ou audioonly
. Você pode fornecer uma função de filtragem que é chamada com cada formato disponível. Esta função recebe o objeto format
como seu primeiro argumento e deve retornar verdadeiro se o formato for preferível.
// Exemplo com function.ytdl personalizado(url, { filter: format => format.container === 'mp4' })
format
- usado principalmente para baixar fluxos de vídeo ou áudio específicos. Este pode ser um objeto format
específico retornado de getInfo
.
Fornecer esta opção irá ignorar as opções de filter
e quality
, uma vez que o formato é fornecido explicitamente.
// Exemplo de escolha de um formato de vídeo.let info = await ytdl.getInfo(videoID);let format = ytdl.chooseFormat(info.formats, { quality: '134' });console.log('Format found!', formatar);
Se quiser trabalhar apenas com alguns formatos, você pode usar a opção filter
acima.
// Exemplo de filtragem dos formatos apenas para áudio.let info = await ytdl.getInfo(videoID);let audioFormats = ytdl.filterFormats(info.formats, 'audioonly');console.log('Formatos apenas com áudio: ' + audioFormats.length);
Retorna verdadeiro se a string fornecida satisfizer o formato de ID do YouTube.
Retorna verdadeiro se for possível analisar um ID de vídeo válido.
Retorna um ID de vídeo de um URL do YouTube. Lança um erro se não conseguir analisar um ID.
Igual ao ytdl.getURLVideoID()
acima, mas pode ser chamado diretamente com o ID do vídeo e, nesse caso, ele o retorna. Isso é o que o ytdl usa internamente. Lança um erro se não conseguir analisar um ID.
A string da versão obtida diretamente do package.json.
ytdl não pode baixar vídeos que se enquadrem nos seguintes
Restrito regionalmente (requer um proxy)
Privado (se você tiver acesso, requer cookies)
Aluguéis (se você tiver acesso, requer cookies)
Conteúdo do YouTube Premium (se você tiver acesso, requer cookies)
Atualmente, apenas transmissões ao vivo HLS são suportadas. Outros formatos serão filtrados em ytdl.chooseFormats
Os links de download gerados são válidos por 6 horas e só podem ser baixados do mesmo endereço IP.
Ao fazer muitas solicitações, o YouTube pode bloquear. Isso resultará na negação de suas solicitações com HTTP-StatusCode 429. As etapas a seguir podem ajudá-lo:
Atualize ytdl-core para a versão mais recente
Use proxies (você pode encontrar um exemplo aqui)
Estenda a ideia de proxy girando endereços (IPv6-)
leia isto para obter mais informações sobre isso
Use cookies (você pode encontrar um exemplo aqui)
para que isso tenha efeito, você deve PRIMEIRO esperar que o limite de taxa atual expire
Espere (geralmente desaparece em alguns dias)
Para tarefas com uso intensivo de solicitações, pode ser útil distribuir suas solicitações por vários endereços IP de origem. Alterar o IP de origem usado é semelhante a usar um proxy, exceto sem ignorar restrições como bloqueio de região. Mais endereços IP resultam em menos solicitações por IP e, portanto, aumentam seu limite de taxa. Como os endereços IPv4 são um recurso limitado, recomendamos o uso do IPv6.
Usar um bloco IPv6 é essencialmente ter milhões de endereços IPv6 a seu pedido. Num bloco /64 IPv6 (que normalmente é o bloco atribuído a um único agregado familiar), existem 18.446.744.073.709.551.616 endereços IPv6 únicos. Isso permitiria que você fizesse cada solicitação com um endereço IPv6 diferente.
Embora o uso de um bloco IP ajude contra os limites de taxa, ele exige que você configure seu sistema host para aceitar o tráfego http de todas as mensagens em um bloco IP. Não podemos ajudá-lo com a configuração de nenhum host/provedor de hospedagem específico, mas provavelmente poderemos pesquisar na Internet.
Normalmente, vídeos de 1080p ou melhores não possuem áudio codificado. O áudio deve ser baixado separadamente e mesclado por meio de uma biblioteca de codificação. ffmpeg
é a ferramenta mais usada, com muitos módulos Node.js disponíveis. Use os objetos format
retornados de ytdl.getInfo
para fazer download de streams específicos e combiná-los para atender às suas necessidades. Veja example/ffmpeg.js para ver um exemplo de como fazer isso.
O YouTube atualiza seu site o tempo todo, não é raro que isso pare de funcionar. Se não funcionar para você e você estiver usando a versão mais recente, sinta-se à vontade para abrir um problema. Certifique-se de verificar se já não existe um com o mesmo erro.
Execute os testes em test/irl-test.js
para ter certeza de que isso é realmente um problema com o ytdl-core.
npm run test:irl
Esses testes não são ridicularizados, eles tentam começar a baixar alguns vídeos. Se isso falhar, é hora de depurar. Se o erro que você está recebendo for a decifração de assinatura, verifique lib/sig.js
. Caso contrário, o erro provavelmente estará em lib/info.js
.
npm instalar ytdl-core@mais recente
Ou para usuários do Yarn:
fio adicionar ytdl-core@mais recente
Certifique-se de instalar a versão mais recente do ytdl-core para acompanhar as correções mais recentes.
Se você estiver usando um bot ou aplicativo que usa ytdl-core, como ytdl-core-discord ou discord-player, pode depender de uma versão mais antiga. Para atualizar sua versão ytdl-core, essa biblioteca precisa atualizar seu arquivo package.json
, você não pode simplesmente alterar a versão no package.json
do seu projeto, o aplicativo ainda usará sua própria versão mais antiga do ytdl-core.
Procure em seu repositório para ver se eles já têm uma solicitação pull ativa que atualiza o ytdl-core. Caso contrário, abra um issue solicitando que atualizem o ytdl-core ou, melhor ainda, bifurque o projeto e envie uma solicitação pull com a versão atualizada.
Enquanto espera a mesclagem das solicitações pull, você pode apontar para sua ramificação em seu package.json
"ytdl-core-discord": "amishshah/ytdl-core-discord#dependabot/npm_and_yarn/ytdl-core-2.0.1"
O problema de usar uma versão desatualizada do ytdl-core tornou-se tão predominante que o ytdl-core agora verifica atualizações em tempo de execução e a cada 12 horas. Se encontrar uma atualização, ele imprimirá um aviso no console avisando para atualizar. Devido à natureza desta biblioteca, é importante usar sempre a versão mais recente à medida que o YouTube continua a ser atualizado.
Se desejar desabilitar esta verificação de atualização, você pode fazê-lo fornecendo a variável env YTDL_NO_UPDATE
.
env YTDL_NO_UPDATE=1 node myapp.js
ytdl - Um wrapper CLI disso.
pully - Outro invólucro cli voltado para formatos de alta qualidade.
ytsr - resultados da pesquisa de vídeos do YouTube.
ytpl - lista de reprodução do YouTube e resolvedor de canal.
Os testes são escritos com mocha
teste npm