Мой скрипт работает, но когда я открываю загруженный веб-сайт, я получаю сообщение об ошибке "файл не может быть воспроизведен, потому что его поврежденный"

Я сделал скрипт для загрузки веб файла 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('', $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>  
</form>
1 ответ

Вы не правильно извлекаете 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=***********&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=***********&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.

licensed under cc by-sa 3.0 with attribution.