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.

目前为 2023-10-18 提交的版本。查看 最新版本

// ==UserScript==
// @name               Sort TikTok profile videos by number of views
// @namespace          http://tampermonkey.net/
// @version            0.1.0
// @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) continue
    videoTab.addEventListener('click', sort)
    videoTab.title += "Sort by number of views / Restore default sort"
    break
  }
}
main()