138 lines
4.1 KiB
JavaScript
138 lines
4.1 KiB
JavaScript
// -*- tab-width: 4; js-indent-level: 4; -*-
|
|
// ==UserScript==
|
|
// @name Trakt Scraper
|
|
// @namespace danielrayjones
|
|
// @version 0.0.2
|
|
// @description Scrape lists of shows/movies from Trakt and download a JSON file
|
|
// @author Dan Jones
|
|
// @match https://trakt.tv/*
|
|
// @grant none
|
|
// @require https://raw.githubusercontent.com/tommcfarlin/konami-code/master/src/jquery.konami.min.js
|
|
// ==/UserScript==
|
|
|
|
/* global $, compressedCache, localStorage */
|
|
|
|
(function() {
|
|
'use strict';
|
|
|
|
$(window).konami({
|
|
code: [71,69,84],
|
|
eventName: 'konami.get'
|
|
});
|
|
|
|
$(window).on('konami.get', getStuff);
|
|
|
|
String.prototype.lpad = function(padString, length) {
|
|
let str = this;
|
|
while (str.length < length)
|
|
str = padString + str;
|
|
return str;
|
|
};
|
|
|
|
let watched_shows;
|
|
let watched_movies;
|
|
|
|
function processEpisode(that) {
|
|
let $ep = $(that);
|
|
let $series = $ep.find('[itemtype="http://schema.org/TVSeries"]');
|
|
|
|
if ($series.length < 1) {
|
|
$series = $('[itemtype="http://schema.org/TVSeries"]');
|
|
}
|
|
|
|
let series = $ep.data('show-id');
|
|
let ep = $ep.data('episode-id');
|
|
//let url = $ep.data('url');
|
|
let url = $ep.children('[itemprop="url"]').attr('content');
|
|
|
|
let series_title = $series.children('[itemprop="name"]').attr('content');
|
|
|
|
let $ep_title = $ep.children('[itemprop="name"]');
|
|
if ($ep_title.length < 1) {
|
|
$ep_title = $ep.find('[itemprop="name"]');
|
|
}
|
|
|
|
let released = $ep.data('released') || null;
|
|
if (released) {
|
|
released = (new Date(released)).getTime()/1000;
|
|
}
|
|
|
|
let ep_title = $ep_title.attr('content');
|
|
let ep_number = $ep.find('[itemprop="episodeNumber"]').attr('content');
|
|
let season_number = $ep.data('season-number');
|
|
//let title = $ep.data('title');
|
|
let title = series_title + " " + season_number + "x" + String(ep_number).lpad("0", 2) + ' "' + ep_title + '"';
|
|
|
|
let watched = watched_shows[series] ? watched_shows[series].e[ep] : null;
|
|
|
|
let this_ep = {
|
|
series_id: series,
|
|
episode_id: ep,
|
|
title,
|
|
url,
|
|
released,
|
|
watches: watched ? watched[1] : 0,
|
|
last_watched: watched ? watched[0] : null,
|
|
};
|
|
|
|
return this_ep;
|
|
}
|
|
|
|
function processMovie(that) {
|
|
let $mov = $(that);
|
|
let id = $mov.data('movie-id');
|
|
|
|
let title = $mov.children('[itemprop="name"]').attr('content');
|
|
let url = $mov.children('[itemprop="url"]').attr('content');
|
|
let watched = watched_movies[id];
|
|
|
|
let this_mov = {
|
|
id,
|
|
title,
|
|
url,
|
|
watches: watched ? watched[1] : 0,
|
|
last_watched: watched ? watched[0] : null,
|
|
};
|
|
|
|
return this_mov;
|
|
}
|
|
|
|
function getStuff() {
|
|
|
|
if ('compressedCache' in window) {
|
|
watched_shows = compressedCache.get('watched_shows');
|
|
watched_movies = compressedCache.get('watched_movies');
|
|
} else {
|
|
watched_shows = JSON.parse(localStorage.watched_shows);
|
|
watched_movies = JSON.parse(localStorage.watched_movies);
|
|
}
|
|
|
|
let $el = $('<a>');
|
|
$(document.body).append($el);
|
|
|
|
let items = $('[itemtype="http://schema.org/TVEpisode"], [itemtype="http://schema.org/Movie"]').map(function() {
|
|
let type = $(this).attr('itemtype').replace(/^https?:\/\/schema.org\//, '');
|
|
|
|
let data = {};
|
|
switch(type) {
|
|
case "TVEpisode":
|
|
data = processEpisode(this);
|
|
break;
|
|
case "Movie":
|
|
data = processMovie(this);
|
|
break;
|
|
}
|
|
data.type = type;
|
|
|
|
return data;
|
|
});
|
|
|
|
console.log(items);
|
|
|
|
let data_string = 'data:text/json;charset=utf-8,' + encodeURIComponent(JSON.stringify(items.toArray()));
|
|
$el.attr('href', data_string);
|
|
$el.attr('download', 'watched.json');
|
|
$el.get(0).click();
|
|
}
|
|
|
|
})();
|