// ==UserScript== // @name Letterboxd Enhancer 中文增强显示与搜索:集合啦!数字难民 // @namespace http://tampermonkey.net/ // @version 0.5.6 // @connect * // @description Letterboxd全局TMDB中文标题搜索 / 查询bt、字幕源是否存在 / 电影详情页增加显示:电影中文标题|导演中文名|中文简介|演员头像列表(中日韩演员显示中文名)|豆瓣ID图标|IMDB电影宽高比、底片格式 // @thanks Catspinner bimzcy Rhilip LeLobster // @author estost // @match https://letterboxd.com/film/* // @match https://letterboxd.com/* // @match https://letterboxd.com* // @grant GM_xmlhttpRequest // @grant GM_addStyle // @grant GM_setValue // @grant GM_getValue // @icon https://letterboxd.com/favicon.ico // @require https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js // @downloadURL none // ==/UserScript== var tmdb_api = 'yourapi'; var tmdb_api = GM_getValue('tmdb_api', ''); if (tmdb_api.length <= 30) { var api = prompt('请输入 TMDB API:'); if (api !== null && api.length > 30) { tmdb_api = api; GM_setValue('tmdb_api', tmdb_api); alert('TMDB API设置成功!'); } } // 设置横向滚动条的样式 GM_addStyle(` /* 滚动条整体样式 */ ::-webkit-scrollbar { width: 8px; height: 6px; background-color: #14181c; } /* 滑道样式 */ ::-webkit-scrollbar-track:horizontal { background-color: #14181c; } /* 滑块样式 */ ::-webkit-scrollbar-thumb:horizontal:hover { background-color: #242c34; border-radius: 5px; \`); `); // 设置竖向滚动条的样式 GM_addStyle(` /* 滚动条整体样式 */ ::-webkit-scrollbar { width: 6px; height: 8px; background-color: #202830; } /* 滑道样式 */ ::-webkit-scrollbar-track:vertical { background-color: #202830; } /* 滑块样式 */ ::-webkit-scrollbar-thumb:vertical { background-color: #14181c; border-radius: 5px; } `); // 默认显示details菜单 var currentUrl = window.location.href; if (currentUrl.startsWith('https://letterboxd.com/film/') && currentUrl.indexOf('/details') === -1 && currentUrl.indexOf('/members/') === -1 && currentUrl.indexOf('/fans/') === -1 && currentUrl.indexOf('/crew/') === -1 && currentUrl.indexOf('/genres/') === -1 && currentUrl.indexOf('/likes/') === -1 && currentUrl.indexOf('/reviews/') === -1 && currentUrl.indexOf('/lists/') === -1 && currentUrl.indexOf('/activity/') === -1 && currentUrl.indexOf('/similar/') === -1) { window.location.replace(currentUrl + 'details/'); } $(document).ready(function () { // 获取imdb/tmdb id/原始标题/电影年份 var imdb_nb = ''; try { imdb_nb = [...document.querySelectorAll(".micro-button")].find(a => a.href.includes("imdb")).href.split("/tt")[1].split("/")[0]; } catch (error) { imdb_nb = null; } var imdb_id = 'tt' + imdb_nb var tmdb_id = [...document.querySelectorAll(".micro-button")].find(a => a.href.includes("themoviedb")).href.split(/\/(movie|tv)\//)[2].split("/")[0].split("/")[0]; var imdb_link = `https://www.imdb.com/title/${imdb_id}/` var has_imdb_button = imdb_id.length > 0; // 从 Letterboxd 中已有的数组 filmData 中获取电影的标题和年份 // var filmTitle01 = filmData['name'] // filmTitle01 = filmTitle01.replace(/[\/\\#,+()$~%.":*?<>{}!&]/g, ''); // var filmYear01 = filmData['releaseYear'] var film_title = $('#featured-film-header').find('h1').text().replace(/[\/\\#,‘’+()$~%.":*?<>{}!&]/g, '').replace(/\xa0/g, ' '); var film_year = $('#featured-film-header a[href*="films/year/"]').text(); var originalTitle = $('#featured-film-header').not('#chi_title').find('em').text().replace(/[\/\\#,‘’+()$~%.":*?<>{}!&]/g, ''); var film_language_a = $('div#tab-details span:contains("Language")').parent('h3').next('div').find('a'); var film_Country_a = $('div#tab-details h3:contains("Country"), h3:contains("Countries")').next('div').find('a'); var film_Country_first = film_Country_a.first().text(); console.log(film_Country_first); var main_tmdb_zh_title = ''; var cast_url = `https://api.themoviedb.org/3/movie/${tmdb_id}/credits?api_key=${tmdb_api}` console.log(`IMDB ID: ${imdb_id}`) console.log(`TMDB ID: ${tmdb_id}`) console.log(`英文标题: ${film_title}`) console.log(`原始标题: ${originalTitle}`) console.log(`电影年份: ${film_year}`) function hasJapanese(str) { var regExp = /[\u3040-\u309F\u30A0-\u30FF\u31F0-\u31FF\uFF65-\uFF9F]/g; return regExp.test(str); } function hasChinese(str) { var regExp = /[\u4E00-\u9FA5\u4E00-\u9FFF]/g; return regExp.test(str); } function getZhName(also_known_as) { // 判断是不是简体中文字符 function isSimpChinese(char) { return /^[\u4E00-\u9FA5]+$/.test(char); } // 判断是不是繁体中文字符 function isTradChinese(char) { return /^[\u4E00-\u9FFF]+$/.test(char); } // 判断是不是日文汉字 function isJapaneseKanji(char) { return /^[\u4E00-\u9FFF\u3400-\u4DBF]+$/.test(char); } // 判断是不是日文平假名 function isHiragana(char) { return /^[\u3040-\u309F]+$/.test(char); } // 判断是不是日文片假名 function isKatakana(char) { return /^[\u30A0-\u30FF]+$/.test(char); } function isHangul(char) { const unicode = char.charCodeAt(0); return unicode >= 0xAC00 && unicode <= 0xD7AF; } const weights = { "汉": {"simp": 10, "trad": 8, "jap": 7}, "ひらがな": {"jap": 2}, "カタカナ": {"jap": -2}, "kor": {"kor": -3} }; let maxWeight = 0; let zhjaName = ""; let minStrokeNames = []; // 记录权重相同且笔画最少的名字 let minStrokeCount = Number.MAX_SAFE_INTEGER; // 记录当前权重相同名字中笔画最少的名字的笔画数 let isAllNonChineseJapanese = true; // 新增变量,记录是否所有名字都不含汉字和平假名 for (let i = 0; i < also_known_as.length; i++) { const name = also_known_as[i]; let weight = 0; if (/(豆瓣)$/.test(name)) return name.replace('(豆瓣)', ''); let isNonChineseJapanese = true; // 新增变量,记录当前名字是否不含汉字和平假名 for (let j = 0; j < name.length; j++) { let char = name[j]; if (isSimpChinese(char)) { weight += weights["汉"]["simp"] || 0; isNonChineseJapanese = false; } else if (isTradChinese(char)) { weight += weights["汉"]["trad"] || 0; isNonChineseJapanese = false; } else if (isJapaneseKanji(char)) { weight += weights["汉"]["jap"] || 0; isNonChineseJapanese = false; } else if (isHiragana(char)) { weight += weights["ひらがな"]["jap"] || 0; isNonChineseJapanese = false; } else if (isKatakana(char)) { weight += weights["カタカナ"]["jap"] || 0; isNonChineseJapanese = false; } else if (isHangul(char)) { weight += weights["kor"]["kor"] || 0; } } if (isNonChineseJapanese) { continue; // 如果当前名字不含汉字和平假名,则继续循环下一个名字 } else { isAllNonChineseJapanese = false; // 反之,记录当前名字为包含汉字和平假名的名字 } if (weight > maxWeight) { maxWeight = weight; zhjaName = name; } } if (isAllNonChineseJapanese) { return ""; // 如果所有名字都不含汉字和平假名,则返回 null } let return_name = zhjaName || ''; return return_name.replace('(dorama.info)', '').replace('(旧芸名)', '').replace('(本名)', ''); } $(document).ready(function () { $('#userpanel').css('margin-top', '-30px'); }); // 获取导演中文名 function getDirectorAndAKA(tmdb_id) { return new Promise((resolve, reject) => { $.getJSON(`https://api.themoviedb.org/3/movie/${tmdb_id}/credits?api_key=${tmdb_api}`, function (data) { const crew = data.crew; let director = null; // 找到第一位导演信息 for (let i = 0; i < crew.length; i++) { if (crew[i].job === 'Director') { director = crew[i]; break; } } if (director !== null) { // 获取导演的 AKA 信息 $.getJSON(`https://api.themoviedb.org/3/person/${director.id}?api_key=${tmdb_api}`, function (data) { console.log(`导演aka: ${data.also_known_as}`) resolve(data.also_known_as); // resolve(`${director.name} (${data.also_known_as.join(', ')})`); }); } else { reject('未找到导演信息!'); } }); }); }; function getDoubanDirZh(dir_en_txt) { console.log("IMDb Scout Mod (getDoubanDirZh): Started."); return new Promise(resolve => { GM.xmlHttpRequest({ method: "GET", timeout: 10000, url: 'https://www.google.com/search?q="' + dir_en_txt + '" site:https://m.douban.com/movie/celebrity/', headers: {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"}, onload: function (response) { const result = String(response.responseText); console.log(`Google搜索豆瓣条目: ${result}`) if (result.match("m.douban.com/movie/celebrity/")) { const regex = /]*href="(https:\/\/m.douban.com\/movie\/celebrity\/[^"]+)"/; resolve(result); } else { return // const douban_id = "00000000"; // resolve(douban_id); } }, onerror: function () { GM.notification("Request Error.", "IMDb Scout Mod (getDoubanDirZh)"); console.log("IMDb Scout Mod (getDoubanDirZh): Request Error."); resolve("00000000"); }, onabort: function () { console.log("IMDb Scout Mod (getDoubanDirZh): Request Aborted."); resolve("00000000"); }, ontimeout: function () { console.log("IMDb Scout Mod (getDoubanDirZh): Request Timeout."); resolve("00000000"); } }); }); } async function printDirectorAndAKA(tmdb_id) { try { const director_aka = await getDirectorAndAKA(tmdb_id); console.log(director_aka); var dir_en = $('#featured-film-header p').children('a:first').find('.prettify'); var dir_en_txt = dir_en.text(); var dir_zh_txt = getZhName(director_aka).replace(' ', ''); if (!dir_zh_txt) { douban_data_dir = await getDoubanDirZh(dir_en_txt); console.log(`导演搜索html::${douban_data_dir}`) const spanText = $(douban_data_dir).find("div.VwiC3b.yXK7lf.MUxGbd.yDYNvb.lyLwlc.lEBKkf span").text().trim().split('简介:')[0]; // 包含中文和英文名字的正则表达式 const nameRegex = /[\u4e00-\u9fa5a-zA-Z]+·[\u4e00-\u9fa5a-zA-Z]+/g; const matches = spanText.match(nameRegex); const fullName = matches[0]; const cleanedName = fullName.replace(/[a-zA-Z-]/g, ''); console.log(`豆瓣导演中文名::${cleanedName}`); dir_zh_txt = `[${cleanedName}]`; if (dir_zh_txt.length > 15) { dir_zh_txt = ''; } } dir_en.css({'font-weight': '300'}); var dir_en_txt = dir_en.text(); dir_en.text(`${dir_zh_txt} ${dir_en_txt}`); } catch (error) { console.error(error); } }; printDirectorAndAKA(tmdb_id); GM_addStyle(` #overview-content header { border-bottom: 1px solid #456; margin-bottom: 15px; } #overview-content header ul { margin-bottom: -1px; overflow: hidden; } #overview-content header ul li { float: left; font-size: 1rem; letter-spacing: .075em; line-height: 1; margin: 0 15px 0 0; text-transform: uppercase; } #overview-content header ul li a { cursor: pointer; color: #00e054; display: block; padding: 0 0 5px; } #overview-content header ul li.selected a { border-bottom: 1px solid #fff; color: #fff; } `); // 重构tmdb/imdb ID 图标 $(document).ready(function refactorTmdbImdbIcons() { // 给 时长 db 元素设置ID $('div#tabbed-content').next().attr('id', 'runtime_url'); // 移除简介底部留白 $('.truncate').children('p').css('margin-bottom', '0'); // 将 时长 db 元素移动到电影标题下面 let runtime_bd_url = $('p#runtime_url'); let year_title_dir = $('section#featured-film-header'); $('section#featured-film-header').css('margin-bottom', '0'); $('span.block-flag-wrapper').css('top', '-2px').css('margin-left', '-8px'); runtime_bd_url.insertAfter(year_title_dir); // 删除tmdb按钮边框 $('#runtime_url').find('[data-track-action="TMDb"]').attr('id', 'tmdb_button').css('border', 'none').text(tmdb_id); // 创建tmdb图标 $(document).ready(function () { const brandSpan = $('' + 'Amazon' + ''); $('#tmdb_button').before(brandSpan); }); // 删除imdb按钮边框 $('#runtime_url').find('[data-track-action="IMDb"]').attr('id', 'imdb_button').css('text-transform', 'none').css('border', 'none').text(imdb_id); // 移动imdb按钮 $(document).ready(function () { // 获取 #imdb_button 元素 const imdbButton = $('#imdb_button'); // 从父元素中删除 #imdb_button 元素 imdbButton.detach(); // 将 #imdb_button 元素插入到 #tmdb_button 元素的后面 imdbButton.insertAfter('#tmdb_button'); }); // 创建imdb图标 $(document).ready(function () { const brandSpan = $('' + 'Amazon' + ''); $('#imdb_button').before(brandSpan); }); }); //构建 imdb Technical 表格 // 对使用GM_xmlhttpRequest返回的html文本进行处理并返回DOM树 function page_parser(responseText) { // 替换一些信息防止图片和页面脚本的加载,同时可能加快页面解析速度 // responseText = responseText.replace(/s+src=/ig, ' data-src='); // 图片,部分外源脚本 // responseText = responseText.replace(/]*?>[\S\s]*?<\/script>/ig, ''); //页面脚本 return (new DOMParser()).parseFromString(responseText, 'text/html'); } function getDoc(url, meta, callback) { GM_xmlhttpRequest({ method: 'GET', url: url, onload: function (responseDetail) { if (responseDetail.status === 200) { let doc = page_parser(responseDetail.responseText); callback(doc, responseDetail, meta); } } }); } function createTechnicalTable(imdb_link) { // 在tabbed-content上创建 technical_sp div $('div#tabbed-content').prepend(`
Loading Technical...
`); // 构建要添加的元素 let technical_multi_data = [ /** {name, link || `${imdb_link}`, text} */]; // 创建imdb technical 标签 function technical_specifications(data) { technical_multi_data.push(data); let technical_sp = $('#technical_sp'); let technical_html = ''; for (let i = 0; i < technical_multi_data.length; i++) { let technical_data = technical_multi_data[i]; // 将 technical_data['data'] 字符串按照竖线分隔,并去重生成字符串数组 let links = [...new Set(technical_data['data'].split('|'))] .map((str, index) => { // 如果字符串长度大于 14,且包含 8mm、16mm、35mm、65mm,则将其替换为其中的一个子串 if (str.length > 14 && /(8 mm|16 mm|35 mm|65 mm)/.test(str)) { str = str.replace(/.*(8 mm|16 mm|35 mm|65 mm).*/, '$1'); } // 生成链接 HTML 元素 let style = ''; if (index === 0) { style = 'margin-left: 6.5em'; } return `${str.trim()}`; }); technical_html += `

