<?php /** * @author Rabotyahoff * @version 0.2 * @license BSD * * This class can parce link to page with video to uniq ID. * It can get preview images and embed-code by ID. * Now it supports youtube.com, vimeo.com and rutube.ru. * * site: http://ra-project.net/my_classes/c_video_providers * email: rabotyahoff@gmail.com * * date: 2012.02.05 * first release * * date: 2013.01.03 * * fix rutube * + title, descrition, duration * */
/* * base class of video provider */ abstract class a_video_provider{ protected $video_id=false; protected $cache_xml=array();
function __construct($video_id=false){ if ($video_id!==false) $this->set_video_id($video_id); }
/** * * @param string $video_id * @return a_video_provider */ function set_video_id($video_id){ $this->video_id=$video_id; return $this; }
/** * * @param string $url * @return SimpleXMLElement */ protected function read_remote_xml($url){ if (empty($this->cache_xml[$url])){ $this->cache_xml[$url]=simplexml_load_file($url); } return $this->cache_xml[$url]; }
/** * @return string */ abstract function get_url_watch(); /** * @return string */ abstract function get_embed(); /** * @return array */ abstract function get_url_img_preview(); /** * @return array */ abstract function get_info(); /** * @return array */ abstract function get_regexps(); }
/*Begin video providers*/ class c_video_provider_youtube extends a_video_provider {
function get_url_watch(){ return 'http://www.youtube.com/watch?v='.$this->video_id; }
function get_embed(){ return '<iframe width="560" height="315" src="http://www.youtube.com/embed/'.$this->video_id.'" frameborder="0" webkitAllowFullScreen="webkitAllowFullScreen" mozallowfullscreen="mozallowfullscreen" allowfullscreen="allowfullscreen"></iframe>'; }
function get_url_img_preview(){ $result=array(); $result['small'] = 'http://img.youtube.com/vi/'.$this->video_id.'/default.jpg'; $result['medium'] = 'http://img.youtube.com/vi/'.$this->video_id.'/hqdefault.jpg'; $result['large'] = 'http://img.youtube.com/vi/'.$this->video_id.'/hqdefault.jpg';
return $result; }
function get_info(){ $result=false;
$content = file_get_contents("http://youtube.com/get_video_info?video_id=".$this->video_id); if (!empty($content)){ parse_str($content, $arr); if (!empty($arr)){ $result=array(); $result['title']=$arr['title']; $result['description'] = ''; $result['duration']=$arr['length_seconds']; } }
return $result; }
function get_regexps(){ $start="(?:\/|\s|^)(?:www\.)?"; $result=array(); $result[]=$start."youtube\.com\/watch\/?\?v=([A-Za-z0-9_-]+)"; $result[]=$start."youtu.be\/([A-Za-z0-9_-]+)"; return $result; } } class c_video_provider_vimeo extends a_video_provider {
function get_url_watch(){ return 'http://vimeo.com/'.$this->video_id; }
function get_embed(){ return '<iframe width="400" height="225" src="http://player.vimeo.com/video/'.$this->video_id.'?title=0&byline=0&portrait=0" webkitAllowFullScreen="webkitAllowFullScreen" mozallowfullscreen="mozallowfullscreen" allowfullscreen="allowfullscreen"></iframe>'; }
protected function _url_xml(){ return 'http://vimeo.com/api/v2/video/'.$this->video_id.'.xml'; }
function get_url_img_preview(){ $result=false; $xml = $this->read_remote_xml($this->_url_xml()); if ($xml) { $result = array(); $result['small'] = (string) $xml->video->thumbnail_small; $result['medium'] = (string) $xml->video->thumbnail_medium; $result['large'] = (string) $xml->video->thumbnail_large; } return $result; }
function get_info(){ $result=false; $xml = $this->read_remote_xml($this->_url_xml()); if ($xml) { $result = array(); $result['title'] = (string) $xml->video->title; $result['description'] = strip_tags((string) $xml->video->description); $result['duration']=(int) $xml->video->duration; } return $result; }
function get_regexps(){ $start="(?:\/|\s|^)(?:www\.)?"; $result=array(); $result[]=$start."vimeo.com\/(\d+)"; return $result; } } class c_video_provider_rutube extends a_video_provider {
function get_url_watch(){ return 'http://rutube.ru/video/'.$this->video_id.'.html'; }
protected function _url_xml(){ return "http://rutube.ru/cgi-bin/xmlapi.cgi?rt_mode=movie&rt_movie_id=".$this->video_id."&utf=1"; }
function get_embed(){ $result=false; $xml = $this->read_remote_xml($this->_url_xml()); if ($xml) { $result = (string) $xml->html; } return $result; }
function get_url_img_preview(){ $result=false; $xml = $this->read_remote_xml($this->_url_xml()); if ($xml) { $result=array(); $result['small'] = (string) $xml->thumbnail_url; $result['medium'] = (string) $xml->thumbnail_url; $result['large'] = (string) $xml->thumbnail_url; } return $result; }
function get_info(){ $result=false; $xml = $this->read_remote_xml($this->_url_xml()); if ($xml) { $result = array(); $result['title'] = (string) $xml->title; $result['description'] = strip_tags((string) $xml->description); $result['duration']=(int) $xml->duration; } return $result; }
function get_regexps(){ $start="(?:\/|\s|^)(?:www\.)?"; $result=array(); $result[]=$start."rutube.ru\/video\/([A-Za-z0-9_-]+)\/"; $result[]=$start."rutube.ru\/video\/([A-Za-z0-9_-]+)"; return $result; } } class c_video_provider_dailymotion extends a_video_provider {
function get_url_watch(){ return 'http://www.dailymotion.com/video/'.$this->video_id; }
protected function _url_xml(){ return "http://www.dailymotion.com/services/oembed?format=xml&url=".$this->get_url_watch(); }
function get_embed(){ //return '<iframe frameborder="0" width="480" height="270" src="http://www.dailymotion.com/embed/video/'.$this->video_id.'" webkitAllowFullScreen="webkitAllowFullScreen" mozallowfullscreen="mozallowfullscreen" allowfullscreen="allowfullscreen"></iframe>'; $result=false;
$xml = $this->read_remote_xml($this->_url_xml()); if ($xml) { $result = (string) $xml->html; } return $result; }
function get_url_img_preview(){ $result=false; $xml = $this->read_remote_xml($this->_url_xml()); if ($xml) { $result = array(); $result['small'] = (string) $xml->thumbnail_url; $result['medium'] = (string) $xml->thumbnail_url; $result['large'] = (string) $xml->thumbnail_url; } return $result; }
function get_info(){ $result=false; $xml = $this->read_remote_xml($this->_url_xml()); if ($xml) { $result = array(); $result['title'] = (string) $xml->title; $result['description'] = ''; $result['duration']=''; } return $result; }
function get_regexps(){ $start="(?:\/|\s|^)(?:www\.)?"; $result=array(); $result[]=$start."dailymotion.com\/([\/A-Za-z0-9_-]*)video\/([A-Za-z0-9_-]+)"; return $result; } } /*End video providers*/
class c_video_providers { public static $provider_youtube='YOUTUBE'; public static $provider_vimeo='VIMEO'; public static $provider_rutube='RUTUBE'; public static $provider_dailymotion='DAILYMOTION'; public $provider_ids=array();
function __construct(){ $this->provider_ids[]=c_video_providers::$provider_youtube; $this->provider_ids[]=c_video_providers::$provider_vimeo; $this->provider_ids[]=c_video_providers::$provider_rutube; $this->provider_ids[]=c_video_providers::$provider_dailymotion; }
/** * @param string $provider_id * @return boolean|a_video_provider */ protected function get_provider($provider_id){ $o_video_provider=false; switch ($provider_id){ case c_video_providers::$provider_youtube: $o_video_provider=new c_video_provider_youtube(); break; case c_video_providers::$provider_vimeo: $o_video_provider=new c_video_provider_vimeo(); break; case c_video_providers::$provider_rutube: $o_video_provider=new c_video_provider_rutube(); break; case c_video_providers::$provider_dailymotion: $o_video_provider=new c_video_provider_dailymotion(); break; } return $o_video_provider; }
/** * * @param string $video_code 'YOUTUBE:zlOYV3vMy8o' * @return boolean|array */ function get_video_info($video_code) { $tmp=explode(':', $video_code); $provider_id=strtoupper($tmp[0]); $video_id=$tmp[1];
$o_video_provider=$this->get_provider($provider_id); if ($o_video_provider===false) return false;
$o_video_provider->set_video_id($video_id);
$res=array(); $res['url_watch']=$o_video_provider->get_url_watch(); $res['embed']=$o_video_provider->get_embed(); $res['url_img_preview']=$o_video_provider->get_url_img_preview(); $res['info']=$o_video_provider->get_info();
return $res; }
/** * * @param string provider_idr * @param string provider_idd * @return string */ protected function make_video_code($provider_id, $video_id){ return $provider_id.':'.$video_id; }
/** * * @param string provider_id * @return string|boolean */ function get_video_code($link){ $prov_regexps=array(); foreach ($this->provider_ids as $provider_id){ $o_video_provider=$this->get_provider($provider_id); if ($o_video_provider===false) continue; $prov_regexps[$provider_id]=$o_video_provider->get_regexps(); }
foreach ($prov_regexps as $provider_id=>$regexps){ if (!empty($regexps)){ foreach ($regexps as $regexp){ $matches=array(); preg_match('/'.$regexp.'/i', $link, $matches); if (!empty($matches)){ return $this->make_video_code($provider_id, $matches[count($matches)-1]); } } } }
return false; }
}
|