MyAnimeList(MAL) - Extra

Show anime info in your animelist

目前為 2015-09-25 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         MyAnimeList(MAL) - Extra
// @version      1.1.1
// @description  Show anime info in your animelist
// @author       Cpt_mathix
// @match        *://myanimelist.net/animelist/*
// @license      GPL version 2 or any later version; http://www.gnu.org/licenses/gpl-2.0.txt
// @grant        none
// @namespace https://greasyfork.org/users/16080
// ==/UserScript==

// Your MyAnimeList Login
var username = "";
var password = "";

init();

function init() {
    var table = document.getElementById("list_surround").children;
    for (var i = 0; i < table.length; i++) {
        var cell = table[i].getElementsByTagName('td');

        for (var j = 0; j < cell.length; j++) {  
            // Displays Anime Info
            var hasMore = cell[j].innerHTML.search('More');
            if (hasMore != -1) {
                var animetitle = cell[j].getElementsByClassName('animetitle')[0].innerText;

                // get animeid
                var a = cell[j].getElementsByTagName("a");
                var animeid = a[1].id.match(/\d/g).join("");

                // get table color type
                var tdtype = cell[j].className.match(/\d/g).join("");

                // replace onclick function with my own
                a[1].removeAttribute('onclick');
                a[1].addEventListener('click', displayTable(animetitle, animeid, tdtype) , true); 
            }

            // Not Yet Aired becomes transparant
            var found = cell[j].innerHTML.search('Not Yet Aired');
            if (found != -1) {
                cell[j].setAttribute('style', 'opacity:0.50 !important');
                // table[i].setAttribute('style', 'display:none !important');
            }
        }
    }
}

function getAnimeInfo(animetitle, animeid) {
    // API request
    var anime = animetitle.replace(/ /g, "_");
    var xhr = new XMLHttpRequest();
    var url = "";
    if (username == "") {
        var url = "http://myanimelist.net/api/anime/search.xml?q=" + anime;
    } else {
        var url = "http://" + username + ":" + password + "@myanimelist.net/api/anime/search.xml?q=" + anime;
    }
    xhr.open("GET", url, false);
    xhr.setRequestHeader('Content-Type', 'text/xml');
    xhr.send();
    xmlDocument = xhr.responseXML;
    if (xmlDocument != null) {
        var entry = xmlDocument.getElementsByTagName('entry');
        var entryid = xmlDocument.getElementsByTagName('id');    
        for(var k = 0; k < entryid.length; k++) {
            if (entryid[k].textContent == animeid) {
                return entry[k];
            }
        }
    } else {
        return xhr.status;
    }
}

// This info is not being used as of now
/*
function getUserInfo(animetitle, animeid) {
    // API request
    var anime = animetitle.replace(/ /g, "_");
    var xhr = new XMLHttpRequest();
    var url = "http://myanimelist.net/malappinfo.php?u=" + username + "&status=all&type=anime";
    xhr.open("GET", url, false);
    xhr.setRequestHeader('Content-Type', 'text/xml');
    xhr.send();
    xmlDocument = xhr.responseXML;
    return xmlDocument;
}
*/

// if this fails to function, look at getExpand(arg1, arg2) function on the myanimelist page
function displayTable(animetitle, animeid, tdtype) {
    return function () {
        var moreObject = $('#more'+animeid);
        var memberId = $('#listUserId').val();

        if (moreObject.css('display') == 'block') {		// Hide if loaded
            moreObject.hide();
            return false;
        } 

        if (moreObject.css('display') == 'none') {		// Show if date is already loaded
            moreObject.show();
        }

        $.post("/includes/ajax-no-auth.inc.php?t=6", {color:tdtype,id:animeid,memId:memberId,type:$('#listType').val()}, function(data) {
            moreObject.html(data.html).show();
            load_img_tags();

            // change info with info from API request
            var hiddendiv = "more" + animeid;
            var table = document.getElementById(hiddendiv).getElementsByClassName('td' + tdtype + ' borderRBL')[0]
            if (table != null) {
                var entry1 = getAnimeInfo(animetitle, animeid);
                // var entry2 = getUserInfo(animetitle, animeid);
                var entry2 = false;
                if (entry1 == "200") {
                    table.innerHTML = "There seems to be an error... Sorry <br> I know that some animetitles do not work and will try to find a solution in the future <br> Broken titles: Gintama, Kingdom, Tokyo Ghoul, Tokyo Ghoul √A, Shiki, ..."
                } else if (entry1 == "401") {
                    table.innerHTML = "Your login is wrong! <br> Please check if your username and password are correct in the script-code <br> If it worked before, I probably updated the script and you need to re-enter your login in the script"
                } else {
                    table.innerHTML = displayAnimeInfo(entry1, entry2);
                }
            }
        }, "json");
    };
}

function getEntryTag(entry1, string) {
    return entry1.getElementsByTagName(string)[0].textContent;
}

function displayAnimeInfo(entry1, entry2) {
    var englishTitle = getEntryTag(entry1, 'english');
    if (englishTitle == "") {
        englishTitle = getEntryTag(entry1, 'title');
    }
    
    var synonyms = getEntryTag(entry1, 'synonyms');
    var episodes = getEntryTag(entry1, 'episodes');
    if (episodes == "0") {
        episodes = "unknown";                
    }
    
    var score = getEntryTag(entry1, 'score');
    var startDate = getEntryTag(entry1, 'start_date').replace(/\d\d\d\d-\d\d-\d\d/g, function(s) {    
        var dmy = s.split('-');    
        return dmy[2] + '/' + dmy[1] + '/' + dmy[0];    
    });
    
    var endDate = getEntryTag(entry1, 'end_date').replace(/\d\d\d\d-\d\d-\d\d/g, function(s) {    
        var dmy = s.split('-');    
        return dmy[2] + '/' + dmy[1] + '/' + dmy[0];    
    });
    if (endDate == "00/00/0000") {
        endDate = "unknown";
    }
    
    var status = getEntryTag(entry1, 'status');
    var synopsis = getEntryTag(entry1, 'synopsis').replace(/\[i\]/g,"<i>").replace(/\[\/i\]/g,"</i>");
    var image = getEntryTag(entry1, 'image');
    
    var strVar="";
    strVar += "<body>";
    strVar += "<table>";
    strVar += "  <tr>";
    strVar += "    <td>" + "<img src=" + image + ">" + "<\/td>";
    strVar += "    <td valign=\"top\">";
    strVar += "    <b>" + "English:  " + "<\/b>" + englishTitle + "<br>";
    strVar += "    <b>" + "Synonyms: " + "<\/b>" + synonyms + "<br>";
    strVar += "    <b>" + "Status:   " + "<\/b>" + status + "<br>";
    strVar += "    <b>" + "Episodes: " + "<\/b>" + episodes + "<br>";
    strVar += "    <b>" + "Score:    " + "<\/b>" + score + "<br>" + "<br>";
    strVar += "    <b>" + "Start-date: " + "<\/b>" + startDate + "<br>";
    strVar += "    <b>" + "End-date:   " + "<\/b>" + endDate + "<br>" + "<br>" + synopsis;
    strVar += "    <\/td>";
    strVar += "  <\/tr>";
    strVar += "<\/table>";
    strVar += "<\/body>";
        
    return strVar;
}