Compare commits

..

No commits in common. "u/master" and "trakt-scraper" have entirely different histories.

15 changed files with 53 additions and 980 deletions

View file

@ -4,66 +4,40 @@
// @description Allow removal of visited links on Amazon Giveaway Listing
// @include https://smile.amazon.com/ga/giveaways*
// @include https://www.amazon.com/ga/giveaways*
// @version 1.9.2
// @version 1.6
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js
// ==/UserScript==
/* global jQuery */
/* jshint esversion: 6 */
var checked = false;
(function ($) {
'use strict';
var getSmallUrl = function(fullUrl) {
return fullUrl.split('?')[0];
};
var checked = false;
var regex_hide;
var hideOne = function(el) {
$(el).parents('div.a-spacing-base').css('display', checked ? 'none' : 'block');
};
var getSmallUrl = function(fullUrl) {
return fullUrl.split('?')[0];
};
var hideVisited = function(evt) {
checked = $(this).prop('checked');
var $links = $('.landingPageSpacings a[href*="amazon.com/ga"]');
var hideOne = function(el) {
$(el).parents('.listing-item').css('display', checked ? 'none' : 'block');
};
var hideVisited = function(evt) {
checked = $(this).prop('checked');
var $links = $('.listing-info-container a[href*="/ga"]');
var hide = regex_hide ? new RegExp(regex_hide, 'i') : null;
$links.each(function() {
var href = getSmallUrl($(this).attr('href'));
if (localStorage.getItem(href)) {
hideOne(this);
}
var title = $(this).find('.prize-title').text();
if (hide && title && hide.test(title)) {
hideOne(this);
}
});
};
$(document).ready(function() {
$('.listing-info-container').on('click', 'a[href*="/ga"]', function(evt) {
var href = getSmallUrl($(this).attr('href'));
localStorage[href] = "visited";
$links.each(function() {
var href = getSmallUrl($(this).attr('href'));
if (localStorage.getItem(href)) {
hideOne(this);
});
}
});
};
$('.listing-info-container a[href*="/ga"]').attr('target', '_blank');
$(document).ready(function() {
$('.landingPageSpacings').on('click', 'a[href*="amazon.com/ga"]', function(evt) {
regex_hide = localStorage.getItem('regex_hide') || '';
$('#giveaway-numbers-container')
.append('<label><input type="checkbox" id="hide_visited"/> Visited</label>')
.append(`<input id="hide_regex" value="${regex_hide}"/>`);
$('#hide_visited').on('click', hideVisited);
$('#hide_regex').on('change', function() {
regex_hide = $(this).val();
localStorage.regex_hide = regex_hide;
});
var href = getSmallUrl($(this).attr('href'));
localStorage[href] = "visited";
hideOne(this);
});
})(jQuery);
$('h1:contains("Giveaways")').after('<label><input type="checkbox" id="hide_visited"/> Visited</label>');
$('#hide_visited').on('click', hideVisited);
});

View file

@ -1,89 +0,0 @@
// -*- tab-width: 4; js-indent-level: 4; -*-
// ==UserScript==
// @name Comic Extra Scraper
// @namespace danielrayjones
// @version 0.0.6
// @description Scrape comics from comicextra.com
// @author Dan Jones
// @match https://www.comicextra.com/*
// @grant none
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js
// @require https://bowercdn.net/c/konami-code-1.3.2/src/jquery.konami.min.js
// @require https://bowercdn.net/c/jszip-3.1.5/dist/jszip.min.js
// ==/UserScript==
/* global jQuery, JSZip */
/* jshint esversion: 6 */
console.log('will scrape comics');
(function($) {
'use strict';
$(window).konami({
code: [71,69,84],
cheat: getStuff
});
function getStuff() {
let i = 0;
let path = location.pathname.split('/');
let end = path.pop();
while (!end && path.length) {
end = path.pop();
}
if (end !== 'full') {
alert('Must have the full comic');
return;
}
let chapter = path.pop();
let match;
if ((match = chapter.match(/^chapter-([0-9]+)/))) {
chapter = match[1];
}
let name = path.pop();
console.log(`Getting ${name} ${chapter}`);
let imgs = $('.chapter-main .chapter_img').toArray();
console.log(imgs);
let cbz = new JSZip();
function downloadCbz() {
cbz.generateAsync({type: 'blob'})
.then(blob => {
let title = name.replace(/-/g, ' ') + ' ' + chapter;
let $el = $('<a>');
$(document.body).append($el);
$el.attr('href', URL.createObjectURL(blob));
$el.attr('download', `${title} (comicextra) (Danjones).cbz`);
$el.get(0).click();
});
}
function getOne() {
if (!imgs || !imgs.length) {
downloadCbz();
return;
}
let img = imgs.shift();
console.log(img.src);
fetch(`//cors-anywhere.herokuapp.com/${img.src}`).then(resp => resp.blob()).then(blob => {
cbz.file(name + '-' + (i < 10 ? '00' : '0' ) + i + '.jpg', blob);
i = i+1;
setTimeout(getOne, 0);
});
}
getOne();
}
})(jQuery);

View file

@ -1,45 +0,0 @@
// ==UserScript==
// @name Auto Cookie Clicker
// @namespace danielrayjones
// @description Plays Cookie Clicker for you
// @include http://orteil.dashnet.org/cookieclicker/
// @version 0.0.4
// ==/UserScript==
/* jshint esversion: 6 */
let AutoClicker = {stop: false};
unsafeWindow.AutoClicker = AutoClicker;
window.addEventListener('load', function () {
'use strict';
let cookie = document.getElementById('bigCookie');
let shimmers = document.getElementById('shimmers');
function clickCookie() {
AutoClicker.cookie.click();
if (!AutoClicker.stop) {
setTimeout(clickCookie, 5);
}
}
let shimmerObserver = new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) {
mutation.addedNodes.forEach(function (shimmer) {
console.log('clicking', shimmer);
shimmer.click();
});
});
});
shimmerObserver.observe(shimmers, { childList: true});
AutoClicker.cookie = cookie;
AutoClicker.shimmers = shimmers;
AutoClicker.clickCookie = clickCookie;
AutoClicker.shimmerObserver = shimmerObserver;
for (let i = 0; i < 20; i++) {
clickCookie();
}
});

