Skip to content

Instantly share code, notes, and snippets.

@vkargov
Last active April 15, 2019 23:05
Show Gist options
  • Save vkargov/15a8f99d26cfec66d3b301697817e069 to your computer and use it in GitHub Desktop.
Save vkargov/15a8f99d26cfec66d3b301697817e069 to your computer and use it in GitHub Desktop.
sort Youtube videos by score and output top 10 into console
// NB: This is just a proof of concept, use at your own risk. You must have the videos page open for it to work.
// This helped a lot: https://javascript.info/promise-chaining
// find all chats
function parseScore(score) {
//console.log(`parsing score ${score}`)
var calcscore = parseFloat(score.replace('K', 'e3').replace('M', 'e6').replace(',', ''))
//console.log(`= ${calcscore}`)
return calcscore
}
var videos;
// Show all elements
var promise = (async function () {
var vidcount = -1;
while (true) {
videos = Array.from(document.querySelectorAll('ytd-grid-video-renderer'));
if (vidcount == videos.length)
break;
vidcount = videos.length;
videos.slice(-1)[0].scrollIntoView();
await new Promise((resolve)=>setInterval(resolve, 1500));
}
})()
var scores = []
var xhr = new XMLHttpRequest()
xhr.responseType = 'text'
//for (let video of document.querySelectorAll('a.ytd-thumbnail[href]')) {
promise = promise.then(function(){
for (let video of videos) {
function processPage(resolve, reject) {
//debugger
var link = video.querySelector('a.ytd-thumbnail[href]')
var views = parseScore(video.querySelector('#metadata-line span').innerText)
var title = video.querySelector('#video-title').innerText
xhr.open('GET', `${link.href}`)
xhr.onload = function() {
var dislikes, likes
console.log(`Processing ${link.href}`)
try {
likes = parseScore(xhr.response.match(/([0-9.,KM]+) likes/)[1])
} catch {
likes = 0
}
try {
dislikes = parseScore(xhr.response.match(/([0-9.,KM]+) dislikes/)[1])
} catch {
dislikes = 0
}
let approval = likes / (likes + dislikes)
scores.push({
title: title,
views: views,
url: link.href,
score: approval
})
resolve()
}
xhr.send()
}
promise = promise.then(()=>new Promise(processPage))
}})
scores.sort((e1,e2)=>{return e2.score-e1.score ? e2.score-e1.score : e2.views-e1.views})
console.log(scores.slice(0,10))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment