NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Alt Watcher v2
// @namespace https://vk.com/shiki_ex
// @version 2.1.2
// @description [shikimori.org] Добавляет ссылку на Альтернативные сайты просмотра аниме ###
// @author STorn
// @match https://shikimori.org/*
// @match http://shikimori.org/*
// @match https://shikimori.one/*
// @match http://shikimori.one/*
// @require https://code.jquery.com/jquery-3.3.1.slim.min.js
// @grant none
// @license MIT
// @copyright 2018, Newt300 (https://openuserjs.org/users/Newt300)
// ==/UserScript==
// url, name, allowed page types bitmap(0 - blocked, 1 - hentai)
const selections = [
["https://smotret-anime-365.ru/catalog/search?q=", "Anime 365", 1],
["https://hentai365.ru/catalog/search?q=", "Hentai 365", 2],
["https://vk.com/video?q=", "VK", 3],
["https://sovetromantica.com/anime?query=", "SR", 1],
["https://online.anidub.com/index.php?do=search&subaction=search&search_start=1&full_search=0&result_from=1&story=", "AniDub", 1],
["https://video.sibnet.ru/search.php?panel=open&sortby=0&duration=0&inname=1&text=", "Sibnet", 3],
["http://www.animespirit.ru/index.php?do=search&story=", "animespirit", 1],
["http://desu.me/search/555/?o=date&c[title_only]=1&c[node]=20+22+21&q=", "Desu.me", 1]
];
let $jq = jQuery.noConflict(true);
const lang_cookie_regexp = new RegExp('(?:^|; )altWatcherLanguage=([^;]*)');
const service_cookie_regexp = [
new RegExp('(?:^|; )altWatcherPrefServiceFor1=([^;]*)'),
new RegExp('(?:^|; )altWatcherPrefServiceFor2=([^;]*)')
];
function getPrefService(pageType) {
let matches = document.cookie.match(service_cookie_regexp[pageType-1]);
if (matches){
matches = decodeURIComponent(matches[1]);
matches = selections.find(function(it){
return it[1] == matches;
});
if (matches && matches[2] & pageType) return matches;
}
for (let idx = 0, v = selections[idx]; idx < selections.length; v = selections[++idx])
if ((v[2] & pageType) !== 0)
return v;
return selections[0];
}
function setPrefService(pageType, value) {
const d = new Date(Date.now() + 1e+10);
document.cookie = "altWatcherPrefServiceFor" + pageType + "=" + encodeURIComponent(value) + "; path=/; expires=" + d.toUTCString();
}
function getAltWatcherLanguage() {
const matches = document.cookie.match(lang_cookie_regexp);
if (matches){
return decodeURIComponent(matches[1]);
}
return "en";
}
function setAltWatcherLanguage(value) {
const d = new Date(Date.now() + 1e+10);
document.cookie = "altWatcherLanguage=" + encodeURIComponent(value) + "; path=/; expires=" + d.toUTCString();
}
function start(){
let watch_online_placeholer = $jq(".watch-online-placeholer");
if (watch_online_placeholer.length)
{
let lang_code = (getAltWatcherLanguage() == "en" ? 1 : 0);
const pageType = (!!$jq('a.b-tag[href*="genre/12"]').length + 1);
const animeName = $jq("#animes_show > section > div > header > h1").text().split(" / "); // [ru, en]
const link = $jq('<a target="_blank"/>');
const bar = $jq('<div/>');
let service = getPrefService(pageType); // used in function scope to minimize cookie reading
const barItemClicked = function (){
service = selections[$jq(this).data('service-index')];
link.attr('href', service[0] + encodeURIComponent(animeName[lang_code])).text('Смотреть на ' + service[1]);
setPrefService(pageType, service[1]);
bar.hide();
};
for (let idx = 0; idx < selections.length; idx++) {
let v = selections[idx];
if ((v[2] & pageType) !== 0)
bar.append($jq('<a/>').addClass('b-link_button dark watch-online').text(v[1]).data('service-index', idx).click(barItemClicked));
}
const en = $jq('<a>').addClass(lang_code === 1 ? "b-link_button dark" : "b-link_button").text('en').attr('title', "Искать по английскому названию");
const ru = $jq('<a>').addClass(lang_code === 0 ? "b-link_button dark" : "b-link_button").text('ru').attr('title', "Искать по русскому названию");
const table = $jq('<table width="100%"/>').append($jq('<tr/>')
.append($jq('<td/>').append(ru.click(function(){
ru.addClass("dark");
en.removeClass("dark");
setAltWatcherLanguage("ru");
lang_code = 0;
link.attr('href', service[0] + encodeURIComponent(animeName[0]));
bar.hide();
})))
.append($jq('<td/>').append(en.click(function(){
en.addClass("dark");
ru.removeClass("dark");
setAltWatcherLanguage("en");
lang_code = 1;
link.attr('href', service[0] + encodeURIComponent(animeName[1]));
bar.hide();
}))));
bar.append($jq('<div/>').addClass('block watch-online').css({top: "5px"}).append(table));
const pref_service = getPrefService(pageType);
watch_online_placeholer.empty().append(
$jq('<div/>').addClass('watch-online').append(
link.addClass("b-link_button dark").css({"float": 'left', width: "calc(100% - 31px)"})
.attr('href', pref_service[0] + encodeURIComponent(animeName[lang_code])).text('Смотреть на ' + pref_service[1])
).append(
$jq('<a/>').addClass("b-link_button dark").css({width: "31px", "float": 'right', heigth: '31px'}).text('▼').click(function(){
bar.toggle();
})
).append($jq('<div/>').addClass('clearfix'))
).append(bar.addClass('block').hide());
}
}
$jq(document).ready(start);
$jq(document).on('page:load', start);
$jq(document).on('turbolinks:load', start);