View file

@ -1,85 +0,0 @@
// -*- tab-width: 4; js-indent-level: 4; -*-
// ==UserScript==
// @name Full Comic Scraper
// @namespace danielrayjones
// @version 0.0.5
// @description Scrape comics from fullcomic.pro
// @author Dan Jones
// @match http://fullcomic.pro/*
// @grant none
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js
// @require https://bowercdn.net/c/konami-code-1.3.2/src/jquery.konami.min.js
// @require https://bowercdn.net/c/jszip-3.1.5/dist/jszip.min.js
// ==/UserScript==
/* global jQuery, JSZip */
/* jshint esversion: 6 */
console.log('will scrape comics');
(function($) {
'use strict';
$(window).konami({
code: [71,69,84],
cheat: getStuff
});
function getStuff() {
let i = 0;
let title = $('.title h1').text();
let regex = /Issue #([0-9]+)/;
let match;
if ((match = title.match(regex))) {
let issue = match[1];
while (issue.length < 3) {
issue = '0' + issue;
}
title = title.replace(regex, issue);
}
console.log(`Getting ${title}`);
let imgs = $('#imgPages img').toArray();
console.log(imgs);
let cbz = new JSZip();
function downloadCbz() {
cbz.generateAsync({type: 'blob'})
.then(blob => {
let fileTitle = title.replace(/: /g, ' - ');
let $el = $('<a>');
$(document.body).append($el);
$el.attr('href', URL.createObjectURL(blob));
$el.attr('download', `${fileTitle} (fullcomic) (Danjones).cbz`);
$el.get(0).click();
});
}
function getOne() {
if (!imgs || !imgs.length) {
downloadCbz();
return;
}
let img = imgs.shift();
console.log(img.src);
fetch(`//cors-anywhere.herokuapp.com/${img.src}`).then(resp => resp.blob()).then(blob => {
let name = title.replace(/[^A-Za-z0-9]+/g, '-');
cbz.file(name + '-' + (i < 10 ? '00' : '0' ) + i + '.jpg', blob);
i = i+1;
setTimeout(getOne, 0);
});
}
getOne();
}
})(jQuery);

View file

