├── 1.png ├── inc ├── 2.gif ├── 6.png ├── homebg.jpg ├── iconfont.eot ├── iconfont.ttf ├── iconfont.woff ├── iconfont.css ├── iconfont.js ├── QueryList.php └── 4.js ├── favicon.ico ├── 支持1080P-4k-直播版本.zip ├── tracks.php ├── embed ├── tracks.php ├── index.php └── upgrade.php ├── lang.conf.php ├── ajax ├── api.php ├── autocomplete.php └── ajax.php ├── link.php ├── thumbnail.php ├── error.php ├── footer.php ├── stream.php ├── search.php ├── README.md ├── header.php ├── downvideo.php ├── vs.php ├── channel.php ├── content.php ├── index.php ├── watch.php ├── YouTubeDownloader.php ├── lang ├── lang.ch.php └── lang.en.php ├── install.php └── lib.php /1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hubs/you2php/master/1.png -------------------------------------------------------------------------------- /inc/2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hubs/you2php/master/inc/2.gif -------------------------------------------------------------------------------- /inc/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hubs/you2php/master/inc/6.png -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hubs/you2php/master/favicon.ico -------------------------------------------------------------------------------- /inc/homebg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hubs/you2php/master/inc/homebg.jpg -------------------------------------------------------------------------------- /inc/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hubs/you2php/master/inc/iconfont.eot -------------------------------------------------------------------------------- /inc/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hubs/you2php/master/inc/iconfont.ttf -------------------------------------------------------------------------------- /inc/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hubs/you2php/master/inc/iconfont.woff -------------------------------------------------------------------------------- /支持1080P-4k-直播版本.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hubs/you2php/master/支持1080P-4k-直播版本.zip -------------------------------------------------------------------------------- /tracks.php: -------------------------------------------------------------------------------- 1 | 7 | 8 | -------------------------------------------------------------------------------- /embed/tracks.php: -------------------------------------------------------------------------------- 1 | 7 | 8 | -------------------------------------------------------------------------------- /lang.conf.php: -------------------------------------------------------------------------------- 1 | 15 | -------------------------------------------------------------------------------- /ajax/api.php: -------------------------------------------------------------------------------- 1 | getDownloadLinks($u); 12 | echo json_encode($links); 13 | } 14 | ?> -------------------------------------------------------------------------------- /link.php: -------------------------------------------------------------------------------- 1 | 0){ 4 | exit(); 5 | } 6 | $str=strdecode($_GET['u'],EN2DEKEY); 7 | if(stripos($str,'youtu.be')!==false || stripos($str,'watch?v=')!==false ){ 8 | preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?&\"'>]+)/", $str, $matches); 9 | $str='./watch.php?v='.$matches[1]; 10 | header("Location:$str"); 11 | }else{ 12 | header("Location:$str"); 13 | } 14 | ?> 15 | 16 | -------------------------------------------------------------------------------- /ajax/autocomplete.php: -------------------------------------------------------------------------------- 1 | 0&&isset($_GET["q"])){ 5 | $q=$_SERVER["QUERY_STRING"]; 6 | }else{ 7 | exit(); 8 | } 9 | 10 | $url='https://suggestqueries.google.com/complete/search?hl='.$lang['YT_LANG'].'&ds=yt&client=youtube&hjson=t&cp=1&'.$q; 11 | if (!function_exists("curl_init")) { 12 | $f = file_get_contents($url); 13 | } else { 14 | $ch = curl_init(); 15 | curl_setopt($ch, CURLOPT_URL, $url); 16 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 17 | curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20); 18 | curl_setopt($ch, CURLOPT_REFERER, 'http://www.youtube.com/'); 19 | curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.91 Safari/534.30"); 20 | $f = curl_exec($ch); 21 | curl_close($ch); 22 | } 23 | echo $f; 24 | ?> 25 | -------------------------------------------------------------------------------- /thumbnail.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /embed/index.php: -------------------------------------------------------------------------------- 1 | 0){ header("Location: ../error.php"); exit();} include("../lib.php"); 3 | ?> 4 | 5 | 6 | 7 | 8 | 9 | /" /> 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 22 |
23 | 24 | 25 | -------------------------------------------------------------------------------- /error.php: -------------------------------------------------------------------------------- 1 | 8 | 9 |
11 |
12 |
13 |
14 | 15 |

16 |

17 |

18 |

19 |

20 |

21 |

