// ==UserScript== // @name KissAnimeList // @version 0.92.8 // @description Integrates MyAnimeList into various sites, with auto episode tracking. // @author lolamtisch@gmail.com // @license CC-BY-4.0; https://creativecommons.org/licenses/by/4.0/legalcode // @license MIT // @supportURL https://github.com/lolamtisch/KissAnimeList/issues // @homepageURL https://github.com/lolamtisch/KissAnimeList // @iconURL https://raw.githubusercontent.com/lolamtisch/KissAnimeList/dev/Screenshots/KAL_Logo.png // // @include /^https?:\/\/kissanime\.ru\/(Anime\/|BookmarkList)/ // @include /^https?:\/\/kissanime\.to\/(Anime\/|BookmarkList)/ // // @include /^https?:\/\/kissmanga\.com\/(manga\/|BookmarkList)/ // // @include /^https?:\/\/myanimelist.net\/((anime(list)?|manga(list)?)(\.php\?.*id=|\/)|character|people|search)/ // // @include /^https?://www.masterani.me\/anime\/(info|watch)\// // // @include /^https?:\/\/(w+.?\.)?9anime\.to\/watch\// // @include /^https?:\/\/(w+.?\.)?9anime\.is\/watch\// // @include /^https?:\/\/(w+.?\.)?9anime\.ru\/watch\// // @include /^https?:\/\/(w+.?\.)?9anime\.ch\/watch\// // // @include /^https?:\/\/(www\.)?crunchyroll.com\// // @exclude /^https?:\/\/(www\.)?crunchyroll.com\/($|acct|anime|comics|edit|email|forum|home|inbox|library|login|manga|newprivate|news|notifications|order|outbox|pm|search|store|user|videos|affiliate_iframeplayer)/ // // @include /^https?:\/\/(w+.?\.)?gogoanime\.tv\/([^/]+$|category\/)/ // @include /^https?:\/\/(w+.?\.)?gogoanime\.io\/([^/]+$|category\/)/ // @include /^https?:\/\/(w+.?\.)?gogoanime\.in\/([^/]+$|category\/)/ // @include /^https?:\/\/(w+.?\.)?gogoanime\.se\/([^/]+$|category\/)/ // @include /^https?:\/\/(w+.?\.)?gogoanime\.sh\/([^/]+$|category\/)/ // @exclude /^https?:\/\/(w+.?\.)?gogoanime\.(tv|io|in|se|sh)\/(.*.html|anime-List)/ // // @include /^https?:\/\/(w+.?\.)?mangadex\.org\/(manga|title|chapter)\// // // @require http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js // @resource materialCSS https://code.getmdl.io/1.3.0/material.indigo-pink.min.css // @resource materialFont https://fonts.googleapis.com/icon?family=Material+Icons // @resource materialjs https://code.getmdl.io/1.3.0/material.min.js // @resource simpleBarCSS https://unpkg.com/simplebar@latest/dist/simplebar.css // @resource simpleBarjs https://unpkg.com/simplebar@latest/dist/simplebar.js // // @connect www.google.com // @connect ipv4.google.com // @connect myanimelist.net // @connect kissanimelist.firebaseio.com // @connect www.crunchyroll.com // @connect kissanime.ru // @connect kissmanga.com // @connect 9anime.to // @connect 9anime.is // @connect 9anime.ru // @connect 9anime.ch // @connect www3.gogoanime.tv // @connect www.masterani.me // @connect mangadex.org // @connect www.mangadex.org // @connect * // @grant GM_xmlhttpRequest // @grant GM_getValue // @grant GM_setValue // @grant GM_listValues // @grant GM_deleteValue // @grant GM_addStyle // @grant GM_getResourceText // @grant GM_openInTab // @grant GM_notification // @run-at document-start // @namespace https://greasyfork.org/users/92233 // @downloadURL https://update.greasyfork.icu/scripts/27564/KissAnimeList.user.js // @updateURL https://update.greasyfork.icu/scripts/27564/KissAnimeList.meta.js // ==/UserScript== (function() { 'use strict'; //if (window.top != window.self) {return; } //TODO: temporary workaround var googleover = 0; var debug = 0; var con = console; con = { log: function() {}, error: function() {}, debug: function() {} }; var element = new Image(); var debugging = GM_getValue('debugging', 0 ); if(debugging){ debug = 1; con.log = function(){ var args = Array.prototype.slice.call(arguments); args.unshift("color: blue;"); args.unshift("%c[KAL]"); console.log.apply(console, args); } }else{ Object.defineProperty(element, 'id', { get: function () { debug = 1; con.log = function(){ var args = Array.prototype.slice.call(arguments); args.unshift("color: blue;"); args.unshift("%c[KAL]"); console.log.apply(console, args); } } }); } console.log('%cKissAnimeList ['+GM_info.script.version+']', element,); var malBookmarks = GM_getValue( 'malBookmarks', 1 ); var classicBookmarks = GM_getValue( 'classicBookmarks', 0 ); if(classicBookmarks === 0){ var BookmarksStyle = 1; } var tagLinks = GM_getValue( 'tagLinks', 1 ); var epPredictions = GM_getValue( 'epPredictions', 1 ); var newEpInterval = GM_getValue( 'newEpInterval', 'null' ); var newEpNotification = GM_getValue( 'newEpNotification', 1 ); var newEpBorder = GM_getValue( 'newEpBorder', 'ff0000' ); var openInBg = GM_getValue( 'openInBg', 1 ); var newEpCR = GM_getValue( 'newEpCR', 0 ); var searchLinks = GM_getValue( 'searchLinks', 1 ); var kissanimeLinks = GM_getValue( 'kissanimeLinks', 1 ); var kissmangaLinks = GM_getValue( 'kissmangaLinks', 1 ); var masteraniLinks = GM_getValue( 'masteraniLinks', 1 ); var nineanimeLinks = GM_getValue( 'nineanimeLinks', 1 ); var crunchyrollLinks = GM_getValue( 'crunchyrollLinks', 1 ); var gogoanimeLinks = GM_getValue( 'gogoanimeLinks', 1 ); var mangadexLinks = GM_getValue( 'mangadexLinks', 1 ); var malThumbnail = GM_getValue( 'malThumbnail', 100 ); var miniMALonMal = GM_getValue( 'miniMALonMal', 0 ); var posLeft = GM_getValue( 'posLeft', 'left' ); var outWay = GM_getValue( 'outWay', 1 ); var miniMalWidth = GM_getValue( 'miniMalWidth', '30%' ); var miniMalHeight = GM_getValue( 'miniMalHeight', '90%' ); var displayFloatButton = GM_getValue( 'displayFloatButton', 1 ); var episodeInfoBox = GM_getValue( 'episodeInfoBox', 0 ); var episodeInfoSynopsis = GM_getValue( 'episodeInfoSynopsis', 1 ); var episodeInfoImage = GM_getValue( 'episodeInfoImage', 1 ); var episodeInfoSubtitle = GM_getValue( 'episodeInfoSubtitle', 1 ); var autoTracking = GM_getValue( 'autoTracking', 1 ); var mangaStore = GM_getValue( 'mangaStore', 1 ); var delay = GM_getValue( 'delay', 3 ); var currentMalData = null; var loadingText = 'Loading'; var curVersion = GM_info.script.version; function changelog(){ if(GM_getValue( 'VersionStamp', null ) == null || ($.now() - GM_getValue( 'VersionStamp', null )) > 345600000){ GM_deleteValue('Version'); GM_setValue('VersionStamp', $.now()); } if(curVersion != GM_getValue( 'Version', null )){ var message = '
'; if(GM_getValue( 'Version', null ) != null){ switch(curVersion) { case '0.86.4': message += 'Kissanimelist (v0.86)
- 9anime Support
- Link to last streaming page on Myanimelist\'s Animelist (Tags have to be activated)'; break; case '0.86.5': message += 'Kissanimelist (v0.86.5)
- add config Page (Can be found in Mal profile settings)'; break; case '0.87.1': message += 'Kissanimelist (v0.87.1)
- Materialize UI
- Add miniMAL popup'; break; case '0.87.3': message += 'Kissanimelist (v0.87.3)
- Crunchyroll Support (Video page only)
- Added MAL classic bookmark support
- Added next episode links in MAL bookmarks'; break; case '0.87.8': message += 'Kissanimelist (v0.87.8)
- Android Support
- Added Autoupdate delay settings'; break; case '0.87.9': message += 'Kissanimelist (v0.87.9)
- Gogoanime Support
- Crunchyroll multiple season support'; break; case '0.89.0': message += 'Check out the new Discord channel!

Kissanimelist (v0.89.0)
- Add Search to miniMAL
- Add MyAnimeList Bookmarks to miniMAL
- MyAnimeList Tags don\'t need to be activated anymore
- Mal2Crunchyroll links now hides remaining seasons
'; break; case '0.90.0': message += 'Changelog (v0.90.0):
- Added a shortcut for MiniMAL ( CTRL + M )
- Added MiniMAL position and dimension settings
- Added an option for displaying \'Episode Hoverinfo\'
- Added miniMAL to MyAnimeList
- Changed the \'Add to Mal\'-message, to a non-blocking message
- Fixed the database structure

New on KissAnimeLists Discord:
- Feed showing newly added episodes for each of the supported streaming sites.'; break; case '0.90.2': message += 'KissAnimeList (v0.90.2):
- Added support for 9anime.is and 9anime.ru'; break; case '0.91.0': message += 'Changelog (v0.91.0):

[Added]
- Feature: Thumbnails on MAL have been enlarged, with added resizing options.
- Feature: "Move out of the way"-feature, which moves the video when miniMAL is opened.
- Feature: "Continue watching"-links has been added to both the Overview-tab in miniMAL, and to the details-tab on MAL.
- Info-bubbles has been added to the settings tab in miniMAL.

[Changed]
- Updated the miniMAL styling.

[Fixed]
- miniMAL-button didn\'t always appear.'; break; case '0.91.1': message += 'KissAnimeList (v0.91.1):

[Fixed]
- KAL now works with 9anime\'s new layout'; break; case '0.91.2': message += 'KissAnimeList (v0.91.2):

[Fixed]
- New database-structure for 9anime urls'; break; case '0.91.3': message += 'KissAnimeList (v0.91.3):

[Fixed]
- Improved title recognition on 9anime & MasterAnime'; break; case '0.91.4': message += 'KissAnimeList (v0.91.4):

[Added]
- Support for 9anime.ch

[Fixed]
- "MAL thumbnails" and "Episode Hoverinfo" not working in Opera
- The miniMAL-button was not appearing for anime\'s without a MAL-url'; break; case '0.92.1': message += 'KissAnimeList (v0.92.0):

[Added]
- Feature: Display a tentative episode number and air time for anime.
- Feature: If autotracking is deactivated - Display a popup for manually updating
- Mangalist integration
- Added a section for characters to miniMAL.
- Added anime/manga switches for miniMAL\'s search and bookmarks
- Feature: Episode/Chapter releases check [BETA] (Deactivated by default)
'; break; case '0.92.5': message += 'KissAnimeList (v0.92.5):

[Added]
- Feature: mangadex.org support
- Feature: Hide MALs Manga Store'; break; } }else{ message += '

Important


This is going to be the last release for KissAnimeList.
Please migrate to the rewrite MAL-Sync.
It now comes as a browser extension, but you can still get a userscript version.

