您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add buttons to search on sukebei.nyaa.se.
// ==UserScript== // @name JAV Library Search // @description Add buttons to search on sukebei.nyaa.se. // @namespace rix.li // @match *://www.javlibrary.com/* // @match *://sukebei.nyaa.se/* // @version 3.1 // @require https://cdn.rawgit.com/emn178/js-sha1/c724643de09ae79f355e273cf2c1eec231d19a34/build/sha1.min.js // @grant GM_addStyle // @grant GM_setClipboard // ==/UserScript== var videoIdList = []; function getSearchUrl(videoId) { return 'https://sukebei.nyaa.se/?page=search&cats=8_30&sort=5&term=' + encodeURIComponent(videoId) + '#' + encodeURIComponent(videoId); } function unique(value, index, self) { return self.indexOf(value) === index; } function insertAfter(newNode, referenceNode) { referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling); } if(window.location.hostname === 'www.javlibrary.com') { GM_addStyle('.icn_search{display: inline-block;width: 24px;height: 24px;background-repeat: no-repeat;margin: 0px 0px;background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAFzUkdCAK7OHOkAAAAEZ0FNQQAAsY8L/GEFAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABqUlEQVRIS7WWMY8BQRTHnz0SiWSFjkSz8ZV8AkKNXi7R6qlX4TOIUkEUdKIQhc0mKiWCmJv3zOYcb+bcWb/kn/fGy/xn3uwsQEiq1aqIRqMCAEIRetVqNbQWH4fD4bPVasHlcpG1cECv0WgEx+MRIJ1Os7sIQ+htnU4nmb+H8/kMViQSUcPwQW9L5VpKpRJMJhPYbrcwn8+h0WioypPYts2eH2q/39NN4Mhms+ycWyWTSaHtYLfbQTweh+FwCKlUitpFtdttqvu+T/FXuA6KxSLtUpo/1FDNZpPqruuy9UDYAbvAeDwmA9MVDuBqgbRHlM/nKeKD1eF5nsrMsAtsNhuKpiucy+VUZoZdoNfrUex0OhTvKRQKFAeDAUUjumsagA/09nNpripCJBKJH7V7aR8yKpPJKJsr6/VaZd8sFgt2biDjAoG63a6yu9Lv92nnaI4sl0t2HuqpBUxCc2S1WrH1lxdAoTkynU4fatr34C84jgOz2Yy+EFle7cAk6kB2J/P3gN5WLBZTw/CRP/5glctlNQyfSqVCbdBfDNnJwxn+V+hVr9elsxBfG9P38mJXH78AAAAASUVORK5CYII=);}'); document.querySelectorAll('.video').forEach(function(video) { var videoId = video.querySelector('.id').innerText; videoIdList.push(videoId); var toolbar = video.querySelector('.toolbar'); var a = document.createElement('a'); a.classList.add('icn_search'); a.title = 'Search it!'; a.target = '_blank'; a.href = getSearchUrl(videoId); toolbar.appendChild(a); }); document.querySelectorAll('#video_favorite_edit').forEach(function(toolbar) { var videoId = document.querySelector('#video_id .text').innerText; videoIdList.push(videoId); var a = document.createElement('a'); a.classList.add('smalldarkbutton'); a.innerText = 'Search it!'; a.target = '_blank'; a.href = getSearchUrl(videoId); var span = document.createElement('span'); span.classList.add('favoritetype'); span.appendChild(a); toolbar.appendChild(span); }); videoIdList = videoIdList.filter(unique); document.querySelectorAll(".displaymode .left").forEach(function(displayMode) { var a = document.createElement('a'); a.classList.add('smalldarkbutton'); a.innerText = 'Search all!'; a.href = 'javascript:void(0);'; a.addEventListener('click', function(e) { e.preventDefault(); videoIdList.forEach(function(videoId) { window.open(getSearchUrl(videoId)); }); }); var span = document.createElement('span'); span.classList.add('favoritetype'); span.appendChild(a); displayMode.appendChild(span); }); } function getResultSize(result) { var sizeExpr = result.querySelector('.tlistsize').innerText.split(/\s+/); var quantity = parseFloat(sizeExpr[0]); var unit = sizeExpr[1]; switch(unit) { case 'KiB': return quantity * 1024; case 'MiB': return quantity * Math.pow(1024, 2); case 'GiB': return quantity * Math.pow(1024, 3); } return NaN; } function isTrustedResult(result) { return result.classList.contains('trusted'); } function bendecode(dataView) { var i = 0, info_start = -1, info_end = -1, info_hash; var text_decoder = new TextDecoder(); function charIsNumber(char) { return char >= 48 && char <= 57; } function bendecode_integer() { var integer = 0, char, negative = false; if (dataView.getInt8(i) == 45) { negative = true; i++; } while (charIsNumber(char = dataView.getInt8(i))) { integer = integer * 10 + (char - 48); i++; } return negative ? (-integer) : integer; } function bendecode_string() { var l = bendecode_integer(), str = ""; i++; // ':' var end = i + l; return text_decoder.decode(dataView.buffer.slice(i, (i += l))); } function bendecode_list() { i++; var list = []; while (dataView.getInt8(i) !== 101) { // 'e' list.push(decode()); } i++; return list; } function bendecode_dictionary() { i++; var dic = {}; while (dataView.getInt8(i) !== 101) { // 'e' var key = bendecode_string(); if (key === 'info' && info_start < 0) { info_start = i; } var value = decode(); if (key === 'info' && info_end < 0) { info_end = i; info_hash = sha1(dataView.buffer.slice(info_start, info_end)); } dic[key] = value; } i++; return dic; } function decode() { if (i <= dataView.byteLength) { var char = dataView.getInt8(i); if (charIsNumber(char)) { return bendecode_string(); } else if (char == 105) { // 'i' i++; var integer = bendecode_integer(); i++; return integer; } else if (char == 108) { // 'l' return bendecode_list(); } else if (char == 100) { // 'd' return bendecode_dictionary(); } } } var result = decode(); return { info_hash: info_hash, result: result }; } function copyMagnetFromTorrentURL(url) { fetch(url).then(function(response) { response.arrayBuffer().then(function(arrayBuffer) { var torrent = bendecode(new DataView(arrayBuffer)); var magnet = 'magnet:?xt=urn:btih:' + torrent.info_hash; GM_setClipboard(magnet); document.querySelector('.dl-copy').innerText = 'Copied!'; setTimeout(function() { document.querySelector('.dl-copy').innerText = 'Copy magnet'; }, 500); }); }); } if(window.location.hostname === 'sukebei.nyaa.se') { GM_addStyle('.dl-btn {color: #eee; border-radius: 8px; cursor: pointer; float: right; margin-right: 60px;} .dl-found{background-color: #333;} .dl-not-found {background-color: #a50202;} .dl-copy{background-color: #070;}'); if (document.querySelector('.container') === null) { // on list result page var results = []; var videoId = window.location.hash.slice(1); var regex = new RegExp(videoId.replace(/-/g, '\\s*-?\\s*'), 'i'); var notice = document.querySelector('span.notice'); document.querySelectorAll('.tlistrow').forEach(function(row) { if (row.querySelector('.tlistname').innerText.match(regex)) results.push(row); }); if (!results.length) { var a = document.createElement('a'); a.classList.add('notice'); a.classList.add('dl-btn'); a.classList.add('dl-not-found'); a.href = 'javascript:void(0);'; a.innerText = 'Best result not found!'; insertAfter(a, notice); } else { var bestResult = results[0]; var bestResultSize = getResultSize(bestResult); var bestResultTrusted = isTrustedResult(bestResult); if (!bestResultTrusted) { results.find(function(result) { var resultSize = getResultSize(result); var resultTrusted = isTrustedResult(result); if (resultTrusted && (bestResultSize - resultSize) <= 100 * Math.pow(1024, 2)) { bestResult = result; return true; } return false; }); } var torrentURL = bestResult.querySelector('.tlistdownload a').href; var downloadButton = document.createElement('a'); downloadButton.classList.add('notice'); downloadButton.classList.add('dl-btn'); downloadButton.classList.add('dl-found'); downloadButton.href = torrentURL; downloadButton.innerText = 'Download best result!'; insertAfter(downloadButton, notice); var copyButton = document.createElement('a'); copyButton.classList.add('notice'); copyButton.classList.add('dl-btn'); copyButton.classList.add('dl-copy'); copyButton.href = 'javascript:void(0)'; copyButton.innerText = 'Copy magnet'; copyButton.addEventListener('click', function() { copyMagnetFromTorrentURL(torrentURL); }); insertAfter(copyButton, notice); } } else { // on single result page var torrentURL = document.querySelector('.viewdownloadbutton a').href; var copyButton = document.createElement('a'); copyButton.classList.add('notice'); copyButton.classList.add('dl-btn'); copyButton.classList.add('dl-copy'); copyButton.href = 'javascript:void(0)'; copyButton.innerText = 'Copy magnet'; copyButton.addEventListener('click', function() { copyMagnetFromTorrentURL(torrentURL); }); insertAfter(copyButton, document.querySelector('.viewdownloadbutton')); } }