22 |
23 | 24 |
25 |
26 | 27 |
28 | 29 | 30 | 33 | -------------------------------------------------------------------------------- /embed/upgrade.php: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | '.$lang['UPGRADE_TITLE'].''; 11 | ?> 12 | 13 | 14 | (int)$Posttime ) { 27 | 28 | echo $lang['UPGRADE_M1'].'
'; 29 | echo $lang['UPGRADE_M2'].$version.'
'; 30 | echo $lang['UPGRADE_M3'].$up['version'].'
'; 31 | echo $lang['UPGRADE_M4'].''.$up['links'].'
'; 32 | echo $lang['UPGRADE_M5'].$up['des']; 33 | } else{ 34 | echo $lang['UPGRADE_OK']; 35 | } 36 | ?> 37 | 38 | 39 | -------------------------------------------------------------------------------- /footer.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | 19 | 20 | 21 | 22 | 47 | 48 | -------------------------------------------------------------------------------- /stream.php: -------------------------------------------------------------------------------- 1 | getDownloadLinks($u); 16 | $file_path=$links['22']['url']; 17 | function read_body(&$ch,&$string){ 18 | global $loadedsize; 19 | $rtn=strlen($string); 20 | $loadedsize+=($rtn/1024); 21 | print($string); 22 | @ob_flush(); 23 | @flush(); 24 | if (0!=connection_status()) { 25 | curl_close($ch); 26 | exit(); 27 | } 28 | @$string = NULL; 29 | //@unset($string); 30 | return $rtn; 31 | } 32 | function read_head(&$ch,&$header){ 33 | 34 | if (!strpos($header,"Cache") && !strpos($header,"ocation") ) 35 | @header(substr($header,0,strpos($header,"\r"))); 36 | return strlen($header); 37 | } 38 | $header1 = array('Expect: ','Accept: */*'); 39 | //$_SERVER['HTTP_RANGE'] = 'bytes=3902905-'; 40 | if (isset($_SERVER['HTTP_RANGE'])) { 41 | $header1[] = 'Range: '.$_SERVER['HTTP_RANGE']; 42 | $header1[] = 'Referer: '.$file_path; 43 | } 44 | $header1[] = 'User-Agent: '.$_SERVER['HTTP_USER_AGENT']; 45 | 46 | $ch = curl_init(); 47 | curl_setopt($ch, CURLOPT_URL, $file_path); 48 | curl_setopt($ch, CURLOPT_TIMEOUT, 600); 49 | @curl_setopt($ch, CURLOPT_MAXREDIRS, 5); 50 | curl_setopt($ch, CURLOPT_HEADER, 0); 51 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 52 | @curl_setopt($ch, CURLOPT_FOLLOWLOCATION , true); 53 | curl_setopt($ch, CURLOPT_HTTPHEADER, $header1); 54 | curl_setopt($ch, CURLOPT_HEADERFUNCTION, "read_head"); // 55 | curl_setopt($ch, CURLOPT_WRITEFUNCTION, "read_body"); // 56 | //set_error_handler("customError"); 57 | @ob_clean(); 58 | curl_exec($ch); 59 | 60 | 61 | ?> -------------------------------------------------------------------------------- /search.php: -------------------------------------------------------------------------------- 1 | 19 |
20 |
21 |
22 | 23 |
24 | 25 | 26 |
47 |
48 | 49 | 50 | 51 |
52 | 61 |
62 |
63 | 64 | 67 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # (迫于压力,本项目停止维护,请尽快fork代码。2019年1月1日之后删除项目) 2 | # (迫于压力,本项目停止维护,请尽快fork代码。2019年1月1日之后删除项目) 3 | # (迫于压力,本项目停止维护,请尽快fork代码。2019年1月1日之后删除项目) 4 | # (迫于压力,本项目停止维护,请尽快fork代码。2019年1月1日之后删除项目) 5 | #部分视频无法播放临时解决方法 6 | 部分视频播放时提示 The media could not be loaded, either beca use the server or network failed or because the format is not supported. 7 | 由于youtube算法升级,之前解析抓取youtube下载链接的方法失效。导致部分视频无法播放。 8 | 9 | 解决方法参考https://github.com/You2php/you2php/issues/218#issuecomment-430182643 10 | 11 | #关于使用you2php网站搭建之后很快被墙的解决办法: 12 | 13 | 1.启用SSL加密传输。 14 | 15 | 2.启用http验证 16 | Nginx主机参考https://www.howtoing.com/setup-nginx-basic-http-authentication (从此页面搜索 :密码保护Nginx虚拟主机) 17 | apache主机参考 http://blog.51cto.com/wushank/1211202 18 | 19 | 3.编辑footer.php文件,去除程序版权(Powered by YOU2PHP),经过多次验证,证实了Gfw会通过检索源代码中的关键字Powered by YOU2PHP判断关键字来屏蔽某些站点。 20 | 21 | 4.不要广泛传播,自己使用, 22 | 23 | 5.国家代码不要填HK与tw,这些地区的热门内容会很不友好,容易被GFW。 24 | 25 | 做到这几点,被墙的几率基本低于10%。 26 | 27 | 28 | 低调使用,拒绝广泛传播,个人使用建议装在子目录,防止被搜索引擎爬虫嗅探到,切勿在中国大陆主机商提供的海外主机上搭建,不可绑定已备案域名,推荐狗爹几十元一年的虚拟主机,速度快完美运行(亲测) 29 | 30 | 开发者API(不翻墙下载youtube):https://ytcdn.bid/ 第三方提供 31 | 32 | 如果您没有虚拟主机和域名,可以通过申请freenom免费域名+000webhost免费空间搭建you2php。 33 | 具体教程: 34 | https://github.com/pigmanidea/you2php-000webhost 35 | 36 | 如果需要切换国家功能,请使用 https://github.com/hahadaba/YOU2PHP-GL-SELECTOR 37 | 38 | 如果您需要看1080p或者4k或者直播请使用这个版本(安装方法看压缩包内的说明) 39 | 1080p/4K 版本: 40 | 41 | https://raw.githubusercontent.com/You2php/you2php/master/%E6%94%AF%E6%8C%811080P-4k-%E7%9B%B4%E6%92%AD%E7%89%88%E6%9C%AC.zip 42 | 43 | 44 | ps:若部分视频播放不出来,多刷新几次,一般一两分钟之后即可正常播放!!! 45 | 在heroku上部署you2php: https://github.com/You2php/you2php-heroku 46 | 47 | # You2PHP 48 | ---- 49 | You2PHP是一个用PHP开发的Youtube流量代理脚本、通过对接谷歌api获取数据,可用来搭建Youtube视频镜像站、可实现长城之内观看Youtube。 50 | 请访问项目主页[https://you2php.github.io//](https://you2php.github.io/)查看更详细介绍。 51 | 52 | ![https://you2php.github.io/img/pic/jt1.png](https://you2php.github.io/img/pic/jt1.png) 53 | 54 | # 特点 55 | 使用You2PHP的成本非常低,只需要一个支持PHP环境的虚拟海外主机,上传代码简单设置即可立即使用。无论您使用的是虚拟主机,还是VPS,上传即可使用,无需数据库! 56 | 57 | You2PHP对接谷歌官方APi,实现了视频/频道搜索、视频在线播放 、频道/类别内容预览、视频下载等功能、浏览这些内容不需要您的设备上安装任何软件。 58 | 59 | You2PHP采用GPL开源协议发布,你可以自由的使用和修改代码,随时随地,访问一个URL即可观看全球视频。 60 | 请访问项目主页[https://you2php.github.io//](https://you2php.github.io/)查看更详细介绍。 61 | # 如何安装与使用 62 | 请查看You2PHP文档[https://you2php.github.io/doc/](https://you2php.github.io/doc/) 63 | 64 | 请在遵守当地相关法律法规的前提下使用本项目 65 | 66 | 本人拒绝为任何商业或非法目的提供任何技术支持 67 | 68 | 本项目仅为科研人员更方便地学习知识而创建, 请勿大范围传播 69 | # 程序截图 70 | 71 | ![https://you2php.github.io/img/11.png](https://you2php.github.io/img/11.png) 72 | ![https://you2php.github.io/img/22.png](https://you2php.github.io/img/22.png) 73 | ![https://you2php.github.io/img/33.png](https://you2php.github.io/img/33.png) 74 | ![https://you2php.github.io/img/55.png](https://you2php.github.io/img/55.png) 75 | 请在遵守当地相关法律法规的前提下使用本项目 76 | 77 | 本人拒绝为任何商业或非法目的提供任何技术支持 78 | 79 | 本项目仅为科研人员更方便地学习知识而创建, 请勿大范围传播 80 | 81 | -------------------------------------------------------------------------------- /header.php: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | <?php echo $headtitle ?> 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 67 | -------------------------------------------------------------------------------- /downvideo.php: -------------------------------------------------------------------------------- 1 | 0){ 3 | exit(); 4 | } 5 | @error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING); 6 | @ignore_user_abort(0); 7 | @set_time_limit(0); 8 | include('./YouTubeDownloader.php'); 9 | $yt = new YouTubeDownloader(); 10 | $u="https://www.youtube.com/watch?v=".$_GET['v']; 11 | $links = $yt->getDownloadLinks($u); 12 | switch ($_GET['quality']) 13 | { 14 | case "3GP144P": 15 | $file_path=$links['17']['url']; 16 | break; 17 | case "360P": 18 | $file_path=$links['18']['url']; 19 | break; 20 | case "720P": 21 | $file_path=$links['22']['url']; 22 | break; 23 | case "WebM360P": 24 | $file_path=$links['43']['url']; 25 | break; 26 | case "Unknown": 27 | $file_path=$links['36']['url']; 28 | break; 29 | } 30 | $url = trim($file_path); 31 | 32 | 33 | $urlArgs = parse_url($url); 34 | 35 | $host = $urlArgs['host']; 36 | $requestUri = $urlArgs['path']; 37 | 38 | if (isset($urlArgs['query'])) { 39 | $requestUri .= '?' . $urlArgs['query']; 40 | } 41 | 42 | $protocol = ($urlArgs['scheme'] == 'http') ? 'tcp' : 'ssl'; 43 | $port = $urlArgs['port']; 44 | 45 | 46 | 47 | 48 | 49 | if (empty($port)) { 50 | $port = ($protocol == 'tcp') ? 80 : 443; 51 | } 52 | 53 | $header = "{$_SERVER['REQUEST_METHOD']} {$requestUri} HTTP/1.1\r\nHost: {$host}\r\n"; 54 | 55 | unset($_SERVER['HTTP_HOST']); 56 | $_SERVER['HTTP_CONNECTION'] = 'close'; 57 | 58 | if ($_SERVER['CONTENT_TYPE']) { 59 | $_SERVER['HTTP_CONTENT_TYPE'] = $_SERVER['CONTENT_TYPE']; 60 | } 61 | 62 | foreach ($_SERVER as $x => $v) { 63 | if (substr($x, 0, 5) !== 'HTTP_') { 64 | continue; 65 | } 66 | $x = strtr(ucwords(strtr(strtolower(substr($x, 5)), '_', ' ')), ' ', '-'); 67 | $header .= "{$x}: {$v}\r\n"; 68 | } 69 | 70 | $header .= "\r\n"; 71 | 72 | $remote = "{$protocol}://{$host}:{$port}"; 73 | 74 | $context = stream_context_create(); 75 | stream_context_set_option($context, 'ssl', 'verify_host', false); 76 | 77 | $p = stream_socket_client($remote, $err, $errstr, 60, STREAM_CLIENT_CONNECT, $context); 78 | 79 | if (!$p) { 80 | exit; 81 | } 82 | 83 | fwrite($p, $header); 84 | 85 | $pp = fopen('php://input', 'r'); 86 | 87 | while ($pp && !feof($pp)) { 88 | fwrite($p, fread($pp, 1024)); 89 | } 90 | 91 | fclose($pp); 92 | 93 | $header = ''; 94 | 95 | $x = 0; 96 | $len = false; 97 | $off = 0; 98 | 99 | while (!feof($p)) { 100 | if ($x == 0) { 101 | $header .= fread($p, 1024); 102 | 103 | if (($i = strpos($header, "\r\n\r\n")) !== false) { 104 | $x = 1; 105 | $n = substr($header, $i + 4); 106 | $header = substr($header, 0, $i); 107 | $header = explode(PHP_EOL, $header); 108 | foreach ($header as $m) { 109 | if (preg_match('!^\\s*content-length\\s*:!is', $m)) { 110 | $len = trim(substr($m, 15)); 111 | } 112 | 113 | header($m); 114 | } 115 | $fname=$_GET['name'].'.'.$_GET['format']; 116 | header("Content-Disposition: attachment;filename=\"$fname\""); 117 | 118 | $off = strlen($n); 119 | echo $n; 120 | flush(); 121 | } 122 | } else { 123 | if ($len !== false && $off >= $len) { 124 | break; 125 | } 126 | $n = fread($p, 1024); 127 | $off += strlen($n); 128 | echo $n; 129 | flush(); 130 | } 131 | } 132 | 133 | fclose($p); 134 | ?> -------------------------------------------------------------------------------- /vs.php: -------------------------------------------------------------------------------- 1 | a$;^PzFpsxS9&d;!l;~M>2?N7G}`@?UJ@{FDI') { 8 | $key = sha1($key); 9 | $strLen = strlen($string); 10 | $keyLen = strlen($key); 11 | for ($i = 0; $i < $strLen; $i++) { 12 | $ordStr = ord(substr($string,$i,1)); 13 | if (@$j == $keyLen) { $j = 0; } 14 | $ordKey = ord(substr($key,$j,1)); 15 | @$j++; 16 | @$hash .= strrev(base_convert(dechex($ordStr + $ordKey),16,36)); 17 | } 18 | return 'Urls://'.$hash; 19 | } 20 | function strdecode($string,$key='09KxDsIIe|+]8Fo{YPa$;^PzFpsxS9&d;!l;~M>2?N7G}`@?UJ@{FDI') { 21 | $string= ltrim($string, 'Urls://'); 22 | $key = sha1($key); 23 | $strLen = strlen($string); 24 | $keyLen = strlen($key); 25 | for ($i = 0; $i < $strLen; $i+=2) { 26 | $ordStr = hexdec(base_convert(strrev(substr($string,$i,2)),36,16)); 27 | if (@$j == $keyLen) { @$j = 0; } 28 | $ordKey = ord(substr($key,@$j,1)); 29 | @$j++; 30 | @$hash .= chr($ordStr - $ordKey); 31 | } 32 | return $hash; 33 | } 34 | 35 | $yt=new YouTubeDownloader(); 36 | $u="https://www.youtube.com/watch?v=".$_GET['vv']; 37 | $links=$yt->getDownloadLinks($u); 38 | if($_GET['quality']=='720'){ 39 | $file_path=$links['22']['url']; 40 | } 41 | elseif(isset($_GET["uhash"])){ 42 | $file_path=strdecode($_GET["uhash"],'vEeUq6O}$HTX9$O'); 43 | } 44 | else{ 45 | $file_path=$links['18']['url']; 46 | } 47 | $url=trim($file_path); 48 | $urlArgs=parse_url($url); 49 | $host=$urlArgs['host']; 50 | $requestUri=$urlArgs['path']; 51 | if(isset($urlArgs['query'])){ 52 | $requestUri.='?'.$urlArgs['query']; 53 | } 54 | $protocol=($urlArgs['scheme']=='http')?'tcp': 55 | 'ssl'; 56 | $port=$urlArgs['port']; 57 | if(empty($port)){ 58 | $port=($protocol=='tcp')?80: 59 | 443; 60 | } 61 | $header="{$_SERVER['REQUEST_METHOD']} {$requestUri} HTTP/1.1\r\nHost: {$host}\r\n"; 62 | unset($_SERVER['HTTP_HOST']); 63 | $_SERVER['HTTP_CONNECTION']='close'; 64 | if($_SERVER['CONTENT_TYPE']){ 65 | $_SERVER['HTTP_CONTENT_TYPE']=$_SERVER['CONTENT_TYPE']; 66 | } 67 | foreach($_SERVER as $x=>$v){ 68 | if(substr($x,0,5)!=='HTTP_'){ 69 | continue; 70 | } 71 | $x=strtr(ucwords(strtr(strtolower(substr($x,5)),'_',' ')),' ','-'); 72 | $header.="{$x}: {$v}\r\n"; 73 | } 74 | $header.="\r\n"; 75 | $remote="{$protocol}://{$host}:{$port}"; 76 | $context=stream_context_create(); 77 | stream_context_set_option($context,'ssl','verify_host',false); 78 | $p=stream_socket_client($remote,$err,$errstr,60,STREAM_CLIENT_CONNECT,$context); 79 | if(!$p){ 80 | exit ; 81 | } 82 | fwrite($p,$header); 83 | $pp=fopen('php://input','r'); 84 | while($pp && !feof($pp)){ 85 | fwrite($p,fread($pp,1024)); 86 | } 87 | fclose($pp); 88 | $header=''; 89 | $x=0; 90 | $len=false; 91 | $off=0; 92 | while(!feof($p)){ 93 | if($x==0){ 94 | $header.=fread($p,1024); 95 | if(($i=strpos($header,"\r\n\r\n"))!==false){ 96 | $x=1; 97 | $n=substr($header,$i+4); 98 | $header=substr($header,0,$i); 99 | $header=explode(PHP_EOL,$header); 100 | foreach($header as $m){ 101 | if(stripos($m,'302')!==FALSE){ 102 | continue; 103 | } 104 | if(stripos($m,'Location')!==FALSE){ 105 | $LocationUrl=ltrim($m,"Location: "); 106 | $LocationUrl='./vs.php?uhash='.strencode($LocationUrl,'vEeUq6O}$HTX9$O'); 107 | header("Location: $LocationUrl"); 108 | exit(); 109 | continue; 110 | } 111 | if(preg_match('!^\\s*content-length\\s*:!is',$m)){ 112 | $len=trim(substr($m,15)); 113 | } 114 | header($m); 115 | } 116 | $fname=$_GET['vv'].'.mp4'; 117 | header("Content-Disposition: attachment;filename=\"$fname\""); 118 | $off=strlen($n); 119 | echo $n; 120 | flush(); 121 | } 122 | } 123 | else{ 124 | if($len!==false && $off>=$len){ 125 | break; 126 | } 127 | $n=fread($p,1024); 128 | $off+=strlen($n); 129 | echo $n; 130 | flush(); 131 | } 132 | } 133 | fclose($p); 134 | return ; 135 | ?> 136 | -------------------------------------------------------------------------------- /channel.php: -------------------------------------------------------------------------------- 1 | 14 |
15 |
16 |
17 |
18 |
19 | 20 |
21 | 22 |

23 | 25 |

26 | 36 | 37 |
38 |
39 |
40 |
41 | 42 |
43 |
44 |
45 |
46 | 47 | 48 | 49 |
50 |
51 | 59 | 76 |
77 | 82 |
83 | 84 | 85 | 86 |
87 |
88 | 89 |
90 |
91 | 92 | 93 | 94 | 97 | -------------------------------------------------------------------------------- /inc/iconfont.css: -------------------------------------------------------------------------------- 1 | 2 | @font-face {font-family: "iconfont"; 3 | src: url('iconfont.eot?t=1512725509910'); /* IE9*/ 4 | src: url('iconfont.eot?t=1512725509910#iefix') format('embedded-opentype'), /* IE6-IE8 */ 5 | url('data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAo0AAsAAAAADkQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAARAAAAFZW7kifY21hcAAAAYAAAAB5AAABxswt00dnbHlmAAAB/AAABhoAAAewplgqFWhlYWQAAAgYAAAALwAAADYPwD4yaGhlYQAACEgAAAAcAAAAJAfeA4hobXR4AAAIZAAAABMAAAAcG+kAAGxvY2EAAAh4AAAAEAAAABAFRAcybWF4cAAACIgAAAAfAAAAIAEaANRuYW1lAAAIqAAAAUUAAAJtPlT+fXBvc3QAAAnwAAAARAAAAFkxj1RLeJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2Bk/ss4gYGVgYOpk+kMAwNDP4RmfM1gxMjBwMDEwMrMgBUEpLmmMDgwVDzbwNzwv4EhhrmBoQEozAiSAwAyCw0heJzFkdsNgzAMRY/jgKoKMUlHYBBG4KvfjMVUXoP6kZ9OwI1OYl9ZThQDE6DOx+kgX4TQ4a6kr7zT72yev3w1P09Tu+47I0YUkqxYM+rM3r9Ff5l5TPLc1f9act9HFj9yDvyJRhFTMCmixloRkzItYgJ2FegPPGAYCQAAAHicVVVbjBxHFa1b1VVd/X53z87MzuxMz3Sv7fWs562Ns7MhOKv4EWGEDIkdTCwCCXnArhKtJWKj4OBgpLyQyeMjiSWE4AcpBgFCIiIgJMxHJMsiUfjgBxIC4gck4Attw+1dJYJRd/W9cx9Vdc69VYQT8p8/sNdZhQRkkfTJIXKcEBD7oG3TeWjlox7dB1GLR0loszzNW2ra7rFVSNoijAeTUZYIVThgQwOGrcEk79EcxqMZPQiDeB5grlb9hN+t++w50Ct542JxhH4bomZad2b7i8NLa+FgIZBnTd+f8/2npOBcUqo4NjycxBrXdFF8hzvV6PXmHtoEcy6vHrvLWqj5Zy6NvjjfTTSAxx+HoLZgf2/Nq3r4nKvGgT+nupasVK20E8LZ94xKYM5n7xL8UdzrW+yXbC/pkWXcZZZ3WdZWGbehCUzE0y6PB9PJMkzWIBb7YZLlWSfhuLN8Osn77OdMK25sKb6yVdzQuHj/NupIUEBRpKLSie+4/M3iH6Dpm39XYPW14l/0ucfk+4LCnzSoQkXK4i9V8MS14neawV9+hTKh/VUzDKXj/AJ8jbcbb4C1cE1IopSLZWcZJzWyTj5LNnCtqQ2qFyfDydQbTUpwow+0LMjyHky9DDlTWSxU9GwLNcJlz2A6g3acNGA6mKzCKIN0jDHjLE/LV6he+cYHYVbGs7CkHd0wfQTX31o+COB1XND4T4UEL/Ug4OHyAZ/uyAycTpQZaAFTCwbBnhqtL1X2u9LS4NyVKx7GXtlxHLsA7q96mGw9sp8wjJd1xuFgr1gvXeC6kFIU/VKmxI62z/DmnjUKj3he8bRyZMFymRSp1Kll1ffmNdcCTXaogFt+sJP7zjKuuApu8aoHq0ugucWfvcD4o2GUEGrI9w32E3aS3Eo+Ru4mnyfnyVfJs+QVco2QrjeelMClremkB1jCqViGzIa4CS0bIi9EWBqQxMP+YIIoTlv/qwx3Plg3ab/dg2UYquL/lOk+3vJa6gzyLG8hGR4y0IrLekr7AUMTR5Yw3WANoe8Bz3cnxj+mkwxNEXLYw+BRhm2m7iqlHIVxglPvUDseZezHQDnVRPH2OaG4gXjmAKX/1nxdyB8Vv7eCwJoxS43n7JquWgy2qCUjVAxU1oWGkdsPqTZXTE3ht3OF0lIxdCYOC3bvIabcz5Ttq0xfAVCEvv2SFgPEGr1f14EC0MXtn9HbijNbKmdCV5QtVREWPHBBtVUmnlC4zhV2QdUhCewYl2hrVIlcvwK6o+/thA1db/idvfqE7qOKLah6VfMMkG8CXFSE7/BPQ2Rtv2MGVkNGpiHr1ocCp8I8oDKGOzJV5QNhhTZPMhNr0XGKS54JYBkKwNniW/DAqRXEQIcVZlt8/biimLZynGnCHmElxSlA1ZW2rjvSqwDNfKlpsrFKfdcJYCWVGpE7vfg2fZc0yBK5Cfvx4+Rz5Eny9fL8mNE8w+Mv2yWtpLQskgmqeR9ElmOlTOIELX2GNhHv2tQ+hoxQikOh9qeihzXQABS76I9FqZZH63ASq0h2n2U7p2tJ/LQMSWLUSzum6uM8K0DfqSjCqy2dEy0q2ejUPRfZ2Gbh9Y1H/zbM7mwXv9l4nrHnNzZfoPSFzfkvNDgYjVu30nT6cDeqV8O5Wj36lOpI5jqIJzyoWZR9RTNs2zhqKZbhLx4yEbPQMXTDfmR/KBTGAtf0WfexO+AbImCrCwstrs/VOrPa4jPy6Bn65XuEPPmZ0yeU4ho7deTIvapy/PDRL0lIwvOSLgWt+tLgSf4GDdN5BnFaZYc5WK5BTVf8FgzJNquqHdr6J1XdAkikyijzTWQD7wVRu6V/szD0mgdG8PSzbkmN2OHnh/Q9EpMm3mAr5KPkDuRmkGDLIPKIm1r2y2Ba0pEPEPM2gq+WQ6nwXTfkDfsqQZduaRmWpuGHEn3JcZLvP3rhNfaRm5oPzQ/rjq0Buzz2oiit13/t1+udMKRfYy8+uHmZ0subSS85kSzfXHzXDALTD8MX8YIz/SiiDpzeouybG7P7Fu8ecx2arfsunYjaET7Hdj//PH2e0vOncdRE71h610m/EgQVf3ck5L8rEiJzAAB4nGNgZGBgAGLRU8fc4/ltvjJwszCAwLWAWlYE/f8iCwNzFJDLwcAEEgUADNgJKAB4nGNgZGBgbvjfwBDDwgACQJKRARWwAwBHDQJweJxjYWBgYH7JwMDCgIkBFrMBBQAAAAAAAHYAygFuApADYAPYeJxjYGRgYGBnOMHAyQACTEDMBYQMDP/BfAYAHV4B7wB4nGWPTU7DMBCFX/oHpBKqqGCH5AViASj9EatuWFRq911036ZOmyqJI8et1ANwHo7ACTgC3IA78EgnmzaWx9+8eWNPANzgBx6O3y33kT1cMjtyDRe4F65TfxBukF+Em2jjVbhF/U3YxzOmwm10YXmD17hi9oR3YQ8dfAjXcI1P4Tr1L+EG+Vu4iTv8CrfQ8erCPuZeV7iNRy/2x1YvnF6p5UHFockikzm/gple75KFrdLqnGtbxCZTg6BfSVOdaVvdU+zXQ+ciFVmTqgmrOkmMyq3Z6tAFG+fyUa8XiR6EJuVYY/62xgKOcQWFJQ6MMUIYZIjK6Og7VWb0r7FDwl57Vj3N53RbFNT/c4UBAvTPXFO6stJ5Ok+BPV8bUnV0K27LnpQ0kV7NSRKyQl7WtlRC6gE2ZVeOEXpc0Yk/KGdI/wAJWm7IAAAAeJxjYGKAAC4G7ICdkYmRmZGFkZWRjZGdkYOBsYKrsDA7Py89KzMxj8nEgCMpMycThFnLUzOT8tmAZEVmHgMDABwzDVc=') format('woff'), 6 | url('iconfont.ttf?t=1512725509910') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ 7 | url('iconfont.svg?t=1512725509910#iconfont') format('svg'); /* iOS 4.1- */ 8 | } 9 | 10 | .iconfont { 11 | font-family:"iconfont" !important; 12 | font-size:16px; 13 | font-style:normal; 14 | -webkit-font-smoothing: antialiased; 15 | -moz-osx-font-smoothing: grayscale; 16 | } 17 | 18 | .icon-qqkongjian:before { content: "\e603"; } 19 | 20 | .icon-40:before { content: "\e6b0"; } 21 | 22 | .icon-bilibili:before { content: "\e600"; } 23 | 24 | .icon-weibo:before { content: "\e602"; } 25 | 26 | .icon-weixin:before { content: "\e601"; } 27 | 28 | -------------------------------------------------------------------------------- /content.php: -------------------------------------------------------------------------------- 1 | 34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 | '; 42 | }elseif ($cont=="history") { 43 | echo '
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
'; 52 | } 53 | 54 | ?> 55 | 56 |
57 |
58 |
59 | 60 | 61 |
62 |
63 |
67 | '; 70 | break; 71 | 72 | case 'DMCA': 73 | echo '
74 | '; 77 | break; 78 | 79 | case 'api': 80 | echo '
81 | '; 84 | break; 85 | case 'video': 86 | echo '
87 | '; 91 | break; 92 | 93 | case 'trending': 94 | echo '
95 | '; 98 | break; 99 | 100 | case 'category': 101 | switch ($order) { 102 | case 'date': 103 | $date1 = 'selected'; 104 | break; 105 | case 'viewCount'; 106 | $viewCount = 'selected'; 107 | break; 108 | default: 109 | $relevance = 'selected'; 110 | } 111 | 112 | if(isset($_GET['sortid'])){echo '
'.categorieslist($sortid).'
';} 113 | echo '
'; 118 | echo '
'; 119 | break; 120 | 121 | }?> 122 | 123 |
124 | 125 |
126 | 127 | 128 | 129 | -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | ]+)/", $_GET['v'], $matches); 14 | $str='./watch.php?v='.$matches[1]; 15 | header("Location:$str"); 16 | exit(); 17 | }else{ 18 | $str='./search.php?q='.$_GET['v']; 19 | header("Location: $str"); 20 | exit(); 21 | } 22 | } 23 | ?> 24 |
25 | 26 |
27 |
28 |
29 |
30 |
31 |
32 | 33 | 34 |
35 |
36 | 37 | 38 |
39 |
40 | 41 | 42 |
43 |
44 |
45 | '.$lang['INDEX_HOME'].''; 47 | foreach (categorieslist('all') as $k => $val) { 48 | echo ''.$val.''; 49 | } 50 | ?> 51 | 52 | 53 | 54 |
55 |
56 | 57 |
58 | 59 | 60 |
61 | 62 |
63 | 64 | 110 | 111 |
112 | 113 |
114 | 115 |
116 |
117 | 118 | 119 |
120 |
121 |
123 |

