NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Youtube OCD Sugoi Ratio
// @namespace http://tampermonkey.net/
// @version 1.1
// @description Know in advance how much videos are appreciated! The result of each video is the ratio between its likes and unlikes (Update: fixed bugs. If a video can't be analyzed, you will find "1/1" instead of the real ratio.)
// @author speep95 (pietrogiucastro@alice.it)
// @match https://www.youtube.com/*
// @match http://www.youtube.com/*
// @require http://code.jquery.com/jquery-latest.js
// @grant none
// ==/UserScript==
var rcmain = $('<div class="result-container result-main"><div class="ocd-spinner"></div></div>')[0];
var rcmainnew = $('<div class="result-container result-main-new"><div class="ocd-spinner"></div></div>')[0];
var rclat = $('<div class="result-container result-lat"><div class="ocd-spinner"></div></div>')[0];
var rclatplay = $('<div class="result-container result-lat-play"><div class="ocd-spinner"></div></div>')[0];
var rcchannel = $('<div class="result-container result-channel"><div class="ocd-spinner"></div></div>')[0];
var computer = {
luratioCalc : function(a) {
a.luratio = a.stats.likes / a.stats.dislikes;
if (isNaN(a.luratio)) a.luratio = 1; //check if 0/0
else if (!isFinite(a.luratio)) a.luratio = a.stats.likes; //check if Infinite (3/0)
return Math.floor(a.luratio*10)/10;
},
luratio : function(videolist) {
videolist.forEach(function(a) {
a.result = computer.luratioCalc(a);
});
return videolist;
}
};
function getParam(url, par) {
if (!url.split('?')[1]) return;
var parValue;
url.split('?')[1].split('&').forEach(function(el) {
if (el.split('=')[0] == par) { parValue = el.split('=')[1]; return;}
});
return parValue;
}
function initVideoList(videos) {
videolist = [];
$(videos).each(function() {
videolist.push(
{element: this,
url: getParam($(this).find('a')[0].href, 'v'),
stats: {views: -1, likes: -1, dislikes: -1, pubDate: new Date(0)}}
);
});
return videolist;
}
function getSetAPI(videolist) {
var partlist = videolist.splice(0,40); // get first 40 ids
var idlist = partlist.map(function(e) { return e.url; });
var url = 'https://www.googleapis.com/youtube/v3/videos?id=';
url += idlist.toString();
console.log('ocd - checking ' + idlist.length + ' elements..');
$.get(url , {
key : 'AIzaSyCtO4m53m1gQzxJzJes_KiURc0xoTcwsbg',
part : 'snippet,statistics'
}, function(res) {
partlist = setAPI(res.items, partlist);
setRatios(partlist);
if (videolist.length) getSetAPI(videolist);
});
}
function setAPI(res, videolist) {
res.forEach(function(item, index) {
if (!item.statistics) return console.log(item);
videolist[index].stats.views = parseInt(item.statistics.viewCount || -1);
videolist[index].stats.likes = parseInt(item.statistics.likeCount || -1);
videolist[index].stats.dislikes = parseInt(item.statistics.dislikeCount || -1);
videolist[index].stats.pubDate = new Date(item.snippet.publishedAt || new Date());
});
return videolist;
}
function setRatios(videolist) {
videolist = computer.luratio(videolist);
videolist.forEach(function(el) {
$(el.element).find('.result-container').html(el.result+'/1');
luColor(el);
});
}
function luColor(el) {
var v_ratio = el.result;
var v_red = Math.max(0, 255 - Math.floor(v_ratio/1.5));
var v_green = Math.min(255, Math.floor(v_ratio*4));
var v_color= "rgb("+v_red+","+v_green+",30)";
$(el.element).find('.result-container').css('color', v_color);
}
function addRatiosTo(containersel, videosel, rc) {
var container = $(containersel),
videos = container.find(videosel).not('.ocd-checked');
if (!videos.length) return;
var videolist = initVideoList(videos);
var appendtomain = function(el) { $(el.element).addClass('ocd-checked').append(rc.cloneNode(true)); };
var appendtolat = function(el) { $(el.element).addClass('ocd-checked').find('.content-link, ytd-video-meta-block').append(rc.cloneNode(true)); };
var appendtolatplay = function(el) { $(el.element).addClass('ocd-checked').append(rc.cloneNode(true)); };
var appendtochannel = function(el) { $(el.element).addClass('ocd-checked').append(rc.cloneNode(true)); };
var appendtotarget = appendtomain;
if ($(rc).hasClass('result-lat')) appendtotarget = appendtolat;
else if ($(rc).hasClass('result-lat-play')) appendtotarget = appendtolatplay;
else if ($(rc).hasClass('result-channel')) appendtotarget = appendtochannel;
videolist.forEach(appendtotarget);
getSetAPI(videolist);
}
function addRatiosToMain(containersel) {
var rc = rcmain;
var container = $(containersel);
if (container.hasClass('ocd-checked')) return;
var videolist = [{
element: container,
url: getParam(window.location.search, 'v'),
stats: {views: -1, likes: -1, dislikes: -1, pubDate: new Date(0)}
}];
var appendtomain = function(el) { $(el.element).addClass('ocd-checked').prepend(rc.cloneNode(true)); }; //old layout
if (container.is('#info')) {
rc = rcmainnew;
appendtomain = function(el) { $(el.element).addClass('ocd-checked').find('#flex').after(rc.cloneNode(true)); }; //new layout
}
videolist.forEach(appendtomain);
getSetAPI(videolist);
}
function listener() { //triggered when document title is changed, so when another page is loaded.
if (document.title.match('ocd-waiting')) return;
// OLD LAYOUT //
if ($('.section-list').length) addRatiosTo('.section-list', '.yt-lockup', rcmain); // index
if ($('#watch-related').length) addRatiosTo('#watch-related', 'li.video-list-item', rclat); // related
if ($('#channels-browse-content-grid').length) addRatiosTo('#channels-browse-content-grid', '.yt-lockup', rcchannel); // channel videos
if ($('.yt-uix-shelfslider-list').length) addRatiosTo('.yt-uix-shelfslider-list,#browse-items-primary', '.yt-lockup', rcchannel); // channel homepage
if ($('#watch8-sentiment-actions').length) addRatiosToMain('#watch8-sentiment-actions'); // main video
// NEW LAYOUT //
if ($('ytd-browse:visible').length) addRatiosTo('ytd-browse', 'ytd-grid-video-renderer:visible,ytd-video-renderer:visible', rcmain); // index
if ($('#items.ytd-watch-next-secondary-results-renderer:visible').length)
addRatiosTo('#items.ytd-watch-next-secondary-results-renderer:visible', 'ytd-compact-video-renderer:visible', rclat); // related
if ($('.playlist-items:visible').length) addRatiosTo('.playlist-items:visible', 'ytd-playlist-panel-video-renderer:visible', rclatplay); // related playlist
if ($('#info:visible').length) addRatiosToMain('#info:visible'); // main video
}
function resetOCD() {
$('.result-container').remove();
$('.ocd-checked').removeClass('ocd-checked');
}
!function main() {
$('body').append('<style type="text/css"> .result-container {margin-top: 5px; display: inline-block; padding: 2px 3px; background-color: rgb(100,100,100); color: white; font-size:11px; border-radius: 3px;} .ocd-spinner { background-image: url(https://loading.io/assets/img/ellipsis.gif); background-repeat: no-repeat; background-size: cover; width:23px; height:13px; background-position-y: -5px; } '
+ ' .result-main { } .result-main-new { margin-right: 15px; } .result-lat { display: inline-table; } .result-lat-play { display: inline-table } .result-channel { } </style>'); // style
var prevstate = '';
setInterval(function() {
var thisstate = history.state;
if (prevstate != thisstate) {
console.log('changed');
resetOCD();
document.title += ' - ocd-waiting';
console.log('ocd-waiting');
prevstate = thisstate;
}
if (!document.title.match('ocd-checked')) {
document.title = document.title.replace('- ocd-waiting', '');
document.title += ' - ocd-checked';
console.log('ocd-checked');
resetOCD();
}
listener();
}, 1000);
}();