// ==UserScript== // @name netflix progress and title indicator // @namespace http://tampermonkey.net/ // @version 0.1 // @description adds div with the current title and time // @author Me // @match https://www.netflix.com/* // @grant none // @downloadURL none // ==/UserScript== function title_getter() { var vid, title = "", on = false; function refresh_title () { try { let divs = document.querySelectorAll(".video-title div *"); if(divs.length === 0){ divs = document.querySelectorAll(".video-title *"); } title = Array.from(divs).map((x)=>x.textContent).join(" "); } catch(e) { title = ""; } } function refresh_enabled () { vid = document.querySelector(".AkiraPlayer video"); if(vid === null && on) { on = false; return; } if(vid !== null && !on) on = true; } function time() { try { let cur = +vid.currentTime; let dur = +vid.duration; return { cur: cur, dur: dur }; } catch(e) { return { cur: 0, dur: 0 }; } } return { title: function () { return title; }, time, refresh_title, refresh_enabled, enabled: function () { return on; } }; } function reappend (n) { var w = document.querySelector(".sizing-wrapper"); if(w !== null){ if(w.contains(n)) return; w.appendChild(n); } } function node(cls, c) { var parent = document.createElement("div"); var text = document.createTextNode(""); parent.appendChild(text); if(c != null) { for(var n of c) { parent.appendChild(n); } } var current; var hidden = false; parent.className = cls; return { n: parent, set: function (value) { if(value == null) return; value = value.toString(); if(current != value) { text.textContent = value; current = value; } }, hide: function () { if(hidden) return; hidden = true; parent.className = cls + " hidden"; }, show: function () { if(!hidden) return; hidden = false; parent.className = cls; } }; } function p(number) { return (number < 10 ? '0' : '') + number; } (function() { var data = title_getter(); function fmt_time(s) { var s = s | 0; var h = (s / 3600)|0; s = s - h * 3600; var m = (s / 60)|0; s = s - m * 60; return `${p(h)}:${p(m)}:${p(s)}`; } var title = node("title"); var time = node("time"); var wholeTitleNode = node("myTitleNode", [title.n, time.n]); document.body.appendChild(wholeTitleNode.n); setInterval(data.refresh_title, 5000); var shown = false; document.body.addEventListener('keypress', function (e) { if(e.key == 't') { shown = shown ? false : true; refresh(); } }); function refresh () { data.refresh_enabled(); reappend(wholeTitleNode.n); if(data.enabled() && shown) wholeTitleNode.show(); else { wholeTitleNode.hide(); return; } var my_tit = data.title(); title.set(my_tit); let t = data.time(); time.set(`${fmt_time(t.cur)} / ${fmt_time(t.dur)}`); } setInterval(refresh, 500); })();