Chrome
Firefox
Greasyfork'; } if(message != '
'){ message += '
' flashm(message, false, false, true); $('.okChangelog').click(function(){ GM_setValue( 'Version', curVersion ); $('.flashPerm').remove(); }); }else{ GM_setValue( 'Version', curVersion ); } } } function getDeclaration(kalUrl){ var Kal = {}; if( kalUrl.indexOf("kissanime.ru") > -1 ){ //#########Kissanime######### Kal.domain = 'http://kissanime.ru'; Kal.textColor = '#d5f406'; Kal.dbSelector = 'Kissanime'; Kal.listType = 'anime'; Kal.bookmarkCss = ".listing tr td:nth-child(1){height: 150px;padding-left: 125px;} .listing tr td{vertical-align: top;}"; Kal.bookmarkFixCss = ".bigBarContainer {margin: 0px; width: 630px !important; text-align: left; float: left;}"; Kal.videoSelector = '#divContentVideo'; Kal.init = function() { checkdata(); } Kal.imageCache = function(selector) { return $('#rightside').find('img').attr('src'); }; Kal.isOverviewPage = function() { if(typeof kalUrl.split('/')[5] != 'undefined'){ if($('#centerDivVideo').length){ return false; } } return true; }; Kal.episodeListSelector = function() { return $(".listing a"); }; Kal.episodeListElementHref = function(selector) { return $.absoluteLink(selector.attr('href')); }; Kal.episodeListElementTitle = function(selector) { return selector.text().replace($('.bigChar').text(),''); }; Kal.episodeListNextElement = function(selector, index) { if ((index-1) > -1) { return Kal.episodeListSelector().eq(index-1); } return $(); }; Kal.handleNextLink = function(truelink, anime){ return truelink; }; Kal.urlEpisodePart = function(url) { return url.split("/")[5].split("?")[0]; }; Kal.urlAnimeIdent = function(url) { return url.split('/').slice(0,5).join('/'); }; Kal.urlAnimeSelector = function(url) { return url.split("/")[4].split("?")[0]; }; Kal.urlAnimeTitle = function(url) { return Kal.urlAnimeSelector(url); }; Kal.EpisodePartToEpisode = function(string) { var temp = []; temp = string.match(/[e,E][p,P][i,I]?[s,S]?[o,O]?[d,D]?[e,E]?\D?\d{3}/); if(temp !== null){ string = temp[0]; } temp = string.match(/\d{3}/); if(temp === null){ temp = string.match(/\d{2,}\-/); if(temp === null){ string = 0; }else{ string = temp[0]; } }else{ string = temp[0]; } return string; }; Kal.uiPos = function(selector) { selector.insertAfter($(".bigChar").first()); }; Kal.uiWrongPos = function(selector) { selector.insertAfter($(".bigChar").first()); }; Kal.uiHeadPos = function(selector) { selector.appendTo($(".barTitle").first()); }; Kal.docReady = function(data) { return $( document).ready(data); }; Kal.normalUrl = function(){ return Kal.urlAnimeIdent(kalUrl); }; Kal.epListReset = function(selector) { selector.parent().parent().css("background-color","initial"); }; Kal.epListActive = function(selector) { selector.parent().parent().css("background-color","#002966"); }; Kal.bookmarkEntrySelector = function() { return $(".trAnime"); }; Kal.nextEpLink = function(url) { return url+'/'+$('#selectEpisode option:selected').next().val(); }; Kal.classicBookmarkButton = function(selector, checkClassic) { selector.before('
Classic styling
 
'); }; Kal.bookmarkButton = function(selector, check) { selector.before('
MyAnimeList Bookmarks
 
'); }; Kal.BookmarksStyleAfterLoad = function() { if( BookmarksStyle == 1 ){ var optionsTarget = $("#optionsTarget"); var blackSpacer = ""; }else{ var optionsTarget = $("#divIsShared"); var blackSpacer = ''; } $(".head").html(''+blackSpacer+''); $( ".listing tr td:nth-child(1)" ).before(""); $( ".listing tr td:nth-child(1)" ).css("height","150px"); optionsTarget.after('
 
'); $("#clearCache").click( function(){ clearCache(); }); }; //########################### }else if( kalUrl.indexOf("kissmanga.com") > -1 ){ //#########Kissmanga######### Kal.domain = 'http://kissmanga.com'; Kal.textColor = '#72cefe'; Kal.dbSelector = 'Kissmanga'; Kal.listType = 'manga'; Kal.bookmarkCss = ".listing tr td:nth-child(1){height: 150px;padding-left: 125px;} .listing tr td{vertical-align: top;}"; if(classicBookmarks == 0){ Kal.bookmarkCss += '#leftside{width: 581px !important;} #rightside{ float: left !important; margin-left: 30px;}'; } Kal.bookmarkFixCss = ""; BookmarksStyle = ""; Kal.init = function() { Kal.docReady(function(){ if(!Kal.isOverviewPage()){ $('#divImage > p').each(function(index, el) { $(this).attr('id', index+1).addClass('kal-image'); }); var hash = window.location.hash; setTimeout(function(){ var page = parseInt(hash.substring(1)); if(!isNaN(page)){ window.location.hash = ''; window.location.hash = hash; } if($( "button:contains('Load Manga')" ).length){ $( "button:contains('Load Manga')").click(function(){ manga_loader(); }); } if($('.ml-images').length){ manga_loader(); } function manga_loader(){ setTimeout(function(){ var tempDocHeight = $(document).height(); if(hash && !(isNaN(page))) findPage(); function findPage(){ if($(".ml-images .ml-counter:contains('"+page+"')").length){ $("html, body").animate({ scrollTop: $(".ml-images .ml-counter:contains('"+page+"')").prev().offset().top }, "slow"); }else{ $("html, body").animate({ scrollTop: $(document).height() }, 0); setTimeout(function(){ $('html').scroll(); if(tempDocHeight != $(document).height()){ tempDocHeight = $(document).height(); findPage(); } }, 500); } } }, 2000); } var delayUpate = 1; $(document).scroll(function() { if(delayUpate){ delayUpate = 0; setTimeout(function(){ delayUpate = 1; }, 2000); $('.kal-image').each(function(index, el) { if($(this).isInViewport()){ if(window.location.hash != '#'+$(this).attr('id')){ history.pushState({}, null, '#'+$(this).attr('id')); checkdata(); } return false; } }); $('.ml-images img').each(function(index, el) { if($(this).isInViewport()){ if(window.location.hash != '#'+$(this).next().text()){ history.pushState({}, null, '#'+$(this).next().text()); checkdata(); } return false; } }); } }); }, 5000); } }); checkdata(); } Kal.imageCache = function(selector) { return $('#rightside').find('img').attr('src'); }; Kal.isOverviewPage = function() { if($("#malp").width() !== null){ return true; }else{ return false; } }; Kal.episodeListSelector = function() { return $(".listing a"); }; Kal.episodeListElementHref = function(selector) { return $.absoluteLink(selector.attr('href')); }; Kal.episodeListElementTitle = function(selector) { return selector.text().replace($('.bigChar').text(),''); }; Kal.episodeListNextElement = function(selector, index) { if ((index-1) > -1) { return Kal.episodeListSelector().eq(index-1); } return $(); }; Kal.handleNextLink = function(truelink, anime){ return truelink; }; Kal.urlEpisodePart = function(url) { return url.split("/")[5].split("?")[0]; }; Kal.urlAnimeIdent = function(url) { return url.split('/').slice(0,5).join('/'); }; Kal.urlAnimeSelector = function(url) { return url.split("/")[4].split("?")[0]; }; Kal.urlAnimeTitle = function(url) { return Kal.urlAnimeSelector(url); }; Kal.EpisodePartToEpisode = function(string) { var temp = []; try{ string = string.replace($('.bigChar').attr('href').split('/')[2],''); }catch(e){string = string.replace(kalUrl.split("/")[4],'');} temp = string.match(/[c,C][h,H][a,A]?[p,P]?[t,T]?[e,E]?[r,R]?\D?\d+/); if(temp === null){ string = string.replace(/[V,v][o,O][l,L]\D?\d+/,''); temp = string.match(/\d{3}/); if(temp === null){ temp = string.match(/\d+/); if(temp === null){ string = 0; }else{ string = temp[0]; } }else{ string = temp[0]; } }else{ string = temp[0].match(/\d+/)[0]; } return string; }; Kal.urlVolumePart = function(url) { try{ url = url.match(/[V,v][o,O][l,L]\D?\d{3}/)[0]; url = url.match(/\d+/)[0].slice(-3); }catch(e){ url = 1; } return url; } Kal.uiPos = function(selector) { selector.insertAfter($(".bigChar").first()); }; Kal.uiWrongPos = function(selector) { selector.insertAfter($(".bigChar").first()); }; Kal.uiHeadPos = function(selector) { selector.appendTo($(".barTitle").first()); }; Kal.docReady = function(data) { return $( document).ready(data); }; Kal.normalUrl = function(){ return Kal.urlAnimeIdent(kalUrl); }; Kal.epListReset = function(selector) { selector.parent().parent().css("background-color","initial"); }; Kal.epListActive = function(selector) { selector.parent().parent().css("background-color","#002966"); }; Kal.bookmarkEntrySelector = function() { return $(".listing tr:not(.head)"); }; Kal.nextEpLink = function(url) { return window.location.href; }; Kal.classicBookmarkButton = function(selector, checkClassic) { $("#rightside .barContent div").last().after('
Classic styling
 
