您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Greasy Fork is available in English.
Integrates MyAnimeList into various sites, with auto episode tracking.
当前为
// ==UserScript== // @name MAL-Sync // @namespace http://greasyfork.icu/users/92233 // @description Integrates MyAnimeList into various sites, with auto episode tracking. // @version 0.4.0 // @author [email protected] // @license GPL-3.0 // @iconURL https://raw.githubusercontent.com/lolamtisch/MALSync/master/assets/icons/icon128.png // @grant GM_xmlhttpRequest // @grant GM_getValue // @grant GM_setValue // @grant GM_deleteValue // @grant GM_listValues // @grant GM_addStyle // @grant GM_getResourceText // @grant GM.xmlHttpRequest // @grant GM.getValue // @grant GM.setValue // @noframes // @match *://myanimelist.net/anime/* // @match *://myanimelist.net/manga/* // @match *://myanimelist.net/animelist/* // @match *://myanimelist.net/mangalist/* // @match *://myanimelist.net/anime.php?id=* // @match *://myanimelist.net/manga.php?id=* // @match *://myanimelist.net/character/* // @match *://myanimelist.net/people/* // @match *://myanimelist.net/search/* // @match *://anilist.co/* // @match *://kissanime.ru/Anime/* // @match *://kissanime.to/Anime/* // @match *://kissmanga.com/Manga/* // @match *://*.9anime.to/watch/* // @match *://*.9anime.is/watch/* // @match *://*.9anime.ru/watch/* // @match *://*.9anime.ch/watch/* // @match *://*.crunchyroll.com/* // @match *://www.masterani.me/anime/info/* // @match *://www.masterani.me/anime/watch/* // @match *://*.mangadex.org/manga/* // @match *://*.mangadex.org/title/* // @match *://*.mangadex.org/chapter/* // @match *://mangarock.com/* // @match *://*.gogoanime.tv/* // @match *://*.gogoanime.io/* // @match *://*.gogoanime.in/* // @match *://*.gogoanime.se/* // @match *://*.gogoanime.sh/* // @match *://*.gogoanimes.co/* // @match *://*.anime4you.one/show/1/aid/* // @match *://branitube.org/assistir/* // @match *://branitube.org/animes/* // @match *://*.www.turkanime.tv/video/* // @match *://*.www.turkanime.tv/anime/* // @match *://twist.moe/* // @exclude *crunchyroll.com/ // @exclude *crunchyroll.com // @exclude *crunchyroll.com/acct* // @exclude *crunchyroll.com/anime* // @exclude *crunchyroll.com/comics* // @exclude *crunchyroll.com/edit* // @exclude *crunchyroll.com/email* // @exclude *crunchyroll.com/forum* // @exclude *crunchyroll.com/home* // @exclude *crunchyroll.com/inbox* // @exclude *crunchyroll.com/library* // @exclude *crunchyroll.com/login* // @exclude *crunchyroll.com/manga* // @exclude *crunchyroll.com/newprivate* // @exclude *crunchyroll.com/news* // @exclude *crunchyroll.com/notifications* // @exclude *crunchyroll.com/order* // @exclude *crunchyroll.com/outbox* // @exclude *crunchyroll.com/pm* // @exclude *crunchyroll.com/search* // @exclude *crunchyroll.com/store* // @exclude *crunchyroll.com/user* // @exclude *crunchyroll.com/videos* // @exclude *crunchyroll.com/affiliate_iframeplayer* // @exclude *gogoanime*.*/ // @exclude *gogoanime*.*/*.html // @exclude *gogoanime*.*/anime-List* // @require http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js // @resource material.css https://code.getmdl.io/1.3.0/material.indigo-pink.min.css // @resource materialFont.css https://fonts.googleapis.com/icon?family=Material+Icons // @resource material.js https://code.getmdl.io/1.3.0/material.min.js // @resource simpleBar.css https://unpkg.com/[email protected]/dist/simplebar.css // @resource simpleBar.js https://unpkg.com/[email protected]/dist/simplebar.js // @run-at document_start // @connect myanimelist.net // @connect kissanimelist.firebaseio.com // @connect graphql.anilist.co // @connect * // ==/UserScript== /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 34); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); // EXTERNAL MODULE: ./src/api/storage/userscriptLegacy.ts var userscriptLegacy = __webpack_require__(12); // CONCATENATED MODULE: ./src/api/request/requestUserscriptLegacy.ts var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; const requestUserscriptLegacy = { xhr(method, url) { return __awaiter(this, void 0, void 0, function* () { return new Promise((resolve, reject) => { var request = { method: method, url: url, synchronous: false, headers: [], data: null, onload: function (response) { console.log(response); var responseObj = { finalUrl: response.finalUrl, responseText: response.responseText, status: response.status }; resolve(responseObj); } }; if (typeof url === 'object') { request.url = url.url; request.headers = url.headers; request.data = url.data; } GM_xmlhttpRequest(request); }); }); }, }; // EXTERNAL MODULE: ./src/api/settings.ts var settings = __webpack_require__(13); // CONCATENATED MODULE: ./src/api/userscript.ts /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "storage", function() { return storage; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "request", function() { return request; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "settings", function() { return userscript_settings; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "type", function() { return type; }); var storage = userscriptLegacy["a" /* userscriptLegacy */]; var request = requestUserscriptLegacy; var userscript_settings = settings["a" /* settingsObj */]; var type = 'userscript'; /***/ }), /* 1 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "log", function() { return log; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "error", function() { return error; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "info", function() { return info; }); var log = function () { return Function.prototype.bind.call(console.log, console, "%cMAL-Sync", "background-color: #2e51a2; color: white; padding: 2px 10px; border-radius: 3px;"); }(); var error = function () { return Function.prototype.bind.call(console.error, console, "%cMAL-Sync", "background-color: #8f0000; color: white; padding: 2px 10px; border-radius: 3px;"); }(); var info = function () { return Function.prototype.bind.call(console.info, console, "%cMAL-Sync", "background-color: wheat; color: black; padding: 2px 10px; border-radius: 3px;"); }(); /***/ }), /* 2 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* WEBPACK VAR INJECTION */(function(api, j, con, utils) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "urlPart", function() { return urlPart; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "urlParam", function() { return urlParam; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "favicon", function() { return favicon; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "watching", function() { return watching; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "planTo", function() { return planTo; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "episode", function() { return episode; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "syncRegex", function() { return syncRegex; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "status", function() { return status; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getselect", function() { return getselect; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "absoluteLink", function() { return absoluteLink; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "urlChangeDetect", function() { return urlChangeDetect; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "changeDetect", function() { return changeDetect; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "waitUntilTrue", function() { return waitUntilTrue; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUrlFromTags", function() { return getUrlFromTags; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setUrlInTags", function() { return setUrlInTags; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setResumeWaching", function() { return setResumeWaching; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getResumeWaching", function() { return getResumeWaching; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setContinueWaching", function() { return setContinueWaching; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getContinueWaching", function() { return getContinueWaching; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "handleMalImages", function() { return handleMalImages; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getMalToKissArray", function() { return getMalToKissArray; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTooltip", function() { return getTooltip; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "epPredictionUI", function() { return epPredictionUI; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "canHideTabs", function() { return canHideTabs; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "epPrediction", function() { return epPrediction; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "statusTag", function() { return statusTag; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "notifications", function() { return notifications; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "flashm", function() { return flashm; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "flashConfirm", function() { return flashConfirm; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lazyload", function() { return lazyload; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "elementInViewport", function() { return elementInViewport; }); var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; function urlPart(url, part) { try { return url.split("/")[part].split("?")[0]; } catch (e) { return undefined; } } function urlParam(url, name) { var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(url); if (results == null) { return null; } else { return decodeURI(results[1]) || 0; } } function favicon(domain) { if (domain.indexOf('animeheaven') !== -1) return 'http://animeheaven.eu/favicon.ico'; return 'https://www.google.com/s2/favicons?domain=' + domain; } function watching(type) { if (type == "manga") return 'Reading'; return 'Watching'; } function planTo(type) { if (type == "manga") return 'Plan to Read'; return 'Plan to Watch'; } function episode(type) { if (type == "manga") return 'Chapter'; return 'Episode'; } var syncRegex = /(^settings\/.*|^resume\/.*|^continue\/.*|^.*\/Offset$|^updateCheckTime$|^tempVersion$)/; var status; (function (status) { status[status["watching"] = 1] = "watching"; status[status["completed"] = 2] = "completed"; status[status["onhold"] = 3] = "onhold"; status[status["dropped"] = 4] = "dropped"; status[status["planToWatch"] = 6] = "planToWatch"; })(status || (status = {})); function getselect(data, name) { var temp = data.split('name="' + name + '"')[1].split('</select>')[0]; if (temp.indexOf('selected="selected"') > -1) { temp = temp.split('<option'); for (var i = 0; i < temp.length; ++i) { if (temp[i].indexOf('selected="selected"') > -1) { return temp[i].split('value="')[1].split('"')[0]; } } } else { return ''; } } function absoluteLink(url, domain) { if (typeof url === "undefined") { return url; } if (!url.startsWith("http")) { if (url.charAt(0) !== '/') url = '/' + url; url = domain + url; } return url; } ; function urlChangeDetect(callback) { var currentPage = window.location.href; return setInterval(function () { if (currentPage != window.location.href) { currentPage = window.location.href; callback(); } }, 1000); } function changeDetect(callback, func) { var currentPage = func(); return setInterval(function () { var temp = func(); if (typeof temp != 'undefined' && currentPage != temp) { currentPage = func(); callback(); } }, 1000); } function waitUntilTrue(condition, callback) { var Interval = null; Interval = setInterval(function () { if (condition()) { clearInterval(Interval); callback(); } }, 1000); return Interval; } function getUrlFromTags(tags) { if (!api.settings.get('malTags')) return undefined; if (/malSync::[\d\D]+::/.test(tags)) { return atobURL(tags.split("malSync::")[1].split("::")[0]); } if (/last::[\d\D]+::/.test(tags)) { return atobURL(tags.split("last::")[1].split("::")[0]); } return undefined; function atobURL(encoded) { try { return atob(encoded); } catch (e) { return encoded; } } } function setUrlInTags(url, tags) { if (!api.settings.get('malTags')) return tags; var addition = "malSync::" + btoa(url) + "::"; if (/(last|malSync)::[\d\D]+::/.test(tags)) { tags = tags.replace(/(last|malSync)::[^\^]*?::/, addition); } else { tags = tags + ',' + addition; } return tags; } function setResumeWaching(url, ep, type, id) { return __awaiter(this, void 0, void 0, function* () { return api.storage.set('resume/' + type + '/' + id, { url: url, ep: ep }); }); } function getResumeWaching(type, id) { return __awaiter(this, void 0, void 0, function* () { //@ts-ignore if (!api.settings.get('malResume')) return undefined; return api.storage.get('resume/' + type + '/' + id); }); } function setContinueWaching(url, ep, type, id) { return __awaiter(this, void 0, void 0, function* () { return api.storage.set('continue/' + type + '/' + id, { url: url, ep: ep }); }); } function getContinueWaching(type, id) { return __awaiter(this, void 0, void 0, function* () { return api.storage.get('continue/' + type + '/' + id); }); } function handleMalImages(url) { if (url.indexOf('questionmark') !== -1) return api.storage.assetUrl('questionmark.gif'); return url; } function getMalToKissArray(type, id) { return __awaiter(this, void 0, void 0, function* () { return new Promise((resolve, reject) => { var url = 'https://kissanimelist.firebaseio.com/Data2/Mal' + type + '/' + id + '/Sites.json'; api.request.xhr('GET', url).then((response) => __awaiter(this, void 0, void 0, function* () { var json = j.$.parseJSON(response.responseText); for (var pageKey in json) { var page = json[pageKey]; if (!api.settings.get(pageKey)) { con.log(pageKey + ' is deactivated'); delete json[pageKey]; continue; } for (var streamKey in page) { var stream = page[streamKey]; var streamUrl = 'https://kissanimelist.firebaseio.com/Data2/' + stream + '/' + encodeURIComponent(streamKey) + '.json'; var cache = yield api.storage.get('MalToKiss/' + stream + '/' + encodeURIComponent(streamKey), null); if (typeof (cache) != "undefined") { var streamJson = cache; } else { var streamRespose = yield api.request.xhr('GET', streamUrl); var streamJson = j.$.parseJSON(streamRespose.responseText); api.storage.set('MalToKiss/' + stream + '/' + encodeURIComponent(streamKey), streamJson); } if (pageKey == 'Crunchyroll') { streamJson['url'] = streamJson['url'] + '?season=' + streamKey; } json[pageKey][streamKey] = streamJson; } } con.log('Mal2Kiss', json); resolve(json); })); }); }); } function getTooltip(text, style = '', direction = 'top') { var rNumber = Math.floor((Math.random() * 1000) + 1); return '<div id="tt' + rNumber + '" class="icon material-icons" style="font-size:16px; line-height: 0; color: #7f7f7f; padding-bottom: 20px; padding-left: 3px; ' + style + '">contact_support</div>\ <div class="mdl-tooltip mdl-tooltip--' + direction + ' mdl-tooltip--large" for="tt' + rNumber + '">' + text + '</div>'; } function epPredictionUI(malid, type = 'anime', callback) { return __awaiter(this, void 0, void 0, function* () { utils.epPrediction(malid, function (pre) { return __awaiter(this, void 0, void 0, function* () { var updateCheckTime = yield api.storage.get("updateCheckTime"); var elCache = undefined; if (typeof updateCheckTime != 'undefined' && updateCheckTime && updateCheckTime != '0') { elCache = yield api.storage.get('updateCheck/' + type + '/' + malid); } if (pre === false && typeof elCache == 'undefined') return; var UI = { tag: '', text: '', color: '', colorStyle: '', tagEpisode: false, prediction: pre, elCache: elCache }; // var airing = pre.airing; var episode = pre.episode; if (typeof elCache != 'undefined' && typeof elCache.error == 'undefined') { if (!elCache.finished) { airing = true; } if (elCache.newestEp && elCache.newestEp != '' && typeof elCache.newestEp != 'undefined') { episode = elCache.newestEp; UI.color = 'red'; } } if (UI.color != '') { //UI.colorStyle = 'text-decoration: underline overline !important; text-decoration-color: '+UI.color+' !important;' UI.colorStyle = 'background-color: #00ff0057 !important;'; } // if (airing) { if (pre.airing) { UI.text = 'Next episode estimated in ' + pre.diffDays + 'd ' + pre.diffHours + 'h ' + pre.diffMinutes + 'm'; } if (episode) { UI.tag = '<span class="mal-sync-ep-pre" title="' + UI.text + '">[<span style="' + UI.colorStyle + ';">' + episode + '</span>]</span>'; UI.tagEpisode = episode; } } else { if (pre) { UI.text = '<span class="mal-sync-ep-pre">Airing in ' + ((pre.diffWeeks * 7) + pre.diffDays) + 'd ' + pre.diffHours + 'h ' + pre.diffMinutes + 'm </span>'; } } callback(UI); }); }); }); } function canHideTabs() { if (typeof browser != 'undefined' && typeof browser.tabs.hide != 'undefined') { return true; } return false; } function epPrediction(malId, callback) { return __awaiter(this, void 0, void 0, function* () { if (!api.settings.get('epPredictions')) return; var timestamp = yield api.storage.get('mal/' + malId + '/release'); if (typeof (timestamp) != "undefined") { var airing = 1; var episode = 0; if (Date.now() < timestamp) airing = 0; if (airing) { var delta = Math.abs(Date.now() - timestamp) / 1000; } else { var delta = Math.abs(timestamp - Date.now()) / 1000; } var diffWeeks = Math.floor(delta / (86400 * 7)); delta -= diffWeeks * (86400 * 7); if (airing) { //We need the time until the week is complete delta = (86400 * 7) - delta; } var diffDays = Math.floor(delta / 86400); delta -= diffDays * 86400; var diffHours = Math.floor(delta / 3600) % 24; delta -= diffHours * 3600; var diffMinutes = Math.floor(delta / 60) % 60; delta -= diffMinutes * 60; if (airing) { episode = diffWeeks - (new Date().getFullYear() - new Date(timestamp).getFullYear()); //Remove 1 week between years episode++; if (episode > 50) { episode = 0; } } var maxEp = yield api.storage.get('mal/' + malId + '/release'); if (typeof (maxEp) === "undefined" || episode < maxEp) { callback({ timestamp: timestamp, airing: airing, diffWeeks: diffWeeks, diffDays: diffDays, diffHours: diffHours, diffMinutes: diffMinutes, episode: episode }); return; } } callback(false); }); } function statusTag(status, type, id) { var info = { anime: { 1: { class: 'watching', text: 'CW', title: 'Watching' }, 2: { class: 'completed', text: 'CMPL', title: 'Completed' }, 3: { class: 'on-hold', text: ' HOLD', title: 'On-Hold' }, 4: { class: 'dropped', text: 'DROP', title: 'Dropped' }, 6: { class: 'plantowatch', text: 'PTW', title: 'Plan to Watch' } }, manga: { 1: { class: 'reading', text: 'CR', title: 'Reading' }, 2: { class: 'completed', text: 'CMPL', title: 'Completed' }, 3: { class: 'on-hold', text: ' HOLD', title: 'On-Hold' }, 4: { class: 'dropped', text: 'DROP', title: 'Dropped' }, 6: { class: 'plantoread', text: 'PTR', title: 'Plan to Read' } } }; $.each([1, 2, 3, 4, 6], function (i, el) { info.anime[info.anime[el].title] = info.anime[el]; info.manga[info.manga[el].title] = info.manga[el]; }); if (status) { var tempInfo = info[type][status]; return ` <a href="https://myanimelist.net/ownlist/${type}/${id}/edit?hideLayout=1" title="${tempInfo.title}" class="Lightbox_AddEdit button_edit ${tempInfo.class}">${tempInfo.text}</a>`; } return false; } function notifications(url, title, message, iconUrl = '') { var messageObj = { type: 'basic', title: title, message: message, iconUrl: iconUrl, }; con.log('Notification', url, messageObj); try { return chrome.notifications.create(url, messageObj); } catch (e) { con.error(e); } } //flashm function flashm(text, options) { if (!j.$('#flash-div-top').length) { initflashm(); } con.log("[Flash] Message:", text); var colorF = "#323232"; if (typeof options !== 'undefined' && typeof options.error !== 'undefined' && options.error) { var colorF = "#3e0808"; } var flashdiv = '#flash-div-bottom'; if (typeof options !== 'undefined' && typeof options.position !== 'undefined' && options.position) { flashdiv = '#flash-div-' + options.position; } var messClass = "flash"; if (typeof options !== 'undefined' && typeof options.type !== 'undefined' && options.type) { var tempClass = "type-" + options.type; j.$(flashdiv + ' .' + tempClass + ', #flashinfo-div .' + tempClass) .removeClass(tempClass) .fadeOut({ duration: 1000, queue: false, complete: function () { j.$(this).remove(); } }); messClass += " " + tempClass; } var mess = '<div class="' + messClass + '" style="display:none;">\ <div style="display:table; pointer-events: all; padding: 14px 24px 14px 24px; margin: 0 auto; margin-top: 5px; max-width: 60%; -webkit-border-radius: 20px;-moz-border-radius: 20px;border-radius: 2px;color: white;background:' + colorF + '; ">\ ' + text + '\ </div>\ </div>'; if (typeof options !== 'undefined' && typeof options.hoverInfo !== 'undefined' && options.hoverInfo) { messClass += " flashinfo"; mess = '<div class="' + messClass + '" style="display:none; max-height: 5000px; overflow: hidden;"><div style="display:table; pointer-events: all; margin: 0 auto; margin-top: -2px; max-width: 60%; -webkit-border-radius: 20px;-moz-border-radius: 20px;border-radius: 2px;color: white;background:' + colorF + '; "><div style="max-height: 60vh; overflow-y: auto; padding: 14px 24px 14px 24px;">' + text + '</div></div></div>'; j.$('#flashinfo-div').addClass('hover'); var flashm = j.$(mess).appendTo('#flashinfo-div'); } else { var flashm = j.$(mess).appendTo(flashdiv); } if (typeof options !== 'undefined' && typeof options.permanent !== 'undefined' && options.permanent) { flashm.slideDown(800); } else if (typeof options !== 'undefined' && typeof options.hoverInfo !== 'undefined' && options.hoverInfo) { flashm.slideDown(800).delay(4000).queue(function () { j.$('#flashinfo-div').removeClass('hover'); flashm.css('max-height', '8px'); }); } else { flashm.slideDown(800).delay(4000).slideUp(800, () => { // @ts-ignore j.$(this).remove(); }); } return flashm; } function flashConfirm(message, type, yesCall = () => { }, cancelCall = () => { }) { return __awaiter(this, void 0, void 0, function* () { return new Promise(function (resolve, reject) { message = '<div style="text-align: center;">' + message + '</div><div style="display: flex; justify-content: space-around;"><button class="Yes" style="background-color: transparent; border: none; color: rgb(255,64,129);margin-top: 10px; cursor:pointer;">OK</button><button class="Cancel" style="background-color: transparent; border: none; color: rgb(255,64,129);margin-top: 10px; cursor:pointer;">CANCEL</button></div>'; var flasmessage = flashm(message, { permanent: true, position: "top", type: type }); flasmessage.find('.Yes').click(function (evt) { j.$(evt.target).parentsUntil('.flash').remove(); resolve(true); yesCall(); }); flasmessage.find('.Cancel').click(function (evt) { j.$(evt.target).parentsUntil('.flash').remove(); resolve(false); cancelCall(); }); }); }); } function initflashm() { api.storage.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-bottom, #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-bottom 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-bottom a, #flashinfo-div a{\ color: #DF6300;\ }'); j.$('body').after('<div id="flash-div-top" style="text-align: center;pointer-events: none;position: fixed;top:-5px;width:100%;z-index: 2147483647;left: 0;"></div>\ <div id="flash-div-bottom" style="text-align: center;pointer-events: none;position: fixed;bottom:0px;width:100%;z-index: 2147483647;left: 0;"><div id="flash" style="display:none; background-color: red;padding: 20px; margin: 0 auto;max-width: 60%; -webkit-border-radius: 20px;-moz-border-radius: 20px;border-radius: 20px;background:rgba(227,0,0,0.6);"></div></div>\ <div id="flashinfo-div" style="text-align: center;pointer-events: none;position: fixed;bottom:0px;width:100%;left: 0;">'); } var lazyloaded = false; var lazyimages = new Array(); function lazyload(doc, scrollElement = '.simplebar-scroll-content') { /* lazyload.js (c) Lorenzo Giuliani * MIT License (http://www.opensource.org/licenses/mit-license.html) * * expects a list of: * `<img src="blank.gif" data-src="my_image.png" width="600" height="400" class="lazy">` */ processScroll = function () { for (var i = 0; i < lazyimages.length; i++) { if (elementInViewport(lazyimages[i])) { loadImage(lazyimages[i], function () { lazyimages.splice(i, i); }); } if (!$(lazyimages[i]).length) { lazyimages.splice(i, i); } } ; }; function loadImage(el, fn) { if (!j.$(el).is(':visible')) return false; if (j.$(el).hasClass('lazyBack')) { j.$(el).css('background-image', 'url(' + el.getAttribute('data-src') + ')').removeClass('lazyBack'); } else { var img = new Image(), src = el.getAttribute('data-src'); img.onload = function () { if (!!el.parent) el.parent.replaceChild(img, el); else el.src = src; fn ? fn() : null; }; img.src = src; } } for (var i = 0; i < lazyimages.length; i++) { $(lazyimages[i]).addClass('init'); } ; lazyimages = new Array(); var query = doc.find('img.lazy.init, .lazyBack.init'), processScroll = function () { for (var i = 0; i < lazyimages.length; i++) { if (utils.elementInViewport(lazyimages[i], 600)) { loadImage(lazyimages[i], function () { lazyimages.splice(i, i); }); } } ; }; // Array.prototype.slice.call is not callable under our lovely IE8 for (var i = 0; i < query.length; i++) { lazyimages.push(query[i]); $(query[i]).removeClass('init'); } ; processScroll(); if (!lazyloaded) { lazyloaded = true; doc.find(scrollElement).scroll(function () { processScroll(); }); } } function elementInViewport(el, horizontalOffset = 0) { var rect = el.getBoundingClientRect(); return (rect.top >= 0 && rect.left >= 0 // @ts-ignore && (rect.top - horizontalOffset) <= (window.innerHeight || document.documentElement.clientHeight)); } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(0), __webpack_require__(3), __webpack_require__(1), __webpack_require__(2))) /***/ }), /* 3 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "$", function() { return $; }); var $ = jQuery; /***/ }), /* 4 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(api, utils, con) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return translateList; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return accessToken; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return errorHandling; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return aniListToMal; }); function translateList(aniStatus, malStatus = null) { var list = { 'CURRENT': 1, 'PLANNING': 6, 'COMPLETED': 2, 'DROPPED': 4, 'PAUSED': 3, 'REPEATING': 1, }; if (malStatus != null) { return Object.keys(list).find(key => list[key] === malStatus); } return list[aniStatus]; } function accessToken() { return api.settings.get('anilistToken'); } function errorHandling(res) { if (typeof res.errors != 'undefined') { res.errors.forEach((error) => { switch (error.status) { case 400: utils.flashm('Please Authenticate <a target="_blank" href="https://anilist.co/api/v2/oauth/authorize?client_id=1487&response_type=token">Here</a>', { error: true }); break; case 404: utils.flashm('anilist: ' + error.message, { error: true }); break; default: utils.flashm('anilist: ' + error.message, { error: true }); throw error.message; } }); } } function aniListToMal(anilistId, type) { var query = ` query ($id: Int, $type: MediaType) { Media (id: $id, type: $type) { id idMal } } `; var variables = { id: anilistId, type: type.toUpperCase() }; return api.request.xhr('POST', { url: 'https://graphql.anilist.co', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', }, data: JSON.stringify({ query: query, variables: variables }) }).then((response) => { var res = JSON.parse(response.responseText); con.log(res); errorHandling(res); return res.data.Media.idMal; }); } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(0), __webpack_require__(2), __webpack_require__(1))) /***/ }), /* 5 */ /***/ (function(module, exports) { /* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ // css base code, injected by the css-loader module.exports = function(useSourceMap) { var list = []; // return the list of modules as css string list.toString = function toString() { return this.map(function (item) { var content = cssWithMappingToString(item, useSourceMap); if(item[2]) { return "@media " + item[2] + "{" + content + "}"; } else { return content; } }).join(""); }; // import a list of modules into the list list.i = function(modules, mediaQuery) { if(typeof modules === "string") modules = [[null, modules, ""]]; var alreadyImportedModules = {}; for(var i = 0; i < this.length; i++) { var id = this[i][0]; if(typeof id === "number") alreadyImportedModules[id] = true; } for(i = 0; i < modules.length; i++) { var item = modules[i]; // skip already imported module // this implementation is not 100% perfect for weird media query combinations // when a module is imported multiple times with different media queries. // I hope this will never occur (Hey this way we have smaller bundles) if(typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) { if(mediaQuery && !item[2]) { item[2] = mediaQuery; } else if(mediaQuery) { item[2] = "(" + item[2] + ") and (" + mediaQuery + ")"; } list.push(item); } } }; return list; }; function cssWithMappingToString(item, useSourceMap) { var content = item[1] || ''; var cssMapping = item[3]; if (!cssMapping) { return content; } if (useSourceMap && typeof btoa === 'function') { var sourceMapping = toComment(cssMapping); var sourceURLs = cssMapping.sources.map(function (source) { return '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */' }); return [content].concat(sourceURLs).concat([sourceMapping]).join('\n'); } return [content].join('\n'); } // Adapted from convert-source-map (MIT) function toComment(sourceMap) { // eslint-disable-next-line no-undef var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))); var data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64; return '/*# ' + data + ' */'; } /***/ }), /* 6 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(api) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return entryClass; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return userList; }); /* harmony import */ var _MyAnimeList_entryClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(8); /* harmony import */ var _MyAnimeList_userList__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9); /* harmony import */ var _AniList_entryClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(10); /* harmony import */ var _AniList_userList__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(11); function getSyncMode() { return api.settings.get('syncMode'); } function entryClass(url, miniMAL = false) { if (getSyncMode() == 'MAL') { return new _MyAnimeList_entryClass__WEBPACK_IMPORTED_MODULE_0__[/* entryClass */ "a"](url, miniMAL); } else { return new _AniList_entryClass__WEBPACK_IMPORTED_MODULE_2__[/* entryClass */ "a"](url, miniMAL); } } function userList(status = 1, localListType = 'anime', callbacks, username = null, offset = 0, templist = []) { if (getSyncMode() == 'MAL') { return _MyAnimeList_userList__WEBPACK_IMPORTED_MODULE_1__[/* userList */ "b"](status, localListType, callbacks, username, offset, templist); } else { return _AniList_userList__WEBPACK_IMPORTED_MODULE_3__[/* userList */ "a"](status, localListType, callbacks, username, offset, templist); } } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(0))) /***/ }), /* 7 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return pages; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return pageSearch; }); /* harmony import */ var _Kissanime_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(15); /* harmony import */ var _Kissmanga_main__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(16); /* harmony import */ var _nineAnime_main__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17); /* harmony import */ var _Crunchyroll_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(18); /* harmony import */ var _Masterani_main__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(19); /* harmony import */ var _Mangadex_main__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(20); /* harmony import */ var _Mangarock_main__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(21); /* harmony import */ var _Gogoanime_main__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(22); /* harmony import */ var _Anime4you_main__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(23); /* harmony import */ var _Branitube_main__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(24); /* harmony import */ var _Turkanime_main__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(25); /* harmony import */ var _Twistmoe_main__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(26); const pages = { Kissanime: _Kissanime_main__WEBPACK_IMPORTED_MODULE_0__[/* Kissanime */ "a"], Kissmanga: _Kissmanga_main__WEBPACK_IMPORTED_MODULE_1__[/* Kissmanga */ "a"], nineAnime: _nineAnime_main__WEBPACK_IMPORTED_MODULE_2__[/* nineAnime */ "a"], Crunchyroll: _Crunchyroll_main__WEBPACK_IMPORTED_MODULE_3__[/* Crunchyroll */ "a"], Masterani: _Masterani_main__WEBPACK_IMPORTED_MODULE_4__[/* Masterani */ "a"], Mangadex: _Mangadex_main__WEBPACK_IMPORTED_MODULE_5__[/* Mangadex */ "a"], Mangarock: _Mangarock_main__WEBPACK_IMPORTED_MODULE_6__[/* Mangarock */ "a"], Gogoanime: _Gogoanime_main__WEBPACK_IMPORTED_MODULE_7__[/* Gogoanime */ "a"], Anime4you: _Anime4you_main__WEBPACK_IMPORTED_MODULE_8__[/* Anime4you */ "a"], Branitube: _Branitube_main__WEBPACK_IMPORTED_MODULE_9__[/* Branitube */ "a"], Turkanime: _Turkanime_main__WEBPACK_IMPORTED_MODULE_10__[/* Turkanime */ "a"], Twistmoe: _Twistmoe_main__WEBPACK_IMPORTED_MODULE_11__[/* Twistmoe */ "a"], }; const pageSearch = { Kissanime: { name: 'Kissanime', type: 'anime', domain: 'kissanime.ru', searchUrl: (titleEncoded) => { return ''; }, completeSearchTag: (title, linkContent) => { return '<form class="mal_links" target="_blank" action="http://kissanime.ru/Search/Anime" style="display: inline;" id="kissanimeSearch" method="post" _lpchecked="1"><a href="#" class="submitKissanimeSearch" onclick="document.getElementById(\'kissanimeSearch\').submit(); return false;">' + linkContent + '</a><input type="hidden" id="keyword" name="keyword" value="' + title + '"/></form>'; } }, Kissmanga: { name: 'Kissmanga', type: 'manga', domain: 'kissmanga.com', searchUrl: (titleEncoded) => { return ''; }, completeSearchTag: (title, linkContent) => { return '<form class="mal_links" target="_blank" action="http://kissmanga.com/Search/Manga" style="display: inline;" id="kissanimeSearch" method="post" _lpchecked="1"><a href="#" class="submitKissanimeSearch" onclick="document.getElementById(\'kissanimeSearch\').submit(); return false;">' + linkContent + '</a><input type="hidden" id="keyword" name="keyword" value="' + title + '"/></form>'; } }, Crunchyroll: { name: 'Crunchyroll', type: 'anime', domain: 'www.crunchyroll.com', searchUrl: (titleEncoded) => { return 'http://www.crunchyroll.com/search?q=' + titleEncoded; } }, nineAnime: { name: '9Anime', type: 'anime', domain: '9anime.to', googleSearchDomain: '9anime.to/watch', searchUrl: (titleEncoded) => { return 'https://www1.9anime.to/search?keyword=' + titleEncoded; } }, MasterAnime: { name: 'MasterAnime', type: 'anime', domain: 'www.masterani.me', googleSearchDomain: 'www.masterani.me/anime/info/', searchUrl: (titleEncoded) => { return 'https://www.masterani.me/anime?search=' + titleEncoded; } }, Gogoanime: { name: 'Gogoanime', type: 'anime', domain: 'www.gogoanime.in', searchUrl: (titleEncoded) => { return 'http://gogoanimes.co/search.html?keyword=' + titleEncoded; } }, Turkanime: { name: 'Turkanime', type: 'anime', domain: 'www.turkanime.tv/', searchUrl: (titleEncoded) => { return 'https://www.google.com/search?q=' + titleEncoded + '+site:turkanime.tv/anime/'; }, googleSearchDomain: 'turkanime.tv/anime/' }, Mangadex: { name: 'Mangadex', type: 'manga', domain: 'mangadex.org', searchUrl: (titleEncoded) => { return 'https://mangadex.org/quick_search/' + titleEncoded; } }, Mangarock: { name: 'Mangarock', type: 'manga', domain: 'mangarock.com', searchUrl: (titleEncoded) => { return 'https://mangarock.com/search?q=' + titleEncoded; } }, AniList: { name: 'AniList', type: 'anime', domain: 'anilist.co', searchUrl: (titleEncoded) => { return 'https://anilist.co/search/anime?sort=SEARCH_MATCH&search=' + titleEncoded; } }, AniListManga: { name: 'AniList', type: 'manga', domain: 'anilist.co', searchUrl: (titleEncoded) => { return 'https://anilist.co/search/manga?sort=SEARCH_MATCH&search=' + titleEncoded; } }, }; /***/ }), /* 8 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(utils, con, api, j) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return entryClass; }); var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; class entryClass { constructor(url, miniMAL = false) { this.url = url; this.miniMAL = miniMAL; this.name = ""; this.totalEp = NaN; this.addAnime = false; this.login = false; this.wrong = false; this.id = utils.urlPart(url, 4); this.type = utils.urlPart(url, 3); } init() { return this.update(); } ; update() { var editUrl = 'https://myanimelist.net/ownlist/' + this.type + '/' + this.id + '/edit?hideLayout'; con.log('Update MAL info', editUrl); return api.request.xhr('GET', editUrl).then((response) => { if (response.finalUrl.indexOf("myanimelist.net/login.php") > -1 || response.responseText.indexOf("Unauthorized") > -1) { this.login = false; con.error("User not logged in"); return; } this.login = true; this.animeInfo = this.getObject(response.responseText); }); } getEpisode() { if (this.type == "manga") { return this.animeInfo[".add_manga[num_read_chapters]"]; } return this.animeInfo[".add_anime[num_watched_episodes]"]; } setEpisode(ep) { if (ep + '' === '') ep = 0; if (this.type == "manga") { this.animeInfo[".add_manga[num_read_chapters]"] = parseInt(ep + ''); } this.animeInfo[".add_anime[num_watched_episodes]"] = parseInt(ep + ''); } getVolume() { if (this.type == "manga") { return this.animeInfo[".add_manga[num_read_volumes]"]; } return false; } setVolume(ep) { if (this.type == "manga") { this.animeInfo[".add_manga[num_read_volumes]"] = ep; return; } con.error('You cant set Volumes for animes'); } getStatus() { if (this.type == "manga") { return this.animeInfo[".add_manga[status]"]; } return this.animeInfo[".add_anime[status]"]; } setStatus(status) { if (this.type == "manga") { this.animeInfo[".add_manga[status]"] = status; } this.animeInfo[".add_anime[status]"] = status; } getScore() { if (this.type == "manga") { return this.animeInfo[".add_manga[score]"]; } return this.animeInfo[".add_anime[score]"]; } setScore(score) { if (this.type == "manga") { this.animeInfo[".add_manga[score]"] = score; } this.animeInfo[".add_anime[score]"] = score; } getRewatching() { if (this.type == "manga") { return this.animeInfo[".add_manga[is_rereading]"]; } return this.animeInfo[".add_anime[is_rewatching]"]; } setRewatching(rewatching) { if (this.type == "manga") { this.animeInfo[".add_manga[is_rereading]"] = rewatching; } this.animeInfo[".add_anime[is_rewatching]"] = rewatching; } setCompletionDateToNow() { var Datec = new Date(); if (this.animeInfo['.add_anime[finish_date][day]'] === '' || this.animeInfo['.add_manga[finish_date][day]'] === '') { if (this.type == "manga") { this.animeInfo['.add_manga[finish_date][year]'] = Datec.getFullYear(); this.animeInfo['.add_manga[finish_date][month]'] = Datec.getMonth() + 1; this.animeInfo['.add_manga[finish_date][day]'] = Datec.getDate(); } this.animeInfo['.add_anime[finish_date][year]'] = Datec.getFullYear(); this.animeInfo['.add_anime[finish_date][month]'] = Datec.getMonth() + 1; this.animeInfo['.add_anime[finish_date][day]'] = Datec.getDate(); } else { con.error('Completion date already set'); } } setStartingDateToNow() { var Datec = new Date(); if (this.animeInfo['.add_anime[start_date][day]'] === '' || this.animeInfo['.add_manga[start_date][day]'] === '') { if (this.type == "manga") { this.animeInfo['.add_manga[start_date][year]'] = Datec.getFullYear(); this.animeInfo['.add_manga[start_date][month]'] = Datec.getMonth() + 1; this.animeInfo['.add_manga[start_date][day]'] = Datec.getDate(); } this.animeInfo['.add_anime[start_date][year]'] = Datec.getFullYear(); this.animeInfo['.add_anime[start_date][month]'] = Datec.getMonth() + 1; this.animeInfo['.add_anime[start_date][day]'] = Datec.getDate(); } else { con.info('Start date already set'); } } getStreamingUrl() { var tags = this.animeInfo[".add_anime[tags]"]; if (this.type == "manga") { tags = this.animeInfo[".add_manga[tags]"]; } return utils.getUrlFromTags(tags); } setStreamingUrl(url) { var tags = this.animeInfo[".add_anime[tags]"]; if (this.type == "manga") { tags = this.animeInfo[".add_manga[tags]"]; } tags = utils.setUrlInTags(url, tags); if (this.type == "manga") { this.animeInfo[".add_manga[tags]"] = tags; return; } this.animeInfo[".add_anime[tags]"] = tags; } getRating() { return __awaiter(this, void 0, void 0, function* () { return new Promise((resolve, reject) => { var url = ''; if (this.type == 'anime') { url = 'https://myanimelist.net/includes/ajax.inc.php?t=64&id=' + this.id; } else { url = 'https://myanimelist.net/includes/ajax.inc.php?t=65&id=' + this.id; } api.request.xhr('GET', url).then((response) => { try { resolve(response.responseText.split('Score:</span>')[1].split('<')[0]); } catch (e) { con.error('Could not get rating', e); reject(); } }); }); }); } setResumeWaching(url, ep) { return __awaiter(this, void 0, void 0, function* () { return utils.setResumeWaching(url, ep, this.type, this.id); }); } getResumeWaching() { return __awaiter(this, void 0, void 0, function* () { return utils.getResumeWaching(this.type, this.id); }); } setContinueWaching(url, ep) { return __awaiter(this, void 0, void 0, function* () { return utils.setContinueWaching(url, ep, this.type, this.id); }); } getContinueWaching() { return __awaiter(this, void 0, void 0, function* () { return utils.getContinueWaching(this.type, this.id); }); } getImage() { return __awaiter(this, void 0, void 0, function* () { return api.request.xhr('GET', this.url).then((response) => { var data = response.responseText; var image = ''; try { image = data.split('js-scrollfix-bottom')[1].split('<img src="')[1].split('"')[0]; } catch (e) { console.log('[mal.ts] Error:', e); } return image; }); }); } clone() { const copy = new this.constructor(); Object.assign(copy, this); copy.animeInfo = Object.assign({}, this.animeInfo); return copy; } sync() { var status = utils.status; return new Promise((resolve, reject) => { var This = this; var url = "https://myanimelist.net/ownlist/" + this.type + "/" + this.id + "/edit"; if (this.addAnime) { var imgSelector = 'malSyncImg' + this.id; var flashConfirmText = ` Is "${this.name}" correct? <br> <img id="${imgSelector}" style=" height: 200px; min-height: 200px; min-width: 144px; border: 1px solid; margin-top: 10px; display: inline; " src="" /> <br> <!--<a style="margin-left: -2px;" target="_blank" href="https://github.com/lolamtisch/MALSync/wiki/Troubleshooting#myanimeentry-entry-is-not-correct">[How to correct entries]</a>--> `; if (This.miniMAL) { flashConfirmText = ` Add "${this.name}" to MAL?`; } if (this.type == 'anime') { url = "https://myanimelist.net/ownlist/anime/add?selected_series_id=" + this.id; utils.flashConfirm(flashConfirmText, 'add', function () { continueCall(); }, function () { wrongCall(); /*if(change['checkIncrease'] == 1){TODO episodeInfo(change['.add_anime[num_watched_episodes]'], actual['malurl']); }*/ }); } else { url = "https://myanimelist.net/ownlist/manga/add?selected_manga_id=" + this.id; utils.flashConfirm(flashConfirmText, 'add', function () { continueCall(); }, function () { wrongCall(); }); } if (!This.miniMAL) { this.getImage().then((image) => { j.$('#' + imgSelector).attr('src', image); }); j.$('.Yes').text('YES'); j.$('.Cancel').text('NO'); } return; } else { //Rewatching var watchCounter = '.add_anime[num_watched_times]'; var rewatchText = 'Rewatch Anime?'; var rewatchFinishText = 'Finish rewatching?'; if (this.type == "manga") { watchCounter = '.add_manga[num_read_times]'; rewatchText = 'Reread Manga?'; rewatchFinishText = 'Finish rereading?'; } if (this.getStatus() == status.completed && this.getEpisode() === 1 && this.totalEp !== 1 && this.getRewatching() !== 1) { utils.flashConfirm(rewatchText, 'add', () => { this.setRewatching(1); continueCall(); }, function () { continueCall(); }); return; } if (this.getStatus() == status.completed && this.getEpisode() === this.totalEp && this.getRewatching() === 1) { utils.flashConfirm(rewatchFinishText, 'add', () => { this.setRewatching(0); if (this.animeInfo[watchCounter] === '') { this.animeInfo[watchCounter] = 1; } else { this.animeInfo[watchCounter] = parseInt(this.animeInfo[watchCounter]) + 1; } continueCall(); }, function () { continueCall(); }); return; } } function wrongCall() { This.wrong = true; if (!This.miniMAL) { var miniButton = j.$('button.open-info-popup'); if (miniButton.css('display') != 'none') { miniButton.click(); } else { miniButton.click(); miniButton.click(); } } } continueCall(); function continueCall() { var parameter = ""; j.$.each(This.animeInfo, function (index, value) { if (index.toString().charAt(0) == ".") { if (!((index === '.add_anime[is_rewatching]' || index === '.add_manga[is_rereading]') && parseInt(value) === 0)) { parameter += encodeURIComponent(index.toString().substring(1)) + "=" + encodeURIComponent(value) + "&"; } } }); con.log('[SET] URL:', url); con.log('[SET] Object:', This.animeInfo); api.request.xhr('POST', { url: url, data: parameter, headers: { "Content-Type": "application/x-www-form-urlencoded" } }).then((response) => { if (response.responseText.indexOf('Successfully') >= 0) { con.log('Update Succeeded'); resolve(); } else { con.error('Update failed'); reject(); } //This.animeInfo = This.getObject(response.responseText); }); } }); } getObject(data) { var getselect = utils.getselect; if (typeof data.split('<form name="')[1] === "undefined" && (this.url.indexOf('/manga/') !== -1 || this.url.indexOf('/anime/') !== -1)) { throw new Error("MAL is down or otherwise giving bad data"); } this.addAnime = false; if (this.type == 'anime') { var anime = {}; anime['.csrf_token'] = data.split('\'csrf_token\'')[1].split('\'')[1].split('\'')[0]; if (data.indexOf('Add Anime') > -1) { this.addAnime = true; } data = data.split('<form name="')[1].split('</form>')[0]; this.totalEp = parseInt(data.split('id="totalEpisodes">')[1].split('<')[0]); this.name = data.split('<a href="')[1].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]'); if (anime['.add_anime[is_asked_to_discuss]'] == '') anime['.add_anime[is_asked_to_discuss]'] = 0; //#15 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['.csrf_token'] = data.split('\'csrf_token\'')[1].split('\'')[1].split('\'')[0]; if (data.indexOf('Add Manga') > -1) { this.addAnime = true; } data = data.split('<form name="')[1].split('</form>')[0]; this.totalEp = parseInt(data.split('id="totalChap">')[1].split('<')[0]); this.totalVol = parseInt(data.split('id="totalVol">')[1].split('<')[0]); this.name = data.split('<a href="')[1].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]'); if (anime['.add_manga[is_asked_to_discuss]'] == '') anime['.add_manga[is_asked_to_discuss]'] = 0; //#15 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; } } } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(2), __webpack_require__(1), __webpack_require__(0), __webpack_require__(3))) /***/ }), /* 9 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(con, utils, api) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return userList; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return prepareData; }); /* unused harmony export UserName */ //Status: 1 = watching | 2 = completed | 3 = onhold | 4 = dropped | 6 = plan to watch | 7 = all function userList(status = 1, localListType = 'anime', callbacks, username = null, offset = 0, templist = []) { con.log('[UserList]', 'username: ' + username, 'status: ' + status, 'offset: ' + offset); if (username == null) { UserName(function (usernameTemp) { if (usernameTemp == false) { utils.flashm("Please log in on <a target='_blank' href='https://myanimelist.net/login.php'>MyAnimeList!<a>"); // @ts-ignore if (typeof callbacks.fullListCallback !== 'undefined') callbacks.fullListCallback([]); // @ts-ignore if (typeof callbacks.finishCallback !== 'undefined') callbacks.finishCallback(); } else { userList(status, localListType, callbacks, usernameTemp, offset, templist); } }); return; } var url = 'https://myanimelist.net/' + localListType + 'list/' + username + '/load.json?offset=' + offset + '&status=' + status; api.request.xhr('GET', url).then((response) => { var data = JSON.parse(response.responseText); data = prepareData(data, localListType); if (typeof callbacks.singleCallback !== 'undefined') { // @ts-ignore if (!data.length) callbacks.singleCallback(false, 0, 0); for (var i = 0; i < data.length; i++) { // @ts-ignore callbacks.singleCallback(data[i], i + offset + 1, data.length + offset); } } if (typeof callbacks.fullListCallback !== 'undefined') { templist = templist.concat(data); } if (data.length > 299) { if (typeof callbacks.continueCall !== 'undefined') { // @ts-ignore callbacks.continueCall(function () { userList(status, localListType, callbacks, username, offset + 300, templist); }); } else { userList(status, localListType, callbacks, username, offset + 300, templist); } } else { // @ts-ignore if (typeof callbacks.fullListCallback !== 'undefined') callbacks.fullListCallback(templist); // @ts-ignore if (typeof callbacks.finishCallback !== 'undefined') callbacks.finishCallback(); } }); } function prepareData(data, listType) { var newData = []; for (var i = 0; i < data.length; i++) { var el = data[i]; if (listType === "anime") { newData.push({ id: el['anime_id'], type: listType, title: el['anime_title'], url: 'https://myanimelist.net' + el['anime_url'], watchedEp: el['num_watched_episodes'], totalEp: el['anime_num_episodes'], image: el['anime_image_path'], tags: el['tags'], airingState: el['anime_airing_status'], }); } else { newData.push({ id: el['manga_id'], type: listType, title: el['manga_title'], url: 'https://myanimelist.net' + el['manga_url'], watchedEp: el['manga_num_chapters'], totalEp: el['manga_num_chapters'], image: el['manga_image_path'], tags: el['tags'], airingState: el['anime_airing_status'], }); } } return newData; } function UserName(callback) { var url = 'https://myanimelist.net/editlist.php?hideLayout'; api.request.xhr('GET', url).then((response) => { var username = false; try { username = response.responseText.split('USER_NAME = "')[1].split('"')[0]; } catch (e) { } con.log('[Username]', username); callback(username); }); } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1), __webpack_require__(2), __webpack_require__(0))) /***/ }), /* 10 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(utils, con, api, j) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return entryClass; }); /* harmony import */ var _helper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; class entryClass { constructor(url, miniMAL = false) { this.url = url; this.miniMAL = miniMAL; this.aniId = NaN; this.name = ""; this.totalEp = NaN; this.addAnime = false; this.login = false; this.wrong = false; this.type = utils.urlPart(url, 3); if (typeof url !== 'undefined' && url.indexOf("myanimelist.net") > -1) { this.id = utils.urlPart(url, 4); } else if (typeof url !== 'undefined' && url.indexOf("anilist.co") > -1) { this.id = NaN; this.aniId = utils.urlPart(url, 4); } else { this.id = NaN; } } init() { return this.update(); } ; update() { con.log('Update AniList info', this.id ? 'MAL: ' + this.id : 'AniList: ' + this.aniId); var selectId = this.id; var selectQuery = 'idMal'; if (isNaN(this.id)) { selectId = this.aniId; selectQuery = 'id'; } var query = ` query ($id: Int, $type: MediaType) { Media (${selectQuery}: $id, type: $type) { id idMal episodes chapters volumes averageScore coverImage{ large } title { userPreferred } mediaListEntry { status progress progressVolumes score(format: POINT_10) repeat notes } } } `; var variables = { id: selectId, type: this.type.toUpperCase() }; return api.request.xhr('POST', { url: 'https://graphql.anilist.co', headers: { 'Authorization': 'Bearer ' + _helper__WEBPACK_IMPORTED_MODULE_0__[/* accessToken */ "a"](), 'Content-Type': 'application/json', 'Accept': 'application/json', }, data: JSON.stringify({ query: query, variables: variables }) }).then((response) => { var res = JSON.parse(response.responseText); con.log(res); this.login = true; _helper__WEBPACK_IMPORTED_MODULE_0__[/* errorHandling */ "c"](res); this.animeInfo = res.data.Media; this.aniId = this.animeInfo.id; if (isNaN(this.id) && this.animeInfo.idMal) { this.id = this.animeInfo.idMal; } this.addAnime = false; if (this.animeInfo.mediaListEntry === null) { this.addAnime = true; this.animeInfo.mediaListEntry = { notes: "", progress: 0, progressVolumes: 0, repeat: 0, score: 0, status: 'PLANNING' }; } this.name = this.animeInfo.title.userPreferred; this.totalEp = this.animeInfo.episodes ? this.animeInfo.episodes : this.animeInfo.chapters; if (this.animeInfo.volumes) { this.totalVol = this.animeInfo.volumes; } }); } getEpisode() { return this.animeInfo.mediaListEntry.progress; } setEpisode(ep) { if (ep + '' === '') ep = 0; this.animeInfo.mediaListEntry.progress = parseInt(ep + ''); } getVolume() { if (this.type == "manga") { return this.animeInfo.mediaListEntry.progressVolumes; } return false; } setVolume(ep) { if (this.type == "manga") { this.animeInfo.mediaListEntry.progressVolumes = ep; return; } con.error('You cant set Volumes for animes'); } getStatus() { if (this.addAnime) return 0; return _helper__WEBPACK_IMPORTED_MODULE_0__[/* translateList */ "d"](this.animeInfo.mediaListEntry.status); } setStatus(status) { this.animeInfo.mediaListEntry.status = _helper__WEBPACK_IMPORTED_MODULE_0__[/* translateList */ "d"](status, parseInt(status.toString())); } getScore() { return this.animeInfo.mediaListEntry.score; } setScore(score) { this.animeInfo.mediaListEntry.score = score; } getRewatching() { if (this.type == "manga") { return this.animeInfo[".add_manga[is_rereading]"]; } return this.animeInfo[".add_anime[is_rewatching]"]; } setRewatching(rewatching) { if (this.type == "manga") { this.animeInfo[".add_manga[is_rereading]"] = rewatching; } this.animeInfo[".add_anime[is_rewatching]"] = rewatching; } setCompletionDateToNow() { } setStartingDateToNow() { } getStreamingUrl() { var tags = this.animeInfo.mediaListEntry.notes; return utils.getUrlFromTags(tags); } setStreamingUrl(url) { var tags = this.animeInfo.mediaListEntry.notes; tags = utils.setUrlInTags(url, tags); this.animeInfo.mediaListEntry.notes = tags; } getRating() { return __awaiter(this, void 0, void 0, function* () { return this.animeInfo.averageScore; }); } setResumeWaching(url, ep) { return __awaiter(this, void 0, void 0, function* () { return utils.setResumeWaching(url, ep, this.type, this.id); }); } getResumeWaching() { return __awaiter(this, void 0, void 0, function* () { return utils.getResumeWaching(this.type, this.id); }); } setContinueWaching(url, ep) { return __awaiter(this, void 0, void 0, function* () { return utils.setContinueWaching(url, ep, this.type, this.id); }); } getContinueWaching() { return __awaiter(this, void 0, void 0, function* () { return utils.getContinueWaching(this.type, this.id); }); } getImage() { return __awaiter(this, void 0, void 0, function* () { return this.animeInfo.coverImage.large; }); } clone() { const copy = new this.constructor(); Object.assign(copy, this); copy.animeInfo = Object.assign({}, this.animeInfo); copy.animeInfo.mediaListEntry = Object.assign({}, this.animeInfo.mediaListEntry); return copy; } sync() { var status = utils.status; return new Promise((resolve, reject) => { var This = this; var url = "https://myanimelist.net/ownlist/" + this.type + "/" + this.id + "/edit"; if (this.addAnime) { var imgSelector = 'malSyncImg' + this.id; var flashConfirmText = ` Is "${this.name}" correct? <br> <img id="${imgSelector}" style=" height: 200px; min-height: 200px; min-width: 144px; border: 1px solid; margin-top: 10px; display: inline; " src="" /> <br> <!--<a style="margin-left: -2px;" target="_blank" href="https://github.com/lolamtisch/MALSync/wiki/Troubleshooting#myanimeentry-entry-is-not-correct">[How to correct entries]</a>--> `; if (This.miniMAL) { flashConfirmText = ` Add "${this.name}" to MAL?`; } if (this.type == 'anime') { url = "https://myanimelist.net/ownlist/anime/add?selected_series_id=" + this.id; utils.flashConfirm(flashConfirmText, 'add', function () { continueCall(); }, function () { wrongCall(); /*if(change['checkIncrease'] == 1){TODO episodeInfo(change['.add_anime[num_watched_episodes]'], actual['malurl']); }*/ }); } else { url = "https://myanimelist.net/ownlist/manga/add?selected_manga_id=" + this.id; utils.flashConfirm(flashConfirmText, 'add', function () { continueCall(); }, function () { wrongCall(); }); } if (!This.miniMAL) { this.getImage().then((image) => { j.$('#' + imgSelector).attr('src', image); }); j.$('.Yes').text('YES'); j.$('.Cancel').text('NO'); } return; } else { //Rewatching var watchCounter = '.add_anime[num_watched_times]'; var rewatchText = 'Rewatch Anime?'; var rewatchFinishText = 'Finish rewatching?'; if (this.type == "manga") { watchCounter = '.add_manga[num_read_times]'; rewatchText = 'Reread Manga?'; rewatchFinishText = 'Finish rereading?'; } if (this.getStatus() == status.completed && this.getEpisode() === 1 && this.totalEp !== 1 && this.getRewatching() !== 1) { utils.flashConfirm(rewatchText, 'add', () => { this.setRewatching(1); continueCall(); }, function () { continueCall(); }); return; } if (this.getStatus() == status.completed && this.getEpisode() === this.totalEp && this.getRewatching() === 1) { utils.flashConfirm(rewatchFinishText, 'add', () => { this.setRewatching(0); if (this.animeInfo[watchCounter] === '') { this.animeInfo[watchCounter] = 1; } else { this.animeInfo[watchCounter] = parseInt(this.animeInfo[watchCounter]) + 1; } continueCall(); }, function () { continueCall(); }); return; } } function wrongCall() { This.wrong = true; if (!This.miniMAL) { var miniButton = j.$('button.open-info-popup'); if (miniButton.css('display') != 'none') { miniButton.click(); } else { miniButton.click(); miniButton.click(); } } } continueCall(); function continueCall() { //TODO progressVolumes var query = ` mutation ($mediaId: Int, $status: MediaListStatus, $progress: Int, $scoreRaw: Int, $notes: String) { SaveMediaListEntry (mediaId: $mediaId, status: $status, progress: $progress, scoreRaw: $scoreRaw, notes: $notes) { id status progress } } `; var variables = { "mediaId": This.aniId, "status": This.animeInfo.mediaListEntry.status, "progress": This.animeInfo.mediaListEntry.progress, "scoreRaw": This.animeInfo.mediaListEntry.score * 10, "notes": This.animeInfo.mediaListEntry.notes }; con.log('[SET] Object:', variables); api.request.xhr('POST', { url: 'https://graphql.anilist.co', headers: { 'Authorization': 'Bearer ' + _helper__WEBPACK_IMPORTED_MODULE_0__[/* accessToken */ "a"](), 'Content-Type': 'application/json', 'Accept': 'application/json', }, data: JSON.stringify({ query: query, variables: variables }) }).then((response) => { var res = JSON.parse(response.responseText); con.log(res); _helper__WEBPACK_IMPORTED_MODULE_0__[/* errorHandling */ "c"](res); con.log('Update Succeeded'); resolve(); }); } }); } } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(2), __webpack_require__(1), __webpack_require__(0), __webpack_require__(3))) /***/ }), /* 11 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(con, utils, api) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return userList; }); /* unused harmony export prepareData */ /* unused harmony export UserName */ /* harmony import */ var _helper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); //Status: 1 = watching | 2 = completed | 3 = onhold | 4 = dropped | 6 = plan to watch | 7 = all function userList(status = 1, localListType = 'anime', callbacks, username = null, offset = 0, templist = []) { if (offset < 1) offset = 1; var anilist = false; if (typeof callbacks.anilist != 'undefined') { anilist = true; } con.log('[UserList][AniList]', 'username: ' + username, 'status: ' + status, 'offset: ' + offset); if (username == null) { UserName(function (usernameTemp) { if (usernameTemp == false) { utils.flashm("Please log in on <a target='_blank' href='https://myanimelist.net/login.php'>MyAnimeList!<a>"); // @ts-ignore if (typeof callbacks.fullListCallback !== 'undefined') callbacks.fullListCallback([]); // @ts-ignore if (typeof callbacks.finishCallback !== 'undefined') callbacks.finishCallback(); } else { userList(status, localListType, callbacks, usernameTemp, offset, templist); } }); return; } var query = ` query ($page: Int, $userName: String, $type: MediaType, $status: MediaListStatus) { Page (page: $page, perPage: 100) { pageInfo { hasNextPage } mediaList (status: $status, type: $type, userName: $userName) { status progress progressVolumes notes media { id idMal episodes chapters volumes averageScore coverImage{ large } title { userPreferred } } } } } `; if (anilist) { query = ` query ($page: Int, $userName: String, $type: MediaType, $status: MediaListStatus) { Page (page: $page, perPage: 100) { pageInfo { hasNextPage } mediaList (status: $status, type: $type, userName: $userName) { progress media { id idMal } } } } `; } var variables = { page: offset, userName: username, type: localListType.toUpperCase(), status: _helper__WEBPACK_IMPORTED_MODULE_0__[/* translateList */ "d"](parseInt(status.toString()), parseInt(status.toString())) }; api.request.xhr('POST', { url: 'https://graphql.anilist.co', headers: { 'Authorization': 'Bearer ' + _helper__WEBPACK_IMPORTED_MODULE_0__[/* accessToken */ "a"](), 'Content-Type': 'application/json', 'Accept': 'application/json', }, data: JSON.stringify({ query: query, variables: variables }) }).then((response) => { var res = JSON.parse(response.responseText); con.log(res); _helper__WEBPACK_IMPORTED_MODULE_0__[/* errorHandling */ "c"](res); var data = res.data.Page.mediaList; if (anilist) { data = prepareAnilist(data, localListType); } else { data = prepareData(data, localListType); } if (typeof callbacks.singleCallback !== 'undefined') { // @ts-ignore if (!data.length) callbacks.singleCallback(false, 0, 0); for (var i = 0; i < data.length; i++) { // @ts-ignore callbacks.singleCallback(data[i], i + offset + 1, data.length + offset); } } if (typeof callbacks.fullListCallback !== 'undefined') { templist = templist.concat(data); } if (res.data.Page.pageInfo.hasNextPage) { if (typeof callbacks.continueCall !== 'undefined') { // @ts-ignore callbacks.continueCall(function () { userList(status, localListType, callbacks, username, offset + 1, templist); }); } else { userList(status, localListType, callbacks, username, offset + 1, templist); } } else { // @ts-ignore if (typeof callbacks.fullListCallback !== 'undefined') callbacks.fullListCallback(templist); // @ts-ignore if (typeof callbacks.finishCallback !== 'undefined') callbacks.finishCallback(); } }); } function prepareData(data, listType) { var newData = []; for (var i = 0; i < data.length; i++) { var el = data[i]; if (listType === "anime") { var tempData = { id: el.media.idMal, type: listType, title: el.media.title.userPreferred, url: 'https://myanimelist.net/' + listType + '/' + el.media.idMal + '/' + el.media.title.userPreferred, watchedEp: el.progress, totalEp: el.media.episodes, image: el.media.coverImage.large, tags: el.notes, airingState: el['anime_airing_status'], }; } else { var tempData = { id: el.media.idMal, type: listType, title: el.media.title.userPreferred, url: 'https://myanimelist.net/' + listType + '/' + el.media.idMal + '/' + el.media.title.userPreferred, watchedEp: el.progress, totalEp: el.media.chapters, image: el.media.coverImage.large, tags: el.notes, airingState: el['anime_airing_status'], }; } if (tempData.totalEp == null) { tempData.totalEp = 0; } newData.push(tempData); } return newData; } function UserName(callback) { var query = ` query { Viewer { name id } } `; api.request.xhr('POST', { url: 'https://graphql.anilist.co', headers: { 'Authorization': 'Bearer ' + _helper__WEBPACK_IMPORTED_MODULE_0__[/* accessToken */ "a"](), 'Content-Type': 'application/json', 'Accept': 'application/json', }, data: JSON.stringify({ query: query, variables: [] }) }).then((response) => { var res = JSON.parse(response.responseText); con.log(res); _helper__WEBPACK_IMPORTED_MODULE_0__[/* errorHandling */ "c"](res); callback(res.data.Viewer.name); }); } function prepareAnilist(data, listType) { var newData = []; for (var i = 0; i < data.length; i++) { var el = data[i]; newData.push({ malid: el.media.idMal, id: el.media.id, watchedEp: el.progress, }); } return newData; } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1), __webpack_require__(2), __webpack_require__(0))) /***/ }), /* 12 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(j) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return userscriptLegacy; }); var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; const userscriptLegacy = { set(key, value) { return __awaiter(this, void 0, void 0, function* () { GM_setValue(key, value); }); }, get(key) { return __awaiter(this, void 0, void 0, function* () { const value = GM_getValue(key); return value; }); }, remove(key) { return __awaiter(this, void 0, void 0, function* () { GM_deleteValue(key); }); }, list() { return __awaiter(this, void 0, void 0, function* () { var reverseArray = {}; j.$.each(GM_listValues(), function (index, cache) { reverseArray[cache] = index; }); return reverseArray; }); }, addStyle(css) { return __awaiter(this, void 0, void 0, function* () { GM_addStyle(css); }); }, version() { return GM_info.script.version; }, assetUrl(filename) { return 'https://raw.githubusercontent.com/lolamtisch/MALSync/master/assets/assets/' + filename; }, injectCssResource(res, head) { head.append(j.$('<style>') .attr("rel", "stylesheet") .attr("type", "text/css") .html(GM_getResourceText(res))); }, injectjsResource(res, head) { var s = document.createElement('script'); s.text = GM_getResourceText(res); s.onload = function () { // @ts-ignore this.remove(); }; head.get(0).appendChild(s); }, updateDom(head) { var s = document.createElement('script'); s.text = ` document.getElementsByTagName('head')[0].onclick = function(e){ try{ componentHandler.upgradeDom(); }catch(e){ console.log(e); setTimeout(function(){ componentHandler.upgradeDom(); },500); } }`; s.onload = function () { // @ts-ignore this.remove(); }; head.get(0).appendChild(s); } }; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(3))) /***/ }), /* 13 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(api, con) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return settingsObj; }); var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var settingsObj = { options: { autoTracking: true, userscriptMode: false, syncMode: 'MAL', delay: 0, malTags: true, malResume: true, epPredictions: true, posLeft: 'left', miniMALonMal: false, displayFloatButton: true, outWay: true, miniMalWidth: '30%', miniMalHeight: '90%', malThumbnail: 100, friendScore: true, '9anime': true, Crunchyroll: true, Gogoanime: true, Kissanime: true, Masterani: true, Animeheaven: true, Twistmoe: true, Anime4you: true, Kissmanga: true, Mangadex: true, Mangarock: true, updateCheckNotifications: true, 'anilistToken': '', }, init: function () { return __awaiter(this, void 0, void 0, function* () { return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { for (var key in this.options) { var store = yield api.storage.get('settings/' + key); if (typeof store != 'undefined') { this.options[key] = store; } } con.log('Settings', this.options); resolve(this); })); }); }, get: function (name) { return this.options[name]; }, set: function (name, value) { if (this.options.hasOwnProperty(name)) { this.options[name] = value; return api.storage.set('settings/' + name, value); } else { con.error(name + ' is not a defined option'); } } }; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(0), __webpack_require__(1))) /***/ }), /* 14 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(j, utils, api, con) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return syncPage; }); /* harmony import */ var _pages__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7); /* harmony import */ var _provider_provider__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); /* harmony import */ var _minimal_iframe__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(27); var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; class syncPage { constructor(url) { this.url = url; this.UILoaded = false; this.page = this.getPage(url); if (this.page == null) { throw new Error('Page could not be recognized'); } } init() { var This = this; j.$(document).ready(function () { Object(_minimal_iframe__WEBPACK_IMPORTED_MODULE_2__[/* initIframeModal */ "a"])(This); }); this.page.init(this); } getPage(url) { for (var key in _pages__WEBPACK_IMPORTED_MODULE_0__[/* pages */ "b"]) { var page = _pages__WEBPACK_IMPORTED_MODULE_0__[/* pages */ "b"][key]; if (j.$.isArray(page.domain)) { for (var k in page.domain) { var singleDomain = page.domain[k]; if (checkDomain(singleDomain)) { page.domain = singleDomain; return page; } } } else { if (checkDomain(page.domain)) { return page; } } function checkDomain(domain) { if (url.indexOf(utils.urlPart(domain, 2).split('.').slice(-2, -1)[0] + '.') > -1) { return true; } return false; } } return null; } handlePage() { return __awaiter(this, void 0, void 0, function* () { var state; var This = this; this.url = window.location.href; this.loadUI(); if (this.page.isSyncPage(this.url)) { state = { title: this.page.sync.getTitle(this.url), identifier: this.page.sync.getIdentifier(this.url) }; this.offset = yield api.storage.get(this.page.name + '/' + state.identifier + '/Offset'); state.episode = +parseInt(this.page.sync.getEpisode(this.url) + '') + parseInt(this.getOffset()); if (typeof (this.page.sync.getVolume) != "undefined") { state.volume = this.page.sync.getVolume(this.url); } con.log('Sync', state); } else { if (typeof (this.page.overview) == "undefined") { con.log('No overview definition'); return; } state = { title: this.page.overview.getTitle(this.url), identifier: this.page.overview.getIdentifier(this.url) }; this.offset = yield api.storage.get(this.page.name + '/' + state.identifier + '/Offset'); con.log('Overview', state); } var malUrl = yield this.getMalUrl(state.identifier, state.title, this.page); if (malUrl === null) { j.$("#MalInfo").text("Not Found!"); con.log('Not on mal'); } else if (!malUrl) { j.$("#MalInfo").text("Nothing Found!"); con.log('Nothing found'); } else { con.log('MyAnimeList', malUrl); this.malObj = Object(_provider_provider__WEBPACK_IMPORTED_MODULE_1__[/* entryClass */ "a"])(malUrl); yield this.malObj.init(); this.oldMalObj = this.malObj.clone(); //fillUI this.fillUI(); if (!this.malObj.login) { utils.flashm("Please log in on <a target='_blank' href='https://myanimelist.net/login.php'>MyAnimeList!<a>", { error: true }); return; } //sync if (this.page.isSyncPage(this.url)) { if (yield this.handleAnimeUpdate(state)) { con.log('Start Sync (' + api.settings.get('delay') + ' Seconds)'); if (api.settings.get('autoTracking')) { setTimeout(() => { sync(); }, api.settings.get('delay') * 1000); } else { if (This.page.type == 'anime') { var epis = 'episode: ' + state.episode; } else { var epis = 'chapter: <b>' + state.episode + '</b>'; } var message = '<button class="sync" style="margin-bottom: 8px; background-color: transparent; border: none; color: rgb(255,64,129);margin-top: 10px;cursor: pointer;">Update MAL to ' + epis + '</button>'; utils.flashm(message, { hoverInfo: true, error: true, type: 'update' }).find('.sync').on('click', function () { j.$('.flashinfo').remove(); sync(); }); //Debugging con.log('overviewUrl', This.page.sync.getOverviewUrl(This.url)); if (typeof This.page.sync.nextEpUrl !== 'undefined') { con.log('nextEp', This.page.sync.nextEpUrl(This.url)); } } function sync() { This.malObj.setResumeWaching(This.url, state.episode); if (typeof This.page.sync.nextEpUrl !== 'undefined') { var continueWatching = This.page.sync.nextEpUrl(This.url); if (continueWatching && !(continueWatching.indexOf('undefined') != -1)) { This.malObj.setContinueWaching(continueWatching, state.episode + 1); } } This.syncHandling(true); } } else { con.log('Nothing to Sync'); } } } }); } syncHandling(hoverInfo = false) { var This = this; return this.malObj.sync() .then(function () { var message = This.malObj.name; var split = '<br>'; var totalVol = This.malObj.totalVol; if (totalVol == 0) totalVol = '?'; var totalEp = This.malObj.totalEp; if (totalEp == 0) totalEp = '?'; if (typeof This.oldMalObj == "undefined" || This.malObj.getStatus() != This.oldMalObj.getStatus()) { var statusString = ""; switch (parseInt(This.malObj.getStatus())) { case 1: statusString = utils.watching(This.page.type); break; case 2: statusString = 'Completed'; break; case 3: statusString = 'On-Hold'; break; case 4: statusString = 'Dropped'; break; case 6: statusString = utils.planTo(This.page.type); break; } message += split + statusString; split = ' | '; } if (This.page.type == 'manga' && (typeof This.oldMalObj == "undefined" || This.malObj.getVolume() != This.oldMalObj.getVolume())) { message += split + 'Volume: ' + This.malObj.getVolume() + "/" + totalVol; split = ' | '; } if (typeof This.oldMalObj == "undefined" || This.malObj.getEpisode() != This.oldMalObj.getEpisode()) { message += split + 'Episode: ' + This.malObj.getEpisode() + "/" + totalEp; split = ' | '; } if (typeof This.oldMalObj == "undefined" || This.malObj.getScore() != This.oldMalObj.getScore() && This.malObj.getScore() != '') { message += split + 'Rating: ' + This.malObj.getScore(); split = ' | '; } if (hoverInfo) { /*if(episodeInfoBox){//TODO episodeInfo(change['.add_anime[num_watched_episodes]'], actual['malurl'], message, function(){ undoAnime['checkIncrease'] = 0; setanime(thisUrl, undoAnime, null, localListType); j.$('.info-Mal-undo').remove(); if(j.$('.flashinfo>div').text() == ''){ j.$('.flashinfo').remove(); } }); }*/ if (typeof This.oldMalObj != "undefined") { message += '<br><button class="undoButton" style="background-color: transparent; border: none; color: rgb(255,64,129);margin-top: 10px;cursor: pointer;">Undo</button>'; } utils.flashm(message, { hoverInfo: true, type: 'update' }).find('.undoButton').on('click', function () { this.closest('.flash').remove(); This.malObj = This.oldMalObj; This.oldMalObj = undefined; This.syncHandling(); }); } else { utils.flashm(message); } This.fillUI(); return; }).catch(function (e) { con.error(e); utils.flashm("Update failed", { error: true }); return; }); } handleAnimeUpdate(state) { return __awaiter(this, void 0, void 0, function* () { var status = utils.status; if (this.malObj.getEpisode() >= state.episode && //Rewatching !(this.malObj.getStatus() == status.completed && state.episode === 1 && this.malObj.totalEp !== 1 && this.malObj.getRewatching() !== 1)) { return false; } this.malObj.setEpisode(state.episode); this.malObj.setStreamingUrl(this.page.sync.getOverviewUrl(this.url)); this.malObj.setStartingDateToNow(); if (this.malObj.getStatus() !== status.completed && parseInt(state.episode) === this.malObj.totalEp && parseInt(state.episode) != 0) { if (yield utils.flashConfirm('Set as completed?', 'complete')) { this.malObj.setStatus(status.completed); this.malObj.setCompletionDateToNow(); return true; } } if (this.malObj.getStatus() !== status.watching && this.malObj.getStatus() !== status.completed && state.status !== status.completed) { if (yield utils.flashConfirm('Start ' + utils.watching(this.page.type).toLowerCase() + '?', 'start')) { this.malObj.setStatus(status.watching); } else { return false; } } return true; }); } fillUI() { j.$('.MalLogin').css("display", "initial"); j.$('#AddMalDiv').remove(); j.$("#malRating").attr("href", this.malObj.url); this.malObj.getRating().then((rating) => { j.$("#malRating").text(rating); }); if (!this.malObj.login) { j.$('.MalLogin').css("display", "none"); j.$("#MalData").css("display", "flex"); j.$("#MalInfo").text(""); j.$("#malRating").after(" <span id='LoginMalDiv'>Please log in on <a target='_blank' id='login' href='https://myanimelist.net/login.php'>MyAnimeList!<a></span>"); return; } if (this.malObj.addAnime) { j.$('.MalLogin').css("display", "none"); j.$("#malRating").after("<span id='AddMalDiv'> <a href='#' id='AddMal' onclick='return false;'>Add to MAL</a></span>"); var This = this; j.$('#AddMal').click(function () { This.malObj.setStatus(6); This.syncHandling() .then(() => { return This.malObj.update(); }).then(() => { This.fillUI(); }); }); } else { j.$("#malTotal, #malTotalCha").text(this.malObj.totalEp); if (this.malObj.totalEp == 0) { j.$("#malTotal, #malTotalCha").text('?'); } j.$("#malTotalVol").text(this.malObj.totalVol); if (this.malObj.totalVol == 0) { j.$("#malTotalVol").text('?'); } j.$("#malEpisodes").val(this.malObj.getEpisode()); j.$("#malVolumes").val(this.malObj.getVolume()); j.$("#malStatus").val(this.malObj.getStatus()); j.$("#malUserRating").val(this.malObj.getScore()); } j.$("#MalData").css("display", "flex"); j.$("#MalInfo").text(""); j.$("#malEpisodes, #malVolumes").trigger('input'); try { this.handleList(true); } catch (e) { con.error(e); } } handleList(searchCurrent = false, reTry = 0) { j.$('.mal-sync-active').removeClass('mal-sync-active'); if (typeof (this.page.overview) != "undefined" && typeof (this.page.overview.list) != "undefined") { var epList = this.getEpList(); if (typeof (epList) != "undefined" && epList.length > 0) { this.offsetHandler(epList); var elementUrl = this.page.overview.list.elementUrl; con.log("Episode List", j.$.map(epList, function (val, i) { if (typeof (val) != "undefined") { return elementUrl(val); } return '-'; })); var curEp = epList[this.malObj.getEpisode()]; if (typeof (curEp) != "undefined" && curEp) { curEp.addClass('mal-sync-active'); } else if (this.malObj.getEpisode() && searchCurrent && reTry < 10 && typeof this.page.overview.list.paginationNext !== 'undefined') { con.log('Pagination next'); var This = this; if (this.page.overview.list.paginationNext()) { setTimeout(function () { reTry++; This.handleList(true, reTry); }, 500); } } var nextEp = epList[this.malObj.getEpisode() + 1]; if (typeof (nextEp) != "undefined" && nextEp && !this.page.isSyncPage(this.url)) { var message = '<a href="' + elementUrl(nextEp) + '">' + utils.episode(this.page.type) + ' ' + (this.malObj.getEpisode() + 1) + '</a>'; utils.flashm(message, { hoverInfo: true, type: 'nextEp' }); } } } } getEpList() { var This = this; if (typeof (this.page.overview) != "undefined" && typeof (this.page.overview.list) != "undefined") { var elementEp = this.page.overview.list.elementEp; var elementArray = []; this.page.overview.list.elementsSelector().each(function (index, el) { try { var elEp = parseInt(elementEp(j.$(el)) + "") + parseInt(This.getOffset()); elementArray[elEp] = j.$(el); } catch (e) { con.info(e); } }); return elementArray; } } offsetHandler(epList) { if (!this.page.overview.list.offsetHandler) return; if (typeof this.offset !== 'undefined' && this.offset !== "0") return; for (var i = 0; i < epList.length; ++i) { if (typeof epList[i] !== 'undefined') { con.log('Offset', i); if (i > 1) { var calcOffset = 1 - i; utils.flashConfirm('A possible Episode offset of ' + calcOffset + ' was detected. Is that correct? ', 'offset', () => { this.setOffset(calcOffset); }, () => { this.setOffset(0); }); } return; } } } cdn() { } getMalUrl(identifier, title, page) { return __awaiter(this, void 0, void 0, function* () { var This = this; var cache = yield api.storage.get(this.page.name + '/' + identifier + '/Mal', null); if (typeof (cache) != "undefined") { con.log('Cache', this.page.name + '/' + identifier, cache); return cache; } if (typeof page.database != "undefined") { var firebaseVal = yield firebase(); if (firebaseVal !== false) { return firebaseVal; } } var malSearchVal = yield malSearch(); if (malSearchVal !== false) { return malSearchVal; } return false; function firebase() { var url = 'https://kissanimelist.firebaseio.com/Data2/' + page.database + '/' + encodeURIComponent(titleToDbKey(identifier)).toLowerCase() + '/Mal.json'; con.log("Firebase", url); return api.request.xhr('GET', url).then((response) => { con.log("Firebase response", response.responseText); if (response.responseText !== 'null' && !(response.responseText.indexOf("error") > -1)) { var returnUrl = ''; if (response.responseText.split('"')[1] == 'Not-Found') { returnUrl = null; } else { returnUrl = 'https://myanimelist.net/' + page.type + '/' + response.responseText.split('"')[1] + '/' + response.responseText.split('"')[3]; } This.setCache(returnUrl, false, identifier); return returnUrl; } else { return false; } }); } function malSearch() { var url = "https://myanimelist.net/" + page.type + ".php?q=" + encodeURI(title); con.log("malSearch", url); return api.request.xhr('GET', url).then((response) => { if (response.responseText !== 'null' && !(response.responseText.indexOf(" error ") > -1)) { try { var link = response.responseText.split('<a class="hoverinfo_trigger" href="')[1].split('"')[0]; This.setCache(link, true, identifier); return link; } catch (e) { con.error(e); try { var link = response.responseText.split('class="picSurround')[1].split('<a')[1].split('href="')[1].split('"')[0]; This.setCache(link, true, identifier); return link; } catch (e) { con.error(e); return false; } } } else { return false; } }); } //Helper function titleToDbKey(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'); } ; }); } setCache(url, toDatabase, identifier = null) { if (identifier == null) { if (this.page.isSyncPage(this.url)) { identifier = this.page.sync.getIdentifier(this.url); } else { identifier = this.page.overview.getIdentifier(this.url); } } api.storage.set(this.page.name + '/' + identifier + '/Mal', url); this.databaseRequest(url, toDatabase, identifier); } databaseRequest(malurl, toDatabase, identifier, kissurl = null) { if (typeof this.page.database != 'undefined' && toDatabase) { if (kissurl == null) { if (this.page.isSyncPage(this.url)) { kissurl = this.page.sync.getOverviewUrl(this.url); } else { kissurl = this.url; } } var param = { Kiss: kissurl, Mal: malurl }; if (toDatabase == 'correction') { param['newCorrection'] = true; } var url = 'https://kissanimelist.firebaseio.com/Data2/Request/' + this.page.database + 'Request.json'; api.request.xhr('POST', { url: url, data: JSON.stringify(param) }).then((response) => { if (response.responseText !== 'null' && !(response.responseText.indexOf("error") > -1)) { con.log("[DB] Send to database:", param); } else { con.error("[DB] Send to database:", response.responseText); } }); } } deleteCache() { var getIdentifier; if (this.page.isSyncPage(this.url)) { getIdentifier = this.page.sync.getIdentifier; } else { getIdentifier = this.page.overview.getIdentifier; } api.storage.remove(this.page.name + '/' + getIdentifier(this.url) + '/Mal'); } getOffset() { if (typeof this.offset == 'undefined') return 0; return this.offset; } setOffset(value) { return __awaiter(this, void 0, void 0, function* () { this.offset = value; var getIdentifier; if (this.page.isSyncPage(this.url)) { getIdentifier = this.page.sync.getIdentifier; } else { getIdentifier = this.page.overview.getIdentifier; this.handleList(); } var returnValue = api.storage.set(this.page.name + '/' + getIdentifier(this.url) + '/Offset', value); if (typeof this.malObj != 'undefined') { api.storage.remove('updateCheck/' + this.malObj.type + '/' + this.malObj.id); } return returnValue; }); } loadUI() { if (this.UILoaded) return; this.UILoaded = true; var wrapStart = '<span style="display: inline-block;">'; var wrapEnd = '</span>'; var ui = '<p id="malp">'; ui += '<span id="MalInfo">Loading</span>'; ui += '<span id="MalData" style="display: none; justify-content: space-between; flex-wrap: wrap;">'; ui += wrapStart; ui += '<span class="info">MAL Score: </span>'; ui += '<a id="malRating" style="min-width: 30px;display: inline-block;" target="_blank" href="">____</a>'; ui += wrapEnd; //ui += '<span id="MalLogin">'; wrapStart = '<span style="display: inline-block; display: none;" class="MalLogin">'; ui += wrapStart; ui += '<span class="info">Status: </span>'; ui += '<select id="malStatus">'; //ui += '<option value="0" ></option>'; ui += '<option value="1" >' + utils.watching(this.page.type) + '</option>'; ui += '<option value="2" >Completed</option>'; ui += '<option value="3" >On-Hold</option>'; ui += '<option value="4" >Dropped</option>'; ui += '<option value="6" >' + utils.planTo(this.page.type) + '</option>'; ui += '</select>'; ui += wrapEnd; if (this.page.type == 'anime') { var middle = ''; middle += wrapStart; middle += '<span class="info">Episode: </span>'; middle += '<span style=" text-decoration: none; outline: medium none;">'; middle += '<input id="malEpisodes" value="0" type="text" size="1" maxlength="4">'; middle += '/<span id="malTotal">0</span>'; middle += '</span>'; middle += wrapEnd; } else { var middle = ''; middle += wrapStart; middle += '<span class="info">Volume: </span>'; middle += '<span style=" text-decoration: none; outline: medium none;">'; middle += '<input id="malVolumes" value="0" type="text" size="1" maxlength="4">'; middle += '/<span id="malTotalVol">0</span>'; middle += '</span>'; middle += wrapEnd; middle += wrapStart; middle += '<span class="info">Chapter: </span>'; middle += '<span style=" text-decoration: none; outline: medium none;">'; middle += '<input id="malEpisodes" value="0" type="text" size="1" maxlength="4">'; middle += '/<span id="malTotalCha">0</span>'; middle += '</span>'; middle += wrapEnd; } ui += middle; ui += wrapStart; ui += '<span class="info">Your Score: </span>'; ui += '<select id="malUserRating"><option value="" >Select</option>'; ui += '<option value="10" >(10) Masterpiece</option>'; ui += '<option value="9" >(9) Great</option>'; ui += '<option value="8" >(8) Very Good</option>'; ui += '<option value="7" >(7) Good</option>'; ui += '<option value="6" >(6) Fine</option>'; ui += '<option value="5" >(5) Average</option>'; ui += '<option value="4" >(4) Bad</option>'; ui += '<option value="3" >(3) Very Bad</option>'; ui += '<option value="2" >(2) Horrible</option>'; ui += '<option value="1" >(1) Appalling</option>'; ui += '</select>'; ui += wrapEnd; //ui += '</span>'; ui += '</span>'; ui += '</p>'; var uihead = ''; uihead += '<p class="headui" style="float: right; margin: 0; margin-right: 10px">'; uihead += ''; uihead += '</p>'; var uiwrong = ''; uiwrong += '<button class="open-info-popup mdl-button" style="display:none; margin-left: 6px;">MAL</button>'; if (this.page.isSyncPage(this.url)) { if (typeof (this.page.sync.uiSelector) != "undefined") { this.page.sync.uiSelector(j.$(ui)); } } else { if (typeof (this.page.overview) != "undefined") { this.page.overview.uiSelector(j.$(ui)); } } var This = this; j.$("#malEpisodes, #malVolumes, #malUserRating, #malStatus").change(function () { This.buttonclick(); }); j.$("#malEpisodes, #malVolumes").on('input', function () { //@ts-ignore var el = $(this); var numberlength = el.val().toString().length; if (numberlength < 1) numberlength = 1; var numberWidth = (numberlength * 7.7) + 3; el.css('width', numberWidth + 'px'); }).trigger('input'); } buttonclick() { this.malObj.setEpisode(j.$("#malEpisodes").val()); if (j.$("#malVolumes").length) this.malObj.setVolume(j.$("#malVolumes").val()); this.malObj.setScore(j.$("#malUserRating").val()); this.malObj.setStatus(j.$("#malStatus").val()); this.syncHandling() .then(() => { return this.malObj.update(); }).then(() => { this.fillUI(); }); } } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(3), __webpack_require__(2), __webpack_require__(0), __webpack_require__(1))) /***/ }), /* 15 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(utils, j, con, api) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Kissanime; }); const Kissanime = { name: 'kissanime', domain: 'http://kissanime.ru', database: 'Kissanime', type: 'anime', isSyncPage: function (url) { if (typeof utils.urlPart(url, 5) != 'undefined') { if (j.$('#centerDivVideo').length) { return true; } } return false; }, sync: { getTitle: function (url) { return Kissanime.sync.getIdentifier(url); }, getIdentifier: function (url) { return utils.urlPart(url, 4); }, getOverviewUrl: function (url) { return url.split('/').slice(0, 5).join('/'); }, getEpisode: function (url) { var episodePart = utils.urlPart(url, 5); var temp = []; temp = episodePart.match(/[e,E][p,P][i,I]?[s,S]?[o,O]?[d,D]?[e,E]?\D?\d{3}/); if (temp !== null) { episodePart = temp[0]; } temp = episodePart.match(/\d{3}/); if (temp === null) { temp = episodePart.match(/\d{2,}\-/); if (temp === null) { episodePart = 0; } else { episodePart = temp[0]; } } else { episodePart = temp[0]; } return episodePart; }, nextEpUrl: function (url) { return url.replace(/\/[^\/]*$/, '') + '/' + j.$('#selectEpisode option:selected').next().val(); } }, overview: { getTitle: function () { return j.$('.bigChar').first().text(); }, getIdentifier: function (url) { return Kissanime.sync.getIdentifier(url); }, uiSelector: function (selector) { selector.insertAfter(j.$(".bigChar").first()); }, list: { offsetHandler: true, elementsSelector: function () { return j.$(".listing tr"); }, elementUrl: function (selector) { return utils.absoluteLink(selector.find('a').first().attr('href'), Kissanime.domain); }, elementEp: function (selector) { var url = Kissanime.overview.list.elementUrl(selector); if (/_ED/.test(url)) return NaN; return Kissanime.sync.getEpisode(url); }, } }, init(page) { if (document.title == "Please wait 5 seconds...") { con.log("loading"); page.cdn(); return; } api.storage.addStyle(__webpack_require__(35).toString()); j.$(document).ready(function () { page.handlePage(); }); } }; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(2), __webpack_require__(3), __webpack_require__(1), __webpack_require__(0))) /***/ }), /* 16 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(utils, j, con, api) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Kissmanga; }); const Kissmanga = { name: 'kissmanga', domain: 'http://kissmanga.com', database: 'Kissmanga', type: 'manga', isSyncPage: function (url) { if (typeof utils.urlPart(url, 5) != 'undefined') { return true; } return false; }, sync: { getTitle: function (url) { return utils.urlPart(url, 4); }, getIdentifier: function (url) { return utils.urlPart(url, 4); }, getOverviewUrl: function (url) { return url.split('/').slice(0, 5).join('/'); }, getEpisode: function (url) { var episodePart = utils.urlPart(url, 5); //var temp = []; /*try{ episodePart = episodePart.replace(j.$('.bigChar').attr('href').split('/')[2],''); }catch(e){ episodePart = episodePart.replace(kalUrl.split("/")[4],''); }*/ var temp = episodePart.match(/[c,C][h,H][a,A]?[p,P]?[t,T]?[e,E]?[r,R]?\D?\d+/); if (temp === null) { episodePart = episodePart.replace(/[V,v][o,O][l,L]\D?\d+/, ''); temp = episodePart.match(/\d{3}/); if (temp === null) { temp = episodePart.match(/\d+/); if (temp === null) { episodePart = 0; } else { episodePart = temp[0]; } } else { episodePart = temp[0]; } } else { episodePart = temp[0].match(/\d+/)[0]; } return episodePart; }, getVolume: 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) { return; } return url; }, }, overview: { getTitle: function () { return j.$('.bigChar').first().text(); }, getIdentifier: function (url) { return Kissmanga.sync.getIdentifier(url); }, uiSelector: function (selector) { selector.insertAfter(j.$(".bigChar").first()); }, list: { offsetHandler: true, elementsSelector: function () { return j.$(".listing tr"); }, elementUrl: function (selector) { return utils.absoluteLink(selector.find('a').first().attr('href'), Kissmanga.domain); }, elementEp: function (selector) { var url = Kissmanga.overview.list.elementUrl(selector); if (/_ED/.test(url)) return NaN; return Kissmanga.sync.getEpisode(url); }, } }, init(page) { if (document.title == "Please wait 5 seconds...") { con.log("loading"); page.cdn(); return; } api.storage.addStyle(__webpack_require__(37).toString()); j.$(document).ready(function () { page.handlePage(); }); } }; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(2), __webpack_require__(3), __webpack_require__(1), __webpack_require__(0))) /***/ }), /* 17 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(j, utils, api, con) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return nineAnime; }); const nineAnime = { name: '9anime', domain: 'https://9anime.to', database: '9anime', type: 'anime', isSyncPage: function (url) { return true; }, sync: { getTitle: function (url) { return url.split("/")[4].split("?")[0].split(".")[0]; }, getIdentifier: function (url) { url = url.split("/")[4].split("?")[0]; if (url.indexOf(".") > -1) { url = url.split(".")[1]; } return url; }, getOverviewUrl: function (url) { return url.split('/').slice(0, 5).join('/'); }, getEpisode: function (url) { return parseInt(j.$(".servers .episodes a.active").attr('data-base')); }, nextEpUrl: function (url) { return nineAnime.domain + j.$(".servers .episodes a.active").parent('li').next().find('a').attr('href'); }, uiSelector: function (selector) { j.$('<div class="widget info"><div class="widget-body"> <p id="malp">' + selector.html() + '</p></div></div>').insertBefore(j.$(".widget.info").first()); }, }, overview: { getTitle: function (url) { return ''; }, getIdentifier: function (url) { return ''; }, uiSelector: function (selector) { }, list: { offsetHandler: false, elementsSelector: function () { return j.$(".episodes.range a"); }, elementUrl: function (selector) { return utils.absoluteLink(selector.attr('href'), nineAnime.domain); }, elementEp: function (selector) { return selector.attr('data-base'); }, } }, init(page) { api.storage.addStyle(__webpack_require__(39).toString()); utils.waitUntilTrue(function () { return j.$('.servers').length; }, function () { con.info('Start check'); page.handlePage(); utils.urlChangeDetect(function () { con.info('Check'); page.handlePage(); }); }); } }; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(3), __webpack_require__(2), __webpack_require__(0), __webpack_require__(1))) /***/ }), /* 18 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(j, utils, api) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Crunchyroll; }); //TODO: Add mal2kiss season argument const Crunchyroll = { name: 'Crunchyroll', domain: 'http://www.crunchyroll.com', database: 'Crunchyroll', type: 'anime', isSyncPage: function (url) { if (typeof url.split('/')[4] != 'undefined') { if (j.$('#showmedia_video').length) { return true; } } return false; }, sync: { getTitle: function (url) { return Crunchyroll.sync.getIdentifier(url); }, getIdentifier: function (url) { var script = (j.$("#template_body script")[1]).innerHTML; script = script.split('mediaMetadata =')[1].split('"name":"')[1].split(' -')[0]; script = JSON.parse('"' + script.replace('"', '\\"') + '"'); return script; }, getOverviewUrl: function (url) { return url.split('/').slice(0, 4).join('/') + '?season=' + Crunchyroll.sync.getIdentifier(url); }, getEpisode: function (url) { var episodePart = utils.urlPart(url, 4); var temp = []; temp = episodePart.match(/[e,E][p,P][i,I]?[s,S]?[o,O]?[d,D]?[e,E]?\D?\d+/); if (temp !== null) { episodePart = temp[0]; } else { episodePart = ''; } temp = episodePart.match(/\d+/); if (temp === null) { episodePart = 1; } else { episodePart = temp[0]; } return episodePart; }, nextEpUrl: function (url) { return Crunchyroll.domain + j.$('.collection-carousel-media-link-current').parent().next().find('.link').attr('href'); } }, overview: { getTitle: function (url) { return Crunchyroll.overview.getIdentifier(url); }, getIdentifier: function (url) { if (j.$('.season-dropdown').length > 1) { throw new Error('MAL-Sync does not support multiple seasons'); } else { if (j.$('.season-dropdown').length) { return j.$('.season-dropdown').first().text(); } else { return j.$('#source_showview h1 span').text(); } } }, uiSelector: function (selector) { selector.insertBefore(j.$("#tabs").first()); }, list: { offsetHandler: true, elementsSelector: function () { return j.$("#showview_content_videos .list-of-seasons .group-item a"); }, elementUrl: function (selector) { return utils.absoluteLink(selector.attr('href'), Crunchyroll.domain); }, elementEp: function (selector) { var url = Crunchyroll.overview.list.elementUrl(selector); return Crunchyroll.sync.getEpisode(url); }, } }, init(page) { api.storage.addStyle(__webpack_require__(41).toString()); page.setCacheTemp = page.setCache; page.setCache = function (url, toDatabase, identifier = null) { if (this.page.isSyncPage(this.url)) { this.setCacheTemp(url, toDatabase, identifier); } }; page.databaseRequestTemp = page.databaseRequest; page.databaseRequest = function (malurl, toDatabase, identifier, kissurl = null) { this.databaseRequestTemp(malurl, toDatabase, identifier, this.url + '?..' + encodeURIComponent(identifier.toLowerCase().split('#')[0]).replace(/\./g, '%2E')); }; j.$(document).ready(function () { if (j.$('.season-dropdown').length > 1) { j.$('.season-dropdown').append('<span class="exclusivMal" style="float: right; margin-right: 20px; color: #0A6DA4;" onclick="return false;">MAL</span>'); j.$('.exclusivMal').click(function (evt) { j.$('#showview_content').before('<div><a href="' + page.url.split('?')[0] + '">Show hidden seasons</a></div>'); var thisparent = j.$(evt.target).parent(); j.$('.season-dropdown').not(thisparent).siblings().remove(); j.$('.season-dropdown').not(thisparent).remove(); j.$('.portrait-grid').css('display', 'block').find("li.group-item img.landscape").each(function () { // @ts-ignore void 0 === j.$(this).attr("src") && j.$(this).attr("src", j.$(this).attr("data-thumbnailUrl")); }), j.$('.exclusivMal').remove(); page.handlePage(); }); var season = new RegExp('[\?&]' + 'season' + '=([^&#]*)').exec(page.url); if (season != null) { // @ts-ignore season = season[1] || null; if (season != null) { // @ts-ignore season = decodeURIComponent(decodeURI(season)); j.$('.season-dropdown[title="' + season + '" i] .exclusivMal').first().click(); } } return; } else { page.handlePage(); } }); } }; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(3), __webpack_require__(2), __webpack_require__(0))) /***/ }), /* 19 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(utils, j, api) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Masterani; }); const Masterani = { name: 'Masterani', domain: 'https://www.masterani.me', database: 'Masterani', type: 'anime', isSyncPage: function (url) { if (url.split('/')[4] !== 'watch') { return false; } else { return true; } }, sync: { getTitle: function (url) { return Masterani.sync.getIdentifier(url).replace(/^\d*-/, ''); }, getIdentifier: function (url) { return utils.urlPart(url, 5); }, getOverviewUrl: function (url) { return utils.absoluteLink(j.$('.info a').first().attr('href'), Masterani.domain); }, getEpisode: function (url) { return parseInt(utils.urlPart(url, 6)); }, nextEpUrl: function (url) { return Masterani.domain + j.$('#watch .anime-info .actions a').last().attr('href'); } }, overview: { getTitle: function (url) { return Masterani.sync.getTitle(url); }, getIdentifier: function (url) { return Masterani.sync.getIdentifier(url); }, uiSelector: function (selector) { selector.prependTo(j.$("#stats").first()); }, list: { offsetHandler: false, elementsSelector: function () { return j.$(".episodes .thumbnail"); }, elementUrl: function (selector) { return utils.absoluteLink(selector.find('a').first().attr('href'), Masterani.domain); }, elementEp: function (selector) { return Masterani.sync.getEpisode(Masterani.overview.list.elementUrl(selector)); }, paginationNext: function () { var el = j.$('.pagination .item').last(); if (el.hasClass('disabled')) { return false; } else { el[0].click(); return true; } } } }, init(page) { api.storage.addStyle(__webpack_require__(43).toString()); utils.waitUntilTrue(function () { return j.$('#stats,#watch').length; }, function () { page.handlePage(); j.$('.ui.toggle.checkbox, .pagination.menu').click(function () { setTimeout(function () { page.handleList(); }, 500); }); }); } }; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(2), __webpack_require__(3), __webpack_require__(0))) /***/ }), /* 20 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(j, utils, api, con) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Mangadex; }); const Mangadex = { name: 'Mangadex', domain: 'https://www.mangadex.org', database: 'Mangadex', type: 'manga', isSyncPage: function (url) { if (url.split('/')[3] !== 'chapter') { return false; } else { return true; } }, sync: { getTitle: function (url) { return j.$('.manga-link').text().trim(); }, getIdentifier: function (url) { return utils.urlPart(Mangadex.sync.getOverviewUrl(url), 4); }, getOverviewUrl: function (url) { return utils.absoluteLink(j.$('a.manga-link').first().attr('href'), Mangadex.domain); }, getEpisode: function (url) { var chapterId = url.split('/')[4]; var curOption = j.$('#jump-chapter option[value="' + chapterId + '"]'); if (curOption.length) { var temp = curOption.text().trim().match(/ch\.\D?\d+/i); if (temp !== null) { return EpisodePartToEpisode(temp[0]); } } return NaN; }, getVolume: function (url) { var chapterId = url.split('/')[4]; var curOption = j.$('#jump-chapter option[value="' + chapterId + '"]'); if (curOption.length) { var temp = curOption.text().trim().match(/vol\.\D?\d+/i); if (temp !== null) { temp = temp[0].match(/\d+/); if (temp !== null) { return parseInt(temp[0]); } } } return 0; }, }, overview: { getTitle: function () { return j.$('.card-header').first().text().trim(); }, getIdentifier: function (url) { return utils.urlPart(url, 4); }, uiSelector: function (selector) { j.$(".container .card .edit.row > * > .row").first().after('<div class="row m-0 py-1 px-0 border-top"><div class="col-lg-3 col-xl-2 strong">MyAnimeList:</div><div class="col-lg-9 col-xl-10 kal-ui"></div></div>'); selector.appendTo(j.$(".container .card .kal-ui").first()); }, list: { offsetHandler: false, elementsSelector: function () { return j.$(".chapter-container > .row:not(:first-of-type) .chapter-row"); }, elementUrl: function (selector) { return utils.absoluteLink(selector.find("a").first().attr('href'), Mangadex.domain); }, elementEp: function (selector) { return selector.attr('data-chapter'); }, } }, init(page) { api.storage.addStyle(__webpack_require__(45).toString()); if (j.$('.card-header').length) { j.$(document).ready(function () { page.handlePage(); }); } else { con.info('Waiting'); utils.waitUntilTrue(function () { return Mangadex.sync.getOverviewUrl(''); }, function () { con.info('Start'); page.handlePage(); var tempChapterId = utils.urlPart(window.location.href, 4); utils.urlChangeDetect(function () { var newTempChapterId = utils.urlPart(window.location.href, 4); if (tempChapterId !== newTempChapterId) { tempChapterId = newTempChapterId; con.info('Check'); page.handlePage(); } else { con.info('Nothing to do'); } }); }); } } }; function EpisodePartToEpisode(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 ''; } ; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(3), __webpack_require__(2), __webpack_require__(0), __webpack_require__(1))) /***/ }), /* 21 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(utils, j, con, api) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Mangarock; }); const Mangarock = { name: 'Mangarock', domain: 'https://mangarock.com', database: 'Mangarock', type: 'manga', isSyncPage: function (url) { if (typeof utils.urlPart(url, 5) != 'undefined') { return true; } return false; }, sync: { getTitle: function (url) { return j.$('a[href*="' + Mangarock.overview.getIdentifier(url) + '"]').text().trim(); }, getIdentifier: function (url) { return Mangarock.overview.getIdentifier(url); }, getOverviewUrl: function (url) { return url.split('/').slice(0, 5).join('/'); }, getEpisode: function (url) { con.log(j.$("option:contains('Chapter')").first().parent().find(':selected').text()); return EpisodePartToEpisode(j.$("option:contains('Chapter')").first().parent().find(':selected').text()); }, getVolume: function (url) { return 0; }, }, overview: { getTitle: function () { return j.$('h1').first().text().trim(); }, getIdentifier: function (url) { return utils.urlPart(url, 4).replace(/mrs-serie-/i, ''); }, uiSelector: function (selector) { selector.insertBefore($("h2:contains('Chapters')").first().parent().parent().parent()); }, list: { offsetHandler: false, elementsSelector: function () { return j.$('[data-test="chapter-table"] tr'); }, elementUrl: function (selector) { return utils.absoluteLink(selector.find("a").first().attr('href'), Mangarock.domain); }, elementEp: function (selector) { return EpisodePartToEpisode(selector.find('a').text()); }, } }, init(page) { api.storage.addStyle(__webpack_require__(47).toString()); start(); utils.urlChangeDetect(function () { page.url = window.location.href; page.UILoaded = false; $('#flashinfo-div, #flash-div-bottom, #flash-div-top').remove(); start(); }); function start() { if (!/manga/i.test(utils.urlPart(page.url, 3))) { con.log('Not a manga page!'); return; } if (Mangarock.isSyncPage(page.url)) { utils.waitUntilTrue(function () { return Mangarock.sync.getTitle(page.url); }, function () { page.handlePage(); }); } else { j.$(document).ready(function () { var waitTimeout = false; utils.waitUntilTrue(function () { con.log('visibility', j.$('#page-content .col-lg-8 .lazyload-placeholder:visible').length); return !j.$('#page-content .col-lg-8 .lazyload-placeholder:visible').length || waitTimeout; }, function () { page.handlePage(); }); setTimeout(function () { waitTimeout = true; }, 1000); }); } } } }; function EpisodePartToEpisode(string) { if (!string) return ''; if (!(isNaN(parseInt(string)))) { return string; } var temp = []; temp = string.match(/Chapter\ \d+/i); con.log(temp); if (temp !== null) { string = temp[0]; temp = string.match(/\d+/); if (temp !== null) { return temp[0]; } } return ''; } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(2), __webpack_require__(3), __webpack_require__(1), __webpack_require__(0))) /***/ }), /* 22 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(utils, j, api, con) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Gogoanime; }); const Gogoanime = { name: 'Gogoanime', domain: ['https://gogoanimes.co', 'https://gogoanime.tv'], database: 'Gogoanime', type: 'anime', isSyncPage: function (url) { if (utils.urlPart(url, 3) === 'category') { return false; } else { return true; } }, sync: { getTitle: function (url) { return Gogoanime.sync.getIdentifier(url); }, getIdentifier: function (url) { return utils.urlPart(url, 3).split('-episode')[0]; }, getOverviewUrl: function (url) { return url.split('/').slice(0, 3).join('/') + '/category/' + Gogoanime.sync.getIdentifier(url); }, getEpisode: function (url) { return utils.urlPart(url, 3).split('episode-')[1]; }, nextEpUrl: function (url) { return Gogoanime.domain + j.$('.anime_video_body_episodes_r a').last().attr('href'); } }, overview: { getTitle: function (url) { return Gogoanime.overview.getIdentifier(url); }, getIdentifier: function (url) { return utils.urlPart(url, 4); }, uiSelector: function (selector) { selector.prependTo(j.$(".anime_info_body").first()); }, list: { offsetHandler: false, elementsSelector: function () { return j.$("#episode_related a"); }, elementUrl: function (selector) { return utils.absoluteLink(selector.attr('href').replace(/^ /, ''), Gogoanime.domain); }, elementEp: function (selector) { var url = Gogoanime.overview.list.elementUrl(selector); return Gogoanime.sync.getEpisode(url); }, paginationNext: function () { var next = false; var nextReturn = false; j.$(j.$('#episode_page a').get().reverse()).each(function (index, el) { if (next && !nextReturn) { el.click(); nextReturn = true; return; } if (j.$(el).hasClass('active')) { next = true; } }); return nextReturn; } } }, init(page) { api.storage.addStyle(__webpack_require__(49).toString()); if (Gogoanime.isSyncPage(page.url)) { j.$(document).ready(function () { start(); }); } else { con.log('noSync'); utils.waitUntilTrue(function () { return j.$('#episode_related').length; }, function () { start(); }); } function start() { Gogoanime.domain = window.location.protocol + "//" + window.location.hostname; page.handlePage(); j.$('#episode_page').click(function () { setTimeout(function () { page.handleList(); }, 500); }); } } }; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(2), __webpack_require__(3), __webpack_require__(0), __webpack_require__(1))) /***/ }), /* 23 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(j, utils, con, api) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Anime4you; }); const Anime4you = { name: 'Anime4you', domain: 'https://www.anime4you.one', database: 'Anime4you', type: 'anime', isSyncPage: function (url) { if (url.split('/')[7] !== 'epi') { return false; } else { return true; } }, sync: { getTitle: function (url) { return j.$('.titleshow h1').text(); }, getIdentifier: function (url) { return parseInt(utils.urlPart(url, 6)).toString(); }, getOverviewUrl: function (url) { return Anime4you.domain + '/show/1/aid/' + Anime4you.sync.getIdentifier(url); }, getEpisode: function (url) { return parseInt(utils.urlPart(url, 8)); }, nextEpUrl: function (url) { return Anime4you.domain + '/' + j.$('.vidplayer .forward a').first().attr('href'); }, uiSelector: function (selector) { selector.insertAfter(j.$("#beschreibung > p").first()); }, }, overview: { getTitle: function (url) { return Anime4you.sync.getTitle(url); }, getIdentifier: function (url) { return Anime4you.sync.getIdentifier(url); }, uiSelector: function (selector) { Anime4you.sync.uiSelector(selector); }, list: { offsetHandler: false, elementsSelector: function () { return j.$('.episoden li'); }, elementUrl: function (selector) { return utils.absoluteLink(selector.find("a").first().attr('href'), Anime4you.domain); }, elementEp: function (selector) { return Anime4you.sync.getEpisode(Anime4you.overview.list.elementUrl(selector)); }, } }, init(page) { if (document.title == "Please wait 5 seconds...") { con.log("loading"); page.cdn(); return; } api.storage.addStyle(__webpack_require__(51).toString()); j.$(document).ready(function () { page.handlePage(); }); } }; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(3), __webpack_require__(2), __webpack_require__(1), __webpack_require__(0))) /***/ }), /* 24 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(j, utils, api) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Branitube; }); const Branitube = { name: 'Branitube', domain: 'https://branitube.org', type: 'anime', isSyncPage: function (url) { if (url.split('/')[3] !== 'assistir') { return false; } else { return true; } }, sync: { getTitle: function (url) { return j.$('.infosAtulEpisodio .nomeAnime').text(); }, getIdentifier: function (url) { return utils.urlPart(url, 4); }, getOverviewUrl: function (url) { return Branitube.domain + '/animes/' + Branitube.sync.getIdentifier(url); }, getEpisode: function (url) { return parseInt(utils.urlPart(url, 6)); }, nextEpUrl: function (url) { return utils.absoluteLink(j.$('[title^="Proximo Episodio"]').first().attr('href'), Branitube.domain); }, }, overview: { getTitle: function (url) { return j.$('.nameAnime').text(); }, getIdentifier: function (url) { return Branitube.sync.getIdentifier(url); }, uiSelector: function (selector) { j.$('<div class="animeResult" style="margin-bottom: 10px; padding: 12px"> <p id="malp">' + selector.html() + '</p></div>').prependTo(j.$(".theUpdates .contentLastUpdatesEps").first()); }, list: { offsetHandler: false, elementsSelector: function () { return j.$('.imgefeito > .episodio'); }, elementUrl: function (selector) { return utils.absoluteLink(selector.find("a.episodioImages").first().attr('href'), Branitube.domain); }, elementEp: function (selector) { return Branitube.sync.getEpisode(Branitube.overview.list.elementUrl(selector)); }, } }, init(page) { api.storage.addStyle(__webpack_require__(53).toString()); j.$(document).ready(function () { page.handlePage(); }); } }; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(3), __webpack_require__(2), __webpack_require__(0))) /***/ }), /* 25 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(j, utils, api, con) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Turkanime; }); const Turkanime = { name: 'Turkanime', domain: 'http://www.turkanime.tv', type: 'anime', isSyncPage: function (url) { if (url.split('/')[3] !== 'video') { return false; } else { return true; } }, sync: { getTitle: function (url) { return j.$('.breadcrumb a').first().text().trim(); }, getIdentifier: function (url) { return Turkanime.overview.getIdentifier(Turkanime.sync.getOverviewUrl(url)); }, getOverviewUrl: function (url) { return utils.absoluteLink(j.$('.breadcrumb a').first().attr('href'), Turkanime.domain); }, getEpisode: function (url) { return getEpisode(Turkanime.sync.getIdentifier(url), Turkanime.overview.getIdentifier(url)); } }, overview: { getTitle: function (url) { return j.$('#detayPaylas .panel-title').first().text().trim(); }, getIdentifier: function (url) { return utils.urlPart(url, 4); }, uiSelector: function (selector) { selector.prependTo(j.$("#detayPaylas .panel-body").first()); }, list: { offsetHandler: false, elementsSelector: function () { return j.$('.list.menum > li'); }, elementUrl: function (selector) { return utils.absoluteLink(selector.find("a").last().attr('href').replace(/^\/\//, 'http://'), Turkanime.domain); }, elementEp: function (selector) { var url = Turkanime.overview.list.elementUrl(selector); return getEpisode(Turkanime.overview.getIdentifier(window.location.href), Turkanime.overview.getIdentifier(url)); return Turkanime.sync.getEpisode(Turkanime.overview.list.elementUrl(selector)); }, } }, init(page) { api.storage.addStyle(__webpack_require__(55).toString()); j.$(document).ready(function () { if (Turkanime.isSyncPage(page.url)) { page.handlePage(); } else { utils.waitUntilTrue(function () { return j.$('.list.menum').length; }, function () { page.handlePage(); }); } }); } }; function getEpisode(selector, episodeSelector) { var diff = episodeSelector.replace(selector, '').replace(/-/g, ':'); con.log('getEpisode', selector, episodeSelector, diff); var temp = diff.match(/\d+/); if (temp === null) { return 0; } else { return parseInt(temp[0]); } } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(3), __webpack_require__(2), __webpack_require__(0), __webpack_require__(1))) /***/ }), /* 26 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(j, utils, api, con) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Twistmoe; }); const Twistmoe = { name: 'Twistmoe', domain: 'https://twist.moe', database: 'Twistmoe', type: 'anime', isSyncPage: function (url) { return true; }, sync: { getTitle: function (url) { return j.$('.series-title').text().trim(); }, getIdentifier: function (url) { return utils.urlPart(url, 4); }, getOverviewUrl: function (url) { return Twistmoe.domain + '/a/' + Twistmoe.sync.getIdentifier(url) + '/1'; }, getEpisode: function (url) { return parseInt(utils.urlPart(url, 5)); }, nextEpUrl: function (url) { return utils.absoluteLink(j.$('.episode-list .current').first().parent().next().find('a').attr('href'), Twistmoe.domain); }, uiSelector: function (selector) { selector.insertAfter(j.$(".information").first()); }, }, overview: { getTitle: function (url) { return ''; }, getIdentifier: function (url) { return ''; }, uiSelector: function (selector) { return ''; }, list: { offsetHandler: false, elementsSelector: function () { return j.$('.episode-list li'); }, elementUrl: function (selector) { return utils.absoluteLink(selector.find("a").first().attr('href'), Twistmoe.domain); }, elementEp: function (selector) { return Twistmoe.sync.getEpisode(Twistmoe.overview.list.elementUrl(selector)); }, } }, init(page) { api.storage.addStyle(__webpack_require__(57).toString()); j.$(document).ready(function () { start(); utils.urlChangeDetect(function () { page.url = window.location.href; page.UILoaded = false; $('#flashinfo-div, #flash-div-bottom, #flash-div-top').remove(); start(); }); }); function start() { if (utils.urlPart(page.url, 3).toLowerCase() != 'a') { con.log('Not an anime page!'); return; } page.handlePage(); } } }; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(3), __webpack_require__(2), __webpack_require__(0), __webpack_require__(1))) /***/ }), /* 27 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(j, api, con) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return initIframeModal; }); /* harmony import */ var _minimalClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(28); var minimalObj; function createIframe(page) { var iframe = document.createElement('iframe'); iframe.setAttribute("id", "info-iframe"); iframe.setAttribute("style", "height:100%;width:100%;border:0;display:block;"); iframe.onload = function () { var head = j.$("#info-iframe").contents().find("head"); api.storage.injectjsResource('simpleBar.js', head); api.storage.injectjsResource('material.js', head); api.storage.updateDom(head); api.storage.injectCssResource('material.css', head); api.storage.injectCssResource('materialFont.css', head); api.storage.injectCssResource('simpleBar.css', head); setTimeout(function () { minimalObj = new _minimalClass__WEBPACK_IMPORTED_MODULE_0__[/* minimal */ "a"](j.$("#info-iframe").contents().find('html')); if (typeof (page) != 'undefined') { if (typeof (page.malObj) != 'undefined') { minimalObj.fill(page.malObj.url); } else { minimalObj.fill(null); } minimalObj.setPageSync(page); } }, 200); }; document.getElementById("modal-content").appendChild(iframe); j.$("#modal-content").append('<div class="kal-tempHeader" style="position: absolute; width: 100%; height: 103px; background-color: rgb(63,81,181); "></div>'); if ((!j.$("#info-iframe").length) || (j.$('#info-iframe').css('display') != 'block')) { j.$('#info-popup').remove(); alert('The miniMAL iframe could not be loaded.\nThis could be caused by an AdBlocker.'); } } function initIframeModal(page) { var posLeft = api.settings.get('posLeft'); var miniMalWidth = api.settings.get('miniMalWidth'); var miniMalHeight = api.settings.get('miniMalHeight'); if (!(j.$('#info-popup').length)) { api.storage.addStyle('.modal-content-kal.fullscreen{width: 100% !important;height: 100% !important; bottom: 0 !important;' + posLeft + ': 0 !important;}\ .modal-content-kal{-webkit-transition: all 0.5s ease; -moz-transition: all 0.5s ease; -o-transition: all 0.5s ease; transition: all 0.5s ease;}\ .floatbutton:hover {background-color:rgb(63,81,181);}\ .floatbutton:hover div {background-color:white;}\ .floatbutton div {background-color:black;-webkit-transition: all 0.5s ease;-moz-transition: all 0.5s ease;-o-transition: all 0.5s ease;transition: all 0.5s ease;}\ .floatbutton {\ z-index: 9999;display: none; position:fixed; bottom:40px; right:40px; border-radius: 50%; font-size: 24px; height: 56px; margin: auto; min-width: 56px; width: 56px; padding: 0; overflow: hidden; background: rgba(158,158,158,.2); box-shadow: 0 1px 1.5px 0 rgba(0,0,0,.12), 0 1px 1px 0 rgba(0,0,0,.24); line-height: normal; border: none;\ font-weight: 500; text-transform: uppercase; letter-spacing: 0; will-change: box-shadow; transition: box-shadow .2s cubic-bezier(.4,0,1,1),background-color .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1); outline: none; cursor: pointer; text-decoration: none; text-align: center; vertical-align: middle; padding: 16px;\ }\ .mdl-button{\ background: #3f51b5; color: #fff;box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.2), 0 1px 5px 0 rgba(0,0,0,.12);\ border: none; border-radius: 2px;\ }'); //var position = 'width: 80%; height: 70%; position: absolute; top: 15%; left: 10%'; var position = 'max-width: 100%; max-height: 100%; min-width: 500px; min-height: 300px; width: ' + miniMalWidth + '; height: ' + miniMalHeight + '; position: absolute; bottom: 0%; ' + posLeft + ': 0%'; //phone // @ts-ignore if (j.$(window).width() < 500) { position = 'width: 100vw; height: 100%; position: absolute; top: 0%; ' + posLeft + ': 0%'; } var material = '<dialog class="modal-kal" id="info-popup" style="pointer-events: none;display: none; position: fixed;z-index: 9999;left: 0;top: 0;bottom: 0;width: 100%; height: 100%; background-color: transparent; padding: 0; margin: 0; border: 0;">'; material += '<div id="modal-content" class="modal-content-kal" Style="pointer-events: all; background-color: #f9f9f9; margin: 0; ' + position + '">'; material += '</div>'; material += '</dialog>'; j.$('body').after(material); var floatbutton = '<button class="open-info-popup floatbutton" style="">'; floatbutton += '<i class="my-float open-info-popup" style="margin-top:22px;"><div class="open-info-popup" style="width: 100%; height: 4px; margin-bottom: 15%;"></div><div class="open-info-popup" style="width: 100%; height: 4px; margin-bottom: 15%;"></div><div class="open-info-popup" style="width: 100%; height: 4px"></div></i></button>'; j.$('#info-popup').after(floatbutton); j.$(".open-info-popup").show(); document.addEventListener("click", function (e) { if (j.$(e.target).hasClass('open-info-popup')) { con.log("Open miniMAL"); if (j.$('#info-popup').css('display') == 'none') { document.getElementById('info-popup').style.display = "block"; //fillIframe(url, currentMalData); j.$('.floatbutton').fadeOut(); if (!(j.$('#info-iframe').length)) { createIframe(page); } else if (typeof minimalObj !== 'undefined' && typeof (page.malObj) != 'undefined') { minimalObj.fillBase(page.malObj.url); minimalObj.setPageSync(page); } } else { document.getElementById('info-popup').style.display = "none"; j.$('.floatbutton').fadeIn(); } } }); } } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(3), __webpack_require__(0), __webpack_require__(1))) /***/ }), /* 28 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(j, utils, con, api) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return minimal; }); /* harmony import */ var _types_anime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(29); /* harmony import */ var _provider_provider_ts__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; class minimal { constructor(minimal) { this.minimal = minimal; this.history = []; var material = ` <div id="material" style="height: 100%;"> <div class="mdl-layout mdl-js-layout mdl-layout--fixed-header mdl-layout--fixed-tabs"> <header class="mdl-layout__header" style="min-height: 0;"> <button class="mdl-layout__drawer-button" id="backbutton" style="display: none;"><i class="material-icons">arrow_back</i></button> <div class="mdl-layout__header-row"> <button class="mdl-button mdl-js-button mdl-button--icon mdl-layout__drawer-button" id="book" style=""> <i class="material-icons md-48 bookIcon">book</i> <i class="material-icons md-48 settingsIcon" style="display:none;">settings</i> </button> <div class="mdl-textfield mdl-js-textfield mdl-textfield--expandable" id="SearchButton" style="margin-left: -57px; margin-top: 3px; padding-left: 40px;"> <label class="mdl-button mdl-js-button mdl-button--icon" for="headMalSearch"> <i class="material-icons">search</i> </label> <div class="mdl-textfield__expandable-holder"> <input class="mdl-textfield__input" type="text" id="headMalSearch"> <label class="mdl-textfield__label" for="headMalSearch"></label> </div> </div> <button class="mdl-button mdl-js-button mdl-button--icon mdl-layout__drawer-button" id="material-fullscreen" style="left: initial; right: 40px;"> <i class="material-icons" class="material-icons md-48">fullscreen</i> </button> <button class="mdl-button mdl-js-button mdl-button--icon mdl-layout__drawer-button" id="close-info-popup" style="left: initial; right: 0;"> <i class="material-icons close">close</i> </button> </div> <!-- Tabs --> <div class="mdl-layout__tab-bar mdl-js-ripple-effect"> <a href="#fixed-tab-1" class="mdl-layout__tab is-active">Overview</a> <a href="#fixed-tab-2" class="mdl-layout__tab reviewsTab">Reviews</a> <a href="#fixed-tab-3" class="mdl-layout__tab recommendationTab">Recommendations</a> <a href="#fixed-tab-5" class="mdl-layout__tab settingsTab">Settings</a> </div> </header> <main class="mdl-layout__content" data-simplebar style="height: 100%;"> <section class="mdl-layout__tab-panel is-active" id="fixed-tab-1"> <div id="loadOverview" class="mdl-progress mdl-js-progress mdl-progress__indeterminate" style="width: 100%; position: absolute;"></div> <div class="page-content"></div> </section> <section class="mdl-layout__tab-panel" id="fixed-tab-2"> <div id="loadReviews" class="mdl-progress mdl-js-progress mdl-progress__indeterminate" style="width: 100%; position: absolute;"></div> <div class="page-content malClear" id="malReviews"></div> </section> <section class="mdl-layout__tab-panel" id="fixed-tab-3"> <div id="loadRecommendations" class="mdl-progress mdl-js-progress mdl-progress__indeterminate" style="width: 100%; position: absolute;"></div> <div class="page-content malClear" id="malRecommendations"></div> </section> <section class="mdl-layout__tab-panel" id="fixed-tab-4"> <div id="loadMalSearchPop" class="mdl-progress mdl-js-progress mdl-progress__indeterminate" style="width: 100%; position: absolute;"></div> <div class="page-content malClear" id="malSearchPopInner"></div> </section> <section class="mdl-layout__tab-panel" id="fixed-tab-5"> <div class="page-content malClear" id="malConfig"></div> </section></main> </div> </div> </div> `; this.minimal.find("body").append(material); this.minimal.find("head").append('<base href="https://myanimelist.net/">'); this.uiListener(); this.injectCss(); this.loadSettings(); this.updateDom(); } uiListener() { var modal = document.getElementById('info-popup'); var This = this; this.minimal.on('click', '.mdl-layout__content a', function (e) { // @ts-ignore if (j.$(this).attr('target') === '_blank' || j.$(this).hasClass('nojs')) { return; } e.preventDefault(); // @ts-ignore var url = utils.absoluteLink(j.$(this).attr('href'), 'https://myanimelist.net'); if (!This.fill(url)) { var win = window.open(url, '_blank'); if (win) { win.focus(); } else { alert('Please allow popups for this website'); } } }); this.minimal.find("#backbutton").click(function () { con.log('History', This.history); if (This.history.length > 1) { This.history.pop(); //Remove current page var url = This.history.pop(); if (typeof url != 'undefined') { This.fill(url); if (This.history.length > 1) { return; } } } This.backbuttonHide(); }); this.minimal.find("#close-info-popup").click(function () { if (This.isPopup()) { window.close(); } else { modal.style.display = "none"; j.$('.floatbutton').fadeIn(); } }); this.minimal.find("#material-fullscreen").click(function () { if (j.$('.modal-content-kal.fullscreen').length) { j.$(".modal-content-kal").removeClass('fullscreen'); // @ts-ignore j.$(this).find('i').text('fullscreen'); } else { j.$(".modal-content-kal").addClass('fullscreen'); // @ts-ignore j.$(this).find('i').text('fullscreen_exit'); } }); var timer; this.minimal.find("#headMalSearch").on("input", function () { var listType = 'anime'; if (typeof This.pageSync != 'undefined') { listType = This.pageSync.page.type; } This.minimal.find('#fixed-tab-4 #malSearchPopInner').html(''); This.minimal.find('#loadMalSearchPop').show(); clearTimeout(timer); timer = setTimeout(function () { if (This.minimal.find("#headMalSearch").val() == '') { This.minimal.find('#material').removeClass('pop-over'); } else { This.minimal.find('#material').addClass('pop-over'); This.searchMal(This.minimal.find("#headMalSearch").val(), listType, '#malSearchPopInner', function () { This.minimal.find('#loadMalSearchPop').hide(); }); } }, 300); }); this.minimal.on('click', '.searchItem', function (e) { This.minimal.find("#headMalSearch").val('').trigger("input").parent().parent().removeClass('is-dirty'); }); this.minimal.find("#book").click(function () { if (This.minimal.find('#material.pop-over #malList').length) { This.minimal.find("#book").toggleClass('open'); This.minimal.find('#material').removeClass('pop-over'); } else { This.minimal.find("#book").toggleClass('open'); This.minimal.find('#material').addClass('pop-over'); This.bookmarks(); } }); } isPopup() { if (j.$('#Mal-Sync-Popup').length) return true; return false; } updateDom() { this.minimal.find("head").click(); } injectCss() { this.minimal.find("head").append(j.$('<style>') .html(__webpack_require__(59).toString())); } fill(url) { if (url == null) { this.minimal.find('#material').addClass('settings-only'); if (this.isPopup()) { this.minimal.find('#book').first().click(); } return false; } if (/^https:\/\/myanimelist.net\/(anime|manga)\//i.test(url)) { this.loadOverview(new _types_anime__WEBPACK_IMPORTED_MODULE_0__[/* animeType */ "a"](url)); return true; } this.minimal.find('#material').addClass('settings-only'); if (this.isPopup()) { this.minimal.find('#book').first().click(); } return false; } fillBase(url) { con.log('Fill Base', url, this.history); if (!this.history.length) { this.fill(url); } else if (this.history[0] !== url) { while (this.history.length > 0) { this.history.pop(); } this.fill(url); } } setPageSync(page) { this.pageSync = page; var This = this; var malUrl = ''; var title = 'Not Found'; if (typeof page.malObj != 'undefined') { malUrl = page.malObj.url; title = page.malObj.name; } var html = ` <div class="mdl-card__title mdl-card--border"> <h2 class="mdl-card__title-text"> ${title} </h2> <a href="https://github.com/lolamtisch/MALSync/wiki/Troubleshooting" style="margin-left: auto;">Help</a> </div> <div class="mdl-list__item"> <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label" style="width: 100%;"> <input class="mdl-textfield__input" style="padding-right: 18px;" type="number" step="1" id="malOffset" value="${page.getOffset()}"> <label class="mdl-textfield__label" for="malOffset">Episode Offset</label> ${utils.getTooltip('Input the episode offset, if an anime has 12 episodes, but uses the numbers 0-11 rather than 1-12, you simply type " +1 " in the episode offset.', 'float: right; margin-top: -17px;', 'left')} </div> </div> <div class="mdl-list__item" style="padding-bottom: 0;padding-top: 0;"> <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label" style="width: 100%;"> <input class="mdl-textfield__input" style="padding-right: 18px;" type="text" id="malUrlInput" value="${malUrl}"> <label class="mdl-textfield__label" for="malUrlInput">MyAnimeList Url</label> ${utils.getTooltip('Only change this URL if it points to the wrong anime page on MAL.', 'float: right; margin-top: -17px;', 'left')} </div> </div> <div class="mdl-list__item" style="padding-bottom: 0;padding-top: 0;"> <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label" style="width: 100%;"> <label class="mdl-textfield__label" for="malSearch"> Correction Search </label> <input class="mdl-textfield__input" style="padding-right: 18px;" type="text" id="malSearch"> ${utils.getTooltip('This field is for finding an anime, when you need to correct the "MyAnimeList Url" shown above.<br>To make a search, simply begin typing the name of an anime, and a list with results will automatically appear as you type.', 'float: right; margin-top: -17px;', 'left')} </div> </div> <div class="mdl-list__item" style="min-height: 0; padding-bottom: 0; padding-top: 0;"> <div class="malResults" id="malSearchResults"></div> </div> <div class="mdl-list__item"> <button class="mdl-button mdl-js-button mdl-button--raised mdl-button--colored" id="malSubmit">Update</button> <button class="mdl-button mdl-js-button mdl-button--raised mdl-button--accent" id="malReset" style="margin-left: 5px;">Reset</button> <button class="mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect" id="malNotOnMal" style="margin-left: 5px; float: right; margin-left: auto;" title="If the Anime/Manga can't be found on MAL">No MAL</button> </div>`; this.minimal.find('#page-config').html(html).show(); this.minimal.find("#malOffset").on("input", function () { var Offset = This.minimal.find("#malOffset").val(); if (Offset !== null) { if (Offset !== '') { page.setOffset(Offset); utils.flashm("New Offset (" + Offset + ") set."); } else { page.setOffset("0"); utils.flashm("Offset reset"); } } }); this.minimal.find("#malNotOnMal").click(function () { This.minimal.find('#malUrlInput').val(''); This.minimal.find("#malSubmit").click(); }); this.minimal.find("#malReset").click(function () { page.deleteCache(); utils.flashm("MyAnimeList url reset", false); page.handlePage(); This.minimal.find("#close-info-popup").trigger("click"); }); this.minimal.find("#malSubmit").click(function () { var murl = This.minimal.find("#malUrlInput").val(); var toDatabase = false; if (typeof page.page.database != 'undefined' && confirm('Submit database correction request?')) { toDatabase = 'correction'; } page.setCache(murl, toDatabase); utils.flashm("new url '" + murl + "' set.", false); page.handlePage(); This.fillBase(murl); }); var listType = 'anime'; if (typeof This.pageSync != 'undefined') { listType = This.pageSync.page.type; } var timer; this.minimal.find("#malSearch").on("input", function () { clearTimeout(timer); timer = setTimeout(function () { This.searchMal(This.minimal.find("#malSearch").val(), listType, '.malResults', function () { This.minimal.find("#malSearchResults select").first().after(` <a class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--2dp mdl-grid searchItem" href="" style="cursor: pointer;"> <div style="margin: -8px 0px -8px -8px; height: 100px; width: 64px; background-color: grey;"/> <div style="flex-grow: 100; cursor: pointer; margin-top: 0; margin-bottom: 0;" class="mdl-cell"> <span style="font-size: 20px; font-weight: 400; line-height: 1;"> No entry on MyAnimeList</span> <p style="margin-bottom: 0; line-height: 20px; padding-top: 3px;"> If the Anime/Manga can't be found on MAL</p> </div> </a> `); This.minimal.find("#malSearchResults .searchItem").unbind('click').click(function (e) { e.preventDefault(); // @ts-ignore This.minimal.find('#malUrlInput').val(j.$(this).attr('href')); This.minimal.find('#malSearch').val(''); This.minimal.find('#malSearchResults').html(''); This.minimal.find('#malSubmit').click(); }); }); }, 300); }); this.updateDom(); if (typeof page.malObj != 'undefined' && page.malObj.wrong) { con.log('config click'); this.minimal.find('.mdl-layout__tab.settingsTab span').trigger("click"); this.minimal.find('#page-config').css('border', '1px solid red'); } } loadOverview(overviewObj) { var This = this; this.minimal.find("#book.open").toggleClass('open'); this.minimal.find('#material').removeClass('settings-only').removeClass('pop-over'); this.minimal.find('.mdl-layout__tab:eq(0) span').trigger("click"); this.history.push(overviewObj.url); if (this.history.length > 1) this.backbuttonShow(); this.minimal.find('#loadOverview, #loadReviews, #loadRecommendations').show(); this.minimal.find('#fixed-tab-1 .page-content, #fixed-tab-2 .page-content, #fixed-tab-3 .page-content').html(''); overviewObj.init() .then(() => { this.minimal.find('.reviewsTab').off("click").one('click', function () { overviewObj.reviews(This.minimal) .then((html) => { This.minimal.find('#fixed-tab-2 .page-content').html(html); This.minimal.find('#loadReviews').hide(); overviewObj.lazyLoadReviews(This.minimal); }); }); this.minimal.find('.recommendationTab').off("click").one('click', function () { overviewObj.recommendations(This.minimal) .then((html) => { This.minimal.find('#fixed-tab-3 .page-content').html(html); This.minimal.find('#loadRecommendations').hide(); overviewObj.lazyLoadRecommendations(This.minimal); }); }); return overviewObj.overview(this.minimal); }).then((html) => { this.minimal.find('#fixed-tab-1 .page-content').html(html); this.minimal.find('#loadOverview').hide(); overviewObj.lazyLoadOverview(this.minimal); }); } backbuttonShow() { this.minimal.find("#backbutton").show(); this.minimal.find('#SearchButton').css('margin-left', '-17px'); this.minimal.find('#book').css('left', '40px'); } backbuttonHide() { this.minimal.find("#backbutton").hide(); this.minimal.find('#SearchButton').css('margin-left', '-57px'); this.minimal.find('#book').css('left', '0px'); } loadSettings() { var This = this; var listener = []; var settingsUI = ` <ul class="demo-list-control mdl-list" style="margin: 0px; padding: 0px;"> <div class="mdl-grid"> <div id="page-config" class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp" style="display: none;"></div> <div class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp"> <div class="mdl-card__title mdl-card--border"> <h2 class="mdl-card__title-text">General</h2> </div> ${materialCheckbox('autoTracking', 'Autotracking' + utils.getTooltip('Autotracking is the function where this script automatically updates the anime`s you watch with your MAL account.', '', 'bottom'))} <li class="mdl-list__item"> <span class="mdl-list__item-primary-content"> Mode </span> <span class="mdl-list__item-secondary-action"> <select name="myinfo_score" id="syncMode" class="inputtext mdl-textfield__input" style="outline: none;"> <option value="MAL">MyAnimeList</option> <option value="ANILIST">AniList [ALPHA]</option> </select> </span> </li> <li class="mdl-list__item anilistShow" style="display: none;"> <span class="mdl-list__item-primary-content"> AniList </span> <span class="mdl-list__item-secondary-action"> <a target="_blank" href="https://anilist.co/api/v2/oauth/authorize?client_id=1487&response_type=token">Authenticate</a> </span> </li> <li class="mdl-list__item"> <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label" style="width: 100%;"> <input class="mdl-textfield__input" type="number" step="1" id="malDelay" value="${api.settings.get('delay')}"> <label class="mdl-textfield__label" for="malDelay">Autotracking delay (Seconds)</label> </div> </li> </div> <div class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp"> <div class="mdl-card__title mdl-card--border"> <h2 class="mdl-card__title-text">Streaming Site Links</h2> ${utils.getTooltip('If disabled, the streaming site will no longer appear in an animes sidebar on MAL.')} </div> ${materialCheckbox('Kissanime', 'KissAnime')} ${materialCheckbox('Masterani', 'MasterAnime')} ${materialCheckbox('9anime', '9anime')} ${materialCheckbox('Crunchyroll', 'Crunchyroll')} ${materialCheckbox('Gogoanime', 'Gogoanime')} ${materialCheckbox('Twistmoe', 'twist.moe')} ${materialCheckbox('Anime4you', 'Anime4You (Ger)')} ${materialCheckbox('Kissmanga', 'KissManga')} ${materialCheckbox('Mangadex', 'MangaDex')} ${materialCheckbox('Mangarock', 'Mangarock')} </div> <div class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp"> <div class="mdl-card__title mdl-card--border"> <h2 class="mdl-card__title-text">MyAnimeList</h2> </div> <li class="mdl-list__item"> <span class="mdl-list__item-primary-content"> Thumbnails ${utils.getTooltip('The option is for resizing the thumbnails on MAL.<br>Like thumbnails for characters, people, recommendations, etc.')} </span> <span class="mdl-list__item-secondary-action"> <select name="myinfo_score" id="malThumbnail" class="inputtext mdl-textfield__input" style="outline: none;"> <option value="144">Large</option> <option value="100">Medium</option> <option value="60">Small</option> <option value="0">MAL Default</option> </select> </span> </li> ${materialCheckbox('friendScore', 'Friend scores on detail page')} ${materialCheckbox('epPredictions', 'Estimate episode number')} ${materialCheckbox('malTags', 'Continue watching links' + utils.getTooltip('If enabled: On your MAL Anime List and the bookmark list in miniMAL, an icon-link will be added to the last used streaming site you were using to watch an anime.<br>Simply click the icon to continue watching the anime.', '', 'bottom'))} ${materialCheckbox('malResume', 'Resume watching links')} </div> <div class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp"> <div class="mdl-card__title mdl-card--border"> <h2 class="mdl-card__title-text">miniMAL</h2> <!--<span style="margin-left: auto; color: #7f7f7f;">Shortcut: Ctrl + m</span>--> </div> <li class="mdl-list__item"> <span class="mdl-list__item-primary-content"> Display to the </span> <span class="mdl-list__item-secondary-action"> <select name="myinfo_score" id="posLeft" class="inputtext mdl-textfield__input" style="outline: none;"> <option value="left">Left</option> <option value="right">Right</option> </select> </span> </li> <!--${materialCheckbox('miniMALonMal', 'Display on MyAnimeList') /*TODO*/} ${materialCheckbox('displayFloatButton', 'Floating menu button')} ${materialCheckbox('outWay', 'Move video out of the way')}--> <li class="mdl-list__item" style="display: inline-block; width: 49%;"> <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label" style="width: 100%;"> <input class="mdl-textfield__input" type="text" step="1" id="miniMalHeight" value="${api.settings.get('miniMalHeight')}"> <label class="mdl-textfield__label" for="miniMalHeight">Height (px / %) </label> </div> </li> <li class="mdl-list__item" style="display: inline-block; width: 50%;"> <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label" style="width: 100%;"> <input class="mdl-textfield__input" type="text" step="1" id="miniMalWidth" value="${api.settings.get('miniMalWidth')}"> <label class="mdl-textfield__label" for="miniMalWidth">Width (px / %)</label> </div> </li> </div> <div id="updateCheck" class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp" style="display: none;"> <div class="mdl-card__title mdl-card--border"> <h2 class="mdl-card__title-text">Update Check</h2> ${utils.getTooltip('Checks for new episodes in the background.')} <div id="updateCheckAgo" style="margin-left: auto;"></div> </div> <li class="mdl-list__item"> <span class="mdl-list__item-primary-content"> Interval </span> <span class="mdl-list__item-secondary-action"> <select name="updateCheckTime" id="updateCheckTime" class="inputtext mdl-textfield__input" style="outline: none;"> <option value="0">Off</option> <option value="60">1h</option> <option value="240">4h</option> <option value="720">12h</option> <option value="1440">24h</option> <option value="2880">48h</option> </select> </span> </li> <span class="updateCheckEnable" style="display: none;">${materialCheckbox('updateCheckNotifications', 'Notifications')}<span> <li class="mdl-list__item updateCheckEnable" style="display: none;"><button type="button" id="updateCheckUi" class="mdl-button mdl-js-button mdl-button--raised mdl-button--colored">Debugging</button></li> </div> <div class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp"> <div class="mdl-card__title mdl-card--border"> <h2 class="mdl-card__title-text">ETC</h2> </div> <span class="option-extension" style="display: none;">${materialCheckbox('userscriptMode', 'Userscript mode' + utils.getTooltip('Disables the content script. This makes it possible to have the extension and userscript enabled at the same time.', '', 'bottom'))}</span> <span class="option-extension-popup" style="display: none;">${materialCheckbox('strictCookies', 'Strict Cookies', false, false)}</span> <li class="mdl-list__item"><button type="button" id="clearCache" class="mdl-button mdl-js-button mdl-button--raised mdl-button--colored">Clear Cache</button></li> </div> <div id="contributer" class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp"></div> <div class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp"> <li class="mdl-list__item"> <div style="line-height: 30px;"> <a href="https://malsync.lolamtisch.de/changelog#${api.storage.version()}"> <img src="https://img.shields.io/badge/Changelog-${api.storage.version()}-green.svg?style=flat-square&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAtxQTFRFAAAARj1Hw158LyQzRDRBVF54Ew0ZXqvnIx4labLsQEFTdsD7ZpPC////VE1SNCg3Nik7PS1CSzBKWjRXczBXjjBUsTZd0WuILSUyMiU2MiI2Nyc9dypNoClRbC5INTQ+YXKMMCQ7PyQ/WitFKx4vFxchT16CRStIPSY6TSQ6jjhScb33TViCpCROni9VYKzqTlN+qDBZXK3sYi5JXbHyQzNGXLLzTTZOW6/wQC5EX67sNSw7Y67qWa3vLCUzMCo1uc3fXq3rWa/yLCgxSEdKZa7nV6rrWrDyKCEsMzA1aLDpYbLyYbj6SUJgPj5VLy87e8D6csP+c8r/d9L/fNT+esnydLbgcKfOa5vDdJ/MQi5GSjFLTTFOYi9PWS1NUS9OTTFPRzFLSDJMTTBMXjBPaS5NZzBVgTdjczVfbjVhXjVaTjRTQzJMSzRNTzVOTzNLai1ShzJcjjNdiDNeejRhbDVhWzZbSzRRQzFKQjJKUDNMiyxPYy9UlzBfyDBlpjJgcjJbajNfXDVaTDNRPzBHPTBHVDJNrDBZxSpaV1aBajBZkDNipzNjnTNjdDJdYzJcXDRZTzRQPzFHRzJHZTJNcS9MZ2WUcS9VcDNdezRgcjJeezNgZTNaTjNRRDFLQzJJQjNHQjJGWDJLUjJKYoK4cS5NWTFTWzRaWDJVbjRbWDNVSzNQRjJMUTRLSTVHSzRJjjZbfDdZYqXlhEZwVS5MSzRUVTNUczVbTjJRSTNOUDRMSTNLQTJISTNGczZUXjVRWrH0W3+1Ri9OSDJSSzNSTDNTRzJRRzNRSTNNQzJLPzFKPjJGPjFCOSw/W67vTWOORi5NSjJRSzNVTDRURTJRQTBNQTFKQzJKPjFINSw9XKrpSVyIQCxLRS9QRjJSQjJPRzRQUTROQjBFLyc1W6rrS22ePTRVQSxLSjNVSzZYTzZWUTJPOSw+Z778YqPWWnGcV1F/UkZxT0Nm////ch6M6QAAAFp0Uk5TAAAAAAAAAAAAAAAAAAABKH2/3+bIjTgFCm7a/f7nhRILifn9nRJx+v6JBC3b6UV//aPB3OTz5/bL3Y6oNuLuTAGA/ZsIEp79shwRhervmxwFQqDd+frjqksImWc25wAAAAFiS0dEDfa0YfUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAEbSURBVBjTARAB7/4AAAABDg8QERITFBUWFwIAAAAAAxgZGhtaW1xdHB0eHwQAAAUgISJeX2BhYmNkZSMkJQYAACYnZmdoaWprbG1ubygpKgArLHBxcnN0dXZ3eHl6ey0uAC8wfH1+f4CBgoOEhYaHiDEAMomKi4yNjo+QkZKSk5SVMwA0lpeYmZqbnJ2en6ChoqM1ADakpaanqKmqq6ytrq+wsTcAOLKztLW2t7i5uru8vb6/OQA6wMHCw8TFxsfIycrLzM07ADw9zs/Q0dLT1NXW19jZPj8AQEFC2tvc3d7U3+Dh4uNDRAAHRUZH5OXm5+jp6uvsSEkIAAAJSktM7e7v8PHyTU5PCgAAAAALUFFSU1RVVldYWQwNAEGXdELuOiRkAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE4LTA1LTE2VDEzOjM2OjI0KzAwOjAwK9TuQgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxOC0wNS0xNlQxMzozNjoyNCswMDowMFqJVv4AAABGdEVYdHNvZnR3YXJlAEltYWdlTWFnaWNrIDYuNy44LTkgMjAxNC0wNS0xMiBRMTYgaHR0cDovL3d3dy5pbWFnZW1hZ2ljay5vcmfchu0AAAAAGHRFWHRUaHVtYjo6RG9jdW1lbnQ6OlBhZ2VzADGn/7svAAAAGHRFWHRUaHVtYjo6SW1hZ2U6OmhlaWdodAAxOTIPAHKFAAAAF3RFWHRUaHVtYjo6SW1hZ2U6OldpZHRoADE5MtOsIQgAAAAZdEVYdFRodW1iOjpNaW1ldHlwZQBpbWFnZS9wbmc/slZOAAAAF3RFWHRUaHVtYjo6TVRpbWUAMTUyNjQ3Nzc4NGTqj8oAAAAPdEVYdFRodW1iOjpTaXplADBCQpSiPuwAAABWdEVYdFRodW1iOjpVUkkAZmlsZTovLy9tbnRsb2cvZmF2aWNvbnMvMjAxOC0wNS0xNi82ODRlZmQxYzBmMTdmMzAxMjIzMWFmNzQ4YzhmYjJjYy5pY28ucG5nP6GaiQAAAABJRU5ErkJggg=="/> </a><br/> <a href="https://discordapp.com/invite/cTH4yaw"> <img src="https://img.shields.io/discord/358599430502481920.svg?style=flat-square&logo=discord&label=Chat%20%2F%20Support&colorB=7289DA"/> </a><br/> <a href="https://github.com/lolamtisch/MALSync"> <img src="https://img.shields.io/github/last-commit/lolamtisch/malsync.svg?style=flat-square&logo=github&logoColor=white&label=Github"/> </a><br/> <a href="https://github.com/lolamtisch/MALSync/issues"> <img src="https://img.shields.io/github/issues/lolamtisch/MALSync.svg?style=flat-square&logo=github&logoColor=white"/> </a><br/> <a href="https://chrome.google.com/webstore/detail/mal-sync/kekjfbackdeiabghhcdklcdoekaanoel?hl=en"> <img src="https://img.shields.io/badge/Chrome-Download-brightgreen.svg?style=flat-square&label=Chrome&logo=google%20chrome&logoColor=white"/> </a><br/> <a href="https://addons.mozilla.org/en-US/firefox/addon/mal-sync"> <img src="https://img.shields.io/badge/Firefox-Download-brightgreen.svg?style=flat-square&label=Firefox&logo=mozilla%20firefox&logoColor=white"/> </a><br/> <a href="http://greasyfork.icu/de/scripts/372847-mal-sync"> <img src="https://img.shields.io/badge/Userscript-Download-brightgreen.svg?style=flat-square&label=Userscript&logo=javascript&logoColor=white"/> </a> </div> </li> </div> </div> </ul> `; this.minimal.find('#malConfig').html(settingsUI); // Listener this.minimal.find("#posLeft").val(api.settings.get('posLeft')); this.minimal.find("#posLeft").change(function () { // @ts-ignore api.settings.set('posLeft', j.$(this).val()); // @ts-ignore j.$('#modal-content').css('right', 'auto').css('left', 'auto').css(j.$(this).val(), '0'); }); this.minimal.find("#miniMalWidth").on("input", function () { var miniMalWidth = This.minimal.find("#miniMalWidth").val(); if (miniMalWidth !== null) { if (miniMalWidth === '') { miniMalWidth = '30%'; utils.flashm("Width reset"); } api.settings.set('miniMalWidth', miniMalWidth); } j.$("#modal-content").css('width', miniMalWidth); }); this.minimal.find("#syncMode").change(function () { // @ts-ignore var value = j.$(this).val(); api.settings.set('syncMode', value); if (value == 'ANILIST') { This.minimal.find('.anilistShow').show(); } else { This.minimal.find('.anilistShow').hide(); } }); this.minimal.find("#syncMode").val(api.settings.get('syncMode')).change(); this.minimal.find("#miniMalHeight").on("input", function () { var miniMalHeight = This.minimal.find("#miniMalHeight").val(); if (miniMalHeight !== null) { if (miniMalHeight === '') { miniMalHeight = '90%'; utils.flashm("Height reset"); } api.settings.set('miniMalHeight', miniMalHeight); } j.$("#modal-content").css('height', miniMalHeight); }); this.minimal.find("#malThumbnail").val(api.settings.get('malThumbnail')); this.minimal.find("#malThumbnail").change(function () { api.settings.set('malThumbnail', This.minimal.find("#malThumbnail").val()); }); this.minimal.find('#clearCache').click(function () { return __awaiter(this, void 0, void 0, function* () { var cacheArray = yield api.storage.list(); var deleted = 0; j.$.each(cacheArray, function (index, cache) { if (!utils.syncRegex.test(index)) { api.storage.remove(index); deleted++; } }); utils.flashm("Cache Cleared [" + deleted + "]"); }); }); this.minimal.find("#malDelay").on("input", function () { var tempDelay = This.minimal.find("#malDelay").val(); if (tempDelay !== null) { if (tempDelay !== '') { api.settings.set('delay', tempDelay); utils.flashm("New delay (" + tempDelay + ") set."); } else { api.settings.set('delay', 0); utils.flashm("Delay reset"); } } }); listener.forEach(function (fn) { fn(); }); if (api.type == 'webextension') { this.minimal.find('.option-extension').show(); } if (api.type == 'webextension' && this.isPopup()) { this.minimal.find('.option-extension-popup').show(); } if (api.type == 'webextension' && this.isPopup()) { chrome.alarms.get("updateCheck", (a) => { con.log(a); interval = 0; if (typeof a !== 'undefined') { var interval = a.periodInMinutes; this.minimal.find('.updateCheckEnable').show(); } this.minimal.find('#updateCheckTime').val(interval); if (interval) { setUpdateCheckLast(); setInterval(function () { setUpdateCheckLast(); }, 60 * 1000); function setUpdateCheckLast() { api.storage.get("updateCheckLast").then((updateCheckTime) => { if (isNaN(updateCheckTime)) return; var delta = Math.abs(updateCheckTime - Date.now()) / 1000; var text = ''; var diffDays = Math.floor(delta / 86400); delta -= diffDays * 86400; if (diffDays) { text += diffDays + 'd '; } var diffHours = Math.floor(delta / 3600) % 24; delta -= diffHours * 3600; if (diffHours) { text += diffHours + 'h '; } var diffMinutes = Math.floor(delta / 60) % 60; delta -= diffMinutes * 60; if (!diffDays) { text += diffMinutes + 'min '; } if (text != '') { text += 'ago'; $('#updateCheckAgo').text(text); } }); } } }); this.minimal.find("#updateCheckTime").change(() => { var updateCheckTime = this.minimal.find('#updateCheckTime').val(); api.storage.set('updateCheckTime', updateCheckTime); if (updateCheckTime != 0 && updateCheckTime != '0') { this.minimal.find('.updateCheckEnable').show(); chrome.alarms.create("updateCheck", { periodInMinutes: parseInt(updateCheckTime) }); if (!utils.canHideTabs()) { chrome.permissions.request({ permissions: ["webRequest", "webRequestBlocking"], origins: chrome.runtime.getManifest().optional_permissions.filter((permission) => { return (permission != 'webRequest' && permission != 'webRequestBlocking' && permission != 'cookies'); }) }, function (granted) { con.log('optional_permissions', granted); }); } ; chrome.alarms.create("updateCheckNow", { when: Date.now() + 1000 }); } else { this.minimal.find('.updateCheckEnable').hide(); chrome.alarms.clear("updateCheck"); } }); this.minimal.find('#updateCheck').show(); } this.minimal.find('#updateCheckUi').click(() => { this.updateCheckUi(); }); try { if (api.type == 'webextension') { chrome.permissions.contains({ permissions: ['cookies'] }, (result) => { if (result) { if (!this.minimal.find('#strictCookies')[0].checked) { this.minimal.find('#strictCookies').trigger('click'); } } this.minimal.find('#strictCookies').change(() => { if (this.minimal.find('#strictCookies')[0].checked) { con.log('strictCookies checked'); chrome.permissions.request({ permissions: ["webRequest", "webRequestBlocking", "cookies"], origins: [], }, function (granted) { con.log('optional_permissions', granted); }); } else { con.log('strictCookies not checked'); chrome.permissions.remove({ permissions: ["cookies"], origins: [], }, function (remove) { con.log('optional_permissions_remove', remove); }); } }); }); } } catch (e) { con.error(e); } api.storage.get('tempVersion') .then((version) => { var versionMsg = ''; if (version != api.storage.version()) { versionMsg = 'Updated to version ' + api.storage.version() + ' [<a class="close" target="_blank" href="https://malsync.lolamtisch.de/changelog#' + api.storage.version() + '">CHANGELOG</a>]'; } con.log(version); if (typeof version == 'undefined') { versionMsg = ` <div style=" text-align: left; margin-left: auto; margin-right: auto; display: inline-block; padding: 10px 15px; background-color: #3d4e9a; margin-top: -5px; "> <span style="text-decoration: underline; font-size: 15px;">Thanks for installing MAL-Sync</span><br> <br> Having Questions?<br> <a target="_blank" href="https://discordapp.com/invite/cTH4yaw"> <img alt="Discord" src="https://img.shields.io/discord/358599430502481920.svg?style=flat-square&logo=discord&label=Discord&colorB=7289DA"> </a><br> <a target="_blank" href="https://github.com/lolamtisch/MALSync/issues"> <img alt="Github Issues" src="https://img.shields.io/github/issues/lolamtisch/MALSync.svg?style=flat-square&logo=github&logoColor=white"> </a><br> <br> Open Source Code:<br> <a target="_blank" href="https://github.com/lolamtisch/MALSync"> <img alt="Github" src="https://img.shields.io/github/last-commit/lolamtisch/malsync.svg?style=flat-square&logo=github&logoColor=white&label=Github"> </a> </div> `; } if (versionMsg != '') { this.flashm(versionMsg, function () { api.storage.set('tempVersion', api.storage.version()); }); } }); api.request.xhr('GET', 'https://kissanimelist.firebaseio.com/Data2/Notification/Contributer.json').then((response) => { try { var contr = JSON.parse(response.responseText.replace(/(^"|"$)/gi, '').replace(/\\"/g, '"')); } catch (e) { con.error('Contributer Could not be retieved', e); return; } con.log('Contributer', contr); var html = ''; for (var group in contr) { html += `<div class="group">${group}</div>`; for (var user in contr[group]) { var userVal = contr[group][user]; if (typeof userVal.subText != 'undefined' && userVal.subText) { userVal.subText = `<div class="subtext">${userVal.subText}</div>`; } else { userVal.subText = ''; } if (typeof userVal.gif != 'undefined' && userVal.gif) { userVal.gif = `<img data-src="${userVal.gif}" class="lazy init gif">`; } else { userVal.gif = ''; } html += ` <div class="user"> <div class="image align-middle"> ${userVal.gif} <img data-src="${userVal.image}" class="lazy init"> </div> <div class="text align-middle"> <div class="name" style="color: ${userVal.color}" title="${userVal.name}"> ${userVal.name} </div> ${userVal.subText} </div> </div> `; } } This.minimal.find('#contributer').html(html).click(() => { This.minimal.find('#contributer').toggleClass("open"); }); utils.lazyload(This.minimal); }, 100); //helper function materialCheckbox(option, text, header = false, value = null) { var check = ''; var sty = ''; if (value === null) { value = api.settings.get(option); } if (value) check = 'checked'; if (header) sty = 'font-size: 24px; font-weight: 300; line-height: normal;'; var item = ` <li class="mdl-list__item"> <span class="mdl-list__item-primary-content" style="${sty}"> ${text} </span> <span class="mdl-list__item-secondary-action"> <label class="mdl-switch mdl-js-switch mdl-js-ripple-effect" for="${option}"> <input type="checkbox" id="${option}" class="mdl-switch__input" ${check} /> </label> </span> </li>`; listener.push(function () { This.minimal.find('#' + option).change(function () { if (This.minimal.find('#' + option).is(":checked")) { api.settings.set(option, true); } else { api.settings.set(option, false); } }); }); return item; } } searchMal(keyword, type = 'all', selector, callback) { var This = this; this.minimal.find(selector).html(''); api.request.xhr('GET', 'https://myanimelist.net/search/prefix.json?type=' + type + '&keyword=' + keyword + '&v=1').then((response) => { var searchResults = j.$.parseJSON(response.responseText); this.minimal.find(selector).append('<div class="mdl-grid">\ <select name="myinfo_score" id="searchListType" class="inputtext mdl-textfield__input mdl-cell mdl-cell--12-col" style="outline: none; background-color: white; border: none;">\ <option value="anime">Anime</option>\ <option value="manga">Manga</option>\ </select>\ </div>'); this.minimal.find('#searchListType').val(type); this.minimal.find('#searchListType').change(function (event) { This.searchMal(keyword, This.minimal.find('#searchListType').val(), selector, callback); }); j.$.each(searchResults, (i, value) => { j.$.each(value, (i, value) => { j.$.each(value, (i, value) => { if (typeof value !== 'object') return; j.$.each(value, (i, value) => { if (typeof value['name'] != 'undefined') { This.minimal.find(selector + ' > div').append('<a class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--2dp mdl-grid searchItem" href="' + value['url'] + '" style="cursor: pointer;">\ <img src="' + value['image_url'] + '" style="margin: -8px 0px -8px -8px; height: 100px; width: 64px; background-color: grey;"></img>\ <div style="flex-grow: 100; cursor: pointer; margin-top: 0; margin-bottom: 0;" class="mdl-cell">\ <span style="font-size: 20px; font-weight: 400; line-height: 1;">' + value['name'] + '</span>\ <p style="margin-bottom: 0; line-height: 20px; padding-top: 3px;">Type: ' + value['payload']['media_type'] + '</p>\ <p style="margin-bottom: 0; line-height: 20px;">Score: ' + value['payload']['score'] + '</p>\ <p style="margin-bottom: 0; line-height: 20px;">Year: ' + value['payload']['start_year'] + '</p>\ </div>\ </a>'); } }); }); }); }); callback(); }); } bookmarks(state = 1, localListType = 'anime') { this.minimal.find('#fixed-tab-4 #malSearchPopInner').html('<div id="malList"></div>'); this.minimal.find('#loadMalSearchPop').show(); var element = this.minimal.find('#malSearchPopInner'); var This = this; var localPlanTo = 'Plan to Watch'; var localWatching = 'Watching'; if (localListType != 'anime') { localPlanTo = 'Plan to Read'; localWatching = 'Reading'; } var firstEl = 1; _provider_provider_ts__WEBPACK_IMPORTED_MODULE_1__[/* userList */ "b"](state, localListType, { singleCallback: function (el, index, total) { if (firstEl) { firstEl = 0; var bookmarkHtml = '<div class="mdl-grid" id="malList" style="justify-content: space-around;">'; bookmarkHtml += '<select name="myinfo_score" id="userListType" class="inputtext mdl-textfield__input mdl-cell mdl-cell--12-col" style="outline: none; background-color: white; border: none;">\ <option value="anime">Anime</option>\ <option value="manga">Manga</option>\ </select>'; bookmarkHtml += '<select name="myinfo_score" id="userListState" class="inputtext mdl-textfield__input mdl-cell mdl-cell--12-col" style="outline: none; background-color: white; border: none;">\ <option value="7">All</option>\ <option value="1" selected>' + localWatching + '</option>\ <option value="2">Completed</option>\ <option value="3">On-Hold</option>\ <option value="4">Dropped</option>\ <option value="6">' + localPlanTo + '</option>\ </select>'; //flexbox placeholder for (var i = 0; i < 10; i++) { bookmarkHtml += '<div class="listPlaceholder mdl-cell mdl-cell--2-col mdl-cell--4-col-tablet mdl-cell--6-col-phone mdl-shadow--2dp mdl-grid " style="cursor: pointer; height: 250px; padding: 0; width: 210px; height: 0px; margin-top:0; margin-bottom:0; visibility: hidden;"></div>'; } bookmarkHtml += '</div>'; element.html(bookmarkHtml); This.minimal.find('#malSearchPopInner #userListType').val(localListType); This.minimal.find('#malSearchPopInner #userListType').change(function (event) { This.bookmarks(state, This.minimal.find('#malSearchPopInner #userListType').val()); }); This.minimal.find('#malSearchPopInner #userListState').val(state); This.minimal.find('#malSearchPopInner #userListState').change(function (event) { This.bookmarks(This.minimal.find('#malSearchPopInner #userListState').val(), localListType); }); } if (!el) { element.find('#malList .listPlaceholder').first().before('<span class="mdl-chip" style="margin: auto; margin-top: 16px; display: table;"><span class="mdl-chip__text">No Entries</span></span>'); element.find('#malList .listPlaceholder').remove(); return; } var bookmarkElement = ''; var streamUrl = utils.getUrlFromTags(el.tags); var imageHi = el.image; var regexDimensions = /\/r\/\d*x\d*/g; if (regexDimensions.test(imageHi)) { imageHi = imageHi.replace(/v.jpg$/g, '.jpg').replace(regexDimensions, ''); } var progressProcent = (el.watchedEp / el.totalEp) * 100; bookmarkElement += '<div class="mdl-cell mdl-cell--2-col mdl-cell--4-col-tablet mdl-cell--6-col-phone mdl-shadow--2dp mdl-grid bookEntry e' + el.id + '" malhref="' + el.url + '" maltitle="' + el.title + '" malimage="' + el.image + '" style="position: relative; cursor: pointer; height: 250px; padding: 0; width: 210px; height: 293px;">'; bookmarkElement += '<div class="data title lazyBack init" data-src="' + imageHi + '" style="background-image: url(); background-color: grey; background-size: cover; background-position: center center; background-repeat: no-repeat; width: 100%; position: relative; padding-top: 5px;">'; bookmarkElement += '<span class="mdl-shadow--2dp" style="position: absolute; bottom: 0; display: block; background-color: rgba(255, 255, 255, 0.9); padding-top: 5px; display: inline-flex; align-items: center; justify-content: space-between; left: 0; right: 0; padding-right: 8px; padding-left: 8px; padding-bottom: 8px;">' + el.title; bookmarkElement += '<div id="p1" class="mdl-progress" series_episodes="' + el.totalEp + '" style="position: absolute; top: -4px; left: 0;"><div class="progressbar bar bar1" ep="' + el.watchedEp + '" style="width: ' + progressProcent + '%;"></div><div class="bufferbar bar bar2" style="width: calc(100% + 1px);"></div><div class="auxbar bar bar3" style="width: 0%;"></div></div>'; bookmarkElement += '<div class="data progress mdl-chip mdl-chip--contact mdl-color--indigo-100" style="float: right; line-height: 20px; height: 20px; padding-right: 4px; margin-left: 5px;">'; bookmarkElement += '<div class="link mdl-chip__contact mdl-color--primary mdl-color-text--white" style="line-height: 20px; height: 20px; margin-right: 0;">' + el.watchedEp + '</div>'; bookmarkElement += '</div>'; bookmarkElement += '</span>'; bookmarkElement += '<div class="tags" style="display: none;">' + el.tags + '</div>'; bookmarkElement += '</div>'; bookmarkElement += '</div>'; if (el.airingState == 1 && state == 1) { element.find('#malList #userListState').after(bookmarkElement); } else { element.find('#malList .listPlaceholder').first().before(bookmarkElement); } var domE = element.find('#malList .e' + el.id).first(); domE.click(function (event) { // @ts-ignore if (!This.fill(j.$(this).attr('malhref'))) { con.error('Something is wrong'); } }); utils.epPredictionUI(el.id, localListType, function (prediction) { var pre = prediction.prediction; var color = 'orange'; if (prediction.color != '') { color = prediction.color; } if (prediction.tagEpisode) { var progressBar = domE.find('.mdl-progress'); var totalEps = progressBar.attr('series_episodes'); var predictionProgress = (prediction.tagEpisode / totalEps) * 100; if (parseInt(totalEps) == 0) { predictionProgress = 80; progressBar.find('.bar2').css('background', 'transparent'); var watchedEp = progressBar.find('.bar1').attr('ep'); var watchedProgress = (watchedEp / prediction.tagEpisode) * predictionProgress; progressBar.find('.bar1').css('width', watchedProgress + '%'); } progressBar.prepend('<div class="predictionbar bar kal-ep-pre" ep="' + (prediction.tagEpisode) + '" style="width: ' + predictionProgress + '%; background-color: ' + color + '; z-index: 1; left: 0;"></div>'); domE.attr('title', prediction.text); } if (prediction.text != "" && prediction.text) { domE.find('.data.title').prepend(` <div class="mdl-shadow--2dp" style=" position: absolute; top: 0; right: 0; background-color: rgba(255, 255, 255, 0.9); padding: 0px 5px; margin: 5px 0; text-align: center; "> ${preTexter(pre)} </div> `); } function preTexter(pre) { //Round hours if (pre.diffDays > 1 && pre.diffHours > 12) { pre.diffDays++; } var text = ''; if (pre.diffDays > 1) { return text + pre.diffDays + ' Days'; } if (pre.diffDays == 1) { text += pre.diffDays + ' Day '; } if (pre.diffHours > 1) { return text + pre.diffHours + ' Hours'; } if (pre.diffHours == 1) { text += pre.diffHours + ' Hour '; } return text + pre.diffMinutes + ' mins'; } }); streamUI(); function streamUI() { return __awaiter(this, void 0, void 0, function* () { if (typeof streamUrl !== 'undefined') { con.log(streamUrl); domE.find('.data.progress').append(` <a class="mal-sync-stream" title="${streamUrl.split('/')[2]}" target="_blank" style="margin: 0 5px;" href="${streamUrl}"> <img src="${utils.favicon(streamUrl.split('/')[2])}"> </a>`); var id = utils.urlPart(el.url, 4); var type = utils.urlPart(el.url, 3); var resumeUrlObj = yield utils.getResumeWaching(type, id); var continueUrlObj = yield utils.getContinueWaching(type, id); var curEp = parseInt(el.watchedEp.toString()); con.log('Resume', resumeUrlObj, 'Continue', continueUrlObj); if (typeof continueUrlObj !== 'undefined' && continueUrlObj.ep === (curEp + 1)) { domE.find('.data.progress').append(`<a class="nextStream" title="Continue watching" target="_blank" style="margin: 0 5px 0 0; color: #BABABA;" href="${continueUrlObj.url}"> <img src="${api.storage.assetUrl('double-arrow-16px.png')}" width="16" height="16"> </a>`); } else if (typeof resumeUrlObj !== 'undefined' && resumeUrlObj.ep === curEp) { domE.find('.data.progress').append(`<a class="resumeStream" title="Resume watching" target="_blank" style="margin: 0 5px 0 0; color: #BABABA;" href="${resumeUrlObj.url}"> <img src="${api.storage.assetUrl('arrow-16px.png')}" width="16" height="16"> </a>`); } } }); } }, finishCallback: function () { This.minimal.find('#loadMalSearchPop').hide(); utils.lazyload(This.minimal); }, continueCall: function (continueCall) { utils.lazyload(This.minimal); if (state == 1) { continueCall(); return; } var scrollable = This.minimal.find('.simplebar-scroll-content'); var scrollDone = 0; This.minimal.find('#loadMalSearchPop').hide(); scrollable.scroll(function () { if (scrollDone) return; // @ts-ignore if (scrollable.scrollTop() + scrollable.height() > scrollable.find('.simplebar-content').height() - 100) { scrollDone = 1; con.log('[Bookmarks]', 'Loading next part'); This.minimal.find('#loadMalSearchPop').show(); continueCall(); } }); } }); } updateCheckUi(type = 'anime') { this.minimal.find('#material').addClass('pop-over'); if (!this.minimal.find('.refresh-updateCheck').length) { this.minimal.find('#fixed-tab-4 #malSearchPopInner').html(''); } var refreshTo = setTimeout(() => { if (this.minimal.find('.refresh-updateCheck').length && this.minimal.find('#fixed-tab-4').css('display') != 'none') { this.updateCheckUi(type); } }, 5000); _provider_provider_ts__WEBPACK_IMPORTED_MODULE_1__[/* userList */ "b"](1, type, { fullListCallback: (list) => __awaiter(this, void 0, void 0, function* () { var html = ` <button class="mdl-button mdl-js-button mdl-button--primary refresh-updateCheck"> Refresh </button> <button class="mdl-button mdl-js-button mdl-button--accent startCheck-updateCheck"> Start Check </button> <button class="mdl-button mdl-js-button mdl-button--accent notification-updateCheck"> Notification Check </button> <select style="float: right;" class="typeSelect-updateCheck"> <option value="anime">Anime</option> <option value="manga"${(type == 'manga') ? 'selected="selected"' : ''}>Manga</option> </select> <table class="mdl-data-table mdl-js-data-table mdl-data-table__cell--non-numeric mdl-shadow--2dp"> <tr> <th class="mdl-data-table__cell--non-numeric"></th> <th>Episode</th> <th>Message</th> </tr>`; for (var i = 0; i < list.length; i++) { var el = list[i]; var episode = ''; var error = ''; var trColor = ''; con.log('el', el); var elCache = yield api.storage.get('updateCheck/' + type + '/' + el.id); con.log('elCache', elCache); if (typeof elCache != 'undefined') { episode = elCache['newestEp'] + '/' + el.totalEp; trColor = 'orange'; if (elCache['finished']) { error = 'finished'; trColor = 'green'; } if (typeof elCache['error'] != 'undefined') { error = elCache['error']; trColor = 'red'; } } html += ` <tr style="background-color: ${trColor};"> <th class="mdl-data-table__cell--non-numeric"> <button class="mdl-button mdl-js-button mdl-button--icon delete-updateCheck" data-delete="${'updateCheck/' + type + '/' + el.id}"><i class="material-icons">delete</i></button> <a href="${el.url}" style="color: black;"> ${el.title} </a> </th> <th>${episode}</th> <th>${error}</th> </tr> `; } html += '</table>'; this.minimal.find('#fixed-tab-4 #malSearchPopInner').html(html); this.minimal.find('.refresh-updateCheck').click(() => { clearTimeout(refreshTo); this.updateCheckUi(type); }); this.minimal.find('.notification-updateCheck').click(() => { utils.notifications('https://malsync.lolamtisch.de/', 'MyAnimeList-Sync', 'by lolamtisch', 'https://cdn.myanimelist.net/images/anime/5/65187.jpg'); }); this.minimal.find('.startCheck-updateCheck').click(() => { chrome.alarms.create("updateCheckNow", { when: Date.now() + 1000 }); utils.flashm("Check started"); }); this.minimal.find('.delete-updateCheck').click(function () { //@ts-ignore var thisEl = $(this); var delData = thisEl.data('delete'); con.log('delete', delData); api.storage.remove(delData); thisEl.parent().parent().css('background-color', 'black'); }); this.minimal.find('.typeSelect-updateCheck').change(() => { clearTimeout(refreshTo); this.updateCheckUi(this.minimal.find('.typeSelect-updateCheck').val()); }); }) }); } flashm(text, closefn = function () { }) { var mess = ` <div style=" background-color: #3f51b5; text-align: center; padding: 5px 24px; color: white; border-top: 1px solid #fefefe; "> ${text} <i class="material-icons close" style=" float: right; font-size: 24px; margin-top: -2px; margin-right: -24px; margin-bottom: -5px; ">close</i> </div> `; var flashmDiv = j.$(mess).appendTo(this.minimal.find('.mdl-layout')); flashmDiv.find('.close').click(function () { flashmDiv.slideUp(100, function () { flashmDiv.remove(); closefn(); }); }); return flashmDiv; } } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(3), __webpack_require__(2), __webpack_require__(1), __webpack_require__(0))) /***/ }), /* 29 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(api, j, utils, con) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return animeType; }); /* harmony import */ var _provider_provider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6); var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; class animeType { constructor(url) { this.url = url; } init() { var This = this; return new Promise((resolve, reject) => { return api.request.xhr('GET', This.url).then((response) => { This.vars = response.responseText; resolve(); }); }); } overview(minimal) { return new Promise((resolve, reject) => { var data = this.vars; var html = ''; var image = ''; var title = ''; var description = ''; var altTitle = ''; var stats = ''; try { image = data.split('js-scrollfix-bottom')[1].split('<img src="')[1].split('"')[0]; } catch (e) { console.log('[iframeOverview] Error:', e); } try { title = data.split('itemprop="name">')[1].split('<')[0]; } catch (e) { console.log('[iframeOverview] Error:', e); } try { description = data.split('itemprop="description">')[1].split('</span')[0]; } catch (e) { console.log('[iframeOverview] Error:', e); } try { altTitle = data.split('<h2>Alternative Titles</h2>')[1].split('<h2>')[0]; altTitle = altTitle.replace(/spaceit_pad/g, 'mdl-chip" style="margin-right: 5px;'); altTitle = altTitle.replace(/<\/span>/g, '</span><span class="mdl-chip__text">'); altTitle = altTitle.replace(/<\/div>/g, '</span></div>'); } catch (e) { console.log('[iframeOverview] Error:', e); } try { var statsBlock = data.split('<h2>Statistics</h2>')[1].split('<h2>')[0]; // @ts-ignore var tempHtml = j.$.parseHTML(statsBlock); var statsHtml = '<ul class="mdl-list mdl-grid mdl-grid--no-spacing mdl-cell mdl-cell--12-col" style="display: flex; justify-content: space-around;">'; j.$.each(j.$(tempHtml).filter('div').slice(0, 5), function (index, value) { statsHtml += '<li class="mdl-list__item mdl-list__item--two-line" style="padding: 0; padding-left: 10px; padding-right: 3px; min-width: 18%;">'; statsHtml += '<span class="mdl-list__item-primary-content">'; statsHtml += '<span>'; statsHtml += j.$(value).find('.dark_text').text(); statsHtml += '</span>'; statsHtml += '<span class="mdl-list__item-sub-title">'; statsHtml += j.$(value).find('span[itemprop=ratingValue]').height() != null ? j.$(value).find('span[itemprop=ratingValue]').text() : j.$(value).clone().children().remove().end().text(); statsHtml += '</span>'; statsHtml += '</span>'; statsHtml += '</li>'; }); statsHtml += '</ul>'; stats = statsHtml; } catch (e) { console.log('[iframeOverview] Error:', e); } html += overviewElement(this.url, title, image, description, altTitle, stats); try { var localType = utils.urlPart(this.url, 3); html += `<div class="mdl-cell mdl-cell--4-col mdl-cell--8-col-tablet mdl-shadow--4dp data-block mdl-grid mdl-grid--no-spacing malClear"> <table border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <li class="mdl-list__item mdl-list__item--three-line" style="width: 100%;"> <span class="mdl-list__item-primary-content"> <span>Status:</span> <span class="mdl-list__item-text-body"> <select name="myinfo_status" id="myinfo_status" class="inputtext js-anime-status-dropdown mdl-textfield__input" style="outline: none; visibility: hidden;"> <option selected="selected" value="1">${utils.watching(localType)}</option> <option value="2">Completed</option> <option value="3">On-Hold</option> <option value="4">Dropped</option> <option value="6">${utils.planTo(localType)}</option> </select> </span> </span> </li> <li class="mdl-list__item mdl-list__item--three-line" style="width: 100%;"> <span class="mdl-list__item-primary-content"> <span>${utils.episode(localType)}:</span> <span class="mdl-list__item-text-body"> <input type="text" id="myinfo_watchedeps" name="myinfo_watchedeps" size="3" class="inputtext mdl-textfield__input" value="6" style="width: 35px; display: inline-block; visibility: hidden;"> / <span id="curEps" style="visibility: hidden;">?</span> <a href="javascript:void(0)" class="js-anime-increment-episode-button" target="_blank"> <i class="fa fa-plus-circle ml4"> </i> </a> </span> </span> </li> `; if (localType == 'manga') { html += ` <li class="mdl-list__item mdl-list__item--three-line" style="width: 100%;"> <span class="mdl-list__item-primary-content"> <span>Volume:</span> <span class="mdl-list__item-text-body"> <input type="text" id="myinfo_volumes" name="myinfo_volumes" size="3" class="inputtext mdl-textfield__input" value="6" style="width: 35px; display: inline-block; visibility: hidden;"> / <span id="curVolumes" style="visibility: hidden;">?</span> <a href="javascript:void(0)" class="js-anime-increment-episode-button" target="_blank"> <i class="fa fa-plus-circle ml4"> </i> </a> </span> </span> </li> `; } html += ` <li class="mdl-list__item mdl-list__item--three-line" style="width: 100%;"> <span class="mdl-list__item-primary-content"> <span>Your Score:</span> <span class="mdl-list__item-text-body"> <select name="myinfo_score" id="myinfo_score" class="inputtext mdl-textfield__input" style="outline: none; visibility: hidden;"> <option value="" selected="selected">Select</option> <option value="10">(10) Masterpiece</option> <option value="9">(9) Great</option> <option value="8">(8) Very Good</option> <option value="7">(7) Good</option> <option value="6">(6) Fine</option> <option value="5">(5) Average</option> <option value="4">(4) Bad</option> <option value="3">(3) Very Bad</option> <option value="2">(2) Horrible</option> <option value="1">(1) Appalling</option> </select> </span> </span> </li> <li class="mdl-list__item" style="width: 100%;"> <input type="button" name="myinfo_submit" value="Update" class="inputButton btn-middle flat js-anime-update-button mdl-button mdl-js-button mdl-button--raised mdl-button--colored" style="margin-right: 5px;" data-upgraded=",MaterialButton"> <small> <a href="https://myanimelist.net/ownlist/${localType}/${utils.urlPart(this.url, 4)}/edit" target="_blank">Edit Details</a> </small> </li> </tbody> </table> </div>`; } catch (e) { console.log('[iframeOverview] Error:', e); } try { var relatedBlock = data.split('Related ')[1].split('</h2>')[1].split('<h2>')[0]; var related = j.$.parseHTML(relatedBlock); var relatedHtml = '<ul class="mdl-list">'; j.$.each(j.$(related).filter('table').find('tr'), function (index, value) { relatedHtml += '<li class="mdl-list__item mdl-list__item--two-line">'; relatedHtml += '<span class="mdl-list__item-primary-content">'; relatedHtml += '<span>'; relatedHtml += j.$(value).find('.borderClass').first().text(); relatedHtml += '</span>'; relatedHtml += '<span class="mdl-list__item-sub-title">'; j.$(value).find('.borderClass').last().each(function (index, value) { j.$(value).html(j.$(value).children()); }); relatedHtml += j.$(value).find('.borderClass').last().html(); relatedHtml += '</span>'; relatedHtml += '</span>'; relatedHtml += '</li>'; }); relatedHtml += '</ul>'; html += `<div class="mdl-grid mdl-grid--no-spacing mdl-cell mdl-cell--4-col mdl-cell--8-col-tablet mdl-shadow--4dp related-block alternative-list mdl-grid malClear"> ${relatedHtml} </div>`; } catch (e) { console.log('[iframeOverview] Error:', e); } try { html += `<div style="display: none;" class="mdl-grid mdl-grid--no-spacing mdl-cell mdl-cell--4-col mdl-cell--8-col-tablet mdl-shadow--4dp mdl-grid alternative-list stream-block malClear"> <ul class="mdl-list stream-block-inner"> </ul> </div>`; } catch (e) { console.log('[iframeOverview] Error:', e); } try { var characterBlock = data.split('detail-characters-list')[1].split('</h2>')[0]; var charHtml = j.$.parseHTML('<div class="detail-characters-list ' + characterBlock); var temphtml = ''; var charFound = 0; var tempWrapHtml = '<div class="mdl-grid mdl-grid--no-spacing mdl-cell mdl-cell--12-col mdl-shadow--4dp characters-block mdl-grid malClear">\ <div class="mdl-card__actions clicker" style="display: none;">\ <h1 class="mdl-card__title-text" style="float: left;">Characters</h1>\ <i class="material-icons mdl-accordion__icon mdl-animation--default remove" style="float: right; margin-top: 3px;">expand_more</i>\ </div>\ <div class="mdl-grid mdl-card__actions mdl-card--border" id="characterList" style="justify-content: space-between; display: none;">'; j.$.each(j.$(charHtml).find(':not(td) > table'), (index, value) => { if (!index) charFound = 1; var regexDimensions = /\/r\/\d*x\d*/g; var charImg = j.$(value).find('img').first().attr("data-src"); if (regexDimensions.test(charImg)) { charImg = charImg.replace(regexDimensions, ''); } else { charImg = 'https://myanimelist.cdn-dena.com/images/questionmark_23.gif'; } charImg = utils.handleMalImages(charImg); tempWrapHtml += '<div>'; tempWrapHtml += '<div class="mdl-grid" style="width: 126px;">'; tempWrapHtml += '<div style="width: 100%; height: auto;">'; tempWrapHtml += '<img style="height: auto; width: 100%;"src="' + charImg + '">'; tempWrapHtml += '</div>'; tempWrapHtml += '<div class="">'; tempWrapHtml += j.$(value).find('.borderClass .spaceit_pad').first().parent().html(); tempWrapHtml += '</div>'; tempWrapHtml += '</div>'; tempWrapHtml += '</div>'; }); for (var i = 0; i < 10; i++) { tempWrapHtml += '<div class="listPlaceholder" style="height: 0;"><div class="mdl-grid" style="width: 126px;"></div></div>'; } tempWrapHtml += '</div></div>'; if (charFound) html += tempWrapHtml; } catch (e) { console.log('[iframeOverview] Error:', e); } try { var infoBlock = data.split('<h2>Information</h2>')[1].split('<h2>')[0]; var infoData = j.$.parseHTML(infoBlock); var infoHtml = '<ul class="mdl-grid mdl-grid--no-spacing mdl-list mdl-cell mdl-cell--12-col">'; j.$.each(j.$(infoData).filter('div'), (index, value) => { if ((index + 4) % 4 == 0 && index != 0) { //infoHtml +='</ul><ul class="mdl-list mdl-cell mdl-cell--3-col mdl-cell--4-col-tablet">'; } infoHtml += '<li class="mdl-list__item mdl-list__item--three-line mdl-cell mdl-cell--3-col mdl-cell--4-col-tablet">'; infoHtml += '<span class="mdl-list__item-primary-content">'; infoHtml += '<span>'; infoHtml += j.$(value).find('.dark_text').text(); infoHtml += '</span>'; infoHtml += '<span class="mdl-list__item-text-body">'; j.$(value).find('.dark_text').remove(); infoHtml += j.$(value).html(); //j.$(value).find('*').each(function(){infoHtml += j.$(value)[0].outerHTML}); //infoHtml += j.$(value).find('span[itemprop=ratingValue]').height() != null ? j.$(value).find('span[itemprop=ratingValue]').text() : j.$(value).clone().children().remove().end().text(); infoHtml += '</span>'; infoHtml += '</span>'; infoHtml += '</li>'; }); infoHtml += '</ul>'; html += '<div class="mdl-grid mdl-grid--no-spacing mdl-cell mdl-cell--12-col mdl-shadow--4dp info-block mdl-grid malClear">' + infoHtml + '</div>'; } catch (e) { console.log('[iframeOverview] Error:', e); } resolve('<div class="mdl-grid">' + html + '</div>'); }); } lazyLoadOverview(minimal) { return __awaiter(this, void 0, void 0, function* () { //minimal.find('.characters-block .clicker').one('click', function(){ minimal.find('#characterList').show(); minimal.find('.characters-block .remove').remove(); //}); try { utils.epPredictionUI(utils.urlPart(this.url, 4), utils.urlPart(this.url, 3), function (prediction) { con.log(prediction); minimal.find('[id="curEps"]').before(prediction.tag + ' '); if (!prediction.prediction.airing) { minimal.find('.data-block').prepend('<li class="mdl-list__item" style="width: 100%;">' + prediction.text + '</li>'); } }); } catch (e) { console.log('[iframeOverview] Error:', e); } try { con.log('Streaming UI'); var malObj = Object(_provider_provider__WEBPACK_IMPORTED_MODULE_0__[/* entryClass */ "a"])(this.url, true); yield malObj.init(); minimal.find('#myinfo_status').val(malObj.getStatus()).css('visibility', 'visible'); minimal.find('#myinfo_watchedeps').val(malObj.getEpisode()).css('visibility', 'visible'); minimal.find('#myinfo_volumes').val(malObj.getVolume()).css('visibility', 'visible'); minimal.find('#curEps').html(malObj.totalEp).css('visibility', 'visible'); minimal.find('#curVolumes').html(malObj.totalVol).css('visibility', 'visible'); minimal.find('#myinfo_score').val(malObj.getScore()).css('visibility', 'visible'); minimal.find('.inputButton').click(function () { malObj.setStatus(minimal.find('#myinfo_status').val()); malObj.setEpisode(minimal.find('#myinfo_watchedeps').val()); if (minimal.find('#myinfo_volumes').length) { malObj.setVolume(minimal.find('#myinfo_volumes').val()); } malObj.setScore(minimal.find('#myinfo_score').val()); malObj.sync() .then(function () { utils.flashm('Updated'); }, function () { utils.flashm("Update failed", { error: true }); }); }); var streamUrl = malObj.getStreamingUrl(); if (typeof streamUrl !== 'undefined') { var streamhtml = `<div class="mdl-card__actions mdl-card--border" style="padding-left: 0;"> <div class="data title progress" style="display: inline-block; position: relative; top: 2px; margin-left: -2px;"> <a class="stream mdl-button mdl-button--colored mdl-js-button mdl-button--raised" title="${streamUrl.split('/')[2]}" target="_blank" style="margin: 0px 5px; color: white;" href="${streamUrl}"> <img src="${utils.favicon(streamUrl.split('/')[2])}" style="padding-bottom: 3px; padding-right: 6px; margin-left: -3px;">Continue ${utils.watching(malObj.type)} </a>`; var resumeUrlObj = yield malObj.getResumeWaching(); var continueUrlObj = yield malObj.getContinueWaching(); con.log('Resume', resumeUrlObj, 'Continue', continueUrlObj); if (typeof continueUrlObj !== 'undefined' && continueUrlObj.ep === (malObj.getEpisode() + 1)) { streamhtml += `<a class="nextStream mdl-button mdl-button--colored mdl-js-button mdl-button--raised" title="Continue watching" target="_blank" style="margin: 0px 5px 0px 0px; color: white;" href="${continueUrlObj.url}"> <img src="${api.storage.assetUrl('double-arrow-16px.png')}" width="16" height="16" style="padding-bottom: 3px; padding-right: 6px; margin-left: -3px;">Next Episode </a>`; } else if (typeof resumeUrlObj !== 'undefined' && resumeUrlObj.ep === malObj.getEpisode()) { streamhtml += `<a class="resumeStream mdl-button mdl-button--colored mdl-js-button mdl-button--raised" title="Resume watching" target="_blank" style="margin: 0px 5px 0px 0px; color: white;" href="${resumeUrlObj.url}"> <img src="${api.storage.assetUrl('arrow-16px.png')}" width="16" height="16" style="padding-bottom: 3px; padding-right: 6px; margin-left: -3px;">Resume Episode </a>`; } streamhtml += `</div> </div>`; minimal.find('.malDescription').first().append(streamhtml); } } catch (e) { console.log('[iframeOverview] Error:', e); } try { utils.getMalToKissArray(utils.urlPart(this.url, 3), utils.urlPart(this.url, 4)).then((links) => { var Kisshtml = ''; for (var pageKey in links) { var page = links[pageKey]; var tempHtml = ''; var tempUrl = ''; for (var streamKey in page) { var stream = page[streamKey]; tempHtml += '<div class="mal_links"><a target="_blank" href="' + stream['url'] + '">' + stream['title'] + '</a></div>'; tempUrl = stream['url']; } Kisshtml += `<li class="mdl-list__item mdl-list__item--three-line"> <span class="mdl-list__item-primary-content"> <span> <img style="padding-bottom: 3px;" src="${utils.favicon(tempUrl.split('/')[2])}"> ${pageKey} </span> <span id="KissAnimeLinks" class="mdl-list__item-text-body"> ${tempHtml} </span> </span> </li>`; } minimal.find('.stream-block').show().find('.stream-block-inner').prepend(Kisshtml); }); } catch (e) { console.log('[iframeOverview] Error:', e); } try { minimal.find('.related-block a').each(function () { //@ts-ignore var el = $(this); var url = utils.absoluteLink(el.attr('href'), 'https://myanimelist.net'); if (typeof url != 'undefined') { var malObj = Object(_provider_provider__WEBPACK_IMPORTED_MODULE_0__[/* entryClass */ "a"])(url, true); malObj.init().then(() => { var tag = utils.statusTag(malObj.getStatus(), malObj.type, malObj.id); if (tag) { el.wrap("<div></div>").after('<span>' + tag + '</span>'); } }); } }); } catch (e) { console.log('[iframeOverview] Error:', e); } }); } reviews(minimal) { return __awaiter(this, void 0, void 0, function* () { return new Promise((resolve, reject) => { con.info('Loading reviews'); var data = this.vars; try { var reviews = data.split('Reviews</h2>')[1].split('<h2>')[0]; var reviewsData = j.$.parseHTML(reviews); var reviewsHtml = '<div class="mdl-grid">'; j.$.each(j.$(reviewsData).filter('.borderDark'), (index, value) => { reviewsHtml += '<div class="mdl-cell mdl-cell--12-col mdl-shadow--4dp">'; reviewsHtml += '<div class="mdl-card__supporting-text mdl-card--border" style="color: black;">'; j.$(value).find('.spaceit > div').css('max-width', '60%'); reviewsHtml += j.$(value).find('.spaceit').first().html(); reviewsHtml += '</div>'; reviewsHtml += '<div class="mdl-card__supporting-text" style="color: black;">'; j.$(value).find('.textReadability, .textReadability > span').contents().filter(function () { // @ts-ignore return this.nodeType == 3 && j.$.trim(this.nodeValue).length; }).wrap('<p style="margin:0;padding=0;"/>'); j.$(value).find('br').css('line-height', '10px'); reviewsHtml += j.$(value).find('.textReadability').html(); reviewsHtml += '</div>'; reviewsHtml += '</div>'; }); reviewsHtml += '</div>'; if (reviewsHtml == '<div class="mdl-grid"></div>') { reviewsHtml = '<span class="mdl-chip" style="margin: auto; margin-top: 16px; display: table;"><span class="mdl-chip__text">Nothing Found</span></span>'; } resolve(reviewsHtml); /*j.$("#info-iframe").contents().find('#malReviews').html(reviewsHtml).show(); */ } catch (e) { console.log('[iframeReview] Error:', e); } }); }); } lazyLoadReviews(minimal) { return __awaiter(this, void 0, void 0, function* () { minimal.find('.js-toggle-review-button').addClass('nojs').click(function () { // @ts-ignore var revID = j.$(this).attr('data-id'); minimal.find('#review' + revID).css('display', 'initial'); minimal.find('#revhelp_output_' + revID).remove(); // @ts-ignore j.$(this).remove(); }); minimal.find('.mb8 a').addClass('nojs').click(function () { // @ts-ignore var revID = j.$(this).attr('onclick').split("j.$('")[1].split("'")[0]; minimal.find(revID).toggle(); }); }); } recommendations(minimal) { return __awaiter(this, void 0, void 0, function* () { //return new Promise((resolve, reject) => { return api.request.xhr('GET', this.url + '/userrecs').then((response) => { var data = response.responseText; try { var recommendationsBlock = data.split('Make a recommendation</a>')[1].split('</h2>')[1].split('<div class="mauto')[0]; var html = j.$.parseHTML(recommendationsBlock); var recommendationsHtml = '<div class="mdl-grid">'; j.$.each(j.$(html).filter('.borderClass'), (index, value) => { recommendationsHtml += '<div class="mdl-cell mdl-cell--6-col mdl-cell--8-col-tablet mdl-shadow--4dp mdl-grid">'; recommendationsHtml += '<div class="mdl-card__media" style="background-color: transparent; margin: 8px;">'; recommendationsHtml += j.$(value).find('.picSurround').html(); recommendationsHtml += '</div>'; recommendationsHtml += '<div class="mdl-cell" style="flex-grow: 100;">'; recommendationsHtml += '<div class="">'; j.$(value).find('.button_edit, .button_add, td:eq(1) > div:eq(1) span').remove(); recommendationsHtml += j.$(value).find('td:eq(1) > div:eq(1)').html(); recommendationsHtml += '</div>'; recommendationsHtml += '<div class="">'; j.$(value).find('a[href^="/dbchanges.php?go=report"]').remove(); recommendationsHtml += j.$(value).find('.borderClass').html(); recommendationsHtml += '</div>'; recommendationsHtml += '<div class="">'; recommendationsHtml += (typeof j.$(value).find('.spaceit').html() != 'undefined') ? j.$(value).find('.spaceit').html() : ''; recommendationsHtml += '<div class="more" style="display: none;">'; recommendationsHtml += j.$(value).find('td:eq(1) > div').last().html(); recommendationsHtml += '</div>'; recommendationsHtml += '</div>'; recommendationsHtml += '</div>'; /*recommendationsHtml += '<div class="mdl-card__supporting-text mdl-card--border" style="color: black;">'; j.$(value).find('.spaceit > div').css('max-width','60%'); recommendationsHtml += j.$(value).find('.spaceit').first().html(); recommendationsHtml += '</div>'; recommendationsHtml += '<div class="mdl-card__supporting-text" style="color: black;">'; j.$(value).find('.textReadability, .textReadability > span').contents().filter(function(){ return value.nodeType == 3 && j.$.trim(value.nodeValue).length; }).wrap('<p style="margin:0;padding=0;"/>'); j.$(value).find('br').css('line-height','10px'); recommendationsHtml += j.$(value).find('.textReadability').html(); recommendationsHtml += '</div>';*/ //recommendationsHtml += j.$(value).html(); recommendationsHtml += '</div>'; }); recommendationsHtml += '</div>'; if (recommendationsHtml == '<div class="mdl-grid"></div>') { recommendationsHtml = '<span class="mdl-chip" style="margin: auto; margin-top: 16px; display: table;"><span class="mdl-chip__text">Nothing Found</span></span>'; } //resolve(recommendationsHtml); return recommendationsHtml; } catch (e) { console.log('[iframeRecommendations] Error:', e); } }); }); } lazyLoadRecommendations(minimal) { return __awaiter(this, void 0, void 0, function* () { // @ts-ignore minimal.find('.js-similar-recommendations-button').addClass('nojs').click(function () { j.$(this).parent().find('.more').toggle(); }); minimal.find('.js-toggle-recommendation-button').addClass('nojs').click(function () { // @ts-ignore var revID = j.$(this).attr('data-id'); minimal.find('#recommend' + revID).css('display', 'initial'); // @ts-ignore j.$(this).remove(); }); minimal.find('#malRecommendations .more .borderClass').addClass('mdl-shadow--2dp').css('padding', '10px'); // @ts-ignore minimal.find('.lazyload').each(function () { j.$(this).attr('src', j.$(this).attr('data-src')); }); //TODO: use lazyloading }); } } function overviewElement(url, title, image, description, altTitle, stats) { return ` <div class="mdl-cell mdl-cell--1-col mdl-cell--8-col-tablet mdl-cell--6-col-phone mdl-shadow--4dp stats-block malClear" style="min-width: 120px;"> ${stats} </div> <div class="mdl-grid mdl-cell mdl-shadow--4dp coverinfo malClear" style="display:block; flex-grow: 100; min-width: 70%;"> <div class="mdl-card__media mdl-cell mdl-cell--2-col" style="background-color: transparent; float:left; padding-right: 16px;"> <img class="malImage malClear" style="width: 100%; height: auto;" src="${image}"></img> </div> <div class="mdl-cell mdl-cell--12-col"> <a class="mdl-button mdl-button--icon mdl-js-button mdl-js-ripple-effect malClear malLink" href="${url}" style="float: right;" target="_blank"><i class="material-icons">open_in_new</i></a> <h1 class="malTitle mdl-card__title-text malClear" style="padding-left: 0px; overflow:visible;">${title}</h1> <div class="malAltTitle mdl-card__supporting-text malClear" style="padding: 10px 0 0 0px; overflow:visible;">${altTitle}</div> </div> <div class="malDescription malClear mdl-cell mdl-cell--10-col" style="overflow: hidden;"> <p style="color: black;"> ${description} </p> </div> </div> `; } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(0), __webpack_require__(3), __webpack_require__(2), __webpack_require__(1))) /***/ }), /* 30 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(utils, con, api) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return myanimelistClass; }); /* harmony import */ var _pages_pages__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7); /* harmony import */ var _provider_MyAnimeList_entryClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8); /* harmony import */ var _provider_MyAnimeList_userList__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9); var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; class myanimelistClass { constructor(url) { this.url = url; this.page = null; //detail this.id = null; this.type = null; //bookmarks this.username = null; if (url.indexOf("myanimelist.net/anime.php") > -1) { var urlTemp = '/anime/' + utils.urlParam(this.url, 'id'); // @ts-ignore window.history.replaceState(null, null, urlTemp); this.url = utils.absoluteLink(urlTemp, 'https://myanimelist.net'); } if (url.indexOf("myanimelist.net/manga.php") > -1) { var urlTemp = '/manga/' + utils.urlParam(this.url, 'id'); // @ts-ignore window.history.replaceState(null, null, urlTemp); this.url = utils.absoluteLink(urlTemp, 'https://myanimelist.net'); } var urlpart = utils.urlPart(this.url, 3); if (urlpart == 'anime' || urlpart == 'manga') { this.page = 'detail'; this.id = utils.urlPart(this.url, 4); this.type = urlpart; } if (urlpart == 'animelist' || urlpart == 'mangalist') { this.page = 'bookmarks'; this.type = urlpart.substring(0, 5); this.username = utils.urlPart(this.url, 4); } if (urlpart == 'character') { this.page = 'character'; } if (urlpart == 'people') { this.page = 'people'; } if (urlpart == 'search') { this.page = 'search'; } } init() { con.log(this); switch (this.page) { case 'detail': this.thumbnails(); this.setEpPrediction(); this.streamingUI(); this.malToKiss(); this.siteSearch(); this.related(); this.friendScore(); setInterval(() => { this.setEpPrediction(); }, 1000 * 60); break; case 'bookmarks': var This = this; $(document).ready(function () { if ($('#mal_cs_powered').length) { This.page = 'classic'; } else { This.page = 'modern'; } This.init(); }); break; case 'modern': this.bookmarks(); break; case 'classic': this.bookmarks(); break; case 'character': case 'people': this.relatedTag(); case 'search': this.thumbnails(); break; default: con.log('This page has no scipt'); } } thumbnails() { con.log('Lazyloaded Images'); if (this.url.indexOf("/pics") > -1) { return; } if (this.url.indexOf("/pictures") > -1) { return; } if (api.settings.get('malThumbnail') == "0") { return; } var height = parseInt(api.settings.get('malThumbnail')); var width = Math.floor(height / 144 * 100); var surHeight = height + 4; var surWidth = width + 4; api.storage.addStyle('.picSurround img:not(.noKal){height: ' + height + 'px !important; width: ' + width + 'px !important;}'); api.storage.addStyle('.picSurround img.lazyloaded.kal{width: auto !important;}'); api.storage.addStyle('.picSurround:not(.noKal) a{height: ' + surHeight + 'px; width: ' + surWidth + 'px; overflow: hidden; display: flex; justify-content: center;}'); var loaded = 0; try { // @ts-ignore $(window).load(function () { overrideLazyload(); }); } catch (e) { con.info(e); } try { window.onload = function () { overrideLazyload(); }; } catch (e) { con.info(e); } try { document.onload = function () { overrideLazyload(); }; } catch (e) { con.info(e); } try { $(document).ready(function () { overrideLazyload(); }); } catch (e) { con.info(e); } function overrideLazyload() { if (loaded) return; loaded = 1; var tags = document.querySelectorAll(".picSurround img:not(.kal)"); var url = ''; for (var i = 0; i < tags.length; i++) { var regexDimensions = /\/r\/\d*x\d*/g; if (tags[i].hasAttribute("data-src")) { url = tags[i].getAttribute("data-src"); } else { url = tags[i].getAttribute("src"); } if (regexDimensions.test(url) || /voiceactors.*v.jpg$/g.test(url) || url.indexOf('questionmark') !== -1) { url = utils.handleMalImages(url); if (!(url.indexOf("100x140") > -1)) { tags[i].setAttribute("data-src", url); url = url.replace(/v.jpg$/g, '.jpg'); tags[i].setAttribute("data-srcset", url.replace(regexDimensions, '')); tags[i].classList.add('lazyload'); } tags[i].classList.add('kal'); } else { tags[i].closest(".picSurround").classList.add('noKal'); tags[i].classList.add('kal'); tags[i].classList.add('noKal'); } } } } bookmarksHDimages() { var tags = document.querySelectorAll('img[src*="/96x136/"]'); for (var i = 0; i < tags.length; i++) { var regexDimensions = /\/r\/\d*x\d*/g; var url = tags[i].getAttribute("src"); tags[i].setAttribute("src", url.replace(regexDimensions, '')); } } setEpPrediction() { con.log('setEpPrediction'); utils.epPredictionUI(this.id, this.type, function (prediction) { con.log(prediction); $('.mal-sync-pre-remove, .mal-sync-ep-pre').remove(); $('#addtolist').prev().before('<div class="mal-sync-pre-remove">' + prediction.text + '</div>'); $('[id="curEps"], [id="totalChaps"]').before(prediction.tag + ' '); }); } malToKiss() { return __awaiter(this, void 0, void 0, function* () { con.log('malToKiss'); utils.getMalToKissArray(this.type, this.id).then((links) => { var html = ''; for (var pageKey in links) { var page = links[pageKey]; var tempHtml = ''; var tempUrl = ''; for (var streamKey in page) { var stream = page[streamKey]; tempHtml += '<div class="mal_links"><a target="_blank" href="' + stream['url'] + '">' + stream['title'] + '</a></div>'; tempUrl = stream['url']; } html += '<h2 id="' + pageKey + 'Links" class="mal_links"><img src="' + utils.favicon(tempUrl.split('/')[2]) + '"> ' + pageKey + '<span title="' + pageKey + '" class="remove-mal-sync" style="float: right; font-weight: 100; line-height: 2; cursor: pointer; color: grey;">x</span></h2>'; html += tempHtml; html += '<br class="mal_links" />'; } $(document).ready(function () { $('h2:contains("Information")').before(html); $('.remove-mal-sync').click(function () { var key = $(this).attr('title'); api.settings.set(key, false); location.reload(); }); }); }); }); } siteSearch() { var This = this; $(document).ready(function () { con.log('Site Search'); $('h2:contains("Information")').before('<h2 id="mal-sync-search-links" class="mal_links">Search</h2><div class="MALSync-search"><a>[Show]</a></div><br class="mal_links" />'); api.storage.addStyle('#AniList.mal_links img{background-color: #898989;}'); $('#mal-sync-search-links, .MALSync-search').one('click', () => { $('.MALSync-search').remove(); var title = $('#contentWrapper > div:first-child span').text(); var titleEncoded = encodeURI(title); var html = ''; var imgStyle = 'position: relative; top: 4px;'; for (var key in _pages_pages__WEBPACK_IMPORTED_MODULE_0__[/* pageSearch */ "a"]) { var page = _pages_pages__WEBPACK_IMPORTED_MODULE_0__[/* pageSearch */ "a"][key]; if (page.type !== This.type) continue; var linkContent = `<img style="${imgStyle}" src="${utils.favicon(page.domain)}"> ${page.name}`; if (typeof page.completeSearchTag === 'undefined') { var link = `<a target="_blank" href="${page.searchUrl(titleEncoded)}"> ${linkContent} </a>`; } else { var link = page.completeSearchTag(title, linkContent); } var googleSeach = ''; if (typeof page.googleSearchDomain !== 'undefined') { googleSeach = `<a target="_blank" href="https://www.google.com/search?q=${titleEncoded}+site:${page.googleSearchDomain}"> <img style="${imgStyle}" src="${utils.favicon('google.com')}"> </a>`; } html += `<div class="mal_links" id="${key}" style="padding: 1px 0;"> ${link} ${googleSeach} </div>`; } $('#mal-sync-search-links').after(html); }); }); } streamingUI() { return __awaiter(this, void 0, void 0, function* () { con.log('Streaming UI'); var malObj = new _provider_MyAnimeList_entryClass__WEBPACK_IMPORTED_MODULE_1__[/* entryClass */ "a"](this.url); yield malObj.init(); var streamUrl = malObj.getStreamingUrl(); if (typeof streamUrl !== 'undefined') { $(document).ready(function () { return __awaiter(this, void 0, void 0, function* () { $('.h1 span').first().after(` <div class="data title progress" id="mal-sync-stream-div" style="display: inline-block; position: relative; top: 2px;"> <a class="mal-sync-stream" title="${streamUrl.split('/')[2]}" target="_blank" style="margin: 0 0;" href="${streamUrl}"> <img src="${utils.favicon(streamUrl.split('/')[2])}"> </a> </div>`); var resumeUrlObj = yield malObj.getResumeWaching(); var continueUrlObj = yield malObj.getContinueWaching(); con.log('Resume', resumeUrlObj, 'Continue', continueUrlObj); if (typeof continueUrlObj !== 'undefined' && continueUrlObj.ep === (malObj.getEpisode() + 1)) { $('#mal-sync-stream-div').append(`<a class="nextStream" title="Continue watching" target="_blank" style="margin: 0 5px 0 0; color: #BABABA;" href="${continueUrlObj.url}"> <img src="${api.storage.assetUrl('double-arrow-16px.png')}" width="16" height="16"> </a>`); } else if (typeof resumeUrlObj !== 'undefined' && resumeUrlObj.ep === malObj.getEpisode()) { $('#mal-sync-stream-div').append(`<a class="resumeStream" title="Resume watching" target="_blank" style="margin: 0 5px 0 0; color: #BABABA;" href="${resumeUrlObj.url}"> <img src="${api.storage.assetUrl('arrow-16px.png')}" width="16" height="16"> </a>`); } }); }); } }); } bookmarks() { con.log('Bookmarks [' + this.username + '][' + this.page + ']'); var This = this; if (this.page == 'modern') { var book = { bookReady: function (callback) { utils.waitUntilTrue(function () { return $('#loading-spinner').css('display') == 'none'; }, function () { callback(Object(_provider_MyAnimeList_userList__WEBPACK_IMPORTED_MODULE_2__[/* prepareData */ "a"])($.parseJSON($('.list-table').attr('data-items')), This.type)); }); }, getElement: function (malUrl) { return $('.list-item a[href^="' + malUrl + '"]').parent().parent('.list-table-data'); }, streamingSelector: '.data.title .link', cleanTags: function () { $('.tags span a').each(function (index) { if (typeof utils.getUrlFromTags($(this).text()) !== 'undefined') { $(this).parent().remove(); } }); }, predictionPos(element, tag) { element.find('.data.progress span, .data.chapter span').first().after(tag); }, }; } else if (this.page == 'classic') { var book = { bookReady: function (callback) { var tType = "anime"; if (This.type !== null) { tType = This.type; } Object(_provider_MyAnimeList_userList__WEBPACK_IMPORTED_MODULE_2__[/* userList */ "b"])(7, tType, { fullListCallback: function (list) { callback(list); } }, This.username); }, getElement: function (malUrl) { return $('a[href^="' + malUrl + '"]'); }, streamingSelector: 'span', cleanTags: function () { $('span[id^="tagLinks"] a').each(function (index) { if (typeof utils.getUrlFromTags($(this).text()) !== 'undefined') { $(this).remove(); } }); }, predictionPos(element, tag) { element.parent().parent().find('span[id^="epText"] a span, span[id^="chap"]').first().after(tag); }, }; } else { con.error('Bookmark type unknown'); return; } book.bookReady(function (data) { This.bookmarksHDimages(); $.each(data, function (index, el) { return __awaiter(this, void 0, void 0, function* () { var streamUrl = utils.getUrlFromTags(el.tags); var malUrl = el.url.replace('https://myanimelist.net', ''); con.log(malUrl); var id = el.id; var type = el.type; if (typeof streamUrl !== 'undefined') { var element = book.getElement(malUrl); element.find(book.streamingSelector).after(` <a class="mal-sync-stream" title="${streamUrl.split('/')[2]}" target="_blank" style="margin: 0 0;" href="${streamUrl}"> <img src="${utils.favicon(streamUrl.split('/')[2])}"> </a>`); var resumeUrlObj = yield utils.getResumeWaching(type, id); var continueUrlObj = yield utils.getContinueWaching(type, id); var curEp = parseInt(el.watchedEp); con.log('Resume', resumeUrlObj, 'Continue', continueUrlObj); if (typeof continueUrlObj !== 'undefined' && continueUrlObj.ep === (curEp + 1)) { element.find('.mal-sync-stream').after(`<a class="nextStream" title="Continue watching" target="_blank" style="margin: 0 5px 0 0; color: #BABABA;" href="${continueUrlObj.url}"> <img src="${api.storage.assetUrl('double-arrow-16px.png')}" width="16" height="16"> </a>`); } else if (typeof resumeUrlObj !== 'undefined' && resumeUrlObj.ep === curEp) { element.find('.mal-sync-stream').after(`<a class="resumeStream" title="Resume watching" target="_blank" style="margin: 0 5px 0 0; color: #BABABA;" href="${resumeUrlObj.url}"> <img src="${api.storage.assetUrl('arrow-16px.png')}" width="16" height="16"> </a>`); } } utils.epPredictionUI(id, type, function (prediction) { var element = book.getElement(malUrl); book.predictionPos(element, prediction.tag); }); }); }); book.cleanTags(); }); } related() { $(document).ready(function () { $('.anime_detail_related_anime a').each(function () { var el = $(this); var url = utils.absoluteLink(el.attr('href'), 'https://myanimelist.net'); if (typeof url != 'undefined') { var malObj = new _provider_MyAnimeList_entryClass__WEBPACK_IMPORTED_MODULE_1__[/* entryClass */ "a"](url); malObj.init().then(() => { var tag = utils.statusTag(malObj.getStatus(), malObj.type, malObj.id); if (tag) { el.after(tag); } }); } }); }); } relatedTag() { $(document).ready(function () { $('a.button_edit').each(function () { var el = $(this); var href = $(this).attr('href'); var type = utils.urlPart(href, 4); var id = utils.urlPart(href, 5); var state = el.attr('title'); if (typeof state != 'undefined' && state) { var tag = utils.statusTag(state, type, id); el.parent().parent().find('> a').after(tag); el.remove(); } }); }); } friendScore() { if (!api.settings.get('friendScore')) return; $(document).ready(function () { var position = $('h2:contains(Reviews)'); if (!position.length) return; var overview = $('#horiznav_nav li a').first(); if (!overview.is('#horiznav_nav li a.horiznav_active')) return; var url = overview.attr('href'); if (typeof url == 'undefined' || !url) return; url = utils.absoluteLink(url, 'https://myanimelist.net'); api.request.xhr('GET', url + '/stats').then((response) => { var friendHead = $('a[name=members]', $(response.responseText).children()); if (!friendHead) return; var friendBody = friendHead.nextAll(); if (friendBody.length > 1 && friendBody.find('a:contains("All Members")').length) { position.before(friendHead).before(friendBody).before('<br>'); $('a:contains("All Members")').after(' | <span id="mal-sync-removeFriends" title="remove" style="cursor: pointer; color: #1d439b;">X</span>'); $('#mal-sync-removeFriends').click(function () { api.settings.set('friendScore', false); location.reload(); }); } }); }); } } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(2), __webpack_require__(1), __webpack_require__(0))) /***/ }), /* 31 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(utils, con, api) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return anilistClass; }); /* harmony import */ var _provider_AniList_helper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); /* harmony import */ var _provider_AniList_entryClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(10); /* harmony import */ var _provider_AniList_userList__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(11); var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; class anilistClass { constructor(url) { this.url = url; this.page = null; utils.changeDetect(() => { this.url = window.location.href; this.init(); }, function () { return $('meta[property="og:url"]').attr('content'); }); } init() { if (this.url.indexOf("access_token=") > -1) { this.authentication(); } var urlpart = utils.urlPart(this.url, 3); if (urlpart == 'anime' || urlpart == 'manga') { this.page = { page: "detail", id: utils.urlPart(this.url, 4), malid: NaN, type: urlpart }; this.streamingUI(); _provider_AniList_helper__WEBPACK_IMPORTED_MODULE_0__[/* aniListToMal */ "b"](this.page.id, this.page.type).then((malid) => { this.page.malid = malid; con.log('page', this.page); this.malToKiss(); }); } var urlpart4 = utils.urlPart(this.url, 5); if (urlpart4 == 'animelist' || urlpart4 == 'mangalist') { this.page = { page: "bookmarks", type: urlpart4.substring(0, 5) }; this.bookmarks(); } } authentication() { var tokens = /access_token=[^&]+/gi.exec(this.url); if (tokens != null && typeof tokens[0] != 'undefined' && tokens[0]) { var token = tokens[0].toString().replace(/access_token=/gi, ''); con.log('Token Found', token); api.settings.set('anilistToken', token).then(() => { $(document).ready(function () { $('.page-content .container').html(` <div style="text-align: center; margin-top: 50px; background-color: white; border: 1px solid lightgrey; padding: 10px;"> <h1>MAL-Sync</h1> <br> Token saved you can close this page now </div> `); }); }); } } malToKiss() { con.log('malToKiss'); $('.mal_links').remove(); utils.getMalToKissArray(this.page.type, this.page.malid).then((links) => { var html = ''; for (var pageKey in links) { var page = links[pageKey]; var tempHtml = ''; var tempUrl = ''; for (var streamKey in page) { var stream = page[streamKey]; tempHtml += ` <div class="mal_links" style="margin-top: 5px;"> <a target="_blank" href="${stream['url']}"> ${stream['title']} </a> </div>`; tempUrl = stream['url']; } html += ` <div id="${pageKey}Links" class="mal_links" style=" background: rgb(var(--color-foreground)); border-radius: 3px; display: block; padding: 8px 12px; width: 100%; margin-bottom: 16px; font-size: 1.2rem; "> <img src="${utils.favicon(tempUrl.split('/')[2])}"> <span style="font-weight: 500; line-height: 16px; vertical-align: middle;">${pageKey}</span> <span title="${pageKey}" class="remove-mal-sync" style="float: right; cursor: pointer;">x</span> ${tempHtml} </div>`; } $(document).ready(function () { $('.sidebar .data').before(html); $('.remove-mal-sync').click(function () { var key = $(this).attr('title'); api.settings.set(key, false); location.reload(); }); }); }); } streamingUI() { return __awaiter(this, void 0, void 0, function* () { con.log('Streaming UI'); $('#mal-sync-stream-div').remove(); var malObj = new _provider_AniList_entryClass__WEBPACK_IMPORTED_MODULE_1__[/* entryClass */ "a"](this.url); yield malObj.init(); var streamUrl = malObj.getStreamingUrl(); if (typeof streamUrl !== 'undefined') { $(document).ready(function () { return __awaiter(this, void 0, void 0, function* () { $('h1').first().append(` <div class="data title progress" id="mal-sync-stream-div" style="margin-top: -2px; display: inline-block; position: relative; top: 2px;"> <a class="mal-sync-stream" title="${streamUrl.split('/')[2]}" target="_blank" style="margin: 0 0;" href="${streamUrl}"> <img src="${utils.favicon(streamUrl.split('/')[2])}"> </a> </div>`); var resumeUrlObj = yield malObj.getResumeWaching(); var continueUrlObj = yield malObj.getContinueWaching(); con.log('Resume', resumeUrlObj, 'Continue', continueUrlObj); if (typeof continueUrlObj !== 'undefined' && continueUrlObj.ep === (malObj.getEpisode() + 1)) { $('#mal-sync-stream-div').append(`<a class="nextStream" title="Continue watching" target="_blank" style="margin: 0 5px 0 0; color: #BABABA;" href="${continueUrlObj.url}"> <img src="${api.storage.assetUrl('double-arrow-16px.png')}" width="16" height="16"> </a>`); } else if (typeof resumeUrlObj !== 'undefined' && resumeUrlObj.ep === malObj.getEpisode()) { $('#mal-sync-stream-div').append(`<a class="resumeStream" title="Resume watching" target="_blank" style="margin: 0 5px 0 0; color: #BABABA;" href="${resumeUrlObj.url}"> <img src="${api.storage.assetUrl('arrow-16px.png')}" width="16" height="16"> </a>`); } }); }); } }); } bookmarks() { $(document).ready(() => { $('.mal-rem, .mal-sync-ep-pre').remove(); $('.list-entries .entry, .list-entries .entry-card').each((index, el) => { var streamUrl = utils.getUrlFromTags($(el).find('.notes').first().attr('label')); if (typeof streamUrl !== 'undefined') { con.log(streamUrl); $(el).find('.title a').first().after(` <a class="mal-sync-stream mal-rem" title="${streamUrl.split('/')[2]}" target="_blank" style="margin: 0 0; max-height: 14px;" href="${streamUrl}"> <img src="${utils.favicon(streamUrl.split('/')[2])}"> </a>`); } }); Object(_provider_AniList_userList__WEBPACK_IMPORTED_MODULE_2__[/* userList */ "a"])(1, this.page.type, { anilist: true, fullListCallback: (list) => { con.log(list); $.each(list, (index, en) => __awaiter(this, void 0, void 0, function* () { con.log('en', en); if (typeof en.malid !== 'undefined' && en.malid !== null && en.malid) { var element = $('a[href^="/' + this.page.type + '/' + en.id + '/"]').first().parent(); var resumeUrlObj = yield utils.getResumeWaching(this.page.type, en.malid); var continueUrlObj = yield utils.getContinueWaching(this.page.type, en.malid); var curEp = en.watchedEp; con.log('Resume', resumeUrlObj, 'Continue', continueUrlObj); if (typeof continueUrlObj !== 'undefined' && continueUrlObj.ep === (curEp + 1)) { element.prepend(`<a class="nextStream mal-rem" title="Continue watching" target="_blank" style="margin: -2px 5px 0 0; color: #BABABA;" href="${continueUrlObj.url}"> <img src="${api.storage.assetUrl('double-arrow-16px.png')}" width="16" height="16"> </a>`); } else if (typeof resumeUrlObj !== 'undefined' && resumeUrlObj.ep === curEp) { element.prepend(`<a class="resumeStream mal-rem" title="Resume watching" target="_blank" style="margin: -2px 5px 0 0; color: #BABABA;" href="${resumeUrlObj.url}"> <img src="${api.storage.assetUrl('arrow-16px.png')}" width="16" height="16"> </a>`); } utils.epPredictionUI(en.malid, this.page.type, (prediction) => { element.parent().find('.progress').append(prediction.tag); }); } })); } }); }); } } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(2), __webpack_require__(1), __webpack_require__(0))) /***/ }), /* 32 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(api, con) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return scheduleUpdate; }); var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; function scheduleUpdate() { return __awaiter(this, void 0, void 0, function* () { var url = 'https://myanimelist.net/anime/season/schedule'; return api.request.xhr('GET', url).then((response) => __awaiter(this, void 0, void 0, function* () { console.groupCollapsed('Schedule'); con.log('Recived'); var found = 0; var parsed = $.parseHTML(response.responseText); var se = '.js-seasonal-anime-list-key-'; se = se + 'monday, ' + se + 'tuesday ,' + se + 'wednesday ,' + se + 'thursday ,' + se + 'friday ,' + se + 'saturday ,' + se + 'sunday'; var seasons = $(parsed).find(se).find('.seasonal-anime'); if (seasons.length) yield clearScheduleCache(); seasons.each(function () { if ($(this).find('.info .remain-time').text().match(/\w+\ \d+.\ \d+,\ \d+:\d+\ \(JST\)/i)) { var malId = $(this).find('a.link-title').attr('href').split('/')[4]; var jpdate = $(this).find('.info .remain-time').text().trim(); //day var day = jpdate.split(' ')[1].replace(',', '').trim(); //month var month = jpdate.split(' ')[0].trim(); //@ts-ignore month = ("JanFebMarAprMayJunJulAugSepOctNovDec".indexOf(month) / 3 + 1); //year var year = jpdate.split(' ')[2].replace(',', '').trim(); //time var time = jpdate.split(' ')[3].trim(); var minute = time.split(':')[1]; var hour = time.split(':')[0]; //timezone var timestamp = toTimestamp(year, month, day, hour, minute, 0); con.log(malId, timestamp); api.storage.set('mal/' + malId + '/release', timestamp); var episode = $(this).find('.eps a span').last().text(); if (episode.match(/^\d+/)) { api.storage.set('mal/' + malId + '/eps', parseInt(episode.match(/^\d+/)[0])); } } found++; }); con.log('Schedule updated (' + found + ')'); console.groupEnd(); })); function toTimestamp(year, month, day, hour, minute, second) { var datum = new Date(Date.UTC(year, month - 1, day, hour, minute, second)); return (datum.getTime()) - 32400000; //for GMT } function clearScheduleCache() { return __awaiter(this, void 0, void 0, function* () { var cacheArray = yield api.storage.list(); var deleted = 0; $.each(cacheArray, function (index, cache) { //@ts-ignore if (/^mal\/[^/]+\/(release|eps)$/.test(index)) { api.storage.remove(index); deleted++; } }); con.log("Cache Cleared [" + deleted + "]"); }); } }); } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(0), __webpack_require__(1))) /***/ }), /* 33 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(api, j, con, utils) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return firebaseNotification; }); var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; function firebaseNotification() { return __awaiter(this, void 0, void 0, function* () { var schedule = yield api.storage.get('timestampUpdate/firebaseNotification'); if (typeof schedule === 'undefined' || (j.$.now() - schedule) > 10 * 60 * 1000) { checkNotifications(); api.storage.set('timestampUpdate/firebaseNotification', j.$.now()); } }); } function checkNotifications() { con.log('checkNotifications'); var url = 'https://kissanimelist.firebaseio.com/Data2/Notification/Current.json'; api.request.xhr('GET', url).then((response) => __awaiter(this, void 0, void 0, function* () { var current = parseInt(JSON.parse(response.responseText)); if (!isNaN(current)) { con.log("Current Notification", current); var last = parseInt(yield api.storage.get('firebaseNotification')); var next = last + 1; if (typeof last == undefined || isNaN(last)) { api.storage.set('firebaseNotification', current); return; } if (current >= next) { var notificationUrl = 'https://kissanimelist.firebaseio.com/Data2/Notification/list/N' + next + '.json'; api.request.xhr('GET', notificationUrl).then((response) => __awaiter(this, void 0, void 0, function* () { var message = JSON.parse(response.responseText); if (message != 'null' && message != null) { j.$(document).ready(function () { var flashm = utils.flashm('<div style="text-align: left;">' + message + '</div><button class="okChangelog" style="background-color: transparent; border: none; color: rgb(255,64,129);margin-top: 10px;cursor: pointer;">Close</button>', { permanent: true, position: "top" }); flashm.find('.okChangelog').click(function () { flashm.remove(); api.storage.set('firebaseNotification', next).then(function () { checkNotifications(); }); }); }); } else { con.info('Notification empty', response.responseText); api.storage.set('firebaseNotification', next).then(function () { checkNotifications(); }); } })); } else { con.log('No new notifications'); } } else { con.error('Could not read current Notification number'); } })); } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(0), __webpack_require__(3), __webpack_require__(1), __webpack_require__(2))) /***/ }), /* 34 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* WEBPACK VAR INJECTION */(function(api, j) {/* harmony import */ var _pages_syncPage__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(14); /* harmony import */ var _myanimelist_myanimelistClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(30); /* harmony import */ var _anilist_anilistClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(31); /* harmony import */ var _utils_scheduler__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(32); /* harmony import */ var _utils_firebaseNotification__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(33); var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; function main() { if (window.location.href.indexOf("myanimelist.net") > -1) { var mal = new _myanimelist_myanimelistClass__WEBPACK_IMPORTED_MODULE_1__[/* myanimelistClass */ "a"](window.location.href); mal.init(); } else if (window.location.href.indexOf("anilist.co") > -1) { var anilist = new _anilist_anilistClass__WEBPACK_IMPORTED_MODULE_2__[/* anilistClass */ "a"](window.location.href); anilist.init(); } else { var page = new _pages_syncPage__WEBPACK_IMPORTED_MODULE_0__[/* syncPage */ "a"](window.location.href); page.init(); } Object(_utils_firebaseNotification__WEBPACK_IMPORTED_MODULE_4__[/* firebaseNotification */ "a"])(); } var css = "font-size: 40px; padding-bottom: 3px; color: white; text-shadow: -1px -1px #2e51a2, 1px -1px #2e51a2, -1px 1px #2e51a2, 1px 1px #2e51a2, 2px 2px #2e51a2, 3px 3px #2e51a2;"; console.log("%cMAL-Sync", css, "Version: " + api.storage.version()); api.settings.init() .then(() => { main(); scheduler(); }); function scheduler() { return __awaiter(this, void 0, void 0, function* () { var schedule = yield api.storage.get('timestampUpdate/release'); if (typeof schedule === 'undefined' || (j.$.now() - schedule) > 345600000) { yield Object(_utils_scheduler__WEBPACK_IMPORTED_MODULE_3__[/* scheduleUpdate */ "a"])(); api.storage.set('timestampUpdate/release', j.$.now()); } }); } //temp /*con.log('log'); con.error('error'); con.info('info'); con.log(utils.urlPart('http://greasyfork.icu/de/scripts/27564-kissanimelist/code', 5)); api.storage.set('test', 'test123').then(() => { return api.storage.get('test'); }).then((value) => { con.log(value); }); api.request.xhr('GET', 'https://myanimelist.net/').then((response) => { con.log(response); }); const style = require('./style.less').toString(); api.storage.addStyle(style); $(document).ready(function(){ utils.flashm('test'); utils.flashm('test', {type: "test", error: true}); utils.flashm('permanent', {type: "permanent", permanent: true, position: "top"}); utils.flashm('permanent hover', {hoverInfo: true}); setTimeout(function(){ utils.flashm('test'); utils.flashm('test', {type: "test", error: true}); utils.flashm('test', {type: "test", error: true}); utils.flashm('test', {type: "test", error: true, position: "top"}); utils.flashm('test', {type: "test", error: true, position: "top"}); utils.flashm('permanent2', {type: "permanent", permanent: true}); utils.flashConfirm('Add?', 'add', function(){alert('yes')}, function(){alert('no')}); }, 3000) utils.flashConfirm('Add?', 'add', function(){alert('yes')}, function(){alert('no')}); });*/ /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(0), __webpack_require__(3))) /***/ }), /* 35 */ /***/ (function(module, exports, __webpack_require__) { var result = __webpack_require__(36); if (typeof result === "string") { module.exports = result; } else { module.exports = result.toString(); } /***/ }), /* 36 */ /***/ (function(module, exports, __webpack_require__) { exports = module.exports = __webpack_require__(5)(false); // imports // module exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha,\n#AddMal {\n color: #d5f406;\n}\n.mal-sync-active {\n background-color: #002966;\n}\n#malp select option {\n background-color: #111111;\n}\n#malp #malStatus,\n#malp #malUserRating,\n#malp #malEpisodes,\n#malp #malVolumes,\n#malp #malEpisodes {\n font-size: inherit;\n font-family: inherit;\n background: transparent;\n border-width: 1px;\n border-color: grey;\n text-decoration: none;\n outline: medium none;\n border-width: 0px;\n height: auto;\n padding: 0;\n margin: 0;\n line-height: 1;\n}\n#malp #malEpisodes,\n#malp #malVolumes,\n#malp #malEpisodes {\n text-align: center;\n border-bottom-width: 1px;\n}\n#malp #malEpisodes:focus,\n#malp #malVolumes:focus,\n#malp #malEpisodes:focus {\n border-color: #d5f406;\n}\n#footer {\n z-index: 2;\n}\n#malp #malStatus,\n#malp #malUserRating,\n#malp #malEpisodes,\n#malp #malVolumes,\n#malp #malEpisodes {\n height: auto !important;\n}\n", ""]); // exports /***/ }), /* 37 */ /***/ (function(module, exports, __webpack_require__) { var result = __webpack_require__(38); if (typeof result === "string") { module.exports = result; } else { module.exports = result.toString(); } /***/ }), /* 38 */ /***/ (function(module, exports, __webpack_require__) { exports = module.exports = __webpack_require__(5)(false); // imports // module exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha,\n#AddMal {\n color: #72cefe;\n}\n.mal-sync-active {\n background-color: #002966;\n}\n#malp select option {\n background-color: #111111;\n}\n#malp #malStatus,\n#malp #malUserRating,\n#malp #malEpisodes,\n#malp #malVolumes,\n#malp #malEpisodes {\n font-size: inherit;\n font-family: inherit;\n background: transparent;\n border-width: 1px;\n border-color: grey;\n text-decoration: none;\n outline: medium none;\n border-width: 0px;\n height: auto;\n padding: 0;\n margin: 0;\n line-height: 1;\n}\n#malp #malEpisodes,\n#malp #malVolumes,\n#malp #malEpisodes {\n text-align: center;\n border-bottom-width: 1px;\n}\n#malp #malEpisodes:focus,\n#malp #malVolumes:focus,\n#malp #malEpisodes:focus {\n border-color: #72cefe;\n}\n#footer {\n z-index: 2;\n}\n", ""]); // exports /***/ }), /* 39 */ /***/ (function(module, exports, __webpack_require__) { var result = __webpack_require__(40); if (typeof result === "string") { module.exports = result; } else { module.exports = result.toString(); } /***/ }), /* 40 */ /***/ (function(module, exports, __webpack_require__) { exports = module.exports = __webpack_require__(5)(false); // imports // module exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha,\n#AddMal {\n color: #694ba1;\n}\n.mal-sync-active {\n background-color: #002966;\n}\n#malp select option {\n background-color: #111111;\n}\n#malp #malStatus,\n#malp #malUserRating,\n#malp #malEpisodes,\n#malp #malVolumes,\n#malp #malEpisodes {\n font-size: inherit;\n font-family: inherit;\n background: transparent;\n border-width: 1px;\n border-color: grey;\n text-decoration: none;\n outline: medium none;\n border-width: 0px;\n height: auto;\n padding: 0;\n margin: 0;\n line-height: 1;\n}\n#malp #malEpisodes,\n#malp #malVolumes,\n#malp #malEpisodes {\n text-align: center;\n border-bottom-width: 1px;\n}\n#malp #malEpisodes:focus,\n#malp #malVolumes:focus,\n#malp #malEpisodes:focus {\n border-color: #694ba1;\n}\nbody.dark #MalData select option {\n background-color: #1c1b26 !important;\n}\n#malp {\n margin: 0;\n}\n", ""]); // exports /***/ }), /* 41 */ /***/ (function(module, exports, __webpack_require__) { var result = __webpack_require__(42); if (typeof result === "string") { module.exports = result; } else { module.exports = result.toString(); } /***/ }), /* 42 */ /***/ (function(module, exports, __webpack_require__) { exports = module.exports = __webpack_require__(5)(false); // imports // module exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha,\n#AddMal {\n color: white;\n}\n.mal-sync-active {\n background-color: #b2d1ff !important;\n}\n#malp select option {\n background-color: #111111;\n}\n#malp #malStatus,\n#malp #malUserRating,\n#malp #malEpisodes,\n#malp #malVolumes,\n#malp #malEpisodes {\n font-size: inherit;\n font-family: inherit;\n background: transparent;\n border-width: 1px;\n border-color: grey;\n text-decoration: none;\n outline: medium none;\n border-width: 0px;\n height: auto;\n padding: 0;\n margin: 0;\n line-height: 1;\n}\n#malp #malEpisodes,\n#malp #malVolumes,\n#malp #malEpisodes {\n text-align: center;\n border-bottom-width: 1px;\n}\n#malp #malEpisodes:focus,\n#malp #malVolumes:focus,\n#malp #malEpisodes:focus {\n border-color: white;\n}\n#malp {\n background-color: #555;\n padding: 10px 7px 5px 7px;\n}\n#malp span {\n color: white;\n}\n#malp select > * {\n background-color: #555 !important;\n}\n", ""]); // exports /***/ }), /* 43 */ /***/ (function(module, exports, __webpack_require__) { var result = __webpack_require__(44); if (typeof result === "string") { module.exports = result; } else { module.exports = result.toString(); } /***/ }), /* 44 */ /***/ (function(module, exports, __webpack_require__) { exports = module.exports = __webpack_require__(5)(false); // imports // module exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha,\n#AddMal {\n color: white;\n}\n.mal-sync-active {\n background-color: #002966;\n}\n#malp select option {\n background-color: #111111;\n}\n#malp #malStatus,\n#malp #malUserRating,\n#malp #malEpisodes,\n#malp #malVolumes,\n#malp #malEpisodes {\n font-size: inherit;\n font-family: inherit;\n background: transparent;\n border-width: 1px;\n border-color: grey;\n text-decoration: none;\n outline: medium none;\n border-width: 0px;\n height: auto;\n padding: 0;\n margin: 0;\n line-height: 1;\n}\n#malp #malEpisodes,\n#malp #malVolumes,\n#malp #malEpisodes {\n text-align: center;\n border-bottom-width: 1px;\n}\n#malp #malEpisodes:focus,\n#malp #malVolumes:focus,\n#malp #malEpisodes:focus {\n border-color: white;\n}\n", ""]); // exports /***/ }), /* 45 */ /***/ (function(module, exports, __webpack_require__) { var result = __webpack_require__(46); if (typeof result === "string") { module.exports = result; } else { module.exports = result.toString(); } /***/ }), /* 46 */ /***/ (function(module, exports, __webpack_require__) { exports = module.exports = __webpack_require__(5)(false); // imports // module exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha,\n#AddMal {\n color: inherit;\n}\n.mal-sync-active {\n background-color: #cee1ff;\n}\n#malp select option {\n background-color: #111111;\n}\n#malp #malStatus,\n#malp #malUserRating,\n#malp #malEpisodes,\n#malp #malVolumes,\n#malp #malEpisodes {\n font-size: inherit;\n font-family: inherit;\n background: transparent;\n border-width: 1px;\n border-color: grey;\n text-decoration: none;\n outline: medium none;\n border-width: 0px;\n height: auto;\n padding: 0;\n margin: 0;\n line-height: 1;\n}\n#malp #malEpisodes,\n#malp #malVolumes,\n#malp #malEpisodes {\n text-align: center;\n border-bottom-width: 1px;\n}\n#malp #malEpisodes:focus,\n#malp #malVolumes:focus,\n#malp #malEpisodes:focus {\n border-color: inherit;\n}\n#malp {\n margin: 0;\n}\n#malp span {\n color: inherit;\n}\n#malp select > * {\n background-color: white !important;\n}\n@media only screen and (max-width: 1440px) {\n #malp .MalLogin {\n width: 100%;\n }\n}\n", ""]); // exports /***/ }), /* 47 */ /***/ (function(module, exports, __webpack_require__) { var result = __webpack_require__(48); if (typeof result === "string") { module.exports = result; } else { module.exports = result.toString(); } /***/ }), /* 48 */ /***/ (function(module, exports, __webpack_require__) { exports = module.exports = __webpack_require__(5)(false); // imports // module exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha,\n#AddMal {\n color: black;\n}\n.mal-sync-active {\n background-color: #cee1ff !important;\n}\n#malp select option {\n background-color: #111111;\n}\n#malp #malStatus,\n#malp #malUserRating,\n#malp #malEpisodes,\n#malp #malVolumes,\n#malp #malEpisodes {\n font-size: inherit;\n font-family: inherit;\n background: transparent;\n border-width: 1px;\n border-color: grey;\n text-decoration: none;\n outline: medium none;\n border-width: 0px;\n height: auto;\n padding: 0;\n margin: 0;\n line-height: 1;\n}\n#malp #malEpisodes,\n#malp #malVolumes,\n#malp #malEpisodes {\n text-align: center;\n border-bottom-width: 1px;\n}\n#malp #malEpisodes:focus,\n#malp #malVolumes:focus,\n#malp #malEpisodes:focus {\n border-color: black;\n}\n#malp {\n background-color: #fff;\n padding: 20px;\n border-radius: 2px;\n -webkit-box-shadow: 0 1px 5px 0 rgba(0, 0, 0, 0.2), 0 3px 4px 0 rgba(0, 0, 0, 0.12), 0 2px 4px 0 rgba(0, 0, 0, 0.14);\n box-shadow: 0 1px 5px 0 rgba(0, 0, 0, 0.2), 0 3px 4px 0 rgba(0, 0, 0, 0.12), 0 2px 4px 0 rgba(0, 0, 0, 0.14);\n margin-bottom: 20px;\n position: relative;\n}\n#malp span {\n color: black;\n}\n#malp select > * {\n background-color: white !important;\n}\n@media only screen and (max-width: 1320px) {\n #malp .MalLogin {\n width: 100%;\n }\n}\n", ""]); // exports /***/ }), /* 49 */ /***/ (function(module, exports, __webpack_require__) { var result = __webpack_require__(50); if (typeof result === "string") { module.exports = result; } else { module.exports = result.toString(); } /***/ }), /* 50 */ /***/ (function(module, exports, __webpack_require__) { exports = module.exports = __webpack_require__(5)(false); // imports // module exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha,\n#AddMal {\n color: #ffc119;\n}\n.mal-sync-active {\n background-color: #002966 !important;\n}\n#malp select option {\n background-color: #111111;\n}\n#malp #malStatus,\n#malp #malUserRating,\n#malp #malEpisodes,\n#malp #malVolumes,\n#malp #malEpisodes {\n font-size: inherit;\n font-family: inherit;\n background: transparent;\n border-width: 1px;\n border-color: grey;\n text-decoration: none;\n outline: medium none;\n border-width: 0px;\n height: auto;\n padding: 0;\n margin: 0;\n line-height: 1;\n}\n#malp #malEpisodes,\n#malp #malVolumes,\n#malp #malEpisodes {\n text-align: center;\n border-bottom-width: 1px;\n}\n#malp #malEpisodes:focus,\n#malp #malVolumes:focus,\n#malp #malEpisodes:focus {\n border-color: #ffc119;\n}\n#malp * {\n font-size: 13px;\n}\n", ""]); // exports /***/ }), /* 51 */ /***/ (function(module, exports, __webpack_require__) { var result = __webpack_require__(52); if (typeof result === "string") { module.exports = result; } else { module.exports = result.toString(); } /***/ }), /* 52 */ /***/ (function(module, exports, __webpack_require__) { exports = module.exports = __webpack_require__(5)(false); // imports // module exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha,\n#AddMal {\n color: white;\n}\n.mal-sync-active {\n background-color: #002966;\n}\n#malp select option {\n background-color: #111111;\n}\n#malp #malStatus,\n#malp #malUserRating,\n#malp #malEpisodes,\n#malp #malVolumes,\n#malp #malEpisodes {\n font-size: inherit;\n font-family: inherit;\n background: transparent;\n border-width: 1px;\n border-color: grey;\n text-decoration: none;\n outline: medium none;\n border-width: 0px;\n height: auto;\n padding: 0;\n margin: 0;\n line-height: 1;\n}\n#malp #malEpisodes,\n#malp #malVolumes,\n#malp #malEpisodes {\n text-align: center;\n border-bottom-width: 1px;\n}\n#malp #malEpisodes:focus,\n#malp #malVolumes:focus,\n#malp #malEpisodes:focus {\n border-color: white;\n}\n.mal-sync-active a {\n background-color: #72abff !important;\n}\n#flashinfo-div {\n z-index: 100 !important;\n}\n#malp #malVolumes,\n#malp #malEpisodes {\n float: none;\n display: inline-block;\n border-radius: 0;\n}\n", ""]); // exports /***/ }), /* 53 */ /***/ (function(module, exports, __webpack_require__) { var result = __webpack_require__(54); if (typeof result === "string") { module.exports = result; } else { module.exports = result.toString(); } /***/ }), /* 54 */ /***/ (function(module, exports, __webpack_require__) { exports = module.exports = __webpack_require__(5)(false); // imports // module exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha,\n#AddMal {\n color: white;\n}\n.mal-sync-active {\n background-color: #bbbbbb;\n}\n#malp select option {\n background-color: #111111;\n}\n#malp #malStatus,\n#malp #malUserRating,\n#malp #malEpisodes,\n#malp #malVolumes,\n#malp #malEpisodes {\n font-size: inherit;\n font-family: inherit;\n background: transparent;\n border-width: 1px;\n border-color: grey;\n text-decoration: none;\n outline: medium none;\n border-width: 0px;\n height: auto;\n padding: 0;\n margin: 0;\n line-height: 1;\n}\n#malp #malEpisodes,\n#malp #malVolumes,\n#malp #malEpisodes {\n text-align: center;\n border-bottom-width: 1px;\n}\n#malp #malEpisodes:focus,\n#malp #malVolumes:focus,\n#malp #malEpisodes:focus {\n border-color: white;\n}\n#malp {\n color: white;\n}\n#flash-div-top button,\n#flash-div-bottom button,\n#flashinfo-div button {\n background: none;\n box-shadow: none;\n -moz-box-shadow: none;\n -webkit-box-shadow: none;\n}\n#flash-div-top .undoButton,\n#flash-div-bottom .undoButton,\n#flashinfo-div .undoButton {\n margin-left: auto;\n margin-right: auto;\n}\n", ""]); // exports /***/ }), /* 55 */ /***/ (function(module, exports, __webpack_require__) { var result = __webpack_require__(56); if (typeof result === "string") { module.exports = result; } else { module.exports = result.toString(); } /***/ }), /* 56 */ /***/ (function(module, exports, __webpack_require__) { exports = module.exports = __webpack_require__(5)(false); // imports // module exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha,\n#AddMal {\n color: black;\n}\n.mal-sync-active {\n background-color: #0066ff;\n}\n#malp select option {\n background-color: #111111;\n}\n#malp #malStatus,\n#malp #malUserRating,\n#malp #malEpisodes,\n#malp #malVolumes,\n#malp #malEpisodes {\n font-size: inherit;\n font-family: inherit;\n background: transparent;\n border-width: 1px;\n border-color: grey;\n text-decoration: none;\n outline: medium none;\n border-width: 0px;\n height: auto;\n padding: 0;\n margin: 0;\n line-height: 1;\n}\n#malp #malEpisodes,\n#malp #malVolumes,\n#malp #malEpisodes {\n text-align: center;\n border-bottom-width: 1px;\n}\n#malp #malEpisodes:focus,\n#malp #malVolumes:focus,\n#malp #malEpisodes:focus {\n border-color: black;\n}\n", ""]); // exports /***/ }), /* 57 */ /***/ (function(module, exports, __webpack_require__) { var result = __webpack_require__(58); if (typeof result === "string") { module.exports = result; } else { module.exports = result.toString(); } /***/ }), /* 58 */ /***/ (function(module, exports, __webpack_require__) { exports = module.exports = __webpack_require__(5)(false); // imports // module exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha,\n#AddMal {\n color: white;\n}\n.mal-sync-active {\n background-color: #002966;\n}\n#malp select option {\n background-color: #111111;\n}\n#malp #malStatus,\n#malp #malUserRating,\n#malp #malEpisodes,\n#malp #malVolumes,\n#malp #malEpisodes {\n font-size: inherit;\n font-family: inherit;\n background: transparent;\n border-width: 1px;\n border-color: grey;\n text-decoration: none;\n outline: medium none;\n border-width: 0px;\n height: auto;\n padding: 0;\n margin: 0;\n line-height: 1;\n}\n#malp #malEpisodes,\n#malp #malVolumes,\n#malp #malEpisodes {\n text-align: center;\n border-bottom-width: 1px;\n}\n#malp #malEpisodes:focus,\n#malp #malVolumes:focus,\n#malp #malEpisodes:focus {\n border-color: white;\n}\n#malp {\n margin-top: 1rem;\n border-top: 0 solid hsla(0, 0%, 100%, 0.05);\n border-width: 1px 0;\n font-size: 14px;\n padding: 10px 5px 0;\n padding-top: 1rem;\n}\n#malp select {\n display: inline-block;\n width: auto;\n}\n#malp input {\n display: inline-block;\n}\n.my-float.open-info-popup {\n height: 100%;\n width: 100%;\n margin: 0 !important;\n}\n", ""]); // exports /***/ }), /* 59 */ /***/ (function(module, exports, __webpack_require__) { var result = __webpack_require__(60); if (typeof result === "string") { module.exports = result; } else { module.exports = result.toString(); } /***/ }), /* 60 */ /***/ (function(module, exports, __webpack_require__) { exports = module.exports = __webpack_require__(5)(false); // imports // module exports.push([module.i, "#material .mdl-card__supporting-text {\n width: initial;\n}\n.mdl-layout__header .mdl-textfield__label:after {\n background-color: red !important;\n}\n.alternative-list .mdl-list {\n max-width: 100%;\n margin: 0;\n padding: 0;\n}\n.alternative-list .mdl-list__item {\n height: auto;\n}\n.alternative-list .mdl-list__item-primary-content {\n height: auto !important;\n}\n.alternative-list .mdl-list__item-primary-content a {\n display: inline-block;\n}\n.alternative-list .mdl-list__item-text-body {\n height: auto !important;\n}\n.coverinfo .mdl-chip {\n height: auto;\n}\n.coverinfo .mdl-chip .mdl-chip__text {\n white-space: normal;\n line-height: 24px;\n}\n.mdl-layout__content::-webkit-scrollbar {\n width: 10px !important;\n background-color: #F5F5F5;\n}\n.mdl-layout__content::-webkit-scrollbar-thumb {\n background-color: #c1c1c1 !important;\n}\n.simplebar-track {\n width: 10px !important;\n background-color: #F5F5F5;\n}\n.simplebar-scrollbar {\n background-color: #c1c1c1 !important;\n}\n.simplebar-track.horizontal {\n display: none;\n}\n.simplebar-scrollbar {\n transition: height 100ms;\n border-radius: 0px !important;\n right: 0 !important;\n width: 100% !important;\n opacity: 1 !important;\n}\n.simplebar-scrollbar.visible:before {\n display: none;\n}\n.simplebar-content {\n margin-right: -7px !important;\n}\n.simplebar-track {\n margin-top: -2px;\n margin-bottom: -2px;\n}\na {\n text-decoration: none;\n}\n.mdl-layout__tab-panel a:hover {\n text-decoration: underline;\n}\n.mdl-cell {\n background-color: #fefefe;\n}\n#material.simple-header .mdl-layout__header .mdl-layout__tab-bar-container {\n display: none;\n}\n.newEp {\n position: absolute;\n background-color: #dedede;\n height: 25px;\n width: 29px;\n top: 3px;\n right: -4px;\n background-repeat: no-repeat;\n background-position: 4px 3px;\n background-image: url(https://github.com/google/material-design-icons/blob/master/social/1x_web/ic_notifications_none_black_18dp.png?raw=true);\n}\n.searchItem {\n text-decoration: none !important;\n color: black;\n}\n#material.settings-only .mdl-layout__header .mdl-layout__tab-bar-container,\n#material.pop-over .mdl-layout__header .mdl-layout__tab-bar-container {\n display: none;\n}\n#material.settings-only .mdl-layout__tab-panel,\n#material.pop-over .mdl-layout__tab-panel {\n display: none !important;\n}\n#material.settings-only #fixed-tab-5.mdl-layout__tab-panel {\n display: block !important;\n}\n#material.pop-over #fixed-tab-5.mdl-layout__tab-panel {\n display: none !important;\n}\n#material.pop-over #fixed-tab-4.mdl-layout__tab-panel {\n display: block !important;\n}\n#Mal-Sync-Popup #material-fullscreen {\n display: none !important;\n}\n#Mal-Sync-Popup .settings-only #book.open .bookIcon {\n display: none;\n}\n#Mal-Sync-Popup .settings-only #book.open .settingsIcon {\n display: block !important;\n}\n#material a.button_edit {\n text-decoration: none;\n background-color: #efefef;\n border-bottom: 1px solid #ebebeb;\n font-size: 10px;\n line-height: 1em;\n margin: 0;\n opacity: 1;\n padding: 2px 4px;\n -webkit-transition-duration: 0.3s;\n transition-duration: 0.3s;\n -webkit-transition-property: all;\n transition-property: all;\n -webkit-transition-timing-function: ease-in-out;\n transition-timing-function: ease-in-out;\n display: inline-block;\n font-family: Avenir, lucida grande, tahoma, verdana, arial, sans-serif;\n height: 9px;\n}\n#material a.button_edit.reading,\n#material a.button_edit.watching {\n background-color: #2db039;\n color: #fff;\n}\n#material a.button_edit.reading:hover,\n#material a.button_edit.watching:hover {\n opacity: 0.7;\n}\n#material a.button_edit.plantoread,\n#material a.button_edit.plantowatch {\n background-color: #c3c3c3;\n color: #fff;\n}\n#material a.button_edit.plantoread:hover,\n#material a.button_edit.plantowatch:hover {\n opacity: 0.7;\n}\n#material a.button_edit.completed {\n background-color: #26448f;\n color: #fff;\n}\n#material a.button_edit.completed:hover {\n opacity: 0.7;\n}\n#material a.button_edit.on-hold {\n background-color: #f1c83e;\n color: #fff;\n}\n#material a.button_edit.dropped {\n background-color: #a12f31;\n color: #fff;\n}\n#material a.button_edit.dropped:hover {\n opacity: 0.7;\n}\n#material #contributer {\n padding: 15px;\n padding-bottom: 0;\n}\n#material #contributer .group {\n display: none;\n text-transform: uppercase;\n font-size: 12px;\n padding: 5px 0px;\n font-weight: bold;\n color: #707070;\n opacity: 0;\n -webkit-transition: 1s;\n -o-transition: 1s;\n transition: 1s;\n}\n#material #contributer .user {\n height: 40px;\n display: inline-block;\n white-space: nowrap;\n overflow: hidden;\n}\n#material #contributer .user .image {\n position: relative;\n vertical-align: middle!important;\n display: inline-block;\n height: 32px;\n width: 32px;\n margin-right: 10px;\n border-radius: 50%;\n overflow: hidden;\n border: 1px solid #e0e0e0;\n}\n#material #contributer .user .image .gif {\n position: absolute;\n display: none;\n}\n#material #contributer .user .text {\n vertical-align: middle!important;\n display: none;\n line-height: 100%;\n}\n#material #contributer.open {\n padding-bottom: 15px;\n}\n#material #contributer.open .group {\n opacity: 1;\n display: block;\n}\n#material #contributer.open .user {\n display: block;\n}\n#material #contributer.open .user .image .gif {\n display: block;\n}\n#material #contributer.open .user .text {\n display: inline-block;\n}\n", ""]); // exports /***/ }) /******/ ]);