* @package videoDB * @version $Id: trace.php,v 2.64 2013/03/13 15:27:02 andig2 Exp $ */ require_once './core/functions.php'; require_once './core/httpclient.php'; // identifier for URL parameter $urlid = 'videodburl'; $striptags = array('iframe','object','embed','ads','html','head','body','!DOCTYPE'); /** * input */ $iframe = req_int('iframe'); $videodburl = req_string('videodburl'); // #18 $videodbreload = req_int('videodbreload'); /** * Figures out which part of a given URI is server and path * Result in global $base_server and $base_path variables * * @param string $url URI */ function get_base($url) { global $uri; $uri = parse_url($url); if (!array_key_exists('scheme', $uri)) {$uri['scheme'] = 'http';} if (!array_key_exists('host', $uri)) {$uri['host'] = 'localhost';} if (!array_key_exists('path', $uri)) {$uri['path'] = '/';} $uri['server'] = $uri['scheme'].'://'.$uri['host']; // remove filename from path if recognized file type $uri['path'] = preg_replace("/^(.*\/)(.*)$/i", '\\1', $uri['path']); // append trailing / if missing if (!preg_match("/\/$/", $uri['path'])) $uri['path'] .= '/'; } /** * Figures out fully qualified, absolute URI for given (relative) URI, * using global $base_server and $base_path variables * * @param string $url (relative) URI * @return string fully qualified, absolute URI */ function get_full_url($url) { global $uri, $config; // fully qualified? if (preg_match("/^https?:\/\//", $url)) return $url; // local absolute path? if (preg_match("/^\//", $url)) { $url = $uri['server'].$url; } else { $url = preg_replace("/^\.\//", '', $url); $url = $uri['server'].$uri['path'].$url; } return $url; } /** * Helper function to enable http(s) redirects * * @return string protocol scheme (http or https) */ function getScheme() { # || strtolower(substr($_SERVER["SERVER_PROTOCOL"],0,5)) != 'https' return (!isset($_SERVER['HTTPS']) || strtolower($_SERVER['HTTPS']) != 'on') ? 'http' : 'https'; } /** * array_delete removes elements from array * * @param array $a input array * @param string $i index to delete from * @param string $count number of items to delete * @return array resulting array */ function array_delete($a, $i, $count = 1) { $result = array_slice($a, 0, $i); foreach (array_slice($a, $i+$count) as $val) { array_push($result, $val); } return $result; } /** * Check if this item is already in the database */ function is_known_item($id, &$sp_id, &$sp_diskid) { $SQL = "SELECT imdbID, id, diskid FROM ".TBL_DATA." WHERE imdbID = '".escapeSQL($id)."' ORDER BY diskid DESC"; $result = runSQL($SQL); // do we know this movie? if (count($result) && isset($result[0]['imdbID']) && adultcheck($result[0]['id']) && check_videopermission(PERM_READ, $result[0]['id'])) { $sp_id = $result[0]['id']; $sp_diskid = $result[0]['diskid']; if (!$sp_diskid) $sp_diskid = 'no_diskid'; return true; } return false; } function _replace_enclosed_tag_traced($matches) { global $urlid, $config, $uri, $page, $iframe; // quotes $matches = array_delete($matches, 2); // get fully qualified url $url = get_full_url($matches[2]); $url = preg_replace("/&".session_name()."=[\d|\w]+$/", '', $url); // show anchor translation if debugging $note = ''; $note = ($config['debug']) ? "($matches[2] -> $url)" : ''; // enable _top navigation for iframe mode $top = ($iframe) ? ' target="_top"' : ''; $options = ''; $title = strip_tags($matches[4]); // what's our host? $engine = (preg_match('/(imdb|amazon|filmweb)/i', $uri['host'], $m)) ? $m[1] : ''; $append = ''; if ($engine == 'imdb') { // imdb // fix for IMDB speciality: 2nd href inside first one if (preg_match("/http.*?http/i", $url)) { return implode('', array_slice($matches,1)); } // title link? // either /Title?0328828 (old-style or tiger-redirect) // or /title/tt0306734/ (new-style) if (preg_match("#/[Tt]itle(\?|/tt)(\d+)/?(\?|$)#", $url, $m) && $title) { // don't link images to avoid matching the imdb page flicker if (!preg_match("/Add Movie'; if (is_known_item('imdb:'.$m[2], $sp_id, $sp_diskid)) { $append.= ' Show Movie'; } } } // amend url for seasons/year the path for previous and next season/year url's at bottom of episodes page if (preg_match("#(=(.*?)\&ref_=ttep_ep_sn_(pv|nx))|(=(.*?)\&ref_=ttep_ep_yr_(pv|nx))#",$matches[2],$mymatches)) { if (!preg_match('#(\/episodes\/\?season=)|(\/episodes\/\?year=)#',$url,$mymatches)) { $patterns = array ('#(\?season)#','#(\?year)#'); $replacements = array('episodes?season','episodes?year'); $url = preg_replace($patterns,$replacements,$url); } // remove _ajax in url will be added by js. if (preg_match('#\/episodes\/_ajax\/#',$url,$mymatches)) { $url = preg_replace('#\/episodes\/_ajax#','',$url); } } } elseif ($engine == 'amazon') { // amazon if (preg_match("#exec/obidos/tg/detail/-/([0-9A-Z]{10,})/#", $url, $m)) { $id = $m[1]; $append = ' Add Movie'; } } elseif ($engine == 'filmweb') { // filmweb.pl if (preg_match("/[Ff]ilm[\?\.]id=(\d+)/i", $url, $m) && $title) { $append = " ". 'Add Movie'; } } $url = getScheme().'://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']."?$urlid=".urlencode($url); if ($iframe) $url .= "&iframe=".$iframe; return $matches[1].$url.$matches[3].$matches[4].$note.$matches[5].$append; } function _replace_tag($matches) { global $urlid, $striptags, $iframe; $url = get_full_url($matches[4]); if (in_array('ads', $striptags) && (strtolower($matches[2]) == 'img') && preg_match("/\/ads?\//i", $url)) return ''; // switch on tag $parameters = ''; $append = ''; switch (strtolower($matches[2])) { // attn: order is crucial as $url needs be saved to get overwritten case 'form' : $append = ""; $url = getScheme().'://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']; if ($iframe) $append .= ""; break; case 'area' : $parameters = "?$urlid=".urlencode($url); $url = getScheme().'://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']; if ($iframe) $parameters .= "&iframe=".$iframe; break; } return $matches[1].$url.$parameters.$matches[5].$append; } function _remove_tag($matches) { return ''; } function imdb_replace_title_callback($matches) { global $uri; $result = $matches[1].$matches[2]; if (preg_match("#/title/tt(.+)/#", $uri['path'], $m) ) { $result .= ' Add Movie'; if (is_known_item('imdb:'.$m[1], $sp_id, $sp_diskid)) { $result .= ' Show Movie'; } } $result .= $matches[3]; return $result; } /** * HTML Code Conversion * * Converts HTML elements to allow proxying through trace.php * e.g. all href's are converted to trace.php?url=href links * * When a link of the IMDB movie title format is discovered, * the "Add Disc" icon is appended, linking to edit.php with the correct disk id * * Note: this function is far from complete, more help is desired * * @param string $html input HTML code including relative links etc. * @return string output HTML code with absolute proxied links, forms image maps etc. */ function fixup_HTML($html) { global $striptags, $config, $uri; // base if (preg_match("/)/is", '_remove_tag', $html); // link, map/area $html = preg_replace_callback("/(<(link|area|base)\s+[^>]*?href\s*=\s*(\"|'))([^>]*?)(\\3.*?>)/is", '_replace_tag', $html); $html = preg_replace_callback("/(<(link|area|base)\s+[^>]*?href\s*=\s*([^\"']))([\d\w\.\/\+\%-:=&_]+?)(\s*[^>]*?>)/is", '_replace_tag', $html); // image, frame, script $html = preg_replace_callback("/(<(ima?ge?|frame|iframe|script)\s+[^>]*?src\s*=\s*(\"|'))([^>]*?)(\\3.*?>)/is", '_replace_tag', $html); $html = preg_replace_callback("/(<(ima?ge?|frame|iframe|script)\s+[^>]*?src\s*=\s*([^\"']))([\d\w\.\/\+\%-:=&_]+?)(\s*[^>]*?>)/is", '_replace_tag', $html); // form // $html = preg_replace_callback('##', '_remove_tag', $html); $html = preg_replace_callback("/(<(form)\s+[^>]*?action\s*=\s*(\"|'))([^>]*?)(\\3[^>]*?>)/is", '_replace_tag', $html); $html = preg_replace_callback("/(<(form)\s+[^>]*?action\s*=\s*([^\"']))([\d\w\.\/\+\%-:=&_]+?)(\s*[^>]*?>)/is", '_replace_tag', $html); // href $html = preg_replace_callback("/(]*?href\s*=\s*(\"|'))([^>]*?)(\\2[^>]*?>)(.*?)(<\/a\s*>)/is", '_replace_enclosed_tag_traced', $html); $html = preg_replace_callback("/(]*?href\s*=\s*())([\d\w\.\/\+\%-:=&_]+)(\s*[^>]*?>)(.*?)(<\/a\s*>)/is", '_replace_enclosed_tag_traced', $html); // title if (stristr($uri['host'], 'imdb')) { // this line maybe redundent with imdb now using webpack JS $html = preg_replace_callback("#(

)(.*?)(

)#si", 'imdb_replace_title_callback', $html); // imdb form does not accept utf8 $html = preg_replace("/(form\s+.*?)(>)/i", '\\1 accept-charset="ISO-8859-1" \\2', $html ); } return $html; } function request($urlonly=false) { global $urlid, $url; // get or post? $pass = ($_POST) ? $_POST : $_GET; $request = ''; // don't use $_REQUEST or cookies will screw up the query foreach ($pass as $key => $value) { switch ($key) { case $urlid: $url = html_entity_decode(urldecode($value)); break; case session_name(): case 'videodbreload': case 'iframe': break; // case 'q': // $url = 'http://www.imdb.com/find'; // quick fix for search default: if ($request) $request .= "&"; $request .= "$key=$value"; } } // going directly to trace.php without options? if (!$url) $url = 'http://www.imdb.com'; // remove session identifier before request is sent or caching will not work $url = preg_replace("/&".SID."$/", "", $url); // workaround for fishy IMDB URLs $url = preg_replace("/\&/", "&", $url); // don't fetch, just find target if ($urlonly) return($url); // append request parameters $post = ""; if ($_POST) { $post = $request; } elseif ($request) { if (preg_match("#\?#",$url,$matches)) { $url .= "&".$request; } else { $url .= "?".$request; } } // encode possible spaces, use %20 instead of + $url = preg_replace('/ /','%20', $url); $dbreload = ""; if (isset($_GET['videodbreload'])) { $dbreload = $_GET['videodbreload']; } $response = httpClient($url, $dbreload != 'Y', array('post' => $post)); // url after redirect get_base($response['url']); if ($response['success'] != true) { $page = 'Error: '.$response['error']; if ($response['header']) $page .= '
Header:
'.nl2br($response['header']); } else { putHTTPcache($url.$post, $response); $page = $response['data']; } return $page; } /** * @param string $html input HTML code including relative links etc. * @return string output HTML code with absolute proxied links, forms image maps etc. */ function fixup_javascript($html) { global $uri, $debug_trace, $trace_dirs; if (stristr($uri['host'], 'imdb') === false) { return $html; } // get cache folder for overridden js files $cachefolder = cache_get_folder('javascript'); //get cache root folder $error = cache_create_folders($cachefolder, 0); // ensure folder exists array_map('unlink', glob($cachefolder."/*.*")); // delete files // find all imdb javascript files preg_match_all('#[\"\']\s*\Khttps?:[^\"\']+?\.js#', $html, $matches_all); // for performance reduce matches by excluding all duplicate files $unique_matches = array_unique($matches_all[0]); // loop thru files $x = 0; foreach ($unique_matches as $js_file_name) { $partfilename = ''; $js_file_data = file_get_contents($js_file_name); // testing/debugging only - use to get copy of all javascript before cloning if ($debug_trace) { $file_path = $trace_dirs['preclone'].'pre_'.$x.'.js'; file_put_contents($file_path, $js_file_data); } $pattern = '#'.preg_quote('fragment BaseTitleCard on Title', '#').'#'; // add escape delimiters if ( preg_match($pattern, $js_file_data, $matches)) { $js_file_data = replace_javascript_title ($js_file_data, $html); $partfilename .= '-title'; } // add add/show to New version of episode list page @ aug 2023 $pattern = '#'.preg_quote('SeasonsTab="tab-seasons"', '#').'#'; // add escape delimiters if (preg_match($pattern, $js_file_data, $matches) ) { list($js_file_data, $html) = replace_javascript_episodelist ($js_file_data, $html); $partfilename .= '-episodelist'; } // for search bar and interactive search list $find_string = 'https://v3.sg.media-imdb.com/suggestion'; $pattern = '#'.preg_quote($find_string, '#').'#'; // add escape delimiters if (preg_match($pattern, $js_file_data, $matches) ) { $js_file_data = replace_javascript_search ($js_file_data); $partfilename .= '-search'; } // for add/show movie links $find_string = 'displayableProperty.value.plainText}),(0'; $pattern = '#'.preg_quote($find_string, '#').'#'; // add escape delimiters if (preg_match($pattern, $js_file_data, $matches) ) { $js_file_data = replace_javascript_addmovie ($js_file_data); $partfilename .= '-addmovie'; } // for lnkstop links if (strpos($js_file_data, 'defaultMessage:"Cast & crew"') !== false) { $js_file_data = replace_javascript_lnkstop ($js_file_data); $partfilename .= '-lnkstop'; } // for search result page $find_string = 'defaultMessage:"Exact matches"'; $pattern = '#'.$find_string.'#'; if (preg_match($pattern, $js_file_data, $matches) ) { list($js_file_data, $html) = replace_javascript_srchlist ($js_file_data, $html); $partfilename .= '-srchlist'; } // for bodylnks $pattern = '#plotText.\(.,.....\)\(.,\{href:#'; // top rated episodes mai and list if (str_contains($js_file_data, '"data-testid":"title-cast",') || str_contains($js_file_data, '"data-testid":"name-credits-list-item",') || str_contains($js_file_data, 'hash: "summary"') || preg_match($pattern, $js_file_data, $matches) ) { $js_file_data = replace_javascript_lnksbody($js_file_data); $partfilename .= '-lnksbody'; } if ($partfilename <> '') { $file_path = './'.$cachefolder.'imdb-clone-'.$x.$partfilename.'.js'; //add comment line to file and save to cache (overwritten if present) file_put_contents($file_path, '/* Processed by - replace_javascript_('.$partfilename.') : this files original name - '.$js_file_name.' */'); // save js data file to cache file_put_contents($file_path, $js_file_data, FILE_APPEND); $pattern = '#'.preg_quote($js_file_name, '#').'#'; // escape all delimitters in file name $html = preg_replace($pattern,$file_path,$html); } // release file data from memory to avoid memory exceeeded error $js_file_data = ''; unset($js_file_data); $x++ ; } return ($html); } /** * @param string $json input json data * @return string output json with title data. */ function fixup_json($json) { /* section commented out as not needed as of june 2022 - code left incase needed in future // insert / after title no - fixes issue with title no being deleted in $uri in function get_base // "id":"tt5996792" allow for different digits in page $pattern = '#(\"id\":\"tt)(\d+)(\")#'; preg_match_all($pattern,$json, $matches_all); for ($x = 0;$x < count($matches_all[2]);$x++) { $tt_no = preg_quote($matches_all[2][$x]); $pattern = '#\"id\":\"tt'.$tt_no.'\"#'; //preg_match_all($pattern,$json, $matches_pre_replace); $json = preg_replace($pattern, '"id":"tt'.$tt_no.'/"', $json); } */ // testing code //$pattern = '#\"id\":\"tt.*?.\"#'; //preg_match_all($pattern,$page, $mm_after); return $json; } /** * @param string $js_file_data imdb supplied javascript * @return string amended javascript. */ function replace_javascript_title ($js_file_data) { global $iframe; // allow for iframe templates $iframe_val = ''; if ($iframe) $iframe_val = "&iframe=".$iframe; // let r=(e.localePrefix??"")+"/title/{tconst}/" // let r=""+"/title/{tconst}/faq/" // let r=""+"/title/{tconst}/fullcredits/" // let r=""+"/title/{tconst}/plotsummary/" // let r=""+"/title/{tconst}/taglines/" // let r=""+"/title/{tconst}/trivia/" // let r=""+"/title/{tconst}/reviews/" $pattern = '#(let .\=""\+"|let r\=\(..localePrefix\?\?""\)\+")(/title/\{tconst\}.*?")#'; if (preg_match($pattern, $js_file_data, $matches)) { $js_file_data = preg_replace_callback($pattern, function ($matches) use ($iframe_val) { return $matches[1].'?'.$iframe_val.'&videodburl=https://www.imdb.com'.$matches[2]; }, $js_file_data); } // let r = (e.localePrefix ?? "") + "/name/{nconst}/" // let r=""+"/name/{nconst}/awards/" // let r=""+"/name/{nconst}/quotes/" // let r=""+"/name/{nconst}/triva/" // let r=""+"/name/{nconst}/videogallery/" // let r=""+"/name/{nconst}/bio/" // let r=""+"/name/{nconst}/externalsites/" // let r=""+"/name/{nconst}/faq/" // let r=""+"/name/{nconst}/mediaindex/" // let r=""+"/name/{nconst}/mediaviewer/" // let r=""+"/name/{nconst}/news/" // let r=""+"/name/{nconst}/otherworksawards/" // let r=""+"/name/{nconst}/publicity/" $pattern = '#(let .\=""\+"|let .\=\(..localePrefix\?\?""\)\+")(/name/\{nconst\}.*?")#'; unset($mataches); if (preg_match($pattern, $js_file_data, $matches)) { $js_file_data = preg_replace_callback($pattern, function ($matches) use ($iframe_val) { return $matches[1].'?'.$iframe_val.'&videodburl=https://www.imdb.com'.$matches[2]; }, $js_file_data); } // let r=""+"/interest/{inconst}/" $pattern = '#(let .\=""\+")(/interest/\{inconst\}/")#'; unset($mataches); if (preg_match($pattern, $js_file_data, $matches)) { $js_file_data = preg_replace_callback($pattern, function ($matches) use ($iframe_val) { return $matches[1].'?'.$iframe_val.'&videodburl=https://www.imdb.com'.$matches[2]; }, $js_file_data); } return $js_file_data; } /** * @param string $js_file_data imdb supplied javascript * @return string amended javascript. */ function replace_javascript_addmovie ($js_file_data) { global $uri, $iframe; // allow for iframe templates $iframe_val = ''; if ($iframe) $iframe_val = "&iframe=".$iframe; if (preg_match("#/title/tt(\d+)#", $uri['path'], $m)) // $m[1] is imdb tltle no { // look for &&S.push({text:p.displayableProperty.value.plainText}),(0,r.jsx) S p and r can change $pattern = "#&&(.?\.push\(\{text\:)(.?\.displayableProperty\.value\.plainText\}\),\(0,.?\.jsx\))#"; // 111111111111111111 22222222222222222222222222222222222222222222222222222222222 preg_match($pattern, $js_file_data, $matches); $append = $matches[1].'"Add Movie", link: "edit.php?save=1&lookup=2&imdbID=imdb:'.$m[1].'"}),'; if (is_known_item('imdb:'.$m[1], $sp_id, $sp_diskid)) { $diskid = ""; if ($sp_diskid <> "no_diskid") { $diskid = " (Diskid:".$sp_diskid.")"; } $append.= $matches[1].'"Show Movie'.$diskid.'", link: "show.php?id='.$sp_id.'"}),'; } $pattern = "#(&&.?\.push\(\{text\:.?\.displayableProperty\.value\.plainText\}\),)(\(0,.?\.jsx\))#"; // 111111111111111111111111111111111111111111111111111111111111111111 2222222222222 unset($matches); preg_match($pattern, $js_file_data, $matches); $js_file_data = preg_replace($pattern, $matches[1].$append.$matches[2], $js_file_data); } return $js_file_data; } /** * @param string $js_file_data imdb supplied javascript * @return string amended javascript. */ function replace_javascript_lnksbody ($js_file_data) { global $uri, $iframe; // allow for iframe templates $iframe_val = ''; if ($iframe) $iframe_val = "&iframe=".$iframe; // for episode list and main top rated links $pattern = '#plotText.\(.,.....\)\(.,\{href:#'; unset($matches); if (preg_match($pattern, $js_file_data, $matches)) { $js_file_data = preg_replace($pattern, $matches[0]."'"."?$iframe_val&videodburl=https://www.imdb.com"."'"."+", $js_file_data); } // select season or year (dropdown) on episode main page //EPISODE_SEASONS,onChange:e=>{let //EPISODE_YEARS,onChange:e=>{let // The pattern breakdown: // - EPISODE_(?:SEASONS|YEARS) : matches either EPISODE_SEASONS or EPISODE_YEARS // - ,onChange:.=>{let : matches the literal string ",onChange:.=>{let" // - .*? : non-greedy match for any characters (up to the next part) // - window.open\( : matches the literal "window.open(" $pattern = '#EPISODE_(?:SEASONS|YEARS),onChange:.=>{let.*?window.open\(#'; unset($matches); if (preg_match($pattern, $js_file_data, $matches)) { $js_file_data = preg_replace_callback($pattern, function ($matches) use ($iframe_val) {return $matches[0]."'?".$iframe_val."&videodburl=https://www.imdb.com'"."+"; }, $js_file_data); } //Top cast //all cast & crew // "data-testid":"title-cast",children:[(0,n.jsx)(tU.O,{title:c,editHref:f,subtitleProps:{href // "data-testid":"title-cast-allcast-link",labelTitle:u,labelLink: $pattern = '#"data-testid":"title-cast".*?href:' . '|"data-testid":"title-cast-allcast-link".*?labelLink:#'; unset($matches); if ( preg_match($pattern, $js_file_data, $matches)) { $js_file_data = preg_replace_callback($pattern, function ($matches) use ($iframe_val) {return $matches[0]."'?".$iframe_val."&videodburl=https://www.imdb.com'"."+"; }, $js_file_data); } // creator, writer, director lnks to full list page // titleFullCreditsLinkBuilder:l}=(0,B.WO)(),d=(0,eF.N)(rg),c=(0,eo.hg)({weblabID:es.lh.IMDB_WEB_PACE_CREDITS_1201882,treatments:{T1:!0}});if(!a.length)return null;let u=r>a.length,p=c?i.id:rk(i.id),m=// $pattern = '#titleFullCreditsLinkBuilder\:.\}=\(.,....\)\(\),.=\(.,....\)\(..\).*?if\(...length\)return null\;let .=.*?.=.*?=#'; unset($matches); if ( preg_match($pattern, $js_file_data, $matches)) { $js_file_data = preg_replace($pattern, $matches[0]."'"."?$iframe_val&videodburl=https://www.imdb.com"."'"."+", $js_file_data); } // names for actors and characters etc links full cast page // titleCharacterLinkBuilder:j}=(0,m.WO)(),k=A({nconst:t,refSuffix:E}),R=j({nconst:t,tconst:M,refSuffix:E}), // 111111111111111111111111111111111111111111222222222222222222222222222233333333333333333333333333333333333 $pattern = '#(titleCharacterLinkBuilder:.}=.*?\).*?,.=)' . '(.\({nconst:.,refSuffix:.}\),.=)' . '(.\({nconst:.,tconst:.,refSuffix:.}\),)#'; unset($matches); if (preg_match($pattern, $js_file_data, $matches)) { $js_file_data = preg_replace($pattern, $matches[1]."'"."?$iframe_val&videodburl=https://www.imdb.com"."'"."+". $matches[2]."'"."?$iframe_val&videodburl=https://www.imdb.com"."'"."+". $matches[3], $js_file_data); } // links for actor real name,avatar and character //"data-testid":"title-cast-item__actor",href: //"data-testid":"title-cast-item__avatar",className:"title-cast-item__avatar",children:(0,n.jsx)(w.Avatar,{href: //titleCharacterLinkBuilder:d}=(0,B.WO)(),c= $pattern = '#("data-testid":"title-cast-item__actor",href:)' . '|("data-testid":"title-cast-item__avatar".*?href:)' . '|(titleCharacterLinkBuilder:.}=\(.,....\)\(\),.=)' . '#'; unset($matches); if (preg_match($pattern, $js_file_data, $matches)) { $js_file_data = preg_replace_callback($pattern, function ($matches) use ($iframe_val) {return $matches[0]."'?".$iframe_val."&videodburl=https://www.imdb.com'"."+"; }, $js_file_data); } // other names //text:e.nameText,href: $pattern = '#text:..nameText,href:#'; unset($matches); if ( preg_match($pattern, $js_file_data, $matches)) { $js_file_data = preg_replace($pattern, $matches[0]."'"."?$iframe_val&videodburl=https://www.imdb.com"."'"."+", $js_file_data); } // plot summary //w.InlineListItem,{children:(0,l.jsx)(w.TextLink,{text:s.formatMessage(t),href:i,inline: //111111111111111111111111111111111111111111111111111111111111111111111111111111222222222 $pattern = '#(..InlineListItem,{children:\(.,..jsx\)\(..TextLink,{text:..formatMessage\(.\),href:)(.,inline:)#'; unset($matches); if (preg_match($pattern, $js_file_data, $matches)) { $js_file_data = preg_replace($pattern, $matches[1]."'"."?$iframe_val&videodburl=https://www.imdb.com"."'"."+".$matches[2], $js_file_data); } // epidsode picture link on episode list page // let D={dynamicWidth:!0,imageProps:{imageModel:t.image,imageType:t.type},href: unset($matches); $pattern = '#let .={dynamicWidth:!0,imageProps:{imageModel:..image,imageType:..type},href:#'; if (preg_match($pattern, $js_file_data, $matches)) { $js_file_data = preg_replace($pattern, $matches[0]."'"."?$iframe_val&videodburl=https://www.imdb.com"."'"."+", $js_file_data); } return $js_file_data; } /** * @param string $js_file_data imdb supplied javascript * @return string amended javascript. */ function replace_javascript_search ($js_file_data) { global $iframe; $url = getScheme().'://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']; $iframe_val = ''; $iframe_val_1 = ''; if ($iframe) { $iframe_val = '{name:"iframe",val:"'.$iframe.'"},'; $iframe_val_1 = "&iframe=".$iframe; } // fix link for looking glass in search bar // return{searchEndpoint:"https://v3.sg.media-imdb.com/suggestion",queryTemplate:"%sx/%s.json?includeVideos=1",formAction:"/find",formMethod:"get",inputName:"q",hiddenFields:[{name:"ref_",val:t([E.Cd.SEARCH_BAR,E.Cd.SEE_MORE])}], // 1111111111111111111111222222222222222222222222222222222222222233333333333333333444444444444444444444444444444444444444445555566666666666666666666666666666666666666666666666777777777777777777777777777777777777777777777777777777 $pattern = '#(return\{searchEndpoint:")(.*?)(",queryTemplate:")(.*?formAction:")(.*?)(".*?hiddenFields:\[)(.*?\]\)\}\],)#'; // 111111111111111111111111 222 33333333333333333 444444444444444 555 6666666666666666666 777777777777 unset($matches); if (preg_match($pattern, $js_file_data, $matches)) { $replace_val = $matches[1].$url.$matches[3].'?videodburl='.$matches[2]."/".$matches[4].'?videodburl='.$matches[5].$matches[6].'{name:"videodburl",val:"http://www.imdb.com'.$matches[5].'"},'.$iframe_val.$matches[7]; $js_file_data = preg_replace($pattern,$replace_val, $js_file_data); } // fix link for drop down list in search bar //"search-result--const",href:e.url,children //"search-result--video",href:e.url,children //"search-result--link",href:e.url,children $pattern = '#(",href:)(.\.url,children)#'; unset($matches); if (preg_match($pattern, $js_file_data, $matches)) { $replace_val = $matches[1].'"'.$url.'?'.$iframe_val_1.'&videodburl=https://www.imdb.com"'.'+'.$matches[2]; $js_file_data = preg_replace($pattern,$replace_val, $js_file_data); } return $js_file_data; } /** * @param string $js_file_data imdb supplied javascript * @param string $html html data * @return string $js_file_data amended javascript and html. * @return string $html amended html. */ function replace_javascript_srchlist ($js_file_data, $html) { global $iframe, $debug_trace, $trace_dirs; $url = getScheme().'://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']; $iframe_val = ''; if ($iframe) { $iframe_val = "&iframe=".$iframe; } // title name interest links // {titleMainLinkBuilder:_}=(0,E.WOb)(),M=[i?Q.C.TITLE:Q.C.ALL,{t: Q.C.TITLE,n:r}],C= // {interestSingleLinkBuilder:p}=(0,E.WOb)(),u= // {nameMainLinkBuilder:g}=(0,E.WOb)(),f= $pattern = '#({titleMainLinkBuilder:.}=.*?TITLE.*?=' . '|{nameMainLinkBuilder:.}=.*?=' . '|{interestSingleLinkBuilder:.}=.*?=)#'; unset($matches); if (preg_match($pattern, $js_file_data, $matches)) { $js_file_data = preg_replace_callback($pattern, function ($matches) use ($iframe_val) {return $matches[0]."'?".$iframe_val."&videodburl=https://www.imdb.com'"."+"; }, $js_file_data); } // exact match or not exact match lnks // find_string TextButton,{href: $pattern = '#TextButton,{href:#'; unset($matches); if (preg_match($pattern, $js_file_data, $matches)) { $js_file_data = preg_replace($pattern, $matches[0]."'"."?$iframe_val&videodburl=https://www.imdb.com"."'"."+", $js_file_data); } // lnk for refining to movie, series ... etc // label:g,href: $pattern = '#label:.,href:#'; unset($matches); if (preg_match($pattern, $js_file_data, $matches)) { $js_file_data = preg_replace_callback($pattern, function ($matches) use ($iframe_val) {return $matches[0]."'?$iframe_val&videodburl=https://www.imdb.com'+"; }, $js_file_data); } // defaultMessage:"Quotes"}),href: // defaultMessage:"Plot Summaries"}),href: // defaultMessage:"Biographies"}),href: // defaultMessage:"Movies, TV & more"}),href: // defaultMessage:"People"}),href: // defaultMessage:"Collaborations"}),href: $pattern = '#defaultMessage:' . '("Quotes"}\),href:' . '|"Plot Summaries"}\),href:' . '|"Biographies"}\),href:' . '|"Movies, TV & more"}\),href:' . '|"People"}\),href:' . '|"Collaborations"}\),href:)#'; unset($matches); if (preg_match($pattern, $js_file_data, $matches)) { $js_file_data = preg_replace_callback($pattern, function ($matches) use ($iframe_val) {return $matches[0]."'?$iframe_val&videodburl=https://www.imdb.com'+"; }, $js_file_data); } // "data-testid":"advanced-search-link-genres",href: // "data-testid":"advanced-search-link-keywords",href: $pattern = '#"data-testid":' . '("advanced-search-link-genres",href:' . '|"advanced-search-link-keywords",href:)#'; unset($matches); if (preg_match($pattern, $js_file_data, $matches)) { $js_file_data = preg_replace_callback($pattern, function ($matches) use ($iframe_val) {return $matches[0]."'?$iframe_val&videodburl=https://www.imdb.com'+"; }, $js_file_data); } // add add title and show title for all except episodes // add variables to data blob if ($debug_trace) { preg_match('#(\