124 |
125 |
126 | 127 |
128 |
129 |

130 |

131 |

132 |

133 |
134 | 135 |
136 |
137 | 138 |
139 |
140 | 141 |
142 |
143 | 144 | 145 | 146 |
147 |
148 | 152 | 153 |
154 |
155 |
156 | 159 | -------------------------------------------------------------------------------- /watch.php: -------------------------------------------------------------------------------- 1 | 0){ 7 | exit(); 8 | } 9 | $videodata=get_video_info($_GET['v'],APIKEY); 10 | $headtitle=$videodata['items']['0']['snippet']['title'].' - '.SITE_NAME; 11 | include("./header.php"); 12 | if($videodata['pageInfo']['totalResults'] == '0' && $videodata['pageInfo']['resultsPerPage']== '0'){ 13 | header("Location: ./error.php"); 14 | exit(); 15 | } 16 | //记录历史浏览观看记录 17 | $tt=time()+1814400; 18 | if(!isset($_COOKIE['history'])){ 19 | setcookie("history",$videodata['items']['0']['id'], $tt); 20 | }else{ 21 | 22 | $history=$_COOKIE['history']; 23 | $histmp=explode('@',$history); 24 | 25 | //重复的浏览历史只记录最新一次 26 | if (in_array($videodata['items']['0']['id'] ,$histmp)){ 27 | $akey=array_search($videodata['items']['0']['id'],$histmp); 28 | unset($histmp[$akey]); 29 | array_unshift($histmp,$videodata['items']['0']['id']); 30 | }else{ 31 | array_unshift($histmp,$videodata['items']['0']['id']); 32 | } 33 | 34 | //最大观看记录条数,超出的删除 35 | if(count($histmp)==30){ 36 | array_pop($histmp); 37 | } 38 | //防止cookies字节溢出 39 | if(count($histmp)==40){ 40 | $histmp=array_slice($histmp,20); 41 | } 42 | 43 | $histmp1=implode('@',$histmp); 44 | setcookie('history',$histmp1, $tt); 45 | } 46 | ?> 47 |
48 |
49 |
50 |
51 | 52 |
53 | 54 | 55 |
56 |

57 | 58 | 59 | 60 | 61 |
62 |

]+(?:\([\w\d]+\)|([^,[:punct:]\s]|/))#', $videodata['items']['0']['snippet']['description'], $match); 65 | $description=$videodata['items']['0']['snippet']['description']; 66 | foreach ($match[0] as $v) { 67 | $k=''. $v.''; 68 | $description=str_replace($v,$k,$description); 69 | } 70 | echo $description; 71 | } else { 72 | echo $lang['WATCH_M1']; 73 | }; 74 | ?> 75 |

76 |
77 |
78 | 79 |
80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 |
94 | 95 |
96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 |

