[ 'url_pattern' => '/(?:https?:\/\/)?(?:www\.)?imdb\.com\/title\/(tt\d+)\/?/', 'home_page' => 'https://www.imdb.com/', ], self::SITE_DOUBAN => [ 'url_pattern' => '/(?:https?:\/\/)?(?:(?:movie|www)\.)?douban\.com\/(?:subject|movie)\/(\d+)\/?/', 'home_page' => 'https://www.douban.com/', ], self::SITE_BANGUMI => [ 'url_pattern' => '/(?:https?:\/\/)?(?:bgm\.tv|bangumi\.tv|chii\.in)\/subject\/(\d+)\/?/', 'home_page' => 'https://bangumi.tv/', ], ]; public function __construct() { $this->setApiPoint('https://ptgen.rhilip.info'); } public function getApiPoint(): string { return $this->apiPoint; } public function setApiPoint(string $apiPoint) { $this->apiPoint = $apiPoint; } public function generate(string $url, bool $withoutCache = false): array { $parsed = $this->parse($url); $targetUrl = sprintf('%s/?site=%s&sid=%s', trim($this->apiPoint, '/'), $parsed['site'] , $parsed['id']); return $this->request($targetUrl, $withoutCache); } public function parse(string $url): array { foreach (self::$validSites as $site => $info) { if (preg_match($info['url_pattern'], $url, $matches)) { return [ 'site' => $site, 'url' => $matches[0], 'id' => $matches[1] ]; } } throw new PTGenException("invalid url: $url"); } private function buildDetailsPageTableRow($torrentId, $ptGenArr, $site) { global $lang_details; $ptGenFormatted = $ptGenArr['format']; $prefix = sprintf("[img]%s[/img]\n", $ptGenArr['poster']); $ptGenFormatted = mb_substr($ptGenFormatted, mb_strlen($prefix, 'utf-8') + 1); $ptGenFormatted = format_comment($ptGenFormatted); $ptGenFormatted .= sprintf( '%s%s%s%s', $lang_details['text_information_updated_at'], date('Y-m-d H:i:s', intval($ptGenArr['generate_at'] / 1000)), $lang_details['text_might_be_outdated'], $torrentId, $site, $lang_details['text_here_to_update'] ); $titleShowOrHide = $lang_details['title_show_or_hide'] ?? ''; $id = 'pt-gen-' . $site; $html = << Show/Hide PT-Gen-{$site}
poster
{$ptGenFormatted}
HTML; return $html; } private function request(string $url, bool $withoutCache = false): array { global $Cache; $logPrefix = "url: $url"; $cacheKey = $this->getApiPointResultCacheKey($url); if (!$withoutCache) { $cache = $Cache->get_value($cacheKey); if ($cache) { do_log("$logPrefix, from cache"); return $cache; } } $http = new Client(); $response = $http->get($url, ['timeout' => 10]); $statusCode = $response->getStatusCode(); if ($statusCode != 200) { $msg = "api point response http status code: $statusCode"; do_log("$logPrefix, $msg"); throw new PTGenException($msg); } $bodyString = (string)$response->getBody(); if (empty($bodyString)) { $msg = "response body empty"; do_log("$logPrefix, $msg"); throw new PTGenException($msg); } $bodyArr = json_decode($bodyString, true); if (empty($bodyArr) || !is_array($bodyArr)) { $msg = "response body error: $bodyString"; do_log("$logPrefix, $msg"); throw new PTGenException($msg); } if (!isset($bodyArr['success']) || !$bodyArr['success']) { $msg = "error: " . $bodyArr['error'] ?? ''; do_log("$logPrefix, response: $bodyString"); throw new PTGenException($msg); } $Cache->cache_value($cacheKey, $bodyArr, 24 * 3600); do_log("$logPrefix, success get from api point"); return $bodyArr; } public function deleteApiPointResultCache($url) { global $Cache; $Cache->delete_value($this->getApiPointResultCacheKey($url)); } private function getApiPointResultCacheKey($url) { return __METHOD__ . "_$url"; } public function renderUploadPageFormInput($ptGen = '') { global $lang_functions; $html = ''; $ptGen = (array)json_decode($ptGen, true); foreach (self::$validSites as $site => $info) { $value = $ptGen[$site]['link'] ?? ''; $x = $lang_functions["row_pt_gen_{$site}_url"]; $y = "
".$lang_functions["text_pt_gen_{$site}_url_note"].""; $html .= tr($x, $y, 1); } return $html; } public function renderDetailsPageDescription($torrentId, array $torrentPtGenArr): array { $html = ''; $jsonArr = []; $update = false; foreach (self::$validSites as $site => $info) { if (empty($torrentPtGenArr[$site]['link'])) { continue; } $link = $torrentPtGenArr[$site]['link']; $data = $torrentPtGenArr[$site]['data'] ?? []; if (!empty($data)) { $jsonArr[$site] = [ 'link' => $link, 'data' => $data, ]; $html .= $this->buildDetailsPageTableRow($torrentId, $data, $site); } else { $ptGenArr = $this->generate($torrentPtGenArr[$site]['link']); $jsonArr[$site] = [ 'link' => $link, 'data' => $ptGenArr, ]; $html .= $this->buildDetailsPageTableRow($torrentId, $ptGenArr, $site); if (!$update) { $update = true; } } } return ['json_arr' => $jsonArr, 'html' => $html, 'update' => $update]; } }