Как я могу расшифровать подпись и добавить URL-адрес YouTube Extracted в объекте c?

Я пытаюсь воспроизвести видео YouTube в своем приложении. все работает нормально. но когда я пытаюсь смотреть видео, содержащее контент с youtube. он не работает.

Я исследовал, что можно подумать, что вы должны шифровать и расшифровывать подпись и добавлять ее в URL?

Я не знаю, как decrypt signature в IOS?

http://www.youtube.com/get_video_info?video_id=uuZE_IRwLNI&el=vevo&ps=default&eurl=&gl=US&hl=en

stream

 {
    "fallback_host" = "tc.v12.cache7.googlevideo.com";
    itag = 22;
    quality = hd720;
    s = "8E6E5D13EB65FB653B173B94CB0BCC3A20853F5EDE8.5E2E87DF33EEDE165FEA90109D3C7D5DADA06B6BB60";
    type = "video/mp4; codecs=\"avc1.64001F, mp4a.40.2\"";
    url = "http://r7---sn-cvh7zn7r.googlevideo.com/videoplayback?pcm2fr=yes&sver=3&expire=1393773646&itag=22&id=bae644fc84702cd2&upn=SjZd81MudQs&sparams=gcr%2Cid%2Cip%2Cipbits%2Citag%2Cpcm2fr%2Cratebypass%2Csource%2Cupn%2Cexpire&ms=au&gcr=in&mt=1393747698&source=youtube&ratebypass=yes&ipbits=0&fexp=935620%2C919120%2C912523%2C932288%2C914084%2C916626%2C937417%2C937416%2C913434%2C932289%2C936910%2C936913%2C902907&mv=m&key=yt5&ip=103.250.162.79";
}

Когда я использую url, он не играет. есть ли какое-либо решение?

Ответ 1

Вы не можете просто использовать только данные get_video_info, вам также необходимо загрузить основную страницу видео, чтобы увидеть, какой файл html5player-XXXXX.js javascript загружен. Это будет определять, какие перестановки необходимы. См. http://www.jwz.org/hacks/youtubedown (написанный на Perl) в качестве примера - пропустите раздел, в котором говорится: "Это не крипто или хэш, а просто шифр с символьной перестановкой. Полная безопасность через неясность. Полный переход на члену". Это чувство, с которым я искренне согласен.

Ответ 2

Библиотека XCDYouTubeKit делает это с помощью очень простого API, который вы можете использовать.

NSString *videoIdentifier = @"uuZE_IRwLNI";
[[XCDYouTubeClient defaultClient] getVideoWithIdentifier:videoIdentifier completionHandler:^(XCDYouTubeVideo *video, NSError *error) {
    if (video)
    {
        // All URLs, with decrypted signature, are available in the `video.streamURLs` dictionary
    }
    else
    {
        // Handle error
    }
}];

Отказ от ответственности: Я автор XCDYouTubeKit.

Ответ 3

Немного бесстыдной саморекламы, я провел последние несколько недель, выясняя, как это сделали альтернативные версии программного обеспечения для JavaScript и perl, изначально использовала JavaScriptCore для его выполнения, но решила, что мне нужен чистый образец obj-C, поэтому я сделал один сам. Существует исчерпывающий комментарий о том, как все это работает в основном файле.

https://github.com/lechium/yourTube/blob/master/yourTube/KBYourTube.m

KBYourTube *tube = [[KBYourTube alloc] init];
NSArray *streamArray = [tube getVideoStreamsForID:@"_7nYuyfkjCk"];

Вернет

 {
"fallback_host" = "tc.v20.cache6.googlevideo.com";
format = "720p MP4";
itag = 22;
quality = hd720;
s = "771171A2777DE13D6CE5320C210DCCA29F018FC6DBA.A7630D3C26F2F70EEFEB25889E1A1B8805EC0616616";
title = "Lil+Wayne+-+She+Will+ft.+Drake";
type = "video%2Fmp4%3B+codecs%3D%22avc1.64001F%2C+mp4a.40.2%22";
url = "https://r15---sn-bvvbax-2iml.googlevideo.com/videoplayback?nh=EAI&fexp=9416126%2C9420452%2C9422596%2C9423662%2C9424859&ipbits=0&mime=video%2Fmp4&ratebypass=yes&itag=22&upn=8XDeh70fkMI&expire=1450776595&mt=1450754946&sparams=dur%2Cid%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cnh%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cupn%2Cexpire&key=yt6&id=o-AF5K6y8liVQ1S9iLjUHOcIBdnb4a8g-rgcFwGc0wuidq&mn=sn-bvvbax-2iml&mm=31&ms=au&mv=m&source=youtube&pl=16&dur=323.895&lmt=1417236324599143&ip=xx&requiressl=yes&sver=3&signature=671A2777DE73D6CE5320C210DCCA29F018FC1DBA.A7630D3C26F2F70EEFEB25889E1A1B8805EC0616&title=Lil+Wayne+-+She+Will+ft.+Drake";
},

Это должно быть в состоянии полностью вытеснить любой способ, с которого вы в настоящее время получаете информацию о видео для загрузки/воспроизведения, и заботится о расшифровке подписей для вас. Вы также можете довольно легко изменить код, чтобы просто использовать его для расшифровки подписей (но вам нужно позаботиться о том, чтобы использовать правильное значение временной метки при использовании get_video_info).