AnimeList

Список аниме-сериалов

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         AnimeList
// @version      2.0
// @author       Fenion
// @description  Список аниме-сериалов
// @match        https://anidub.tv/*
// @require      https://unpkg.com/sweetalert/dist/sweetalert.min.js
// @require      http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.js
// @namespace    https://greasyfork.org/ru/scripts/383705-animelist
// ==/UserScript==
var debug = false;
if(debug){
    var start = Date.now();
}
try{
    localStorage.setItem('test', 'test');
    localStorage.removeItem('test');
}catch(e){
    alert('LocalStorage is not available. Terminating script.');
    return;
}
$(function(){
    $('body').append(`
    <div id="al"><a href="javascript: void(0)" class="mbtn"></a></div>
    <div id="anime-list">
       <div class="q"></div>
       <div class="list">
          <div class="animes">
             <a id="close" href="javascript: void(0)">X</a>
             <h1>Список просматриваемых аниме</h1>
             <hr>
          </div>
       </div>
    </div>`);
    $('body').append(`
    <style>
    .mbtn{
        width: 40px;
         height: 40px;
         opacity: 0.3;
         position: fixed;
         bottom: 50px;
         left: 150px;
         display: inline;
         z-index: 500;
         text-indent: -9999px;
         background: url("https://raw.githubusercontent.com/Fenion/AnimeList/master/icon.png") no-repeat;
    }
    a.addbtns {
        color: #fff;
         text-decoration: none;
         user-select: none;
         background: rgb(212,75,56);
         padding: .1em 1.5em;
         outline: none;
    }
    a.addbtns:hover {
         background: rgb(232,95,76);
    }
    a.addbtns:active {
         background: rgb(152,15,0);
    }
    .swal-overlay{
        background-color:rgba(43, 165, 137, 0.45)
    }
    .cnt {
        text-align: center;
    }
    .q {
        display: none;
         position: fixed;
         top: 0;
         left: 0;
         width: 100%;
         height: 100%;
         background: rgba(43, 165, 137, 0.45);
         opacity: 0.6;
         z-index: 150;
    }
    .list {
        display: none;
         position: fixed;
         top: 0;
         right: 0;
         bottom: 0;
         left: 0;
         text-align: center;
         padding: 20px;
         z-index: 1000;
    }
    .animes {
         display: none;
         border-radius: 5px;
         width: 100%;
         overflow-y: auto;
         max-height: 80%;
         min-width: 200px;
         position: relative;
         background-color: #FAFAFA;
         z-index: 300;
         padding: 60px 0;
    }
    .anime{
        position: relative;
         width: 100%;
         margin: 0px;
         padding-box: 0px;
         z-index: 400
    }
    .img{
        position: relative;
         width: 100%;
         height: 200px;
         padding: 0px;
    }
    .kartinka{
        position: absolute;
         height: 200px;
         left: 10px;
    }
    .nme{
        position: absolute;
         top: 10%;
         left: 200px;
         width: 80%;
    }
    .del{
        position: absolute;
         top: 45%;
         right: 10%;
         width: 115px;
         height: 15px;
         color: #fff;
         text-decoration: none;
         user-select: none;
         background: rgb(212,75,56);
         padding: .7em 1.5em;
         outline: none;
    }
    ::-webkit-scrollbar {
        width: 12px;
    }
    ::-webkit-scrollbar-track {
        -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
         border-radius: 10px;
    }
    ::-webkit-scrollbar-thumb {
        border-radius: 10px;
         -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.5);
    }
    #close{
        position: fixed;
         top: 30px;
         right: 40px;
         z-index: 1000;
         color: #fff;
         text-decoration: none;
         user-select: none;
         background: rgb(255, 82, 82);
         padding: .1em .5em;
         outline: none;
    }
    .srs{
        position: absolute;
         width: 100%;
         bottom: 20%;
    }
    .red{
        position: absolute;
         right: 38px;
         bottom: 10%;
         color: #fff;
         text-decoration: none;
         user-select: none;
         background: rgb(255,165,0);
         padding: .01em .3em;
         outline: none;
    }
    .plus{
        position: absolute;
         bottom: 10%;
         right: 1%;
         color: #fff;
         text-decoration: none;
         user-select: none;
         background: rgb(0,155,0);
         padding: .1em .5em;
         outline: none;
    }
    .min{
        position: absolute;
         bottom: 10%;
         left: 5%;
         color: #fff;
         text-decoration: none;
         user-select: none;
         background: rgb(212,75,56);
         padding: .1em .6em;
         outline: none;
    }
    .seriesbtn{
        position: relative;
         width: 40px;
         left: 49%;
         bottom: 19px;
    }</style>`);

    var imgMeta = getMeta('og:image'),
        animes = localStorage.getItem('animes'),
        url = window.location.href,
        restr = 100,
        wrap = $('#anime-list'),
        btn = $('.mbtn'),
        strg = localStorage,
        modal = $('.q, .list, .animes');

    function getMeta(metaName) {
        const metas = document.getElementsByTagName('meta');
        for (let i = 0; i < metas.length; i++) {
            if (metas[i].getAttribute('property') === metaName) {
                return metas[i].getAttribute('content');
            }
        }
        return '';
    }
    function no_anime() {
        swal({
            icon: 'error',
            text: 'В вашем списке ещё нет аниме!',
            button: "Ok!",
        });
    }
    function addAnime() {
        if (animes >= restr) {
            swal({
                icon: 'error',
                text: 'Список аниме заполнен!',
                button: 'Ok!',
            });
        } else {
            let title = getMeta('og:title'),
                a = title.split(' ').splice(2),
                name = a.join(' '),
                r = title.match(/[^[\]]+(?=])/g).join(),
                t = Number(r.split(' ')[0]);
            for (var f = 1; f <= restr; f++) {
                let anime = strg.getItem('anime' + f);
                if (anime == null) {
                    localStorage.setItem('animes', ++animes);
                    strg.setItem('anime' + f, url + ' 0');
                    $('.animes').append(`
                    <div id="${f}" class="anime">
                        <a href="${url}">
                            <h3 class="srs">Просмотрено: 0 из ${t}</h3>
                            <div class="img">
                                <img src="${imgMeta}" class="kartinka" width="160"></img>
                            </div>
                            <div class="nme">
                                <h2>${name}</h2>
                            </div>
                        </a>
                        <a href="javascript: void(0)" class="del" id="${f}">Удалить</a>
                        <div class="seriesbtn">
                            <a href="javascript: void(0)" class="red" id="${f}">&#9998;</a>
                            <a href="javascript: void(0)" id="${f}" class="min" style="display: none;">-</a>
                            <a href="javascript: void(0)" id="${f}" class="plus">+</a>
                        </div>
                        <hr>
                    </div>`);
                    swal({
                        icon: 'success',
                        text: 'Аниме добавлено в список!',
                        button: 'Ok!',
                    });
                    if(debug){
                        console.log('%c' + title + ' added to the list successfully!', 'background: green; color: white;');
                    }
                    break;
                }
            }
        }
    }
    function delAnime(num) {
        strg.removeItem('anime' + num);
        strg.setItem('animes', --animes);
        let id = ('#' + num),
            anis = strg.getItem('animes');
        $('.anime' + id).remove();
        if(anis == 0){ modal.fadeOut(); }
        swal({
            icon: 'success',
            text: 'Аниме удалено из списка!',
            button: 'Ok!'
        });
        if(debug){
            console.log('%cAnime #' + num + ' deleted succesfully!', 'background: green; color: white;');
        }
    }
    function ajaxReq(a, q) {
        $.ajax({
            url: q,
            async: true,
            success: function(data, textStatus, jqXHR) {
                var title = $(data).filter("meta[property='og:title']").attr("content"),
                    img = $(data).find("meta[property='og:image']").attr("content"),
                    series = title.match(/[^[\]]+(?=])/g).join(),
                    h = Number(series.split(' ')[0]),
                    ttlArr = title.split(' ').splice(2),
                    name = ttlArr.join(' '),
                    sP = '',
                    sM = '';
                let s = strg.getItem('anime' + a).split(' ')[1];
                if(Number(s) >= Number(h[0])){
                    sP = 'style = "display:none;"';
                    sM = 'style = "display:auto;"';
                } else if(s == 0) {
                    sM = 'style = "display:none;"';
                    sP = 'style = "display:auto;"';
                } else if(s == 1) {
                    sM = 'style = "display:none;"';
                    sP = 'style = "display:auto;"';
                } else {
                    sP = 'style = "display:auto;"';
                    sM = 'style = "display:auto;"';
                }
                $('.animes').append(`
                <div id="${a}" class="anime">
                    <h3 class="srs">Просмотрено: ${s} из ${h}</h3>
                    <a href="${q}">
                        <div class="img">
                            <img src="${img}" class="kartinka" width="160"></img>
                        </div>
                        <div class="nme">
                            <h2>${name}</h2>
                        </div>
                    </a>
                    <a href="javascript: void(0)" class="del" id="${a}">Удалить</a>
                    <div class="seriesbtn">
                        <a href="javascript: void(0)" class="red" id="${a}">&#9998;</a>
                        <a href="javascript: void(0)" id="${a}" class="min" ${sM}>-</a>
                        <a href="javascript: void(0)" id="${a}" class="plus" ${sP}>+</a>
                    </div>
                    <hr>
                </div>`);
                if(debug){
                    console.log(`%cCool! Ajax request sent successfully! [${jqXHR.status}]`, 'background: green; color: white;');
                }
            },
            error: function(jqXHR) {
                console.log(`%cOops! Something went wrong with Ajax! [${q}][${jqXHR.status}]`, 'background: red; color: white;');
            }
        });
    }
    function update() {
        for(let i = 1; i <= restr; i++){
            let a = strg.getItem('src' + i),
                b = strg.getItem('series' + i);
            if(a == null) {} else {
                strg.setItem('anime' + i, a + ' ' + b);
                strg.removeItem('src' + i);
                strg.removeItem('series' + i);
            }
        }
        location.reload();
    }
    function redSeries(ser, aydi){
        var a = $('#' + aydi + '.anime').find(".srs"),
            b = $(a).html().split(' '),
            p = $('#' + aydi + '.anime').find('.plus'),
            m = $('#' + aydi + '.anime').find('.min');
        if(!ser){
        } else if(ser > Number(b[3])) {
        } else if (ser < 0) {
        } else if(Number(ser)){
            let c = b[1] = ser,
                d = b.join(' '),
                test = strg.getItem('anime' + aydi).split(' ');
            test[1] = ser;
            console.log(test);
            strg.setItem('anime' + aydi, test.join(' '));
            $(a).text(d);
            if(debug){
                console.log(d);
                console.log(ser);
                console.log(Number(b[1]));
            }
            if(c >= b[3]){
                p.css({'display':'none'});
                m.css({'display':'block'});
            } else if(c == 0) {
                m.css({'display':'none'});
                p.css({'display':'block'});
            } else if(c == 1) {
                m.css({'display':'none'});
                p.css({'display':'block'});
            } else {
                p.css({'display':'block'});
                m.css({'display':'block'});
            }
        } else {
            alert('Пожалуйста введите число!');
        }
    }
    if (!animes) {
        strg.setItem('animes', 0);
    } else if (animes == 0) {
    } else if (animes > 0) {
        for (var a = 1; a <= restr; a++) {
            var q = strg.getItem('anime' + a);
            if (q == null) {} else {
                ajaxReq(a, q.split(' ')[0]);
            }
        }
    }
    if (!imgMeta) {} else {
        $('.poster_img').append('<a href="javascript: void(0)" class="addbtns">Добавить в список</a>');
    }
    $('.addbtns').click(addAnime);
    btn.click(function() {
        if (animes == 0) {
            no_anime();
        } else if (!animes) {
            no_anime();
        } else {
            modal.fadeIn();
        }
    });
    $('#close').click(function() {
        modal.fadeOut();
    });
    $(document).on("click", ".del", function() {
        let id = $(this).attr("id");
        delAnime(id);
    });
    $(document).on('click','.red' ,function() {
        let id = $(this).attr('id');
        swal('Введите кол-во просмотренных серий', {
            content: "input",
        }).then((value) => {
            redSeries(Number(value), id);
        });
    });
    $(document).on('click', '.plus', function(){
        let id = $(this).attr('id'),
            d = strg.getItem('anime' + id).split(' ')[1],
            v = ++d;
        redSeries(v, id);
    });
    $(document).on('click', '.min', function(){
        let id = $(this).attr('id'),
            d = strg.getItem('anime' + id).split(' ')[1],
            v = --d;
        redSeries(v, id);
    });
    if(debug){
        var end = Date.now();
        var time = end - start;
        console.log('%cScript started in ' + time + 'ms', 'background: green; color: white;');
    }
    for(let i = 1; i <= restr; i++){
        if(strg.getItem('src' + i) != null){
            swal({
                icon: 'info',
                title: 'Внимание!',
                text: 'Скрипт перешёл на новый метод хранения информации! Чтобы сохранить список аниме, требуется обновить записи в локальном хранилище! Скрипт сделает это за вас, просто подтвердите действие!',
                buttons: {
                    cancel: 'Отмена',
                    confirm: 'Обновить'
                }
            }).then((value) => {
                console.log(value);
                if(value == true) {
                    update();
                }
            });
        }
    }
});