// ==UserScript==
// @name Random episode chooser
// @description Highlight a random episode in homepage
// @match https://www.tvtime.com/*
// @version 1.2.1
// @run-at document-end
// @grant none
// @license MIT
// @author Morryx
// @namespace https://greasyfork.org/users/807892
// @downloadURL none
// ==/UserScript==
// Direct link (find a way to save it easily, some share place)
random = function (max = 1, min = 0) {
return Math.floor(Math.random() * (max - min + 1)) + min;
};
is_numeric = function (c) {
return /^\d+$/.test(c);
};
toint_string = function (str) {
var new_str = '';
if (str == '' || str == null) return 0;
for (i = 0; i < str.length; i++) {
var char = str.charAt(i);
if (is_numeric(char)) new_str += char;
}
return +new_str;
};
addCss = function (code, append) {
if (code !== '') add_css += '' + code;
if (typeof append != 'undefined' && append) appendCss();
};
appendCss = function () {
$('#customStyle').remove();
if (add_css !== '')
$body.append($(''));
};
// Settings
var storage_key = 'RandomEpisode_Settings',
default_settings = {
filter: [],
};
save_settings = function (settings) {
window.localStorage.setItem(storage_key, JSON.stringify(settings));
};
clear_settings = function () {
window.localStorage.removeItem(storage_key);
};
get_settings = function () {
var settings = window.localStorage.getItem(storage_key),
default_settings_length = Object.keys(default_settings).length,
last_added_settings = Object.keys(default_settings)[default_settings_length - 1],
key = false;
if (settings === null) settings = {};
else settings = JSON.parse(settings);
if (!settings.hasOwnProperty(last_added_settings) || default_settings_length != Object.keys(settings).length) {
for (key in default_settings) {
if (!settings.hasOwnProperty(key)) settings[key] = default_settings[key];
}
}
for (key in settings) {
if (!default_settings.hasOwnProperty(key)) delete settings[key];
}
save_settings(settings);
return settings;
};
change_settings = function (key, value) {
settings[key] = value;
save_settings(settings);
};
var settings = get_settings(),
add_css = '',
$body = false;
$(function () {
$body = $('body[id]');
if ($body.hasClass('home')) {
var img_selector = '.image-crop img',
$episodes = $('.to-watch-list').first().find('li[id]'),
previous_show = '',
tries = 0,
get_id_show = function ($episode) {
var id_show = '',
url = $episode.find('.nb-reviews-link.secondary-link').attr('href'),
regex = /\/[0-9]+/g,
founds = url.match(regex);
if (founds !== null && founds.length)
id_show = toint_string(founds[0]);
return id_show;
},
choose = function () {
var random_episode = random($episodes.length - 1),
$episode = $episodes.eq(random_episode),
id_show = get_id_show($episode);
if (settings.filter.includes(id_show) ||
previous_show == id_show) {
tries++;
if (tries < 50)
choose();
return;
}
previous_show = id_show;
$episodes
.removeClass('ep_choosed')
.find(img_selector).css('opacity', '0.75');
$episode
.addClass('ep_choosed')
.find('.to-watch-icon').click(function () {
$t = $(this);
setInterval(function () {
if ($t.parent().hasClass('watched'))
location.reload();
}, 2500);
});
},
add_filter = function ($episode) {
var id_show = get_id_show($episode),
txt = 'Add to filter',
filter_class = 'green',
click = function () {
settings.filter.push(id_show);
change_settings('filter', settings.filter);
add_filter($episode);
};
if (settings.filter.includes(id_show)) {
txt = 'Remove to filter';
filter_class = 'orange';
click = function () {
var index = settings.filter.indexOf(id_show);
if (index > -1)
settings.filter.splice(index, 1);
change_settings('filter', settings.filter);
add_filter($episode);
};
}
var $nav = $episode.find('.nav'),
$filter = $('' + txt + '');
$nav.find('.filter').remove();
$filter.click(click);
$nav.append($filter);
};
$('#home').dblclick(function () {
tries = 0;
$episodes = $('.to-watch-list').first().find('li[id]');
choose();
});
choose();
$episodes.each(function () {
add_filter($(this));
});
addCss(
'.nav .filter{' +
' float: left;' +
' cursor: pointer;' +
'}' +
'.nav .filter.orange{color:orange}' +
'.nav .filter.green{color:green;font-weight:bold}' +
'.ep_choosed{' +
' transform: translateY(-20px) scale(1.2);' +
' background-color: #ffd700;' +
' border-radius: 10px;' +
' box-shadow: 0 0 10px -5px black;' +
'}' +
'.ep_choosed ' + img_selector + '{opacity:1!important}'
);
}
appendCss();
});