2020-06-05 11:49:56 -05:00
|
|
|
// -*- tab-width: 4; js-indent-level: 4; -*-
|
|
|
|
|
// ==UserScript==
|
|
|
|
|
// @name Trakt Show Picker
|
|
|
|
|
// @namespace danielrayjones
|
2020-08-03 19:48:33 -05:00
|
|
|
// @version 0.0.9
|
2020-06-05 11:49:56 -05:00
|
|
|
// @description Pick a show from progress page
|
|
|
|
|
// @author Dan Jones
|
|
|
|
|
// @match https://trakt.tv/users/*/progress*
|
|
|
|
|
// @grant none
|
2020-06-05 14:09:47 -05:00
|
|
|
// @require https://bowercdn.net/c/konami-code-1.3.2/src/jquery.konami.min.js
|
2020-06-05 11:49:56 -05:00
|
|
|
// ==/UserScript==
|
|
|
|
|
|
2020-08-03 19:03:09 -05:00
|
|
|
/* global $, compressedCache, localStorage, MutationObserver */
|
2020-06-05 14:48:01 -05:00
|
|
|
/* jshint esversion: 6 */
|
2020-06-05 11:49:56 -05:00
|
|
|
|
|
|
|
|
(function() {
|
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
|
|
$(window).konami({
|
|
|
|
|
code: [80, 73, 67, 75],
|
2020-06-05 19:46:36 -05:00
|
|
|
cheat: pickShow
|
2020-06-05 11:49:56 -05:00
|
|
|
});
|
|
|
|
|
|
2020-08-03 19:03:09 -05:00
|
|
|
function addPickButton() {
|
|
|
|
|
const $leftNav = $('.subnav-wrapper .container .left');
|
|
|
|
|
const $found = $leftNav.find('.pick-episode');
|
|
|
|
|
if (!$found.length) {
|
2020-08-03 19:48:33 -05:00
|
|
|
$leftNav.append('<span class="filter-dropdown toggle-simple-progress pick-episode" title="Pick Episode"><span class="icon trakt-icon-wand"></span></span>')
|
2020-08-03 19:03:09 -05:00
|
|
|
.find('.pick-episode').on('click', pickShow);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
addPickButton();
|
|
|
|
|
const observer = new MutationObserver(addPickButton);
|
|
|
|
|
observer.observe(document.head.parentElement, {childList: true});
|
2020-08-03 14:01:25 -05:00
|
|
|
|
2020-07-22 13:49:36 -05:00
|
|
|
$('div[data-type="show"]').on('click', function () {
|
|
|
|
|
$(this).removeClass('sortable-ghost');
|
|
|
|
|
});
|
|
|
|
|
|
2020-06-05 11:49:56 -05:00
|
|
|
let watched_shows;
|
|
|
|
|
|
2020-07-22 13:49:36 -05:00
|
|
|
function getWeightedIndex(total) {
|
|
|
|
|
const opts = [];
|
|
|
|
|
for ( let idx = 0; idx < total; idx++) {
|
|
|
|
|
for (let idxInst = 0; idxInst < total - idx; idxInst++) {
|
|
|
|
|
opts.push(idx);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const totalWeights = opts.length;
|
|
|
|
|
const which = Math.floor(Math.random() * totalWeights);
|
|
|
|
|
|
|
|
|
|
return opts[which];
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-05 11:49:56 -05:00
|
|
|
function pickShow() {
|
|
|
|
|
|
|
|
|
|
if ('compressedCache' in window) {
|
|
|
|
|
watched_shows = compressedCache.get('watched_shows');
|
|
|
|
|
} else {
|
|
|
|
|
watched_shows = JSON.parse(localStorage.watched_shows);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let $shows = $('div[data-type="show"]');
|
|
|
|
|
$shows.removeClass('sortable-ghost');
|
|
|
|
|
$shows = filterShows($shows);
|
|
|
|
|
|
2020-07-22 13:49:36 -05:00
|
|
|
let picked = getWeightedIndex($shows.length);
|
2020-06-05 11:59:25 -05:00
|
|
|
let $picked = $shows.eq(picked);
|
2020-06-05 11:49:56 -05:00
|
|
|
|
|
|
|
|
$shows.addClass('sortable-ghost');
|
2020-06-05 11:59:25 -05:00
|
|
|
$picked.removeClass('sortable-ghost').insertAfter($picked.parent().find('.pagination-top'));
|
2020-06-05 11:49:56 -05:00
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function filterShows($shows) {
|
|
|
|
|
|
|
|
|
|
// Milliseconds in two days
|
|
|
|
|
let twoDays = 2 * 24 * 60 * 60 * 1000;
|
|
|
|
|
let twoDaysAgo = (new Date()) - twoDays;
|
|
|
|
|
|
|
|
|
|
$shows.each(function (i, show) {
|
|
|
|
|
|
|
|
|
|
let showId = Number.parseInt(show.dataset.showId);
|
|
|
|
|
let showInfo = watched_shows[showId];
|
|
|
|
|
if (!showInfo) return;
|
|
|
|
|
|
|
|
|
|
let lastWatch = showInfo.ts*1000;
|
|
|
|
|
// Skip ones we've watched in the last two days
|
|
|
|
|
if (lastWatch > twoDaysAgo) {
|
|
|
|
|
show.classList.add('sortable-ghost');
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return $shows.filter(':not(.sortable-ghost)');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
})();
|