2014-01-26 5 views
-1

Я создал скрипт для загрузки файла веб-сайта youtube с URL-адреса, который вы скопировали в приложении. то он будет загружаться, но когда я его открываю, он говорит, что файл не может быть воспроизведен, потому что он поврежден. Как это исправить?Мой скрипт работает, но когда я открываю загруженный веб-сайт, я получаю сообщение об ошибке «файл не может быть воспроизведен из-за его повреждения»

<?php 
if ($_SERVER['REQUEST_METHOD'] == 'POST') 
{ 
    $url = (isset($_POST['url']) && !empty($_POST['url'])) ? $_POST['url'] : false; 

    if (!$url) { 
     echo "Please enter a URL"; 
    } else { 
     $source = file_get_contents($url); 
     $source = urldecode($source); 

     // Extract video title. 
     $vTitle_results_1 = explode('<title>', $source); 
     $vTitle_results_2 = explode('</title>', $vTitle_results_1[1]); 

     $title = trim(str_replace(' – YouTube', '', trim($vTitle_results_2[0]))); 

     // Extract video download URL. 
     $dURL_results_1 = explode('url_encoded_fmt_stream_map": "url=', $source); 
     $dURL_results_2 = explode('\u0026quality', $dURL_results_1[1]); 

     // Force download of video. 
     $file = str_replace(' ', '_', strtolower($title)).'.webm'; 

     header("Cache-Control: public"); 
     header("Content-Description: File Transfer"); 
     header("Content-Disposition: attachment; filename=$file"); 
     header("Content-Type: video/webm"); 
     header("Content-Transfer-Encoding: binary"); 

     readfile($dURL_results_2[0]); 

     exit; 
    } 
} 
?> 
<form method="post"> 
    <label for="url">URL:</label> <input type="text" name="url" value="" 
     id="url"> <input type="submit" name="submit" value="Download"> 
</form> 
+0

Ummm ... indent? –

+0

Посмотрите на двоичный дамп (с помощью hexeditor) и/или 'diff' на оригинал, чтобы узнать. – mario

ответ

0

Вы не правильно извлекаете URL-адрес видеоресурса.

Например: для видео http://www.youtube.com/watch?v=x9g_8jy-Sw4 значение $dURL_results_2[0] является

http://r1---sn-qxa7en7s.googlevideo.com/videoplayback?itag=22&mt=1392152819&upn=IjyEP3JHDpU&id=c7d83ff23cbe4b0e&source=youtube&sver=3&expire=1392179297&key=yt5&ip=59.89.130.203&mv=m&fexp=917000,912302,932260,914088,916626,937417,913434,936910,936913&ms=au&sparams=id,ip,ipbits,itag,ratebypass,source,upn,expire&ratebypass=yes&ipbits=0\u0026itag=22\u0026fallback_host=tc.v8.cache3.googlevideo.com\u0026sig=1F94BC0A23F1708BCAABF48B95F250698656ADB6.92D86F92762DB485F4E2EB770CAD6E95C5706DBA\u0026type=video/mp4; codecs="avc1.64001F, mp4a.40.2" 

, который не является правильным URL.

Он должен быть дополнительно обработан для подписи (также шифровальную подпись, если присутствует) и следующую часть:

\u0026itag=22\u0026fallback_host=tc.v8.cache3.googlevideo.com\u0026sig=1F94BC0A23F1708BCAABF48B95F250698656ADB6.92D86F92762DB485F4E2EB770CAD6E95C5706DBA\u0026type=video/mp4; codecs="avc1.64001F, mp4a.40.2" 

следует заменить

&signature=1F94BC0A23F1708BCAABF48B95F250698656ADB6.92D86F92762DB485F4E2EB770CAD6E95C5706DBA 

Таким образом, окончательный и правильный URL загрузки является

http://r1---sn-qxa7en7s.googlevideo.com/videoplayback?itag=22&mt=1392152819&upn=IjyEP3JHDpU&id=c7d83ff23cbe4b0e&source=youtube&sver=3&expire=1392179297&key=yt5&ip=59.89.130.203&mv=m&fexp=917000,912302,932260,914088,916626,937417,913434,936910,936913&ms=au&sparams=id,ip,ipbits,itag,ratebypass,source,upn,expire&ratebypass=yes&ipbits=0&signature=1F94BC0A23F1708BCAABF48B95F250698656ADB6.92D86F92762DB485F4E2EB770CAD6E95C5706DBA 

Также позаботьтесь о типе mime, так как вы ожидаете этого файла это .webm. но это может быть не каждый раз. вы можете легко проверить это со значением type на карте url.