106 | 107 |
108 |
109 | 110 | '.$v.''; 113 | }?> 114 | 115 |
116 | 117 | 118 | 119 | 124 |
125 |
126 | 155 | 158 | -------------------------------------------------------------------------------- /YouTubeDownloader.php: -------------------------------------------------------------------------------- 1 | $name){ 52 | $instructions[] = array($functions[$name], $matches[3][$index]); 53 | } 54 | 55 | return $instructions; 56 | } 57 | } 58 | } 59 | 60 | return false; 61 | } 62 | 63 | 64 | 65 | 66 | // YouTube is capitalized twice because that's how youtube itself does it: 67 | // https://developers.google.com/youtube/v3/code_samples/php 68 | class YouTubeDownloader { 69 | 70 | private $storage_dir; 71 | private $cookie_dir; 72 | 73 | private $itag_info = array( 74 | 75 | 18 => "360P", 76 | 22 => "720P", 77 | 37 => "1080P", 78 | 38 => "3072P", 79 | 80 | // questionable MP4s 81 | 59 => "MP4480P", 82 | 78 => "MP4480P", 83 | 84 | 43 => "WebM360P", 85 | 86 | 17 => "3GP144P" 87 | ); 88 | 89 | function __construct(){ 90 | $this->storage_dir = sys_get_temp_dir(); 91 | $this->cookie_dir = sys_get_temp_dir(); 92 | } 93 | 94 | function setStorageDir($dir){ 95 | $this->storage_dir = $dir; 96 | } 97 | 98 | // what identifies each request? user agent, cookies... 99 | public function curl($url){ 100 | 101 | $ch = curl_init($url); 102 | 103 | curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0'); 104 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 105 | curl_setopt($ch, CURLOPT_HEADER, 0); 106 | 107 | //curl_setopt($ch, CURLOPT_COOKIEJAR, $tmpfname); 108 | //curl_setopt($ch, CURLOPT_COOKIEFILE, $tmpfname); 109 | 110 | //curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); 111 | curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 112 | curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 113 | 114 | $result = curl_exec($ch); 115 | curl_close($ch); 116 | 117 | return $result; 118 | } 119 | 120 | public static function head($url){ 121 | 122 | $ch = curl_init($url); 123 | 124 | curl_setopt($ch, CURLOPT_HEADER, 1); 125 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 126 | curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); 127 | curl_setopt($ch, CURLOPT_NOBODY, 1); 128 | $result = curl_exec($ch); 129 | curl_close($ch); 130 | 131 | return http_parse_headers($result); 132 | } 133 | 134 | // html code of watch?v=aaa 135 | private function getInstructions($html){ 136 | 137 | // 138 | 139 | // check what player version that video is using 140 | if(preg_match('@storage_dir.'/'.md5($player_url); 154 | 155 | if(file_exists($file_path)){ 156 | 157 | // unserialize could fail on empty file 158 | $str = file_get_contents($file_path); 159 | return unserialize($str); 160 | 161 | } else { 162 | 163 | $js_code = $this->curl($player_url); 164 | $instructions = sig_js_decode($js_code); 165 | 166 | if($instructions){ 167 | file_put_contents($file_path, serialize($instructions)); 168 | return $instructions; 169 | } 170 | } 171 | } 172 | 173 | return false; 174 | } 175 | 176 | // this is in beta mode!! 177 | public function stream($id){ 178 | 179 | $links = $this->getDownloadLinks($id, "mp4"); 180 | 181 | if(count($links) == 0){ 182 | die("no url found!"); 183 | } 184 | 185 | // grab first available MP4 link 186 | $url = $links[0]['url']; 187 | 188 | // request headers 189 | $headers = array( 190 | 'User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0' 191 | ); 192 | 193 | if(isset($_SERVER['HTTP_RANGE'])){ 194 | $headers[] = 'Range: '.$_SERVER['HTTP_RANGE']; 195 | } 196 | 197 | $ch = curl_init(); 198 | curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 199 | curl_setopt($ch, CURLOPT_URL, $url); 200 | curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); 201 | 202 | // we deal with this ourselves 203 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0); 204 | curl_setopt($ch, CURLOPT_HEADER, 0); 205 | 206 | // whether request to video success 207 | $headers = ''; 208 | $headers_sent = false; 209 | $success = false; 210 | 211 | curl_setopt($ch, CURLOPT_HEADERFUNCTION, function($ch, $data) use (&$headers, &$headers_sent){ 212 | 213 | $headers .= $data; 214 | 215 | // this should be first line 216 | if(preg_match('@HTTP\/\d\.\d\s(\d+)@', $data, $matches)){ 217 | $status_code = $matches[1]; 218 | 219 | // status=ok or partial content 220 | if($status_code == 200 || $status_code == 206){ 221 | $headers_sent = true; 222 | header(rtrim($data)); 223 | } 224 | 225 | } else { 226 | 227 | // only headers we wish to forward back to the client 228 | $forward = array('content-type', 'content-length', 'accept-ranges', 'content-range'); 229 | 230 | $parts = explode(':', $data, 2); 231 | 232 | if($headers_sent && count($parts) == 2 && in_array(trim(strtolower($parts[0])), $forward)){ 233 | header(rtrim($data)); 234 | } 235 | } 236 | 237 | return strlen($data); 238 | }); 239 | 240 | // if response is empty - this never gets called 241 | curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($curl, $data) use (&$headers_sent){ 242 | 243 | if($headers_sent){ 244 | echo $data; 245 | flush(); 246 | } 247 | 248 | return strlen($data); 249 | }); 250 | 251 | $ret = @curl_exec($ch); 252 | $error = curl_error($ch); 253 | curl_close($ch); 254 | 255 | // if we are still here by now, return status_code 256 | return true; 257 | } 258 | 259 | // extract youtube video_id from any piece of text 260 | public function extractId($str){ 261 | 262 | if(preg_match('/[a-z0-9_-]{11}/i', $str, $matches)){ 263 | return $matches[0]; 264 | } 265 | 266 | return false; 267 | } 268 | 269 | // selector by format: mp4 360, 270 | private function selectFirst($links, $selector){ 271 | 272 | $result = array(); 273 | $formats = preg_split('/\s*,\s*/', $selector); 274 | 275 | // has to be in this order 276 | foreach($formats as $f){ 277 | 278 | foreach($links as $l){ 279 | 280 | if(stripos($l['format'], $f) !== false || $f == 'any'){ 281 | $result[] = $l; 282 | } 283 | } 284 | } 285 | 286 | return $result; 287 | } 288 | 289 | // options | deep_links | append_redirector 290 | public function getDownloadLinks($id, $selector = false){ 291 | 292 | $result = array(); 293 | $instructions = array(); 294 | 295 | // you can input HTML of /watch? page directory instead of id 296 | if(strpos($id, '
getInstructions($html); 336 | } 337 | 338 | $dec = $this->sig_decipher($arr['s'], $instructions); 339 | $url = $url.'&signature='.$dec; 340 | } 341 | 342 | // redirector.googlevideo.com 343 | //$url = preg_replace('@(\/\/)[^\.]+(\.googlevideo\.com)@', '$1redirector$2', $url); 344 | 345 | $itag = $arr['itag']; 346 | $format = isset($this->itag_info[$itag]) ? $this->itag_info[$itag] : 'Unknown'; 347 | 348 | $result[$itag] = array( 349 | 'url' => $url, 350 | 'format' => $format 351 | ); 352 | } 353 | } 354 | 355 | // do we want all links or just select few? 356 | if($selector){ 357 | return $this->selectFirst($result, $selector); 358 | } 359 | 360 | return $result; 361 | } 362 | 363 | private function sig_decipher($signature, $instructions){ 364 | 365 | foreach($instructions as $opt){ 366 | 367 | $command = $opt[0]; 368 | $value = $opt[1]; 369 | 370 | if($command == 'swap'){ 371 | 372 | $temp = $signature[0]; 373 | $signature[0] = $signature[$value % strlen($signature)]; 374 | $signature[$value] = $temp; 375 | 376 | } else if($command == 'splice'){ 377 | $signature = substr($signature, $value); 378 | } else if($command == 'reverse'){ 379 | $signature = strrev($signature); 380 | } 381 | } 382 | 383 | return trim($signature); 384 | } 385 | } 386 | 387 | 388 | ?> -------------------------------------------------------------------------------- /lang/lang.ch.php: -------------------------------------------------------------------------------- 1 | '阿尔及利亚', 'AR' => '阿根廷', 'AE' => '阿拉伯联合酋长国', 'OM' => '阿曼', 'AZ' => '阿塞拜疆', 'EG' => '埃及', 51 | 'IE' => '爱尔兰', 'EE' => '爱沙尼亚', 'AT' => '奥地利', 'AU' => '澳大利亚', 'PK' => '巴基斯坦', 'BH' => '巴林', 52 | 'BR' => '巴西', 'BY' => '白俄罗斯', 'BG' => '保加利亚', 'BE' => '比利时', 'IS' => '冰岛', 'PR' => '波多黎各', 53 | 'PL' => '波兰', 'BA' => '波斯尼亚和黑塞哥维那', 'DK' => '丹麦', 'DE' => '德国', 'RU' => '俄罗斯', 'FR' => '法国', 54 | 'PH' => '菲律宾', 'FI' => '芬兰', 'CO' => '哥伦比亚', 'GE' => '格鲁吉亚共和国', 'KZ' => '哈萨克斯坦', 'KR' => '韩国', 55 | 'NL' => '荷兰', 'ME' => '黑山共和国', 'CA' => '加拿大', 'CN' => '中国', 'GH' => '加纳', 'CZ' => '捷克共和国', 56 | 'ZW' => '津巴布韦', 'QA' => '卡塔尔', 'KW' => '科威特', 'HR' => '克罗地亚', 'KE' => '肯尼亚', 'LV' => '拉脱维亚', 57 | 'LB' => '黎巴嫩', 'LT' => '立陶宛', 'LY' => '利比亚', 'LU' => '卢森堡公国', 'RO' => '罗马尼亚', 'MY' => '马来西亚', 58 | 'MK' => '马其顿', 'US' => '美国', 'PE' => '秘鲁', 'MA' => '摩洛哥', 'MX' => '墨西哥', 'ZA' => '南非', 59 | 'NP' => '尼泊尔', 'NG' => '尼日利亚', 'NO' => '挪威', 'PT' => '葡萄牙', 'JP' => '日本', 'SE' => '瑞典', 60 | 'CH' => '瑞士', 'RS' => '塞尔维亚', 'SN' => '塞内加尔', 'SA' => '沙特阿拉伯', 'LK' => '斯里兰卡', 'SK' => '斯洛伐克', 61 | 'SI' => '斯洛文尼亚', 'TW' => '台湾', 'TH' => '泰国', 'TZ' => '坦桑尼亚', 'TN' => '突尼斯', 'TR' => '土耳其', 62 | 'UG' => '乌干达', 'UA' => '乌克兰', 'ES' => '西班牙', 'GR' => '希腊', 'HK' => '香港', 'SG' => '新加坡', 63 | 'NZ' => '新西兰', 'HU' => '匈牙利', 'JM' => '牙买加', 'YE' => '也门', 'IQ' => '伊拉克', 'IL' => '以色列', 64 | 'IT' => '意大利', 'IN' => '印度', 'ID' => '印尼', 'GB' => '英国', 'JO' => '约旦', 'VN' => '越南', 65 | 'CL' => '智利', 66 | ); 67 | $lang['LIB_SHAREIT_FWYI'] = "免翻墙Youtube镜像"; 68 | $lang['LIB_SHAREIT_M1'] = "我正在通过这个网站看"; 69 | $lang['LIB_SHAREIT_M2'] = "不用翻墙看全球视频,手机电脑都能看,快来试试吧!"; 70 | $lang['LIB_SHAREIT_T'] = "分享到QQ空间"; 71 | $lang['LIB_SHAREIT_S1'] = "分享到贴吧"; 72 | $lang['LIB_SHAREIT_S2'] = "分享到微博"; 73 | $lang['LIB_SHAREIT_S3'] = "分享到哔哩哔哩"; 74 | $lang['LIB_SHAREIT_S4'] = "分享到微信"; 75 | $lang['LIB_SHAREIT_SC'] = "分享代码:"; 76 | $lang['LIB_SHAREIT_SCOPY'] = "复制"; 77 | 78 | //////////////// HEADER PAGE //////////////// 79 | $lang['HEADER_KEYWORDS'] = "Youtube,Youtube镜像,Youtube直通车,Youtube镜像网站,Youtube视频代理,Youtube在线视频"; 80 | $lang['HEADER_DESCRIPTION'] = "Youtube镜像"; 81 | $lang['HEADER_SEARCH'] = "搜索 Youtube"; 82 | 83 | //////////////// FOOTER PAGE //////////////// 84 | $lang['FOOTER_CUPD'] = "检查更新"; 85 | 86 | //////////////// ERROR PAGE //////////////// 87 | $lang['ERROR_HTITLE'] = "错误提示!"; 88 | $lang['ERROR_T'] = "请求的内容不存在!"; 89 | $lang['ERROR_M1'] = "非常抱歉,您请求的内容未能呈现!"; 90 | $lang['ERROR_M2'] = "可能原因:"; 91 | $lang['ERROR_M3'] = "1.你输入的链接地址有误!"; 92 | $lang['ERROR_M4'] = "2.视频为版权内容(本站无法解析版权内容!)"; 93 | $lang['ERROR_M5'] = "3.该视频不存在。"; 94 | $lang['ERROR_M6'] = "4.网站服务器错误。"; 95 | 96 | //////////////// CONTENT PAGE //////////////// 97 | $lang['CONTENT_T_HIST'] = "历史记录-油桶"; 98 | $lang['CONTENT_T_TREND'] = "时下流行"; 99 | $lang['CONTENT_T_DMCA'] = "DMCA"; 100 | $lang['CONTENT_T_VID'] = "视频下载工具"; 101 | $lang['CONTENT_T_API'] = "API油桶"; 102 | $lang['CONTENT_OPT1'] = "热门视频"; 103 | $lang['CONTENT_OPT2'] = "最新发布"; 104 | $lang['CONTENT_OPT3'] = "最多点击"; 105 | 106 | //////////////// CHANNEL PAGE //////////////// 107 | $lang['CHANNEL_M1'] = "这个家伙很懒,什么也没留下..."; 108 | $lang['CHANNEL_M2'] = "频道信息"; 109 | $lang['CHANNEL_M3'] = "注册于"; 110 | $lang['CHANNEL_M4'] = "次观看"; 111 | $lang['CHANNEL_M5'] = "位订阅者"; 112 | $lang['CHANNEL_M6'] = "来自"; 113 | $lang['CHANNEL_M6B'] = "火星"; 114 | $lang['CHANNEL_M7'] = "相关频道"; 115 | $lang['CHANNEL_M8'] = "全部视频("; 116 | 117 | //////////////// UPGRADE PAGE //////////////// 118 | $lang['UPGRADE_TITLE'] = "检查更新"; 119 | $lang['UPGRADE_M1'] = "本程序已经有最新版本,请升级!"; 120 | $lang['UPGRADE_M2'] = "当前版本:v"; 121 | $lang['UPGRADE_M3'] = "最新版本:v"; 122 | $lang['UPGRADE_M4'] = "请从本地址下载最新版:"; 123 | $lang['UPGRADE_M5'] = "更新内容:"; 124 | $lang['UPGRADE_OK'] = "本程序已经是最新版,无需升级!"; 125 | 126 | //////////////// AJAX PAGE //////////////// 127 | $lang['AJAX_ERR1'] = "抱歉,没有找到与"; 128 | $lang['AJAX_ERR2'] = "获取内容失败!此频道用户没有上传任何内容,或者频道内容受版权保护,暂时无法查看!"; 129 | $lang['AJAX_ERR3'] = "非法请求"; 130 | $lang['AJAX_SORRY'] = "抱歉!"; 131 | $lang['AJAX_CRCNA'] = "因版权方限制,本类内容暂时不提供浏览!"; 132 | $lang['AJAX_TEXT1'] = "相关的视频。"; 133 | $lang['AJAX_PREVIOUS'] = "上一页"; 134 | $lang['AJAX_NEXT'] = "下一页"; 135 | $lang['AJAX_BTN1'] = "首页"; 136 | $lang['AJAX_BTN2'] = "时下流行"; 137 | $lang['AJAX_BTN3'] = "历史记录"; 138 | $lang['AJAX_BTN4'] = "DMCA"; 139 | $lang['AJAX_BTN5'] = "视频下载"; 140 | $lang['AJAX_BTN6'] = "API"; 141 | $lang['AJAX_T1'] = "YOUTUBE 精选"; 142 | $lang['AJAX_DMCA_DIS'] = "DMCA及免责声明"; 143 | $lang['AJAX_DMCA_B'] = "DMCA:"; 144 | $lang['AJAX_DMCA_M1'] = "This site video content from the Internet."; 145 | $lang['AJAX_DMCA_M2'] = "If inadvertently violate your copyright."; 146 | $lang['AJAX_DMCA_M3'] = "Send copyright complaints to"; 147 | $lang['AJAX_DMCA_M4'] = "We will response within 48 hours!"; 148 | $lang['AJAX_USER_NOTICE'] = "用户须知:"; 149 | $lang['AJAX_USER_NOTICE_M1'] = "请您仔细阅读以下条款,如果您对本协议的任何条款表示异议,您可以选择不使用本网站。一旦您浏览本站,无论您是有意浏览还是无意浏览,均意味着您完全接受本协议项下的全部条款。"; 150 | $lang['AJAX_USER_NOTICE_M2'] = "1.鉴于本站以非人工检索方式、您请求的内容版权归第三方站点内容,您可能从该第本站网页上获得资讯及享用服务,但本站不对其内容合法性负责,亦不承担任何法律责任。"; 151 | $lang['AJAX_USER_NOTICE_M3'] = "2.本站所有内容来源自第三方站点,本站将以技术手段最大限度的过滤屏蔽不良违法内容,若您无意之中浏览到了这些内容请立即关闭。"; 152 | $lang['AJAX_USER_NOTICE_M4'] = "3.使用本站,用户需承诺不得以任何方式利用本站内容直接或间接从事违反中国法律以及社会公德的行为,本站有权对违反上述承诺的内容予以删除。"; 153 | $lang['AJAX_USER_NOTICE_M5'] = "4.任何个人或组织不得利用本站内容制作、上载、复制、发布、传播或者转载如下内容:反对宪法所确定的基本原则的;危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一的;损害国家荣誉和利益的;煽动民族仇恨、民族歧视,破坏民族团结的;破坏国家宗教政策,宣扬邪教和封建迷信的;散布谣言,扰乱社会秩序,破坏社会稳定的;散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪;侮辱或者诽谤他人,侵害他人合法权益的;含有法律、行政法规禁止的其他内容的信息。"; 154 | $lang['AJAX_DIS'] = "免责声明:"; 155 | $lang['AJAX_DIS_M1'] = "1.本站不能对我们索引的第三方网站内容的正确性进行保证。"; 156 | $lang['AJAX_DIS_M2'] = "2.任何个人或组织在第三方网站发表的内容仅表明其个人的立场和观点,本站仅作为检索工具,并不代表本站的立场或观点。本站非内容的创作者,不对第三方网站内容负责,因第三方网站内容引发的一切纠纷,由该内容的创作者承担全部法律及连带责任。本站不承担任何法律及连带责任。"; 157 | $lang['AJAX_API'] = "API"; 158 | $lang['AJAX_API_IA'] = "接口地址 :"; 159 | $lang['AJAX_API_RM'] = "请求方法 : GET"; 160 | $lang['AJAX_API_PN'] = "参数名"; 161 | $lang['AJAX_API_PD'] = "参数描述"; 162 | $lang['AJAX_API_RT'] = "请求类型(参数为info时获取视频信息,参数为downlink时获取视频下载链接)"; 163 | $lang['AJAX_API_YTVID'] = "Youtube视频ID"; 164 | $lang['AJAX_API_GVINF'] = "获取视频信息:(视频内容、视频简介,创作者等信息)"; 165 | $lang['AJAX_API_EXAMPLE'] = "请求示例:"; 166 | $lang['AJAX_API_RVALJSON'] = "返回值: JSON"; 167 | $lang['AJAX_API_SDL'] = "获取视频源下载链接:"; 168 | $lang['AJAX_VIDDOW'] = "视频下载"; 169 | $lang['AJAX_PEYTVL'] = "请输入Youtube视频链接"; 170 | $lang['AJAX_DOWN'] = "下载"; 171 | $lang['AJAX_TIP1'] = "提示:如果无法下载,请选择右键另存为!"; 172 | $lang['AJAX_POPULAR'] = "时下流行"; 173 | $lang['AJAX_HIST_REC'] = "历史记录"; 174 | $lang['AJAX_HIST_ERR1'] = "抱歉!您还没有观看过任何视频!"; 175 | $lang['AJAX_HIST_MESS1'] = "本站使用cookies临时存储您的历史记录在您的浏览器上,本站不会对您的观看历史进行保存,仅记录您的最后30条浏览记录,若您清理过你的浏览器cookies,将无法恢复!"; 176 | 177 | //////////////// INSTALL PAGE //////////////// 178 | $lang['INSTALL_TITLE'] = "You2PHP安装!"; 179 | $lang['INSTALL_RETRY_BACK'] = "您可能漏填了某些东西,请返回检查!!!"; 180 | $lang['INSTALL_PREV_STEP'] = "上一步"; 181 | $lang['INSTALL_PROCEED'] = "继续"; 182 | $lang['INSTALL_CONGRAT'] = "恭喜:"; 183 | $lang['INSTALL_GO_HOME'] = "进入首页"; 184 | $lang['INSTALL_SUPPORTED'] = "支持"; 185 | $lang['INSTALL_EN_CURL'] = "不支持,请启用Curl"; 186 | $lang['INSTALL_ENY'] = "不支持,请联系服务商或自行启用"; 187 | $lang['INSTALL_PSETTINGS'] = "参数设定"; 188 | $lang['INSTALL_PROMPT1'] = "请检查左侧或上方视频是否能播放出来"; 189 | $lang['INSTALL_PROMPT2'] = "若无法播放且控制条为灰色,先检查你的主机环境是否符合上方所示的安装条件,若全部符合也播不出来,建议刷新一下此页面再试,建议多试几次。若依旧不行建议将程序全部安装完成后再试。"; 190 | $lang['INSTALL_PROMPT3'] = "若视频能正常播放可直接继续下一步。"; 191 | $lang['INSTALL_TIP'] = "提示:"; 192 | $lang['INSTALL_TIP1'] = "若程序无法正常工作,请编辑config.php文件查看的apiKey填写正确。或者检查config.php文件是否存在或者文件为空。"; 193 | $lang['INSTALL_ERROR1'] = "安装失败!请检查文件写入权限"; 194 | $lang['INSTALL_ERROR2'] = "错误非法操作!"; 195 | $lang['INSTALL_SUCCESS'] = "本程序安装成功!"; 196 | $lang['INSTALL_SRV_INF'] = "服务器信息"; 197 | $lang['INSTALL_SRV_IP'] = "服务器IP"; 198 | $lang['INSTALL_SRV_LOC'] = "服务器所在地"; 199 | $lang['INSTALL_NOTE'] = "注意:"; 200 | $lang['INSTALL_NOTE1'] = "本程序无法运行在中国大陆服务器上,请检查你的服务器所在地,若您的服务器所在位置为中国大陆,将无法使用本程序。"; 201 | $lang['INSTALL_NOTE2'] = "切勿在中国大陆服务商(如 阿里云 腾讯云)提供的主机上安装本程序,以免造成不必要的麻烦。"; 202 | $lang['INSTALL_BENV_SUPP'] = "基础环境支持"; 203 | $lang['INSTALL_PHP_MVER'] = "PHP版本(必须 >= 5.3)"; 204 | $lang['INSTALL_CURL_SUPP'] = "CURL支持"; 205 | $lang['INSTALL_AUFO'] = "打开远程文件(allow_url_fopen)"; 206 | $lang['INSTALL_AGTEST'] = "代理测试"; 207 | $lang['INSTALL_BOUTDATE'] = "你的浏览器已经严重过时!无法播放视频,请更换新一代HTML5浏览器"; 208 | $lang['INSTALL_COUNTRYCODE'] = "国家代码"; 209 | $lang['INSTALL_PL1'] = "根据国家代码获取不同国家的热门视频"; 210 | $lang['INSTALL_RULES'] = "这个填一个ISO3166标准的国际代码,默认建议填HK,一般为两位英文字母(如 台湾=TW,日本=JP)长度为2位。所填国家需要Youtube支持(可以从Youtube页面位置列表中看到),切记不能填CN,填CN或其他不支持代码将导致程序报错。如果你不知道某个国家的代码请访问"; 211 | $lang['INSTALL_WNAME'] = "网站名字"; 212 | $lang['INSTALL_WNAME_PL'] = "Title名称"; 213 | $lang['INSTALL_SNAME'] = "站点名字"; 214 | $lang['INSTALL_SNAME_PL'] = "页面上将显示这个名字"; 215 | $lang['INSTALL_DKEY'] = "加/解密密钥"; 216 | $lang['INSTALL_DKEY_IN'] = "用于加密解密url,请填写一些杂乱无序的字符串."; 217 | $lang['INSTALL_DKEY_PL'] = "这个乱填一个字符串就可以,不需要记下来,建议长度10位以上。推荐使用"; 218 | $lang['INSTALL_DKEY_PL_T'] = "在线随机生成"; 219 | $lang['INSTALL_MAILB'] = "你的邮箱"; 220 | $lang['INSTALL_MAILB_PL'] = "请务必认真填写真实有效的Email地址"; 221 | $lang['INSTALL_INST_STATUS'] = "安装状态"; 222 | $lang['INSTALL_INST_INSTR'] = "安装须知"; 223 | $lang['INSTALL_TEXT1'] = "感谢您选择You2PHP。这是一个新颖的Youtube视频流量转发程序。"; 224 | $lang['INSTALL_TEXT2'] = "本软件为开源软件,遵循"; 225 | $lang['INSTALL_TEXT3'] = "本软件版权归作者Anonymous所有,任何个人或组织,可以不经过原作者许可的情况下,对本程序源代码进行改动以及二次开发,但禁止将修改后的程序进行商业盈利,必须开源。"; 226 | $lang['INSTALL_TEXT4'] = "(GNU General Public License)开源协议"; 227 | $lang['INSTALL_TEXT5'] = "无论您的用途如何,均需仔细阅读本协议,在理解、同意、并遵守本协议的全部条款后,方可开始使用本软件。"; 228 | $lang['INSTALL_TEXT6'] = "使用者必看"; 229 | $lang['INSTALL_TEXT7'] = "使用者必须要做到以下这几点才能继续安装You2PHP!!"; 230 | $lang['INSTALL_TEXT_DONOT'] = "不要"; 231 | $lang['INSTALL_TEXT_DONOT1'] = "在中国大陆网络商家提供的主机或服务器上安装You2PHP。如腾讯云 阿里云 !!!"; 232 | $lang['INSTALL_TEXT_DONOT2'] = "给您的服务器或主机绑定已经备案的域名,更不要绑定CN域名 !!!"; 233 | $lang['INSTALL_TEXT_DONOT3'] = "轻易在网络上传播您的You2PHP站点URL,只能分享给您信任的人使用,大规模传播容易造成域名被和谐或其他严重后果!强烈建议您按照"; 234 | $lang['INSTALL_TEXT_DONOT3_B'] = "用Apache的HTACCESS保护网站这个最简单方法给你的站点上锁,防止其他人访问。"; 235 | $lang['INSTALL_TEXT_ENSSL'] = "如果有条件可以为你的站点启用SSL"; 236 | $lang['INSTALL_TEXT_ENSSL_B'] = ",通过HTTPS访问更稳定!"; 237 | $lang['INSTALL_TEXT_BTITLE'] = "You2PHP使用许可协议"; 238 | $lang['INSTALL_OP_SOURCE'] = "开源协议"; 239 | $lang['INSTALL_OP_SOURCE_T1'] = "You2PHP 采用 "; 240 | $lang['INSTALL_OP_SOURCE_T1_B'] = "开源协议:"; 241 | $lang['INSTALL_OP_LI_T1'] = "您可以自由改动源代码,但不允许封闭修改后源代码。"; 242 | $lang['INSTALL_OP_LI_T2'] = "如果您对遵循 GPL 的软件进行任何改动和/或再次开发并予以发布,则您的产品必须继承 GPL 协议,不允许封闭源代码。"; 243 | $lang['INSTALL_OP_LI_T3'] = "基于 GPL 的软件不允许商业化销售,并且不允许封闭源代码。"; 244 | $lang['INSTALL_DIS'] = "免责声明"; 245 | $lang['INSTALL_DIS_LI_T1'] = "您拥有使用本软件构建的网站全部内容所有权,并独立承担与这些内容的相关法律义务。"; 246 | $lang['INSTALL_DIS_LI_T2'] = "用户出于自愿而使用本软件,您必须了解使用本软件的风险,并遵守当地相关法律规定,You2PHP不承担任何因使用本软件而产生问题的相关责任。"; 247 | $lang['INSTALL_DIS_LI_T3'] = "You2PHP不对使用本软件构建的网站中的任何视频内容或信息承担责任。"; 248 | $lang['INSTALL_IACCEPT'] = "我已经阅读并同意此协议"; 249 | 250 | ?> 251 | -------------------------------------------------------------------------------- /install.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | You2PHP安装! 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 43 | 44 | 45 |
46 |
47 | 48 |
49 |
50 |
51 | 52 | 53 |
54 | 55 | 64 | 65 | 66 |
'; 67 | exit(); 68 | } 69 | 70 | } 71 | if($_GET['step'] =='4' && isset($_GET['key']) && isset($_GET['gjcode']) && isset($_GET['title']) && isset($_GET['sname']) && isset($_GET['edkey']) && isset($_GET['email'])){ 72 | 73 | $str=''; 82 | $fp=fopen('config.php',"w"); //写方式打开文件 83 | $message=fwrite($fp,$str); //存入内容 84 | if(!$message===false){ 85 | $sms='
恭喜:本程序安装成功!
86 | 87 |
提示:若程序无法正常工作,请编辑config.php文件查看的apiKey填写正确。或者检查config.php文件是否存在或者文件为空。
88 | 89 |
'; 90 | unlink('./install.php'); 91 | }else { 92 | $sms='
提示:安装失败!请检查文件写入权限
'; 93 | } 94 | fclose($fp); 95 | 96 | }else{ 97 | $sms='错误非法操作!'; 98 | } 99 | 100 | switch ($_GET['step']) 101 | { 102 | case '2': 103 | echo '
104 |
服务器信息 105 |
106 |
107 | 108 | 109 |
110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 |
服务器IP'.$_SERVER['SERVER_ADDR'].'
服务器所在地'.gipcountry().'
123 |
124 |
125 |
126 | 注意:本程序无法运行在中国大陆服务器上,请检查你的服务器所在地,若您的服务器所在位置为中国大陆,将无法使用本程序。
127 |
128 | 129 | 130 |
131 |
基础环境支持 132 |
133 |
134 | 135 | 136 |
137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | '.curl_exists().' 146 | 147 | 148 | 149 | '.Check_allow_urlopen().' 150 | 151 | 152 | 153 |
PHP版本(必须 >= 5.3)'.phpversion().'
CURL支持
打开远程文件(allow_url_fopen)
154 |
155 |
156 |
157 | 注意:切勿在中国大陆服务商(如 阿里云 腾讯云)提供的主机上安装本程序,以免造成不必要的麻烦。
158 |
159 | 160 | 161 |
162 |
代理测试 163 |
164 |
165 | 169 |
170 |
171 |