@ -3,12 +3,11 @@
// @namespace danielrayjones
// @description Remove stuff I don't like from Amazon Giveaway Listing
// @include https://giveawaylisting.com/
// @version 1.0.1
// @version 1.0
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js
// ==/UserScript==
/* global $ */
/* jshint esversion: 6 */
var hide = function(text) {
$('#giveaways a:contains("' + text +'")')

View file

@ -3,12 +3,10 @@
// @namespace danielrayjones
// @description Allow removal of visited links on Amazon Giveaway Listing
// @include https://giveawaylisting.com/
// @version 1.3.1
// @version 1.3
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js
// ==/UserScript==
/* jshint esversion: 6 */
var checked = false;
var hideOne = function(el) {

View file

@ -1,143 +0,0 @@
// ==UserScript==
// @name Infinite Craft Plus
// @namespace danielrayjones
// @match https://neal.fun/infinite-craft/
// @grant none
// @version 0.0.1
// @author Dan Jones
// @description 2024-01-06T14:13:00-0500
// ==/UserScript==
/* global window, localStorage, FileReader */
(function () {
const key = "infinite-craft-data";
function getData() {
return localStorage.getItem(key);
}
function downloadData() {
const data = getData();
const dl = document.createElement('a');
dl.href = 'data:application/json,' + data;
dl.download = 'infinite-craft.json';
dl.click();
}
function getParsedData() {
return JSON.parse(getData());
}
function getElements() {
return getParsedData().elements;
}
function overwriteElements(newElements) {
const data = getParsedData();
const old = data.elements;
data.elements = newElements;
localStorage.setItem(key, JSON.stringify(data));
return old;
}
function addElements(newElements) {
const els = getElements();
for (let i = 0; i < newElements.length; i++) {
const newEl = newElements[i];
const found = els.find(el => el.text === newEl.text);
if (found) {
continue;
}
console.log('Adding', newEl);
els.push(newEl);
}
return overwriteElements(els);
}
function uploadElements(evt) {
evt.preventDefault();
const files = evt.target.uploads.files;
for (let i = 0; i < files.length; i++) {
const file = files[i];
const read = new FileReader();
read.addEventListener('load', function () {
const body = read.result;
const els = JSON.parse(body)?.elements;
addElements(els);
});
read.readAsText(file);
}
const sub = evt.target.lastChild;
sub.disabled = true;
sub.setAttribute('value', '✅');
}
function getUploadButton() {
const f = document.createElement('form');
f.style.display = 'inline';
const ups = document.createElement('input');
ups.setAttribute('type', 'file');
ups.setAttribute('name', 'uploads');
ups.setAttribute('accept', '.json');
ups.setAttribute('required', true);
f.appendChild(ups);
f.addEventListener('submit', uploadElements);
const sub = document.createElement('input');
sub.setAttribute('type', 'submit');
sub.setAttribute('value', 'Upload');
f.appendChild(sub);
return f;
}
function getDownloadButton() {
const butt = document.createElement('button');
butt.innerText = '⤵️';
butt.addEventListener('click', downloadData);
return butt;
}
function addButtons() {
const target = document.querySelector('.site-title')?.parentElement;
if (!target) {
console.log("Can't find .site-title");
return null;
}
const span = document.createElement('span');
const down = getDownloadButton();
const up = getUploadButton();
span.appendChild(down);
span.appendChild(up);
const next = target.nextElementSibling;
console.log('inserting', span, 'before', next);
target.style.display = 'none';
return target.parentElement.insertBefore(span, next);
}
window.Game = window.Game || {};
window.Game.getData = getElements;
window.Game.download = downloadData;
window.addEventListener('load', () => console.log(addButtons()));
})();

View file

@ -1,46 +0,0 @@
// ==UserScript==
// @name Old Reddit Image Expander
// @namespace danielrayjones
// @description Allow removal of visited links on Amazon Giveaway Listing
// @include https://old.reddit.com*
// @version 1.0.3
// ==/UserScript==
(function() {
const listing = document.getElementById('siteTable');
if (!listing) {
return;
}
let para = document.createElement('p');
let exButton = document.createElement('button');
exButton.innerText = 'Expand';
exButton = para.appendChild(exButton);
exButton.addEventListener('click', () => document.querySelectorAll('.expando-button.collapsed').forEach(e => e.click()));
let deButton = document.createElement('button');
deButton.innerText = 'Collapse';
deButton = para.appendChild(deButton);
deButton.addEventListener('click', () => document.querySelectorAll('.expando-button.expanded').forEach(e => e.click()));
para = listing.insertBefore(para, listing.firstChild);
const proxyThumbClicks = function(evt) {
let thing = evt.target;
while (!thing.classList.contains('thing') && thing != document.body) {
thing = thing.parentElement;
}
if (!thing.classList.contains('thing')) {
console.log("Couldn't find thing");
return true;
}
evt.preventDefault();
thing.querySelector('.expando-button')?.click();
return false;
};
listing.querySelectorAll('.thumbnail').forEach(e => e.addEventListener('click', proxyThumbClicks));
})();

View file

@ -1,89 +0,0 @@
// -*- tab-width: 4; js-indent-level: 4; -*-
// ==UserScript==
// @name Read Comic Online Scraper
// @namespace danielrayjones
// @version 0.0.4
// @description Scrape comics from readcomiconline.to
// @author Dan Jones
// @match https://readcomiconline.to/*
// @grant none
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js
// @require https://bowercdn.net/c/konami-code-1.3.2/src/jquery.konami.min.js
// @require https://bowercdn.net/c/jszip-3.1.5/dist/jszip.min.js
// ==/UserScript==
/* global jQuery, JSZip */
/* jshint esversion: 6 */
(function($) {
'use strict';
console.log('This does not work');
return;
$(window).konami({
code: [71,69,84],
cheat: getStuff
});
function getStuff() {
let i = 0;
let path = location.pathname.split('/');
let chapter = path.pop();
while (!chapter && path.length) {
chapter = path.pop();
}
let match;
if ((match = chapter.match(/^Issue-([0-9]+)/))) {
chapter = match[1];
}
let name = path.pop();
if (path.pop() !== 'Comic') {
alert('Not on a comic page');
return;
}
console.log(`Getting ${name} ${chapter}`);
let imgs = $('#divImage img').toArray();
console.log(imgs);
let cbz = new JSZip();
function downloadCbz() {
cbz.generateAsync({type: 'blob'})
.then(blob => {
let title = name.replace(/-/g, ' ') + ' ' + chapter;
let $el = $('<a>');
$(document.body).append($el);
$el.attr('href', URL.createObjectURL(blob));
$el.attr('download', `${title} (readcomiconline) (Danjones).cbz`);
$el.get(0).click();
});
}
function getOne() {
if (!imgs || !imgs.length) {
downloadCbz();
return;
}
let img = imgs.shift();
console.log(img.src);
fetch(`//cors-anywhere.herokuapp.com/${img.src}`).then(resp => resp.blob()).then(blob => {
cbz.file(name + '-' + (i < 10 ? '00' : '0' ) + i + '.jpg', blob);
i = i+1;
setTimeout(getOne, 0);
});
}
getOne();
}
})(jQuery);

View file

@ -1,37 +0,0 @@
// -*- tab-width: 4; js-indent-level: 4; -*-
// ==UserScript==
// @name Trakt Storage Clearer
// @namespace danielrayjones
// @version 0.0.1
// @description
// @author Dan Jones
// @match https://trakt.tv/users/*/progress*
// @grant none
// @require https://bowercdn.net/c/konami-code-1.3.2/src/jquery.konami.min.js
// ==/UserScript==
/* global $, compressedCache, localStorage, MutationObserver */
/* jshint esversion: 6 */
(function() {
'use strict';
const clearStorage = () => localStorage.clear();
/* todo
$(window).konami({
code: [80, 73, 67, 75],
cheat: clearStorage
});
*/
function addPickButton() {
const $leftNav = $('.subnav-wrapper .container .left');
const $found = $leftNav.find('.clear-store');
if (!$found.length) {
$leftNav.append('<span class="filter-dropdown toggle-simple-progress clear-store" title="Clear Storage"><span class="icon trakt-icon-cancel"></span>X</span>')
.find('.clear-store').on('click', clearStorage);
}
}
})();

View file

@ -1,111 +0,0 @@
// -*- tab-width: 4; js-indent-level: 4; -*-
// ==UserScript==
// @name Trakt Show Picker
// @namespace danielrayjones
// @version 0.0.10
// @description Pick a show from progress page
// @author Dan Jones
// @match https://trakt.tv/users/*/progress*
// @grant none
// @require https://bowercdn.net/c/konami-code-1.3.2/src/jquery.konami.min.js
// ==/UserScript==
/* global $, compressedCache, localStorage, MutationObserver */
/* jshint esversion: 6 */
(function() {
'use strict';
let watched_shows;
$(window).konami({
code: [80, 73, 67, 75],
cheat: pickShow
});
function unghost() {
$(this).removeClass('sortable-ghost');
}
function addPickButton() {
const $leftNav = $('.subnav-wrapper .container .left');
const $found = $leftNav.find('.pick-episode');
if (!$found.length) {
$leftNav.append('<span class="filter-dropdown toggle-simple-progress pick-episode" title="Pick Episode"><span class="icon trakt-icon-wand"></span></span>')
.find('.pick-episode').on('click', pickShow);
}
}
function refreshPage() {
addPickButton();
$('div[data-type="show"]')
.on('click', unghost);
}
refreshPage();
const observer = new MutationObserver(refreshPage);
observer.observe(document.head.parentElement, {childList: true});
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];
}
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);
let picked = getWeightedIndex($shows.length);
let $picked = $shows.eq(picked);
$shows.addClass('sortable-ghost');
$picked.removeClass('sortable-ghost').insertAfter($picked.parent().find('.pagination-top'));
}
function filterShows($shows) {
// Milliseconds in two days
const twoDays = 2 * 24 * 60 * 60 * 1000;
const twoDaysAgo = (new Date()) - twoDays;
$shows.each(function (i, show) {
const showId = Number.parseInt(show.dataset.showId);
const showInfo = watched_shows[showId];
if (!showInfo) return;
const lastWatch = showInfo.ts*1000;
// Skip ones we've watched in the last two days
if (lastWatch > twoDaysAgo) {
show.classList.add('sortable-ghost');
}
const percentage = show.dataset.percentage;
if (percentage == 100) {
show.classList.add('sortable-ghost');
}
});
return $shows.filter(':not(.sortable-ghost)');
}
})();

