Greasy Fork

Add manga baka-updates links to nyaa

Adds manga links rating and cover from mangaupdates.com to nyaa.si tracker

目前为 2024-12-31 提交的版本。查看 最新版本

// ==UserScript==
// @name        Add manga baka-updates links to nyaa
// @namespace   Violentmonkey Scripts
// @match       https://nyaa.si/*
// @match       https://nyaa.land/*
// @match       https://nyaa.iss.one/*
// @grant       GM.xmlHttpRequest
// @connect     www.mangaupdates.com
// @version     2.0
// @author      szq2
// @description Adds manga links rating and cover from mangaupdates.com to nyaa.si tracker
// @license     0BSD
// ==/UserScript==

const fetchRating = true; // enable to fetch first series rating and link from search page
const fetchRatingDelay = 2000; //ms
const target = "_blank"; // where to open mangaupdates page, _blank for new tab

const re = /^(?:\[.*\])?\s*([^(\[]+?) *((v(olume)?)?[\d\-+ ]+)?( +[\(\[].*)?$/i; // regex to select book name from torrent name

const fetchJSON = (url, data) => new Promise((resolve, reject) => {
  GM.xmlHttpRequest({
    method: "POST",
    url: url,
    headers: {
    "Content-Type": "application/json"
  },
    data: data,
    responseType: 'json',
    anonymous: true,
    onload: response => resolve(response.response),
    onerror: err => reject(err),
    timeout: 2000
  });
});
const delay = (time) => new Promise(res => setTimeout(res,time));

async function fetchSeriesDetails(title) {
  const apiEndpoint = 'https://api.mangaupdates.com/v1/series/search';

  // Make a POST request to the MangaUpdates API with the search title
  const data = await fetchJSON(apiEndpoint, JSON.stringify({
      search: title,
      stype: 'title',
    }));

  if (data.total_hits === 0 || !data.results || data.results.length === 0) {
    console.log('No series found for the given title.' + title + JSON.stringify(data));
    throw 0;
  }

  // Extract the first result
  const firstResult = data.results[0];
  const coverPage = firstResult.record.image.url.thumb || firstResult.record.image.url.original;
  const seriesTitle = firstResult.hit_title;
  const rating = firstResult.record.year + " " + (firstResult.record.bayesian_rating || "");
  const seriesLink = firstResult.record.url;

  return `<a href=${seriesLink}" title="${seriesTitle}" target="${target}"><img src="${coverPage}" /></a><a href=${seriesLink}" title="${firstResult.record.description}"  target="${target}">[${rating}]</a> `;
}


(async function () {
  'use strict';

  // books
  let book = 0;
  for (let a of document.querySelectorAll("tr > td:nth-child(1) > a[title*='Literature']")) {
    a = a.parentElement.nextElementSibling.lastElementChild;
    const title = a.innerText.match(re);
    //console.log(a.innerText);
    if (!title) continue;
    //fetchSeriesDetails(title[1]);
    //continue;
    const url = `https://www.mangaupdates.com/series?search=${encodeURI(title[1])}`;

    let mangalink = document.createElement("span");
    mangalink.innerHTML = `<a href="${url}" title="${title[1]}" target="${target}">[m]</a> `;
    a.insertAdjacentElement("beforebegin", mangalink);

    if (fetchRating) {
      delay((book + Math.random()) * fetchRatingDelay)
        .then(() => fetchSeriesDetails(title[1]))
        .then(doc => {
          mangalink.innerHTML = doc;
        }).catch(error => {
          // Handle any errors that occurred during the download
          console.error('Error:', error);
        });
    }
    book++;
  }

})();