您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Shows play counts of "listeners you know" where it's present
// ==UserScript== // @name last.fm listeners you know // @description Shows play counts of "listeners you know" where it's present // @version 0.0.2 // @author wOxxOm // @namespace wOxxOm.scripts // @license MIT License // @match https://www.last.fm/* // @grant GM_xmlhttpRequest // @grant GM_addStyle // @run-at document-start // @connect self // ==/UserScript== /* jshint lastsemic:true, multistr:true, laxbreak:true, -W030, -W041, -W084 */ GM_addStyle(` .col-sidebar .chartlist { margin-bottom: 2em; } .col-sidebar .chartlist tr { box-shadow: none!important; } .col-sidebar .chartlist .chartlist-ellipsis-wrap { position: static!important; } .col-sidebar .chartlist.chartlist--big-image .chartlist-ellipsis-wrap { margin-top: -1px!important; margin-left: 1ex; } `); const CACHE_DURATION = 24 * 3600 * 1000; // last.fm updates the stats each day setTimeout(cleanupCache, 10000); document.addEventListener('DOMContentLoaded', process); document.addEventListener('pjax:end.listeners-you-know', process); window.addEventListener('load', function onLoad() { window.removeEventListener('load', onLoad); unsafeWindow.jQuery(unsafeWindow.document).on('pjax:end', exportFunction(relayPJAX, unsafeWindow)); }); function relayPJAX() { document.dispatchEvent(new CustomEvent('pjax:end.listeners-you-know')); } function process() { const link = document.querySelector('a[href*="/+listeners/you-know"]'); if (!link) return; const cached = readCache(link.href); if (cached) return render(cached); fetchDoc(link.href).then(doc => { const listeners = doc.querySelector('.col-main table'); if (!listeners) return; [].forEach.call(listeners.querySelectorAll('.chartlist-index'), e => e.style.display = 'none'); const me = listeners.querySelector(`a[href$="${document.querySelector('.auth-link').pathname}"]`); if (me) me.closest('tr').remove(); const html = listeners.outerHTML.replace(/\r?\n/g, ' ').replace(/\s\s+/g, ' '); writeCache({url: link.href, html}); render(html); }); function render(html) { document.querySelector('.col-sidebar').insertAdjacentHTML('afterbegin', html); } } function fetchDoc(options) { options = typeof options == 'string' ? {url: options} : options; options = Object.assign({method: 'GET'}, options); return new Promise(resolve => GM_xmlhttpRequest( Object.assign(options, { onload: r => resolve(new DOMParser().parseFromString(r.responseText, 'text/html')) }) )); } function readCache(url) { const data = (localStorage[url] || '').split('\0', 2); const expired = +data[0] < Date.now(); return !expired && data[1]; } function writeCache({url, html, cleanupRetry}) { const expires = Date.now() + CACHE_DURATION; if (!tryCatch(() => localStorage[url] = expires + '\0' + html)) { if (cleanupRetry) return console.error('localStorage write error'); cleanupCache({aggressive: true}); setIimeout(writeCache, 0, {url, html, cleanupRetry: true}); } setTimeout(() => { localStorage.removeItem(url) }, CACHE_DURATION + 1000); } function cleanupCache({aggressive = false} = {}) { Object.keys(localStorage).forEach(k => { if (k.match(/^https?:\/\/[^\t]+$/)) { let meta = (localStorage[k] || '').split('\0', 2); if (+meta[0] < Date.now() || aggressive) localStorage.removeItem(k); } }); } function tryCatch(fn) { try { return fn() } catch(e) {} }
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址