View file

@ -2,30 +2,28 @@
// ==UserScript==
// @name Trakt Scraper
// @namespace danielrayjones
// @version 0.0.8
// @version 0.0.1
// @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
// @require https://raw.githubusercontent.com/tommcfarlin/konami-code/master/src/jquery.konami.min.js
// ==/UserScript==
/* global $, compressedCache, localStorage */
/* jshint esversion: 6 */
(function() {
'use strict';
$(window).konami({
code: [71,69,84],
cheat: getStuff
eventName: 'konami.get'
});
$(window).on('konami.get', getStuff);
String.prototype.lpad = function(padString, length) {
let str = this;
while (str.length < length) {
while (str.length < length)
str = padString + str;
}
return str;
};
@ -36,14 +34,13 @@
let $ep = $(that);
let $series = $ep.find('[itemtype="http://schema.org/TVSeries"]');
let this_ep = $ep.data();
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');
@ -53,81 +50,49 @@
$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');
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 + '"';
//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 $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;
let this_ep = {
series_id: series,
episode_id: ep,
title,
url,
watches: watched ? watched[1] : 0,
last_watched: watched ? watched[0] : null,
};
return this_ep;
}
function processMovie(that) {
let $mov = $(that);
let this_mov = $mov.data();
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 $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;
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);
}
watched_shows = JSON.parse(localStorage.watched_shows);
watched_movies = JSON.parse(localStorage.watched_movies);
let $el = $('<a>');
$(document.body).append($el);

