// ==UserScript== // @name Letterboxd Enhancer 中文增强显示与搜索:集合啦!数字难民 // @namespace http://tampermonkey.net/ // @version 0.5.10 // @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 https://update.greasyfork.icu/scripts/464693/Letterboxd%20Enhancer%20%E4%B8%AD%E6%96%87%E5%A2%9E%E5%BC%BA%E6%98%BE%E7%A4%BA%E4%B8%8E%E6%90%9C%E7%B4%A2%EF%BC%9A%E9%9B%86%E5%90%88%E5%95%A6%EF%BC%81%E6%95%B0%E5%AD%97%E9%9A%BE%E6%B0%91.user.js // @updateURL https://update.greasyfork.icu/scripts/464693/Letterboxd%20Enhancer%20%E4%B8%AD%E6%96%87%E5%A2%9E%E5%BC%BA%E6%98%BE%E7%A4%BA%E4%B8%8E%E6%90%9C%E7%B4%A2%EF%BC%9A%E9%9B%86%E5%90%88%E5%95%A6%EF%BC%81%E6%95%B0%E5%AD%97%E9%9A%BE%E6%B0%91.meta.js // ==/UserScript== // 设置横向滚动条的样式 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('/crew/') === -1 && currentUrl.indexOf('/releases/') === -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/'); } var tmdb_api = GM_getValue('tmdb_api', 'default_api'); if (tmdb_api.length <= 30) { var api = prompt('请输入 TMDB API:'); if (api !== null && api.length > 30) { GM_setValue('tmdb_api', api); tmdb_api = GM_getValue('tmdb_api', 'default_api'); alert('TMDB API设置成功!'); } } $(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 = $('h1.headline-1.filmtitle span.name.js-widont.prettify').text().replace(/[\/\\#,‘’+()$~%.":*?<>{}!&]/g, '').replace(/\xa0/g, ' '); var film_year = $('div.releaseyear 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 global_douban_title = ""; 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); // 将类型放到detail中 let genres = $('#tab-genres a[href*="/films/genre/"]').first().parent().parent(); genres = genres.prop('outerHTML'); if (genres) { $('#tab-details').prepend(`

Genre

${genres}`); } // 删除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); var new_href = ""; // 移动imdb按钮 $(document).ready(function () { // 获取 #imdb_button 元素 const imdbButton = $('#imdb_button'); // 从父元素中删除 #imdb_button 元素 imdbButton.detach(); // 将 #imdb_button 元素插入到 #tmdb_button 元素的后面 imdbButton.insertAfter('#tmdb_button'); new_href = imdbButton.attr("href").replace('http://', 'https://').replace('/maindetails', '/'); imdbButton.attr("href", new_href); }); // 创建imdb图标 $(document).ready(function () { const brandSpan = $(` Amazon `); $('#imdb_button').before(brandSpan); brandSpan.on('click', function (event) { // 创建临时文本区域 var tempTextArea = $('