// ==UserScript==
// @name KissAnime Downloader
// @namespace https://greasyfork.org/en/users/135934-anime-bro1
// @version 3.3.1
// @description This is a userscript that will download multi episodes form KissAnime.
// @author AnimeBro1
// @homepage https://github.com/Eltion/Kissanime-Downloader
// @match http://kissanime.ru/Anime/*
// @include http://kissanime.ru/Anime/*
// @exclude http://kissanime.ru/Anime/*/*
// @grant GM_getValue
// @grant GM_listValues
// @run-at document-end
// @grant GM_deleteValue
// @grant GM_setValue
// @grant GM_xmlhttpRequest
// @require http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @require https://cdn.rawgit.com/Eltion/Kissanime-Downloader/ee154d713ce5af9c031b4abdd20fae8bb7cc2dc5/css.js
// @require https://cdn.rawgit.com/Eltion/Kissanime-Downloader/4fc64d92baba62fb52de03a3472464c2b6466ed9/vr2.js
// @require https://cdn.rawgit.com/Stuk/jszip/579beb1d45c8d586d8be4411d5b2e48dea018c06/dist/jszip.min.js
// @require https://cdn.rawgit.com/Eltion/Kissanime-Downloader/b24ffcadd00a4f3eda526e213f4d4c8d5196af6c/FlieSaver.js
// @downloadURL https://update.greasyfork.icu/scripts/31080/KissAnime%20Downloader.user.js
// @updateURL https://update.greasyfork.icu/scripts/31080/KissAnime%20Downloader.meta.js
// ==/UserScript==
var curretEP = "";
var currnetEpIndex = 0;
var EpisodesName = [];
var EpisodesLinks = [];
var EpisodesVideoLinks = [];
var isEval = false;
var images = ["","","",""];
var imagecount = 0;
var imagesURL;
var imageURLcount = 0;
var clickNr = 0;
var w;
var nameOfAnime = "";
var start = "";
var end = "";
var isText = false;
var isHTML = false;
var isM3U8 = false;
var isRapid = false;
var isBeta = false;
var isIDM = false;
var server = 1;
var quality = [];
var coutFailedCh = 0;
var max = 1;
(function() {
if(!isBasicJson()){
factoryReset();
getBasicJson();
}
//curretEP = "http://kissanime.ru/Anime/Shokugeki-no-Souma-San-no-Sara/Episode-005?id=140040";
//getEp(curretEP);
//getE();
max = $(".listing").find("a").toArray().length;
setUI();
$("#aend").attr('value',max+"");
$("#startscript").on('click',function(){
start = $("#astart").val();
end = $("#aend").val();
if($("#aquality").val().includes(",")){
quality = $("#aquality").val().split(",");
}else{
quality = [$("#aquality").val()];
}
isText = $("#atxt").get(0).checked;
isHTML = $("#ahtml").get(0).checked;
isM3U8 = $("#am3u8").get(0).checked;
isIDM = $("#idm").get(0).checked;
isBeta = $("#abeta").get(0).checked;
isRapid = $("#arapid").get(0).checked;
if(isBeta){
server = 1;
}else if(isRapid){
server = 2;
}else{
alert("Select a server");
return;
}
nameOfAnime = location.href.split("/")[4].replace(/-/g," ");
//alert(nameOfAnime);
$("#adownloader").hide(500);
$("#ainfo").show(500);
getAllEpisodes();
});
})();
function getE(){
var x = GM_listValues();
var b = "";
for(var i =0; i < x.length; i++){
b += '"'+x[i]+'":"'+GM_getValue(x[i])+'",';
}
$('body').html("
"+b+"
");
}
function setUI(){
$("body").append('
');
var imgSrc = "https://cdn.rawgit.com/Eltion/Kissanime-Downloader/024c2d98b5580a14d1eaf74276d641c88f04764a/Download%20ButtonGreen.png";
var html = '
"
$('body').append(html);
$('body').append(html2);
}
function getEp(url){
console.log(currnetEpIndex);
$('#aoutput').html("Grabbing: "+url+"...");
var msg = $.ajax({type: "GET", url: url, async: false}).responseText;
if(isCapacha(msg)){
GetWords(msg,function(){
getImages(msg);
});
}else{
if(server == 1){
beta(msg);
}else if(server == 2){
rapidvideo(msg);
}
}
}
function getAllEpisodes(){
EpisodesLinks =[];
EpisodesName = [];
var x = $(".listing").find("a").toArray();
console.log(x);
for(var i =0; i < x.length; i++){
if(!x[i].href.includes("reddit")){
var ee = "";
if(server == 1){
ee = x[i].href+"&s=beta&pfail=1";
}else{
ee = x[i].href+"&s=rapidvideo";
}
EpisodesLinks.push(ee);
EpisodesName.push(x[i].innerText);
}
}
if(parseInt(start) < 0){
alert("Error: Start < 0");
return;
}else if(parseInt(end) < parseInt(start)){
alert(end+" "+start);
alert("Error: Start > End");
return;
}else if(parseInt(end) > EpisodesLinks.length){
alert("End > total nr of episodes. Max nr "+EpisodesLinks.length);
return;
}else if(!(isText || isHTML || isM3U8 || isIDM)){
alert("Please select one of the opitons");
return;
}
EpisodesLinks.reverse();
EpisodesName.reverse();
EpisodesLinks = EpisodesLinks.slice( parseInt(start)-1, parseInt(end));
EpisodesName = EpisodesName.slice(parseInt(start)-1,parseInt(end));
console.log(EpisodesLinks);
curretEP = EpisodesLinks[0];
getEp(curretEP);
}
function getImages(html){
//console.log(html);
imagesURL = html.match(/CapImg[^"']*/g);
//console.log(imagesURL);
toDataURL(imagesURL[0],function(data){allDone(data);});
}
function GetWords(html,callbackGetImages){
var form = html.split("formVerify")[1].split("]*>\s*)([^<]*)/g);
var word1 = x[0].split(">")[1].replace(/\s\s/g,"");
var word2 = x[1].split(">")[1].replace(/\s\s/g,"");
w = [word1,word2];
callbackGetImages();
}
function allDone(d){
console.log(d);
imageURLcount++;
images[imagecount] = cutImage64(cutImage64(d,3),2);
if(imagecount == 3){
console.log(images);
Complete();
}else{
toDataURL(imagesURL[imageURLcount],function(data){allDone(data);});
imagecount++;
}
}
function Complete() {
var postData = "";
//console.log(w);
for(var j = 0; j <2; j++){
var w1 = GM_getValue(w[j], false);
if(w1 !== false){
if(w1.includes(" ")){
w1 = w1.split(" ");
}else{
w1 = [w1];
}
for(var k =0; k < w1.length; k++){
for(var i = 0; i < images.length; i++){
if(images[i] === w1[k]){
postData += i+",";
}
}
}
}
}
if(postData.length == 4){
postdata(postData);
}else{
coutFailedCh++;
if(coutFailedCh < 3){
getNextEpisode(false);
}else{
coutFailedCh =0;
MobileFallBack();
}
}
}
function MobileFallBack(){
console.log("MobileFallBack: "+ EpisodesLinks[currnetEpIndex]);
var id = EpisodesLinks[currnetEpIndex].split("?id=")[1].split("&")[0];
var x = $.ajax({type: "POST", url:"http://kissanime.ru/Mobile/GetEpisode", data:{eID:id},async: false}).responseText;
x = x.split("|||")[0];
if(x.includes("rapidvideo")){
rapidvideo(x+'"');
}else{
EpisodesVideoLinks.push(x);
getNextEpisode(true);
}
}
function isCapacha(html){
return html.includes("formVerify");
}
function postdata(answer){
var data = {reUrl: curretEP, answerCap: answer};
var msg = $.ajax({type: "POST", url: "http://kissanime.ru/Special/AreYouHuman2",data: data ,async: false}).responseText;
if(server == 1){
beta(msg);
}else if(server == 2){
rapidvideo(msg);
}
}
function getNextEpisode(a){
images = ["","","",""];
imagecount = 0;
imagesURL = [];
imageURLcount = 0;
clickNr = 0;
w= ["",""];
if(a){currnetEpIndex++;}
if(currnetEpIndex < EpisodesLinks.length){
curretEP = EpisodesLinks[currnetEpIndex];
getEp(curretEP);
}else{
console.log(EpisodesVideoLinks);
ALLDONE();
console.log("DONE");
}
}
function ALLDONE(){
if(isText){
createTxtList();
}if(isHTML){
createHTMLlist();
}if(isM3U8){
createM3U8();
}if(isIDM){
createIDM();
}
}
function createTxtList(){
var list ="";
for(var i = 0; i < EpisodesVideoLinks.length; i++){
list += encodeURI(EpisodesVideoLinks[i]) + "[" + EpisodesName[i].replace(/[\s:\|\[\]\{\}]+/g,"_") + ".mp4\n";
}
$("#CaptchaInfo").show();
$("#CaptchaInfo").find("p").html("You need to download KissAnime Downloader.zip
Read this.");
download("list.txt","text/plain",list);
}
function createHTMLlist(){
var list ="";
for(var i = 0; i < EpisodesVideoLinks.length; i++){
list += '' + EpisodesName[i] + '(WATCH) ';
}
list += '
';
download("list.html","text/html",list);
}
function createM3U8(){
var list =" #EXTM3U\n\n";
for(var i = 0; i < EpisodesVideoLinks.length; i++){
list += '#EXTINF:-1,'+EpisodesName[i]+"\n"+encodeURI(EpisodesVideoLinks[i])+"\n\n";
}
$("#CaptchaInfo").show();
$("#CaptchaInfo").find("p").html("You can play this with VLC player.");
download("list.m3u8","text/plain",list);
}
function createIDM(){
var list ='IF EXIST %PROGRAMFILES(X86)%\n(cd "%ProgramFiles(x86)%\\Internet Download Manager")\nELSE (cd "%ProgramFiles%\\Internet Download Manager")\n';
for(var i = 0; i < EpisodesVideoLinks.length; i++){
//list += encodeURI(EpisodesVideoLinks[i]) + "[" + EpisodesName[i].replace(/[\s:\|\[\]\{\}]+/g,"_") + ".mp4\n";
list += 'IDMan.exe /n /p "%UserProfile%\\Downloads\\Anime\\'+ nameOfAnime+ '" /a /f "' + EpisodesName[i].replace(/[\s:\|\[\]\{\}]+/g,"_")+'.mp4" /d "'+encodeURI(EpisodesVideoLinks[i])+'"\n';
}
list += "IDMan.exe /s \n";
list += "IDMan.exe";
var zip = new JSZip();
zip.file("IDMan.bat", list);
zip.generateAsync({type:"blob"}).then(function(content) {
saveAs(content, nameOfAnime+".zip");
});
$("#CaptchaInfo").show();
$("#CaptchaInfo").find("p").html("You need to install Internet Download Manager
If Internet Download Manager shows errors just run IDMan.bat again.");
}
function download(filename, datatype, text) {
var element = document.createElement('a');
element.setAttribute('href', 'data:' + datatype + ';charset=utf-8,' + encodeURIComponent(text));
element.setAttribute('download', filename);
// element.setAttribute('target', '_blank');
// ^^ problems with safari
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
}
function beta(html){
var $htmlP = $($.parseHTML(html,document,true));
if(!isEval){
var script1 = $htmlP.find("script").toArray();
for(var i = 0; i < script1.length; i++){
var e = script1[i].innerHTML;
if(e.includes(" key ") || e.includes(" skH ") ){
eval(e);
isEval = true;
}
}
}
var x = $htmlP.find("#slcQualix").find("option").toArray();
loop1:for(var k =0; k < quality.length; k++){
for(var j =0; j < x.length; j++){
if(x[j].innerText.includes(quality[k])){
var decodedVideoLink = ovelWrap(x[j].value);
if(decodedVideoLink !== 0){
EpisodesVideoLinks.push(decodedVideoLink);
}else{
alert("Dekoding failed");
return;
}
break loop1;
}
}
}
getNextEpisode(true);
}
function rapidvideo(html){
var qS = ["720","480","360"];
var setQuality = "";
var url = html.match(/https:\/\/www.rapidvideo.com\/e\/[^"']*/g);
for(var i = 0; i < quality.length; i++){
if(qS.includes(quality[i])){
setQuality = quality[i]; break;
}
}
console.log(setQuality);
url += "&q="+setQuality+"p";
//alert(url);
GM_xmlhttpRequest({
method: "GET",
url: ""+url,
synchronous: true,
onload: function(response) {
//console.log(response);
var e = response.responseText.split('