// ==UserScript== // @name TVMaze: add "Watched" button to calendar // @description Add add "Watched" button to calendar at TVMaze // @namespace BlackNullerNS // @include http://www.tvmaze.com/calendar* // @version 1.0 // @grant GM_xmlhttpRequest // @downloadURL none // ==/UserScript== var btn = document.createElement('button'); btn.innerHTML = '✓'; btn.style.border = 0; btn.style.padding = '2px'; btn.style.background = 'transparent'; btn.style.color = '#3C948B'; btn.style.cursor = 'pointer'; var handler = function (e) { e.preventDefault(); if (!confirm('Mark the episode as watched?')) { return false; } var self = this, entry = this.parentNode, link = this.previousElementSibling; if (link.getAttribute('href').indexOf('episodes/') === -1) { return false; } var eid = link.getAttribute('href').split('episodes/')[1].split('/')[0]; var url = '/watch/set?episode_id=' + eid; var csrf = document.querySelector('meta[name="csrf-token"]').getAttribute('content'); GM_xmlhttpRequest({ method: "POST", url: url, data: "type=0", headers: { "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "X-CSRF-Token": csrf }, onload: function(response) { entry.classList.add('watched'); self.remove(); } }); }; var cloned; var episodes = document.querySelectorAll(".entry:not(.watched)"); for (var i = 0, l = episodes.length; i < l; i++) { cloned = btn.cloneNode(true); cloned.addEventListener('click', handler); episodes.item(i).appendChild(cloned); }