Receba legendas do YouTube

Como pode programaticamente obter legendas de um vídeo do YouTube?

Inicialmente, tentei fazer isso off-line por meio da API do YouTube , mas, como parece, o YouTube proíbe buscar legendas de vídeos dos quais você não é o proprietário.

Agora estou tentando fazer online. Não encontrei os methods do YouTube Player Api para legendas, mas também tentei obter legendas do YouTube como TextTrack com videojs player da maneira que poderia ser feito para vídeos comuns , mas o seguinte não funciona:

          var myvideo = videojs( "myvideo", { "techOrder": ["youtube"], "src": "https://www.youtube.com/watch?v=jNhtbmXzIaM" }, function() { console.log('Tracks: ' + this.textTracks().length); //zero here :( /*var aTextTrack = this.textTracks()[0]; aTextTrack.on('loaded', function() { console.log('here it is'); cues = aTextTrack.cues(); console.log('Ready State', aTextTrack.readyState()) console.log('Cues', cues); }); aTextTrack.show();*/ });    

Também tentei uma solução desagradável ao analisar o IFrame do YouTube Player (há um div dentro dele com a linha de legendas atual), mas não funciona devido a problemas de segurança de incompatibilidade de origem.


Existe alguma maneira minha meta pode ser alcançada em java (para soluções offline) ou javascript (para soluções on-line)?

A forma como consegui obter as legendas de um vídeo do youtube é fazer uma solicitação simples para esta URL https://video.google.com/timedtext?lang= {LANG} & v = {videoId}

Eu tentei usar o Youtube API v3, mas no momento não funciona. Quando você faz uma solicitação com a API do YouTube v3 em um determinado vídeo, é necessário que a pessoa que enviou o vídeo aprove o download da legenda. Caso contrário, você terá um erro 403 no console. É normal ter o erro, o servidor não recebe a aprovação, então ele retorna um erro.

Você pode fazer o download das legendas de seu próprio vídeo com a API do YouTube v3.

Algo semelhante a isso fará o trabalho. A resposta virá em um formato XML:

  $.ajax({ type: "POST", url: "https://video.google.com/timedtext?lang=en&v=5MgBikgcWnY" }).done(function (response) { console.log(response); }).fail(function (response) { console.log(); }); 

Você provavelmente não precisa baixá-lo diretamente do youtube, existem serviços da web que você pode manipular.

Por exemplo, você pode acessar http://keepsubs.com/?url=insert_youtube_url aqui e fazer o download das legendas do site por meio do link encontrado neste caminho CSS para legendas em inglês:

 #dl > a:nth-child(2) 

Você poderia fazer isso em javascript usando o seguinte método:

 function myFunction(url_to_download){ var xmlHttp = new XMLHttpRequest(); xmlHttp.open( "GET", "http://keepsubs.com/?url=" + url_to_download, false ); xmlHttp.send( null ); var fake_html = document.createElement("div"); fake_html.insertAdjacentHTML('beforeend', xmlHttp.responseText); var url = fake_html.querySelector("#dl > a:nth-child(2)"); xmlHttp = new XMLHttpRequest(); xmlHttp.open( "GET", url.href, false ); xmlHttp.send( null ); console.log(xmlHttp.responseText); return xmlHttp.responseText; } myFunction("https://www.youtube.com/watch?v=dQw4w9WgXcQ"); 

Basicamente, esse método visita KeepSubs, localiza o URL de download de texto, obtém o texto no arquivo na url e o envia para o console.

Tenha em mente que, embora esta seja uma maneira de fazer isso, provavelmente há outras melhores que não são tão hackers. Também usar o serviço KeepSubs dessa maneira provavelmente não é ético. Mas isso é apenas para fins educacionais.