NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name shikiPlus // @author chsa13 // @description script add viewer and playeer on shikimori // @namespace http://shikimori.me/ // @version 1 // @match *://shikimori.org/* // @match *://shikimori.one/* // @match *://shikimori.me/* // @icon https://www.google.com/s2/favicons?domain=shikimori.me // @license MIT // @copyright Copyright © 2024 chsa13. All rights reserved. // @downloadURL https://openuserjs.org/src/scripts/chsa13/shikiPlus.user.js // @updateURL https://openuserjs.org/meta/chsa13/shikiPlus.meta.js // ==/UserScript== let RonobeLibLink = "https://ranobelib.me/ru/" let MangaLibLink = "https://test-front.mangalib.me/ru/" let AnimeLibLink = "https://anilib.me/ru/anime/" let LibSocialApiLink = 'https://api.lib.social/api' function launchFullScreen(element) { if (element.requestFullScreen) { element.requestFullScreen(); } else if (element.webkitRequestFullScreen) { element.webkitRequestFullScreen(); } else if (element.mozRequestFullScreen) { element.mozRequestFullScreen(); } } function ready(fn) { document.addEventListener('page:load', fn); document.addEventListener('turbolinks:load', fn); if (document.attachEvent ? document.readyState === "complete" : document.readyState !== "loading") fn(); else document.addEventListener('DOMContentLoaded', fn); } async function sleep(timeMs) { await new Promise(resolve => setTimeout(resolve, timeMs)); } async function GetResourceAsync(uri, config = {}) { return await new Promise((resolve, reject) => { $.ajax(Object.assign({ url: uri, dataType: 'json', async: true, cache: false, success: function (res) { resolve(res); }, error: function (xhr) { reject(xhr); } }, config)); }); } async function ranobelib(hrefs) { let sets = document.createElement("div") sets.style.cssText = ` width: 100%; height: 40px; display: flex; ` document.querySelector('.b-db_entry').appendChild(sets) let sweatcher = document.createElement("div") sweatcher.style.cssText = ` height: 40px; background-color: grey; display: flex; ` if (hrefs.length >= 2) sets.appendChild(sweatcher) var fr = document.createElement("iframe"); for (let i in hrefs) { let btm = document.createElement("div") btm.style.cssText = ` width: 40px; height: 40px; background-color: green; display: flex; ` btm.textContent = (String(i)) sweatcher.appendChild(btm) btm.addEventListener("click", () => { fr.src = RonobeLibLink + hrefs[i] + "/read/v01/c01" }) } fr.src = RonobeLibLink + hrefs[0] + "/read/v01/c01" console.log(RonobeLibLink + hrefs[0] + "/read/v01/c01") fr.setAttribute('allowFullScreen', 'allowfullscreen') fr.style.cssText = ` width: 100%; height: unset; aspect-ratio: 1.36; min-height: 650px; border: none; `; let blackdiv = document.createElement("div") blackdiv.style.cssText = ` position: absolute; background-color: black; width: 100%; height: unset; aspect-ratio: 1.36; min-height: 650px; border: none; ` let e = document.createElement("div") e.style.cssText = ` width: 40%; height: 40px; background-color: blue; ` sets.appendChild(e) e.addEventListener("click", () => { launchFullScreen(fr) }) /* document.querySelector('.b-db_entry').appendChild(blackdiv) */ fr.onload = async function () { blackdiv.remove() } document.querySelector('.b-db_entry').appendChild(fr) } async function mangalib(hrefs) { let sets = document.createElement("div") sets.style.cssText = ` width: 100%; height: 40px; display: flex; ` document.querySelector('.b-db_entry').appendChild(sets) let sweatcher = document.createElement("div") sweatcher.style.cssText = ` width: 50%; height: 40px; background-color: grey; display: flex; ` if (hrefs.length >= 2) sets.appendChild(sweatcher) var fr = document.createElement("iframe"); for (let i in hrefs) { let btm = document.createElement("div") btm.style.cssText = ` width: 40px; height: 40px; background-color: green; display: flex; ` btm.textContent = (String(i)) sweatcher.appendChild(btm) btm.addEventListener("click", () => { fr.src = MangaLibLink + hrefs[i] + "/read/0v1/c01" }) } fr.src = MangaLibLink + hrefs[0] + "/read/v01/c01" launchFullScreen(fr) fr.setAttribute('allowFullScreen', 'allowfullscreen') fr.style.cssText = ` width: 100%; height: unset; aspect-ratio: 1.36; min-height: 650px; border: none; `; let blackdiv = document.createElement("div") blackdiv.style.cssText = ` position: absolute; background-color: black; width: 100%; height: unset; aspect-ratio: 1.36; min-height: 650px; border: none; ` document.querySelector('.b-db_entry').appendChild(blackdiv) let e = document.createElement("div") e.style.cssText = ` width: 40%; height: 40px; background-color: blue; ` sets.appendChild(e) e.addEventListener("click", () => { launchFullScreen(fr) }) fr.onload = async function () { blackdiv.remove() } document.querySelector('.b-db_entry').appendChild(fr) } async function animelib(href) { var fr = document.createElement("iframe"); fr.src = AnimeLibLink + href.split("?")[0] + "/watch"; fr.setAttribute('allowFullScreen', 'allowfullscreen') fr.style.cssText = ` width: 100%; height: unset; aspect-ratio: 1.36; min-height: 650px; border: none; `; let blackdiv = document.createElement("div") blackdiv.style.cssText = ` position: absolute; background-color: black; width: 100%; height: unset; aspect-ratio: 1.36; min-height: 650px; border: none; ` document.querySelector('.b-db_entry').appendChild(blackdiv) fr.onload = async function () { blackdiv.remove() } document.querySelector('.b-db_entry').appendChild(fr) } async function addBtn() { let btn = document.createElement("div") let clickFunc = function () { 1 == 1 } let href = "" if (location.href.includes("/animes/")) { let id = document.querySelector('.b-user_rate').getAttribute('data-target_id') let title = document.querySelector("meta[property='og:title']").getAttribute('content') try { title = title.split(" ")[0] } catch { 1 == 1 } console.log(title) let response = await GetResourceAsync(LibSocialApiLink + "/anime?q=" + title) href = "" console.log(response) for (let i in response.data) { if (id == response.data[i].shikimori_href.split("/")[4]) { href = response.data[i].slug_url } } clickFunc = animelib console.log(href) } else if (location.href.includes("/mangas/")) { let as = document.querySelectorAll(".mangalib > a") href = [] for (let i in as) { if (as[i].href) { i = (as[i].href.split("?")[0].replace("https://mangalib.me/", "").replace("ru/", "").replace("book/", "").replace("ranobes/", "").replace("ranobe/", "").replace("manga/", "").replace("mangas/", "")) console.log(i) let response = await GetResourceAsync(LibSocialApiLink + "/manga?q=" + i.replace("-", " ").slice(0, 4) + "&site_id[]=1") console.log(LibSocialApiLink + "/manga?q=" + i.replace("-", " ")) for (let u in response.data) { console.log(i, response.data[u].slug) if (i == response.data[u].slug_url || i == response.data[u].slug) { i = response.data[u].slug_url } } console.log(response) href.push(i) } } clickFunc = mangalib } else if (location.href.includes("/ranobe/")) { let as = document.querySelectorAll(".ranobelib > a") href = [] for (let i in as) { if (as[i].href) { i = (as[i].href.split("?")[0].replace("https://ranobelib.me/", "").replace("ru/", "").replace("book/", "").replace("ranobes/", "").replace("ranobe/", "").replace("manga/", "").replace("mangas/", "")) console.log(i) let response = await GetResourceAsync(LibSocialApiLink + "/manga?q=" + i.replaceAll("-", " ").slice(0, 4) + "&site_id[]=3") console.log(LibSocialApiLink + "/manga?q=" + i.replace("-", " ").split(" ")[0]) for (let u in response.data) { console.log(i, response.data[u].slug) if (i == response.data[u].slug_url || i == response.data[u].slug) { i = response.data[u].slug_url } } console.log(response) href.push(i) } } console.log(href) clickFunc = ranobelib } btn.addEventListener("click", async () => { btn.remove() console.log(href) clickFunc(href) }) btn.style.cssText = ` border-radius: 10px; opacity: 0.75; text-align: center; font-size: 25px; width: 100%; height: 40px; background-color: #e0ff9a; cursor: pointer; ` btn.textContent = "Play" if (href || href.length) document.querySelectorAll('.c-image').forEach(e => e.appendChild(btn)) } ready(addBtn)