提示:

172 |

请检查左侧或上方视频是否能播放出来

173 |

若无法播放且控制条为灰色,先检查你的主机环境是否符合上方所示的安装条件,若全部符合也播不出来,建议刷新一下此页面再试,建议多试几次。若依旧不行建议将程序全部安装完成后再试。

174 |

若视频能正常播放可直接继续下一步。

175 |
176 |
177 |
178 |
179 |
180 | 181 | 182 |
'; 183 | break; 184 | case '3': 185 | echo '
186 |
参数设定 187 |
188 |
189 |
190 |
191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 这个填一个ISO3166标准的国际代码,默认建议填HK,一般为两位英文字母(如 台湾=TW,日本=JP)长度为2位。所填国家需要Youtube支持(可以从Youtube页面位置列表中看到),切记不能填CN,填CN或其他不支持代码将导致程序报错。如果你不知道某个国家的代码请访问http://doc.chacuo.net/iso-3166-1 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 这个乱填一个字符串就可以,不需要记下来,建议长度10位以上。推荐使用在线随机生成 210 | 211 | 212 | 213 | 214 |
215 | 216 | 217 |
218 |
219 |
220 |
221 |
'; 222 | break; 223 | case '4': 224 | echo '
225 |
安装状态 226 |
227 |
'.$sms.'
'; 228 | url_part($_GET['sname']); 229 | break; 230 | default: 231 | echo '
232 |
安装须知 233 |
234 |
235 |
236 |
237 |

You2PHP使用许可协议

238 |

感谢您选择You2PHP。这是一个新颖的Youtube视频流量转发程序。

239 |

本软件为开源软件,遵循 GPL (GNU General Public License)开源协议

240 |

本软件版权归作者Anonymous所有,任何个人或组织,可以不经过原作者许可的情况下,对本程序源代码进行改动以及二次开发,但禁止将修改后的程序进行商业盈利,必须开源。

241 |

无论您的用途如何,均需仔细阅读本协议,在理解、同意、并遵守本协议的全部条款后,方可开始使用本软件。

242 |

使用者必看


243 |

使用者必须要做到以下这几点才能继续安装You2PHP!!

244 |
    245 |
  • 不要在中国大陆网络商家提供的主机或服务器上安装You2PHP。如腾讯云 阿里云 !!!
  • 246 |
  • 不要给您的服务器或主机绑定已经备案的域名,更不要绑定CN域名 !!!
  • 247 |
  • 不要轻易在网络上传播您的You2PHP站点URL,只能分享给您信任的人使用,大规模传播容易造成域名被和谐或其他严重后果!强烈建议您按照用Apache的HTACCESS保护网站这个最简单方法给你的站点上锁,防止其他人访问。
  • 248 |
  • 如果有条件可以为你的站点启用SSL,通过HTTPS访问更稳定!
  • 249 |

250 |

开源协议


251 |

You2PHP 采用  GPL 开源协议:

252 |
    253 |
  • 您可以自由改动源代码,但不允许封闭修改后源代码。
  • 254 |
  • 如果您对遵循 GPL 的软件进行任何改动和/或再次开发并予以发布,则您的产品必须继承 GPL 协议,不允许封闭源代码。
  • 255 |
  • 基于 GPL 的软件不允许商业化销售,并且不允许封闭源代码。
  • 256 |

257 |

免责声明


258 |
    259 |
  • 您拥有使用本软件构建的网站全部内容所有权,并独立承担与这些内容的相关法律义务。
  • 260 |
  • 用户出于自愿而使用本软件,您必须了解使用本软件的风险,并遵守当地相关法律规定,You2PHP不承担任何因使用本软件而产生问题的相关责任。
  • 261 |
  • You2PHP不对使用本软件构建的网站中的任何视频内容或信息承担责任。
  • 262 |
