@@ -415,7 +415,7 @@ void YouTubeAPI::ResolveUrl(const std::wstring &url, const std::wstring &playlis
415415std::wstring YouTubeAPI::GetStreamUrl (const std::wstring &id) {
416416 std::wstring stream_url;
417417 if (!YouTubeDL::Force) {
418- std::wstring url2 (L" https://www.youtube.com/get_video_info?video_id=" + id + L" &el=detailpage &sts=16511 " );
418+ std::wstring url2 (L" https://www.youtube.com/get_video_info?video_id=" + id + L" &eurl=https%3A%2F%2Fyoutube.googleapis.com%2Fv%2F " + id + L" &sts=18389&html5=1 " );
419419 AimpHTTP::Get (url2, [&](unsigned char *data, int size) {
420420 if (char *streams = strstr ((char *)data, " player_response=" )) {
421421 streams += 16 ;
@@ -469,10 +469,11 @@ std::wstring YouTubeAPI::GetStreamUrl(const std::wstring &id) {
469469
470470 std::string stream;
471471 if (px.HasMember (" url" )) stream = px[" url" ].GetString ();
472- if (stream.empty () && px.HasMember (" cipher" )) {
472+ if (stream.empty () && ( px.HasMember (" cipher" ) || px. HasMember ( " signatureCipher " ) )) {
473473 std::string s, sig, sp = " signature" ;
474+ std::string cipher = px.HasMember (" cipher" )? px[" cipher" ].GetString () : px[" signatureCipher" ].GetString ();
474475
475- Tools::SplitString (px[ " cipher" ]. GetString () , " &" , [&](const std::string &token) {
476+ Tools::SplitString (cipher, " &" , [&](const std::string &token) {
476477 if (token.find (" url=" ) == 0 ) { stream = Tools::UrlDecode (token.substr (4 )); }
477478 else if (token.find (" s=" ) == 0 ) { s = Tools::UrlDecode (token.substr (2 )); YouTubeAPI::DecodeSignature (s); }
478479 else if (token.find (" sp=" ) == 0 ) { sp = Tools::UrlDecode (token.substr (3 )); }
@@ -525,12 +526,12 @@ std::wstring YouTubeAPI::GetStreamUrl(const std::wstring &id) {
525526
526527void YouTubeAPI::LoadSignatureDecoder () {
527528 static std::map<std::string, std::function<void (std::string &s, int param)>> mutatorTypes {
528- { " swap" , [](std::string &s, int param) { std::swap (s[0 ], s[param]); } },
529+ { " swap" , [](std::string &s, int param) { std::swap (s[0 ], s[param % s. size () ]); } },
529530 { " erase" , [](std::string &s, int param) { s.erase (0 , param); } },
530531 { " reverse" , [](std::string &s, int param) { std::reverse (s.begin (), s.end ()); } },
531532 };
532533
533- std::wstring ua (L" Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79 .0.3945.117 Safari/537.36" );
534+ std::wstring ua (L" Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81 .0.4044.138 Safari/537.36" );
534535 AimpHTTP::Get (L" https://www.youtube.com/\r\n User-Agent: " + ua, [&](unsigned char *data1, int ) {
535536 std::string player = Tools::FindBetween ((char *)data1, " \" jsUrl\" :\" " , " \" " );
536537 if (!player.empty ()) {
0 commit comments