Greasy Fork is available in English.

netflix progress and title indicator

adds div with the current title and time

اعتبارا من 26-12-2017. شاهد أحدث إصدار.

// ==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
// ==/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);
})();