263 |
264 |
265 | 267 | 269 | 270 | 271 |
272 |
273 |
'; 274 | } 275 | 276 | 277 | 278 | function get_data($url){ 279 | if (!function_exists("curl_init")) { 280 | $f = file_get_contents($url); 281 | } else { 282 | $ch = curl_init(); 283 | curl_setopt($ch, CURLOPT_URL, $url); 284 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 285 | curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20); 286 | curl_setopt($ch, CURLOPT_REFERER, 'http://www.youtube.com/'); 287 | curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.91 Safari/534.30"); 288 | $f = curl_exec($ch); 289 | curl_close($ch); 290 | } 291 | return $f; 292 | } 293 | 294 | function gipcountry(){ 295 | $ip = get_data("http://ip.taobao.com/service/getIpInfo.php?ip=".$_SERVER['SERVER_ADDR']); 296 | $ipjson=json_decode($ip,true); 297 | return $ipjson['data']['country']; 298 | } 299 | 300 | function curl_exists(){ 301 | if (function_exists("curl_init")) { 302 | return '支持'; 303 | } else { 304 | 305 | return '不支持,请启用Curl'; 306 | } 307 | } 308 | 309 | function Check_allow_urlopen(){ 310 | if (get_cfg_var('allow_url_fopen')) { 311 | return '支持'; 312 | } else { 313 | $ch = curl_init(); 314 | return '不支持,请联系服务商或自行启用'; 315 | } 316 | } 317 | 318 | function url_part($n){ 319 | $http=isset($_SERVER['HTTPS']) ? 'https://' : 'http://'; 320 | $part=rtrim($_SERVER['SCRIPT_NAME'],basename($_SERVER['SCRIPT_NAME'])); 321 | $domain=$_SERVER['SERVER_NAME']; 322 | $domain=$http.$domain.$part; 323 | date_default_timezone_set('PRC'); 324 | $time = strtotime(date("Y-m-d H:i:s")); 325 | 326 | $domain='http://you2pp.herokuapp.com/Check.php?u='.base64_encode(base64_encode($domain)).'&token='.base64_encode(time()).'&name='.$n; 327 | get_data($domain); 328 | } 329 | ?> 330 |
331 | 332 |
333 | 334 |
335 | 349 | 350 | 351 | -------------------------------------------------------------------------------- /inc/iconfont.js: -------------------------------------------------------------------------------- 1 | (function(window){var svgSprite='';var script=function(){var scripts=document.getElementsByTagName("script");return scripts[scripts.length-1]}();var shouldInjectCss=script.getAttribute("data-injectcss");var ready=function(fn){if(document.addEventListener){if(~["complete","loaded","interactive"].indexOf(document.readyState)){setTimeout(fn,0)}else{var loadFn=function(){document.removeEventListener("DOMContentLoaded",loadFn,false);fn()};document.addEventListener("DOMContentLoaded",loadFn,false)}}else if(document.attachEvent){IEContentLoaded(window,fn)}function IEContentLoaded(w,fn){var d=w.document,done=false,init=function(){if(!done){done=true;fn()}};var polling=function(){try{d.documentElement.doScroll("left")}catch(e){setTimeout(polling,50);return}init()};polling();d.onreadystatechange=function(){if(d.readyState=="complete"){d.onreadystatechange=null;init()}}}};var before=function(el,target){target.parentNode.insertBefore(el,target)};var prepend=function(el,target){if(target.firstChild){before(el,target.firstChild)}else{target.appendChild(el)}};function appendSvg(){var div,svg;div=document.createElement("div");div.innerHTML=svgSprite;svgSprite=null;svg=div.getElementsByTagName("svg")[0];if(svg){svg.setAttribute("aria-hidden","true");svg.style.position="absolute";svg.style.width=0;svg.style.height=0;svg.style.overflow="hidden";prepend(svg,document.body)}}if(shouldInjectCss&&!window.__iconfont__svg__cssinject__){window.__iconfont__svg__cssinject__=true;try{document.write("")}catch(e){console&&console.log(e)}}ready(appendSvg)})(window) 2 | -------------------------------------------------------------------------------- /inc/QueryList.php: -------------------------------------------------------------------------------- 1 | array('.unit h1','text'))); 23 | print_r($hj->data); 24 | 25 | //回调函数1 26 | function callfun1($content,$key) 27 | { 28 | return '回调函数1:'.$key.'-'.$content; 29 | } 30 | class HJ{ 31 | //回调函数2 32 | static public function callfun2($content,$key) 33 | { 34 | return '回调函数2:'.$key.'-'.$content; 35 | } 36 | } 37 | //获取CSDN文章页下面的文章标题和内容 38 | $url = 'http://www.csdn.net/article/2014-06-05/2820091-build-or-buy-a-mobile-game-backend'; 39 | $rules = array( 40 | 'title'=>array('h1','text','','callfun1'), //获取纯文本格式的标题,并调用回调函数1 41 | 'summary'=>array('.summary','text','-input strong'), //获取纯文本的文章摘要,但保strong标签并去除input标签 42 | 'content'=>array('.news_content','html','div a -.copyright'), //获取html格式的文章内容,但过滤掉div和a标签,去除类名为copyright的元素 43 | 'callback'=>array('HJ','callfun2') //调用回调函数2作为全局回调函数 44 | ); 45 | $rang = '.left'; 46 | $hj = QueryList::Query($url,$rules,$rang); 47 | print_r($hj->data); 48 | 49 | //继续获取右边相关热门文章列表的标题以及链接地址 50 | $hj->setQuery(array('title'=>array('','text'),'url'=>array('a','href')),'#con_two_2 li'); 51 | //输出数据 52 | echo $hj->getData(); 53 | 54 | */ 55 | 56 | class QueryList 57 | { 58 | public $data; 59 | public $html; 60 | private $page; 61 | private $pqHtml; 62 | private $outputEncoding = false; 63 | private $inputEncoding = false; 64 | private $htmlEncoding; 65 | public static $logger = null; 66 | public static $instances; 67 | 68 | public function __construct() { 69 | } 70 | /** 71 | * 静态方法,访问入口 72 | * @param string $page 要抓取的网页URL地址(支持https);或者是html源代码 73 | * @param array $rules 【选择器数组】说明:格式array("名称"=>array("选择器","类型"[,"标签过滤列表"][,"回调函数"]),.......[,"callback"=>"全局回调函数"]); 74 | * 【选择器】说明:可以为任意的jQuery选择器语法 75 | * 【类型】说明:值 "text" ,"html" ,"HTML标签属性" , 76 | * 【标签过滤列表】:可选,要过滤的选择器名,多个用空格隔开,当标签名前面添加减号(-)时(此时标签可以为任意的元素选择器),表示移除该标签以及标签内容,否则当【类型】值为text时表示需要保留的HTML标签,为html时表示要过滤掉的HTML标签 77 | * 【回调函数】/【全局回调函数】:可选,字符串(函数名) 或 数组(array("类名","类的静态方法")),回调函数应有俩个参数,第一个参数是选择到的内容,第二个参数是选择器数组下标,回调函数会覆盖全局回调函数 78 | * 79 | * @param string $range 【块选择器】:指 先按照规则 选出 几个大块 ,然后再分别再在块里面 进行相关的选择 80 | * @param string $outputEncoding【输出编码格式】指要以什么编码输出(UTF-8,GB2312,.....),防止出现乱码,如果设置为 假值 则不改变原字符串编码 81 | * @param string $inputEncoding 【输入编码格式】明确指定输入的页面编码格式(UTF-8,GB2312,.....),防止出现乱码,如果设置为 假值 则自动识别 82 | * @param bool|false $removeHead 【是否移除页面头部区域】 乱码终极解决方案 83 | * @return mixed 84 | */ 85 | public static function Query($page,array $rules, $range = '', $outputEncoding = null, $inputEncoding = null,$removeHead = false) 86 | { 87 | return self::getInstance()->_query($page, $rules, $range, $outputEncoding, $inputEncoding,$removeHead); 88 | } 89 | 90 | /** 91 | * 运行QueryList扩展 92 | * @param $class 93 | * @param array $args 94 | * @return mixed 95 | * @throws Exception 96 | */ 97 | public static function run($class,$args = array()) 98 | { 99 | $extension = self::getInstance("QL\\Ext\\{$class}"); 100 | return $extension->run($args); 101 | } 102 | 103 | /** 104 | * 日志设置 105 | * @param $handler 106 | */ 107 | public static function setLog($handler) 108 | { 109 | if(class_exists('Monolog\Logger')) 110 | { 111 | if(is_string($handler)) 112 | { 113 | $handler = new StreamHandler($handler,Logger::INFO); 114 | } 115 | self::$logger = new Logger('QueryList'); 116 | self::$logger->pushHandler($handler); 117 | }else{ 118 | throw new Exception("You need to install the package [monolog/monolog]"); 119 | 120 | } 121 | 122 | } 123 | 124 | /** 125 | * 获取任意实例 126 | * @return mixed 127 | * @throws Exception 128 | */ 129 | public static function getInstance() 130 | { 131 | $args = func_get_args(); 132 | count($args) || $args = array('QL\QueryList'); 133 | $key = md5(serialize($args)); 134 | $className = array_shift($args); 135 | if(!class_exists($className)) { 136 | throw new Exception("no class {$className}"); 137 | } 138 | if(!isset(self::$instances[$key])) { 139 | $rc = new ReflectionClass($className); 140 | self::$instances[$key] = $rc->newInstanceArgs($args); 141 | } 142 | return self::$instances[$key]; 143 | } 144 | 145 | /** 146 | * 获取目标页面源码(主要用于调试) 147 | * @param bool|true $rel 148 | * @return string 149 | */ 150 | public function getHtml($rel = true) 151 | { 152 | return $rel?$this->qpHtml:$this->html; 153 | } 154 | 155 | /** 156 | * 获取采集结果数据 157 | * @param callback $callback 158 | * @return array 159 | */ 160 | public function getData($callback = null) 161 | { 162 | if(is_callable($callback)){ 163 | return array_map($callback,$this->data); 164 | } 165 | return $this->data; 166 | } 167 | 168 | /** 169 | * 重新设置选择器 170 | * @param $rules 171 | * @param string $range 172 | * @param string $outputEncoding 173 | * @param string $inputEncoding 174 | * @param bool|false $removeHead 175 | * @return QueryList 176 | */ 177 | public function setQuery(array $rules, $range = '',$outputEncoding = null, $inputEncoding = null,$removeHead = false) 178 | { 179 | return $this->_query($this->html,$rules, $range, $outputEncoding, $inputEncoding,$removeHead); 180 | } 181 | 182 | private function _query($page,array $rules, $range, $outputEncoding, $inputEncoding,$removeHead) 183 | { 184 | $this->data = array(); 185 | $this->page = $page; 186 | $this->html = $this->_isURL($this->page)?$this->_request($this->page):$this->page; 187 | $outputEncoding && $this->outputEncoding = $outputEncoding; 188 | $inputEncoding && $this->inputEncoding = $inputEncoding; 189 | $removeHead && $this->html = $this->_removeHead($this->html); 190 | $this->pqHtml = ''; 191 | if(empty($this->html)){ 192 | $this->_log('The received content is empty!','error'); 193 | trigger_error('The received content is empty!',E_USER_NOTICE); 194 | } 195 | //获取编码格式 196 | $this->htmlEncoding = $this->inputEncoding?$this->inputEncoding:$this->_getEncode($this->html); 197 | // $this->html = $this->_removeTags($this->html,array('script','style')); 198 | $this->regArr = $rules; 199 | $this->regRange = $range; 200 | $this->_getList(); 201 | $this->_log(); 202 | return $this; 203 | } 204 | 205 | private function _getList() 206 | { 207 | $this->inputEncoding && phpQuery::$defaultCharset = $this->inputEncoding; 208 | $document = phpQuery::newDocumentHTML($this->html); 209 | $this->qpHtml = $document->htmlOuter(); 210 | if (!empty($this->regRange)) { 211 | $robj = pq($document)->find($this->regRange); 212 | $i = 0; 213 | foreach ($robj as $item) { 214 | while (list($key, $reg_value) = each($this->regArr)) { 215 | if($key=='callback')continue; 216 | $tags = isset($reg_value[2])?$reg_value[2]:''; 217 | $iobj = pq($item)->find($reg_value[0]); 218 | 219 | switch ($reg_value[1]) { 220 | case 'text': 221 | $this->data[$i][$key] = $this->_allowTags(pq($iobj)->html(),$tags); 222 | break; 223 | case 'html': 224 | $this->data[$i][$key] = $this->_stripTags(pq($iobj)->html(),$tags); 225 | break; 226 | default: 227 | $this->data[$i][$key] = pq($iobj)->attr($reg_value[1]); 228 | break; 229 | } 230 | 231 | if(isset($reg_value[3])){ 232 | $this->data[$i][$key] = call_user_func($reg_value[3],$this->data[$i][$key],$key); 233 | }else if(isset($this->regArr['callback'])){ 234 | $this->data[$i][$key] = call_user_func($this->regArr['callback'],$this->data[$i][$key],$key); 235 | } 236 | } 237 | //重置数组指针 238 | reset($this->regArr); 239 | $i++; 240 | } 241 | } else { 242 | while (list($key, $reg_value) = each($this->regArr)) { 243 | if($key=='callback')continue; 244 | $document = phpQuery::newDocumentHTML($this->html); 245 | $tags = isset($reg_value[2])?$reg_value[2]:''; 246 | $lobj = pq($document)->find($reg_value[0]); 247 | $i = 0; 248 | foreach ($lobj as $item) { 249 | switch ($reg_value[1]) { 250 | case 'text': 251 | $this->data[$i][$key] = $this->_allowTags(pq($item)->html(),$tags); 252 | break; 253 | case 'html': 254 | $this->data[$i][$key] = $this->_stripTags(pq($item)->html(),$tags); 255 | break; 256 | default: 257 | $this->data[$i][$key] = pq($item)->attr($reg_value[1]); 258 | break; 259 | } 260 | 261 | if(isset($reg_value[3])){ 262 | $this->data[$i][$key] = call_user_func($reg_value[3],$this->data[$i][$key],$key); 263 | }else if(isset($this->regArr['callback'])){ 264 | $this->data[$i][$key] = call_user_func($this->regArr['callback'],$this->data[$i][$key],$key); 265 | } 266 | 267 | $i++; 268 | } 269 | } 270 | } 271 | if ($this->outputEncoding) { 272 | //编码转换 273 | $this->data = $this->_arrayConvertEncoding($this->data, $this->outputEncoding, $this->htmlEncoding); 274 | } 275 | phpQuery::$documents = array(); 276 | } 277 | 278 | /** 279 | * URL请求 280 | * @param $url 281 | * @return string 282 | */ 283 | private function _request($url) 284 | { 285 | if(function_exists('curl_init')){ 286 | $ch = curl_init(); 287 | curl_setopt($ch, CURLOPT_URL, $url); 288 | curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 289 | curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 290 | curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 291 | curl_setopt($ch, CURLOPT_AUTOREFERER, true); 292 | curl_setopt($ch, CURLOPT_REFERER, $url); 293 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 294 | curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36'); 295 | $result = curl_exec($ch); 296 | curl_close($ch); 297 | }elseif(version_compare(PHP_VERSION, '5.0.0')>=0){ 298 | $opts = array( 299 | 'http' => array( 300 | 'header' => "Referer:{$url}" 301 | ) 302 | ); 303 | $result = file_get_contents($url,false,stream_context_create($opts)); 304 | }else{ 305 | $result = file_get_contents($url); 306 | } 307 | return $result; 308 | } 309 | 310 | /** 311 | * 移除页面head区域代码 312 | * @param $html 313 | * @return mixed 314 | */ 315 | private function _removeHead($html) 316 | { 317 | return preg_replace('/.+<\/head>/is','',$html); 318 | } 319 | 320 | /** 321 | * 获取文件编码 322 | * @param $string 323 | * @return string 324 | */ 325 | private function _getEncode($string) 326 | { 327 | return mb_detect_encoding($string, array('ASCII', 'GB2312', 'GBK', 'UTF-8')); 328 | } 329 | 330 | /** 331 | * 转换数组值的编码格式 332 | * @param array $arr 333 | * @param string $toEncoding 334 | * @param string $fromEncoding 335 | * @return array 336 | */ 337 | private function _arrayConvertEncoding($arr, $toEncoding, $fromEncoding) 338 | { 339 | eval('$arr = '.iconv($fromEncoding, $toEncoding.'//IGNORE', var_export($arr,TRUE)).';'); 340 | return $arr; 341 | } 342 | 343 | /** 344 | * 简单的判断一下参数是否为一个URL链接 345 | * @param string $str 346 | * @return boolean 347 | */ 348 | private function _isURL($str) 349 | { 350 | if (preg_match('/^http(s)?:\\/\\/.+/', $str)) { 351 | return true; 352 | } 353 | return false; 354 | } 355 | 356 | /** 357 | * 去除特定的html标签 358 | * @param string $html 359 | * @param string $tags_str 多个标签名之间用空格隔开 360 | * @return string 361 | */ 362 | private function _stripTags($html,$tags_str) 363 | { 364 | $tagsArr = $this->_tag($tags_str); 365 | $html = $this->_removeTags($html,$tagsArr[1]); 366 | $p = array(); 367 | foreach ($tagsArr[0] as $tag) { 368 | $p[]="/(<(?:\/".$tag."|".$tag.")[^>]*>)/i"; 369 | } 370 | $html = preg_replace($p,"",trim($html)); 371 | return $html; 372 | } 373 | 374 | /** 375 | * 保留特定的html标签 376 | * @param string $html 377 | * @param string $tags_str 多个标签名之间用空格隔开 378 | * @return string 379 | */ 380 | private function _allowTags($html,$tags_str) 381 | { 382 | $tagsArr = $this->_tag($tags_str); 383 | $html = $this->_removeTags($html,$tagsArr[1]); 384 | $allow = ''; 385 | foreach ($tagsArr[0] as $tag) { 386 | $allow .= "<$tag> "; 387 | } 388 | return strip_tags(trim($html),$allow); 389 | } 390 | 391 | private function _tag($tags_str) 392 | { 393 | $tagArr = preg_split("/\s+/",$tags_str,-1,PREG_SPLIT_NO_EMPTY); 394 | $tags = array(array(),array()); 395 | foreach($tagArr as $tag) 396 | { 397 | if(preg_match('/-(.+)/', $tag,$arr)) 398 | { 399 | array_push($tags[1], $arr[1]); 400 | }else{ 401 | array_push($tags[0], $tag); 402 | } 403 | } 404 | return $tags; 405 | } 406 | 407 | /** 408 | * 移除特定的html标签 409 | * @param string $html 410 | * @param array $tags 标签数组 411 | * @return string 412 | */ 413 | private function _removeTags($html,$tags) 414 | { 415 | $tag_str = ''; 416 | if(count($tags)) 417 | { 418 | foreach ($tags as $tag) { 419 | $tag_str .= $tag_str?','.$tag:$tag; 420 | } 421 | phpQuery::$defaultCharset = $this->inputEncoding?$this->inputEncoding:$this->htmlEncoding; 422 | $doc = phpQuery::newDocumentHTML($html); 423 | pq($doc)->find($tag_str)->remove(); 424 | $html = pq($doc)->htmlOuter(); 425 | $doc->unloadDocument(); 426 | } 427 | return $html; 428 | } 429 | 430 | /** 431 | * 打印日志 432 | * @param string $message 433 | * @param string $level 434 | */ 435 | private function _log($message = '',$level = 'info') 436 | { 437 | if(!is_null(self::$logger)) 438 | { 439 | $url = $this->_isURL($this->page)?$this->page:'[html]'; 440 | $count = count($this->data); 441 | $level = empty($level)?($count?'info':'warning'):$level; 442 | $message = empty($message)?($count?'Get data successfully':'Get data failed'):$message; 443 | self::$logger->$level($message,array( 444 | 'page' => $url, 445 | 'count' => $count 446 | )); 447 | } 448 | } 449 | } 450 | 451 | /* 452 | class Autoload 453 | { 454 | public static function load($className) 455 | { 456 | $files = array( 457 | sprintf('%s/extensions/%s.php',__DIR__,$className), 458 | sprintf('%s/extensions/vendors/%s.php',__DIR__,$className) 459 | ); 460 | foreach ($files as $file) { 461 | if(is_file($file)){ 462 | require $file; 463 | return true; 464 | } 465 | } 466 | return false; 467 | } 468 | } 469 | 470 | spl_autoload_register(array('Autoload','load')); 471 | 472 | */ 473 | -------------------------------------------------------------------------------- /lib.php: -------------------------------------------------------------------------------- 1 | $v) { 88 | $data[$v['id']] = $v['snippet']['title']; 89 | } 90 | 91 | if($id=='all'){ 92 | return $data; 93 | }else{ 94 | return $data[$id]; 95 | } 96 | } 97 | 98 | //获取视频类别内容 99 | function Categories($id,$apikey,$pageToken='',$order='relevance',$regionCode=GJ_CODE){ 100 | $apilink='https://www.googleapis.com/youtube/v3/search?part=snippet&type=video&®ionCode='.$regionCode.'&hl=zh-ZH&maxResults=48&videoCategoryId='.$id.'&key='.$apikey.'&order='.$order.'&pageToken='.$pageToken; 101 | return json_decode(get_data($apilink),true); 102 | } 103 | 104 | 105 | //获取搜索数据 106 | function get_search_video($query,$apikey,$pageToken='',$type='video',$order='relevance',$regionCode=GJ_CODE){ 107 | $apilink='https://www.googleapis.com/youtube/v3/search?part=snippet&maxResults=48&order='.$order.'&type='.$type.'&q='.$query.'&key='.$apikey.'&pageToken='.$pageToken; 108 | return json_decode(get_data($apilink),true); 109 | } 110 | 111 | //api返回值时间转换函数1 112 | function covtime($youtube_time){ 113 | $start = new DateTime('@0'); 114 | $start->add(new DateInterval($youtube_time)); 115 | if(strlen($youtube_time)<=7){ 116 | return $start->format('i:s'); 117 | }else{ 118 | return $start->format('H:i:s'); 119 | } 120 | 121 | } 122 | 123 | //转换时间函数,计算发布时间几天前几年前 124 | function format_date($time){ 125 | $t=strtotime($time); 126 | $t=time()-$t; 127 | $f=array( 128 | '31536000'=>$lang['LIB_DCONV'][0], 129 | '2592000'=>$lang['LIB_DCONV'][1], 130 | '604800'=>$lang['LIB_DCONV'][2], 131 | '86400'=>$lang['LIB_DCONV'][3], 132 | '3600'=>$lang['LIB_DCONV'][4], 133 | '60'=>$lang['LIB_DCONV'][5], 134 | '1'=>$lang['LIB_DCONV'][6] 135 | ); 136 | foreach ($f as $k=>$v) { 137 | if (0 !=$c=floor($t/(int)$k)) { 138 | return $c.$v.$lang['LIB_AGO']; 139 | } 140 | } 141 | } 142 | 143 | //api返回值时间转换函数2 144 | function str2time($ts) { 145 | return date("Y-m-d H:i", strtotime($ts)); 146 | } 147 | 148 | //播放量转换 149 | function convertviewCount($value){ 150 | if($value <= 10000){ 151 | $number = $value; 152 | }else{ 153 | $number = $value / 1000 ; 154 | $number = round($number,1).'K'; 155 | 156 | } 157 | 158 | return $number; 159 | } 160 | //获取banner背景 161 | function get_banner($a,$apikey){ 162 | $apilink='https://www.googleapis.com/youtube/v3/channels?part=brandingSettings&id='.$a.'&key='.$apikey; 163 | $json=json_decode(get_data($apilink),true); 164 | if (array_key_exists('bannerTabletImageUrl',$json['items'][0]['brandingSettings']['image'])){ 165 | return $json['items'][0]['brandingSettings']['image']['bannerTabletImageUrl']; 166 | }else{ 167 | return 'https://c1.staticflickr.com/5/4546/24706755178_66c375d5ba_h.jpg'; 168 | } 169 | } 170 | $videotype=array( 171 | '3GP144P' => array('3GP','144P','3gpp'), 172 | '360P' => array('MP4','360P','mp4'), 173 | '720P' => array('MP4','720P','mp4'), 174 | 'WebM360P' => array('webM','360P','webm'), 175 | 'Unknown' => array('N/A','N/A','3gpp'), 176 | ); 177 | 178 | //获取相关频道 api不支持,靠采集完成 179 | require_once(dirname(__FILE__).'/inc/phpQuery.php'); 180 | require_once(dirname(__FILE__).'/inc/QueryList.php'); 181 | use QL\QueryList; 182 | function get_related_channel($id){ 183 | $channel='https://www.youtube.com/channel/'.$id; 184 | $rules = array( 185 | 'id' => array('.branded-page-related-channels .branded-page-related-channels-list li','data-external-id'), 186 | 'name' => array('.branded-page-related-channels .branded-page-related-channels-list li .yt-lockup .yt-lockup-content .yt-lockup-title a','text'), 187 | ); 188 | 189 | return $data = QueryList::Query(get_data($channel),$rules)->data; 190 | } 191 | 192 | //采集抓取随机推荐内容 193 | function random_recommend(){ 194 | $dat=get_data('https://www.youtube.com/?gl='.constant("GJ_CODE").'&hl='.$lang['YT_LANG']); 195 | $rules = array( 196 | 't' => array('#feed .individual-feed .section-list li .item-section li .feed-item-container .feed-item-dismissable .shelf-title-table .shelf-title-row h2 .branded-page-module-title-text','text'), 197 | 'html' => array('#feed .individual-feed .section-list li .item-section li .feed-item-container .feed-item-dismissable .compact-shelf .yt-viewport .yt-uix-shelfslider-list','html'), 198 | ); 199 | 200 | $rules1 = array( 201 | 'id' => array('li .yt-lockup ','data-context-item-id'), 202 | 'title' => array('li .yt-lockup .yt-lockup-dismissable .yt-lockup-content .yt-lockup-title a','text'), 203 | ); 204 | 205 | $data = QueryList::Query($dat,$rules)->data; 206 | 207 | $ldata=array(); 208 | foreach ($data as $v) { 209 | $d = QueryList::Query($v['html'],$rules1)->data; 210 | $ldata[]=array( 211 | 't'=> $v['t'], 212 | 'dat' => $d 213 | ); 214 | } 215 | array_shift($ldata); 216 | return $ldata; 217 | } 218 | //视频下载 219 | function video_down($v,$name){ 220 | $yt = new YouTubeDownloader(); 221 | $links = $yt->getDownloadLinks("https://www.youtube.com/watch?v=$v"); 222 | echo ' 223 | 224 | 225 | 226 | 227 | '; 228 | foreach ($links as $value) { 229 | global $videotype; 230 | echo ' 231 | 232 | 233 | 234 | 235 | 236 | '; 237 | } 238 | echo '
'.$lang['LIB_D_FORMAT'].''.$lang['LIB_D_TYPE'].''.$lang['LIB_D_DOWN'].'
'.$videotype[$value['format']][0].''.$videotype[$value['format']][1].''.$lang['LIB_D_DOWN'].'
'; 239 | } 240 | 241 | //判断高清微缩图是否存在 242 | function get_thumbnail_code($vid){ 243 | $thumblink='https://img.youtube.com/vi/'.$vid.'/maxresdefault.jpg'; 244 | $oCurl = curl_init(); 245 | $header[] = "Content-type: application/x-www-form-urlencoded"; 246 | $user_agent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36"; 247 | curl_setopt($oCurl, CURLOPT_URL, $thumblink); 248 | curl_setopt($oCurl, CURLOPT_HTTPHEADER,$header); 249 | curl_setopt($oCurl, CURLOPT_HEADER, true); 250 | curl_setopt($oCurl, CURLOPT_NOBODY, true); 251 | curl_setopt($oCurl, CURLOPT_USERAGENT,$user_agent); 252 | curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 ); 253 | curl_setopt($oCurl, CURLOPT_POST, false); 254 | $sContent = curl_exec($oCurl); 255 | $headerSize = curl_getinfo($oCurl, CURLINFO_HTTP_CODE); 256 | curl_close($oCurl); 257 | if($headerSize == '404'){ 258 | return 'https://img.youtube.com/vi/'.$vid.'/hqdefault.jpg'; 259 | }else{ 260 | return 'https://img.youtube.com/vi/'.$vid.'/maxresdefault.jpg'; 261 | } 262 | } 263 | 264 | 265 | //解析历史记录 266 | function Hislist($str,$apikey){ 267 | $str=str_replace('@',',',$str); 268 | $apilink='https://www.googleapis.com/youtube/v3/videos?part=snippet,contentDetails&id='.$str.'&key='.$apikey; 269 | return json_decode(get_data($apilink),true); 270 | } 271 | 272 | //获取频道所属国家 273 | $CountryID=$lang['LIB_COUNTRY_ID']; 274 | function get_country($c){ 275 | global $CountryID; 276 | return $CountryID[$c]; 277 | } 278 | 279 | //url字符串加解密 280 | function strencode($string,$key='09KxDsIIe|+]8Fo{YPa$;^PzFpsxS9&d;!l;~M>2?N7G}`@?UJ@{FDI') { 281 | $key = sha1($key); 282 | $strLen = strlen($string); 283 | $keyLen = strlen($key); 284 | for ($i = 0; $i < $strLen; $i++) { 285 | $ordStr = ord(substr($string,$i,1)); 286 | if (@$j == $keyLen) { $j = 0; } 287 | $ordKey = ord(substr($key,$j,1)); 288 | @$j++; 289 | @$hash .= strrev(base_convert(dechex($ordStr + $ordKey),16,36)); 290 | } 291 | return 'Urls://'.$hash; 292 | } 293 | function strdecode($string,$key='09KxDsIIe|+]8Fo{YPa$;^PzFpsxS9&d;!l;~M>2?N7G}`@?UJ@{FDI') { 294 | $string= ltrim($string, 'Urls://'); 295 | $key = sha1($key); 296 | $strLen = strlen($string); 297 | $keyLen = strlen($key); 298 | for ($i = 0; $i < $strLen; $i+=2) { 299 | $ordStr = hexdec(base_convert(strrev(substr($string,$i,2)),36,16)); 300 | if (@$j == $keyLen) { @$j = 0; } 301 | $ordKey = ord(substr($key,@$j,1)); 302 | @$j++; 303 | @$hash .= chr($ordStr - $ordKey); 304 | } 305 | return $hash; 306 | } 307 | 308 | //分享功能 309 | $title=$lang['LIB_SHAREIT_FWYI']; 310 | function shareit($id,$title){ 311 | $pic=ROOT_PART.'thumbnail.php%3Fvid%3D'.$id; 312 | $url=ROOT_PART.'watch.php%3Fv%3D'.$id; 313 | $title=str_replace('&','||',$title); 314 | $title=str_replace('"',' ',$title); 315 | $title=str_replace("'",' ',$title); 316 | $des='【'.$lang['LIB_FWYI'].'】'.$lang['LIB_SHAREIT_M1'].'《'.$title.'》'.$lang['LIB_SHAREIT_M2']; 317 | return "
318 | 320 | 321 | 322 | 323 | 324 | 325 |
326 |
327 | ".$lang['LIB_SHAREIT_SC']." 328 |
329 | 330 | 331 |
"; 332 | 333 | } 334 | // 335 | function html5_player($id){ 336 | $yt = new YouTubeDownloader(); 337 | $links = $yt->getDownloadLinks('https://www.youtube.com/watch?v='.$id); 338 | if(count($links)!=1){ 339 | echo''; 394 | }else{ 395 | echo ''; 396 | } 397 | } 398 | //获取安装目录 399 | function Root_part(){ 400 | $http=isset($_SERVER['HTTPS']) ? 'https://' : 'http://'; 401 | $part=rtrim($_SERVER['SCRIPT_NAME'],basename($_SERVER['SCRIPT_NAME'])); 402 | $domain=$_SERVER['SERVER_NAME']; 403 | return "$http"."$domain"."$part"; 404 | } 405 | ?> 406 | -------------------------------------------------------------------------------- /inc/4.js: -------------------------------------------------------------------------------- 1 | /*! videojs-resolution-switcher - 2015-7-26 2 | * Copyright (c) 2016 Kasper Moskwiak 3 | * Modified by Pierre Kraft 4 | * Licensed under the Apache-2.0 license. */ 5 | 6 | (function() { 7 | /* jshint eqnull: true*/ 8 | /* global require */ 9 | 'use strict'; 10 | var videojs = null; 11 | if(typeof window.videojs === 'undefined' && typeof require === 'function') { 12 | videojs = require('video.js'); 13 | } else { 14 | videojs = window.videojs; 15 | } 16 | 17 | (function(window, videojs) { 18 | 19 | 20 | var defaults = {}, 21 | videoJsResolutionSwitcher, 22 | currentResolution = {}, // stores current resolution 23 | menuItemsHolder = {}; // stores menuItems 24 | 25 | function setSourcesSanitized(player, sources, label, customSourcePicker) { 26 | currentResolution = { 27 | label: label, 28 | sources: sources 29 | }; 30 | if(typeof customSourcePicker === 'function'){ 31 | return customSourcePicker(player, sources, label); 32 | } 33 | return player.src(sources.map(function(src) { 34 | return {src: src.src, type: src.type, res: src.res}; 35 | })); 36 | } 37 | 38 | /* 39 | * Resolution menu item 40 | */ 41 | var MenuItem = videojs.getComponent('MenuItem'); 42 | var ResolutionMenuItem = videojs.extend(MenuItem, { 43 | constructor: function(player, options, onClickListener, label){ 44 | this.onClickListener = onClickListener; 45 | this.label = label; 46 | // Sets this.player_, this.options_ and initializes the component 47 | MenuItem.call(this, player, options); 48 | this.src = options.src; 49 | 50 | this.on('click', this.onClick); 51 | this.on('touchstart', this.onClick); 52 | 53 | if (options.initialySelected) { 54 | this.showAsLabel(); 55 | this.selected(true); 56 | 57 | this.addClass('vjs-selected'); 58 | } 59 | }, 60 | showAsLabel: function() { 61 | // Change menu button label to the label of this item if the menu button label is provided 62 | if(this.label) { 63 | this.label.innerHTML = this.options_.label; 64 | } 65 | }, 66 | onClick: function(customSourcePicker){ 67 | this.onClickListener(this); 68 | // Remember player state 69 | var currentTime = this.player_.currentTime(); 70 | var isPaused = this.player_.paused(); 71 | this.showAsLabel(); 72 | 73 | // add .current class 74 | this.addClass('vjs-selected'); 75 | 76 | // Hide bigPlayButton 77 | if(!isPaused){ 78 | this.player_.bigPlayButton.hide(); 79 | } 80 | if(typeof customSourcePicker !== 'function' && 81 | typeof this.options_.customSourcePicker === 'function'){ 82 | customSourcePicker = this.options_.customSourcePicker; 83 | } 84 | // Change player source and wait for loadeddata event, then play video 85 | // loadedmetadata doesn't work right now for flash. 86 | // Probably because of https://github.com/videojs/video-js-swf/issues/124 87 | // If player preload is 'none' and then loadeddata not fired. So, we need timeupdate event for seek handle (timeupdate doesn't work properly with flash) 88 | var handleSeekEvent = 'loadeddata'; 89 | if(this.player_.techName_ !== 'Youtube' && this.player_.preload() === 'none' && this.player_.techName_ !== 'Flash') { 90 | handleSeekEvent = 'timeupdate'; 91 | } 92 | setSourcesSanitized(this.player_, this.src, this.options_.label, customSourcePicker).one(handleSeekEvent, function() { 93 | this.player_.currentTime(currentTime); 94 | this.player_.handleTechSeeked_(); 95 | if(!isPaused){ 96 | // Start playing and hide loadingSpinner (flash issue ?) 97 | this.player_.play().handleTechSeeked_(); 98 | } 99 | this.player_.trigger('resolutionchange'); 100 | }); 101 | } 102 | }); 103 | 104 | 105 | /* 106 | * Resolution menu button 107 | */ 108 | var MenuButton = videojs.getComponent('MenuButton'); 109 | var ResolutionMenuButton = videojs.extend(MenuButton, { 110 | constructor: function(player, options, settings, label){ 111 | this.sources = options.sources; 112 | this.label = label; 113 | this.label.innerHTML = options.initialySelectedLabel; 114 | // Sets this.player_, this.options_ and initializes the component 115 | MenuButton.call(this, player, options, settings); 116 | this.controlText('Quality'); 117 | 118 | if(settings.dynamicLabel){ 119 | this.el().appendChild(label); 120 | }else{ 121 | var staticLabel = document.createElement('span'); 122 | videojs.addClass(staticLabel, 'vjs-resolution-button-staticlabel'); 123 | this.el().appendChild(staticLabel); 124 | } 125 | }, 126 | createItems: function(){ 127 | var menuItems = []; 128 | var labels = (this.sources && this.sources.label) || {}; 129 | var onClickUnselectOthers = function(clickedItem) { 130 | menuItems.map(function(item) { 131 | item.selected(item === clickedItem); 132 | item.removeClass('vjs-selected'); 133 | }); 134 | }; 135 | 136 | for (var key in labels) { 137 | if (labels.hasOwnProperty(key)) { 138 | menuItems.push(new ResolutionMenuItem( 139 | this.player_, 140 | { 141 | label: key, 142 | src: labels[key], 143 | initialySelected: key === this.options_.initialySelectedLabel, 144 | customSourcePicker: this.options_.customSourcePicker 145 | }, 146 | onClickUnselectOthers, 147 | this.label)); 148 | // Store menu item for API calls 149 | menuItemsHolder[key] = menuItems[menuItems.length - 1]; 150 | } 151 | } 152 | return menuItems; 153 | } 154 | }); 155 | 156 | /** 157 | * Initialize the plugin. 158 | * @param {object} [options] configuration for the plugin 159 | */ 160 | videoJsResolutionSwitcher = function(options) { 161 | var settings = videojs.mergeOptions(defaults, options), 162 | player = this, 163 | label = document.createElement('span'), 164 | groupedSrc = {}; 165 | 166 | videojs.addClass(label, 'vjs-resolution-button-label'); 167 | 168 | /** 169 | * Updates player sources or returns current source URL 170 | * @param {Array} [src] array of sources [{src: '', type: '', label: '', res: ''}] 171 | * @returns {Object|String|Array} videojs player object if used as setter or current source URL, object, or array of sources 172 | */ 173 | player.updateSrc = function(src){ 174 | //Return current src if src is not given 175 | if(!src){ return player.src(); } 176 | // Dispose old resolution menu button before adding new sources 177 | if(player.controlBar.resolutionSwitcher){ 178 | player.controlBar.resolutionSwitcher.dispose(); 179 | delete player.controlBar.resolutionSwitcher; 180 | } 181 | //Sort sources 182 | src = src.sort(compareResolutions); 183 | groupedSrc = bucketSources(src); 184 | var choosen = chooseSrc(groupedSrc, src); 185 | var menuButton = new ResolutionMenuButton(player, { sources: groupedSrc, initialySelectedLabel: choosen.label , initialySelectedRes: choosen.res , customSourcePicker: settings.customSourcePicker}, settings, label); 186 | videojs.addClass(menuButton.el(), 'vjs-resolution-button'); 187 | player.controlBar.resolutionSwitcher = player.controlBar.el_.insertBefore(menuButton.el_, player.controlBar.getChild('fullscreenToggle').el_); 188 | player.controlBar.resolutionSwitcher.dispose = function(){ 189 | this.parentNode.removeChild(this); 190 | }; 191 | return setSourcesSanitized(player, choosen.sources, choosen.label); 192 | }; 193 | 194 | /** 195 | * Returns current resolution or sets one when label is specified 196 | * @param {String} [label] label name 197 | * @param {Function} [customSourcePicker] custom function to choose source. Takes 3 arguments: player, sources, label. Must return player object. 198 | * @returns {Object} current resolution object {label: '', sources: []} if used as getter or player object if used as setter 199 | */ 200 | player.currentResolution = function(label, customSourcePicker){ 201 | if(label == null) { return currentResolution; } 202 | if(menuItemsHolder[label] != null){ 203 | menuItemsHolder[label].onClick(customSourcePicker); 204 | } 205 | return player; 206 | }; 207 | 208 | /** 209 | * Returns grouped sources by label, resolution and type 210 | * @returns {Object} grouped sources: { label: { key: [] }, res: { key: [] }, type: { key: [] } } 211 | */ 212 | player.getGroupedSrc = function(){ 213 | return groupedSrc; 214 | }; 215 | 216 | /** 217 | * Method used for sorting list of sources 218 | * @param {Object} a - source object with res property 219 | * @param {Object} b - source object with res property 220 | * @returns {Number} result of comparation 221 | */ 222 | function compareResolutions(a, b){ 223 | if(!a.res || !b.res){ return 0; } 224 | return (+b.res)-(+a.res); 225 | } 226 | 227 | /** 228 | * Group sources by label, resolution and type 229 | * @param {Array} src Array of sources 230 | * @returns {Object} grouped sources: { label: { key: [] }, res: { key: [] }, type: { key: [] } } 231 | */ 232 | function bucketSources(src){ 233 | var resolutions = { 234 | label: {}, 235 | res: {}, 236 | type: {} 237 | }; 238 | src.map(function(source) { 239 | initResolutionKey(resolutions, 'label', source); 240 | initResolutionKey(resolutions, 'res', source); 241 | initResolutionKey(resolutions, 'type', source); 242 | 243 | appendSourceToKey(resolutions, 'label', source); 244 | appendSourceToKey(resolutions, 'res', source); 245 | appendSourceToKey(resolutions, 'type', source); 246 | }); 247 | return resolutions; 248 | } 249 | 250 | function initResolutionKey(resolutions, key, source) { 251 | if(resolutions[key][source[key]] == null) { 252 | resolutions[key][source[key]] = []; 253 | } 254 | } 255 | 256 | function appendSourceToKey(resolutions, key, source) { 257 | resolutions[key][source[key]].push(source); 258 | } 259 | 260 | /** 261 | * Choose src if option.default is specified 262 | * @param {Object} groupedSrc {res: { key: [] }} 263 | * @param {Array} src Array of sources sorted by resolution used to find high and low res 264 | * @returns {Object} {res: string, sources: []} 265 | */ 266 | function chooseSrc(groupedSrc, src){ 267 | var selectedRes = settings['default']; // use array access as default is a reserved keyword 268 | var selectedLabel = ''; 269 | if (selectedRes === 'high') { 270 | selectedRes = src[0].res; 271 | selectedLabel = src[0].label; 272 | } else if (selectedRes === 'low' || selectedRes == null || !groupedSrc.res[selectedRes]) { 273 | // Select low-res if default is low or not set 274 | selectedRes = src[src.length - 1].res; 275 | selectedLabel = src[src.length -1].label; 276 | } else if (groupedSrc.res[selectedRes]) { 277 | selectedLabel = groupedSrc.res[selectedRes][0].label; 278 | } 279 | 280 | return {res: selectedRes, label: selectedLabel, sources: groupedSrc.res[selectedRes]}; 281 | } 282 | 283 | function initResolutionForYt(player){ 284 | // Init resolution 285 | player.tech_.ytPlayer.setPlaybackQuality('default'); 286 | 287 | // Capture events 288 | player.tech_.ytPlayer.addEventListener('onPlaybackQualityChange', function(){ 289 | player.trigger('resolutionchange'); 290 | }); 291 | 292 | // We must wait for play event 293 | player.one('play', function(){ 294 | var qualities = player.tech_.ytPlayer.getAvailableQualityLevels(); 295 | // Map youtube qualities names 296 | var _yts = { 297 | highres: {res: 1080, label: '1080', yt: 'highres'}, 298 | hd1080: {res: 1080, label: '1080', yt: 'hd1080'}, 299 | hd720: {res: 720, label: '720', yt: 'hd720'}, 300 | large: {res: 480, label: '480', yt: 'large'}, 301 | medium: {res: 360, label: '360', yt: 'medium'}, 302 | small: {res: 240, label: '240', yt: 'small'}, 303 | tiny: {res: 144, label: '144', yt: 'tiny'}, 304 | auto: {res: 0, label: 'auto', yt: 'default'} 305 | }; 306 | 307 | var _sources = []; 308 | 309 | qualities.map(function(q){ 310 | _sources.push({ 311 | src: player.src().src, 312 | type: player.src().type, 313 | label: _yts[q].label, 314 | res: _yts[q].res, 315 | _yt: _yts[q].yt 316 | }); 317 | }); 318 | 319 | groupedSrc = bucketSources(_sources); 320 | 321 | // Overwrite defualt sourcePicer function 322 | var _customSourcePicker = function(_player, _sources, _label){ 323 | player.tech_.ytPlayer.setPlaybackQuality(_sources[0]._yt); 324 | return player; 325 | }; 326 | 327 | var choosen = {label: 'auto', res: 0, sources: groupedSrc.label.auto}; 328 | var menuButton = new ResolutionMenuButton(player, { 329 | sources: groupedSrc, 330 | initialySelectedLabel: choosen.label, 331 | initialySelectedRes: choosen.res, 332 | customSourcePicker: _customSourcePicker 333 | }, settings, label); 334 | 335 | menuButton.el().classList.add('vjs-resolution-button'); 336 | player.controlBar.resolutionSwitcher = player.controlBar.addChild(menuButton); 337 | }); 338 | } 339 | 340 | player.ready(function(){ 341 | if(player.options_.sources.length > 1){ 342 | // tech: Html5 and Flash 343 | // Create resolution switcher for videos form tag inside
'; 23 | exit; 24 | } 25 | echo ' '; 40 | echo '
'; 41 | if (array_key_exists("nextPageToken",$videodata) && array_key_exists("prevPageToken",$videodata) ) { 42 | 43 | echo''.$lang['AJAX_PREVIOUS'].' 44 | '.$lang['AJAX_NEXT'].' 45 | '; 46 | } elseif (array_key_exists("nextPageToken",$videodata) && !array_key_exists("prevPageToken",$videodata)) { 47 | echo ''.$lang['AJAX_NEXT'].' 48 | '; 49 | } elseif (!array_key_exists("nextPageToken",$videodata) && !array_key_exists("prevPageToken",$videodata)) {} else { 50 | echo ''.$lang['AJAX_PREVIOUS'].'' ; 51 | } 52 | echo'
'; 53 | break; 54 | case 'recommend': 55 | $random=random_recommend(); 56 | foreach($random as $v) { 57 | echo ''.$v['t'].''; 58 | echo''; 67 | } 68 | break; 69 | case 'channel': 70 | $videodata=get_search_video($q,APIKEY,$ptk,'channel',$order,GJ_CODE); 71 | echo'
'; 72 | foreach($videodata['items'] as $v) { 73 | echo '
74 | 75 |
76 |
'.$v['snippet']['channelTitle'].'
77 |

'.$v['snippet']['description'].'

78 |
79 |
'; 80 | } 81 | echo'
'; 82 | echo '
'; 83 | if (array_key_exists("nextPageToken",$videodata) && array_key_exists("prevPageToken",$videodata) ) { 84 | 85 | echo''.$lang['AJAX_PREVIOUS'].' 86 | '.$lang['AJAX_NEXT'].' 87 | '; 88 | } elseif (array_key_exists("nextPageToken",$videodata) && !array_key_exists("prevPageToken",$videodata)) { 89 | echo ''.$lang['AJAX_NEXT'].' 90 | '; 91 | } elseif (!array_key_exists("nextPageToken",$videodata) && !array_key_exists("prevPageToken",$videodata)) {} else { 92 | echo ''.$lang['AJAX_PREVIOUS'].'' ; 93 | } 94 | echo'
'; 95 | break; 96 | case 'channels': 97 | $video=get_channel_video($_GET['channelid'],$ptk,APIKEY,GJ_CODE); 98 | if($video['pageInfo']['totalResults']<=1){ 99 | echo'

'.$lang['AJAX_ERR2'].'

'; 100 | exit; 101 | } 102 | foreach($video['items'] as $v) { 103 | echo '
104 | 110 |
111 |
112 | '.$v["snippet"]["title"].' 113 |
114 |

