// ==UserScript== // @name Sort TikTok profile videos by number of views // @namespace http://tampermonkey.net/ // @version 0.1.1 // @description Click on the "Videos" tab header on a TikTok profile page to sort loaded videos by descending number of views. Click again to restore the default sort. // @match https://www.tiktok.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=tiktok.com // @grant none // @license MIT // @downloadURL https://update.greasyfork.icu/scripts/477709/Sort%20TikTok%20profile%20videos%20by%20number%20of%20views.user.js // @updateURL https://update.greasyfork.icu/scripts/477709/Sort%20TikTok%20profile%20videos%20by%20number%20of%20views.meta.js // ==/UserScript== const multiplierMap = { k: 10 ** 3, m: 10 ** 6, b: 10 ** 9, } const sort = () => { const box = document.querySelector('[data-e2e="user-post-item-list"]'); const items = Array.from(box.children).map(v => { const viewsString = v.querySelector('[data-e2e="video-views"]').textContent.trim(); const number = parseFloat(viewsString) const multiplier = multiplierMap[viewsString.at(-1).toLowerCase()] || 1; const views = number * multiplier; return [v, views] }).sort((a, b) => b[1] - a[1]); const sorted = items.every(v => v[0].style.order); items.forEach((v, i) => { v[0].style.order = sorted ? '' : String(i + 1) }); } const sleep = time => new Promise(rs => setTimeout(rs, time)) const main = async () => { while(true) { await sleep(500) const videoTab = document.querySelector('[data-e2e="videos-tab"]') if (!videoTab || videoTab.sortByViewsListenerAdded) continue; videoTab.addEventListener('click', sort); videoTab.title += "Sort by number of views / Restore default sort"; videoTab.sortByViewsListenerAdded = true; } } main()