【问题标题】:youtube videos downloading using php to serveryoutube视频使用php下载到服务器
【发布时间】:2023-11-02 01:24:01
【问题描述】:

我正在尝试将 Youtube 视频直接下载到托管空间。当我在本地服务器(如我的 PC 上的 xampp)上尝试脚本时,它运行良好。但是当我在 000webhosting 上尝试脚本时它不起作用。它显示这样的错误

See the problem i am having in this screen shot

错误如下。

呃哦,好像发生了错误:找不到 MP4 视频源。

以下是下载 Youtube 视频的 PHP 代码。

<?php

// What YouTube URL was provided to us?
$url = (string) @$_GET['url'];

/**
 * Define a function to extract a YouTube Video ID from a URL.
 *
 * @param    string    $url    A YouTube Video URL
 * @return    mixed            If successful, will return a string. If failed, will return NULL
 */

function getYouTubeVideoIdFromUrl( $url )
{
preg_match( "/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?&\"'>]+)/", $url, $matches );

// If this match exists.
if ( sizeof( $matches ) >= 2 && strlen( $matches[1] ) )
{
    return $matches[1];
}

return NULL;
}

/**
* Define a function to extract a YouTube encoded stream URL.
*
* @param    array    $streams    An array of streams provided to us from YouTube's "get_video_info" page.
* @return    mixed                If successful, will return the MP4 stream URL. If failed, will return NULL
 */

function getMP4FromEncodedStream( $streams )
{
foreach( $streams as $stream )
{
    // Decode this stream's data.
    parse_str( $stream, $data );

    // If we found our MP4 stream source.
    if ( stripos( $data['type'], 'video/mp4' ) === 0 )
    {
        return $data['url'];
    }
}

// We didn't find any, whoops..
return NULL;
}

// Try to validate their request.
try
{
// If an invalid YouTube URL was provided.
if ( ( $videoId = getYouTubeVideoIdFromUrl( $url ) ) === NULL )
{
    throw new Exception( 'An invalid YouTube Video URL was provided.' );
}

// Retrieve all information pertaining to this Video; more specifically, we're looking for the encoded video streams.
parse_str( file_get_contents( 'http://youtube.com/get_video_info?video_id=' . $videoId ), $videoData );

// If there's a problem extracting information.
if ( @$videoData['status'] == 'fail' )
{
    throw new Exception( $videoData['reason'] );
}

// Were we able to locate an encoded stream in MP4 format?
if ( ( $streamUrl = getMP4FromEncodedStream( explode( ',', $videoData['url_encoded_fmt_stream_map'] ) ) ) === NULL )
{
    throw new Exception( 'No MP4 video source was able to be located.' );
}

// Where will we be saving this Video?
$saveAs = dirname( __FILE__ ) . '/' . $videoId . '.mp4';

// Try to open the encoded video stream URL.
if ( $read = @fopen( $streamUrl, 'r' ) )
{
    // Open the file we want to save to.
    $write = @fopen( $saveAs, 'w' );

    // Write the stream to our file.
    $streamReturn = stream_copy_to_stream( $read, $write );

    // Close our files.
    @fclose( $read );
    @fclose( $write );

    // If we were unable to copy from stream.
    if ( $streamReturn === false )
    {
        throw new Exception( 'We were unable to copy this from the stream.' );
    }
}

// If our new file doesn't exist, we have a problem.
if ( !@file_exists( $saveAs ) )
{
    throw new Exception( 'We encountered an issue saving this Video.' );
}

// Everything saved properly, let them know there they can see their file.
print 'Your Video <strong>' . $videoId . '</strong> has been saved to <strong>' . $saveAs . '</strong>';
}
// If something went wrong.
catch( Exception $e )
{
print '<strong>Uh oh, it looks like an error occurred:</strong> ' . $e->getMessage( );
}

?>

您需要做的就是将此脚本复制到您的网络服务器,并使用以下 URL 之一运行该文件:

http://www.mywebserver.com/youtube-downloader.php?url=https://www.youtube.com/watch?v=dQw4w9WgXcQ
http://www.mywebserver.com/youtube-downloader.php?url=https://youtu.be/dQw4w9WgXcQ

一切正常,但视频没有下载到在线服务器,托管空间..

帮助.. 提前谢谢..

【问题讨论】:

  • @全部删除,看看有没有错误。
  • 你应该首先阅读Youtube terms of use
  • 好的..我会试试的
  • 删除@也不起作用
  • 代码是否在本地主机上工作?如果是,则 youtube 可能会阻止您的主机

标签: php video youtube hosting download


【解决方案1】:

YouTube 视频下载器库:

网址将如下所示:http://localhost/index.php?vid=VIDEOID

$_GET['vid'] = 'VIDEOID';        
$vid = $_GET['vid']; //the youtube video ID

parse_str(file_get_contents("http://youtube.com/get_video_info?video_id=" . $vid), $info); //decode the data

$videoData = json_decode($info['player_response'], true);
$videoDetails = $videoData['videoDetails'];
$streamingData = $videoData['streamingData'];
$streamingDataFormats = $streamingData['formats'];
//set video title 
$video_title = $videoDetails["title"];

print_r($streamingDataFormats[1]['url']);

$video = $streamingDataFormats[1]['url'];

file_put_contents("video-title-name.mp4", fopen($video, 'r'));

echo 'Youtube Video Download finished! Now check the file.';

【讨论】:

    【解决方案2】:

    尝试使用urlencode() 作为您的 youtube 网址

    http://php.net/manual/en/function.urlencode.php

    【讨论】:

      【解决方案3】:

      安装这个包 https://github.com/socialAPIS/YoutubeDownloader

      看这个例子 https://github.com/socialAPIS/YoutubeDownloader/blob/master/Examples/FetchPlayer.php

      $video = file_get_contents($video_url);
      file_put_contents($somedir . './videoplayback.mp4', $video);`
      

      【讨论】:

        【解决方案4】:

        您可以使用此软件包https://packagist.org/packages/athlon1600/youtube-downloader。这仅取决于 cURL,并且自 2020 年 5 月起定期更新。您可以通过 composer require athlon1600/youtube-downloader 安装它。

        【讨论】: