Automatically sort video results in a page on /videos, /images, /subscriptions, and sidebars using customizable sort function.
当前为
// ==UserScript==
// @name Iwara Custom Sort
// @version 0.111
// @grant GM.setValue
// @grant GM.getValue
// @grant GM.deleteValue
// @match https://ecchi.iwara.tv/*
// @match https://www.iwara.tv/*
// @match http://ecchi.iwara.tv/*
// @match http://www.iwara.tv/*
// @description Automatically sort video results in a page on /videos, /images, /subscriptions, and sidebars using customizable sort function.
// @namespace https://greasyfork.org/users/245195
// ==/UserScript==
/* jshint esversion: 6 */
const logDebug = (...args) => {
const debugging = true;
if (debugging) {
console.log(...args);
}
}
logDebug('Parsed.');
const sortValueInput = document.createElement('input');
const parsePrefixed = (str) => {
return Number.parseFloat(str) * (str.includes('k') ? 1000 : 1);
}
const sortVideos = (videosContainer) => {
const videoDivs = Array.from(videosContainer.querySelectorAll('.clearfix'));
const views = videoDivs.map(div => div.querySelector('.glyphicon-eye-open'))
.map(div => div ? parsePrefixed(div.parentElement.textContent) : 0);
const likes = videoDivs.map(div => div.querySelector('.glyphicon-heart'))
.map(div => div ? parsePrefixed(div.parentElement.textContent) : 0);
const videoEntries = Object.entries(videoDivs);
GM.setValue('sortValue', sortValueInput.value);
const evalSortValue = (views, likes) => {
const ratio = Math.min(likes / Math.max(1, views), 1);
return eval(sortValueInput.value);
}
videoEntries.sort((entryA, entryB) => {
return evalSortValue(views[entryB[0]], likes[entryB[0]]) - evalSortValue(views[entryA[0]], likes[entryA[0]]);
});
videoDivs.map(div => div.parentElement)
.forEach((div, index) => {
div.append(videoEntries[index][1]);
});
};
const sortAllVideos = () => {
let gridCount = 0;
document.querySelectorAll('.views-responsive-grid').forEach((grid) => {
sortVideos(grid);
gridCount++;
});
logDebug(`${gridCount}grids sorted.`);
};
const requestMorePages = (URL, pageCount) => {
const params = URL.searchParams;
const page = params.has('page') ? params.get('page') : 0;
logDebug(page, pageCount);
}
(async () => {
const currentURL = new URL(location);
if (/\/(videos|images|subscriptions)/.test(currentURL.pathname)) {
const additionalPageCount = 2;
requestMorePages(currentURL, additionalPageCount);
}
sortValueInput.type = 'text';
sortValueInput.value = await GM.getValue('sortValue', '100 * ratio + Math.sqrt(likes) / 25');
const uiContainer = (() => {
const temp = document.querySelector('.list-inline');
if (temp) {
return temp;
} else {
return document.querySelector('#user-links');
}
})();
uiContainer.insertAdjacentElement('afterbegin', sortValueInput);
const sortButton = document.createElement('button');
sortButton.innerHTML = 'Sort';
uiContainer.insertAdjacentElement('afterbegin', sortButton);
sortButton.addEventListener('click', sortAllVideos);
sortAllVideos();
})();