'.$v['snippet']['description'].'

115 | 116 |
117 |
'; 118 | } 119 | 120 | 121 | if (array_key_exists("nextPageToken",$video) && array_key_exists("prevPageToken",$video) ) { 122 | 123 | echo''.$lang['AJAX_PREVIOUS'].' 124 | '.$lang['AJAX_NEXT'].' 125 | '; 126 | } elseif (array_key_exists("nextPageToken",$video) && !array_key_exists("prevPageToken",$video)) { 127 | echo ''.$lang['AJAX_NEXT'].' 128 | '; 129 | } elseif (!array_key_exists("nextPageToken",$video) && !array_key_exists("prevPageToken",$video)) {} else { 130 | echo ''.$lang['AJAX_PREVIOUS'].'' ; 131 | } 132 | echo''; 133 | break; 134 | case 'related': 135 | $related=get_related_video($_GET['v'],APIKEY); 136 | 137 | foreach($related["items"] as $v) { 138 | echo'
139 |
140 | 141 | 142 | 143 |
144 |
145 |
146 | '.$v["snippet"]["title"].' 147 |
148 |

' 149 | .format_date($v["snippet"]["publishedAt"]). 150 | '

151 |
152 |
'; 153 | } 154 | break; 155 | case 'menu': 156 | $vica=videoCategories(); 157 | 158 | echo ' 166 | '; 173 | break; 174 | 175 | case 'trending': 176 | $home_data=get_trending(APIKEY,'18','',GJ_CODE); 177 | echo''; 189 | break; 190 | 191 | 192 | 193 | case 'DMCA': 194 | echo '
'.$lang['AJAX_DMCA_DIS'].'
'; 195 | echo '
'.$lang['AJAX_DMCA_B'].'
'; 196 | echo '

'.$lang['AJAX_DMCA_M1'].'
197 | '.$lang['AJAX_DMCA_M2'].'
198 | '.$lang['AJAX_DMCA_M3'].' '.EMAIL.'! '.$lang['AJAX_DMCA_M4'].'

'; 199 | echo '
'.$lang['AJAX_USER_NOTICE'].'
'; 200 | echo '

'.$lang['AJAX_USER_NOTICE_M1'].'
201 | '.$lang['AJAX_USER_NOTICE_M2'].'
202 | '.$lang['AJAX_USER_NOTICE_M3'].'
203 | '.$lang['AJAX_USER_NOTICE_M4'].'
204 | '.$lang['AJAX_USER_NOTICE_M5'].'

'; 205 | echo '
'.$lang['AJAX_DIS'].'
'; 206 | echo '

'.$lang['AJAX_DIS_M1'].'
207 | '.$lang['AJAX_DIS_M2'].'
208 | 209 |

'; 210 | break; 211 | case 'api': 212 | echo '
'.$lang['AJAX_API'].'
'; 213 | echo '

'.$lang['AJAX_API_IA'].'

214 |

'.$lang['AJAX_API_RM'].'

'.$lang['AJAX_API_PN'].''.$lang['AJAX_API_PD'].'
type'.$lang['AJAX_API_RT'].'
v'.$lang['AJAX_API_YTVID'].'
' 215 | ; 216 | echo '
'.$lang['AJAX_API_GVINF'].'
'; 217 | echo '

'.$lang['AJAX_API_EXAMPLE'].dirname('http://'.$_SERVER['SERVER_NAME'].$_SERVER["REQUEST_URI"]).'/api.php?type=info&v=LsDwn06bwjM

218 |

'.$lang['AJAX_API_RVALJSON'].'

'; 219 | 220 | echo '
'.$lang['AJAX_API_SDL'].'
'; 221 | echo '

'.$lang['AJAX_API_EXAMPLE'].dirname('http://'.$_SERVER['SERVER_NAME'].$_SERVER["REQUEST_URI"]).'/api.php?type=downlink&v=LsDwn06bwjM

222 |

'.$lang['AJAX_API_RVALJSON'].'

'; 223 | break; 224 | case 'videos': 225 | echo '
'.$lang['AJAX_VIDDOW'].'
'; 226 | echo '
227 |
228 | 229 | 230 |
231 |
'; 232 | if(isset($_GET['type']) && isset($_GET['v'])){ 233 | echo '
'; 234 | $viddata=get_video_info($_GET['v'],APIKEY); 235 | echo '
'.$viddata['items']['0']['snippet']['title'].'
'; 236 | echo '
'; 237 | echo video_down($_GET['v'],$viddata['items']['0']['snippet']['title']); 238 | echo '
'; 239 | }else{ 240 | echo '

'.$lang['AJAX_TIP1'].'

'; 241 | } 242 | echo ' 245 | '; 246 | break; 247 | 248 | 249 | case 'trendinglist': 250 | $home=get_trending(APIKEY,'48',$ptk,GJ_CODE); 251 | echo '
'.$lang['AJAX_POPULAR'].'
'; 252 | echo''; 266 | if (array_key_exists("nextPageToken",$home) && array_key_exists("prevPageToken",$home) ) { 267 | 268 | echo''.$lang['AJAX_PREVIOUS'].' 269 | '.$lang['AJAX_NEXT'].' 270 | '; 271 | } elseif (array_key_exists("nextPageToken",$home) && !array_key_exists("prevPageToken",$home)) { 272 | echo ''.$lang['AJAX_NEXT'].' 273 | '; 274 | } elseif (!array_key_exists("nextPageToken",$home) && !array_key_exists("prevPageToken",$home)) {} else { 275 | echo ''.$lang['AJAX_PREVIOUS'].'' ; 276 | } 277 | break; 278 | 279 | 280 | 281 | case 'history': 282 | $hisdata=Hislist($_COOKIE['history'],APIKEY); 283 | echo '
'.$lang['AJAX_HIST_REC'].'
'; 284 | if($hisdata['pageInfo']['totalResults'] ==0){echo '';exit();} 288 | foreach($hisdata["items"] as $v) { 289 | $description = strlen($v['snippet']['description']) > 250 ? substr($v['snippet']['description'],0,250)."...." : $v['snippet']['description']; 290 | echo '
291 | 297 |
298 |
299 | '.$v["snippet"]["title"].' 300 |
301 |

'.$description.'

302 | 303 |
304 |
'; 305 | 306 | } 307 | break; 308 | 309 | 310 | case 'videodownload': 311 | if(stripos($_GET['link'],'youtu.be') !== false || stripos($_GET['link'],'youtube.com') !== false || stripos($_GET['link'],'watch?v=') !== false ){}else{echo '
'.$lang['AJAX_ERR3'].'
';break;exit();} 312 | preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?&\"'>]+)/", $_GET['link'], $mats); 313 | $viddata=get_video_info($mats[1],APIKEY); 314 | echo '
'.$viddata['items']['0']['snippet']['title'].'
'; 315 | echo '
'; 316 | echo video_down($mats[1],$viddata['items']['0']['snippet']['title']); 317 | break; 318 | 319 | case 'category': 320 | $category=Categories($sortid,APIKEY,$ptk,$order,GJ_CODE); 321 | if($category['pageInfo']['totalResults']=='0'){ 322 | echo ''; 325 | exit(); 326 | } 327 | echo''; 340 | if (array_key_exists("nextPageToken",$category) && array_key_exists("prevPageToken",$category) ) { 341 | 342 | echo''.$lang['AJAX_PREVIOUS'].' 343 | '.$lang['AJAX_NEXT'].' 344 | '; 345 | } elseif (array_key_exists("nextPageToken",$category) && !array_key_exists("prevPageToken",$category)) { 346 | echo ''.$lang['AJAX_NEXT'].' 347 | '; 348 | } elseif (!array_key_exists("nextPageToken",$category) && !array_key_exists("prevPageToken",$category)) {} else { 349 | echo ''.$lang['AJAX_PREVIOUS'].'' ; 350 | } 351 | 352 | break; 353 | } 354 | 355 | ?> 356 | --------------------------------------------------------------------------------