>  기사  >  백엔드 개발  >  PHP 다양한 Youku, Tudou, 비디오 패키징 수업

PHP 다양한 Youku, Tudou, 비디오 패키징 수업

WBOY
WBOY원래의
2016-07-25 08:49:371074검색
PHP 다양한 동영상 컬렉션 패키지, Youku, Tudou, Tencent Video, 56, Sohu Video, Kuliu, Sina Video, LeTV...

나인 jigwang.com
  1. /**
  2. * 동영상
  3. *
  4. * @package
  5. * @version 1.3
  6. * @copyright 2011 - 2013
  7. *
  8. * 사용법
  9. * require_once "VideoUrlParser.class.php";
  10. * $urls[] = "http://v.youku.com/v_show/id_XMjI4MDM4NDc2.html";
  11. * $urls[] = "http://www.tudou.com/playlist/p/l13087099.html";
  12. * $urls[] = "http://www.tudou.com/programs/view /ufg-A3tlcxk/";
  13. * $urls[] = "http://v.ku6.com/special/show_4926690/Klze2mhMeSK6g05X.html";
  14. * $urls[] = "http:// www.56.com/u68/v_NjI2NTkxMzc.html";
  15. * $urls[] = "http://www.letv.com/ptv/vplay/1168109.html";
  16. * $urls[] = "http://video.sina.com.cn/v/b/46909166-1290055681.html";
  17. *
  18. * foreach($urls as $url){
  19. * $info = VideoUrlParser ::parse($url);
  20. * //var_dump($info);
  21. * echo "{ $info['title']}";
  22. * echo "
    ";
  23. * echo $info['object'];
  24. * echo "< br />";
  25. * }
  26. *
  27. *
  28. *
  29. * //优酷
  30. * http://v.youku.com/v_show/id_XMjU0NjY4OTEy.html
  31. *
  32. *
  33. * //酷六
  34. * http://v.ku6.com/special/show_3917484/x0BMXAbgZdQS6FqN.html
  35. *
  36. *
  37. * //土豆
  38. * http://www.tudou.com/playlist/p /a65929.html?iid=74905844
  39. *
  40. *
  41. * //56
  42. * http://www.56.com/u98/v_NTkyODY2NTU.html
  43. *
  44. *
  45. * //새로운浪播客
  46. * http://video.sina .com.cn/v/b/46909166-1290055681.html
  47. *
  48. *
  49. * //乐视
  50. * http://www.letv.com/ptv/vplay/1168109.html
  51. *
  52. */
  53. class VideoUrlparser
  54. {
  55. const USER_AGENT = "Mozilla/5.0(Windows; 유; 윈도우 NT 5.1; en-US) AppleWebKit/534.10(KHTML, like Gecko)
  56. Chrome/8.0.552.224 Safari/534.10";
  57. const CHECK_URL_VALID = "/(youku.com|tudou.com|ku6.com|56.com |letv.com|video.sina.com.cn|(my.)?tv.sohu.com|v.qq.com)/";
  58. /**
  59. * 구문 분석
  60. *
  61. * @param string $url
  62. * @param 혼합 $createObject
  63. * @static
  64. * @access public
  65. * @return void
  66. */
  67. 정적 공용 함수 구문 분석($url='', $createObject=true){
  68. $lowerurl = strtolower($url);
  69. preg_match(self::CHECK_URL_VALID, $lowerurl, $matches);
  70. if (!$matches) return false;
  71. switch($matches[1]){
  72. case 'youku.com':
  73. $data = self::_parseYouku($url);
  74. break;
  75. 케이스 'tudou.com':
  76. $data = self::_parseTudou($url);
  77. break;
  78. 케이스 'ku6.com':
  79. $data = self ::_parseKu6($url);
  80. break;
  81. case '56.com':
  82. $data = self::_parse56($url);
  83. break;
  84. case 'letv. com':
  85. $data = self::_parseLetv($url);
  86. break;
  87. 케이스 'video.sina.com.cn':
  88. $data = self::_parseSina($url );
  89. break;
  90. 케이스 'my.tv.sohu.com':
  91. 케이스 'tv.sohu.com':
  92. 케이스 'sohu.com':
  93. $data = self ::_parseSohu($url);
  94. break;
  95. case 'v.qq.com':
  96. $data = self::_parseQq($url);
  97. break;
  98. 기본값:
  99. $data = false;
  100. }
  101. if($data && $createObject) $data['object'] = "" ;
  102. $data 반환;
  103. }
  104. /**
  105. * 텐센트 동영상
  106. * http://v.qq.com/cover/o/o9tab7nuu0q3esh.html?vid=97abu74o4w3_0
  107. * http://v.qq.com/play/97abu74o4w3.html
  108. * http://v.qq.com/cover/d/dtdqyd8g7xvoj0o.html
  109. * http://v.qq.com/cover/d/dtdqyd8g7xvoj0o/9SfqULsrtSb.html
  110. * http: //imgcache.qq.com/tencentvideo_v1/player/TencentPlayer.swf?_v=20110829&vid=97abu74o4w3&autoplay=1&list=2&showcfg=1&tpid=23&title=First Live&adplay=1&cid=o9tab7nuu0q3esh
  111. */
  112. 비공개 정적 함수 _parseQq($url){
  113. if(preg_match("//play//", $url)){
  114. $html = self ::_fget($url);
  115. preg_match("/url=[^"] /", $html, $matches);
  116. if(!$matches); return false;
  117. $url = $matches[0];
  118. }
  119. preg_match("/vid=([^_] )/", $url, $matches);
  120. $vid = $matches[1];
  121. $html = self::_fget($url);
  122. // 쿼리
  123. preg_match("/flashvarss=s"([^;] )/s", $html, $matches);
  124. $ 쿼리 = $matches[1];
  125. if(!$vid){
  126. preg_match("/vids?=s?vids?||s?"(w )";/i", $html, $ 일치);
  127. $vid = $matches[1];
  128. }
  129. $query = str_replace('" vid "', $vid, $query);
  130. parse_str($query, $output );
  131. $data['img'] = "http://vpic.video.qq.com/{$$output['cid']}/{$vid}_1.jpg";
  132. $ data['url'] = $url;
  133. $data['title'] = $output['title'];
  134. $data['swf'] = "http://imgcache.qq.com /tencentvideo_v1/player/TencentPlayer.swf?".$query;
  135. return $data;
  136. }
  137. /*
  138. * 优酷网
  139. * http://v.youku .com/v_show/id_XMjI4MDM4NDc2.html
  140. * http://player.youku.com/player.php/sid/XMjU0NjI2Njg4/v.swf
  141. */
  142. 비공개 정적 함수 _parseYouku($url){
  143. preg_match("#id_(w )#", $url, $matches);
  144. if (empty($matches)){
  145. preg_match("#v_playlist/#", $url , $mat);
  146. if(!$mat) return false;
  147. $html = self::_fget($url);
  148. preg_match("#videoId2s*=s* '(w )'#", $html, $matches);
  149. if(!$matches) return false;
  150. }
  151. $link = "http://v.youku.com /player/getPlayList/VideoIDS/{$matches[1]}/timezone/ 08/version/5/source/out?password=&ran=2513&n=3";
  152. $retval = self::_cget( $link);
  153. if ($retval) {
  154. $json = json_decode($retval, true);
  155. $data['img'] = $json['data'][0 ]['logo'];
  156. $data['title'] = $json['data'][0]['title'];
  157. $data['url'] = $url;
  158. $data['swf'] = "http://player.youku.com/player.php/sid/{$matches[1]}/v.swf";
  159. // echo "< ;사전>"; var_dump($data);
  160. return $data;
  161. } else {
  162. return false;
  163. }
  164. }
  165. /**
  166. * 투도우
  167. * http://www.tudou.com/programs/view/Wtt3FjiDxEE/
  168. * http://www.tudou.com/v/Wtt3FjiDxEE/v.swf
  169. *
  170. * http://www.tudou.com/playlist/p/a65718.html?iid=74909603
  171. * http://www.tudou.com/l/G5BzgI4lAb8/&iid=74909603/v.
  172. */
  173. 비공개 정적 함수 _parseTudou($url){
  174. preg_match("#view/([-w] )/#", $url, $matches);
  175. if (empty($matches)) {
  176. if (strpos($url, "/playlist/") == false) return false;
  177. if(strpos($url, 'iid=') !== false){
  178. $quarr = 폭발("iid=", $lowerurl);
  179. if (empty($quarr[1])) return false;
  180. }elseif(preg_match("#p/l(d ).#", $lowerurl , $quarr)){
  181. if (empty($quarr[1])) return false;
  182. }
  183. $html = self::_fget($url);
  184. $html = iconv("GB2312", "UTF-8", $html);
  185. preg_match("/lid_codes=slcodes=s['"]([^'"] )/s", $html, $matches);
  186. $icode = $matches[1];
  187. preg_match("/iids=s.*?||s(d )/sx", $html, $matches);
  188. $iid = $matches[1];
  189. preg_match("/listDatas=s([{.*}])/sx", $html, $matches);
  190. $find = array("/n/", '/s/', "/:[^d"]w [^,]* ,/i", "/({|,)(w ):/");
  191. $replace = array("", "", ':"",', '\1"\2":' );
  192. $str = preg_replace($find, $replace, $matches[1]);
  193. //var_dump($str);
  194. $json = json_decode($str);
  195. / /var_dump($json);exit;
  196. if(is_array($json) || is_object($json) && !empty($json)){
  197. foreach($json을 $val로) {
  198. if ($val->iid == $iid) {
  199. break;
  200. }
  201. }
  202. }
  203. $data['img'] = $val-> pic;
  204. $data['title'] = $val->title;
  205. $data['url'] = $url;
  206. $data['swf'] = "http:// www.tudou.com/l/{$icode}/&iid={$iid}/v.swf";
  207. return $data;
  208. }
  209. $host = "www .tudou.com";
  210. $path = "/v/{$matches[1]}/v.swf";
  211. $ret = self::_fsget($path, $host);
  212. if (preg_match("#nLocation: (.*)n#", $ret, $mat)) {
  213. parse_str(parse_url(urldecode($mat[1]), PHP_URL_QUERY));
  214. $data['img'] = $snap_pic;
  215. $data['title'] = $title;
  216. $data['url'] = $url;
  217. $data ['swf'] = "http://www.tudou.com/v/{$matches[1]}/v.swf";
  218. return $data;
  219. }
  220. return false;
  221. }
  222. /**
  223. * Ku6.com
  224. * http://v.ku6.com/film/show_520/3X93vo4tIS7uotHg.html
  225. * http://v.ku6.com/special/show_4926690/Klze2mhMeSK6g05X.html
  226. * http://v.ku6.com/show/7US-kDXjyKyIInDevhpwHg...html
  227. * http://player.ku6.com/refer/3X93vo4tIS7uotHg/v.swf
  228. */
  229. 개인 정적 함수 _parseKu6($url){
  230. if(preg_match("/show_/", $url)){
  231. preg_match("#/([-w] ).html#", $url, $matches);
  232. $url = "http://v.ku6.com/fetchVideo4Player/{$matches[1 ]}.html";
  233. $html = self::_fget($url);
  234. if ($html) {
  235. $json = json_decode($html, true);
  236. if(!$json) return false;
  237. $data['img'] = $json['data']['picpath'];
  238. $data['title'] = $json[ 'data']['t'];
  239. $data['url'] = $url;
  240. $data['swf'] = "http://player.ku6.com/refer/{$ match[1]}/v.swf";
  241. return $data;
  242. } else {
  243. return false;
  244. }
  245. }elseif(preg_match("/show// ", $url, $matches)){
  246. $html = self::_fget($url);
  247. preg_match("/ObjectInfos?=s?([^n]*)};/si", $html, $matches);
  248. $str = $matches[1];
  249. // img
  250. preg_match("/covers?:s?"([^"] )"/", $str , $matches);
  251. $data['img'] = $matches[1];
  252. // 제목
  253. preg_match("/title"?s?:s?"([^"] ) "/", $str, $matches);
  254. $jsstr = "{"title":"{$matches[1]}"}";
  255. $json = json_decode($jsstr, true);
  256. $data['title'] = $json['title'];
  257. // url
  258. $data['url'] = $url;
  259. // 쿼리
  260. preg_match(" /"(vid=[^"] )"sname="flashVars"/s", $html, $matches);
  261. $query = str_replace("&", '&', $matches[1]) ;
  262. preg_match("///player.ku6cdn.com[^"'] /", $html, $matches);
  263. $data['swf'] = 'http:'.$matches[0 ].'?'.$query;
  264. return $data;
  265. }
  266. }
  267. /**
  268. * 56.com
  269. * http://www.56.com/u73/v_NTkzMDcwNDY.html
  270. * http://player.56.com/v_NTkzMDcwNDY.swf
  271. */
  272. 개인 정적 함수 _parse56($ url){
  273. preg_match("#/v_(w ).html#", $url, $matches);
  274. if (empty($matches)) return false;
  275. $link="http://vxml.56.com/json/{$matches[1]}/?src=out";
  276. $retval = self::_cget($link);
  277. if ($retval) {
  278. $json = json_decode($retval, true);
  279. $data['img'] = $json['info']['img'];
  280. $data['title'] = $json['info']['Subject'];
  281. $data['url'] = $url;
  282. $data['swf'] = "http: //player.56.com/v_{$matches[1]}.swf";
  283. return $data;
  284. } else {
  285. return false;
  286. }
  287. }
  288. /**
  289. * 르TV
  290. * http://www.letv.com/ptv/vplay/1168109.html
  291. * http://www.letv.com/player/x1168109.swf
  292. */
  293. 개인 정적 함수 _parseLetv($url){
  294. $html = self::_fget($url);
  295. preg_match("#http: //v.t.sina.com.cn/([^'"]*)#", $html, $matches);
  296. parse_str(parse_url(urldecode($matches[0]), PHP_URL_QUERY));
  297. preg_match("#vplay/(d )#", $url, $matches);
  298. $data['img'] = $pic;
  299. $data['title'] = $title;
  300. $data['url'] = $url;
  301. $data['swf'] = "http://www.letv.com/player/x{$matches[1]}.swf";
  302. return $data;
  303. }
  304. // 搜狐TV http://my.tv.sohu.com/u/vw/5101536
  305. 개인 정적 함수 _parseSohu($url){
  306. $html = self::_fget($url);
  307. $html = iconv("GB2312", "UTF-8", $html);
  308. preg_match_all("/og:(?:제목 |image|videosrc)"scontent="([^"] )"/s", $html, $matches);
  309. $data['img'] = $matches[1][1];
  310. $data['title'] = $matches[1][0];
  311. $data['url'] = $url;
  312. $data['swf'] = $matches[1][2] ;
  313. $data 반환;
  314. }
  315. /*
  316. * 新浪播客
  317. * http://video.sina.com.cn/v/b/48717043-1290055681. html
  318. * http://you.video.sina.com.cn/api/sinawebApi/outplayrefer.php/vid=48717043_1290055681_PUzkSndrDzXK l1lHz2stqkP7KQNt6nki2O0u1ehIwZYQ0/XM5GdatoG5ynSA9kEqDhAQJA4dPkm0 x4/s.swf
  319. */
  320. 개인 정적 함수 _parseSina( $url){
  321. preg_match("/(d )(?:-|_)(d )/", $url, $matches);
  322. $url = "http://video.sina.com .cn/v/b/{$matches[1]}-{$matches[2]}.html";
  323. $html = self::_fget($url);
  324. preg_match("/videos? :s?([^ $find = array("/n/", "/s*/", "/'/", "/ {([^:,] ):/", "/,([^:] ):/", "/:[^d"]w [^,]*,/i");
  325. $replace = array('', '', '"', '{"\1":', ',"\1":', ':"",');
  326. $str = preg_replace($find, $replace, $matches[1]);
  327. $arr = json_decode($str, true);
  328. $data['img'] = $arr['pic'];
  329. $ data['title'] = $arr['title'];
  330. $data['url'] = $url;
  331. $data['swf'] = $arr['swfOutsideUrl'];
  332. return $data;
  333. }
  334. /*
  335. * 통过 file_get_contents 获取内容
  336. */
  337. 개인 정적 함수 _fget($url=''){
  338. if(!$url) return false;
  339. $html = file_get_contents($url);
  340. // 判断是否gzip压缩
  341. if($dehtml = self::_gzdecode($html))
  342. return $dehtml;
  343. else
  344. return $html;
  345. }
  346. /*
  347. * 통过 fsockopen 获取内容
  348. */
  349. 개인 정적 함수 _fsget($ 경로='/', $host='', $user_agent=''){
  350. if(!$path || !$host) false 반환;
  351. $user_agent = $user_agent ? $user_agent : self::USER_AGENT;
  352. $out = <<GET $path HTTP/1.1
  353. 호스트: $host
  354. 사용자 에이전트: $user_agent
  355. 수락: text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8
  356. 수락 언어: zh-cn,zh;q=0.5
  357. 수락 문자 집합 : GB2312,utf-8;q=0.7,*;q=0.7rnrn
  358. HEADER;
  359. $fp = @fsockopen($host, 80, $errno, $errstr, 10);
  360. if ( !$fp) false 반환;
  361. if(!fputs($fp, $out)) return false;
  362. while ( !feof($fp) ) {
  363. $html .= fgets($fp, 1024);
  364. }
  365. fclose($fp);
  366. // 判断是否gzip压缩
  367. if($dehtml = self::_gzdecode($html))
  368. return $dehtml;
  369. else
  370. return $html;
  371. }
  372. /*
  373. * 通过 컬 获取内容
  374. */
  375. 개인 정적 함수 _cget($url='', $ user_agent=''){
  376. if(!$url) return;
  377. $user_agent = $user_agent ? $user_agent : self::USER_AGENT;
  378. $ch = 컬_init();
  379. 컬_setopt($ch, CURLOPT_URL, $url);
  380. 컬_setopt($ch, CURLOPT_HEADER, 0);
  381. if(strlen($user_agent)) 컬_setopt($ch, CURLOPT_USERAGENT, $user_agent);
  382. ob_start();
  383. 컬_exec($ch);
  384. $html = ob_get_contents();
  385. ob_end_clean();
  386. if(curl_errno($ch)){
  387. curl_close($ch);
  388. return false;
  389. }
  390. curl_close($ch);
  391. if(!is_string($html) || !strlen($html)){
  392. return false;
  393. }
  394. return $html;
  395. // 判断是否gzip压缩
  396. if($dehtml = self::_gzdecode($html))
  397. return $dehtml;
  398. else
  399. return $html;
  400. }
  401. 개인 정적 함수 _gzdecode($data) {
  402. $len = strlen ( $data );
  403. if ($len < 18 || strcmp ( substr ( $data, 0, 2 ) , "x1fx8b" )) {
  404. null을 반환합니다. // GZIP 형식 아님(RFC 1952 참조)
  405. }
  406. $method = ord ( substr ( $data, 2, 1 ) ); // 압축 방법
  407. $flags = ord ( substr ( $data, 3, 1 ) ); // 플래그
  408. if ($flags & 31 != $flags) {
  409. // 예약된 비트가 설정됨 -- RFC 1952에서는 허용되지 않음
  410. return null;
  411. }
  412. // 참고 : $mtime은 음수일 수 있습니다(PHP 정수 제한)
  413. $mtime = unpack ( "V", substr ( $data, 4, 4 ) );
  414. $mtime = $mtime [1];
  415. $ xfl = substr( $data, 8, 1 );
  416. $os = substr( $data, 8, 1 );
  417. $headerlen = 10;
  418. $extralen = 0;
  419. $extra = "";
  420. if ($flags & 4) {
  421. // 헤더에 EXTRA 데이터 접두사가 붙은 2바이트 길이
  422. if ($len - $headerlen - 2 < 8) {
  423. return false ; // 잘못된 형식
  424. }
  425. $extralen = unpack ( "v", substr ( $data, 8, 2 ) );
  426. $extralen = $extralen [1];
  427. if ($len - $headerlen - 2 - $extralen < 8) {
  428. false를 반환합니다. // 잘못된 형식
  429. }
  430. $extra = substr ( $data, 10, $extralen );
  431. $headerlen = 2 $extralen;
  432. }
  433. $filenamelen = 0;
  434. $filename = "";
  435. if ($flags & 8) {
  436. // 헤더의 C 스타일 문자열 파일 NAME 데이터
  437. if ($len - $headerlen - 1 < 8) {
  438. false를 반환합니다. // 잘못된 형식
  439. }
  440. $filenamelen = strpos ( substr ( $data, 8 $extralen ), chr ( 0 ) );
  441. if ($filenamelen === false || $len - $headerlen - $filenamelen - 1 < 8) {
  442. false를 반환합니다. // 잘못된 형식
  443. }
  444. $filename = substr ( $data, $headerlen, $filenamelen );
  445. $headerlen = $filenamelen 1;
  446. }
  447. $commentlen = 0 ;
  448. $comment = "";
  449. if ($flags & 16) {
  450. // 헤더의 C 스타일 문자열 COMMENT 데이터
  451. if ($len - $headerlen - 1 < 8) {
  452. false를 반환합니다. // 잘못된 형식
  453. }
  454. $commentlen = strpos ( substr ( $data, 8 $extralen $filenamelen ), chr ( 0 ) );
  455. if ($commentlen === false || $len - $headerlen - $commentlen - 1 < 8) {
  456. false를 반환합니다. // 잘못된 헤더 형식
  457. }
  458. $comment = substr ( $data, $headerlen, $commentlen );
  459. $headerlen = $commentlen 1;
  460. }
  461. $headercrc = "";
  462. if ($flags & 1) {
  463. // 헤더에 CRC32의 2바이트(최하위 순서)
  464. if ($len - $headerlen - 2 < 8) {
  465. 거짓을 반환; // 잘못된 형식
  466. }
  467. $calccrc = crc32 ( substr ( $data, 0, $headerlen ) ) & 0xffff;
  468. $headercrc = unpack ( "v", substr ( $data, $headerlen, 2 ) );
  469. $headercrc = $headercrc [1];
  470. if ($headercrc != $calccrc) {
  471. return false; // 잘못된 헤더 CRC
  472. }
  473. $headerlen = 2;
  474. }
  475. // GZIP FOOTER - PHP의 제한으로 인해 음수가 됩니다.
  476. $datacrc = unpack ( "V" , substr ( $data, - 8, 4 ) );
  477. $datacrc = $datacrc [1];
  478. $isize = unpack ( "V", substr ( $data, - 4 ) );
  479. $isize = $isize [1];
  480. // 압축 해제 수행:
  481. $bodylen = $len - $headerlen - 8;
  482. if ($bodylen < 1) {
  483. // 절대 이런 일이 일어나서는 안 됩니다 - 구현 버그!
  484. null 반환;
  485. }
  486. $body = substr ( $data, $headerlen, $bodylen );
  487. $data = "";
  488. if ($bodylen > 0) {
  489. switch ($method) {
  490. case 8 :
  491. // 현재 유일하게 지원되는 압축 방법:
  492. $data = gzinflate ( $body );
  493. break;
  494. default :
  495. // 알 수 없는 압축 방법
  496. return false;
  497. }
  498. } else {
  499. //...
  500. }
  501. if ($isize != strlen ( $data ) || crc32 ( $data ) != $datacrc) {
  502. // 형식이 잘못되었습니다! 길이 또는 CRC가 일치하지 않습니다!
  503. false 반환;
  504. }
  505. $data 반환;
  506. }
  507. }
  508. /*
  509. $url = "http://v.youku.com/v_show/id_XNjIxNjUyOTky.html";
  510. $obj = new VideoUrlparser();
  511. $data = $obj->parse($url);
  512. var_dump($data);
  513. */
코드 복사


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.