${technical_data['name']}

${links.join('')}

`; } technical_sp.html(technical_html); technical_sp.show(); $("#loading_technical").hide(); } let technical_link = `${imdb_link}technical/?ref_=tt_spec_sm` if (has_imdb_button) { getDoc(technical_link, null, function (doc) { // 判断是不是新版界面 let new_another = $('script#__NEXT_DATA__', doc); let is_new = new_another.length > 0; try { // 从网页中获取的部分信息,要区分是否新版页面 if (is_new) { if ($("li.ipc-metadata-list__item:contains('Aspect ratio')", doc).length > 0) { technical_specifications({ name: 'Aspect', link: imdb_link + 'technical/?ref_=tt_spec_sm', data: $("li.ipc-metadata-list__item:contains('Aspect ratio')", doc).text().replace(/^Aspect ratio/, '') .replace(/\([^)]*\)/g, '').replace(/:\s*1/g, ': 1|').replace(/\|([^|]*)$/, '$1') }); } if ($("li.ipc-metadata-list__item:contains('Negative Format')", doc).length > 0) { technical_specifications({ name: 'Negative', link: imdb_link + 'technical/?ref_=tt_spec_sm', data: $("li.ipc-metadata-list__item:contains('Negative Format')", doc).text().replace(/^Negative Format/, '') .replace(/\([^)]*\)/g, '').replace(/ mm/g, " mm|").replace("Codex", "Codex|").replace("Video", "Video|") .replace("Redcode RAW", "Redcode|RAW|").replace("HDCAM", "HDCAM|").replace(/\|([^|]*)$/, '$1') }); } } else { // 旧版代码 if ($("div.txt-block:contains('Aspect Ratio:')", doc).text().length > 0) { technical_specifications({ name: 'Aspect', link: imdb_link + 'technical?ref_=tt_dt_spec', data: $("div.txt-block:contains('Aspect Ratio:')", doc).text().trim().replace(/\n/g, '').replace(/^Aspect Ratio:/, '') .replace(/\([^)]*\)/g, '').replace(/:\s*1/g, ': 1|').replace(/\|([^|]*)$/, '$1') }); } if ($("div.txt-block:contains('Negative Format:')", doc).text().length > 0) { technical_specifications({ name: 'Negative', link: imdb_link + 'technical?ref_=tt_dt_spec', data: $("div.txt-block:contains('Negative Format:')", doc).text().trim().replace(/\n/g, '').replace(/^Negative Format:/, '') .replace(/\([^)]*\)/g, '').replace(/ mm/g, " mm|").replace("Codex", "Codex|").replace("Video", "Video|") .replace("Redcode RAW", "Redcode|RAW|").replace("HDCAM", "HDCAM|").replace(/\|([^|]*)$/, '$1') }); } } } catch (e) { // throw e; } ; }); } // 超时隐藏 loading technical setTimeout(function () { // 检查 #technical_sp 元素下是否有 a 标签 if (!document.querySelector("#technical_sp a")) { $("#loading_technical").hide(); } }, 5000); }; createTechnicalTable(imdb_link); ////// 查找tmdb中文信息并判断是否为tv电视剧 ///// 创建中文简介 ///// 创建演员列表 ///// var tmdb_ori_title = ''; var match_title = originalTitle || film_title; console.log(`要与tmdb标题匹配的标题::${match_title}`) function tmdbapi_get_movie() { return new Promise(resolve => { $.getJSON( "https://api.themoviedb.org/3/movie/" + tmdb_id + "?api_key=" + tmdb_api + "&language=zh-CN", function (tmdb_zh_data) { console.log(tmdb_zh_data); let tmdb_zh_overview = tmdb_zh_data.overview; let tmdb_zh_title = tmdb_zh_data.title; let tmdb_ori_title = tmdb_zh_data.original_title.replace(/[\/\\#,‘’+()$~%.":*?<>{}!&]/g, ''); console.log(`tmdbapi用movie获取的标题::${tmdb_ori_title}`) const chineseRegex = /[\u4e00-\u9fa5]/; if (!chineseRegex.test(tmdb_zh_title)) { tmdb_zh_title = ''; } console.log(tmdb_zh_data) console.log(tmdb_zh_overview) console.log(tmdb_zh_title) if (tmdb_ori_title.match(match_title)) { console.log('影片是movie条目') } resolve({tmdb_zh_overview, tmdb_zh_title, tmdb_ori_title}); } ).fail(function (jqXHR, textStatus, errorThrown) { console.log(`请求失败:${textStatus}, ${errorThrown}`); cast_url = `https://api.themoviedb.org/3/tv/${tmdb_id}/credits?api_key=${tmdb_api}`; $.getJSON( "https://api.themoviedb.org/3/tv/" + tmdb_id + "?api_key=" + tmdb_api + "&language=zh-CN", function (tmdb_zh_data) { console.log(tmdb_zh_data); let tmdb_zh_overview = tmdb_zh_data.overview; let tmdb_zh_title = tmdb_zh_data.name; let tmdb_ori_title = tmdb_zh_data.original_name.replace(/[\/\\#,‘’+()$~%.":*?<>{}!&]/g, ''); console.log(`tmdbapi用tv获取的标题::${tmdb_ori_title}`) const chineseRegex = /[\u4e00-\u9fa5]/; if (!chineseRegex.test(tmdb_zh_title)) { tmdb_zh_title = ''; } console.log(tmdb_zh_data) console.log(tmdb_zh_overview) console.log(tmdb_zh_title) if (tmdb_ori_title.match(match_title)) { console.log('影片是tv条目') } resolve({tmdb_zh_overview, tmdb_zh_title, tmdb_ori_title}); } ); }); }); } function tmdbapi_get_tv() { return new Promise(resolve => { $.getJSON( "https://api.themoviedb.org/3/tv/" + tmdb_id + "?api_key=" + tmdb_api + "&language=zh-CN", function (tmdb_tv_zh_data) { console.log(tmdb_tv_zh_data); let tmdb_zh_overview = tmdb_tv_zh_data.overview; let tmdb_zh_title = tmdb_tv_zh_data.name; const chineseRegex = /[\u4e00-\u9fa5]/; if (!chineseRegex.test(tmdb_zh_title)) { tmdb_zh_title = ''; } console.log(tmdb_tv_zh_data) console.log(tmdb_zh_overview) console.log(tmdb_zh_title) resolve({tmdb_zh_overview, tmdb_zh_title}); } ); }); } // 创建tmdb中文简介栏 function createTmdbZhOverview(tmdb_zh_overview) { var en_condenseable = $('div.review.body-text.-prose.-hero.prettify').find('div.condenseable'); var tmdb_en_overview = ''; var tmdb_en_overview_300 = ''; var tmdb_zh_overview_140 = tmdb_zh_overview.substring(0, 140); console.log(tmdb_zh_overview_140); // 判断页面原英文简介是否折叠 if (en_condenseable.length) { tmdb_en_overview = $('.truncate.condenseable').find('p').text().replace('×', ''); console.log(tmdb_en_overview); tmdb_en_overview_300 = tmdb_en_overview.substring(0, 300); console.log(`原英文简介折叠了:${tmdb_en_overview_300}`); } else { const en_truncate = $('.review.body-text.-prose.-hero.prettify .truncate p'); tmdb_en_overview_300 = en_truncate.text(); console.log(`原英文简介没有折叠:${tmdb_en_overview_300}`) } // 创建选项卡和内容的HTML const tabbedContentHtml = `

