diff options
Diffstat (limited to 'tools/extract.php')
-rw-r--r-- | tools/extract.php | 518 |
1 files changed, 518 insertions, 0 deletions
diff --git a/tools/extract.php b/tools/extract.php new file mode 100644 index 0000000..2b06a5f --- /dev/null +++ b/tools/extract.php @@ -0,0 +1,518 @@ +<?php + +$id = $video_id; + +function getc($url) { + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_ENCODING, 'gzip'); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + $data = curl_exec($ch); + curl_close($ch); + + return $data; +} + +function cut_yt($ganti) { + $arayganti = array('Youtube','youtube','YouTube'); + $ganti = str_replace($arayganti,'',$ganti); + return $ganti; +} + +function exformat($itag) { + switch ($itag) { + case "5": + return "flv, video, 240p, audio"; + break; + case "6": + return "flv, video, 270p, audio"; + break; + case "13": + return "3gp, video, audio"; + break; + case "17": + return "3gp, video, 144p, audio"; + break; + case "18": + return "mp4, video, 360p, audio"; + break; + case "22": + return "mp4, video, 720p, audio"; + break; + case "34": + return "flv, video, 360p, audio"; + break; + case "35": + return "flv, video, 480p, audio"; + break; + case "36": + return "3gp, video, audio"; + break; + case "37": + return "mp4, video, 1080p, audio"; + break; + case "38": + return "mp4, video, 3072p, audio"; + break; + case "43": + return "webm, video, 360p, audio"; + break; + case "44": + return "webm, video, 480p, audio"; + break; + case "45": + return "webm, video, 720p, audio"; + break; + case "46": + return "webm, video, 1080p, audio"; + break; + case "59": + return "mp4, video, 480p, audio"; + break; + case "78": + return "mp4, video, 480p, audio"; + break; + case "82": + return "mp4, video, 360p, audio"; + break; + case "83": + return "mp4, video, 480p, audio"; + break; + case "84": + return "mp4, video, 720p, audio"; + break; + case "85": + return "mp4, video, 1080p, audio"; + break; + case "100": + return "webm, video, 360p, audio"; + break; + case "101": + return "webm, video, 480p, audio"; + break; + case "102": + return "webm, video, 720p, audio"; + break; + case "91": + return "mp4, video, 144p, audio"; + break; + case "92": + return "mp4, video, 240p, audio"; + break; + case "93": + return "mp4, video, 360p, audio"; + break; + case "94": + return "mp4, video, 480p, audio"; + break; + case "95": + return "mp4, video, 720p, audio"; + break; + case "96": + return "mp4, video, 1080p, audio"; + break; + case "132": + return "mp4, video, 240p, audio"; + break; + case "151": + return "mp4, video, 72p, audio"; + break; + case "133": + return "mp4, video, 240p"; + break; + case "134": + return "mp4, video, 360p"; + break; + case "135": + return "mp4, video, 480p"; + break; + case "136": + return "mp4, video, 720p"; + break; + case "137": + return "mp4, video, 1080p"; + break; + case "138": + return "mp4, video"; + break; + case "160": + return "mp4, video, 144p"; + break; + case "212": + return "mp4, video, 480p"; + break; + case "264": + return "mp4, video, 1440p"; + break; + case "298": + return "mp4, video, 720p"; + break; + case "299": + return "mp4, video, 1080p"; + break; + case "266": + return "mp4, video, 2160p"; + break; + case "139": + return "m4a, audio"; + break; + case "140": + return "m4a, audio"; + break; + case "141": + return "m4a, audio"; + break; + case "256": + return "m4a, audio"; + break; + case "258": + return "m4a, audio"; + break; + case "325": + return "m4a, audio"; + break; + case "328": + return "m4a, audio"; + break; + case "167": + return "webm, video, 360p"; + break; + case "168": + return "webm, video, 480p"; + break; + case "169": + return "webm, video, 720p"; + break; + case "170": + return "webm, video, 1080p"; + break; + case "218": + return "webm, video, 480p"; + break; + case "219": + return "webm, video, 480p"; + break; + case "278": + return "webm, video, 144p"; + break; + case "242": + return "webm, video, 240p"; + break; + case "243": + return "webm, video, 360p"; + break; + case "244": + return "webm, video, 480p"; + break; + case "245": + return "webm, video, 480p"; + break; + case "246": + return "webm, video, 480p"; + break; + case "247": + return "webm, video, 720p"; + break; + case "248": + return "webm, video, 1080p"; + break; + case "271": + return "webm, video, 1440p"; + break; + case "272": + return "webm, video, 2160p"; + break; + case "302": + return "webm, video, 720p"; + break; + case "303": + return "webm, video, 1080p"; + break; + case "308": + return "webm, video, 1440p"; + break; + case "313": + return "webm, video, 2160p"; + break; + case "315": + return "webm, video, 2160p"; + break; + case "171": + return "webm, audio"; + break; + case "249": + return "webm, audio"; + break; + case "250": + return "webm, audio"; + break; + case "251": + return "webm, audio"; + break; + case "394": + return "video"; + break; + case "395": + return "video"; + break; + case "396": + return "video"; + break; + case "397": + return "video"; + break; + default: + return $itag; + break; + } +} + +$a = getc('https://www.youtube.com/embed/'.$id); + +$ccc=explode('s/player/', $a); +$ddd=explode('/www-player.css', $ccc[1]); + +$gsts = file_get_contents('https://www.youtube.com/s/player/'.$ddd[0].'/player_ias.vflset/en_US/base.js'); + +function getchiper($decipherScript) { + $decipherPatterns = explode('.split("")', $decipherScript); + unset($decipherPatterns[0]); + foreach ($decipherPatterns as $value) { + $value = explode('.join("")', explode('}', $value)[0]); + if (count($value) === 2) { + $value = explode(';', $value[0]); + array_pop($value); + unset($value[0]); + $decipherPatterns = implode(';', $value); + break; + } + } + preg_match_all('/(?<=;).*?(?=\[|\.)/', $decipherPatterns, $deciphers); + if ($deciphers && count($deciphers[0]) >= 2) { + $deciphers = $deciphers[0][0]; + $deciphersObjectVar = $decipherPatterns ; + $decipher = explode($deciphers . '={', $decipherScript)[1]; + $decipher = str_replace(["\n", "\r"], '', $decipher); + $decipher = explode('}};', $decipher)[0]; + $decipher = explode('},', $decipher); + // Convert deciphers to object + $deciphers = []; + + foreach ($decipher as &$function) { + $deciphers[explode(':function', $function)[0]] = explode('){', $function)[1]; + } + // Convert pattern to array + $decipherPatterns = str_replace($deciphersObjectVar . '.', '', $decipherPatterns); + $decipherPatterns = str_replace($deciphersObjectVar . '[', '', $decipherPatterns); + $decipherPatterns = str_replace(['](a,', '(a,'], '->(', $decipherPatterns); + $decipherPatterns = explode(';', $decipherPatterns); + $patterns =$decipherPatterns; + $deciphers =$deciphers; + + if (!file_exists(TOOLS_PATH.'sig.php')) { + + for ($i=0; $i < count($patterns); $i++) { + $executes = explode('->', $patterns[$i]); + $execute=explode('.', $executes[0]); + $number = intval(str_replace(['(', ')'], '', $executes[1])); + $execute = $deciphers[$execute[1]]; + switch ($execute) { + case 'a.reverse()': + $processSignature = '$reverse'; + break; + case 'var c=a[0];a[0]=a[b%a.length];a[b]=c': + $processSignature= '$length'; + break; + case 'var c=a[0];a[0]=a[b%a.length];a[b%a.length]=c': + $processSignature= '$lengtha'; + break; + case 'a.splice(0,b)': + $processSignature= '$splice'; + break; + default: + die("\n==== Decipher dictionary was not found ===="); + break; + } + $myfile = fopen(TOOLS_PATH.'sig.php', "a+") or die("Unable to open file!"); + if ($i==0) { + fwrite($myfile, '<?php $a = str_split($s);'); + } + fwrite($myfile, $processSignature.'($a,'.$number.');'); + fclose($myfile); + } + + } + } +} + +function sig($s){ + $reverse=function(&$a){ + $a = array_reverse($a); + }; + $splice=function(&$a, $b){ + $a = array_slice($a, $b); + }; + $length = function(&$a, $b){ + $c = $a[0]; + $a[0] = $a[$b % count($a)]; + $a[$b] = $c; + }; + $lengtha = function(&$a, $b){ + $c = $a[0]; + $a[0] = $a[$b%count($a)]; + $a[$b%count($a)] = $c; + }; + + include(TOOLS_PATH.'sig.php'); + return join('', $a); +} + + +getchiper($gsts); +$data = getc("https://www.youtube.com/get_video_info?video_id=".$id."&asv=3&el=detailpage&hl=en_US"); +parse_str($data,$info); +$streams = $info['player_response']; +$jsn_str = str_replace("\u0026","&", $streams); +$streamin_data_json = json_decode($jsn_str, true); + +// Microdata +$vidtitle = $streamin_data_json["videoDetails"]["title"]; +$vidId = $streamin_data_json["videoDetails"]["videoId"]; +$viddes = $streamin_data_json["microformat"]["playerMicroformatRenderer"]["description"]["simpleText"]; +$vidpub = $streamin_data_json["microformat"]["playerMicroformatRenderer"]["publishDate"]; +$vidviewCount = $streamin_data_json["videoDetails"]["viewCount"]; +$vidauthor = $streamin_data_json["videoDetails"]["author"]; +$vidauthorid = $streamin_data_json["videoDetails"]["channelId"]; +$vidauthourl = "channel/{$vidauthorid}"; +$vidtime = $streamin_data_json["videoDetails"]["lengthSeconds"]; +$vidisLiveContent = $streamin_data_json["videoDetails"]["isLiveContent"]; + +// thumbs +$vidthumb = array(); +foreach ($streamin_data_json["videoDetails"]["thumbnail"]["thumbnails"] as $data) { + $url = $data['url']; + $values = array( + 'url' => $url, + 'width' => $data['width'], + 'height' => $data['height'] + ); + array_push($vidthumb, $values); +} + +// keywords +$vidkeywords = array(); +if ( isset($streamin_data_json["videoDetails"]["keywords"]) ) { + foreach ($streamin_data_json["videoDetails"]["keywords"] as $data) { + array_push($vidkeywords, $data); + } +} + +// streams +if (isset($streamin_data_json["streamingData"])) { + + $strF=$streamin_data_json["streamingData"]["formats"]; + $strA=$streamin_data_json["streamingData"]["adaptiveFormats"]; + + $vdef = array(); + foreach ($strF as $stream) { + if (isset($stream["signatureCipher"])) { + parse_str($stream["signatureCipher"],$dturl); + $values = array( + 'url' => $dturl['url'].'&sig='.sig($dturl['s']), + 'itag' => $stream['itag'], + 'type' => $stream['mimeType'], + 'quality' => $stream['quality'], + 'fps' => $stream['fps'], + 'resolution' => $stream['qualityLabel'], + 'qualityLabel' => $stream['qualityLabel'], + 'format' => exformat($stream['itag']) + ); + array_push($vdef, $values); + } else { + if (!empty($strF['url'])) { + $values = array( + 'url' => $strF['url'], + ); + array_push($vdef, $values); + } + } + } + + $aud = array(); + $vid = array(); + foreach ($strF as $stream) { + if (isset( $stream['url'] )) { + if (preg_match('/video/', $stream['mimeType'])) { + $url = $stream['url']; + $values = array( + 'url' => $url, + 'itag' => $stream['itag'], + 'type' => $stream['mimeType'], + 'quality' => $stream['quality'], + 'fps' => $stream['fps'], + 'resolution' => $stream['qualityLabel'], + 'qualityLabel' => $stream['qualityLabel'], + 'format' => exformat($stream['itag']), + ); + array_push($vid, $values); + } + } + } + foreach ($strA as $stream) { + if (isset($stream["signatureCipher"])) { + parse_str($stream["signatureCipher"],$dturl); + $stream['url']=$dturl['url'].'&sig='.sig($dturl['s']); + } + + if (preg_match('/audio/', $stream['mimeType'])) { + $url = $stream['url']; + $values = array( + 'url' => $url, + 'itag' => $stream['itag'], + 'type' => $stream['mimeType'], + 'quality' => $stream['quality'], + 'format' => exformat($stream['itag']), + ); + array_push($aud, $values); + } + + if (preg_match('/video/', $stream['mimeType'])) { + $url = $stream['url']; + $values = array( + 'url' => $url, + 'itag' => $stream['itag'], + 'type' => $stream['mimeType'], + 'quality' => $stream['quality'], + 'fps' => $stream['fps'], + 'resolution' => $stream['qualityLabel'], + 'qualityLabel' => $stream['qualityLabel'], + 'format' => exformat($stream['itag']), + ); + array_push($vid, $values); + } + } + +} else { + $vdef = array(); + $aud = array(); + $vid = array(); +} + +// $json['title']=$vidtitle; +// $json['videoId']=$vidId; +// $json['videoThumbnails']=$vidthumb; +// $json['description']=$viddes; +// $json['publishedText']=$vidpub; +// $json['viewCount']=$vidviewCount; +// $json['keywords']=$vidkeywords; +// $json['author']=$vidauthor; +// $json['authorId']=$vidauthorid; +// $json['authorUrl']=$vidauthourl; +// $json['lengthSeconds']=$vidtime; +// $json['liveNow']=$vidisLiveContent; +// $json['default']=$vdef; +// $json['audio']=$aud; +// $json['video']=$vid; |