'); }; Kal.bookmarkButton = function(selector, check) { $("#rightside .barContent div").last().after('
 
 
MyAnimeList Bookmarks
'); }; Kal.BookmarksStyleAfterLoad = function() { $(".head").html('');//'); $( ".listing tr td:nth-child(1)" ).before(""); $( ".listing tr td:nth-child(1)" ).css("height","150px"); $("#rightside .barContent div").last().after('
 
'); $("#clearCache").click( function(){ clearCache(); }); }; //########################### }else if( kalUrl.indexOf("masterani.me") > -1 ){ //#########Masterani.me######### Kal.domain = 'https://www.masterani.me'; Kal.textColor = 'white'; Kal.dbSelector = 'Masterani'; Kal.listType = 'anime'; Kal.bookmarkCss = ""; Kal.bookmarkFixCss = ""; Kal.videoSelector = '.ui.embed'; var winLoad = 0; Kal.init = function() { checkdata(); } Kal.imageCache = function(selector) { return $('.class').first().find('img').attr('src'); }; Kal.isOverviewPage = function() { if(Kal.normalUrl().split('/')[4] !== 'watch'){ return true; }else{ return false; } }; Kal.episodeListSelector = function() { return $(".thumbnail a.title"); }; Kal.episodeListElementHref = function(selector) { return $.absoluteLink(selector.attr('href')); }; Kal.episodeListElementTitle = function(selector) { return selector.find("div").text()+' ('+selector.find("span").text()+')'; }; Kal.episodeListNextElement = function(selector, index) { if ((index+1) > -1) { return Kal.episodeListSelector().eq(index+1); } return $(); }; Kal.handleNextLink = function(truelink, anime){ $('.menu.pagination').off('click').on( "click", function() { handleanime(anime); }); if(truelink == null){ var nextEp = parseInt(anime['.add_anime[num_watched_episodes]'])+1; if(nextEp <= parseInt(anime['totalEp'])){ return 'Ep. '+nextEp+''; } } return truelink; }; Kal.urlEpisodePart = function(url) { return url.split("/")[6].split("?")[0]; }; Kal.urlAnimeIdent = function(url) { return url.split('/').slice(0,6).join('/'); }; Kal.urlAnimeSelector = function(url) { return url.split("/")[5].split("?")[0]; }; Kal.urlAnimeTitle = function(url) { return Kal.urlAnimeSelector(url).replace(/^\d*-/,''); }; Kal.EpisodePartToEpisode = function(string) { return string; }; Kal.uiPos = function(selector) { selector.prependTo($("#stats").first()); }; Kal.uiWrongPos = function(selector) { selector.css('margin-top','5px').appendTo($(".ui.info.list").first()); }; Kal.uiHeadPos = function(selector) { selector.appendTo($("h1").first()); }; $(window).load(function(){ winLoad = 1; }); if(kalUrl.indexOf("/info/") > -1){ Kal.docReady = function(data) { var checkExist = setInterval(function() { if ($('#stats').length) { clearInterval(checkExist); if(winLoad == 0){ //winLoad = 1;alert(); return $(window).load(data); }else{ return $( document).ready(data); } } }, 500); }; }else{ Kal.docReady = function(data) { return $( document).ready(data); } }; Kal.normalUrl = function(){ return Kal.urlAnimeIdent(kalUrl); }; Kal.epListReset = function(selector) { selector.parent().parent().css("background-color","initial"); }; Kal.epListActive = function(selector) { selector.parent().parent().css("background-color","#002966"); }; Kal.bookmarkEntrySelector = function() { return $(".trAnime"); }; Kal.nextEpLink = function(url) { return 'https://www.masterani.me'+$('#watch .anime-info .actions a').last().attr('href'); }; Kal.classicBookmarkButton = function(selector, checkfix) { }; Kal.bookmarkButton = function(selector, check) { }; Kal.BookmarksStyleAfterLoad = function() { }; //########################### }else if( kalUrl.indexOf("9anime.") > -1 ){ //#########9anime######### Kal.domain = 'https://'+window.location.hostname; Kal.textColor = '#694ba1'; Kal.dbSelector = '9anime'; Kal.listType = 'anime'; Kal.bookmarkCss = ""; Kal.bookmarkFixCss = ""; Kal.videoSelector = '#player'; var winLoad = 0; Kal.init = function() { GM_addStyle('.headui a {color: inherit !important;}'); var tempEpisode = ""; Kal.docReady(function(){ document.addEventListener("load", event =>{ var curEpisode = $(".servers .episodes a.active").attr('data-base'); if(curEpisode !== tempEpisode){ tempEpisode = curEpisode; if($('.servers').height() == null){ tempEpisode = ""; return; } if(curEpisode != ''){ var animechange = {}; animechange['.add_anime[num_watched_episodes]'] = parseInt(curEpisode); animechange['checkIncrease'] = 1; animechange['forceUpdate'] = 1; setanime( Kal.normalUrl(),animechange); } } }, true); }); checkdata(); } Kal.imageCache = function(selector) { return $('.class').first().find('img').attr('src'); }; Kal.isOverviewPage = function() { if(Kal.normalUrl().split('/')[4] !== 'watch'){ return true; }else{ return false; } }; Kal.episodeListSelector = function() { return $(".servers .episodes a"); }; Kal.episodeListElementHref = function(selector) { return $.absoluteLink(selector.attr('href'))+'?ep='+selector.attr('data-base'); }; Kal.episodeListElementTitle = function(selector) { if(selector.text() == ''){ return ''; } return 'Episode '+selector.text(); }; Kal.episodeListNextElement = function(selector, index) { if ((index+1) > -1) { return Kal.episodeListSelector().eq(index+1); } return $(); }; Kal.handleNextLink = function(truelink, anime){ return truelink; }; Kal.urlEpisodePart = function(url) { return url.split('?ep=')[1]; }; Kal.urlAnimeIdent = function(url) { return url.split('/').slice(0,5).join('/'); }; Kal.urlAnimeSelector = function(url) { url = url.split("/")[4].split("?")[0]; if( url.indexOf(".") > -1 ){ url = url.split(".")[1]; } return url; }; Kal.urlAnimeTitle = function(url) { return url.split("/")[4].split("?")[0].split(".")[0]; }; Kal.EpisodePartToEpisode = function(string) { return string; }; Kal.uiPos = function(selector) { $('
'+selector.html()+'
').insertBefore($(".widget.info").first()); }; Kal.uiWrongPos = function(selector) { selector.css('font-size','14px').insertBefore($("#info").first()); $('.title').first().css('display', 'inline-block'); }; Kal.uiHeadPos = function(selector) { selector.addClass('title').css('margin-right','0').appendTo($(".widget.player .widget-title").first()); }; $(window).load(function(){ winLoad = 1; }); if(kalUrl.indexOf("/info/") > -1){ Kal.docReady = function(data) { var checkExist = setInterval(function() { if ($('#stats').length) { clearInterval(checkExist); if(winLoad == 0){ //winLoad = 1;alert(); return $(window).load(data); }else{ return $( document).ready(data); } } }, 500); }; }else{ Kal.docReady = function(data) { return $( document).ready(data); } }; Kal.normalUrl = function(){ return Kal.urlAnimeIdent(kalUrl); }; Kal.epListReset = function(selector) { selector.css("border-style","none"); }; Kal.epListActive = function(selector) { selector.css("border-color","#002966").css("border-width","2px").css("border-style","solid"); }; Kal.bookmarkEntrySelector = function() { return $(".trAnime"); }; Kal.nextEpLink = function(url) { return Kal.domain+$(".servers .episodes a.active").parent('li').next().find('a').attr('href'); }; Kal.classicBookmarkButton = function(selector, checkfix) { }; Kal.bookmarkButton = function(selector, check) { }; Kal.BookmarksStyleAfterLoad = function() { }; //########################### }else if( kalUrl.indexOf("crunchyroll.com") > -1 ){ //TODO: //http://www.crunchyroll.com/ace-of-the-diamond //http://www.crunchyroll.com/trinity-seven //#########Crunchyroll######### if(kalUrl == 'http://www.crunchyroll.com/'){ return; } Kal.domain = 'http://www.crunchyroll.com'; Kal.textColor = 'black'; Kal.dbSelector = 'Crunchyroll'; Kal.listType = 'anime'; Kal.bookmarkCss = ""; Kal.bookmarkFixCss = ""; Kal.videoSelector = '#showmedia_video_box_wide,#showmedia_video_box'; GM_addStyle('.headui a {color: black !important;} #malp{margin-bottom: 8px;}'); Kal.init = function() { $( document).ready(function(){ if( $('.season-dropdown').length > 1){ $('.season-dropdown').append('MAL'); $('.exclusivMal').click(function(){ $('#showview_content').before('
Show hidden seasons
'); var thisparent = $(this).parent(); $('.season-dropdown').not(thisparent).siblings().remove(); $('.season-dropdown').not(thisparent).remove(); $('.portrait-grid').css('display','block').find("li.group-item img.landscape").each(function() { void 0 === $(this).attr("src") && $(this).attr("src", $(this).attr("data-thumbnailUrl")) }), $('.exclusivMal').remove(); checkdata(); }); var season = new RegExp('[\?&]' + 'season' + '=([^&#]*)').exec(kalUrl); if(season != null){ season = season[1] || null; if(season != null){ season = decodeURIComponent(decodeURI(season)); $('.season-dropdown[title="'+season+'" i] .exclusivMal').first().click(); } } return; }else{ checkdata(); } }); } Kal.imageCache = function(selector) { return $('#rightside').find('img').attr('src'); }; Kal.isOverviewPage = function() { if(typeof kalUrl.split('/')[4] != 'undefined'){ if($('#showmedia_video').length){ return false; } } return true; }; Kal.episodeListSelector = function() { return $("#showview_content_videos .list-of-seasons .group-item a"); }; Kal.episodeListElementHref = function(selector) { return $.absoluteLink(selector.attr('href')); }; Kal.episodeListElementTitle = function(selector) { return selector.find('.series-title').text(); }; Kal.episodeListNextElement = function(selector, index) {//TODO if ((index-1) > -1) { return Kal.episodeListSelector().eq(index-1); } return $(); }; Kal.handleNextLink = function(truelink, anime){ return truelink; }; Kal.urlEpisodePart = function(url) { return url.split("/")[4]; }; Kal.urlAnimeIdent = function(url) { return url.split('/').slice(0,4).join('/'); }; /*$( document).ready(function(){//TODO var seasons = 0; $('.season-dropdown').each(function(index){ seasons = 1; checkdata('.season-dropdown:nth-child('+index+') '); $('.season-dropdown:nth-child('+index+')').css('background-color','red'); //alert($(this).text()); }); if(seasons == 0){ alert($('#source_showview h1 span').text()); } var script = ($("#template_body script")[1]).innerHTML; script = script.split('mediaMetadata =')[1].split('"name":"')[1].split(' -')[0]; alert(script); });*/ Kal.urlAnimeSelector = function(url) { if(Kal.isOverviewPage()){ if( $('.season-dropdown').length > 1){ $('
Kissanimelist does not support multiple seasons on one page
').uiPos(); throw new Error('Kissanimelist does not support multiple seasons'); }else{ if($('.season-dropdown').length){ return $('.season-dropdown').first().text(); }else{ return $('#source_showview h1 span').text(); } } }else{ var script = ($("#template_body script")[1]).innerHTML; script = script.split('mediaMetadata =')[1].split('"name":"')[1].split(' -')[0]; script = JSON.parse('"' + script.replace('"', '\\"') + '"'); //console.log(script); return script; return url.split("/")[3]; } }; Kal.urlAnimeTitle = function(url) { return Kal.urlAnimeSelector(url); }; Kal.EpisodePartToEpisode = function(string) { var temp = []; temp = string.match(/[e,E][p,P][i,I]?[s,S]?[o,O]?[d,D]?[e,E]?\D?\d+/); if(temp !== null){ string = temp[0]; }else{ string = ''; } temp = string.match(/\d+/); if(temp === null){ string = 1; }else{ string = temp[0]; } return string; }; Kal.uiPos = function(selector) {//TODO if(Kal.isOverviewPage()){ //selector.insertAfter($("h1.ellipsis")); selector.insertBefore($("#tabs").first()); $('#malStatus option').css('background-color','#f2f2f2'); $('#malUserRating option').css('background-color','#f2f2f2'); //selector.prependTo($('.season-dropdown')); } }; Kal.uiWrongPos = function(selector) {//TODO after second element //selector.prependTo($("#sidebar_elements").first()); }; Kal.uiHeadPos = function(selector) {//TODO selector.appendTo($(".ellipsis").first()); }; Kal.docReady = function(data) { return $( document).ready(data); }; Kal.normalUrl = function(){ return Kal.urlAnimeIdent(kalUrl); }; Kal.epListReset = function(selector) { selector.css("background-color","#fff"); }; Kal.epListActive = function(selector) { selector.css("background-color","#b2d1ff"); }; Kal.bookmarkEntrySelector = function() { //return $(".trAnime"); }; Kal.nextEpLink = function(url) { return 'http://www.crunchyroll.com'+$('.collection-carousel-media-link-current').parent().next().find('.link').attr('href'); }; Kal.classicBookmarkButton = function(selector, checkClassic) { }; Kal.bookmarkButton = function(selector, check) { }; Kal.BookmarksStyleAfterLoad = function() { }; //########################### }else if( kalUrl.indexOf("gogoanime.") > -1 ){ //#########Gogoanime.tv######### if(!kalUrl.split('/')[3]){ return; } Kal.domain = kalUrl.split('/').slice(0,3).join('/')+'/'; Kal.textColor = 'white'; Kal.dbSelector = 'Gogoanime'; Kal.listType = 'anime'; Kal.bookmarkCss = ""; Kal.bookmarkFixCss = ""; Kal.videoSelector = '.anime_video_body_watch_items'; var winLoad = 0; Kal.init = function() { GM_addStyle('.headui a {color: inherit !important;}'); checkdata(); } Kal.imageCache = function(selector) { return $('.class').first().find('img').attr('src'); }; Kal.isOverviewPage = function() { if(kalUrl.split('/')[3] === 'category'){ return true; }else{ return false; } }; Kal.episodeListSelector = function() { return $("#episode_related a"); }; Kal.episodeListElementHref = function(selector) { return Kal.domain+selector.attr('href').replace(' /',''); }; Kal.episodeListElementTitle = function(selector) { return selector.find("div.name").text(); }; Kal.episodeListNextElement = function(selector, index) { if ((index-1) > -1) { return Kal.episodeListSelector().eq(index-1); } return $(); }; Kal.handleNextLink = function(truelink, anime){ if(truelink == null){ var nextEp = parseInt(anime['.add_anime[num_watched_episodes]'])+1; if(nextEp <= parseInt(anime['totalEp'])){ return 'Ep '+nextEp+''; } } return truelink; }; Kal.urlEpisodePart = function(url) { return url.split("/")[3].split("?")[0].split('episode-')[1]; }; Kal.urlAnimeIdent = function(url) { if(url.split('/')[3] === 'category'){ return url.split('/').slice(0,5).join('/'); }else{ return url.split('/').slice(0,3).join('/') + '/category/' + url.split("/")[3].split("?")[0].split('-episode')[0]; } }; Kal.urlAnimeSelector = function(url) { return url.split("/")[4].split("?")[0]; }; Kal.urlAnimeTitle = function(url) { return Kal.urlAnimeSelector(url); }; Kal.EpisodePartToEpisode = function(string) { return string; }; Kal.uiPos = function(selector) { selector.prependTo($(".anime_info_body").first()); }; Kal.uiWrongPos = function(selector) {//TODO selector.css('margin-top','5px').appendTo($(".ui.info.list").first()); }; Kal.uiHeadPos = function(selector) {//TODO selector.appendTo($("h1").first()); }; Kal.docReady = function(data) { return $( document).ready(data); }; Kal.normalUrl = function(){ return Kal.urlAnimeIdent(kalUrl); }; Kal.epListReset = function(selector) { selector.css("background-color","#363636"); }; Kal.epListActive = function(selector) { selector.css("background-color","#002966"); }; Kal.bookmarkEntrySelector = function() { }; Kal.nextEpLink = function(url) { var url = Kal.domain + 's..' + $('.anime_video_body_episodes_r a').last().attr('href'); return url.replace('/s..',''); }; Kal.classicBookmarkButton = function(selector, checkfix) { }; Kal.bookmarkButton = function(selector, check) { }; Kal.BookmarksStyleAfterLoad = function() { }; //########################### }else if( kalUrl.indexOf("mangadex.org") > -1 ){ //#########Mangadex.org######### Kal.domain = 'https://www.mangadex.org'; Kal.textColor = 'black'; Kal.dbSelector = 'Mangadex'; Kal.listType = 'manga'; Kal.bookmarkCss = ""; Kal.bookmarkFixCss = ""; Kal.videoSelector = ''; Kal.init = function() { GM_addStyle('.headui a {color: inherit !important;} #malp{margin: 0 !important; margin-bottom: -4px !important;} #malStatus *, #malUserRating * {background: white !important;}'); Kal.docReady(function(){ if(!Kal.isOverviewPage()){ var waitforhead = setInterval(function() { console.log('check'); console.log(Kal.normalUrl()); if (Kal.normalUrl() != null) { console.log("Exists!"); clearInterval(waitforhead); checkdata(); } }, 100); var tempUrl = window.location.href; document.addEventListener("load", event =>{ if(tempUrl != window.location.href){ checkdata(); tempUrl = window.location.href; } }, true); }else{ checkdata(); } }) } Kal.imageCache = function(selector) { return $('.class').first().find('img').attr('src'); }; Kal.isOverviewPage = function() { if(kalUrl.split('/')[3] !== 'chapter'){ return true; }else{ return false; } }; Kal.episodeListSelector = function() { return $(".chapter-container > .row:not(:first-of-type) .chapter-row"); }; Kal.episodeListElementHref = function(selector) { return $.absoluteLink(selector.find("a").first().attr('href')); }; Kal.episodeListElementTitle = function(selector) { return selector.find("a").first().text().trim(); }; Kal.episodeListNextElement = function(selector, index) { if ((index-1) > -1) { return Kal.episodeListSelector().eq(index-1); } return $(); }; Kal.handleNextLink = function(truelink, anime){ return truelink; }; Kal.urlEpisodePart = function(url) { if(Kal.isOverviewPage()){ var relativUrl = url.replace(url.split('/').slice(0,3).join('/'),''); var someA = $('a[href*="'+relativUrl+'"]').parent().parent('.chapter-row'); if(someA.length){ var chapterNr = someA.attr('data-chapter'); if(chapterNr){ return chapterNr; } } }else{ var chapterId = url.split('/')[4]; var curOption = $('#jump-chapter option[value="'+chapterId+'"]'); if(curOption.length){ var temp = curOption.text().trim().match(/ch\.\D?\d+/i); if(temp !== null){ return temp[0]; } } } return null; }; Kal.urlVolumePart = function(url) { if(Kal.isOverviewPage()){ var relativUrl = url.replace(url.split('/').slice(0,3).join('/'),''); var someA = $('a[href*="'+relativUrl+'"]').parent().parent('.chapter-row'); if(someA.length){ var chapterNr = someA.attr('data-volume'); if(chapterNr){ return chapterNr; } } }else{ var chapterId = url.split('/')[4]; var curOption = $('#jump-chapter option[value="'+chapterId+'"]'); if(curOption.length){ var temp = curOption.text().trim().match(/vol\.\D?\d+/i); if(temp !== null){ return temp[0].match(/\d+/);; } } } return 0; }; Kal.urlAnimeIdent = function(url) { if(Kal.isOverviewPage()){ return kalUrl.split('/').slice(0,6).join('/').split('?')[0]; }else{ return $.absoluteLink($('a.manga-link').first().attr('href')); } }; Kal.urlAnimeSelector = function(url) { return url.split("/")[4].split("?")[0]; }; Kal.urlAnimeTitle = function(url) { var onMal = $('.list-inline a[href^="https://myanimelist.net/"]'); if(onMal.length){ return 'site:'+onMal.attr('href'); } return $('.panel-title').text().trim(); }; Kal.EpisodePartToEpisode = function(string) { if(!string) return ''; if(!(isNaN(parseInt(string)))){ return string; } var temp = []; temp = string.match(/ch\.\D?\d+/i); console.log(temp); if(temp !== null){ string = temp[0]; temp = string.match(/\d+/); if(temp !== null){ return temp[0]; } } return ''; }; Kal.uiPos = function(selector) { $(".container .card .edit.row > * > .row").first().after('
MyAnimeList:
'); selector.appendTo($(".container .card .kal-ui").first()); }; Kal.uiWrongPos = function(selector) {//TODO //selector.css('margin-top','5px').appendTo($(".ui.info.list").first()); }; Kal.uiHeadPos = function(selector) {//TODO selector.appendTo($("h6.card-header").first()); }; Kal.docReady = function(data) { return $( document).ready(data); }; Kal.normalUrl = function(){ return Kal.urlAnimeIdent(kalUrl); }; Kal.epListReset = function(selector) { selector.css("background-color","initial"); }; Kal.epListActive = function(selector) { selector.css("background-color","#cee1ff"); }; Kal.bookmarkEntrySelector = function() { return $(".trAnime"); }; Kal.nextEpLink = function(url) { return window.location.href; }; Kal.classicBookmarkButton = function(selector, checkfix) { }; Kal.bookmarkButton = function(selector, check) { }; Kal.BookmarksStyleAfterLoad = function() { }; //########################### }else if( kalUrl.indexOf("myanimelist.net") > -1 ){ googleover = 1; Kal.listType = kalUrl.split('/')[3]; Kal.isOverviewPage = function() { return false; }; Kal.urlAnimeSelector = function(url) { return $('.h1 span').first().text(); }; Kal.urlAnimeTitle = function(url) { return Kal.urlAnimeSelector(url); }; Kal.docReady = function(data) { return $( document).ready(data); }; if(mangaStore){ GM_addStyle('.di-b.mt4.mb16.ac, .left-info-block-manga-store-button, .manga-store-preview{display: none!important;}'); $( document).ready(function(){ var mangaStore = $('h2:contains("Manga Store")'); if( mangaStore.length){ mangaStore.parent('.pb24').css('display', 'none'); } }); } } return Kal; } var K = getDeclaration(window.location.href); //#######Anime or Manga###### if(K.listType == 'anime'){ var googleMalUrl = "site:myanimelist.net/Anime/+-site:myanimelist.net/Anime/genre/+-site:myanimelist.net/anime/season/+"; var middleType = 'episodes'; var middleVerb = 'watched'; var planTo = 'Plan to Watch'; var watching = 'Watching' }else{ var googleMalUrl = "site:myanimelist.net/manga/+-site:myanimelist.net/manga/genre/+-site:myanimelist.net/manga/season/+"; var middleType = 'chapters'; var middleVerb = 'read'; var planTo = 'Plan to Read'; var watching = 'Reading' } //########################### $.absoluteLink = function(url) { if (typeof url === "undefined") { return url; } if(!url.startsWith("http")) { url = K.domain + url;} return url; }; $.titleToDbKey = function(title) { if( window.location.href.indexOf("crunchyroll.com") > -1 ){ return encodeURIComponent(title.toLowerCase().split('#')[0]).replace(/\./g, '%2E'); } return title.toLowerCase().split('#')[0].replace(/\./g, '%2E'); }; //ignore loading if(document.title == "Please wait 5 seconds..."){ con.log("loading"); return; } if( window.location.href.indexOf("id="+GM_getValue( 'checkFail', 0 )) > -1 ){ $(window).load(function(){ GM_setValue( 'checkFail', 0 ) }); } function handleanime(anime){ $('.MalLogin').css("display","initial"); $('#AddMalDiv').remove(); miniMalButton(anime['malurl']); if(GM_getValue( K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(K.urlAnimeIdent(K.normalUrl())))+'/image' , null) == null ){ try{ GM_setValue( K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(K.urlAnimeIdent(K.normalUrl())))+'/image', K.imageCache('') ); }catch(e){} } if(anime['login'] === 0){ $('.MalLogin').css("display","none"); $("#MalData").css("display","flex"); $("#MalInfo").text(""); $("#malRating").attr("href", anime['malurl']); $("#malRating").after("          Please log in on MyAnimeList!"); getcommondata(anime['malurl']); return; } if(K.isOverviewPage()){ $("#flash").attr("anime", anime['.'+K.listType+'_id']); $("#malRating").attr("href", anime['malurl']); if(isNaN(anime['.add_'+K.listType+'[status]'])){ $('.MalLogin').css("display","none"); $("#malRating").after("               Add to MAL") $('#AddMal').click(function() { var anime = {}; anime['.add_'+K.listType+'[status]'] = 6; anime['forceUpdate'] = 1; setanime(K.normalUrl(),anime); }); }else{ $("#malTotal").text(anime['totalEp']); if(anime['totalEp'] == 0){ $("#malTotal").text('?'); } if(anime['forceUpdate'] != 2){ $("#malStatus").val(anime['.add_'+K.listType+'[status]']); $("#malEpisodes").val(anime['.add_anime[num_watched_episodes]']); $("#malUserRating").val(anime['.add_'+K.listType+'[score]']); //####Manga#### $("#malVolumes").val(anime['.add_manga[num_read_volumes]']); $("#malChapters").val(anime['.add_manga[num_read_chapters]']); } $("#malTotalVol").text(anime['totalVol']); if(anime['totalVol'] == 0){ $("#malTotalVol").text('?'); } $("#malTotalCha").text(anime['totalChap']); if(anime['totalChap'] == 0){ $("#malTotalCha").text('?'); } //############# } $("#MalData").css("display","flex"); $("#MalInfo").text(""); getcommondata(anime['malurl']); var episodelink; var linkbackup = null; var truelink = null; $('.lastOpen').remove(); K.episodeListSelector().each(function( index ) { if(K.listType == 'anime'){ if(debug){ $(this).after(' Episode: '+urlToEpisode(K.episodeListElementHref($(this)))); } try{ episodelink = urlToEpisode(K.episodeListElementHref($(this))); }catch(e) { episodelink = 1; } K.epListReset($(this)); if(episodelink == parseInt(anime['.add_anime[num_watched_episodes]'])){ K.epListActive($(this)); if(typeof K.episodeListElementHref(K.episodeListNextElement($(this), index)) !== "undefined"){ truelink = ''+K.episodeListElementTitle(K.episodeListNextElement($(this), index))+''; } } }else{ if(debug){ $(this).after(' Chapter: '+urlToChapter(K.episodeListElementHref($(this)))); $(this).after('Volume: '+urlToVolume(K.episodeListElementHref($(this)))); } episodelink = urlToChapter(K.episodeListElementHref($(this))); K.epListReset($(this)); if($(this).attr('href') == commentToUrl(anime['.add_manga[comments]'])){ $(this).parent().parent().css("background-color","#861515"); linkbackup = ''+K.episodeListElementTitle(K.episodeListNextElement($(this), index))+''; $(this).prepend('[Last opened]'); } if(episodelink == parseInt(anime['.add_manga[num_read_chapters]']) && parseInt(anime['.add_manga[num_read_chapters]']) != 0){ K.epListActive($(this)); truelink = ''+K.episodeListElementTitle(K.episodeListNextElement($(this), index))+''; } } }); truelink = K.handleNextLink(truelink, anime); if(K.listType == 'anime'){ $(".headui").html(truelink); }else{ if(truelink == null){ if(linkbackup != null){ $(".headui").html(linkbackup); } }else{ $(".headui").html(truelink); } } }else{ if(K.listType == 'anime'){ //update try{ var curEpisode = urlToEpisode(window.location.href); }catch(e) { var curEpisode = 1; } //if(curEpisode > anime['.add_anime[num_watched_episodes]']){ var animechange = {}; animechange['.add_anime[num_watched_episodes]'] = curEpisode; }else{ //update var curChapter = urlToChapter(window.location.href); var curVolume = urlToVolume(window.location.href); //if(curChapter > anime['.add_manga[num_read_volumes]']){ var animechange = {}; animechange['.add_manga[num_read_chapters]'] = curChapter; animechange['.add_manga[num_read_volumes]'] = curVolume; } animechange['checkIncrease'] = 1; setTimeout(function() { setanime( K.normalUrl(),animechange); }, delay * 1000); } } function urlToEpisode(url){ var string = K.urlEpisodePart(url); string = K.EpisodePartToEpisode(string); var Offset = GM_getValue(K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(K.urlAnimeIdent(url)))+'/Offset' , null); if( Offset != null){ string = parseInt(string)+parseInt(Offset); } if(parseInt(string) == 0){ string = 1; } return parseInt(string); } function urlToChapter(url){ return urlToEpisode(url); } function urlToVolume(url){ var string = K.urlVolumePart(url); return parseInt(string); } function commentToUrl(comment){ if(comment.indexOf("last:^") > -1){ try{ comment = comment.split("last:^")[1].split("^")[0]; comment = comment.split("http://kissmanga.com")[1]; comment = comment.split("#")[0]; }catch(e){} } return comment; } function handleTag(update, current, nextEp){ if(tagLinks == 0){return current;} var addition = "last::"+ btoa(update) +"::"; if(current.indexOf("last::") > -1){ current = current.replace(/last::[^\^]*\:\:/,addition); }else{ current = current+','+addition; } if(update.indexOf("masterani.me") > -1 && update.indexOf("/watch/") > -1){ update = update.replace('/watch/','/info/'); } if(K.listType == 'anime'){ GM_setValue( update+'/next', nextEp); }else{ GM_setValue( update+'/next', 'manga'); } GM_setValue( update+'/nextEp', K.nextEpLink(update)); return current; } function handleanimeupdate( anime, current){ if(K.listType == 'anime'){ if(anime['checkIncrease'] === 1){ anime['.add_anime[tags]'] = handleTag(K.urlAnimeIdent(window.location.href), current['.add_anime[tags]'], anime['.add_anime[num_watched_episodes]']+1); if(current['.add_anime[num_watched_episodes]'] >= anime['.add_anime[num_watched_episodes]']){ if((anime['.add_anime[status]'] === 2 || current['.add_anime[status]'] === 2) && anime['.add_anime[num_watched_episodes]'] === 1){ if (confirm('Rewatch anime?')) { anime['.add_anime[is_rewatching]'] = 1; }else{ return null; } }else{ return null; } } } if(current['.add_anime[status]'] !== 2 && parseInt(anime['.add_anime[num_watched_episodes]']) === current['totalEp'] && parseInt(anime['.add_anime[num_watched_episodes]']) != 0 ){ if (confirm('Set as completed?')) { anime['.add_anime[status]'] = 2; if(current['.add_anime[finish_date][day]'] === ''){ var Datec = new Date(); anime['.add_anime[finish_date][year]'] = Datec.getFullYear(); anime['.add_anime[finish_date][month]'] = Datec.getMonth()+1; anime['.add_anime[finish_date][day]'] = Datec.getDate(); } } } if(anime['checkIncrease'] === 1){ if(current['.add_anime[status]'] === 2 && anime['.add_anime[num_watched_episodes]'] === current['totalEp'] && current['.add_anime[is_rewatching]'] === 1){ if (confirm('Finish rewatching?')) { anime['.add_anime[is_rewatching]'] = 0; if(current['.add_anime[num_watched_times]'] === ''){ anime ['.add_anime[num_watched_times]'] = 1; }else{ anime ['.add_anime[num_watched_times]'] = parseInt(current['.add_anime[num_watched_times]'])+1; } } } if(current['.add_anime[status]'] !== 1 && current['.add_anime[status]'] !== 2 && anime['.add_anime[status]'] !== 2){ if (confirm('Start watching?')) { anime['.add_anime[status]'] = 1; }else{ return null; } } if(current['.add_anime[start_date][day]'] === ''){ var Datec = new Date(); anime['.add_anime[start_date][year]'] = Datec.getFullYear(); anime['.add_anime[start_date][month]'] = Datec.getMonth()+1; anime['.add_anime[start_date][day]'] = Datec.getDate(); } } if(current['.add_anime[status]'] !== 2 && anime['.add_anime[status]'] == 2 && parseInt(anime['.add_anime[num_watched_episodes]']) !== current['totalEp']){ anime['.add_anime[num_watched_episodes]'] = current['totalEp']; } return anime; }else{ if(anime['checkIncrease'] === 1){ current['checkIncrease'] = 1; anime['.add_manga[tags]'] = handleTag(K.urlAnimeIdent(window.location.href), current['.add_manga[tags]'], anime['.add_manga[num_read_chapters]']+1); if(current['.add_manga[num_read_chapters]'] >= anime['.add_manga[num_read_chapters]']){ if((anime['.add_manga[status]'] === 2 || current['.add_manga[status]'] === 2) && anime['.add_manga[num_read_chapters]'] === 1){ if (confirm('Reread Manga?')) { anime['.add_manga[is_rereading]'] = 1; }else{ return null; } }else{ return null; } } } if(current['.add_manga[status]'] !== 2 && parseInt(anime['.add_manga[num_read_chapters]']) === current['totalChap'] && parseInt(anime['.add_manga[num_read_chapters]']) != 0){ if (confirm('Set as completed?')) { anime['.add_manga[status]'] = 2; if(current['.add_manga[finish_date][day]'] === ''){ var Datec = new Date(); anime['.add_manga[finish_date][year]'] = Datec.getFullYear(); anime['.add_manga[finish_date][month]'] = Datec.getMonth()+1; anime['.add_manga[finish_date][day]'] = Datec.getDate(); } } } if(anime['checkIncrease'] === 1){ if(current['.add_manga[status]'] === 2 && anime['.add_manga[num_read_chapters]'] === current['totalChap'] && current['.add_manga[is_rereading]'] === 1){ if (confirm('Finish rereading?')) { anime['.add_manga[is_rereading]'] = 0; if(current['.add_manga[num_read_times]'] === ''){ anime ['.add_manga[num_read_times]'] = 1; }else{ anime ['.add_manga[num_read_times]'] = parseInt(current['.add_manga[num_read_times]'])+1; } } } if(current['.add_manga[status]'] !== 1 && current['.add_manga[status]'] !== 2 && anime['.add_manga[status]'] !== 2){ if (confirm('Start reading?')) { anime['.add_manga[status]'] = 1; }else{ return null; } } if(current['.add_manga[start_date][day]'] === ''){ var Datec = new Date(); anime['.add_manga[start_date][year]'] = Datec.getFullYear(); anime['.add_manga[start_date][month]'] = Datec.getMonth()+1; anime['.add_manga[start_date][day]'] = Datec.getDate(); } } if(current['.add_manga[status]'] !== 2 && anime['.add_manga[status]'] == 2 && parseInt(anime['.add_manga[num_read_chapters]']) !== current['totalChap']){ anime['.add_manga[num_read_chapters]'] = current['totalChap']; anime['.add_manga[num_read_volumes]'] = current['totalVol']; } return anime; } } function getcommondata(url){ var requestUrl = url var id = requestUrl.split('/')[4]; if(requestUrl.split('/')[3].toLowerCase() == 'anime'){ requestUrl = 'https://myanimelist.net/includes/ajax.inc.php?t=64&id='+id; }else{ requestUrl = 'https://myanimelist.net/includes/ajax.inc.php?t=65&id='+id; } GM_xmlhttpRequest({ method: "GET", url: requestUrl, synchronous: false, onload: function(response) { var data = response.responseText; //currentMalData = data; var rating = data.split('Score:')[1].split('<')[0]; $("#malRating").attr("href", url).text(rating); if($('#info-popup').css('display') == 'block' && $("#info-iframe").contents().find('#backbutton').css('display') == 'none'){ fillIframe(url, currentMalData); } } }); } var fireExists = 0; function getanime(thisUrl , callback, absolute = false, localListType = K.listType) { var thisUrl = thisUrl; var url = ''; var malurl = ''; var title = K.urlAnimeTitle(thisUrl); if(absolute === false){ //url = "http://myanimelist.net/anime.php?q=" + encodeURI(formattitle(title)); //url = "http://www.google.com/search?btnI&q=site:myanimelist.net/Anime/+-site:myanimelist.net/Anime/genre/+-site:myanimelist.net/anime/season/+"+encodeURI(formattitle(title)); url = 'https://kissanimelist.firebaseio.com/Data2/'+K.dbSelector+'/'+encodeURIComponent($.titleToDbKey(K.urlAnimeSelector(thisUrl))).toLowerCase()+'/Mal.json'; if(GM_getValue( K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(thisUrl))+'/Mal' , null) !== null ){ //if(con != console){ url = GM_getValue( K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(thisUrl))+'/Mal' , null); //} con.log('[GET] Cache:', url); } }else{ url = absolute; } if(url == '' || url == null){ GM_setValue(K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(K.normalUrl()))+'/Mal' , null); loadingText = "No MAL Entry!"; $("#MalInfo").text("No MAL Entry!"); miniMalButton(null); return; } if(url.indexOf("myanimelist.net/"+localListType+"/") > -1 && url.indexOf("google") === -1) { con.log("[GET] MyAnimeList: ", url); if(googleover === 0){ local_setValue( thisUrl, url ); } malurl = url; url = 'https://myanimelist.net/ownlist/'+localListType+'/'+url.split('/')[4]+'/edit?hideLayout';//TODOsplit4 ersetzten } con.log("[GET] Request:",url); GM_xmlhttpRequest({ method: "GET", url: url, synchronous: false, onload: function(response) { if(response.finalUrl != null){ url = response.finalUrl; } url = firefoxUrl(url, response.responseText); if(url.split("/").length > 6 && url.indexOf("myanimelist.net/"+localListType) > -1 && url.indexOf("google") === -1){ var partes = url.split("/"); url = partes[0]+"/"+partes[1]+"/"+partes[2]+"/"+partes[3]+"/"+partes[4]+"/"+partes[5]; getanime(thisUrl, callback, url); return; } if(url.indexOf("kissanimelist.firebaseio.com") > -1) { con.log("[GET] Firebase:",response.response); if(response.response !== 'null' && !(response.response.indexOf("error") > -1)){ fireExists = 1; //url = response.response.replace('"', '').replace('"', ''); url = 'https://myanimelist.net/'+localListType+'/'+response.response.split('"')[1]+'/'+response.response.split('"')[3]; if(response.response.split('"')[1] == 'Not-Found'){ $("#MalInfo").text("Not Found!"); miniMalButton(null); return; } }else{ url = "http://www.google.com/search?btnI&q="+googleMalUrl+encodeURI(formattitle(title)); } getanime(thisUrl, callback, url); return; } if(url.indexOf("ipv4.google.com") > -1) { googleover = 1; K.docReady(function() { flashm( "Google Overloaded
Solve captcha" , true); url = "http://myanimelist.net/"+localListType+".php?q=" + encodeURI(formattitle(title)); getanime(thisUrl, callback, url); }); return; } if(url.indexOf(localListType+".php") > -1) { var data = response.responseText; var link = data.split(' -1) { googleover = 0; var data = response.responseText; if(data.indexOf("getElementById('captcha')") > -1){ //Firefox no absolute url workaround TODO: googleover = 1; K.docReady(function() { flashm( "Google Overloaded", true);//
Solve captcha" , true); url = "http://myanimelist.net/"+localListType+".php?q=" + encodeURI(formattitle(title)); getanime(thisUrl, callback, url); }); return; } try{ var link = data.split('class="g"')[1].split('a href="')[1].split('"')[0]; if(link.indexOf("/url?") > -1){ link = link.split("?q=")[1].split("&")[0]; } getanime(thisUrl, callback, link); }catch(e){ url = "http://myanimelist.net/"+localListType+".php?q=" + encodeURI(formattitle(title)); getanime(thisUrl, callback, url); } } else { if(url.indexOf("myanimelist.net/"+localListType+"/") > -1) { con.log("[GET] Mal: ",url); if(googleover === 0){ local_setValue( thisUrl, url ); } getanime(thisUrl, callback, url); }else{ if(url.indexOf("myanimelist.net/login.php") > -1 || response.responseText.indexOf("Unauthorized") > -1) { flashm( "Please log in on MyAnimeList!" , true); var anime = {}; anime['login'] = 0; anime['malurl'] = malurl; K.docReady(function() { callback(anime); }); }else{ if(url.indexOf("myanimelist.net/"+localListType+".php") > -1) { $("#MalInfo").text("Not Found!"); flashm( "Anime not found" , true); miniMalButton(null); return; } var anime = getObject(response.responseText,malurl,localListType); K.docReady(function() { callback(anime); }); } } } } }); } function getObject(data,url,localListType){ if (typeof data.split('
[Check]" , true); } if(localListType == 'anime'){ var anime = {}; anime['malurl'] = url; anime['.csrf_token'] = data.split('\'csrf_token\'')[1].split('\'')[1].split('\'')[0]; if(data.indexOf('Add Anime') > -1) { anime['addanime'] = 1; } data = data.split('')[1].split('<')[0]); anime['name'] = data.split('')[1].split('<')[0]; anime['.anime_id'] = parseInt(data.split('name="anime_id"')[1].split('value="')[1].split('"')[0]); //input anime['.aeps'] = parseInt(data.split('name="aeps"')[1].split('value="')[1].split('"')[0]); anime['.astatus'] = parseInt(data.split('name="astatus"')[1].split('value="')[1].split('"')[0]); anime['.add_anime[status]'] = parseInt(getselect(data,'add_anime[status]')); //Rewatching if(data.split('name="add_anime[is_rewatching]"')[1].split('>')[0].indexOf('checked="checked"') >= 0){ anime['.add_anime[is_rewatching]'] = 1; } // anime['.add_anime[num_watched_episodes]'] = parseInt(data.split('name="add_anime[num_watched_episodes]"')[1].split('value="')[1].split('"')[0]); if( isNaN(anime['.add_anime[num_watched_episodes]']) ){ anime['.add_anime[num_watched_episodes]'] = ''; } anime['.add_anime[score]'] = getselect(data,'add_anime[score]'); anime['.add_anime[start_date][month]'] = getselect(data,'add_anime[start_date][month]'); anime['.add_anime[start_date][day]'] = getselect(data,'add_anime[start_date][day]'); anime['.add_anime[start_date][year]'] = getselect(data,'add_anime[start_date][year]'); anime['.add_anime[finish_date][month]'] = getselect(data,'add_anime[finish_date][month]'); anime['.add_anime[finish_date][day]'] = getselect(data,'add_anime[finish_date][day]'); anime['.add_anime[finish_date][year]'] = getselect(data,'add_anime[finish_date][year]'); anime['.add_anime[tags]'] = data.split('name="add_anime[tags]"')[1].split('>')[1].split('<')[0];//textarea anime['.add_anime[priority]'] = getselect(data,'add_anime[priority]'); anime['.add_anime[storage_type]'] = getselect(data,'add_anime[storage_type]'); anime['.add_anime[storage_value]'] = data.split('name="add_anime[storage_value]"')[1].split('value="')[1].split('"')[0]; anime['.add_anime[num_watched_times]'] = data.split('name="add_anime[num_watched_times]"')[1].split('value="')[1].split('"')[0]; anime['.add_anime[rewatch_value]'] = getselect(data,'add_anime[rewatch_value]'); anime['.add_anime[comments]'] = data.split('name="add_anime[comments]"')[1].split('>')[1].split('<')[0]; anime['.add_anime[is_asked_to_discuss]'] = getselect(data,'add_anime[is_asked_to_discuss]'); anime['.add_anime[sns_post_type]'] = getselect(data,'add_anime[sns_post_type]'); anime['.submitIt'] = data.split('name="submitIt"')[1].split('value="')[1].split('"')[0]; con.log('[GET] Object:',anime); return anime; }else{ var anime = {}; anime['malurl'] = url; anime['.csrf_token'] = data.split('\'csrf_token\'')[1].split('\'')[1].split('\'')[0]; if(data.indexOf('Add Manga') > -1) { anime['addmanga'] = 1; } data = data.split('')[1].split('<')[0]); anime['totalChap'] = parseInt(data.split('id="totalChap">')[1].split('<')[0]); anime['name'] = data.split('')[1].split('<')[0]; anime['.entry_id'] = parseInt(data.split('name="entry_id"')[1].split('value="')[1].split('"')[0]); anime['.manga_id'] = parseInt(data.split('name="manga_id"')[1].split('value="')[1].split('"')[0]); //input anime['volumes'] = parseInt(data.split('id="volumes"')[1].split('value="')[1].split('"')[0]); anime['mstatus'] = parseInt(data.split('id="mstatus"')[1].split('value="')[1].split('"')[0]); anime['.add_manga[status]'] = parseInt(getselect(data,'add_manga[status]')); //Rewatching if(data.split('name="add_manga[is_rereading]"')[1].split('>')[0].indexOf('checked="checked"') >= 0){ anime['.add_manga[is_rereading]'] = 1; } // anime['.add_manga[num_read_volumes]'] = parseInt(data.split('name="add_manga[num_read_volumes]"')[1].split('value="')[1].split('"')[0]); if( isNaN(anime['.add_manga[num_read_volumes]']) ){ anime['.add_manga[num_read_volumes]'] = ''; } anime['.add_manga[num_read_chapters]'] = parseInt(data.split('name="add_manga[num_read_chapters]"')[1].split('value="')[1].split('"')[0]); if( isNaN(anime['.add_manga[num_read_chapters]']) ){ anime['.add_manga[num_read_chapters]'] = ''; } anime['.add_manga[score]'] = getselect(data,'add_manga[score]'); anime['.add_manga[start_date][month]'] = getselect(data,'add_manga[start_date][month]'); anime['.add_manga[start_date][day]'] = getselect(data,'add_manga[start_date][day]'); anime['.add_manga[start_date][year]'] = getselect(data,'add_manga[start_date][year]'); anime['.add_manga[finish_date][month]'] = getselect(data,'add_manga[finish_date][month]'); anime['.add_manga[finish_date][day]'] = getselect(data,'add_manga[finish_date][day]'); anime['.add_manga[finish_date][year]'] = getselect(data,'add_manga[finish_date][year]'); anime['.add_manga[tags]'] = data.split('name="add_manga[tags]"')[1].split('>')[1].split('<')[0];//textarea anime['.add_manga[priority]'] = getselect(data,'add_manga[priority]'); anime['.add_manga[storage_type]'] = getselect(data,'add_manga[storage_type]'); anime['.add_manga[num_retail_volumes]'] = data.split('name="add_manga[num_retail_volumes]"')[1].split('value="')[1].split('"')[0]; anime['.add_manga[num_read_times]'] = data.split('name="add_manga[num_read_times]"')[1].split('value="')[1].split('"')[0]; anime['.add_manga[reread_value]'] = getselect(data,'add_manga[reread_value]'); anime['.add_manga[comments]'] = data.split('name="add_manga[comments]"')[1].split('>')[1].split('<')[0]; anime['.add_manga[is_asked_to_discuss]'] = getselect(data,'add_manga[is_asked_to_discuss]'); anime['.add_manga[sns_post_type]'] = getselect(data,'add_manga[sns_post_type]'); anime['.submitIt'] = data.split('name="submitIt"')[1].split('value="')[1].split('"')[0]; con.log('[GET] Object:', anime); return anime; } } var continueAllowed = 1; function setanime(thisUrl ,anime, actual = null, localListType = K.listType) { var undoAnime = $.extend({}, actual); if(actual === null){ var absolute = false; if(anime['malurl'] != null){ absolute = anime['malurl']; } getanime(thisUrl, function(actual){setanime(thisUrl , anime, actual, localListType);}, absolute, localListType); return; } var change = $.extend({},anime); if(anime['checkIncrease'] === 1 && autoTracking === 0 && continueAllowed){ if(actual['.add_anime[num_watched_episodes]'] < anime['.add_anime[num_watched_episodes]'] || actual['.add_manga[num_read_chapters]'] < anime['.add_manga[num_read_chapters]']){ if(localListType == 'anime'){ var epis = 'episode: '+anime['.add_anime[num_watched_episodes]']; }else{ var epis = 'chapter: '+anime['.add_manga[num_read_chapters]']+''; } var message = ''; flashm( message , true, true ); $('.sync').click(function(){ $('.flashinfo').remove(); continueAllowed = 0; setanime(thisUrl ,anime, actual, localListType); }); } return; } continueAllowed = 1; if(localListType == 'anime'){ var url = "https://myanimelist.net/ownlist/anime/"+actual['.anime_id']+"/edit"; if(actual['addanime'] === 1){ url = "https://myanimelist.net/ownlist/anime/add?selected_series_id="+actual['.anime_id']; flashConfirm('Add "'+actual['name']+'" to MAL?', function(){continueCall();}, function(){ if(change['checkIncrease'] == 1){ episodeInfo(change['.add_anime[num_watched_episodes]'], actual['malurl']); } }); return; } }else{ var url = "https://myanimelist.net/ownlist/manga/"+actual['.manga_id']+"/edit"; if(actual['addmanga'] === 1){ url = "https://myanimelist.net/ownlist/manga/add?selected_manga_id="+actual['.manga_id']; flashConfirm('Add "'+actual['name']+'" to MAL?', function(){continueCall();}, function(){}); return; } } continueCall(); function continueCall(){ anime = handleanimeupdate( anime, actual ); if(anime === null){ if(change['checkIncrease'] == 1 && localListType == 'anime'){ episodeInfo(change['.add_anime[num_watched_episodes]'], actual['malurl']); } return; } $.each( anime, function( index, value ){ actual[index] = value; }); anime = actual; var parameter = ""; $.each( anime, function( index, value ){ if(index.charAt(0) == "."){ if(!( (index === '.add_anime[is_rewatching]' || index === '.add_manga[is_rereading]') && parseInt(anime[index]) === 0)){ parameter += encodeURIComponent (index.substring(1))+"="+encodeURIComponent (value)+"&"; } } }); con.log('[SET] URL:', url); con.log('[SET] Object:', anime); GM_xmlhttpRequest({ method: "POST", url: url, synchronous: false, data: parameter, headers: { "Content-Type": "application/x-www-form-urlencoded", "accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" }, onload: function(response) { //con.log(response);//.responseText); if(anime['no_flash'] !== 1){ if(response.responseText.indexOf('Successfully') >= 0){ if(localListType == 'anime'){ var message = anime['name']; var split = '
'; var totalEp = anime['totalEp']; if (totalEp == 0) totalEp = '?'; if(typeof change['.add_anime[status]'] != 'undefined'){ var statusString = ""; switch (parseInt(anime['.add_anime[status]'])) { case 1: statusString = watching; break; case 2: statusString = 'Completed'; break; case 3: statusString = 'On-Hold'; break; case 4: statusString = 'Dropped'; break; case 6: statusString = planTo; break; } message += split + statusString; split = ' | ' } if(typeof change['.add_anime[num_watched_episodes]'] != 'undefined'){ message += split + 'Episode: ' + anime['.add_anime[num_watched_episodes]']+"/"+totalEp; split = ' | ' } if(typeof change['.add_anime[score]'] != 'undefined' && anime['.add_anime[score]'] != ''){ message += split + 'Rating: ' + anime['.add_anime[score]']; split = ' | ' } if(anime['checkIncrease'] == 1){ message += '
'; if(!episodeInfoBox){ flashm( message , false); $('.undoButton').click(function(){ undoAnime['checkIncrease'] = 0; setanime(thisUrl, undoAnime, null, localListType); }); }else{ episodeInfo(change['.add_anime[num_watched_episodes]'], actual['malurl'], message, function(){ undoAnime['checkIncrease'] = 0; setanime(thisUrl, undoAnime, null, localListType); $('.info-Mal-undo').remove(); if($('.flashinfo>div').text() == ''){ $('.flashinfo').remove(); } }); } }else{ flashm( message , false); } }else{ var message = anime['name']; var split = '
'; var totalVol = anime['totalVol']; if (totalVol == 0) totalVol = '?'; var totalChap = anime['totalChap']; if (totalChap == 0) totalChap = '?'; if(typeof change['.add_manga[status]'] != 'undefined'){ var statusString = ""; switch (parseInt(anime['.add_manga[status]'])) { case 1: statusString = watching; break; case 2: statusString = 'Completed'; break; case 3: statusString = 'On-Hold'; break; case 4: statusString = 'Dropped'; break; case 6: statusString = planTo; break; } message += split + statusString; split = ' | ' } if(typeof change['.add_manga[num_read_volumes]'] != 'undefined'){ message += split + 'Volume: ' + anime['.add_manga[num_read_volumes]']+"/"+totalVol; split = ' | ' } if(typeof change['.add_manga[num_read_chapters]'] != 'undefined'){ message += split + 'Chapter: ' + anime['.add_manga[num_read_chapters]']+"/"+totalChap; split = ' | ' } if(typeof change['.add_manga[score]'] != 'undefined' && anime['.add_manga[score]'] != ''){ message += split + 'Rating: ' + anime['.add_manga[score]']; split = ' | ' } if(anime['checkIncrease'] == 1){ message += '
'; if(!episodeInfoBox){ flashm( message , false); $('.undoButton').click(function(){ undoAnime['checkIncrease'] = 0; setanime(thisUrl, undoAnime, null, localListType); }); }else{ message = "
"+ message +"
"; flashm ( message , false, true); $('.undoButton').click(function(){ undoAnime['checkIncrease'] = 0; setanime(thisUrl, undoAnime, null, localListType); $('.info-Mal-undo').remove(); if($('.flashinfo>div').first().text() == ''){ $('.flashinfo').remove(); } }); } }else{ flashm( message , false); } } }else{ flashm( "Anime update failed" , true); if(anime['checkIncrease'] !== 1){ try{ checkdata(); }catch(e){} } } if(anime['forceUpdate'] == 1 || anime['forceUpdate'] == 2){ try{ checkdata(); }catch(e){} } } } }); } } function firefoxUrl(url, html){ if(html.indexOf('property="og:url"') > -1){ url = html.split('= 0)) && ( GM_getValue(K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(thisUrl))+'/Mal' , null) == null || newCorrection || GM_getValue(K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(thisUrl))+'/Crunch' , null) == 'no')){ var param = { Kiss: thisUrl, Mal: malurl}; if(K.dbSelector == 'Crunchyroll'){ param = { Kiss: window.location.href+'?..'+$.titleToDbKey(K.urlAnimeSelector()), Mal: malurl}; if(K.isOverviewPage()){ param = null; if(GM_getValue(K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(thisUrl))+'/Crunch' , null) == null){ GM_setValue( K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(thisUrl))+'/Crunch', 'no' ); } }else{ GM_setValue( K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(thisUrl))+'/Crunch', 'yes' ); } } var toDB = 1; if(fireExists) toDB = 0; if(newCorrection){ toDB = 0; if (confirm('Submit database correction request? \n If it does not exist on MAL, please leave empty.')) { toDB = 1; param['newCorrection'] = true; } } if(toDB == 1){ GM_xmlhttpRequest({ url: 'https://kissanimelist.firebaseio.com/Data2/Request/'+K.dbSelector+'Request.json', method: "POST", data: JSON.stringify(param), onload: function () { con.log("[DB] Send to database:",param); }, onerror: function(error) { con.log("[DB] Send to database:",error); } }); } } GM_setValue( K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(thisUrl))+'/Mal', malurl ); } function getselect(data, name){ var temp = data.split('name="'+name+'"')[1].split('')[0]; if(temp.indexOf('selected="selected"') > -1){ temp = temp.split(' -1){ return temp[i].split('value="')[1].split('"')[0]; } } }else{ return ''; } } function flashm(text,error = true, info = false, permanent = false){ if(!$('#flash-div-top').length){ initflashm(); } con.log("[Flash] Message:",text); if(error === true){ var colorF = "#3e0808"; }else{ var colorF = "#323232"; } if(permanent){ $('#flash-div-top').prepend(''); $('.flashPerm').delay(2000).slideDown(800); }else{ if(info){ $('.flashinfo').removeClass('flashinfo').delay(2000).fadeOut({ duration: 400, queue: false, complete: function() { $(this).remove(); }}); $('#flashinfo-div').addClass('hover').append(''); $('.flashinfo').slideDown(800).delay(4000).queue(function() { $('#flashinfo-div').removeClass('hover'); $(this).css('max-height', '8px');}); }else{ $('.flash').removeClass('flash').fadeOut({ duration: 400, queue: false, complete: function() { $(this).remove(); }}); var mess =''; if($('.flashinfo').length){ $('.flashinfo').before(mess); }else{ $('#flash-div').append(mess); } $('.flash').slideDown(800).delay(4000).slideUp(800, function() { $(this).remove(); }); } } } function flashConfirm(message, yesCall, cancelCall){ $('.flashPerm').remove(); var rNumber = Math.floor((Math.random() * 1000) + 1); message = '
' + message + '
'; flashm(message, false, false, true); $( '.Yes'+rNumber ).click(function(){ $(this).parentsUntil('.flashPerm').remove(); yesCall(); }); $( '.Cancel'+rNumber ).click(function(){ $(this).parentsUntil('.flashPerm').remove(); cancelCall(); }); } function initflashm(){ GM_addStyle('.flashinfo{\ transition: max-height 2s;\ }\ .flashinfo:hover{\ max-height:5000px !important;\ z-index: 2147483647;\ }\ .flashinfo .synopsis{\ transition: max-height 2s, max-width 2s ease 2s;\ }\ .flashinfo:hover .synopsis{\ max-height:9999px !important;\ max-width: 500px !important;\ transition: max-height 2s;\ }\ #flashinfo-div{\ z-index: 2;\ transition: 2s;\ }\ #flashinfo-div:hover, #flashinfo-div.hover{\ z-index: 2147483647;\ }\ \ #flash-div-top, #flash-div, #flashinfo-div{\ font-family: "Helvetica","Arial",sans-serif;\ color: white;\ font-size: 14px;\ font-weight: 400;\ line-height: 17px;\ }\ #flash-div-top h2, #flash-div h2, #flashinfo-div h2{\ font-family: "Helvetica","Arial",sans-serif;\ color: white;\ font-size: 14px;\ font-weight: 700;\ line-height: 17px;\ padding: 0;\ margin: 0;\ }\ #flash-div-top a, #flash-div a, #flashinfo-div a{\ color: #DF6300;\ }'); $('body').after('
\
\
'); } function updatebutton(){ buttonclick(); } function buttonclick(){ var anime = {}; if(K.listType == 'anime'){ anime['.add_anime[num_watched_episodes]'] = $("#malEpisodes").val(); }else{ anime['.add_manga[num_read_volumes]'] = $("#malVolumes").val(); anime['.add_manga[num_read_chapters]'] = $("#malChapters").val(); } anime['.add_'+K.listType+'[score]'] = $("#malUserRating").val(); anime['.add_'+K.listType+'[status]'] = $("#malStatus").val(); anime['forceUpdate'] = 2; setanime(K.normalUrl(), anime); } function formattitle(title) { con.log("[TITLE] Title:",title); title = title.replace(/-dub$/i,''); title = title.replace(/-sub$/i,''); title = title.replace(/\(dub\)$/i,''); title = title.replace(/\(sub\)$/i,''); title = title.replace(' ','-'); title = title.replace(' ','-'); title = title.replace(' ','-'); title = title.replace(' ','-'); title = title.replace(' ','-'); title = title.replace(' ','-'); title = title.replace(' ','-'); title = title.replace(' ','-'); title = title.replace(' ','-'); title = title.replace("s2"," 2nd season"); title = title.replace("s3"," 3nd season"); title = title.replace("s4"," 4nd season"); title = title.replace("s5"," 5nd season"); title = title.replace("s6"," 6nd season"); title = title.replace("s7"," 7nd season"); title = title.replace("s8"," 8nd season"); title = title.replace("s9"," 9nd season"); //title = title.replace(/[-,.?:'"\\!@#$%^&\-_=+`~;]/g,""); con.log("[TITLE] Formated:",title); return title; } function episodeInfo(episode, malUrl, message = '', clickCallback = function(){}){ //message = ''; if(episodeInfoBox){ con.log('[Hover] Episode:',malUrl+'/episode/'+episode); GM_xmlhttpRequest({ url: malUrl+'/episode/'+episode, method: "GET", onload: function (response) { if(response.response != null){ if( response.response.indexOf("Sorry, this anime doesn't seem to have any episode information yet.") > -1 ){ if(message == ''){ return; } } if(message != ''){ message = "
"+ message +"
"; } var data = response.response; var synopsis = ''; var epTitle = ''; var epSubTitle = ''; var imgUrl = ""; try{ epTitle = data.split('class="fs18 lh11"')[1].split('')[0].split('')[1]; if(epTitle.trim() != ''){ epTitle = '#'+episode+" - "+epTitle+'
'; }else{ epTitle = ''; } }catch(e){} if(episodeInfoSubtitle){ try{ epSubTitle = data.split('

')[0].split('>')[1].replace(/^\s+/g, ""); epSubTitle = " "+epSubTitle+'
'; }catch(e){} } if(episodeInfoSynopsis){ try{ synopsis = data.split('Synopsis')[1].split('

')[0].replace(/^\s+/g, ""); if( synopsis.indexOf("badresult") > -1 || synopsis == ""){ synopsis = ""; }else{ synopsis = '
'+synopsis+'
'; } }catch(e){} } var imgHtml = ''; if(episodeInfoImage){ try{ imgUrl = data.split('"isCurrent":true')[0].split('{').slice(-1)[0].split('"thumbnail":"')[1].split('"')[0].replace(/\\\//g, '/'); }catch(e){} if(imgUrl != ''){ imgHtml = ''; } } var synopsisHtml = '
'+synopsis+'
'; if(epTitle != ''){ flashm ( '
'+epTitle + epSubTitle + imgHtml + "
"+ message +"
" + synopsisHtml, false, true); }else if( message != '' ){ flashm ( message , false, true); } $('.undoButton').click(clickCallback); } }, onerror: function(error) { con.log("[episodeInfo] error:",error); } }); } } var miniMalButtonLate = ''; var miniMalButtonKey = 0; function miniMalButton(url = null){ miniMalButtonLate = url; $(".open-info-popup").unbind('click').show().click( function(){ if($('#info-popup').css('display') == 'none'){ document.getElementById('info-popup').style.display = "block"; fillIframe(url, currentMalData); $('.floatbutton').fadeOut(); }else{ document.getElementById('info-popup').style.display = "none"; $('.floatbutton').fadeIn(); } }); if(!miniMalButtonKey){ miniMalButtonKey = 1; $("#info-iframe").contents().keydown(function(e) { keys(e); }); $(document).keydown(function(e) { keys(e); }); } function keys(e){ if (e.ctrlKey && e.keyCode === 77) { if($('#info-popup').css('display') == 'none'){ document.getElementById('info-popup').style.display = "block"; fillIframe(url, currentMalData); $('.floatbutton').fadeOut(); }else{ document.getElementById('info-popup').style.display = "none"; $('.floatbutton').fadeIn(); } } } } function atobURL( encoded ){ try{ return atob( encoded ); }catch(e){ return encoded; } } $.urlParam = function(name){ var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href); if (results==null){ return null; } else{ return decodeURI(results[1]) || 0; } } function getTooltip(text, style = '', direction = 'top'){ var rNumber = Math.floor((Math.random() * 1000) + 1); return '
🛈
\
'+text+'
'; } //Status: 1 = watching | 2 = completed | 3 = onhold | 4 = dropped | 6 = plan to watch | 7 = all function getUserList(status = 1, localListType = 'anime', singleCallback = null, finishCallback = null, fullListCallback = null, continueCall = null, username = null, offset = 0, templist = []){ con.log('[UserList]', 'username: '+username, 'status: '+status, 'offset: '+offset); if(username == null){ getMalUserName(function(usernameTemp){ if(usernameTemp == false){ flashm( "Please log in on
MyAnimeList!" , true); }else{ getUserList(status, localListType, singleCallback, finishCallback, fullListCallback, continueCall, usernameTemp, offset, templist); } }); return; } var url = 'http://myanimelist.net/'+localListType+'list/'+username+'/load.json?offset='+offset+'&status='+status; GM_xmlhttpRequest({ method: "GET", url: url, synchronous: false, onload: function(response) { var data = $.parseJSON(response.response); if(singleCallback){ if(!data.length) singleCallback(false, 0, 0); for (var i = 0; i < data.length; i++) { singleCallback(data[i], i+offset+1, data.length+offset); } } if(fullListCallback){ templist = templist.concat(data); } if(data.length > 299){ if(continueCall){ continueCall(function(){ getUserList(status, localListType, singleCallback, finishCallback, fullListCallback, continueCall, username, offset + 300, templist); }); }else{ getUserList(status, localListType, singleCallback, finishCallback, fullListCallback, continueCall, username, offset + 300, templist); } }else{ if(fullListCallback) fullListCallback(templist); if(finishCallback) finishCallback(); } } }); } function getMalUserName(callback){ var url = 'https://myanimelist.net/editlist.php?hideLayout'; GM_xmlhttpRequest({ method: "GET", url: url, synchronous: false, onload: function(response) { try{ var username = response.response.split('USER_NAME = "')[1].split('"')[0]; }catch(e){ var username = false; } con.log('[Username]', username); callback(username); } }); } $.fn.isInViewport = function() { var elementTop = $(this).offset().top; var elementBottom = elementTop + $(this).outerHeight(); var viewportTop = $(window).scrollTop(); var viewportBottom = viewportTop + $(window).height(); return elementBottom > viewportTop && elementTop < viewportBottom; }; var uiLoaded = 0; function checkdata(){ if(K.normalUrl() !== ""){ getanime(K.normalUrl(), function(anime){handleanime(anime);}); }else{ alert(error); } K.docReady(function() { var wrapStart = ''; var wrapEnd = ''; var ui = '

'; ui += ''+loadingText+''; ui += '____'; ui += wrapEnd; //ui += ''; wrapStart = ''; ui += ''; ui += '

'; var uihead =''; uihead += '

'; uihead += ''; uihead += '

'; var uiwrong =''; uiwrong += ''; if(!uiLoaded){ uiLoaded = 1; K.uiPos($(ui)); K.uiWrongPos($(uiwrong)); K.uiHeadPos($(uihead)); $( "#malEpisodes" ).change(function() { updatebutton(); }); //####Manga#### $( "#malVolumes" ).change(function() { updatebutton(); }); $( "#malChapters" ).change(function() { updatebutton(); }); //############# $( "#malUserRating" ).change(function() { updatebutton(); }); $( "#malStatus" ).change(function() { updatebutton(); }); createIframe(); //#######Kissanime####### $("#btnRemoveBookmark").click(function() { var anime = {}; anime['.add_'+K.listType+'[status]'] = 4; anime['forceUpdate'] = 1; setanime(K.normalUrl(),anime); }); $("#btnAddBookmark").click(function() { var anime = {}; anime['.add_'+K.listType+'[status]'] = 6; anime['forceUpdate'] = 1; setanime(K.normalUrl(),anime); }); //####################### } }); } var xml =""; var foundAnime = []; //var imageBackup = "Mal-img"; var image = "image"; function getMalXml(user = "", callback = null){ var url = "https://myanimelist.net/editprofile.php?go=privacy"; if(user !== ""){ url = "https://myanimelist.net/malappinfo.php?u="+user+"&status=all&type="+K.listType; con.log("XML Url:", url); } GM_xmlhttpRequest({ method: "GET", url: url, synchronous: false, onload: function(response) { if(url === "https://myanimelist.net/editprofile.php?go=privacy"){ try{ user = response.responseText.split('MyAnimeList!" , true); $('.listing tr td:nth-child(1)').css('height', 'initial'); $('.listing tr td:nth-child(1)').css('padding-left', '0'); return; } con.log("User:" ,user); getMalXml(user, callback); return; } if(callback == null){ xml = $(response.responseXML); setAll(); }else{ callback( $(response.responseXML) ); } } }); } function encodeurl(string){ return encodeURIComponent(encodeURIComponent(string).replace('.', '%2E')); } function setBookmarkAnime(value, baseurl, target, last = 0){ var id = value.split("/")[4]; con.log(id); foundAnime.push(id); var xmlAnime = xml.find('series_'+K.listType+'db_id:contains('+id+')').parent(); getdata(baseurl, function(value) { setimage(value, xmlAnime, target, baseurl); }, image); if(xmlAnime.length === 0){ if(id == 'Not-Found'){ target.find(".MalData").first().append("No Mal"); }else{ target.find(".MalData").first().append("Add to Mal").find("a").click(function() { var anime = {}; anime['.add_'+K.listType+'[status]'] = 6; setanime(baseurl,anime); }); } }else{ var totalEp = xmlAnime.find("series_"+middleType).first().text(); if(totalEp === '0'){ totalEp = "?"; } setepisode (xmlAnime.find("my_"+middleVerb+"_"+middleType).first().text(), totalEp , target, baseurl); setstatus (xmlAnime.find("my_status").first().text() , target, baseurl); setscore (xmlAnime.find("my_score").first().text() , target, baseurl); } if(last === 1){ //TODO: con.log(foundAnime); //MalExistsOnKiss(foundAnime); } } function setimage(value, xmlAnime, target, baseurl){ if(classicBookmarks == 0){ if(typeof value === "undefined" || value === null){ if(baseurl === ""){ return; } //getdata(baseurl, function(value) { setimage(value, xmlAnime, target, ""); }, imageBackup); return; } target.find("td").first().html(""); /*target.find("td").first().find("img").error(function() { //TODO: Send to Database and only execute one time so no loop getdata(baseurl, function(value) { setimage(value, xmlAnime, target, ""); }, imageBackup); });*/ } } function setepisode(episode, totalEp, target, baseurl){ target.find(".MalData").first().append('
'+episode+' / '+totalEp+'
'); target.find(".MalData").first().find('.malEpisode').click( function() { $( this ).find('.input').css('display', 'initial'); $( this ).find('.normal').css('display', 'none'); }).change(function() { var anime = {}; anime['.add_'+K.listType+'[num_'+middleVerb+'_'+middleType+']'] = $(this).parent().find('.malEpisode').find('.input').val(); anime['.add_'+K.listType+'[status]'] = $(this).parent().find('.malStatus').val(); anime['.add_'+K.listType+'[score]'] = $(this).parent().find('.malUserRating').val(); setanime(baseurl,anime); }); } function setstatus(value, target, baseurl){ if(target.find(".malStatus").first().height() === null){ var ui = ""; ui += ''; target.find(".MalData").first().append(""+ui).find('.malStatus').change(function() { var anime = {}; anime['.add_'+K.listType+'[num_'+middleVerb+'_'+middleType+']'] = $(this).parent().find('.malEpisode').find('.input').val(); anime['.add_'+K.listType+'[status]'] = $(this).parent().find('.malStatus').val(); anime['.add_'+K.listType+'[score]'] = $(this).parent().find('.malUserRating').val(); setanime(baseurl,anime); }); } target.find(".malStatus").first().val(value); } function setscore(value, target, baseurl){ if(target.find(".malUserRating").first().height() === null){ var ui = ""; ui += ''; target.find(".MalData").first().append("
"+ui).find('.malUserRating').change(function() { var anime = {}; anime['.add_'+K.listType+'[num_'+middleVerb+'_'+middleType+']'] = $(this).parent().find('.malEpisode').find('.input').val(); anime['.add_'+K.listType+'[status]'] = $(this).parent().find('.malStatus').val(); anime['.add_'+K.listType+'[score]'] = $(this).parent().find('.malUserRating').val(); setanime(baseurl,anime); }); } target.find(".malUserRating").first().val(value); } function clearCache(){ con.log('Before',GM_listValues()); var cacheArray = GM_listValues(); $.each( cacheArray, function( index, cache){ if(/^[^/]+\/[^/]+\/Mal$/.test(cache)){ GM_deleteValue(cache); } if(/^[^/]+\/[^/]+\/MalToKiss$/.test(cache)){ GM_deleteValue(cache); } if(/^[^/]+\/[^/]+\/bdid$/.test(cache)){ GM_deleteValue(cache); } if(/^[^/]+\/[^/]+\/image$/.test(cache)){ GM_deleteValue(cache); } if(/^newEp_.*/.test(cache)){ GM_deleteValue(cache); } if('timestampUpdate/release' == cache){ GM_deleteValue(cache); } }); con.log('After',GM_listValues()); flashm( "Cache Cleared" , false); } function MalExistsOnKiss(animelist){ var row = ""; var xmlEntry = ""; $(".listing").html("");//TODO remove; xml.find('series_'+K.listType+'db_id').each(function(index){ if((jQuery.inArray( $(this).text(), animelist ) ) < 0){ con.log($(this).text()); xmlEntry = $(this).parent(); row = ""; row += ''; row += ''; row += ''; row += ''; row += ''; row += ''; row += ''; row += ''; $(".listing").before(row); } }); } function getdata(baseurl, callback, parth = ""){ if(GM_getValue(K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(baseurl))+'/'+parth , null) !== null ){ con.log("cache:", K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(baseurl))+'/'+parth); var value = GM_getValue( K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(baseurl))+'/'+parth , null); callback(value); }else{ con.log("db:", K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(baseurl))+'/'+parth); var url = 'https://kissanimelist.firebaseio.com/Data2/'+K.dbSelector+'/'+encodeURIComponent(encodeURIComponent($.titleToDbKey(K.urlAnimeSelector(baseurl)))).toLowerCase()+'/'+parth+'.json'; GM_xmlhttpRequest({ method: "GET", url: url, synchronous: false, onload: function(response) { //con.log(response); if( response.responseText != null && response.responseText != 'null'){ var newResponse = response.responseText.slice(1, -1); if(parth == 'Mal'){ newResponse = 'https://myanimelist.net/'+K.listType+'/'+response.responseText.split('"')[1]+'/'+response.responseText.split('"')[3]; } GM_setValue(K.dbSelector+'/'+$.titleToDbKey(K.urlAnimeSelector(baseurl))+'/'+parth , newResponse); callback(newResponse); } } }); } } function setAll(){ K.docReady(function() { K.bookmarkEntrySelector().each(function() { var thistd = $(this).find("td").first(); $(this).find("td").first().children().first().wrap('
'); var append = '
'; $(this).find("td").first().append(append); $(this).find("td").each(function(index){ if(index > 0){ $(this).appendTo(thistd.find(".kissData")); //text += $(this).html()+"
"; //$(this).remove(); }else{ //text += '
'+$(this).html()+'
'; } }); $(this).find("td").first().find("td").append("
").contents().unwrap(); }); if($("#cssTableSet").height() === null){ K.BookmarksStyleAfterLoad(); }else{ return; } var len = K.bookmarkEntrySelector().length; K.bookmarkEntrySelector().bind('inview', function (event, visible) { if (visible === true) { var baseurl = $.absoluteLink($(this).find("a").first().attr('href')); var target = $(this); getdata(baseurl,function(value) { setBookmarkAnime(value, baseurl, target); }, "Mal"); $(this).unbind('inview'); } }); $(window).scroll(); }); } function displaySites(responsearray, page){ if($('#'+page+'Links').width() == null){ $('#siteSearch').before(''); } if($("#info-iframe").contents().find('#'+page+'Links').width() == null){ $("#info-iframe").contents().find('.stream-block-inner').append('
  • '+page+'
  • '); } $('#'+page+'Links').after('