userscripts/trakt.scraper.user.js

161 lines
4.8 KiB
JavaScript
Raw Normal View History

2017-10-18 16:12:02 -05:00
// -*- tab-width: 4; js-indent-level: 4; -*-
2017-10-18 16:02:05 -05:00
// ==UserScript==
// @name Trakt Scraper
// @namespace danielrayjones
2020-09-10 20:26:59 -05:00
// @version 0.0.8
2017-10-18 16:02:05 -05:00
// @description Scrape lists of shows/movies from Trakt and download a JSON file
// @author Dan Jones
// @match https://trakt.tv/*
// @grant none
// @require https://bowercdn.net/c/konami-code-1.3.2/src/jquery.konami.min.js
2017-10-18 16:02:05 -05:00
// ==/UserScript==
2019-10-15 09:40:04 -05:00
/* global $, compressedCache, localStorage */
2020-06-05 14:48:01 -05:00
/* jshint esversion: 6 */
2019-10-15 09:40:04 -05:00
2017-10-18 16:02:05 -05:00
(function() {
'use strict';
2017-10-19 11:55:21 -05:00
$(window).konami({
code: [71,69,84],
cheat: getStuff
2017-10-19 11:55:21 -05:00
});
2017-10-19 11:22:12 -05:00
String.prototype.lpad = function(padString, length) {
let str = this;
while (str.length < length) {
2017-10-19 11:22:12 -05:00
str = padString + str;
}
2017-10-19 11:22:12 -05:00
return str;
};
2017-10-19 11:55:21 -05:00
let watched_shows;
let watched_movies;
2017-10-18 16:02:05 -05:00
function processEpisode(that) {
let $ep = $(that);
let $series = $ep.find('[itemtype="http://schema.org/TVSeries"]');
2020-09-10 20:26:59 -05:00
let this_ep = $ep.data();
2017-10-19 11:22:12 -05:00
if ($series.length < 1) {
$series = $('[itemtype="http://schema.org/TVSeries"]');
}
2017-10-18 16:02:05 -05:00
let series = $ep.data('show-id');
let ep = $ep.data('episode-id');
let url = $ep.children('[itemprop="url"]').attr('content');
let series_title = $series.children('[itemprop="name"]').attr('content');
2017-10-19 11:22:12 -05:00
let $ep_title = $ep.children('[itemprop="name"]');
if ($ep_title.length < 1) {
$ep_title = $ep.find('[itemprop="name"]');
}
2019-10-15 09:40:04 -05:00
let released = $ep.data('released') || null;
if (released) {
released = (new Date(released)).getTime()/1000;
}
2017-10-19 11:22:12 -05:00
let ep_title = $ep_title.attr('content');
let ep_number = $ep.find('[itemprop="episodeNumber"]').attr('content');
2017-10-18 16:02:05 -05:00
let season_number = $ep.data('season-number');
if (!season_number) {
let $title_ep = $ep.find('.main-title-sxe');
if ($title_ep.length && $title_ep.text()) {
let match = /([0-9+])x[0-9]+/.exec($title_ep.text());
if (match) {
season_number = match[1];
}
}
}
if (!season_number) {
season_number = 0;
}
let title = series_title + " " + String(season_number) + "x" + String(ep_number).lpad("0", 2) + ' "' + ep_title + '"';
2017-10-18 16:02:05 -05:00
2017-10-18 16:12:02 -05:00
let watched = watched_shows[series] ? watched_shows[series].e[ep] : null;
2017-10-18 16:02:05 -05:00
2020-09-10 20:26:59 -05:00
let $img = $ep.find('[itemprop="image"]');
if ($img.length > 0) {
this_ep['image'] = $img.attr('content');
}
this_ep['series_id'] = series;
this_ep['episode_id'] = ep;
this_ep['title'] = title;
this_ep['url'] = url;
this_ep['released'] = released;
this_ep['watches'] = watched ? watched[1] : 0;
this_ep['last_watched'] = watched ? watched[0] : null;
2017-10-18 16:02:05 -05:00
return this_ep;
}
function processMovie(that) {
let $mov = $(that);
2020-09-10 20:26:59 -05:00
let this_mov = $mov.data();
2017-10-18 16:02:05 -05:00
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];
2020-09-10 20:26:59 -05:00
let $img = $mov.find('[itemprop="image"]');
if ($img.length > 0) {
this_mov['image'] = $img.attr('content');
}
this_mov['id'] = id;
this_mov['title'] = title;
this_mov['url'] = url;
this_mov['watches'] = watched ? watched[1] : 0;
this_mov['last_watched'] = watched ? watched[0] : null;
2017-10-18 16:02:05 -05:00
return this_mov;
}
2017-10-19 11:55:21 -05:00
function getStuff() {
2018-06-22 14:27:42 -05:00
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);
}
2017-10-19 11:55:21 -05:00
2017-10-19 12:15:57 -05:00
let $el = $('<a>');
$(document.body).append($el);
2017-10-19 11:55:21 -05:00
let items = $('[itemtype="http://schema.org/TVEpisode"], [itemtype="http://schema.org/Movie"]').map(function() {
let type = $(this).attr('itemtype').replace(/^https?:\/\/schema.org\//, '');
2017-10-18 16:02:05 -05:00
2017-10-19 11:55:21 -05:00
let data = {};
switch(type) {
2017-10-18 16:02:05 -05:00
case "TVEpisode":
data = processEpisode(this);
break;
case "Movie":
data = processMovie(this);
break;
2017-10-19 11:55:21 -05:00
}
data.type = type;
2017-10-18 16:02:05 -05:00
2017-10-19 11:55:21 -05:00
return data;
});
console.log(items);
2017-10-19 12:15:57 -05:00
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();
2017-10-19 11:55:21 -05:00
}
2017-10-18 16:02:05 -05:00
})();