View file

@ -1,78 +0,0 @@
// -*- tab-width: 4; js-indent-level: 4; -*-
// ==UserScript==
// @name Trakt Simplifier
// @namespace danielrayjones
// @version 0.0.3
// @description Strip out eps/movies from trakt lists based on a query string
// @author Dan Jones
// @match https://trakt.tv/*
// @grant none
// ==/UserScript==
/* jshint esversion: 6 */
(function() {
'use strict';
let searches = window.location.search.substr(1).split('&');
let query = {};
searches.forEach(function (search) {
let split = search.split('=');
query[split[0]] = split[1];
});
if (!('since' in query)) return;
let since = parseInt(query.since, 10);
let watched_shows;
let watched_movies;
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);
}
$('[itemtype="http://schema.org/TVEpisode"], [itemtype="http://schema.org/Movie"]').each(function () {
let type = $(this).attr('itemtype').replace(/^https?:\/\/schema.org\//, '');
switch(type) {
case "TVEpisode":
processEpisode(this);
break;
case "Movie":
processMovie(this);
break;
}
});
// Trigger resize
if ($grid) {
$grid.data('isotope').layout();
}
function processEpisode(that) {
let $ep = $(that);
let series = $ep.data('show-id');
let ep = $ep.data('episode-id');
let watched = watched_shows[series] ? watched_shows[series].e[ep] : null;
if (!watched) return;
if (watched[0] > since) $ep.remove();
}
function processMovie(that) {
let $mov = $(that);
let id = $mov.data('movie-id');
let watched = watched_movies[id];
if (!watched) return;
if (watched[0] > since) $ep.remove();
}
})();

