Sort TikTok profile videos by number of views

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.

// ==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
// ==/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()