|
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) |