// ==UserScript== // @name linkDoubanTrakt // @namespace http://tampermonkey.net/ // @version 0.1 // @description 在豆瓣和 trakt 之间增加跳转链接 // @description:zh-CN 在豆瓣和 trakt 之间增加跳转链接 // @description:en add trakt link on douban, and vice versa // @author Kjtsune // @match https://movie.douban.com/top250* // @match https://movie.douban.com/subject/* // @match https://trakt.tv/movies/* // @match https://trakt.tv/shows/* // @icon https://www.google.com/s2/favicons?sz=64&domain=douban.com // @grant GM.xmlHttpRequest // @connect api.douban.com // @connect movie.douban.com // @license MIT // @downloadURL none // ==/UserScript== "use strict"; function getURL_GM(url) { return new Promise(resolve => GM.xmlHttpRequest({ method: 'GET', url: url, onload: function (response) { if (response.status >= 200 && response.status < 400) { resolve(response.responseText); } else { console.error(`Error getting ${url}:`, response.status, response.statusText, response.responseText); resolve(); } }, onerror: function (response) { console.error(`Error during GM.xmlHttpRequest to ${url}:`, response.statusText); resolve(); } })); } async function getJSON_GM(url) { const data = await getURL_GM(url); if (data) { return JSON.parse(data); } } async function getDoubanId(imdbId) { const search = await getJSON_GM(`https://movie.douban.com/j/subject_suggest?q=${imdbId}`); if (search && search.length > 0 && search[0].id) { return search[0].id } } function addTraktLink() { if (window.location.host != 'movie.douban.com') { return }; // if (window.location.host.search(/douban/) == -1) { return }; let traktA = document.querySelector('#traktLink'); let imdbA = document.querySelector('#info > a[href^=https\\:\\/\\/www\\.imdb'); if (!traktA && imdbA) { let imdbId = imdbA.textContent let traktHtml = ` Trakt` imdbA.insertAdjacentHTML("afterend", traktHtml); } } async function addDoubanLink() { if (window.location.host != 'trakt.tv') { return }; let doubanA = document.querySelector('#doubanLink'); let imdbA = document.querySelector('#external-link-imdb'); if (!doubanA && imdbA) { let imdbId = imdbA.href.split('/').at(-1); let doubanId = await getDoubanId(imdbId); let douhanHtml = `Douban` imdbA.insertAdjacentHTML("beforebegin", douhanHtml); } } function douban_delete_old(item) { let year = item.querySelector('p').textContent.split('\n')[2].match(/\d+/)[0] if (Number(year) < 2000 || Number(year) > 2010) { item.remove() } } // clean top250 // let movieList = document.querySelectorAll('ol.grid_view > li') // movieList.forEach(douban_delete_old) addTraktLink() addDoubanLink()