Get direct link videos from Vimeo in PHP

后端 未结 2 920
你的背包
你的背包 2021-02-06 04:30

I want a direct link to videos from Vimeo with a PHP script. I managed to find them manually, but my PHP script does not work. Here is the initiative: For example I took this vi

2条回答
  •  无人及你
    2021-02-06 05:22

    The algorithm looks like this:

    • Input data: vimeoUrl.
    • content = getRemoteContent(vimeoUrl).
    • Parse content to find and extract the value from data-config-url attribute.
    • Navigate to data-config-url and load the content as JSON Object: $video = json_decode($this->getRemoteContent($video->getAttribute('data-config-url')));
    • Return $video->request->files->h264->sd->url — this will return a direct link for SD quality video.

    Here is my simple class, that working for this moment.

    class VideoController
    {
    
        /**
         * @var array Vimeo video quality priority
         */
        public $vimeoQualityPrioritet = array('sd', 'hd', 'mobile');
    
        /**
         * @var string Vimeo video codec priority
         */
        public $vimeoVideoCodec = 'h264';
    
        /**
         * Get direct URL to Vimeo video file
         * 
         * @param string $url to video on Vimeo
         * @return string file URL
         */
        public function getVimeoDirectUrl($url)
        {
            $result = '';
            $videoInfo = $this->getVimeoVideoInfo($url);
            if ($videoInfo && $videoObject = $this->getVimeoQualityVideo($videoInfo->request->files))
            {
                $result = $videoObject->url;
            }
            return $result;
        }
    
        /**
         * Get Vimeo video info
         * 
         * @param string $url to video on Vimeo
         * @return \stdClass|null result
         */
        public function getVimeoVideoInfo($url)
        {
            $videoInfo = null;
            $page = $this->getRemoteContent($url);
            $dom = new \DOMDocument("1.0", "utf-8");
            libxml_use_internal_errors(true);
            $dom->loadHTML('' . "\n" . $page);
            $xPath = new \DOMXpath($dom);
            $video = $xPath->query('//div[@data-config-url]');
            if ($video)
            {
                $videoObj = json_decode($this->getRemoteContent($video->item(0)->getAttribute('data-config-url')));
                if (!property_exists($videoObj, 'message'))
                {
                    $videoInfo = $videoObj;
                }
            }
            return $videoInfo;
        }
    
        /**
         * Get vimeo video object
         * 
         * @param stdClass $files object of Vimeo files
         * @return stdClass Video file object
         */
        public function getVimeoQualityVideo($files)
        {
            $video = null;
            if (!property_exists($files, $this->vimeoVideoCodec) && count($files->codecs))
            {
                $this->vimeoVideoCodec = array_shift($files->codecs);
            }
            $codecFiles = $files->{$this->vimeoVideoCodec};
            foreach ($this->vimeoQualityPrioritet as $quality)
            {
                if (property_exists($codecFiles, $quality))
                {
                    $video = $codecFiles->{$quality};
                    break;
                }
            }
            if (!$video)
            {
                foreach (get_object_vars($codecFiles) as $file)
                {
                    $video = $file;
                    break;
                }
            }
            return $video;
        }
    
        /**
         * Get remote content by URL
         * 
         * @param string $url remote page URL
         * @return string result content
         */
        public function getRemoteContent($url)
        {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
            curl_setopt($ch, CURLOPT_TIMEOUT, 20);
            curl_setopt($ch, CURLOPT_HEADER, false);
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
            curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
            curl_setopt($ch, CURLOPT_USERAGENT, 'spider');
            $content = curl_exec($ch);
    
            curl_close($ch);
    
            return $content;
        }
    
    }
    

    Using:

    $video = new VideoController;
    var_dump($video->getVimeoDirectUrl('http://vimeo.com/90747156'));
    

提交回复
热议问题