您需要先安装一个扩展,例如 篡改猴、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.2.8 // @author [email protected] // @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 *://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 *://*.gogoanime.tv/* // @match *://*.gogoanime.io/* // @match *://*.gogoanime.in/* // @match *://*.gogoanime.se/* // @match *://*.gogoanime.sh/* // @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 * // ==/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 = 22); /******/ }) /************************************************************************/ /******/ ([ /* 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__(7); // 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__(8); // 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; }); var storage = userscriptLegacy["a" /* userscriptLegacy */]; var request = requestUserscriptLegacy; var userscript_settings = settings["a" /* settingsObj */]; /***/ }), /* 1 */ /***/ (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; /***/ }), /* 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__, "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__, "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__, "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__, "epPrediction", function() { return epPrediction; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUserList", function() { return getUserList; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getMalUserName", function() { return getMalUserName; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "flashm", function() { return flashm; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "flashConfirm", function() { return flashConfirm; }); 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 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 'Volume'; return 'Episode'; } var syncRegex = /^(settings\/|resume\/|continue\/).*/; 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")) { 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 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 (/last::[\d\D]+::/.test(tags)) { return atobURL(tags.split("last::")[1].split("::")[0]); } if (/malSync::[\d\D]+::/.test(tags)) { return atobURL(tags.split("malSync::")[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* () { 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 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, callback) { return __awaiter(this, void 0, void 0, function* () { utils.epPrediction(malid, function (pre) { var UI = { tag: '', text: '', prediction: pre }; if (pre.airing) { UI.text = 'Next episode estimated in ' + pre.diffDays + 'd ' + pre.diffHours + 'h ' + pre.diffMinutes + 'm'; if (pre.episode) { UI.tag = '<span class="mal-sync-ep-pre" title="' + UI.text + '">[' + pre.episode + ']</span>'; } } else { 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 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 }); } } }); } //Status: 1 = watching | 2 = completed | 3 = onhold | 4 = dropped | 6 = plan to watch | 7 = all function getUserList(status = 1, localListType = 'anime', singleCallback = null, finishCallback = null, fullListCallback = null, continueCall = null, username = null, offset = 0, templist = []) { con.log('[UserList]', 'username: ' + username, 'status: ' + status, 'offset: ' + offset); if (username == null) { getMalUserName(function (usernameTemp) { if (usernameTemp == false) { flashm("Please log in on <a target='_blank' href='https://myanimelist.net/login.php'>MyAnimeList!<a>"); } else { getUserList(status, localListType, singleCallback, finishCallback, fullListCallback, continueCall, 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 = j.$.parseJSON(response.responseText); if (singleCallback) { // @ts-ignore if (!data.length) singleCallback(false, 0, 0); for (var i = 0; i < data.length; i++) { // @ts-ignore singleCallback(data[i], i + offset + 1, data.length + offset); } } if (fullListCallback) { templist = templist.concat(data); } if (data.length > 299) { if (continueCall) { // @ts-ignore continueCall(function () { getUserList(status, localListType, singleCallback, finishCallback, fullListCallback, continueCall, username, offset + 300, templist); }); } else { getUserList(status, localListType, singleCallback, finishCallback, fullListCallback, continueCall, username, offset + 300, templist); } } else { // @ts-ignore if (fullListCallback) fullListCallback(templist); // @ts-ignore if (finishCallback) finishCallback(); } }); } function getMalUserName(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); }); } //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: left;">' + 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;">'); } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(0), __webpack_require__(1), __webpack_require__(3), __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__, "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;"); }(); /***/ }), /* 4 */ /***/ (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 + ' */'; } /***/ }), /* 5 */ /***/ (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 mal; }); 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 mal { constructor(url) { this.url = url; this.name = ""; this.totalEp = NaN; this.addAnime = false; this.login = 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; } 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; } 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); }); } clone() { const copy = new this.constructor(); Object.assign(copy, this); copy.animeInfo = Object.assign({}, this.animeInfo); return copy; } sync() { return new Promise((resolve, reject) => { var This = this; var url = "https://myanimelist.net/ownlist/" + this.type + "/" + this.id + "/edit"; if (this.addAnime) { if (this.type == 'anime') { url = "https://myanimelist.net/ownlist/anime/add?selected_series_id=" + this.id; utils.flashConfirm('Add "' + this.name + '" to MAL?', 'add', function () { This.setStatus(1); continueCall(); }, function () { /*if(change['checkIncrease'] == 1){TODO episodeInfo(change['.add_anime[num_watched_episodes]'], actual['malurl']); }*/ }); return; } else { url = "https://myanimelist.net/ownlist/manga/add?selected_manga_id=" + this.id; utils.flashConfirm('Add "' + this.name + '" to MAL?', 'add', function () { This.setStatus(1); continueCall(); }, function () { }); return; } } 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]'); 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]'); 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__(3), __webpack_require__(0), __webpack_require__(1))) /***/ }), /* 6 */ /***/ (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__(10); /* harmony import */ var _Kissmanga_main__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); /* harmony import */ var _nineAnime_main__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(12); /* harmony import */ var _Crunchyroll_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(13); /* harmony import */ var _Masterani_main__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(14); /* harmony import */ var _Mangadex_main__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(15); /* harmony import */ var _Gogoanime_main__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(16); 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"], Gogoanime: _Gogoanime_main__WEBPACK_IMPORTED_MODULE_6__[/* Gogoanime */ "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://www3.gogoanime.in/search.html?keyword=' + titleEncoded; } }, Mangadex: { name: 'Mangadex', type: 'manga', domain: 'mangadex.org', searchUrl: (titleEncoded) => { return 'https://mangadex.org/quick_search/' + 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; } }, }; /***/ }), /* 7 */ /***/ (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__(1))) /***/ }), /* 8 */ /***/ (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, delay: 0, malTags: true, epPredictions: true, posLeft: 'left', miniMALonMal: false, displayFloatButton: true, outWay: true, miniMalWidth: '30%', miniMalHeight: '90%', malThumbnail: 100, '9anime': true, Crunchyroll: true, Gogoanime: true, Kissanime: true, Masterani: true, Kissmanga: true, Mangadex: true, }, 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; 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__(3))) /***/ }), /* 9 */ /***/ (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__(6); /* harmony import */ var _utils_mal__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5); /* harmony import */ var _minimal_iframe__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17); 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 (url.indexOf(utils.urlPart(page.domain, 2).split('.').slice(-2, -1)[0] + '.') > -1) { return page; } } 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 = new _utils_mal__WEBPACK_IMPORTED_MODULE_1__[/* mal */ "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); } return; }).catch(function (e) { con.error(e); utils.flashm("Anime 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) { return false; } this.malObj.setEpisode(state.episode); this.malObj.setStreamingUrl(this.page.sync.getOverviewUrl(this.url)); //TODO: Add the Rewatching Handling 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(""); this.handleList(true); } 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") { 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) { 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; } } 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); 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; return api.storage.set(this.page.name + '/' + this.page.sync.getIdentifier(this.url) + '/Offset', value); }); } 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" style="font-size: 12px;background: transparent; border-width: 1px; border-color: grey; text-decoration: none; outline: medium none;">'; //ui += '<option value="0" style="background: #111111;"></option>'; ui += '<option value="1" style="background: #111111;">' + utils.watching(this.page.type) + '</option>'; ui += '<option value="2" style="background: #111111;">Completed</option>'; ui += '<option value="3" style="background: #111111;">On-Hold</option>'; ui += '<option value="4" style="background: #111111;">Dropped</option>'; ui += '<option value="6" style="background: #111111;">' + utils.planTo(this.page.type) + '</option>'; ui += '</select>'; ui += wrapEnd; if (this.page.type == 'anime') { var middle = ''; middle += wrapStart; middle += '<span class="info">Episodes: </span>'; middle += '<span style=" text-decoration: none; outline: medium none;">'; middle += '<input id="malEpisodes" value="0" style="background: transparent; border-width: 1px; border-color: grey; text-align: right; text-decoration: none; outline: medium none;" 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">Volumes: </span>'; middle += '<span style=" text-decoration: none; outline: medium none;">'; middle += '<input id="malVolumes" value="0" style="background: transparent; border-width: 1px; border-color: grey; text-align: right; text-decoration: none; outline: medium none;" type="text" size="1" maxlength="4">'; middle += '/<span id="malTotalVol">0</span>'; middle += '</span>'; middle += wrapEnd; middle += wrapStart; middle += '<span class="info">Chapters: </span>'; middle += '<span style=" text-decoration: none; outline: medium none;">'; middle += '<input id="malEpisodes" value="0" style="background: transparent; border-width: 1px; border-color: grey; text-align: right; text-decoration: none; outline: medium none;" 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" style="font-size: 12px;background: transparent; border-width: 1px; border-color: grey; text-decoration: none; outline: medium none;"><option value="" style="background: #111111;">Select</option>'; ui += '<option value="10" style="background: #111111;">(10) Masterpiece</option>'; ui += '<option value="9" style="background: #111111;">(9) Great</option>'; ui += '<option value="8" style="background: #111111;">(8) Very Good</option>'; ui += '<option value="7" style="background: #111111;">(7) Good</option>'; ui += '<option value="6" style="background: #111111;">(6) Fine</option>'; ui += '<option value="5" style="background: #111111;">(5) Average</option>'; ui += '<option value="4" style="background: #111111;">(4) Bad</option>'; ui += '<option value="3" style="background: #111111;">(3) Very Bad</option>'; ui += '<option value="2" style="background: #111111;">(2) Horrible</option>'; ui += '<option value="1" style="background: #111111;">(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(); }); } 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__(1), __webpack_require__(2), __webpack_require__(0), __webpack_require__(3))) /***/ }), /* 10 */ /***/ (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 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: { 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) { api.storage.addStyle(__webpack_require__(23).toString()); j.$(document).ready(function () { page.handlePage(); }); } }; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(2), __webpack_require__(1), __webpack_require__(0))) /***/ }), /* 11 */ /***/ (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 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: { 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) { api.storage.addStyle(__webpack_require__(25).toString()); j.$(document).ready(function () { page.handlePage(); }); } }; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(2), __webpack_require__(1), __webpack_require__(0))) /***/ }), /* 12 */ /***/ (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"> ' + selector.html() + '</div></div>').insertBefore(j.$(".widget.info").first()); }, }, overview: { getTitle: function (url) { return ''; }, getIdentifier: function (url) { return ''; }, uiSelector: function (selector) { }, list: { 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__(27).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__(1), __webpack_require__(2), __webpack_require__(0), __webpack_require__(3))) /***/ }), /* 13 */ /***/ (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: { 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__(29).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__(1), __webpack_require__(2), __webpack_require__(0))) /***/ }), /* 14 */ /***/ (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: { 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__(31).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__(1), __webpack_require__(0))) /***/ }), /* 15 */ /***/ (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 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: { 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__(33).toString()); if (j.$('.card-header').length) { j.$(document).ready(function () { page.handlePage(); }); } else { utils.waitUntilTrue(function () { return Mangadex.sync.getOverviewUrl(''); }, function () { page.handlePage(); }); } } }; 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__(1), __webpack_require__(2), __webpack_require__(0))) /***/ }), /* 16 */ /***/ (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 Gogoanime; }); const Gogoanime = { name: 'Gogoanime', domain: '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: { elementsSelector: function () { return j.$("#episode_related a"); }, elementUrl: function (selector) { return utils.absoluteLink(selector.attr('href'), 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__(35).toString()); j.$(document).ready(function () { page.handlePage(); j.$('#episode_page').click(function () { setTimeout(function () { page.handleList(); }, 500); }); }); } }; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(2), __webpack_require__(1), __webpack_require__(0))) /***/ }), /* 17 */ /***/ (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__(18); 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') { minimalObj.setPageSync(page); if (typeof (page.malObj) != 'undefined') { minimalObj.fill(page.malObj.url); } else { minimalObj.fill(null); } } }, 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); } } else { document.getElementById('info-popup').style.display = "none"; j.$('.floatbutton').fadeIn(); } } }); } } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1), __webpack_require__(0), __webpack_require__(3))) /***/ }), /* 18 */ /***/ (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__(19); 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__(37).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> </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"> 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 replace 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> </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("#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? \nIf it does not exist on MAL, please leave empty.')) { 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 .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(); } 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"> <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('Kissmanga', 'KissManga')} ${materialCheckbox('Mangadex', 'MangaDex')} </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('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'))} </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 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> <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 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://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/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("#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(); }); //helper function materialCheckbox(option, text, header = false) { var check = ''; var sty = ''; var 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(''); this.minimal.find('#loadMalSearchPop').show(); var element = this.minimal.find('#malSearchPopInner'); var This = this; var my_watched_episodes = 'num_watched_episodes'; var series_episodes = 'anime_num_episodes'; var localPlanTo = 'Plan to Watch'; var localWatching = 'Watching'; if (localListType != 'anime') { my_watched_episodes = 'num_read_chapters'; series_episodes = 'manga_num_chapters'; localPlanTo = 'Plan to Read'; localWatching = 'Reading'; } var firstEl = 1; utils.getUserList(state, localListType, 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 uid = el[localListType + '_id']; var malUrl = 'https://myanimelist.net' + el[localListType + '_url']; var streamUrl = utils.getUrlFromTags(el['tags']); var imageHi = el[localListType + '_image_path']; var regexDimensions = /\/r\/\d*x\d*/g; if (regexDimensions.test(imageHi)) { imageHi = imageHi.replace(/v.jpg$/g, '.jpg').replace(regexDimensions, ''); } var progressProcent = (el[my_watched_episodes] / el[series_episodes]) * 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' + uid + '" malhref="' + malUrl + '" maltitle="' + el[localListType + '_title'] + '" malimage="' + el[localListType + '_image_path'] + '" style="position: relative; cursor: pointer; height: 250px; padding: 0; width: 210px; height: 293px;">'; bookmarkElement += '<div class="data title" style="background-image: url(' + imageHi + '); 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[localListType + '_title']; bookmarkElement += '<div id="p1" class="mdl-progress" series_episodes="' + el[series_episodes] + '" style="position: absolute; top: -4px; left: 0;"><div class="progressbar bar bar1" style="width: ' + progressProcent + '%;"></div><div class="bufferbar bar bar2" style="width: 100%;"></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[my_watched_episodes] + '</div>'; bookmarkElement += '</div>'; bookmarkElement += '</span>'; bookmarkElement += '<div class="tags" style="display: none;">' + el['tags'] + '</div>'; bookmarkElement += '</div>'; bookmarkElement += '</div>'; element.find('#malList .listPlaceholder').first().before(bookmarkElement); var domE = element.find('#malList .e' + uid).first(); domE.click(function (event) { // @ts-ignore if (!This.fill(j.$(this).attr('malhref'))) { con.error('Something is wrong'); } }); utils.epPredictionUI(uid, function (prediction) { var pre = prediction.prediction; if (pre.airing) { if (pre.episode) { var progressBar = domE.find('.mdl-progress'); var predictionProgress = (pre.episode / progressBar.attr('series_episodes')) * 100; progressBar.prepend('<div class="predictionbar bar kal-ep-pre" ep="' + (pre.diffWeeks + 1) + '" style="width: ' + predictionProgress + '%; background-color: red; z-index: 1; left: 0;"></div>'); domE.attr('title', prediction.text); } } }); 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="https://www.google.com/s2/favicons?domain=${streamUrl.split('/')[2]}"> </a>`); var id = utils.urlPart(malUrl, 4); var type = utils.urlPart(malUrl, 3); var resumeUrlObj = yield utils.getResumeWaching(type, id); var continueUrlObj = yield utils.getContinueWaching(type, id); var curEp = parseInt(el[my_watched_episodes]); 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>`); } } }); } }, function () { This.minimal.find('#loadMalSearchPop').hide(); }, null, function (continueCall) { 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(); } }); }); } } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1), __webpack_require__(2), __webpack_require__(3), __webpack_require__(0))) /***/ }), /* 19 */ /***/ (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 _utils_mal__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5); 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 { 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">Watching</option> <option value="2">Completed</option> <option value="3">On-Hold</option> <option value="4">Dropped</option> <option value="6">Plan to Watch</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>Eps Seen:</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;">12</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> <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/anime/${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'; } 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), 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 = new _utils_mal__WEBPACK_IMPORTED_MODULE_0__[/* mal */ "a"](this.url); 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('#curEps').html(malObj.totalEp).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()); malObj.setScore(minimal.find('#myinfo_score').val()); malObj.sync() .then(function () { utils.flashm('Updated'); }, function () { utils.flashm("Anime 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="https://www.google.com/s2/favicons?domain=${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="https://www.google.com/s2/favicons?domain=${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); } }); } 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__(1), __webpack_require__(2), __webpack_require__(3))) /***/ }), /* 20 */ /***/ (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__(6); /* harmony import */ var _utils_mal__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5); 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(); 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': 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)) { 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, function (prediction) { con.log(prediction); $('#addtolist').prev().before(prediction.text); $('[id="curEps"]').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="https://www.google.com/s2/favicons?domain=' + tempUrl.split('/')[2] + '"> ' + pageKey + '</h2>'; html += tempHtml; html += '<br class="mal_links" />'; } $(document).ready(function () { $('h2:contains("Information")').before(html); }); }); }); } 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="https://www.google.com/s2/favicons?domain=${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="https://www.google.com/s2/favicons?domain=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 _utils_mal__WEBPACK_IMPORTED_MODULE_1__[/* mal */ "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="https://www.google.com/s2/favicons?domain=${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($.parseJSON($('.list-table').attr('data-items'))); }); }, 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').first().after(tag); }, }; } else if (this.page == 'classic') { var book = { bookReady: function (callback) { utils.getUserList(7, This.type, null, null, function (list) { callback(list); }, null, 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').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[This.type + '_url']; con.log(malUrl); var id = utils.urlPart(malUrl, 2); var type = utils.urlPart(malUrl, 1); 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="https://www.google.com/s2/favicons?domain=${streamUrl.split('/')[2]}"> </a>`); var resumeUrlObj = yield utils.getResumeWaching(type, id); var continueUrlObj = yield utils.getContinueWaching(type, id); if (This.type == 'anime') { var curEp = parseInt(el['num_watched_episodes']); } else { var curEp = parseInt(el['num_read_chapters']); } 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, function (prediction) { book.predictionPos(element, prediction.tag); }); } }); }); book.cleanTags(); }); } } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(2), __webpack_require__(3), __webpack_require__(0))) /***/ }), /* 21 */ /***/ (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__(3))) /***/ }), /* 22 */ /***/ (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__(9); /* harmony import */ var _myanimelist_myanimelistClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(20); /* harmony import */ var _utils_scheduler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(21); 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 { var page = new _pages_syncPage__WEBPACK_IMPORTED_MODULE_0__[/* syncPage */ "a"](window.location.href); page.init(); } } 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_2__[/* 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__(1))) /***/ }), /* 23 */ /***/ (function(module, exports, __webpack_require__) { var result = __webpack_require__(24); if (typeof result === "string") { module.exports = result; } else { module.exports = result.toString(); } /***/ }), /* 24 */ /***/ (function(module, exports, __webpack_require__) { exports = module.exports = __webpack_require__(4)(false); // imports // module exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha {\n color: #d5f406;\n}\n.mal-sync-active {\n background-color: #002966;\n}\n#footer {\n z-index: 2;\n}\n", ""]); // exports /***/ }), /* 25 */ /***/ (function(module, exports, __webpack_require__) { var result = __webpack_require__(26); if (typeof result === "string") { module.exports = result; } else { module.exports = result.toString(); } /***/ }), /* 26 */ /***/ (function(module, exports, __webpack_require__) { exports = module.exports = __webpack_require__(4)(false); // imports // module exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha {\n color: #72cefe;\n}\n.mal-sync-active {\n background-color: #002966;\n}\n#footer {\n z-index: 2;\n}\n", ""]); // exports /***/ }), /* 27 */ /***/ (function(module, exports, __webpack_require__) { var result = __webpack_require__(28); if (typeof result === "string") { module.exports = result; } else { module.exports = result.toString(); } /***/ }), /* 28 */ /***/ (function(module, exports, __webpack_require__) { exports = module.exports = __webpack_require__(4)(false); // imports // module exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha {\n color: #694ba1;\n}\n.mal-sync-active {\n background-color: #002966;\n}\n", ""]); // exports /***/ }), /* 29 */ /***/ (function(module, exports, __webpack_require__) { var result = __webpack_require__(30); if (typeof result === "string") { module.exports = result; } else { module.exports = result.toString(); } /***/ }), /* 30 */ /***/ (function(module, exports, __webpack_require__) { exports = module.exports = __webpack_require__(4)(false); // imports // module exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha {\n color: white;\n}\n.mal-sync-active {\n background-color: #b2d1ff !important;\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 /***/ }), /* 31 */ /***/ (function(module, exports, __webpack_require__) { var result = __webpack_require__(32); if (typeof result === "string") { module.exports = result; } else { module.exports = result.toString(); } /***/ }), /* 32 */ /***/ (function(module, exports, __webpack_require__) { exports = module.exports = __webpack_require__(4)(false); // imports // module exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha {\n color: white;\n}\n.mal-sync-active {\n background-color: #002966;\n}\n", ""]); // exports /***/ }), /* 33 */ /***/ (function(module, exports, __webpack_require__) { var result = __webpack_require__(34); if (typeof result === "string") { module.exports = result; } else { module.exports = result.toString(); } /***/ }), /* 34 */ /***/ (function(module, exports, __webpack_require__) { exports = module.exports = __webpack_require__(4)(false); // imports // module exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha {\n color: black;\n}\n.mal-sync-active {\n background-color: #cee1ff;\n}\n#malp span {\n color: black;\n}\n#malp select > * {\n background-color: white !important;\n}\n", ""]); // exports /***/ }), /* 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__(4)(false); // imports // module exports.push([module.i, "#malStatus,\n#malTotal,\n#malEpisodes,\n#malUserRating,\n#malRating,\n#malVolumes,\n#malTotalVol,\n#malTotalCha {\n color: #ffc119;\n}\n.mal-sync-active {\n background-color: #002966 !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__(4)(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: 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 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", ""]); // exports /***/ }) /******/ ]);