-
-
Save sarthaka1310/5e1cd071696506b3aae4997c5f4891de to your computer and use it in GitHub Desktop.
myanimelist.net sort plan to wach by rank #mal
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name MAL PTW Fetch Sort | |
// @description This script adds "Fetch Sort" button to the "Plan to watch" page. The button sorts the list by MAL's avg. score | |
// @namespace d-s-x | |
// @version 1.0 | |
// @author d-s-x | |
// @match https://myanimelist.net/animelist/*status=6* | |
// @grant none | |
// ==/UserScript== | |
(function() { | |
if (document.querySelector('#fetch-sort-button')) return; | |
const stats = document.querySelector('.stats'); | |
stats.innerHTML = '<a href="javascript: void(0);" id="fetch-sort-button"><i class="fa fa-sort"></i> Fetch Sort</a>' + stats.innerHTML; | |
document.querySelector('#fetch-sort-button').onclick = () => { | |
const titles = Array.from(document.querySelectorAll('.list-item .title a[href^="/anime/"]:not(.icon-watch)')); | |
console.log(`titles: ${titles.length}`); | |
const retryDelay = 1000; // ms | |
const requestDocument = (url, callback) => { | |
const request = new XMLHttpRequest(); | |
request.open('GET', url); | |
request.responseType = 'document'; | |
request.onload = () => { | |
if (request.status === 429) { | |
setTimeout(requestDocument, retryDelay, url, callback); | |
} else { | |
callback(request.status === 200 && request.response); | |
} | |
}; | |
request.onerror = () => { | |
callback(); | |
}; | |
request.send(); | |
} | |
let downloaded = 0; | |
const parseResponse = (title, page) => { | |
const item = title.closest('.list-item'); | |
if (page) { | |
const score = page.querySelector('[itemprop="ratingValue"]'); | |
//const users = page.querySelector('[itemprop="ratingCount"]'); | |
item._weigth = score && parseFloat(score.textContent); | |
} | |
scoreHTML = `<span>${item._weigth && item._weigth.toFixed(2) || 'N/A'}</span>` | |
item.querySelector('td.score').innerHTML = scoreHTML; | |
if (++downloaded === titles.length) { | |
console.log('fetch done'); | |
const container = title.closest('.list-table'); | |
const rows = Array.from(container.querySelectorAll('.list-item')); | |
rows.sort((a, b) => b._weigth - a._weigth); | |
for (let row of rows) { | |
container.append(row); | |
} | |
} | |
}; | |
for (const title of titles) { | |
const url = title.href; | |
title.closest('.list-item').querySelector('td.score').innerHTML = `<span>...</span>`; | |
requestDocument(url, (d) => parseResponse(title, d)); | |
} | |
}; | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment