您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add links to "Shoboi Calendar", "MyAnimeList" and "AniList" on Annict works page.
当前为
// ==UserScript== // @name Annict Work Links // @namespace https://github.com/SlashNephy // @version 0.3.1 // @author SlashNephy // @description Add links to "Shoboi Calendar", "MyAnimeList" and "AniList" on Annict works page. // @description:ja Annict の作品ページに「しょぼいカレンダー」「MyAnimeList」「AniList」へのリンクを追加します。 // @homepage https://scrapbox.io/slashnephy/Annict_%E3%81%AE%E4%BD%9C%E5%93%81%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AB%E5%90%84%E7%A8%AE%E3%82%B5%E3%82%A4%E3%83%88%E3%81%B8%E3%81%AE%E3%83%AA%E3%83%B3%E3%82%AF%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B_UserScript // @homepageURL https://scrapbox.io/slashnephy/Annict_%E3%81%AE%E4%BD%9C%E5%93%81%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AB%E5%90%84%E7%A8%AE%E3%82%B5%E3%82%A4%E3%83%88%E3%81%B8%E3%81%AE%E3%83%AA%E3%83%B3%E3%82%AF%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B_UserScript // @icon https://www.google.com/s2/favicons?sz=64&domain=annict.com // @supportURL https://github.com/SlashNephy/.github/issues // @match https://annict.com/* // @connect raw.githubusercontent.com // @grant GM_xmlhttpRequest // @license MIT license // ==/UserScript== const executeXhr = async (request) => new Promise((resolve, reject) => { GM_xmlhttpRequest({ ...request, onload: (response) => { resolve(response) }, onerror: (error) => { reject(error) }, }) }) const fetchArmEntries = async () => { const response = await executeXhr({ method: 'GET', url: 'https://raw.githubusercontent.com/SlashNephy/arm-supplementary/master/dist/arm.json', }) return JSON.parse(response.responseText) } const annictWorkPageUrlPattern = /^https:\/\/annict\.com\/works\/(\d+)/ const cachedEntries = [] const main = async () => { const match = annictWorkPageUrlPattern.exec(window.location.href) if (!match) { return } const annictId = parseInt(match[1], 10) if (!annictId) { throw new Error('Failed to extract Annict work id') } const links = document.querySelector( 'div.c-work-header.pt-3 > div.container > div > div.col.mt-3.mt-sm-0 > ul.list-inline.mb-0' ) if (!links || links.childNodes.length === 0) { throw new Error('Failed to find target container') } if (cachedEntries.length === 0) { const entries = await fetchArmEntries() cachedEntries.push(...entries) } const entry = cachedEntries.find((x) => x.annict_id === annictId) if (!entry) { console.warn(`arm entry not found: annict_id=${annictId}`) return } if (entry.syobocal_tid !== undefined && links.firstChild) { const link = links.firstChild.cloneNode(true) const aHtml = link.firstChild aHtml.href = `https://cal.syoboi.jp/tid/${entry.syobocal_tid}` aHtml.childNodes[0].textContent = 'しょぼいカレンダー' links.appendChild(link) } if (entry.anilist_id !== undefined && links.firstChild) { const link = links.firstChild.cloneNode(true) const aHtml = link.firstChild aHtml.href = `https://anilist.co/anime/${entry.anilist_id}` aHtml.childNodes[0].textContent = 'AniList' links.appendChild(link) } if (entry.mal_id !== undefined && links.firstChild) { const link = links.firstChild.cloneNode(true) const aHtml = link.firstChild aHtml.href = `https://myanimelist.net/anime/${entry.mal_id}` aHtml.childNodes[0].textContent = 'MyAnimeList' links.appendChild(link) } } document.addEventListener('turbo:load', () => { main().catch(console.error) })