Skip to content

Instantly share code, notes, and snippets.

@SamWSoftware
Last active October 6, 2022 11:17
Show Gist options
  • Save SamWSoftware/6a3eba550482f0e052b81395d80875a7 to your computer and use it in GitHub Desktop.
Save SamWSoftware/6a3eba550482f0e052b81395d80875a7 to your computer and use it in GitHub Desktop.
A way to gather view stats for a given channel
const stringToNumber = (string) => {
const scale = string.slice(-1);
if (scale === "K"){
return Number(string.slice(0,-1)) * 1000;
}
if (scale === "M") return Number(string.slice(0,-1)) * 1000000;
return Number(string)
}
const quantile = (arr, q) => {
const sorted = arr.sort((a, b) => a - b);
const pos = (sorted.length - 1) * q;
const base = Math.floor(pos);
const rest = pos - base;
if (sorted[base + 1] !== undefined) {
return sorted[base] + rest * (sorted[base + 1] - sorted[base]);
} else {
return sorted[base];
}
};
const getSubs = () => {
const info = document.getElementById('YouTubeUserTopInfoBlock');
const subsString = [...info.children][2].children[2].textContent;
return subs = stringToNumber(subsString)
}
const numberToString = number =>{
const length = number.toString().length
if (length <=4) return number.toString();
if (length <= 6) return (number/1000).toFixed(1) + 'K';
if (length == 7 ) return (number/1000000).toFixed(2) + "M";
return (number/1000000).toFixed(1);
}
const getAverageViews = (start = 0, stop = 30) => {
const wrapper = document.getElementById('YouTube-Video-Wrap');
const viewStrings = [...wrapper.children].slice(start, stop).map(row => row.children[2].textContent);
const views = viewStrings.map(stringToNumber);
const average = Number((views.reduce((a, b) => a + b, 0) / views.length).toFixed(0));
const subs = getSubs();
const rawViewDetails = {
subs,
average: average,
q25: quantile(views, 0.25),
q50: quantile(views, 0.5),
q75: quantile(views, 0.75),
};
rawViewDetails['average/subs'] = rawViewDetails.average/subs;
rawViewDetails['q25/subs'] = rawViewDetails.q25/subs;
rawViewDetails['q75/subs'] = rawViewDetails.q75/subs;
const spreadRatio = ((rawViewDetails.q75 - rawViewDetails.q25 )/ average).toFixed(3)
return {
string: {
average: numberToString(average),
q25: numberToString(rawViewDetails.q25),
q50: numberToString(rawViewDetails.q50),
q75: numberToString(rawViewDetails.q75),
subs,
spreadRatio
},
rawDetailArray: Object.values(rawViewDetails)
}
}
const results = getAverageViews();
console.log(results.string)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment