// ==UserScript==
// @name ShikiUtils
// @icon https://www.google.com/s2/favicons?domain=shikimori.me
// @namespace https://shikimori.one
// @version 2.5
// @description Полезные утилиты для шикимори
// @author LifeH
// @match *://shikimori.org/*
// @match *://shikimori.one/*
// @match *://shikimori.me/*
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_registerMenuCommand
// @grant GM_xmlhttpRequest
// @connect shikimori.one
// @license MIT
// ==/UserScript==
(function () {
"use strict";
const CopyBtnI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABN2lDQ1BBZG9iZSBSR0IgKDE5OTgpAAAokZWPv0rDUBSHvxtFxaFWCOLgcCdRUGzVwYxJW4ogWKtDkq1JQ5ViEm6uf/oQjm4dXNx9AidHwUHxCXwDxamDQ4QMBYvf9J3fORzOAaNi152GUYbzWKt205Gu58vZF2aYAoBOmKV2q3UAECdxxBjf7wiA10277jTG+38yH6ZKAyNguxtlIYgK0L/SqQYxBMygn2oQD4CpTto1EE9AqZf7G1AKcv8ASsr1fBBfgNlzPR+MOcAMcl8BTB1da4Bakg7UWe9Uy6plWdLuJkEkjweZjs4zuR+HiUoT1dFRF8jvA2AxH2w3HblWtay99X/+PRHX82Vun0cIQCw9F1lBeKEuf1UYO5PrYsdwGQ7vYXpUZLs3cLcBC7dFtlqF8hY8Dn8AwMZP/fNTP8gAAAAJcEhZcwAAAE8AAABPAWOK/dcAAAXRaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzE0MiA3OS4xNjA5MjQsIDIwMTcvMDcvMTMtMDE6MDY6MzkgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE4IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjUtMDEtMzFUMDI6Mzg6MjMrMDE6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDI1LTAxLTMxVDAyOjU4OjUxKzAxOjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDI1LTAxLTMxVDAyOjU4OjUxKzAxOjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo2YWFkNjQ5Zi0yZjgzLTFhNGMtYjRlNi0wNTVjOWUyYTE2YTgiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDpiYzY3YzUwMS0yOWE4LTAwNDctYjIzYy04Mjg5NDQwMWVhZWEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDplYWE5Njg2Zi0zYzM5LWUzNDUtODQwMi1kYzM3YTIyYThmYWQiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmVhYTk2ODZmLTNjMzktZTM0NS04NDAyLWRjMzdhMjJhOGZhZCIgc3RFdnQ6d2hlbj0iMjAyNS0wMS0zMVQwMjozODoyMyswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo2YWFkNjQ5Zi0yZjgzLTFhNGMtYjRlNi0wNTVjOWUyYTE2YTgiIHN0RXZ0OndoZW49IjIwMjUtMDEtMzFUMDI6NTg6NTErMDE6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE4IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5BTpLUAAAAz0lEQVQ4jc3SMUuCURjF8Z/2OjlY30IQ5yAnF1EIGhrDyQ/iB2ipOQoXN8FRF0GCaA8awo8QKO5qDb5DvNzuW04euMvDc/73nMstzCZj6KCBxO/6xBNWP4dJah5him0E0MYlmlnAeWq+jpihhofssIgCNjlmeMdFCJBVz77nV+Rs8Yyz0KPdoo+XSJoiHtENASqY4y0CgAVOQxX+peMArFFF/VDAAEsMDwEkqbmZtxhLkNUOJ3+8fBf6B6/2tT4i5hJauAsBrnCDck6Ce8y/AVeuKCJx/FChAAAAAElFTkSuQmCC";
const CopyBtnSelI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABN2lDQ1BBZG9iZSBSR0IgKDE5OTgpAAAokZWPv0rDUBSHvxtFxaFWCOLgcCdRUGzVwYxJW4ogWKtDkq1JQ5ViEm6uf/oQjm4dXNx9AidHwUHxCXwDxamDQ4QMBYvf9J3fORzOAaNi152GUYbzWKt205Gu58vZF2aYAoBOmKV2q3UAECdxxBjf7wiA10277jTG+38yH6ZKAyNguxtlIYgK0L/SqQYxBMygn2oQD4CpTto1EE9AqZf7G1AKcv8ASsr1fBBfgNlzPR+MOcAMcl8BTB1da4Bakg7UWe9Uy6plWdLuJkEkjweZjs4zuR+HiUoT1dFRF8jvA2AxH2w3HblWtay99X/+PRHX82Vun0cIQCw9F1lBeKEuf1UYO5PrYsdwGQ7vYXpUZLs3cLcBC7dFtlqF8hY8Dn8AwMZP/fNTP8gAAAAJcEhZcwAAAE8AAABPAWOK/dcAAAahaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzE0MiA3OS4xNjA5MjQsIDIwMTcvMDcvMTMtMDE6MDY6MzkgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE4IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjUtMDEtMzFUMDI6Mzg6MjMrMDE6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDI1LTAxLTMxVDAyOjU5OjIzKzAxOjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDI1LTAxLTMxVDAyOjU5OjIzKzAxOjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo3MzA2ZWI4NC05YThjLTYzNDktOTA2MC1iYzRjZGU3NWExNDYiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo5ZTI3OTc1Ny1kODk4LTc0NGUtOGM3MC0xNjBhZDc5ODg3N2YiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozMGYyYzIwOC0wZGRiLWYzNDktODVjNi01NzQ0ZWUxNDFjZGMiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjMwZjJjMjA4LTBkZGItZjM0OS04NWM2LTU3NDRlZTE0MWNkYyIgc3RFdnQ6d2hlbj0iMjAyNS0wMS0zMVQwMjozODoyMyswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDoyOWRmOWVkNC0wOTM3LTExNGItOGIxNS04MTI5ZTFhNTJlOTUiIHN0RXZ0OndoZW49IjIwMjUtMDEtMzFUMDI6NTk6MjMrMDE6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE4IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NzMwNmViODQtOWE4Yy02MzQ5LTkwNjAtYmM0Y2RlNzVhMTQ2IiBzdEV2dDp3aGVuPSIyMDI1LTAxLTMxVDAyOjU5OjIzKzAxOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOCAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+2wWMfwAAANBJREFUOI3N0rFKQlEcx/GPdp0azLcQwjnI6S6SEDQ4SlMv4Bv4AC01i9Hi5gM0ShDugUP0CIHi7jUH7yCX07nl1A/O8uf/+57f73Aq2aAJXbSR+FlfeMLqcJjk5ilekEUAV7hGWgRc5OZexAznGBWHVVSwKTHDApchQFF39j2/IyfDKxqhR7vHEG+RNFWMcRsC1DHDewQAnzgLVfiT/gdgjSZaxwKescTkGECSm9OyxViCorY4+eXl29A/mNvX+oiYa+jgIQS4QR+nJQkeMdsBGJMnlGUPSdMAAAAASUVORK5CYII=";
const CssCopyBtnSelI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABN2lDQ1BBZG9iZSBSR0IgKDE5OTgpAAAokZWPv0rDUBSHvxtFxaFWCOLgcCdRUGzVwYxJW4ogWKtDkq1JQ5ViEm6uf/oQjm4dXNx9AidHwUHxCXwDxamDQ4QMBYvf9J3fORzOAaNi152GUYbzWKt205Gu58vZF2aYAoBOmKV2q3UAECdxxBjf7wiA10277jTG+38yH6ZKAyNguxtlIYgK0L/SqQYxBMygn2oQD4CpTto1EE9AqZf7G1AKcv8ASsr1fBBfgNlzPR+MOcAMcl8BTB1da4Bakg7UWe9Uy6plWdLuJkEkjweZjs4zuR+HiUoT1dFRF8jvA2AxH2w3HblWtay99X/+PRHX82Vun0cIQCw9F1lBeKEuf1UYO5PrYsdwGQ7vYXpUZLs3cLcBC7dFtlqF8hY8Dn8AwMZP/fNTP8gAAAAJcEhZcwAAAHYAAAB2AU57JggAAAXIaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzE0MiA3OS4xNjA5MjQsIDIwMTcvMDcvMTMtMDE6MDY6MzkgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE4IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjUtMDEtMzFUMTY6NTk6NTYrMDE6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDI1LTAxLTMxVDE3OjAxKzAxOjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDI1LTAxLTMxVDE3OjAxKzAxOjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo5ZTA2NTkzOC1kMGQ5LTYzNGItYmJkZi05NmJhNjEyYmVjYTMiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDoyYWQ3YTQ3My01YzMxLTUzNDUtOGQ5Yy0yMDY3YTA5MzUwMTAiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo2NjA4MWVhZi00ZGRlLTVkNGMtYTJlMS1hMGMzNjE3ZTRjMTUiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjY2MDgxZWFmLTRkZGUtNWQ0Yy1hMmUxLWEwYzM2MTdlNGMxNSIgc3RFdnQ6d2hlbj0iMjAyNS0wMS0zMVQxNjo1OTo1NiswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo5ZTA2NTkzOC1kMGQ5LTYzNGItYmJkZi05NmJhNjEyYmVjYTMiIHN0RXZ0OndoZW49IjIwMjUtMDEtMzFUMTc6MDErMDE6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE4IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5ZWUbgAAAA8klEQVQ4jaXSMU7DQBCF4c8RHUSiTUeZKiU0PkAKoOAE9DSRfQCcA6Sk4xQQCehpIF1OQJcWgVJGpvAgGStEVvykkWa1u/+82dlkMxlmKND3vz5xgdfmRi8uj5DsiGM8Id0G6ONjR/VfHW2D9FpchJca5LG+cdASMK7l5T4O6pp2BRRdAX/UBKR4i0gxwELV9yLWGb4isuYjznBby++xVv2F6wDkuFSN/qrp4BTPEWeY4zAc3GAV4Acst7XwrhrZONoY4C4crHEe50bhIm8CctWYppGvonIZTuZxbhkuZslmMiyjwl7q4RsnXQBFWCpr0Vo/DOk0THcKK1IAAAAASUVORK5CYII=";
const CssCopyBtnI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABN2lDQ1BBZG9iZSBSR0IgKDE5OTgpAAAokZWPv0rDUBSHvxtFxaFWCOLgcCdRUGzVwYxJW4ogWKtDkq1JQ5ViEm6uf/oQjm4dXNx9AidHwUHxCXwDxamDQ4QMBYvf9J3fORzOAaNi152GUYbzWKt205Gu58vZF2aYAoBOmKV2q3UAECdxxBjf7wiA10277jTG+38yH6ZKAyNguxtlIYgK0L/SqQYxBMygn2oQD4CpTto1EE9AqZf7G1AKcv8ASsr1fBBfgNlzPR+MOcAMcl8BTB1da4Bakg7UWe9Uy6plWdLuJkEkjweZjs4zuR+HiUoT1dFRF8jvA2AxH2w3HblWtay99X/+PRHX82Vun0cIQCw9F1lBeKEuf1UYO5PrYsdwGQ7vYXpUZLs3cLcBC7dFtlqF8hY8Dn8AwMZP/fNTP8gAAAAJcEhZcwAAAHYAAAB2AU57JggAAAZvaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzE0MiA3OS4xNjA5MjQsIDIwMTcvMDcvMTMtMDE6MDY6MzkgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE4IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjUtMDEtMzFUMTY6NTk6NTYrMDE6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDI1LTAxLTMxVDE3OjAyOjI0KzAxOjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDI1LTAxLTMxVDE3OjAyOjI0KzAxOjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowMGZiMWU2ZC1kMjgyLTJlNGItOWJkYi0zOWI1YjdiMzk4ODEiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo3MWM0ZTBmNy0xOTk3LTVmNDUtOGZjOS1hZDA4OTY2N2IyYzgiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo4MmQwZjExMy01NGYxLTI4NDItYjNhMy1lMTZlNTM0OWRkNmYiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT5hZG9iZTpkb2NpZDpwaG90b3Nob3A6YmM2N2M1MDEtMjlhOC0wMDQ3LWIyM2MtODI4OTQ0MDFlYWVhPC9yZGY6bGk+IDwvcmRmOkJhZz4gPC9waG90b3Nob3A6RG9jdW1lbnRBbmNlc3RvcnM+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ODJkMGYxMTMtNTRmMS0yODQyLWIzYTMtZTE2ZTUzNDlkZDZmIiBzdEV2dDp3aGVuPSIyMDI1LTAxLTMxVDE2OjU5OjU2KzAxOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOCAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjAwZmIxZTZkLWQyODItMmU0Yi05YmRiLTM5YjViN2IzOTg4MSIgc3RFdnQ6d2hlbj0iMjAyNS0wMS0zMVQxNzowMjoyNCswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjXwy5UAAADzSURBVDiNpdIxTsNAEIXhzxYdRKJNxwlSQuMDpAAKTkBPlxwA5wAp6bhDJBLJUKSjgXQ5AV1aBEptCg+SsUJkxU8aaVa7+8+bnU2WxWyEHD3/6xNXeG1upHF5gGRPnKJAtgvQw8ee6r862QVJW1yElxpkXt84agkY1vLyEAd1TboC8q6AP2oCMrxFZOhjpep7FesRviJGzUec4r6WP2Kr+gu3ARjjWjX6m6aDczxHXGCB43Bwh02An7De1cK7amTDaKOPh3CwxWWcG4SLcRMwVo1pEvkmKpfhZBHn1uFimiyLWRkVDlKKb5x1AeRhqaxFa/0Atks1aHio/ngAAAAASUVORK5CYII=";
const config = loadConfig();
const blockedUsers = JSON.parse(GM_getValue("blockedUsers", '["ID1", "ID2"]'));
const allowedPaths = ['/ranobe', '/animes', '/mangas'];
function аnimPage() {
return window.location.href.includes("/animes");
}
const menuLabels = {
CommCopyBtn: "Copy comment link button",
UserIdCopyBtn: "Copy user ID button",
UserCssCopyBtn: "Copy user CSS button",
ClubCssCopyBtn: "Copy club CSS button",
ImageIdCopyBtn: "Copy image code button",
ShikiRating: "Shikimori rating filter",
StudioFilter: "Studios filter",
addChineseFilter:"Chinese filter",
FriendsAVGscore: "Friends' average score",
autoSpoiler: "Auto spoiler",
HistoryHelper: "History helper",
NotificationHelper:"Notification helper",
hideNews: "Hides news",
NoAgeLimits: "Custom age",
checkScroll: "Auto Loader",
BanCount:"Ban count",
watchTime:"Watch time",
};
for (const key in config) {
GM_registerMenuCommand(
`${menuLabels[key] || key}: ${config[key] ? "✅ ON" : "❌ OFF"}`,
() => {
saveConfig(key, !config[key]);
location.reload();
}
);
}
function saveConfig(key, value) {
GM_setValue(key, value);
}
function loadConfig() {
return {
CommCopyBtn: GM_getValue("CommCopyBtn", true),
UserIdCopyBtn: GM_getValue("UserIdCopyBtn", true),
UserCssCopyBtn: GM_getValue("UserCssCopyBtn", true),
ClubCssCopyBtn: GM_getValue("ClubCssCopyBtn", true),
ImageIdCopyBtn: GM_getValue("ImageIdCopyBtn", true),
StudioFilter: GM_getValue("StudioFilter", true),
ShikiRating: GM_getValue("ShikiRating", true),
addChineseFilter: GM_getValue("addChineseFilter", true),
FriendsAVGscore: GM_getValue("FriendsAVGscore", true),
autoSpoiler: GM_getValue("autoSpoiler", false),
HistoryHelper: GM_getValue("HistoryHelper", true),
NotificationHelper: GM_getValue("NotificationHelper", true),
hideNews: GM_getValue("hideNews", true),
NoAgeLimits: GM_getValue("NoAgeLimits", true),
checkScroll: GM_getValue("checkScroll", true),
BanCount: GM_getValue("BanCount", true),
watchTime: GM_getValue("watchTime", true),
};
}
function editBlockedUsers() {
let currentUsers = GM_getValue("blockedUsers", '["ID1", "ID2"]');
try {
currentUsers = JSON.parse(currentUsers);
if (!Array.isArray(currentUsers)) throw new Error();
} catch (e) {
currentUsers = ["ID1", "ID2"];
}
const newUsers = prompt("ID через запятую:",
currentUsers.join(", ")
);
if (newUsers !== null) {
const userArray = newUsers
.split(",")
.map((id) => id.trim())
.filter((id) => id !== "");
GM_setValue("blockedUsers", JSON.stringify(userArray));
location.reload();
}
}
GM_registerMenuCommand("blocked users list", editBlockedUsers);
function hideNews(blockedUserIds) {
document
.querySelectorAll("article.b-news_wall-topic")
.forEach((article) => {
const userId = article.getAttribute("data-user_id");
if (blockedUserIds.includes(userId)) {
article.style.display = "none";
}
});
}
function NoAgeLimits() {
const birthSelect = document.querySelector(".c-column.block_m .block select#user_birth_on_1i");
if (!birthSelect) return;
const selectedYear = birthSelect.value;
let maxYear = 0;
let minYear = Infinity;
birthSelect.querySelectorAll("option").forEach((option) => {
const year = parseInt(option.value, 10);
if (!isNaN(year)) {
if (year > maxYear) maxYear = year;
if (year < minYear) minYear = year;
}
});
birthSelect.innerHTML = "";
for (let year = maxYear; year >= 1; year--) {
const option = document.createElement("option");
option.value = year;
option.textContent = year;
if (year == selectedYear) {
option.selected = true;
}
birthSelect.appendChild(option);
}
}
async function FriendsAVGscore() {
document.querySelectorAll(".b-animes-menu .block").forEach((block) => {
let subheadline = block.querySelector(".subheadline.m5");
if (!subheadline || !subheadline.textContent.includes("У друзей")) return;
if (subheadline.textContent.includes("|")) return;
let scores = [];
block.querySelectorAll(".friend-rate .status").forEach((status) => {
let match = status.textContent.match(/–\s*(\d+)/);
if (match) {
let score = parseInt(match[1], 10);
scores.push(score);
}
});
if (scores.length > 0) {
// console.log(scores);
let averageScore = (
scores.reduce((a, b) => a + b, 0) / scores.length
).toFixed(1);
subheadline.textContent += ` | ${averageScore}`;
}
});
}
function BanCount() {
if (!window.location.pathname.endsWith('/moderation')) {
return;
}
let banCount = document.querySelectorAll('.b-ban').length;
let headline = document.querySelector('.subheadline.m5');
if (headline) {
headline.textContent = `История банов - ${banCount}`;
}
}
//CopyBtns//CopyBtns//CopyBtns//CopyBtns//CopyBtns//CopyBtns//CopyBtns//CopyBtns//CopyBtns//CopyBtns//CopyBtns//CopyBtns//CopyBtns//CopyBtns//CopyBtns//CopyBtns//CopyBtns//CopyBtns//CopyBtns//CopyBtns
function CommCopyBtn() {
document.querySelectorAll(".b-comment").forEach((comment) => {
if (comment.querySelector(".copy-comment-link")) return;
let commentId = comment.id;
if (!commentId) return;
let commentLink = `https://shikimori.one/comments/${commentId}`;
let button = document.createElement("span");
button.classList.add("copy-comment-link");
button.title = "Скопировать ссылку";
button.style.backgroundImage = `url(${CopyBtnI})`;
button.style.backgroundRepeat = "no-repeat";
button.style.backgroundSize = "contain";
button.style.width = "12px";
button.style.height = "12px";
button.style.cursor = "pointer";
button.style.display = "inline-block";
button.style.margin = "0 5px";
button.style.verticalAlign = "middle";
button.onmouseover = () =>
(button.style.backgroundImage = `url(${CopyBtnSelI})`);
button.onmouseout = () =>
(button.style.backgroundImage = `url(${CopyBtnI})`);
button.onclick = () => {
navigator.clipboard
.writeText(commentLink)
.then(() => {
button.style.transform = "scale(1.1)";
setTimeout(() => (button.style.transform = "scale(1)"), 200);
})
.catch((err) => console.error(err));
};
let mainControls = comment.querySelector(".main-controls");
if (mainControls) {
mainControls.appendChild(button);
}
});
}
function UserIdCopyBtn() {
document.querySelectorAll(".avatar").forEach((avatar) => {
if (avatar.querySelector(".copy-profile-id")) return;
let profileHead = avatar.closest(".profile-head");
if (!profileHead) return;
let userId = profileHead.dataset.userId;
if (!userId) return;
let profileActions = avatar.querySelector(".profile-actions");
if (!profileActions) return;
let button = document.createElement("a");
button.classList.add("copy-profile-id", "b-tooltipped");
button.title = "Скопировать ID";
button.dataset.direction = "top";
button.style.backgroundImage = `url(${CopyBtnI})`;
button.style.backgroundRepeat = "no-repeat";
button.style.backgroundSize = "contain";
button.style.width = "16px";
button.style.height = "16px";
button.style.cursor = "pointer";
button.style.display = "flex";
button.style.alignItems = "center";
button.style.justifyContent = "center";
button.style.margin = "10px";
button.style.textAlign = "center";
button.style.zIndex = "9999";
button.onmouseover = () =>
(button.style.backgroundImage = `url(${CopyBtnSelI})`);
button.onmouseout = () =>
(button.style.backgroundImage = `url(${CopyBtnI})`);
button.onclick = () => {
navigator.clipboard
.writeText(userId)
.then(() => {
button.style.transform = "scale(1.1)";
setTimeout(() => (button.style.transform = "scale(1)"), 200);
})
.catch((err) => console.error(err));
};
let newDiv = document.createElement("div");
newDiv.classList.add("profile-actions");
newDiv.style.textAlign = "center";
newDiv.appendChild(button);
profileActions.parentNode.insertBefore(newDiv, profileActions.nextSibling);
});
}
function ImageIdCopyBtn() {
document.querySelectorAll(".b-image").forEach((imageWrapper) => {
if (imageWrapper.querySelector(".copy-image-id-button")) return;
let imageData = imageWrapper.getAttribute("data-attrs");
if (!imageData) return;
try {
let imageId = JSON.parse(imageData).id;
if (!imageId) return;
let button = document.createElement("span");
button.classList.add("copy-image-id-button");
button.title = "Скопировать код изображения";
button.style.backgroundImage = `url(${CopyBtnI})`;
button.style.backgroundRepeat = "no-repeat";
button.style.backgroundSize = "contain";
button.style.width = "16px";
button.style.height = "16px";
button.style.cursor = "pointer";
button.style.position = "absolute";
button.style.top = "5px";
button.style.right = "5px";
button.style.zIndex = "10";
button.onmouseover = () =>
(button.style.backgroundImage = `url(${CopyBtnSelI})`);
button.onmouseout = () =>
(button.style.backgroundImage = `url(${CopyBtnI})`);
button.onclick = (event) => {
event.stopPropagation();
event.preventDefault();
let formattedText = `[image=${imageId}]`;
navigator.clipboard
.writeText(formattedText)
.then(() => {
button.style.transform = "scale(1.1)";
setTimeout(() => (button.style.transform = "scale(1)"), 200);
})
.catch((err) => console.error(err));
};
imageWrapper.style.position = "relative";
imageWrapper.appendChild(button);
} catch (e) {
console.error(e);
}
});
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//CssCopyBtn//CssCopyBtn//CssCopyBtn//CssCopyBtn//CssCopyBtn//CssCopyBtn//CssCopyBtn//CssCopyBtn//CssCopyBtn//CssCopyBtn//CssCopyBtn//CssCopyBtn//CssCopyBtn//CssCopyBtn//CssCopyBtn//CssCopyBtn//CssCopyBtn
async function UserCssCopyBtn() {
document.querySelectorAll(".avatar").forEach((avatar) => {
if (avatar.querySelector(".copy-profile-css")) return;
let profileActions = avatar.querySelector(".profile-actions");
if (!profileActions) return;
let img = avatar.querySelector("img");
if (!img || !img.src) return;
let match = img.src.match(/\/(\d+)\.png/);
if (!match) return;
let userId = match[1];
let button = document.createElement("a");
button.classList.add("copy-profile-css", "b-tooltipped");
button.title = "Скопировать CSS";
button.dataset.direction = "top";
button.style.backgroundImage = `url(${CssCopyBtnI})`;
button.style.backgroundRepeat = "no-repeat";
button.style.backgroundSize = "contain";
button.style.width = "16px";
button.style.height = "16px";
button.style.cursor = "pointer";
button.style.display = "flex";
button.style.alignItems = "center";
button.style.justifyContent = "center";
button.style.margin = "10px";
button.style.textAlign = "center";
button.style.zIndex = "9999";
button.onmouseover = () =>
(button.style.backgroundImage = `url(${CssCopyBtnSelI})`);
button.onmouseout = () =>
(button.style.backgroundImage = `url(${CssCopyBtnI})`);
button.onclick = async () => {
try {
const userResponse = await fetch(`https://shikimori.one/api/users/${userId}`);
const userData = await userResponse.json();
const styleId = userData.style_id;
if (!styleId) throw new Error("no styleId");
const styleResponse = await fetch(`https://shikimori.one/api/styles/${styleId}`);
const styleData = await styleResponse.json();
await navigator.clipboard.writeText(styleData.compiled_css);
button.style.transform = "scale(1.1)";
setTimeout(() => (button.style.transform = "scale(1)"), 200);
} catch (err) {
console.error(err);
}
};
let idCopyButton = avatar.querySelector(".copy-profile-id");
if (idCopyButton) {
idCopyButton.parentNode.style.display = "flex";
idCopyButton.parentNode.style.alignItems = "center";
idCopyButton.parentNode.appendChild(button);
} else {
let newDiv = document.createElement("div");
newDiv.classList.add("profile-actions");
newDiv.style.textAlign = "center";
newDiv.style.display = "flex";
newDiv.style.alignItems = "center";
newDiv.appendChild(button);
profileActions.parentNode.insertBefore(
newDiv,
profileActions.nextSibling
);
}
});
}
async function ClubCssCopyBtn() {
document.querySelectorAll(".b-clubs-menu").forEach((menu) => {
let button = document.createElement("a");
button.classList.add("copy-club-css", "b-tooltipped");
button.title = "Скопировать CSS клуба";
button.dataset.direction = "top";
button.style.backgroundImage = `url(${CssCopyBtnI})`;
button.style.backgroundRepeat = "no-repeat";
button.style.backgroundSize = "contain";
button.style.width = "16px";
button.style.height = "16px";
button.style.cursor = "pointer";
button.style.display = "inline-block";
button.style.textAlign = "center";
button.style.position = "absolute";
button.style.top = "-30px";
button.style.left = "50%";
button.style.transform = "translateX(-50%)";
button.style.zIndex = "9999";
button.onmouseover = () =>
(button.style.backgroundImage = `url(${CssCopyBtnSelI})`);
button.onmouseout = () =>
(button.style.backgroundImage = `url(${CssCopyBtnI})`);
menu.prepend(button);
menu.querySelectorAll(".b-menu_logo").forEach((logo) => {
if (logo.querySelector(".copy-club-css")) {
return;
}
let img = logo.querySelector("img");
if (!img || !img.src) {
return;
}
let match = img.src.match(/\/(\d+)\.(png|jpg)/);
if (!match) {
return;
}
let clubId = match[1];
button.onclick = async () => {
try {
const clubResponse = await fetch(`https://shikimori.one/api/clubs/${clubId}`);
if (!clubResponse.ok) throw new Error(clubResponse.status);
const clubData = await clubResponse.json();
const styleId = clubData.style_id;
if (!styleId) throw new Error("no styleId");
const styleResponse = await fetch(`https://shikimori.one/api/styles/${styleId}`);
if (!styleResponse.ok) throw new Error(styleResponse.status);
const styleData = await styleResponse.json();
if (!styleData.compiled_css) throw new Error("no styleData.compiled_css");
await navigator.clipboard.writeText(styleData.compiled_css);
button.style.transform = "scale(1.1)";
setTimeout(() => (button.style.transform = "scale(1)"), 200);
} catch (err) {
console.error(err);
}
};
});
});
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//helpers////helpers////helpers////helpers////helpers////helpers////helpers////helpers////helpers////helpers////helpers////helpers////helpers////helpers////helpers////helpers////helpers////helpers//
function helperBuilder({ itemSelector, checkboxClass, deleteButtonSelector, deleteMethod, deleteUrlAttr, buttonId, buttonText, buttonStyle, showOnHover, checkboxContainerSelector }) {
if (!document.querySelector(deleteButtonSelector)) return;
let button = null;
let lastChecked = null;
let isThrottled = false;
document.querySelectorAll(itemSelector).forEach((item) => {
if (item.querySelector(`.${checkboxClass}`)) return;
const checkboxContainer = checkboxContainerSelector ? item.querySelector(checkboxContainerSelector) : item;
if (!checkboxContainer) return;
const checkbox = document.createElement("input");
checkbox.type = "checkbox";
checkbox.className = checkboxClass;
checkbox.style.marginLeft = "8px";
if (showOnHover) {
checkbox.style.display = "none";
item.addEventListener("mouseenter", () => {
checkbox.style.display = "inline-block";
});
item.addEventListener("mouseleave", () => {
if (!checkbox.checked) {
checkbox.style.display = "none";
}
});
}
checkbox.addEventListener("click", (event) => {
shiftSelect(event, checkbox, checkboxClass, itemSelector);
updateHighlight(checkbox, itemSelector);
});
checkboxContainer.prepend(checkbox);
});
function shiftSelect(event, checkbox, checkboxClass, itemSelector) {
if (event.shiftKey && lastChecked) {
const checkboxes = [...document.querySelectorAll(`.${checkboxClass}`)];
const start = checkboxes.indexOf(lastChecked);
const end = checkboxes.indexOf(checkbox);
checkboxes.slice(Math.min(start, end), Math.max(start, end) + 1).forEach(cb => {
cb.checked = lastChecked.checked;
updateHighlight(cb, itemSelector);
});
}
lastChecked = checkbox;
updateDeleteButton(checkboxClass, itemSelector);
}
function updateHighlight(checkbox, itemSelector) {
const item = checkbox.closest(itemSelector);
item.style.backgroundColor = checkbox.checked ? "#D0E8FF" : "";
}
function updateDeleteButton(checkboxClass, itemSelector) {
const selectedItems = document.querySelectorAll(`.${checkboxClass}:checked`);
if (selectedItems.length > 0) {
if (!button) {
button = document.createElement("button");
button.id = buttonId;
button.textContent = buttonText;
Object.assign(button.style, buttonStyle);
button.addEventListener("click", () => deleteSelected(checkboxClass, itemSelector, deleteButtonSelector, deleteMethod, deleteUrlAttr));
document.body.appendChild(button);
}
} else {
if (button) {
button.remove();
button = null;
}
}
}
async function deleteSelected(checkboxClass, itemSelector, deleteButtonSelector, deleteMethod, deleteUrlAttr) {
if (isThrottled) return;
const tokenElement = document.querySelector('meta[name="csrf-token"]');
const csrfToken = tokenElement ? tokenElement.content : null;
if (!csrfToken) return;
let selectedItems = document.querySelectorAll(`.${checkboxClass}:checked`);
for (const checkbox of selectedItems) {
const item = checkbox.closest(itemSelector);
const deleteButton = item.querySelector(deleteButtonSelector);
if (deleteButton) {
item.style.backgroundColor = "#FFB3B3";
item.style.transition = "background-color 0.3s ease";
const deleteUrl = deleteButton.getAttribute(deleteUrlAttr);
if (deleteUrl) {
try {
const response = await fetch(deleteUrl, {
method: deleteMethod,
credentials: "include",
headers: {
"User-Agent": navigator.userAgent,
"X-CSRF-Token": csrfToken,
"Content-Type": "application/x-www-form-urlencoded"
},
body: new URLSearchParams({
_method: "delete",
authenticity_token: csrfToken
})
});
if (response.ok) {
await new Promise(resolve => setTimeout(resolve, 300));
item.remove();
} else if (response.status === 429) {
console.warn("status 429: таймаут 10с");
item.style.backgroundColor = "#FFFF99";
isThrottled = true;
setTimeout(() => {
isThrottled = false;
deleteSelected(checkboxClass, itemSelector, deleteButtonSelector, deleteMethod, deleteUrlAttr);
}, 10000);
return;
}
} catch (error) {
// console.error("err del", item.id, error);
}
}
}
selectedItems = document.querySelectorAll(`.${checkboxClass}:checked`);
}
if (button) {
button.remove();
button = null;
}
}
}
function NotificationHelper() {
helperBuilder({
itemSelector: ".b-message, .b-dialog",
checkboxClass: "notification-checkbox",
deleteButtonSelector: ".item-delete-confirm",
deleteMethod: "DELETE",
deleteUrlAttr: "action",
buttonId: "delete-selected-notifications",
buttonText: "Удалить выбранные",
buttonStyle: {
position: "fixed",
bottom: "20px",
right: "20px",
padding: "10px",
background: "red",
color: "white",
border: "none",
cursor: "pointer",
zIndex: "1000"
},
showOnHover: true,
checkboxContainerSelector: "aside.buttons div.main-controls"
});
}
function HistoryHelper() {
helperBuilder({
itemSelector: ".b-user_history-line",
checkboxClass: "history-checkbox",
deleteButtonSelector: ".destroy",
deleteMethod: "POST",
deleteUrlAttr: "href",
buttonId: "del-selected",
buttonText: "Удалить выбранные",
buttonStyle: {
position: "fixed",
bottom: "20px",
right: "20px",
padding: "10px",
background: "red",
color: "white",
border: "none",
cursor: "pointer",
zIndex: "1000"
},
showOnHover: false,
checkboxContainerSelector: null
});
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Filters////Filters////Filters////Filters////Filters////Filters////Filters////Filters////Filters////Filters////Filters////Filters////Filters////Filters////Filters////Filters////Filters////Filters//
async function StudioFilter() {
if (!аnimPage()) {
return;
}
const hiddenBlocks = document.querySelectorAll(".block.hidden");
let filterBlock = null;
hiddenBlocks.forEach((block) => {
if (block.querySelector(".subheadline.m5")?.textContent.includes("Студия")) {
filterBlock = block;
}
});
if (!filterBlock) {
return;
}
let studioList = filterBlock.querySelector(".b-block_list.studios.anime-params");
if (!studioList) {
studioList = document.createElement("ul");
studioList.className = "b-block_list studios anime-params";
filterBlock.appendChild(studioList);
}
try {
const response = await fetch("https://shikimori.one/api/studios", {
headers: {
"User-Agent": "Mozilla/5.0",
},
});
if (!response.ok) {
throw new Error(response.status);
}
const studios = await response.json();
const realStudios = studios.filter((studio) => studio.real);
// spoiler
const spoilerContainer = document.createElement("div");
spoilerContainer.className = "b-spoiler";
const spoilerLabel = document.createElement("label");
spoilerLabel.textContent = "Показать список";
spoilerLabel.style.cursor = "pointer";
const spoilerContent = document.createElement("div");
spoilerContent.className = "content only-show";
spoilerContent.style.display = "none";
const spoilerInner = document.createElement("div");
spoilerInner.className = "inner";
spoilerInner.appendChild(studioList);
spoilerContent.appendChild(spoilerInner);
spoilerContainer.appendChild(spoilerLabel);
spoilerContainer.appendChild(spoilerContent);
filterBlock.appendChild(spoilerContainer);
// ev
spoilerLabel.addEventListener("click", () => {
spoilerLabel.style.display = "none";
spoilerContent.style.display = "block";
spoilerContainer.dispatchEvent(new Event("spoiler:open"));
});
realStudios.forEach((studio) => {
const studioItem = document.createElement("li");
studioItem.dataset.field = "studio";
studioItem.dataset.value = `${studio.id}-${studio.filtered_name}`;
const checkbox = document.createElement("input");
checkbox.type = "checkbox";
studioItem.appendChild(checkbox);
studioItem.appendChild(document.createTextNode(` ${studio.name}`));
studioList.appendChild(studioItem);
});
filterBlock.classList.remove("hidden");
} catch (error) {
console.error(error);
}
}
//Chinese FILTER////Chinese FILTER////Chinese FILTER////Chinese FILTER////Chinese FILTER////Chinese FILTER////Chinese FILTER////Chinese FILTER////Chinese FILTER////Chinese FILTER////Chinese FILTER////Chinese FILTER////Chinese FILTER////Chinese FILTER////Chinese FILTER////Chinese FILTER////Chinese FILTER////Chinese FILTER////Chinese FILTER////Chinese FILTER////Chinese FILTER//
const ChineseAnimeId = [44074,40434,50399,49413,49701,44070,56752,37208,38450,51039,40730,45556,56523,50407,37822,56524,40211,49571,55809,44412,57067,52684,40784,37078,55655,54029,40435,49574,51335,59150,59306,40080,58689,51836,44218,42640,49587,41611,59077,41923,37150,37932,58509,58143,38409,50207,58930,33926,38436,57183,54846,37936,49570,47405,59939,50403,44196,53859,55993,49200,38990,55745,60541,44068,41221,54035,55151,51769,41219,37924,59001,56960,54285,50667,57663,51390,39959,39178,42266,33443,51038,56215,48791,50537,36561,50401,37176,54123,40111,59245,38917,55733,51898,57442,33446,42956,42238,53367,40735,58448,55684,58555,54444,55692,57097,58744,57264,49759,59389,45558,33350,44388,41918,57995,51289,44067,44406,38491,49742,38410,38435,41409,59953,55303,33209,50274,50444,48965,49386,45599,36522,42290,50114,56471,35015,50240,10259,51203,55740,38740,53450,38250,36184,49409,56717,60420,55821,58079,54974,36160,49573,39676,39024,49847,58797,36823,54014,59385,40734,36910,54875,54437,53905,49275,44212,44069,40991,38741,35333,42106,56764,48890,59916,36545,50629,41528,42284,51287,50404,45196,44221,39675,42985,52949,38528,49599,38533,36824,44061,44090,59398,37618,40005,41094,40732,35626,58523,52890,42206,31678,37175,48537,41224,48941,53449,37164,959,33758,37937,48962,44064,52178,47614,49569,56963,42187,51280,36491,52765,57469,50429,38467,50462,44065,960,51333,48684,44408,41884,57422,39912,51334,52522,49448,27825,5854,10629,50581,40909,56766,49559,48000,33605,59012,34300,52769,55790,59178,50544,51195,38220,51861,31499,41785,42898,33969,50925,53477,37292,56216,50433,60089,48845,37396,57594,44389,40966,58551,44411,58711,40100,48956,58476,49572,38918,41051,42455,56774,36775,55130,50647,40733,15905,42950,41916,51288,44071,36848,42454,42267,49305,32094,52771,56716,57371,56765,42176,37886,35044,51191,50105,41215,48867,49750,48369,48964,56787,47044,56439,37184,39419,38489,41511,57699,32230,40885,40062,34009,41220,37185,49398,49915,38742,42359,40969,50400,51791,39080,36732,40806,41210,39191,50432,45042,41223,57613,53448,51727,49274,42209,57351,50501,40979,11835,44513,52105,48374,48481,54881,55072,52680,57512,49098,56981,33019,50271,49873,38490,44097,59179,42949,38536,44410,59433,54772,36148,55186,58681,51941,39936,29936,50538,6902,33421,54945,31838,37207,50898,29089,32323,50230,51196,51645,40994,55864,55762,55693,59327,39188,45654,54124,58779,58057,36318,51385,51549,55694,49718,57865,2578,48759,43626,47612,37293,51291,49380,50421,57520,31427,40151,50446,51517,36661,57656,44047,37209,48480,40208,37294,50280,39116,52623,39141,55731,44570,42966,56695,32534,51207,32543,55829,53919,59182,33305,50378,48875,51726,36790,48914,57575,48694,56930,50521,37928,50633,57096,41913,50217,58055,55009,51457,39767,37894,50443,41917,11841,56958,42302,50575,48097,54737,38325,41503,51197,58056,57513,55014,6855,36791,36588,50411,51860,19781,37895,55578,51915,47795,13755,35204,60247,40233,50441,42794,39823,44390,41915,37887,49841,36993,40823,53852,58012,42151,57877,29087,44062,16756,48942,37737,42947,40638,54997,54018,38556,52101,50445,36290,30412,50588,54631,55015,44078,29935,49620,35757,42268,51198,9950,37563,41093,51383,55192,39720,37938,50439,33396,49432,53476,50657,39231,40835,39760,53473,33704,41286,39572,19687,36291,51735,37564,36455,42291,42149,31233,49757,9952,34525,50571,8783,48543,44213,50398,36185,8999,36571,37598,37179,42319,57996,315,33739,36423,53618,40876,50431,28673,9818,56579,44072,49952,45557,33925,37740,55732,41802,51490,38412,51131,9558,5496,37152,54973,54021,7477,35215,39421,52221,32751,37641,44233,37090,42285,41080,29910,34903,56342,33195,31150,36345,33759,55739,35650,39223,33531,39736,51746,33271,56207,36397,37044,51864,54261,39298,50202,50406,36544,51000,51520,9817,9806,33193,37661,45600,51863,37643,57759,5129,33278,33038,42784,50644,55355,38535,50539,40568,29603,9416,49208,33760,49170,30156,44073,38690,50810,40194,47403,7752,32936,45195,51397,36644,42132,36425,54646,42148,39678,27811,50430,42158,51681,33562,55093,33339,50565,36429,46821,9417,10149,39022,33764,37620,34675,51183,38379,50849,38688,51492,37300,37619,38413,35643,33702,41920,36762,42082,38677,36226,33357,9947,25149,29937,32890,42444,34410,51190,54648,30096,33194,9822,36427,37642,34129,33757,33309,37291,51623,44627,32809,33266,37896,24603,34669,41632,34602,50636,30166,37181,37888,42740,23915,38341,38285,37180,44075,37177,41078,6861,38689,9951,38378,50604,30058,38534,30097,35642,30098,46924,49652,39264,34940,31965,52650,31299,42443,36666,37058,33755,40117,30519,29876,51825,36996,16506,33279,30886,6156,30095,37392,50021,46639,34511,42641,36722,38347,37391,36245,32818,33775,33761,37736,54534,37186,21129,32820,27503,30099,45607,48979,32807,31348,9869,30247,55362,21081,31698,37390,54340,32819,33258,32808,18489,18491,9973,36440,42178,35921,5889,38346,34510,31972,33985,30463,35623,25173,32889,29623,36164,33771,33883,20713,9521,32933,33508,29857,36932,33801,35432,35379,29961,43660,43260,43663,38919,50603,43391,45838,43494,46902,43797,43272,6150,44530,44529,45835,46567,45837,36015,45845,45839,45843,45844,49796,43450,52182,44417,45718,44413,44427,44424,44421,44422,44426,47759,44416,44423,44415,56820,44419,44414,44425,44418,44420,43913,43216,51558,41415,44370,43844,43893,47507,43954,48910,45459,47231,49143,57930,46145,46252,59876,51392,46217,32796,32797,43838,38484,52625,46934,60289,54895,53676,50920,43676,60248,46426,46949,47512,47980,33196,47547,43573,59246,52698,36619,44100,60561,44560,60207,47465,47466,46078,43796,44597,47559,47952,55656,40621,48117,56927,51821,59434,58490,59915,48009,57878,51405,56560,59354,45441,46307,52772,52841,45612,48899,43892,56040,43496,43231,45442,56339,59225,45443,43238,43866,43595,43273,49065,46659,45440,43284,45548,43662,45539,45538,45532,45535,45080,45540,45549,45551,45534,45884,45537,45552,45536,45541,56335,45547,45696,45983,45698,54268,48078,45697,43360,48084,43345,43249,46356,47899,49970,60821,44014,53856,46711,53226,59998,52714,57455,52838,52840,52597,52634,57454,45416,15111,33772,33773,44178,42948,44642,45040,48121,43497,44615,44634,48043,35138,48873,43283,43948,54684,48260,46963,47468,45712,43511,44700,45276,45285,55541,39189,43673,46706,46504,51261,31892,51262,9956,31893,33753,38246,37228,43405,53030,43889,46283,45371,45378,45379,45376,42070,44350,45861,45381,45374,45380,45784,45787,45788,45786,44301,47960,47480,52705,51936,50300,45707,46213,57449,52869,59762,46663,60855,60766,46665,44371,59063,43872,45830,46662,46676,46673,46677,46674,48022,46667,46666,47554,46661,55530,45364,47951,51877,60137,47949,50957,43374,47947,43594,46040,39190,46277,42461,45271,47948,45998,46391,46940,19839,50842,43805,50194,51834,43455,51880,44518,44520,44521,44522,44523,44525,43370,9948,45866,42952,47292,43222,34248,51879,47485,56771,31701,48844,45921,46380,60418,56773,59927,42456,45297,56373,44288,43217,60249,56585,56586,43901,60233,51881,46225,43582,47471,47472,43898,51356,51357,43401,44368,43999,43984,43997,43985,43988,43986,43987,47475,44000,43989,47470,43992,43998,47474,44001,47473,49079,43996,44004,44003,43994,44005,43983,52257,43990,43995,43982,43991,39192,44002,43993,53066,46409,59351,59353,59352,59557,46041,51938,51939,44096,43403,58068,60517,60143,47982,60374,45729,56795,49078,48101,43533,43400,60171,54224,43380,43970,42463,43857,60794,43606,43800,43670,57928,43239,43646,43373,37225,43378,43827,48045,60416,43508,57015,40091,43248,40092,60235,42372,42373,43822,43548,44479,59151,44486,59152,45418,43569,44181,43680,45954,54736,59993,45706,59593,43235,44504,43368,46448,45717,43461,45112,54033,44174,58001,56157,43233,44503,59624,59242,43951,43393,60711,46328,31700,45938,44018,43534,45941,47514,47060,60712,43341,45776,60710,43607,47590,54388,44767,44768,45044,43657,48120,43498,59018,46787,47184,59386,45713,57657,51862,43343,53573,43286,47186,60066,45279,45272,45284,43220,43490,43520,60772,47599,43280,47185,47188,47187,46705,43896,51992,45869,47348,45920,45522,51937,45899,49069,47281,43342,43214,45812,43928,45293,43926,54065,47676,45461,43208,58325,52019,48016,46259,43922,52653,43929,43923,43924,56799,43925,47987,43927,43937,43939,43936,43934,43931,43933,43938,43930,43935,47674,43611,47675,51216,45462,45463,45309,42815,43596,30140,45291,47282,45302,45264,45299,45290,45306,45305,47802,47804,45255,45259,45258,45274,45254,45281,45282,46284,45267,45286,45287,33630,45265,45257,45270,37149,42460,47803,47805,33670,48033,45472,45860,58754,37102,37097,43679,37099,46298,37101,32821,44135,37098,40439,34677,47106,37100,34676,44138,48039,48040,44136,48100,44140,60451,44137,40440,48126,43804,37219,43409,32269,44596,60457,48026,48090,44763,32270,44764,43832,44762,44758,44760,60878,57461,60879,43624,60881,60887,43851,60888,43619,60889,60882,60883,60880,60884,60885,60886,58557,48024,49965,48092,46536,57060,52187,46535,48116,44671,43845,46350,38069,60890,60891,50794,60787,52130,43669,43816,43218,43265,43232,57389,55589,46116,46255,46247,46249,45905,57416,43263,43605,43346,58375,58376,43634,60453,48087,45182,47236,46721,43674,57933,43806,59450,59451,60705,33763,33762,46903,60452,32920,46310,46758,48118,43617,44101,45903,56486,56372,36843,58487,56968,58924,47927,60545,43637,43407,45858,52519,46293,43276,43577,43491,52585,43625,56969,45894,47991,51601,47642,45468,47560,46393,56246,52652,49204,46468,46375,58494,52696,42513,52629,45677,50321,38557,42468,42979,48035,52849,43359,36428,43463,43542,59765,43386,45716,43242,48852,43464,47640,47643,48851,9903,60529,44673,43502,56589,38911,44450,43649,45289,43817,43308,43592,45452,43333,47330,43515,45456,53031,47007,47728,45769,50233,44009,49139,44007,44011,44012,45688,44013,44008,48113,44010,45854,52870,43666,43856,49118,49985,58556,58559,45156,43891,50458,38125,47214,40182,45011,47008,43244,46316,57836,47058,57837,38126,38124,38131,38135,38140,38136,38117,38128,38122,38138,38132,47986,38129,39798,41635,48058,38118,47757,38119,38127,43639,38123,44353,38134,38133,38120,38137,57459,57317,47131,46154,43819,43858,43852,43912,43818,43526,46638,43677,43888,57866,47650,60297,46440,44840,45868,46458,53382,43656,57468,45689,45187,45069,59634,46260,43267,42765,45681,60435,42766,45682,47775,43665,43570,59969,43519,43861,46256,44079,44228,45690,47963,46657,47965,56970,52584,43830,57440,44006,43583,45965,45679,52704,56321,46243,46658,42033,57464,50296,50297,43226,43389,43357,45761,43650,43808,47838,44399,47954,52855,42146,46371,42147,42144,46295,43897,47964,45133,47889,33267,47651,45169,47070,46318,45780,59938,44452,47890,60415,48041,41942,45482,43224,49277,39679,47063,47367,48073,45388,45702,55563,34724,48421,53206,57906,53055,43382,52770,57418,58897,57233,59087,51596,53709,60442,56144,44104,44109,43977,43916,53498,44103,44110,44105,44108,59084,44111,44112,43979,44114,44123,44118,44122,44117,44116,44119,44115,44121,43826,43943,58554,58198,59696,52692,46309,45911,46630,46241,57226,58876,43261,43541,59380,45493,46390,55542,60434,51278,47766,47797,50295,58898,46142,57743,57384,47936,47787,35364,35365,52628,53067,57463,42263,45102,41416,42264,45417,45103,43354,45058,43799,48130,52062,52063,48027,45351,46005,43678,45519,45684,43809,45263,45517,45520,44674,45521,45262,45304,45283,37187,43019,43552,43213,43848,46376,46695,56371,44543,44544,44545,43643,43516,43512,43236,43501,43537,43539,43623,43488,43613,43614,44385,48754,46704,47283,43371,44531,43593,43404,43798,43821,44571,45204,48059,47234,42320,56796,52401,56797,32823,43493,35956,45908,43262,31205,43258,47579,43364,43392,48107,43671,45973,43828,44565,49355,44618,45821,45826,45828,45825,43196,45017,43546,43894,43895,45455,46308,45451,45453,45827,45454,50249,43622,45043,51563,50797,46324,43514,47274,59410,43911,56041,45728,56559,30051,9821,9819,43841,51210,35910,59181,30052,50841,43616,43316,43314,43313,59156,47022,44176,45878,43237,59241,59237,43586,43810,43347,43348,42447,49144,44302,52292,33600,33601,42446,42448,42969,44303,44434,42332,59951,43259,46172,56338,44182,44187,54949,44185,44184,42485,42834,43411,44847,44846,51873,47769,60690,43850,43381,44667,44679,57458,44506,44507,44508,44509,59244,59243,33602,33603,60450,33604,45904,56320,44165,43672,30349,30343,43871,48050,44162,44163,48023,44164,44160,44161,48017,56333,48093,48112,48129,45444,45445,45447,43291,51361,43406,45790,43279,56806,43277,45036,33599,45348,47756,46348,46299,47944,33583,56769,47128,43372,43499,49961,57460,51035,45406,47374,48094,35071,45915,60822,47143,43587,60823,43543,60824,37927,60826,40088,60827,46727,56987,54931,60544,56756,43853,51532,60856,43274,54773,43227,44533,44536,44538,51968,44540,44532,44539,44535,44537,45222,38729,51964,51897,43642,45221,45223,44632,46228,43636,43849,44676,43402,42922,45820,43667,45770,44664,45824,45829,47239,52850,48032,54779,43540,43245,43578,43638,39023,43907,43615,49992,43412,37566,50299,45815,45115,39230,45078,35913,44132,41509,44133,48089,42333,60454,40223,46694,35912,47978,46827,44366,44369,45994,43661,43518,44628,52251,42331,43843,42835,43282,51993,46860,45661,56317,56318,47626,60311,52493,46859,51153,46857,54402,54403,45660,59041,54404,45662,56728,56730,47620,47627,44159,57306,47624,57307,52699,60576,52689,59379,56772,44154,44155,44156,47621,44158,44153,44157,44144,44145,44146,44148,44149,44147,44151,44152,43975,60526,60513,47800,49920,31691,53840,52180,51496,42183,43807,43228,43252,43253,60436,43544,43269,43489,43918,47646,47648,47649,42330,49133,47275,47647,56576,46447,53589,59653,47989,59236,58493,52735,39410,43651,59183,52691,52368,45394,44889,47816,45384,45400,45386,45385,45393,45396,45389,45390,45395,45391,45399,45387,45392,47814,47815,45398,47819,45397,59694,44287,52654,46728,38121,42445,43875,46640,43834,47996,43868,47577,40249,54662,49549,43366,53726,53727,53728,43801,44016,48031,52610,48114,48014,45526,45527,45531,44699,44015,42761,45528,45529,45530,42760,45246,58323,57931,48015,52495,48062,47525,43652,56336,43794,43659,52627,48123,58295,43365,47566,57801,45523,57286,59180,52836,52494,45206,59098,47567,59262,58869,55657,45525,45703,47025,60554,59620,59621,43836,43863,43264,52695,56798,60515,60516,43644,43212,43864,60257,43509,46305,43579,43362,55531,30267,47267,52651,43361,46865,46867,46870,45458,46872,46871,46868,44924,33703,44925,43597,35691,45862,46864,41417,38312,46866,47606,46869,47608,44033,44741,9868,44032,48751,48749,59383,59384,44947,47604,47607,30060,48750,48102,46698,60848,51760,51758,51759,52265,44620,56334,59381,55226,43824,43384,43564,40484,57462,59024,39677,45705,43410,45781,56319,43915,47438,47971,48110,43278,59693,46150,43831,43221,43383,43803,43881,43882,43883,43884,43885,43887,45035,43225,43581,43281,9955,43250,43390,43275,47218,47219,43584,45047,45847,45846,44517,43681,43379,43309,44177,47576,45013,45018,45015,45020,45023,45022,45021,45019,45014,45016,47955,48077,43920,50050,48005,59032,43287,39754,47611,46588,43319,43320,52626,48109,43795,38398,47451,56807,43839,46322,47509,57629,59877,47450,47240,43820,43376,43219,43668,47730,52835,47464,52633,45460,52713,59875,53624,44441,45448,44447,44449,57417,47731,45978,46907,41079,41081,44440,44444,52631,44446,44445,44448,59366,50343,43640,47462,45975,47548,45997,43648,52479,44744,46276,43449,43454,47279,52706,45704,51274,43375,46279,42967,33671,43865,46157,47225,33792,41494,45365,43620,43859,47023,60797,46767,52624,59967,46392,55856,40273,9949,52523,52583,52753,53575,44294,44298,54061,60557,58048,56315,47866,60032,44293,44300,44297,44296,44295,55746,57219,43653,43396,59391,56337,53251,53249,60818,59368,59367,43271,52917,47122,60234,44534,42457,42458,49116,42464,43243,43495,43854,43914,33706,42465,43246,43664,43647,45816,48072,43266,48096,45079,44282,44283,44285,44286,44280,59042,57078,44278,44279,52060,45524,43580,43958,45687,52716,47723,48128,43545,45347,52632,43215,44743,45344,45345,49814,47270,55738,42466,47061,52655,43842,60691,43462,42329,43469,49908,58086,47235,47940,60851,49907,33756,52712,45350,50572,45916,50293,50294,45404,39130,56323,39138,39129,39140,33465,43675,43860,39133,43363,43369,39121,39132,39136,39139,39122,39123,39137,43837,45774,39124,39125,45773,39126,39127,39135,39131,39128,49205,46910,44639,43658,43270,43846,59695,60246,45834,35641,43536,43503,43525,43632,30268,43367,43399,44742,42550,44606,43772,44053,43394,43840,48866,45699,43203,43358,45893,47573,48076,44374,38537,43513,43867,41475,43906,43908,43510,43612,48003,43395,48004,45683,43571,9902,45764,38538,45756,45765,45762,45763,45755,45766,45757,43241,45759,43847,47776,48013,45758,48002,45760,44625,56590,56578,50025,51382,57480,59977,58322,56322,47572,52715,52697,59043,57439,57929,60558,57372,59291,58537,54312,58696,57314,56273,58751,55585,55586,58859,59301,49490,51665,50422,58145,43020,58144,56994,10132,14359,54944,49616,51824,35442,53027,34500,33272,30534,52844,60582,60583,60586,60589,60590,60591,60611,51974,48502,50235,51903,43600,41912,46925,43434,50405,60828,60849,50440,60877,53447,51389,40632,58134,51387,51152,41919,42293,60191,49818,49774,49717,53205,49567,49566,60279,53029,53028,54287,49558,60426,59662,59631,44076,44060,48874,49984,43321,48868,56729,60560,48536,60562,60563,60565,60566,60567,60568,60569,60570,60571,60572,60574,50234,60577,60578,60579];
// айди с клуба https://shikimori.one/clubs/3810
let ChinesefilterActive = false;
function addChineseFilter() {
const categoryContainer = document.querySelector(".b-block_list.kinds.anime-params");
if (!categoryContainer) return;
const filterItem = document.createElement("li");
filterItem.setAttribute("data-field", "custom-filter");
filterItem.innerHTML = `
<input id="filterAnimeCheckbox" autocomplete="off" type="checkbox" ${ChinesefilterActive ? "checked" : ""}>
<label for="filterAnimeCheckbox">Без китайщины</label>
`;
categoryContainer.appendChild(filterItem);
document.getElementById("filterAnimeCheckbox").addEventListener("change", function () {
ChinesefilterActive = this.checked;
applyChineseFilter();
});
if (ChinesefilterActive) applyChineseFilter();
}
function applyChineseFilter() {
document.querySelectorAll("article.c-anime").forEach((article) => {
const animeId = parseInt(article.id, 10);
if (ChinesefilterActive && ChineseAnimeId.includes(animeId)) {
// console.log(`Китайщина - ${animeId}`);
article.remove();
}
});
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function ShikiRating() {
const filtersContainer = document.querySelector(".b-block_list.orders.anime-params.subcontent");
if (!filtersContainer) return;
const ShikiSort = document.createElement("li");
ShikiSort.setAttribute("data-field", "order");
ShikiSort.setAttribute("data-value", "score_2");
ShikiSort.innerHTML = `По рейтингу (Шикимори)`;
const referenceElement = filtersContainer.querySelector('li[data-field="order"][data-value="ranked"]');
if (referenceElement) {
filtersContainer.insertBefore(ShikiSort, referenceElement.nextSibling);
} else {
filtersContainer.appendChild(ShikiSort);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//AUTO SPOILER//AUTO SPOILER//AUTO SPOILER//AUTO SPOILER//AUTO SPOILER//AUTO SPOILER//AUTO SPOILER//AUTO SPOILER//AUTO SPOILER//AUTO SPOILER//AUTO SPOILER//AUTO SPOILER//AUTO SPOILER//AUTO SPOILER//AUTO SPOILER
function autoSpoiler() {
function spoiler(images) {
const spoilerDiv = document.createElement("div");
spoilerDiv.className = "b-spoiler_block";
spoilerDiv.dataset.dynamic = "spoiler_block";
const spoilerText = document.createElement("span");
spoilerText.tabIndex = 0;
spoilerText.textContent = "Image";
spoilerText.addEventListener("click", () =>
spoilerDiv.classList.toggle("is-opened")
);
const imagesContainer = document.createElement("div");
images.forEach((img) => imagesContainer.appendChild(img));
spoilerDiv.append(spoilerText, imagesContainer);
return spoilerDiv;
}
function group(comment) {
const body = comment.querySelector(".body");
let images = [];
Array.from(body.childNodes).forEach((node) => {
if (
node.nodeType === Node.ELEMENT_NODE &&
node.classList.contains("b-image")
) {
images.push(node);
} else if (images.length > 0) {
body.insertBefore(spoiler(images), node);
images = [];
}
});
if (images.length > 0) body.appendChild(spoiler(images));
}
function processComments() {
document.querySelectorAll(".b-comment").forEach(group);
}
processComments();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//AUTO LOADER////AUTO LOADER////AUTO LOADER////AUTO LOADER////AUTO LOADER////AUTO LOADER////AUTO LOADER////AUTO LOADER////AUTO LOADER////AUTO LOADER////AUTO LOADER//
let isLoading = false;
let currentPage = 15;
let currentUrl = "";
function updatePagination() {
const currentSpans = document.querySelectorAll(".pagination .link-current");
if (currentSpans.length > 0) {
currentSpans.forEach((span) => {
span.textContent = `1-${currentPage + 1}`;
});
}
}
function loadNextPage() {
if (isLoading) return;
const nextButton = document.querySelector(".b-postloader.collapsed a.next");
if (!nextButton) return;
if (currentUrl && currentUrl !== nextButton.href) {
currentPage = 15;
}
currentUrl = nextButton.href;
const urlObj = new URL(nextButton.href);
urlObj.pathname = urlObj.pathname.replace(/\/page\/\d+/,`/page/${currentPage + 1}.json`);
let nextPageUrl = urlObj.toString();
console.debug("Loading next page: ", nextPageUrl);
isLoading = true;
GM_xmlhttpRequest({
method: "GET",
url: nextPageUrl,
headers: {
Accept: "application/json, text/plain, */*",
"X-Requested-With": "XMLHttpRequest",
},
onload: function (response) {
if (response.status === 200) {
try {
const data = JSON.parse(response.responseText);
if (data.content) {
const tempContainer = document.createElement("div");
tempContainer.innerHTML = data.content;
const entries = tempContainer.querySelectorAll(
".cc-entries article"
);
appendNewContent(entries);
updatePagination();
currentPage++;
}
} catch (e) {
console.error(e);
}
} else {
console.error(response.status);
}
isLoading = false;
},
onerror: function (error) {
console.error(error);
isLoading = false;
},
});
}
function appendNewContent(entries) {
const containers = document.querySelectorAll(".cc-entries");
if (containers.length === 0) return;
const container = containers[containers.length - 1];
const existingIds = new Set(
[...container.querySelectorAll("article")].map((el) => el.id)
);
entries.forEach((entry) => {
if (!existingIds.has(entry.id)) {
container.appendChild(entry);
}
});
}
function checkScroll() {
const nextButton = document.querySelector(
".b-postloader.collapsed a.next"
);
if (!nextButton || !nextButton.href.match(/\/page\/16(\?|$)/)) return;
if (
window.innerHeight + window.scrollY >=
document.documentElement.scrollHeight - 300
) {
loadNextPage();
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Watch TIME//Watch TIME//Watch TIME//Watch TIME//Watch TIME//Watch TIME//Watch TIME//Watch TIME//Watch TIME//Watch TIME//Watch TIME//Watch TIME//Watch TIME//Watch TIME//Watch TIME//Watch TIME//Watch TIME//Watch TIME//Watch TIME//Watch TIME//Watch TIME
async function watchTime() {
if (!аnimPage()) {
return;
}
try {
const episodesElement = elementFinder(document, "Эпизоды");
const durationElement = elementFinder(document, "Длительность эпизода");
if (!episodesElement || episodesElement.textContent.trim() === "") {
return;
}
let episodes = episodesElement.textContent.trim();
const duration = durationElement? durationElement.textContent.trim(): "Неизвестно";
const duratonM = parseDur(duration);
if (duratonM && episodes !== "Неизвестно") {
const totalTime = parseInt(episodes) * duratonM;
if (!document.querySelector(".time-block")) {
const timeBlock = document.createElement("div");
timeBlock.classList.add("line", "time-block");
timeBlock.innerHTML = `
<div class="key">Время просмотра:</div>
<div class="value"><span>${formatTime(
totalTime
)}</span></div>
`;
if (durationElement && durationElement.parentNode) {
durationElement.parentNode.parentNode.appendChild(timeBlock);
}
}
}
} catch (error) {
// console.error(error);
}
}
function elementFinder(doc, keyText) {
const lines = doc.querySelectorAll(".b-entry-info .line-container .line");
for (let line of lines) {
const key = line.querySelector(".key");
if (key && key.textContent.includes(keyText)) {
return line.querySelector(".value");
}
}
return null;
}
function parseDur(durationText) {
const hoursMatch = /(\d+)\s*час/.exec(durationText);
const minsMatch = /(\d+)\s*мин/.exec(durationText);
return (hoursMatch ? parseInt(hoursMatch[1]) * 60 : 0) +
(minsMatch ? parseInt(minsMatch[1]) : 0);
}
function rotEbal(number, one, two, five) {
const n1 = Math.abs(number) % 10;
if (number > 10 && number < 20) return five;
if (n1 > 1 && n1 < 5) return two;
if (n1 === 1) return one;
return five;
}
function formatTime(totalMins, zero = false) {
const days = Math.floor(totalMins / (24 * 60));
const hours = Math.floor((totalMins % (24 * 60)) / 60);
const mins = totalMins % 60;
const dayText = rotEbal(days, "день", "дня", "дней");
const hourText = rotEbal(hours, "час", "часа", "часов");
const minsText = rotEbal(mins, "минута", "минуты", "минут");
if (zero) {
return `${days} ${dayText}, ${hours} ${hourText}, ${mins} ${minsText}`;
} else {
let result = "";
if (days > 0) result += `${days} ${dayText}, `;
if (hours > 0 || days > 0) result += `${hours} ${hourText}, `;
result += `${mins} ${minsText}`;
return result.trim();
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function domObserver () {
const observer = new MutationObserver(() => {
if (config.CommCopyBtn) CommCopyBtn();
if (config.HistoryHelper) HistoryHelper();
if (config.NotificationHelper) NotificationHelper();
if (config.autoSpoiler) autoSpoiler();
if (config.hideNews) hideNews(blockedUsers);
if (config.ImageIdCopyBtn) ImageIdCopyBtn();
if (ChinesefilterActive) applyChineseFilter();
});
observer.observe(document.body, { childList: true, subtree: true });
}
function ready(fn) {
document.addEventListener("page:load", fn);
document.addEventListener("turbolinks:load", fn);
if (document.readyState !== "loading") {
fn();
} else {
document.addEventListener("DOMContentLoaded", fn);
}
}
ready(() => {
if (config.StudioFilter) StudioFilter();
if (config.CommCopyBtn) CommCopyBtn();
if (config.UserIdCopyBtn) UserIdCopyBtn();
if (config.HistoryHelper) HistoryHelper();
if (config.NotificationHelper) NotificationHelper();
if (config.UserCssCopyBtn) UserCssCopyBtn();
if (config.ClubCssCopyBtn) ClubCssCopyBtn();
if (config.FriendsAVGscore) FriendsAVGscore();
if (config.autoSpoiler) autoSpoiler();
if (config.ShikiRating) ShikiRating();
if (config.hideNews) hideNews(blockedUsers);
if (config.NoAgeLimits) NoAgeLimits();
if (config.ImageIdCopyBtn) ImageIdCopyBtn();
if (config.checkScroll && allowedPaths.some(path => location.pathname.startsWith(path))) {window.addEventListener('scroll', checkScroll);checkScroll();}
if (config.addChineseFilter) addChineseFilter();
if (config.BanCount) BanCount();
if (config.watchTime) watchTime();
domObserver ();
});
})();