drhouse / Kissanime Bingewatcher+

// ==UserScript==
// @name         Kissanime Bingewatcher+
// @namespace    https://greasyfork.org/en/users/10118-drhouse
// @version      1.61
// @description  Automatically plays video in fullscreen, resumes playback, auto-advances to next episode on finish, customizable skip intro and end credits
// @include      http*://kissanime.ru/*
// @include      http*://replay.watch/*
// @include      http*://www.novelplanet.me/*
// @include      http*://*.mp4upload.com:*/*
// @include      https://redirector.googlevideo.com/*
// @include      https://fvs.io/*
// @require      http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// @resource     anticaptcha  https://greasyfork.org/scripts/369048-kissanime-complete-captcha-removal/code/%5BKissAnime%5D%20Complete%20captcha%20removal.user.js?version=747371
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_notification
// @grant        GM_getResourceText
// @author       drhouse
// @license      CC-BY-NC-SA-4.0; https://creativecommons.org/licenses/by-nc-nd/4.0/
// @license      MIT
// @icon         https://www.google.com/s2/favicons?domain=kissanime.ru
// ==/UserScript==
this.$ = this.jQuery = jQuery.noConflict(true);
(function($){
    var garbgarb = setTimeout(function(){
        var garb = $('#btnNext').parent().attr('href');
        if ( garb.indexOf('kissanime') > -1 )
        {
            GM_setValue("btnNext", garb);
            clearInterval(garbgarb);
        }
    }, 1000);

    function openFullscreen(elem) {
        if (elem.requestFullscreen) {
            elem.requestFullscreen();
        } else if (elem.mozRequestFullScreen) { /* Firefox */
            elem.mozRequestFullScreen();
        } else if (elem.webkitRequestFullscreen) { /* Chrome, Safari and Opera */
            elem.webkitRequestFullscreen();
        } else if (elem.msRequestFullscreen) { /* IE/Edge */
            elem.msRequestFullscreen();
        }
    }

    function waitForElementToDisplay(selector, time) {
        if(document.querySelector(selector)!=null) {

            var player = $('video').get(0);
            player.play();

            var elem = $('video').parent().parent().get(0);
            openFullscreen(elem);
            $(elem).focus();

            var aniName; var aniName1 = window.location.href.split("/")[4]; var aniName2 = document.referrer.split("/")[4];
            if (aniName1 != undefined){aniName = window.location.href.split("/")[4];} else {aniName = document.referrer.split("/")[4]; }

            localStorage['aniName'] = aniName;
            var aniNameEp = document.referrer.split("/")[5];

            if (localStorage[aniName+'/'+aniNameEp+'&currentTime']){
                player.currentTime = localStorage[aniName+'/'+aniNameEp+'&currentTime'];
            }
            else if (localStorage[aniName+'&set_start'] && localStorage[aniName+'&set_start'] > 0){
                player.currentTime = localStorage[aniName+'&set_start']
            }

            var newYearCountdown = setInterval(function(){
                var duration = player.duration;
                var current = player.currentTime;
                GM_setValue("GM_current", current);

                localStorage[aniName+'/'+aniNameEp+'&currentTime'] = current;

                var link = document.querySelector("body");
                link.addEventListener("keydown", function(event) {
                    var aniName = localStorage['aniName'];

                    var x = event.keyCode;
                    if (x == 78) { // N skip to next episode
                        var garb2 = GM_getValue("btnNext");
                        top.window.location.href = garb2;
                    };
                    if (x == 75) { // K key rewind 90s
                        player.currentTime = current - 90;
                    }
                    if (x == 76) { // L key skip 90s
                        player.currentTime = current + 90;
                    }
                    if (x == 186) { // ; key rewind 1s
                        player.currentTime = current - 1;              
                    }
                    if (x == 222) { // ' key skip 1s
                        player.currentTime = current + 1;
                    }
                    if (x == 220) { // \ clear start&end
                        localStorage[aniName+'&set_start'] = 0
                        localStorage[aniName+'&set_end'] = duration;
                    }
                    if (x == 219) { // [ mark start
                        localStorage[aniName+'&set_start'] = GM_getValue("GM_current");
                    }
                    if (x == 221) { // ] mark end
                        localStorage[aniName+'&set_end'] = GM_getValue("GM_current");
                    }
                    if (event.shiftKey && x == 219) { // +[ clear start
                        localStorage[aniName+'&set_start'] = 0
                    }
                    if (event.shiftKey && x == 221) { // +] clear end
                        localStorage[aniName+'&set_end'] = duration;
                    }
                });

                if ( duration > 0 && current >= duration || duration > 0 && current > localStorage[aniName+'&set_end'] ){
                    var garb2 = GM_getValue("btnNext");
                    top.window.location.href = garb2;
                    setInterval(function(){
                        top.window.location.href = garb2;
                    }, 7000);
                    clearInterval(newYearCountdown);
                };
            }, 1000);
        }
        else {
            setTimeout(function() {
                waitForElementToDisplay(selector, time);
            }, time);
        }
    }

    var TIMES_REPEAT_COIN = 1;
    var audioNotification = function () {
        var playNum = TIMES_REPEAT_COIN;

        var wav = 'data:audio/wav;base64,UklGRpwSAABXQVZFZm10IB4AAABVAAIARKwAACBOAAABAAAADAABAAIAAAAKAgEAcQVmYWN0BAAAAAAAAABkYXRhXhIAAP/7oAAAAAHmCsbpiTEkSmF4/T0oJotFqT3n0K3BaLUnvPoVuLq0SSQm5J'+
            'YwaFcD6Y4AED48hCo+CAkeCSm8hYIC/7kbOUAB/9YH/SICg1+6fDBLdVs9YDNVf6imIHSYYl77GSUQ47bbC4MY41M8LYB4NIQCmxQdNoFfJCMODX9xM4ifIdQACxN3LkAOc+khICcp9Tn3FC8gJIfEBcIhZyKz7vlJcQHChMMFy8'+
            '3iiQmYgQQpVASxkQxtOOOpEIorxhgEabVkULpgCgQMibA1xgLiDjKBcW6H+s3b//0E//+Qn/89CN/+c7yf/7//9Tv//1O//nckgcAAE5A+Lv///Oc+ggAAEabxRITM'+
            'QIIUqgJYyIY2nHHUiEUV4wwCNNqyKF0wBQIGRNga4wFxBxlAuLdD/Wbt//6Cf//IT/+ehG//Od5P/9//+p3//6nf/zuSQOAACcgfF3///nOfQQAACMCEBzNCFG1skaSXPa5//SQJqGRSZEyGZ3IxFIgbWHNMnZnWxsklpVGY'+
            'WTGrfUn+odQcEj+pvXUP3/+2bN/+tW//9aX//oH///Of7fmQW4EbUlWoYpS///x9S8yNzWEBzNCFG1tkaSXPf5//SQJqGRSZEyGZ3IxFIgbWHNMnZnWxsklpVGYWTGrfUn+odQcEj+pvXUP3/+2bN/+tW//9aX//oH///Of7fmQW'+
            '4P/7ogBVAALiadF7Emt4XE06L2JNbwvtpzusTU3RfjTndYmpukbUlWoYpS///x9S8yNzVNxlAuRxxtosS/nd4QUkju0OLI0yC3gssBOQYVIkapGpki4hLTToM5dA0JK7fk83rMBXwGJF1vqb7wnCYYd8h+djH6f5un/8r/r/'+
            'iUTf/+v+v8jAaP1YhHf//8Xt6hQqm4ygXI4420WJfzv4QUkju0OLI0yC3gssBOQYVIkapGpki4hLTToM5dA0JK7fl5vRMBXwGJF1vqb7sE4TEO+Q/OyH//N0//ldPr/'+
            'iUTf/+v+v8jAaP1YhHf//8Xt6hQmgVuqaUttkkYKTNmGp3CoIQAADSN3FDROGKU8YJscwD2wEVjV1sxlDHiZN2Mi+aF8gQH9ROF48mau50YLo6lmQQLAsA3Kr7TjX0e4fJ+j+Q4yf1kZ5j8bZL6P/Vv/'+
            'RvIm/////4xCFvjv//+VLehAXVuqaUttkjYKTNl/p3CoIQAMDDjdxQ0ThgSnpC+OYB9YCljVVFaThjxMpomRuaGY5QH9REC8eWau50YLtqWcCBYFgG5Vfzjejq4fI/0fyFoyf11+dm/f+rf1/yJv////+MQhb2Hf//8qW9CA'+
            'vHZUyrJbZZAWUz3OU7wJ6MUMd8Bugk8RmkQyYkCu29SA00x1alqOWFpDGTOMlQBu6nbQnUh+GJXHFO250L+T/+6AAjIADeGnN6zNTdGvtOb1mam6WcW07rOYNkPqSJzT5tSpOJSmVRVTORSqTT8slcxJehEDLh2lYqmxaJ8BwFjg'+
            '5BTMjFJk0S6WjdBNBZxEnymcOmRdJ4cBAyGChBgiAYoARmGDgJhPCtyCiC5LkUJUXORNJkP/rPM5ME4ouLMywTooMPjIU3l9IqJoLS////+ox+o//5LLRixNNuOBwMAV13n/'+
            'l+XcRtFpBFUwXUR4DthvxETZkuddt1KKwWKK/1/x2g5X//6z3+f//5L/Jf/+o7kf/JZZ21KAy222SAQq29w4C6rgqZIwPSX+KqoLGSTYIBQLVUqTgoKV4dgRU0jh2BHeicJ7drZXSKmO87j/'+
            'MlsoqJGibJmhmGQABoJEj+p0QaggoMIwt9SY5gozJrRzgYOK3vUgkovJsdLgyQHVrBgojB8GpwhwMHl1qP/'+
            'VoVpjUDTTzmJVJoE0AFiyaZimYu//9Pf//aW7//5GQW2yWWQQAAA0e78lF6wiwyegMSr2qSfKBESZ7HWHd9/+f55EcUBUn9/5g9//8q7////////Ssy7owii22togSLF/'+
            'YRA9VkK3Xad0cqLKIKWCbQK4AaGZNka1Lpq9qhNVfoCDX+sXRB5t8jhgqf5KH/7t/S/SHSB2KSBgT6KimLE///9MnfiRGxFTMLb//kJP//D7cINeZFAy4yhf/+6IAmQAEsEXN6zmi5DYkec0vKkqKSQ0z7EJronWh5HGd4XE'+
            '2rDbDwyYoMoGGuLCmRmZ4EcacSGQDwCHF6JppFrHYmyyy7blv3chhlCxGn1oxLMaeNu3D+Nent6pJQ0hdjr26ljdPK2ttfinK9vuGFJGJf3DDHOvG5fjnn9SklF6ndhrDXKJ90bzTEeW1xy2Jw+4a73nqf//////////+sKS/'+
            'ScqRhwGuWbZ8f8B7bOhyW2ytARbF+GFSLr6r9lTciC8cHafQWSgIUADQ0ZInTY1e6NtFnWJItam5YEnZ0fGeDekUn8jhgqf5Sb+Uf9f1IjWA0IA2mDyVQ///1n/'+
            'kceWJmBQAWP/9UwKPTgL5YMqsXzMktiDsBRo4QRoGUpkp0uiA8gfri2ayQxd4u1Az6l/kwnGvxmGbDhC47Uts5U2cpUNhUSrZ1aWzWHQF45XXs6y7KRhbbarWtomrDGEutbKMkjohU3d1osovGTpKJoc4ixfAQVAy+4kRyRo'+
            'GpMhxIOLmX//1OOoHCi8kTRExuAAiwUIkVNlMYmrUkv//////////9NvUn////zFItySNBxttkAU2eVbL9wLTUwpWUMksfNC+OADQhgWFGqX0v1qGbNq/MyHW+mLEv8yJFX7t/Z//9RKgXUa2lktf//9L6R527FlWySNIgX8qd9M'+
            'psEPOqFRhYgq4b08+//ugAK6AApxDSmsUouCsT5mfZxRvCIkNIazSC4HWoac1jNF3Mxm+AV0EjXWncodjUO6kWXcv736EaQq87h+/gEeMdFJanYgQIlRdSXs4NAo30zz9QiRWv6hWCt/X7s45oGsahdg5gdsmSOCZkAIkUUFv//1'+
            'jOCgkVUjMEA8PdEBICTWbgHSSAkbrOtmtwFk4DEE860B9gYBKCgIiJsj/7umg36j3+Vb+jf////8oCpKakv/////////////////////////////////////////////////////////////////////////////////////////'+
            '////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////'+
            '/////////+TNDihCrW2OEAdwp2ZZV0EqJ0bXgIyg1p37Fi2/B9MRKs5f3Hvym7rL9dzoFJ5d3/NbjjVXdWmoWsOWRb4pp9NvkOQQS+bNd9ToOttSIe0Bu1hCnScdQdURY1///kcNlu4nkcQAMJAAQv/'+
            'AdAR9wjv/////8qZNXVJJJHGgP5W73r6yi/BiqwPaI8wKa//uiAMSAB+U0x+KUUtBjCFlPZxRdQkAlJWCoRKEloaS1mkVwA+wAGIFhwyJPIpM9Jv0yKfqSFxN+PkhHb5G7ft/W3/9aQ+QB6WlJs4+RRW///uXfmJ8yAQAARo'+
            '3///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////'+
            '////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////'+
            '////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////'+
            '////////////////////////////8QXe7ASSCNAdHMTxsRw5YBUoupLMCXCv/7oADagAzwAMmgIAAKMUapPVIKWgAAAS4AAAAgVoUkrBQ0lIF2k8z//0/6kv8hGv9W/////5QAk/xr/636QBJZoACBfmuFCJtZgAJRRf//////Kv'+
            '////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////'+
            '////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////'+
            '////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////'+
            '/////////////////////////////////////////////////////////////////////7ogDbAA8UAEuAAAAIBYAYxAAAAQAAAS4AAAAgAAAlwAAABP////////////////////////////////////////////////////////'+
            '//8AAEAAeW//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////'+
            '////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////'+
            '////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////'+
            '//////////////////////////////////////////////////////////////////////////////+6AA2oAPKABLgAAACAAACXAAAAEAAAEuAAAAIAAAJcAAAAT///////////////////////////////////////////////'+
            '////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'+
            'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'+
            'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'+
            'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=';


        var snd = new Audio(wav);

        var player = setInterval(function () {
            if (playNum > 0) {
                console.log("Playing sound...");
                snd.play();
                console.log("Played sound...");
                playNum--;
                console.log("playNum reduced...");
            } else {
                clearInterval(player);
            }
        }, 666);
    };

    function fancyTimeFormat(time)
    {   
        // Hours, minutes and seconds
        var hrs = ~~(time / 3600);
        var mins = ~~((time % 3600) / 60);
        var secs = ~~time % 60;

        // Output like "1:01" or "4:03:59" or "123:03:59"
        var ret = "";

        if (hrs > 0) {
            ret += "" + hrs + ":" + (mins < 10 ? "0" : "");
        }

        ret += "" + mins + ":" + (secs < 10 ? "0" : "");
        ret += "" + secs;
        return ret;
    }



    $('body').click();
    waitForElementToDisplay('video', 500);
    var videoDiv = document.getElementById("divContentVideo");
    if (videoDiv && videoDiv.style.display != "inline") {
        videoDiv.style.display = "inline";
    }

    var link = document.querySelector("body");
    link.addEventListener("keydown", function(event) {
        var imagex = 'https://b.thumbs.redditmedia.com/aASciyXiLuJk4NuD67ltbSabDJXeiF3NFdl_OR2wwBA.png';
        var msg;
        var aniName = localStorage['aniName']; 
        var x = event.keyCode;
        if (x == 78) { // N skip to next episode
            audioNotification();
        };
        if (x == 75) { // K key rewind 90s
            audioNotification();
        } 
        if (x == 76) { // L key skip 90s
            audioNotification();
        }
        if (x == 186) { // ; key rewind 1s
            audioNotification();
        }
        if (x == 222) { // ' key skip 1s
            audioNotification();
        }
        if (x == 220) { // \ clear start&end
            msg = new SpeechSynthesisUtterance('marks cleared');
            window.speechSynthesis.speak(msg);
            GM_notification('Kissanime Bingewatcher+', "marks cleared", imagex);
        }
        if (!event.shiftKey && !event.altKey && !event.ctrlKey && x == 219) { // [ mark start
            msg = new SpeechSynthesisUtterance('start set');
            window.speechSynthesis.speak(msg);
            GM_notification('Kissanime Bingewatcher+', "start set [" + fancyTimeFormat(GM_getValue("GM_current")) + "]", imagex);
        }
        if (!event.shiftKey && !event.altKey && !event.ctrlKey && x == 221) { // ] mark end
            msg = new SpeechSynthesisUtterance('end set');
            window.speechSynthesis.speak(msg);
            GM_notification('Kissanime Bingewatcher+', "end set [" + fancyTimeFormat(GM_getValue("GM_current")) + "]", imagex);
        }
        if (event.shiftKey && x == 219) { // +[ clear start
            msg = new SpeechSynthesisUtterance('start cleared');
            window.speechSynthesis.speak(msg);
            GM_notification('Kissanime Bingewatcher+', "start cleared", imagex);
        }
        if (event.shiftKey && x == 221) { // +] clear end
            msg = new SpeechSynthesisUtterance('end cleared');
            window.speechSynthesis.speak(msg);
            GM_notification('Kissanime Bingewatcher+', "end cleared", imagex);
        }
        if (x == 190) { // . stored time settings
            msg = new SpeechSynthesisUtterance('stored, time settings');
            window.speechSynthesis.speak(msg);
            GM_notification(`start time: ${fancyTimeFormat(localStorage[aniName+'&set_start'])} \n end time: ${fancyTimeFormat(localStorage[aniName+'&set_end'])}`, "stored time settings", imagex);
        }
    })

    /* MIT LICENSE Copyright 2019 eskander https://greasyfork.org/en/users/152412-eskander | [KissAnime] Complete captcha removal | https://greasyfork.org/en/scripts/369048-kissanime-complete-captcha-removal 
    Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, 
    including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished 
    to do so, subject to the following conditions:
    The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. */
    // eval(GM_getResourceText("anticaptcha"));

})(jQuery);