View file

@ -1,73 +0,0 @@
// -*- tab-width: 4; js-indent-level: 4; -*-
// ==UserScript==
// @name Viewcomic Scraper
// @namespace danielrayjones
// @version 0.0.10
// @description Scrape comics from viewcomic.com
// @author Dan Jones
// @match http://viewcomic.com/*
// @grant none
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js
// @require https://bowercdn.net/c/konami-code-1.3.2/src/jquery.konami.min.js
// @require https://bowercdn.net/c/jszip-3.1.5/dist/jszip.min.js
// ==/UserScript==
/* global jQuery, JSZip */
/* jshint esversion: 6 */
(function($) {
'use strict';
$(window).konami({
code: [71,69,84],
cheat: getStuff
});
function getStuff() {
let i = 0;
let path = location.pathname.split('/');
let end = path.pop();
while (!end && path.length) {
end = path.pop();
}
let name = end ? end : 'comic';
let imgs = $('div.pinbin-copy img.picture, div.pinbin-copy img.hoverZoomLink').toArray();
console.log(imgs);
let cbz = new JSZip();
function downloadCbz() {
cbz.generateAsync({type: 'blob'})
.then(blob => {
let title = name.replace(/-/g, ' ').replace(/\b([0-9]{4})\b/, '($1)');
let $el = $('<a>');
$(document.body).append($el);
$el.attr('href', URL.createObjectURL(blob));
$el.attr('download', `${title} (viewcomic) (Danjones).cbz`);
$el.get(0).click();
});
}
function getOne() {
if (!imgs || !imgs.length) {
downloadCbz();
return;
}
let img = imgs.shift();
console.log(img.src);
fetch(img.src).then(resp => resp.blob()).then(blob => {
cbz.file(name + '-' + (i < 10 ? '00' : '0' ) + i + '.jpg', blob);
i = i+1;
setTimeout(getOne, 0);
});
}
getOne();
}
})(jQuery);

View file

@ -1,67 +0,0 @@
// -*- tab-width: 4; js-indent-level: 4; -*-
// ==UserScript==
// @name WhenIWork True Total Worked
// @namespace danielrayjones
// @description Adds the Total hours worked, including today
// @include https://app.wheniwork.com/payroll/
// @version 0.2.1
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js
// ==/UserScript==
/* global $ */
/* jshint esversion: 6 */
$(document).ready(function() {
'use strict';
// Filter out this event from iframes
if (!this.body.classList.contains("controller-payroll")) {
return;
}
let currentHourSum = 0;
function updateHours(hours) {
currentHourSum = hours;
let weekPlusDayTotal = $('#week-plus-day-total');
let span = `<span class="hour-type-label">Total with Today</span>${hours}`;
if (weekPlusDayTotal.length === 0) {
$('#header-summary-container .stats').append(
`<div class="hour-type-summary"><div id="week-plus-day-total" class="hour-type-total difference">${span}</div></div>`
);
} else {
weekPlusDayTotal.html(span);
}
// In case this ran while the page was loading, let's try again in two seconds.
return setTimeout(addHours, 2000);
}
function addHours() {
let hourSum = 0;
$('.times-list .col-worked .text-input[data-total]').each(function () {
hourSum += parseFloat($(this).text()) || 0;
});
// Adjust for floating point errors
hourSum = Math.round(hourSum*100)/100;
console.log(`got ${hourSum} hours`);
// AJAX request hasn't finished yet. Let's wait some more.
if (currentHourSum === 0 && hourSum === 0) return setTimeout(addHours, 2000);
if (currentHourSum !== hourSum && hourSum > 0) {
return updateHours(hourSum);
}
return null;
}
// The hours don't show up until after an AJAX request completes.
// Let's wait two seconds for it to finish.
setTimeout(addHours, 2000);
});