${tmdb_en_overview_300}

`; $('.section.col-10.col-main section').hide(); // 在#tabbed-content div之前插入选项卡内容 $('#tabbed-content').before(tabbedContentHtml); // 判断原英文简介是否折叠 并创建…more 按键 if (en_condenseable.length) { $('#en_overview_truntxt').append(`…more`); } // 判断tmdb中文简介长度是否大于140 并创建 …more 按键 if ((tmdb_zh_overview.length > 140)) { $('#zh_overview_truntxt').append(`…更多`); } // 判断tagline是否存在 并新建 const en_tagline = $('.review.body-text.-prose.-hero.prettify h4.tagline'); if (en_tagline.length) { $('.ov-en-seable').prepend(en_tagline); $('.ov-en-sed').prepend(en_tagline); } function overviewPanelInteraction() { // 处理标签页点击 $('.view-tab').click(function () { // 获取要显示的内容的ID const tabId = $(this).data('tab'); // 隐藏所有内容块 $('.tab-content').hide(); // 显示所选的内容块 $('#' + tabId).show(); // 更新活动选项卡的样式 $('.view-tab').removeClass('selected'); $(this).addClass('selected'); }); // 显示更多英文简介 $('.ov-en-condense-more').click(function () { $('.ov-en-sed').hide(); $('.ov-en-seable').show(); }); // 隐藏更多英文简介 $('.ov-en-condense-less').click(function () { $('.ov-en-seable').hide(); $('.ov-en-sed').show(); }); // 显示更多中文简介 $('.ov-zh-condense-more').click(function () { $('.ov-zh-sed').hide(); $('.ov-zh-seable').show(); }); // 隐藏更多中文简介 $('.ov-zh-condense-less').click(function () { $('.ov-zh-seable').hide(); $('.ov-zh-sed').show(); }); }; overviewPanelInteraction(); } async function tmdbapi_get() { var get_movie_data = await tmdbapi_get_movie(); var re_tmdb_zh_overview = get_movie_data.tmdb_zh_overview; var re_tmdb_zh_title = get_movie_data.tmdb_zh_title; var re_tmdb_ori_title = get_movie_data.tmdb_ori_title; if (!re_tmdb_ori_title.match(match_title)) { console.log('开始搜索tv条目') get_movie_data = await tmdbapi_get_tv(); re_tmdb_zh_overview = get_movie_data.tmdb_zh_overview; re_tmdb_zh_title = get_movie_data.tmdb_zh_title; cast_url = `https://api.themoviedb.org/3/tv/${tmdb_id}/credits?api_key=${tmdb_api}`; } console.log(`tmabapi搜索到的简介::${re_tmdb_zh_overview}`) console.log(`tmabapi搜索到的中文标题:${re_tmdb_zh_title}`) console.log(`tmabapi搜索到的原始标题:${re_tmdb_ori_title}`) main_tmdb_zh_title = re_tmdb_zh_title; createTmdbZhOverview(re_tmdb_zh_overview); ///// 从tmdb获取演员列表 ///// window.onload = function () { // 获取页面原本的演员链接 let actorLinks = $('.cast-list').find('a').filter(function () { return this.hasAttribute('href') && $(this).attr('href').indexOf('actor') !== -1; }); let actorArray = actorLinks.map(function () { return $(this).attr('href'); }).get(); console.log(`tmdb演员列表: ${actorArray}`) GM_xmlhttpRequest({ method: 'GET', url: cast_url, onload: response => { const data = JSON.parse(response.responseText); // 生成演职人员表格 const table = $('').css({ 'display': 'inline-block', 'white-space': 'nowrap' }); const tbody = $('').css({ 'display': 'flex', 'flex-wrap': 'nowrap', 'padding': '0', 'margin': '0', 'justify-content': 'center', 'align-items': 'center', 'height': '120px', 'overflow-x': 'auto', 'scroll-behavior': 'smooth' }); async function getZhJaName(cast_order, cast_id) { return new Promise((resolve, reject) => { var zhja_name = ''; if (film_language_a.attr('href').indexOf('chinese') !== -1 || film_language_a.attr('href').indexOf('cantonese') !== -1 || film_language_a.attr('href').indexOf('korean') !== -1 || film_language_a.attr('href').indexOf('japanese') !== -1) { console.log('电影是中日韩电影'); if (cast_order < 10) { $.getJSON("https://api.themoviedb.org/3/person/" + cast_id + "?api_key=" + tmdb_api + "&language=en-US", function (data) { console.log(data); var also_known_as = data.also_known_as; var zhja_name = getZhName(also_known_as); resolve(zhja_name); }); } else { resolve(zhja_name); } } else { resolve(zhja_name); } }); }; data.cast.forEach(async item => { const td = $('`) // 添加站点链接到页面中 sites.forEach(async (site) => { const link = replaceSearchUrlParams(site, imdb_nb, douban_id, film_title, film_year) const toAppend = await PTSectionFactory(site.name, link, site.icon, site) $('#search_bar01').append(toAppend) }) } function generateFilmFileName(film_year, douban_title, film_title, imdb_nb, tmdb_id) { GM_addStyle(` .fn-action-item { display: flex; flex-wrap: wrap; justify-content: center; padding: 10px 8px !important; } .editInput { -webkit-appearance: none; -moz-appearance: none; background: transparent; background-clip: border-box; background-color: #2c3440; border: none; border-radius: 2px; box-shadow: none; box-sizing: border-box; color: #89a; display: block; font-family: inherit; font-size: .84615385rem; line-height: 1; margin: 4px 2px; padding: 4px 4px 3px; text-align: left; width: calc(4em + 10px); } .fn-button { font-size: .5rem; font-weight: 400; letter-spacing: 0; margin: 5px 2px 5px 4px; padding: 4px 4px 3px; } `) let re_douban_title = douban_title.replace(/[\/\\#,,。、:?!+()$~%.":*?<>{}!&]/g, ''); if (hasJapanese(douban_title)) { re_douban_title = null } let re_film_title = re_douban_title || film_title; re_film_title = re_film_title.replace(/\s+/g, '.'); let re_tmdb_id = `{tmdb-${tmdb_id}}`; let re_imdb_id = `tt${imdb_nb}`; if (!imdb_nb) { re_imdb_id = null } let re_film_id = re_imdb_id || re_tmdb_id; // 创建新的动作项 var newActionItem = $('
  • '); $('ul.js-actions-panel').append(newActionItem); var qualitySelect = $('').appendTo(newActionItem); // 创建下拉列表框 editionSelect,并添加到容器中 function optionLabel() { $('
  • ').css({ 'padding': '5px', 'width': '90px', 'text-align': 'center' }); tbody.append(td); console.log(JSON.stringify(item)); const cast_id = item.id; const cast_order = item.order; const cast_character = item.character; let zhja_re = await getZhJaName(cast_order, cast_id); let zhja_name = zhja_re.replace(' ', ''); console.log(`第 ${cast_order} 位演员的名字为:${zhja_name}`); var castShowName = zhja_name ? zhja_name : item.name; console.log(`castShowName: ${castShowName}`) const name = $('

    ').text(castShowName).attr('title', cast_character).css({ 'cursor': 'pointer', 'text-align': 'center', 'margin-top': '8px', 'font-size': '10px', 'text-overflow': 'ellipsis', 'white-space': 'nowrap', 'overflow': 'hidden', 'max-width': '100px' }); const actorName = item.name .normalize('NFD') // 将字符串中的带变音符号的字符转换为等效的基本字符和单独的变音符号 .replace(/\p{Diacritic}/gu, '') // 删除所有的单独变音符号 .replace(/\s+/g, '-') // 将剩余空格替换成短横线 .toLowerCase(); // 全部小写 // 在原本的演员url数组中查找匹配的url const actorUrl = actorArray.filter(function (item) { return item.includes(actorName); }); // 如果item.profile_path不存在,则根据gender判断应该使用什么图片链接 // 如果gender为1,使用female图片链接,否则使用默认值 // 如果gender为2,使用male图片链接,否则使用默认值 const gender = item.gender; const imageUrl = (item.profile_path) ? `https://image.tmdb.org/t/p/w185${item.profile_path}` : (gender === 1) ? 'https://www.themoviedb.org/assets/2/v4/glyphicons/basic/glyphicons-basic-36-user-female-grey-d9222f16ec16a33ed5e2c9bbdca07a4c48db14008bbebbabced8f8ed1fa2ad59.svg' : (gender === 2) ? 'https://www.themoviedb.org/assets/2/v4/glyphicons/basic/glyphicons-basic-4-user-grey-d8fe957375e70239d6abdd549fd7568c89281b2179b5f4470e2e12895792dfa5.svg' : 'https://www.themoviedb.org/assets/2/v4/glyphicons/basic/glyphicons-basic-4-user-grey-d8fe957375e70239d6abdd549fd7568c89281b2179b5f4470e2e12895792dfa5.svg'; const image = imageUrl ? $('').attr({ 'href': actorUrl, 'target': '_blank' }).append( $('').attr('src', imageUrl).css({ 'overflow': 'hidden', 'width': '70px', 'margin-top': '-5px', 'filter': 'grayscale(100%)' })) : ''; const circleWrapper = $('

    ').css({ 'width': '70px', 'height': '70px', 'border-radius': '50%', 'overflow': 'hidden', 'position': 'relative', 'margin': '0 10px', 'transition': 'transform 0.2s' // 添加动画效果 }).hover( // 鼠标悬停时放大circleWrapper和字标签 function () { $(this).css({ 'transform': 'scale(1.1)' }).find('p').css({ 'transform': 'scale(1.1)' }); }, function () { $(this).css({ 'transform': 'scale(1.0)' }).find('p').css({ 'transform': 'scale(1.0)' }); } ); const imgWrapper = $('
    ').css({ 'position': 'relative' }); circleWrapper.append(image); imgWrapper.append(circleWrapper).append(name); td.append(imgWrapper); }); table.append(tbody); // 将表格插入到页面 let activityFriends = $('.activity-from-friends').find('.section-heading'); let activityMore = $('.activity-from-friends').find('.all-link'); let popularReview = $('#popular-reviews').find('.section-heading'); let reviewMore = $('#popular-reviews').find('.all-link'); let popularLists = $('#film-popular-lists').find('.section-heading'); let ListMore = $('#film-popular-lists').find('.all-link'); GM_addStyle(".moreytxtCss { position: static; float: right; color: #678 !important; }") const castTableDiv = $('
    ').attr('id', 'cast-list-table').css('margin', '0 0 20px 0'); if (activityFriends.length > 0) { activityFriends.before(castTableDiv); activityMore.addClass("moreytxtCss").appendTo(activityFriends); console.log('activityFriends 存在') } else if (popularReview.length > 0) { popularReview.before(castTableDiv); reviewMore.addClass("moreytxtCss").appendTo(popularReview); console.log('popularReview 存在') } else if (popularLists.length > 0) { popularLists.before(castTableDiv); ListMore.addClass("moreytxtCss").appendTo(popularLists); console.log('popularLists 存在') } castTableDiv.append($('

    ').addClass('section-heading').text('Cast List'), $('
    ').css({'overflow-x': 'auto'}).append(table)); }, onerror: error => { console.error(`构造演员列表失败 ${tmdb_id}: ${error}`); } }); }; } tmdbapi_get() // 折叠aka title function akaTtitleFold() { const aka_title = $('#tab-details .text-indentedlist'); const alternative_title = aka_title.find('p').text().replace(/\s{2,}/g, ''); console.log(`aka标题:${alternative_title}`) const alternative_title_30 = alternative_title.substring(0, 60); const alternativeTitleFold = `

    ${alternative_title_30}

    `; // 判断页面原英文简介是否折叠 if (alternative_title.length > 60) { aka_title.find('p').hide(); aka_title.append(alternativeTitleFold); $('.aka-title-more').click(function () { $('.aka-title-sed').hide(); $('.aka-title-seable').show(); }); $('.aka-title-less').click(function () { $('.aka-title-seable').hide(); $('.aka-title-sed').show(); }); } } akaTtitleFold(); ////// 豆瓣相关操作 豆瓣ID图标 豆瓣中文标题 bt/字幕 搜索栏 ///// $(document).ready(function createDoubanASO() { // 查找豆瓣id方法 function getDoubanID0(movie_id) { return new Promise(resolve => { GM.xmlHttpRequest({ method: "GET", timeout: 6000, url: "https://movie.douban.com/j/subject_suggest?q=tt" + movie_id, headers: {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0"}, onload: function (response) { const data = JSON.parse(response.responseText)[0]; if (String(response.responseText).match(movie_id)) { const douban_id = data.id; resolve(data); } else { const douban_id = "00000000"; resolve("00000000"); } }, onerror: function () { GM.notification("Request Error.", "IMDb Scout Mod (getDoubanID0)"); console.log("IMDb Scout Mod (getDoubanID0): Request Error."); resolve("00000000"); }, onabort: function () { console.log("IMDb Scout Mod (getDoubanID0): Request Aborted."); resolve("00000000"); }, ontimeout: function () { console.log("IMDb Scout Mod (getDoubanID0): Request Timeout."); resolve("00000000"); } }); }); } function getDoubanID1(movie_id) { console.log("IMDb Scout Mod (getDoubanID1): Started."); return new Promise(resolve => { GM.xmlHttpRequest({ method: "GET", timeout: 8000, url: "https://www.douban.com/search?cat=1002&q=tt" + movie_id, headers: {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0"}, onload: function (response) { const parser = new DOMParser(); const result = parser.parseFromString(response.responseText, "text/html"); if ($(result).find('[onclick*=' + movie_id + ']').length) { // 获取 href 属性值 const x = $(result).find('[onclick*=' + movie_id + ']').attr('href'); // 获取 a 标签的文本内容 const a = $(result).find('[onclick*=' + movie_id + ']').text(); if (x.match(/subject%2F(\d+)/)) { const y = x.match(/subject%2F(\d+)/)[1]; const z = a + '|' + y console.log(z) resolve(z); } else { resolve("00000000"); } } else { resolve("00000000"); } }, onerror: function () { GM.notification("Request Error.", "IMDb Scout Mod (getDoubanID1)"); console.log("IMDb Scout Mod (getDoubanID1): Request Error."); resolve("00000000"); }, onabort: function () { console.log("IMDb Scout Mod (getDoubanID1): Request Aborted."); resolve("00000000"); }, ontimeout: function () { console.log("IMDb Scout Mod (getDoubanID1): Request Timeout."); resolve("00000000"); } }); }); } function getDoubanID2(movie_id) { console.log("IMDb Scout Mod (getDoubanID2): Started."); return new Promise(resolve => { GM.xmlHttpRequest({ method: "GET", timeout: 8000, url: 'https://query.wikidata.org/sparql?format=json&query=SELECT * WHERE {?s wdt:P345 "tt' + movie_id + '". OPTIONAL { ?s wdt:P4529 ?Douban_film_ID. }}', headers: {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0"}, onload: function (response) { const result = JSON.parse(response.responseText); if (result.results.bindings[0] != undefined) { if (result.results.bindings[0].Douban_film_ID != undefined) { const douban_id = result.results.bindings[0].Douban_film_ID.value; resolve(douban_id); } else { resolve("00000000"); } } else { const douban_id = "00000000"; resolve(douban_id); } }, onerror: function () { GM.notification("Request Error.", "IMDb Scout Mod (getDoubanID2)"); console.log("IMDb Scout Mod (getDoubanID2): Request Error."); resolve("00000000"); }, onabort: function () { console.log("IMDb Scout Mod (getDoubanID2): Request Aborted."); resolve("00000000"); }, ontimeout: function () { console.log("IMDb Scout Mod (getDoubanID2): Request Timeout."); resolve("00000000"); } }); }); } function getDoubanID3(movie_id) { console.log("IMDb Scout Mod (getDoubanID3): Started."); let searchTitle = originalTitle || film_title; console.log(`搜索标题:${searchTitle}`) return new Promise(resolve => { GM.xmlHttpRequest({ method: "GET", timeout: 10000, url: 'https://www.google.com/search?q="' + searchTitle + ' ' + film_year + '" site:https://movie.douban.com/subject/', //url: 'https://search.douban.com/movie/subject_search?search_text=' + searchTitle + '+' + film_year + '&cat=1002', headers: {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"}, onload: function (response) { let result = String(response.responseText); if (!originalTitle && !result.match(film_year)) { result = '未找到符合'; } if (result.match('未找到符合')) { result = '未找到符合'; } if (result.match('的片单 - 豆瓣电影')) { result = '未找到符合'; } console.log(`Google搜索豆瓣条目3: ${result}`) //movie.douban.com/subject/ //m.douban.com/movie/subject/ if (result.match("movie.douban.com/subject/")) { const regex = /]*href="(https:\/\/movie.douban.com\/subject\/[^"]+)"/; const match = result.match(regex); const href = match ? match[1] : null; // 获取匹配到的 href 属性值 const x = href.split("movie.douban.com/subject/")[1]; const y = x.split("/")[0]; const douban_id = y; resolve({douban_id, result}); } else { const douban_id = "00000000"; resolve({douban_id, result}); } }, onerror: function () { GM.notification("Request Error.", "IMDb Scout Mod (getDoubanID3)"); console.log("IMDb Scout Mod (getDoubanID3): Request Error."); resolve("00000000"); }, onabort: function () { console.log("IMDb Scout Mod (getDoubanID3): Request Aborted."); resolve("00000000"); }, ontimeout: function () { console.log("IMDb Scout Mod (getDoubanID3): Request Timeout."); resolve("00000000"); } }); }); } function getDoubanID4(movie_id) { console.log("IMDb Scout Mod (getDoubanID4): Started."); let searchTitle = originalTitle || film_title; console.log(`搜索标题:${searchTitle}`) return new Promise(resolve => { GM.xmlHttpRequest({ method: "GET", timeout: 10000, url: 'https://www.google.com/search?q="' + searchTitle + ' ' + film_year + '" site:https://m.douban.com/movie/subject/', //url: 'https://search.douban.com/movie/subject_search?search_text=' + searchTitle + '+' + film_year + '&cat=1002', headers: {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"}, onload: function (response) { let result = String(response.responseText); if (!originalTitle && !result.match(film_year)) { result = '未找到符合'; } if (result.match('未找到符合')) { result = '未找到符合'; } if (result.match('的片单 - 豆瓣电影')) { result = '未找到符合'; } console.log(`Google搜索豆瓣条目4: ${result}`) //movie.douban.com/subject/ //m.douban.com/movie/subject/ if (result.match("m.douban.com/movie/subject/")) { const regex = /]*href="(https:\/\/m.douban.com\/movie\/subject\/[^"]+)"/; const match = result.match(regex); const href = match ? match[1] : null; // 获取匹配到的 href 属性值 const x = href.split("m.douban.com/movie/subject/")[1]; const y = x.split("/")[0]; const douban_id = y; resolve({douban_id, result}); } else { const douban_id = "00000000"; resolve(result); } }, onerror: function () { GM.notification("Request Error.", "IMDb Scout Mod (getDoubanID4)"); console.log("IMDb Scout Mod (getDoubanID4): Request Error."); resolve("00000000"); }, onabort: function () { console.log("IMDb Scout Mod (getDoubanID4): Request Aborted."); resolve("00000000"); }, ontimeout: function () { console.log("IMDb Scout Mod (getDoubanID4): Request Timeout."); resolve("00000000"); } }); }); } // 创建豆瓣按钮 function createDoubanButton(douban_url, douban_id) { // 创建豆瓣id按钮 const doubanButton = $(`
    ${douban_id}`); if ($('#imdb_button').length > 0) { // 如果存在#imdb_button,则在它后面插入doubanButton $('#imdb_button').after(doubanButton); } else { // 否则在#tmdb_button后面插入doubanButton $('#tmdb_button').after(doubanButton); } // 创建豆瓣图标 const brandSpan = $('' + 'Amazon' + ''); $('#douban_button').before(brandSpan); } // 判断是否华语电影并添加标题 function addDoubanTitle(tmdb_zh_title, douban_title) { if (tmdb_zh_title) { douban_title = tmdb_zh_title; } else if (hasJapanese(douban_title)) { douban_title = ""; } else if (!hasChinese(douban_title)) { douban_title = ""; } else if (douban_title) { douban_title = `[${douban_title}]`; } // 如果 a 元素的 href 属性不包含 'chinese',则执行指定步骤 if (film_language_a.attr('href').indexOf('chinese') === -1 && film_language_a.attr('href').indexOf('cantonese') === -1) { if (film_language_a.attr('href').indexOf('japanese') === -1) { $('section#featured-film-header').find("small").after(``); $("#chi_title").text(douban_title) console.log('电影不是华语/日语电影 添加中文标题') } else if (hasJapanese(originalTitle)) { $('section#featured-film-header').find("small").after(``); $("#chi_title").text(douban_title) console.log('电影含假名 添加中文标题') } else if (!originalTitle) { $('section#featured-film-header').find("small").after(``); $("#chi_title").text(douban_title) console.log('电影含英文 添加中文标题') } else { console.log('电影是汉字标题 不添加中文标题') } } else { console.log('电影是华语电影 不添加中文标题') } } // 创建 bt 字幕 搜索栏 function searchBars(imdb_nb, douban_id, film_title, film_year) { // 判断imdb豆瓣id是否存在 if (!imdb_nb) { imdb_nb = film_title; let notimdbnb = 'imdb_id 不存在'; console.log(notimdbnb) } if (!douban_id) { douban_id = film_title; let notdoubanid = 'douban_id 不存在'; console.log(notdoubanid) } GM_addStyle(` .search-bar-btsub > .service.missing > .atag-btsub > .site-img { filter: grayscale(100%) brightness(50%); } .search-bar-btsub > .service.error > .atag-btsub> .site-img { filter: grayscale(100%) brightness(50%); } .search-bar-btsub > .service.logged_out > .atag-btsub> .site-img { filter: grayscale(100%) brightness(50%); } `); // 内部使用的状态值 const valid_states = [ 'found', 'missing', 'logged_out', 'error' ]; // 替换搜索URL中的占位符 function replaceSearchUrlParams(site, imdb_nb, douban_id, film_title, film_year) { var search_url = site['searchUrl']; var s = search_url.replace(/%tt%/g, 'tt' + imdb_nb) .replace(/%nott%/g, imdb_nb) .replace(/%doubanId%/g, douban_id) .replace(/%s_title%/g, film_title) .replace(/%s_year%/g, film_year) .replace(/---/g, '-'); console.log(`替换后的搜索url:${s}`) return s; } // 检查是否添加链接到某个站点 async function maybeAddLink(elem, site_name, search_url, site, movie_id) { console.log('Testing... ', site_name) // 对每个站点进行连接速率限制 var set_rate = ('rateLimit' in site) ? site['rateLimit'] : 200; var rate = set_rate var domain = search_url.split('/')[2]; var now = (new Date()) * 1; var lastLoaded = window.localStorage[domain + '_lastLoaded']; if (!lastLoaded) { lastLoaded = now - 50000; } else { lastLoaded = parseInt(lastLoaded); } // 如果在限制之内,则延迟请求 if (now - lastLoaded < rate) { window.setTimeout(maybeAddLink.bind(undefined, elem, site['name'], search_url, site, movie_id), rate); return; } else { window.localStorage[domain + '_lastLoaded'] = (new Date()) * 1; } var success_match = ('positiveMatch' in site) ? site['positiveMatch'] : false; var target = search_url; if ('goToUrl' in site) { target = await replaceSearchUrlParams({ 'searchUrl': site['goToUrl'], 'spaceEncode': ('spaceEncode' in site) ? site['spaceEncode'] : '+' }, movie_id); } // 检查tmdb/tvdb转换 if (search_url.indexOf('=00000000') > -1 || search_url.indexOf('=undefined') > -1) { addLink(elem, site_name, target, site, 'error'); return; } // 请求头 let reqHeader = {}; // 使用GET方法检查结果 GM.xmlHttpRequest({ method: 'GET', headers: reqHeader, timeout: 30000, url: search_url, onload: function (response) { // 判断是否登出、404或空白响应等情况,并按照不同状态添加链接 if (response.responseHeaders.indexOf('efresh: 0; url') > -1 || response.status > 499 || (response.status > 399 && !site.ignore404) || (response.responseText == "" && !site.ignoreEmpty)) { addLink(elem, site_name, target, site, 'logged_out'); } else if (site['positiveMatch'] && site['loggedOutRegex'] && String(response.responseText).match(site['loggedOutRegex'])) { addLink(elem, site_name, target, site, 'logged_out'); } else if (String(response.responseText).match(site['matchRegex']) ? !(success_match) : success_match) { addLink(elem, site_name, target, site, 'missing'); } else if (site['loggedOutRegex'] && String(response.responseText).match(site['loggedOutRegex'])) { addLink(elem, site_name, target, site, 'logged_out'); } else { addLink(elem, site_name, target, site, 'found'); } }, onerror: function () { addLink(elem, site_name, target, site, 'error'); console.log("Letterboxd Scout Mod (GET-Request Error. Site): " + site_name); }, onabort: function () { addLink(elem, site_name, target, site, 'error'); console.log("Letterboxd Scout Mod (GET-Request aborted. Site): " + site_name); }, ontimeout: function () { addLink(elem, site_name, target, site, 'error'); console.log("Letterboxd Scout Mod (GET-Request timed out. Site): " + site_name); } }); return elem } // 添加链接到DOM中 function addLink(elem, site_name, target, site, state) { // 状态值应该是valid_states数组中定义的值 if (!valid_states.includes(state)) { console.log("Unknown state: " + state); } elem.classList.add(state) } // 站点列表 const sites = [ { 'name': 'BT4G', 'icon': 'data:image/webp;base64,UklGRvQCAABXRUJQVlA4TOgCAAAvH8AHEEfFqG0kSTV78Se1IHZxzOuqkrq6OTBu20aSZq/+m9oiduuYVzJjMW7bRpJmr/6b2iJ265hXMmMxqm1byfkfhi8GATwGQ7cOlPJiBHBX2LZtk+7NvgFA+gNewA84ADPAli5tjBCQA8xRFUkpCbAwESlSAItUpNTEBI/WWjBh7w0TRhVFIWXvDROkuA5GPmdFuSlGGdXGmJ7ncfqcVnFJF6nETYmw92Z2s9YC8DIxmJAUe2+krLWQ4nP+RaCs3XuTPdkeupB4/vu+bnYHgOb//7zP2b7vW0sdgwTbtk07+rZ/bBRj27Zt23bybdu/XN0M323CuRH9V+RIStTsoN7wESSAv9MzMVQyoWAancMiAQDjT83K/OdYAY+MImwGCX52TFkde7NluVw0JbGko9u+wPFWW2W8gI9ygMXJ0Pqi/t2N6/POmkKUA5xfOZaQz7qxfHUx0FZRxCeGvrqjxOtzY8NNDe2dAx1iYmhHpwrZ0tRIf3FRS0d3s4gYikKpVsmuBxvjcH1DsohJDDyjw7KrzgqBsAaEZBQ5vPS614dTBUxeIWAktg8C3oXeJB4Z5wEa1d0u3+ZEaS4Xmbw6m2d/oa6YjwzOvtHJbxcGpchAyqlcp1wfTZbkggRNY6f2Pe7tydJcCeQCFwVJ74I3sL/YWhkfm4/WYkq+28LKp/vzztoyNAAyNC6DHj9O9BajjsU9866gXvV4nIU6FlT0mtwGPdzlZBXkxwqYCGNB6ti2O4L994c1ZbUVApRU1Dxm8UUjRllXQ0ttohAEfCyBt1tAfZOK0se2fT8iAdlZQ3ltPdQUlgziklzu6/q9T0e1No9b99DXOjCIB6BjDXDNp9T4BPq7CyJpxrfxdZnOYZc/YLnd5QOX7fZ88z/n4yeHTm5M5oc7eLS7wGkz3Tzzj/URTJEkJS3zS1U9NDQ149qvmWmp8b9JbDKRcHPz3kgufrPXwCBW3jt59y8AsDh0GgVh4d7+KwA=', 'searchUrl': 'https://bt4g.org/search/%s_title% %s_year%/bysize/1', 'loggedOutRegex': /Cloudflare|Ray ID/, 'ignore404': true, 'spaceEncode': ' ', 'matchRegex': /did not match any/ }, { 'name': 'RARBG', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAADMUExURQAAADhgu/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7+/zhgu1d5xlt8x2GByWiGzHCNz3aS0XqV0oCa1Iig1o+l2Zar25yw3qK14Ky947DA5LXE5rnH6MbS7MvW7tDa79ff8tzj8+Pp9uzw+fT2+/7+/////0INwLoAAAAodFJOUwAAAAMIDRQZHSIqMzpAR09dY251foaPl6CmrbO7wMfQ19re5Orx9/zZOpCWAAAB3ElEQVRIx5XVWVvaQBSA4ZlhsewoBapVlqFZKqKtiFAkZfn+/3/yIhAmkJDxXOQiOe8zmeXMEUopJYQolOsNM+q1armYE/FQSqnwUah1B65nhOs4o/5dp1X/lgxqmuRw7m/KCeDqjvTo1c9Bw70AGDULp6AF8D6LxXyxXHuhcFv5E9AG8BNi8s8DcJpSSivg+79XAKOKNfD9BcB9zh74S8CpfAH4W6Arw3wr8Ab0ZJifBObz+Wz2OjYmDuh8Knjc79dH7J+cciZgGYEAaGSDXQQ+gGY24OnwamU3whEE4FYsgDnpUTEbrCMADKTKAt7k8OYV+JkJ1lG+/x+863TgT6fTvy/GRv8BdFGlg9OK2AJtZQ/WgC5Zg/EGcJvSFrx5gNuW1mAD0JP24GkHjKqXQRAE41i10S/nLoDH2KnwVwC3VxmARXwaTjcL8HK8/XYAmWB7HGJmBcw7IDBF+vGexm+ybOAd1/bZGMKq4vx3YHMJuD2AedI0ksEw7JLP8aK4BOS1B2yMsjuIZDCQYWNdGt3LBC3z2pqEB7oyOFlbE5y13Y4QouGcNeAIlB7iH35VhRD57+lA1Aax/BshhBClH855/h6IUvthqLXWWg97neq+8eert319DGPjvhKfLLE8ejIzVGgAAAAASUVORK5CYII=', 'searchUrl': 'https://rarbgweb.org/torrents.php?imdb=%tt%&order=size', 'loggedOutRegex': /something wrong|Please wait|enter the captcha|too many requests/, 'matchRegex': /imdb_thumb.gif/, 'positiveMatch': true, 'rateLimit': 4000, 'both': true }, { 'name': '1337x', 'icon': 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTI4cHgiIGhlaWdodD0iMTI4cHgiIHZpZXdCb3g9IjAgMCAxMjggMTI4IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3' + 'd3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPHRpdGxlPjEzMzd4PC90aXRsZT4KICAgIDxkZWZzPgogICAgICAgIDxwb2x5Z29uIGlkPSJwYXRoLTEiIHBvaW50cz0iMCAwIDEyOCAwIDEy' + 'OCAxMjggMCAxMjgiPjwvcG9seWdvbj4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSLpobXpnaItMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9IjEzMzd4Ij4KICAgIC' + 'AgICAgICAgPG1hc2sgaWQ9Im1hc2stMiIgZmlsbD0id2hpdGUiPgogICAgICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcGF0aC0xIj48L3VzZT4KICAgICAgICAgICAgPC9tYXNrPgogICAgICAgICAgICA8ZyBpZD0iMTAyNOW5s+a7keWchuinkuefqeW9' + 'ouiSmeeJiCI+PC9nPgogICAgICAgICAgICA8ZyBpZD0ibG9nbyIgbWFzaz0idXJsKCNtYXNrLTIpIiBmaWxsLXJ1bGU9Im5vbnplcm8iPgogICAgICAgICAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4yODcwMDAsIC0wLjEyMDAwMCkiIGlkPSLot6' + '/lvoQiPgogICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNGRjkwMTAiIHBvaW50cz0iNS4zMzM1MDMzNiAwLjE5ODA0NTIwOSA0NS44MDYxMDIgMC4xOTgwNDUyMDkgNjUuMTg5NTMwNCAzOC44NDEwMTI5IDg1LjkyNzc1ODUgMC4xOTgwNDUyMDkg' + 'MTI1LjAzNzM5NiAwLjE5ODA0NTIwOSA5NC4wODkyMDIgNjIuNTg3MTE2NSAxMjggMTI3Ljk0MjAzNiA4NC45MDc1NzggMTI4IDY0Ljc1Njk3MzkgODkuNTgxNjQ0NiA0NS40NjMzMjEzIDEyOCAwIDEyNy44ODY0ODYgMzcuOTc5Mjc3NiA2Mi41MDAxNjk4Ij48L3' + 'BvbHlnb24+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTI2LjUwMDIwNzIsODIuMjE1MzI4OSBDMjYuNTAwMjA3Miw4Mi4yMTUzMjg5IDY0LjY1NDk1NTgsNzguODk0NDQ4OCAxMDAuNTI4NTgxLDQ5LjYxMDMyNDkgTDEyNS4wNDU1NTcsMC4yMDUyOTA3' + 'NjYgTDg1LjkyNzc1ODUsMC4yMDA0NjAzOTUgTDY1LjIwNTg1MzMsMzguMjI3NTU1OCBMNDUuODg3NzE2NCwwIEw1LjI3MjI5MjU0LDAgTDM3Ljc5MTU2NDQsNjIuMTkxMDI2MSBMMjYuNTAwMjA3Miw4Mi4yMTUzMjg5IFoiIGZpbGw9IiNGRjlEMkIiPjwvcGF0aD' + '4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+', 'searchUrl': 'https://1337x.to/category-search/%s_title%+%s_year%/Movies/1/', 'matchRegex': /No results were returned/ }, { 'name': 'Blu-ray', 'icon': 'data:image/webp;base64,UklGRooBAABXRUJQVlA4TH0BAAAvH8AHEIfCoG0jSekuf7p77zQ0HDeSpEhV+1z/vWQ+aEi0bduG7tj/740YRZIUKTme+BeABWRgBAn3biCk/0xHIUDmh0ABKADFe0RQsSDB8z2HnIm0kWkcYkpMFBgKoCIKHswCYsYxwbGgJ2KIicYGsvVkAPN9j2AjBFIzHWrSKdOOTTTlCP8O8pAfmchA9XgZq01NAID5scdfALGRJEVS9zMzMzPz//HV8NH77872zs54ENH/CSCi4K3RqKyN9YGI6N8ho/sncsjqKEDm6MmdMgSfhJlPS7xNxWeSNRVm5mdLWDIqbr/b7TxtSveCQlx7BAC7wqUQKdRQrGe7Fu6StAsvY8JPkq2T88NVFm8GSSIXvzDM8wj08vAcKlfi6b8kDaD/vC7wWpIa0AMOBM6A5Wzbwlui4pLwnqItHLP4muLq+/PjYoPFqaag43hinMtvUdSmQuweRGMTLTxAtj7FytFvC6U+lCQP5PI4on+Xw/0TEQVvjaqmjPWBiAAA', 'searchUrl': 'https://www.blu-ray.com/search/?quicksearch=1&quicksearch_country=all&quicksearch_keyword=%tt%§ion=theatrical', 'matchRegex': /return any results/, 'inSecondSearchBar': true, 'both': true }, { 'name': 'Aixiaoju', 'icon': 'data:image/webp;base64,UklGRmACAABXRUJQVlA4TFQCAAAvH8AHEI/EsJAkQc3nH/Ezxe8HwaBtG0HV8wf6IG6xgrZtGO/wpxwFjaRG418INpCADST07x0eGvSDkQgjkACQQIC9KGcwQrAECIYiAgGoGGElKCCICMYuyl6C4bJIdpAAJIACAVpA7BIgWSjKjg936GSxl10g+UFXXAAU2IsCYeJlx8qVzrtSHDoQKFYOWhiJEZrb/Ga0um9qOU/F+39Com1rZxj9t7bt9p+Ojdq2bWNc27xxnjlpkr5BRP8nQAhhGbqm0req6YYlhBC2yWc0bSFMBvl4sfNzaZGkKSyS82OjQwP9vd1tjdXlX9/LrIRQOFdIWgbJJgRceEcaOslNX9GpaTm1PZNrV6SukeTwYF/D56HJ2bnWsk//jq7JGpTO0KkpDrIEmCeZD6yQPIgA3BS69wFlJHuAapLNwCt6HJZS5gFRUspcIEpKGQkkSymlWzuC9xAeH2CstwqS7GgbO6THLX+3kcCfYDaHh6MTExPjASQkeoz/MjzsRjICQfbQa15GRkYokJThecQTyd9A+BmfswrIHPK84ec0Cn7b/FTBd6ePtRBHRPv/7e3t7c1CoODM20U+8GEiBnj9i1xNBdL26fnmHRC9y79FQFh9JYDiPT6pkrz9AWCc5FUlXL9d8klVI0/fAmggeTH1PcwlpWL6xE3TyZcAyvdHq0vDASAqA86Q9I8Ns6RukCNA3cN5HJwZvadcr4mH6whpWOTdiwmSXUB21cI9ndfzLW+ikXxNWsIkH0jycvmY3h92t0hTCNvkM5q2EEJYhq4p/hRNNywhBA==', 'searchUrl': 'https://www.axjbd.com/app-index-run?app=search&keywords=%tt%', 'loggedOutRegex': /Cloudflare|Ray ID/, 'matchRegex': /没有找到与/, 'inSecondSearchBar': true, 'both': true }, { 'name': 'Zimuku', 'icon': 'data:image/webp;base64,UklGRtgAAABXRUJQVlA4TMwAAAAvH8AHEFegoG0bJirngu8uDQVt2zDpNhDjD/MraNuGcfnDGMyrEADQJoD8EdJJI4D/tgDw/99ZmGgFBz7Ih4jw2+9VCG4jSXKbL3iAt3UJIIWrhXYpElAJgIxA+9JVCahQX5GMIKL/E2Ce+zlJJcnlJTN5S5JwkI/kSlvgYto5CHV9GkEwD3XMqorpCwH9Ag4Ywy+QAi/dv3MDGiZQBgvAcIAx6kO4/oMbysgflDGTKqavY1ZNzKGzAN/naklAmrcuOh+Jee7H9C4umQE=', 'searchUrl': 'https://so.zimuku.org/search?q=%tt%', 'loggedOutRegex': /Cloudflare|Ray ID/, 'matchRegex': /搜索不到相关字幕/, 'inSecondSearchBar': true, 'both': true }, { 'name': 'SubHD', 'icon': 'data:image/webp;base64,UklGRuACAABXRUJQVlA4TNMCAAAvH8AHEK8lIZJt16p6P6IFTOFfRoYf7tljw0EbSY7kCxCe+lO9tDPTcBtJciRFHRPPpvPfFCq+9LcJR5IkRZI3LEus79P3XywzHl9XQCmEgrCNIDQESUEQthFqGv7fEcJ1RShsUdMgnDfXh9AgkAah4SwqgiCUGNpo' + 'ELYQGuoUmO3UNJwvwlnsoomwxXWzKzXXS6GK8P9hK9dFSY1t6tTU7LAfkoaGsB9N/t9U7EobDZqzUpjQ0BAENAT+ESnQnU3CNz7QmCFTpF/6bBMs4z0Bn2iUx1I2dngHwtYzftFY3Pi9wJGGNEpijBzBqaHD/kdR+kLcYVmzd7sUaTQeEl3TX6r3+2nEOU5tedOK/8bP4cjVHC3mVDoEP2f' + 'b4e6TbpayOi5/z+vY8vXtVv46gr8Pno2HF9Lb791//d8fkChJsmlb01fPtm3bNq5tzLVt28azbX7hWr3Ovn8Q0f8JEPu/V487++urSlQLq+qHuiZefhfnj+256nNu2yf2ezxLPc0b/235M6aej/w2nuksPhWRr3mzkfdZpFV5+oPze7bsOH493kFb5XsuC10D+4KLaazg21ulwfPguD2F6N' + 'sJkrwSwNzNh3YuBYALbLKD3AawMU5Vk88CWJJKuobJOQDBamasBRBKemvJKQAPLXrr5MmT4aS2mVwCsOp+uuHeWE5CYS7bezUi3a2hlOgBw1yy62aqQ1kRSz0TaAOwIsShkqnGXtm20IZF0aSiyUVV08Ku/l8IAEdJc50PZtIJAMtJbR/Zvm7dhmSLps4BFpKhbrIBwB1bQgCwnHRPkfMAV' + 'kQYifsAHCGTH0jsYgD+6w8e3rQQQFAkefEzx6Z358Mx4Ibac37KKNGorX5k9T2lz0W+ZBLVmGun9+8+djkkQ2nmFxGZdvBwRkTkV693A38N+Tud703+zF+hb1qyfctueS3OP9496hmsqS5WLa6uGex+8v6H2AEA', 'searchUrl': 'https://subhd.tv/d/%doubanId%', 'loggedOutRegex': /Cloudflare|Ray ID/, 'matchRegex': /上线时间表/, 'inSecondSearchBar': true, 'both': true }, { 'name': 'R3SUB', 'icon': 'data:image/webp;base64,UklGRooCAABXRUJQVlA4TH4CAAAvH8AHEDfloG0jQUoys6d//oCHBsS2jSTJOdHVu/dAbNtIkiS6+t78811WkWQ1aoIgjGAA/x8ISJcvKNRPvdRPHVSnCgyLEEIQiIVNpY1gU9Mi2vx+f8175k5os+/xoKkA8d5zqLAJFhC6E26z0DgswPL//xfA3KNY' + '3Ox72gQw73FYDIx9zHsq7XTTe6Zg5iYzd4Tjfb7Mzrwzd/bOSQ1iAXPH4p29Y9nPl8MEcFiIhmBT2fcYyuHdOeymO3tf9AGE4Xjv2fccBnNHHCrA0h03bSwG8n2/CdHG4gZ87xHAAoLmfb8EMe8JQhBKGyGkUo3KkLBt2/G2sr+rtvt9aWrb9mzbtu2t+2Z1Rq07yQ9do7cR/Vfktm0jIT3' + 'uOo+wLMsXiI+LJaKxcfEBn/XfBD8G+hMsy6jAb/kw1BcwJRBvSnycKXExphgXkObxOI7HTrOd3MRwm0m3nUyCrH3guu7ru22nXzy6vLUAgMIdF1efHLuzqxggb6Mk/Wvs+CLpcSXQ5eplZ8M76cNAEtAsST9qOC9Ju4FL0tx2jkp64wVaQzgnSfuBnROzf1ZxQNJ4SRiquCBpvAvIaeqvJv' + 'uqNLM3Iwzda78ufrvSQoi996dnnw1BGNZdm1/4frMnNQTvps9znw6Xh+FXTf49SZPDQFlfUxock/S2KAz1nJWkQ7Dm9+zUiRSOSFoaDJooaOCiJF0frTgj6WFW0EQ/a8DeJkkz63M3TErSx7qaV4sTW5Ib3kt/92RA8xN3+WFvl+aM3Bh7eqoRvJtPH8w5/vzWvvYkIHP5XzgeJwVSHZtgc' + '5NsO5OVMda4zP+1eS7Mc2WeS/Ncr0BfCOor0cQvJrivWA==', 'searchUrl': 'https://r3sub.com/search.php?s=%tt%', 'loggedOutRegex': /Cloudflare|Ray ID/, 'matchRegex': /查無資料/, 'inSecondSearchBar': true, 'both': true }, { 'name': 'OpenSubtitles', 'icon': 'data:image/webp;base64,UklGRnYCAABXRUJQVlA4TGoCAAAvH8AHEJ/DuJEkJ9MzeJO/iJQ3zAXBuG0jR5a84WL/uErvy7htI0eWvOFi/7hK78sgkqRGLQD/ArIAhGADAZ+j2rZtGGTq4R1KKPmVvEp+JYeSqWQoiUAHNKysAFZW85wAVgArQFppAdJa1gIATGNIyyqt0bOsJS2r63kA0oa0S1oAwP2+0gKkdb8vK8CyFgCgprSGPcB+nqYxWJX7QYbMalnLPKftOPSS1T/3sxrV1/F8X3v/H6TbtmZIUtyy7ai2HW2V29a4beN2v/+fmajEPEFE/xW4baM0O2Z8hBDC63G7nDDF6XJ7vEIIMfZVSqJQKnUiOFeaBCZLc0F0lkoFJEtfY0J8kkX0khOIvHIf2OdrBBNkL4rkp/CWSYluUiFywy1gizcRKLIbkix7PUkpQ4hIGYevIDNARhZ8iEsZQUjKpMcNm7hdduVyAACKS3/pggH+maWlJekHNOdfuSHJm6GYHkvsXpDk3XkrAGBkhx8NpebfeRDV3BE/5pRSx+wAgOAuj1t8AHLfuZcCsM7DrDaKagOAZZ7lodH/zlGg+4q9MOSENeiEd3kZw8ANewydumcOTfQ9P8eBPW7GjFQlJZoI3D7FgTnybnp4ADolQ0Xv/gkLD+8kN2pxv1UhPrix8UI+FC0mdLoWyTXTKv1alWYqvG436QgbvIwZKUvWASwZnEvyJ0dhRI6sApDvPNaKcz/0c50tJAEgvcrfRQA+9cY/yvBefPu4HVdq6p3sgEbHyj1JPm7H9IFOL0ny4ldfDHBaupd+f8/S0oLfB8Bp/17bfxf235X9d2n/Xf+Hf0H/VxwwxaH/KwI=', 'searchUrl': 'https://www.opensubtitles.org/zh/search/sublanguageid-chi,zht,zhe,eng/imdbid-%nott%/sort-5/asc-0', 'loggedOutRegex': /Guru Meditation/, 'matchRegex': /div itemscope/, 'positiveMatch': true, 'inSecondSearchBar': true, 'both': true }, { 'name': 'Caps-A-Holic', 'icon': 'data:image/webp;base64,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', 'searchUrl': 'https://caps-a-holic.com/index.php?s=%s_title%', 'matchRegex': /No results for/, 'showByDefault': false } ] // 创建一个用于显示站点链接的元素 const PTSectionFactory = async (name, link, icon, site) => { const section = $('

    ').addClass('service'); const img = $('').css({'height': '18px', 'width': '18px'}); const linkElem = $('').attr({ 'target': '_blank', 'rel': 'nofollow noopener noreferrer' }); linkElem.append(img); linkElem.attr({'href': link, 'title': name}); img.attr('src', icon); section.append(linkElem); // 检查是否添加链接到该站点 await maybeAddLink(section[0], name, link, site, imdb_nb); return section[0]; }; // 构建搜索栏 $('ul.js-actions-panel').append(`