YouTube Player Controls

Fill window, float video, set HD, repeat button, hide annotations, skip ads, disable autoplay, pause start/end

La data de 26-02-2018. Vezi ultima versiune.

// ==UserScript==
// @name         YouTube Player Controls
// @namespace    YouTubePlayerControls
// @version      1.1.5
// @description  Fill window, float video, set HD, repeat button, hide annotations, skip ads, disable autoplay, pause start/end
// @author       Costas
// @match        http://www.youtube.com/*
// @match        https://www.youtube.com/*
// @grant 		 GM_setValue
// @grant 		 GM_getValue
// @noframes
// ==/UserScript==

//==================================================================
//Userscript specific functions

var doc = document;
var win = window;

if (win.frameElement) throw new Error("Stopped JavaScript.");

function set_pref(preference, new_value) {
    GM_setValue(preference, new_value);
}

function get_pref(preference) {
    return GM_getValue(preference);
}

function init_pref(preference, new_value) {
    var value = get_pref(preference);
    if (value == null) {
        set_pref(preference, new_value);
        value = new_value;
    }
    return value;
}

//==================================================================
// Styles

var style_annotations = "\
.html5-video-player .annotation,\
.html5-video-player .video-annotations,\
.html5-video-player .ytp-cards-button,\
.html5-video-player .ytp-cards-teaser,\
.html5-video-player .iv-drawer,\
.html5-video-player .ima-container {display:none !important;}\
";

var style_extra_ads = "\
#player-ads,\
ytd-compact-promoted-video-renderer {display:none !important;}\
";

var style_autoplay = "\
.autoplay-bar,\
.watch-sidebar-separation-line {display:none !important;}\
ytd-compact-autoplay-renderer {display:none !important;}\
"

var style_basic = "\
/* messages */\
.ytpc_message {font:12px/15px arial,sans-serif; text-align:left; white-space:pre; float:left; clear:both; color:black; background:beige; margin:10px 0px 0px 300px; z-index:2147483647;}\
/* options */\
#ytpc_options_popup {position:absolute; top:0px; right:0px; width:235px; box-shadow:0px 0px 5px 5px lightgray; font:11px/11px arial,sans-serif; color:black; background:linear-gradient(#ffffff,#f8f8f8); padding:5px; border-radius:5px; /*z-index:2147483647; z-index:2147483646; */ z-index:10; }\
#ytpc_options_popup input {margin:3px 2px 0px 5px !important;}\
.ytpc_options_group *[hide] {color:steelblue !important;}\
.ytpc_options_group[hide] *[hide] {/*visibility:hidden;*/ opacity:0.5;}\
.ytpc_options_group.column > span:first-child {display:inline-block; min-width:120px !important;}\
.ytpc_options_text {font-weight:bold; margin-left:5px; margin-top:7px; color:black;}\
.ytpc_options_close {font:14px/14px arial,sans-serif; color:#ff8888; position:absolute; top:5px; right:5px; cursor:pointer;}\
.ytpc_options_close:hover {font-weight:bold; color:red;}\
.ytpc_options_title {font:bold 13px/13px arial,sans-serif; padding:3px 5px !important; color:black;}\
/* buttons */\
#gridtube_title_container {position:absolute; top:5px; right:5px;}\
ytd-video-primary-info-renderer {position:relative !important;}\
#ytpc_ytcontrol_container {position:relative; float:right;}\
#ytpc_ytcontrol_button {overflow:hidden; position:relative; float:right; width:24px; height:23px; margin:-5px -3px 0px 6px; cursor:pointer; opacity:0.8; background-size:100%; background-image:url('data:image/png;base64,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'); }\
#ytpc_ytcontrol_button:hover {opacity:1;}\
#ytpc_ytcontrol_loop {position:relative; float:right; height:18px; margin-left:10px; border-radius:5px; cursor:pointer; opacity:0.7; background:rgba(255,255,255,0.3);}\
#ytpc_ytcontrol_loop[loop] {background:lightblue !important;}\
#ytpc_ytcontrol_loop:hover {box-shadow:0px 0px 1px 1px gray; opacity:0.9;}\
#ytpc_ytcontrol_loop img {height:22px; margin-top:-2px; padding:0px 3px;}\
/* masthead */\
#content[ytpc_cinema]:not([float]) #masthead-container[ytpc_hide] {display:none !important;}\
#content[ytpc_cinema][ytpc_top]:not([float]) #page-manager {margin-top:0px !important;}\
/* other */\
.yt-subscribe-button-right {margin-top:12px !important;}\
";

//loop icon
var loopsrc = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQFJREFUeNrsluENgjAQhYEFcAPcoG6AG3QEHM0NGAG\
               coLqBG+AGeCZtcrmI3J2UGsNL3g8S6Pt6bY9m2aZNy6v0TqYa7LgQRSSIA7jnQBQRKxEgzKeXckY5T+C9IHjnw4Me4CP4Jt1ILXhcyMNcJai6BcODG254EzGcdTIc+fj1bIXHEJfeonDHGYDSV4o+QNe9RBMTA2ga0\
               VT4KgAV2fFOOh5d/yCjWA7VhHB4icIHX95VAN6FjwqASgOAwy0KlwLYiSPNasOxG1KSbthJ1s6Q0n/rdqoN5zMQvf+9Bl3975WrO/gMvmgvFYZspDpLINxKkwBgiGQAP3Hd3vSfegowAOVS0NA3eDs0AAAAAElFTkSuQmCC";


//==============================================================
//basic

function newNode(kind, id, classname, refnode, position) {

    var node = doc.createElement(kind);

    if (node == null) return null;

    if (id != null) node.id = id;

    if (classname != null) node.className = classname;

    if (refnode != null) {
        switch (position) {
            //insert after refnode
            case 'after':
                if (refnode.nextSibling != null)
                    refnode.parentNode.insertBefore(node, refnode.nextSibling);
                else
                    refnode.parentNode.appendChild(node);
                break;

                //insert before refnode
            case 'before':
                refnode.parentNode.insertBefore(node, refnode);
                break;

                //insert as first child of refnode                  
            case 'first':
                var child = refnode.childNodes[0];
                if (child != null)
                    refnode.insertBefore(node, child);
                else
                    refnode.appendChild(node);
                break;

                //insert as last child of refnode
            case 'last':
            default:
                refnode.appendChild(node);
                break;
        }
    }

    return node;
}


function message(str) {
    var node = newNode("div", null, "ytpc_message", doc.body);
    node.textContent = str + "\n";
}


function insertStyle(str, id) {
    var styleNode = null;

    if (id != null) {
        styleNode = doc.getElementById(id);
    }

    if (styleNode == null) {
        styleNode = newNode("style", id, null, doc.head);
        styleNode.setAttribute("type", "text/css");
    }

    if (styleNode.textContent != str)
        styleNode.textContent = str;
}


function injectScript(str, src) {
    var script = doc.createElement("script");
    if (str) script.textContent = str;
    if (src) script.src = src;
    doc.body.appendChild(script);
    if (!src) doc.body.removeChild(script);
}


function simulClick(el) {
    var clickEvent = doc.createEvent('MouseEvents');
    clickEvent.initEvent('click', true, true);
    el.dispatchEvent(clickEvent);
}


function xpath(outer_dom, inner_dom, query) {
    //XPathResult.ORDERED_NODE_SNAPSHOT_TYPE = 7
    return outer_dom.evaluate(query, inner_dom, null, 7, null);
}


function docsearch(query) {
    return xpath(doc, doc, query);
}


function innersearch(inner, query) {
    return xpath(doc, inner, query);
}



//==================================================================
//YT Player

function ytplayer_script() {
    injectScript("function f() {\
                    var a = document.getElementById('c4-player') || document.getElementById('movie_player');\
                    var b = document.getElementById('ytpc_ytplayer_state');\
                    if (a != null && b != null)\
                      if (b.getAttribute('loop') == 'true') {\
                        if (window.location.href.indexOf('list=') == -1) {\
                          if (a.getPlayerState() == 0) {\
                            a.playVideo();\
                          }\
                        }\
                        else {\
                          var d = a.getDuration();\
                          if ((d - a.getCurrentTime() <= 1) && d > 0) {\
                            a.playVideoAt(a.getPlaylistIndex());\
                          }\
                        }\
                      }\
                      else {\
                         if (b.getAttribute('pause_end') == 'true' && b.getAttribute('pause_end_mark') != 'true') {\
                           var d = a.getDuration();\
                           if ((d - a.getCurrentTime() <= 1) && d > 0) {\
                             a.pauseVideo();\
                             b.setAttribute('pause_end_mark', 'true');\
                           }\
                         }\
                      }\
                  }\
                  window.setInterval(f, 1000);\
                  ");
}


function ytplayer_state(attr, value) {
    var node = doc.getElementById('ytpc_ytplayer_state');
    if (!node) {
        node = newNode("div", 'ytpc_ytplayer_state', null, doc.body);
        node.style.display = "none";
    }

    if (!node) return;

    if (attr && value) node.setAttribute(attr, value);
    else if (attr) return node.getAttribute(attr);
}


function set_loop() { ytplayer_state('loop', 'true'); }
function set_noloop() { ytplayer_state('loop', 'false'); }
function set_pause_end() { ytplayer_state('pause_end', 'true'); }
function set_nopause_end() { ytplayer_state('pause_end', 'false'); }
function reset_pause_end_mark() { ytplayer_state("pause_end_mark", "false"); }
function success_pause() { return ytplayer_state('pause_status') == 'success'; }
function success_quality() { return ytplayer_state('quality_status') == 'success'; }


function adjust_pause_end() {
    var islive = docsearch("//yt-view-count-renderer/*[contains(.,'watching now')]").snapshotLength > 0;
    //message("Is live: " + islive);
    //alert("Is live: " + islive);
    get_pref("ytPauseEnd") && !islive ? set_pause_end() : set_nopause_end();
    reset_pause_end_mark();
}


function adjust_loop(noflip) {
    var inloop = get_pref("ytLoop");
    if (noflip != "noflip") {
        inloop = !inloop;
        set_pref("ytLoop", inloop);
    }

    inloop ? set_loop() : set_noloop();

    var node = doc.getElementById('ytpc_ytcontrol_loop');
    if (!node) return;

    if (inloop) {
        node.setAttribute("loop", "true");
        node.title = "Repeat is ON";
    }
    else {
        node.removeAttribute("loop");
        node.title = "Repeat is OFF";
    }
}


function ytplayer_pause() {
    ytplayer_state('pause_status', 'fail');

    injectScript("var a = document.getElementById('c4-player') || document.getElementById('movie_player');\
                   if (a != null)\
                      if (a.pauseVideo != null){\
                          a.pauseVideo();\
                          var n = document.getElementById('ytpc_ytplayer_state');\
                          if (n) n.setAttribute('pause_status', 'success');\
                      }\
                  ");
}


function ytplayer_quality(def) {
    ytplayer_state('quality_status', 'fail');

    injectScript("var a = document.getElementById('c4-player') || document.getElementById('movie_player');\
                   if (a != null)\
                      if (a.setPlaybackQuality != null){\
                          a.setPlaybackQuality('" + def + "');\
                          var n = document.getElementById('ytpc_ytplayer_state');\
                          if (n) n.setAttribute('quality_status', 'success');\
                      }\
                  ");
}


//==============================================================
//preferences

init_pref("ytPause", false);
init_pref("ytPauseEnd", false);
init_pref("ytDef", "default");
init_pref("ytLoop", false);
init_pref("ytCine", false);
init_pref("ytHide", true);
init_pref("ytAnnot", false);
init_pref("ytAds", false);
init_pref("ytAdsExtra", false);
init_pref("ytAutoPlay", false);
init_pref("ytFloat", false);
init_pref("ytLoad", false);


function close_ytplayer_options() {
    var popup = doc.getElementById("ytpc_options_popup");
    if (popup) popup.parentNode.removeChild(popup);
}


function new_checkbox(prefname, str, node_kind, parent, value, func, hide1, hide2) {
    var div = newNode(node_kind, null, "ytpc_generic", parent);
    var input = newNode("input", null, "ytpc_generic", div);
    input.type = "checkbox";
    if (!value) {
        input.checked = get_pref(prefname);
        if (hide1 && !input.checked) parent.setAttribute("hide", "true");
        input.onclick = function (e) {
            var val = get_pref(prefname);
			if (hide2 && parent.getAttribute("hide")) val = !val; //no change if hidden
            set_pref(prefname, !val);
            e.target.checked = !val;
            if (hide1)
                if (!val)
                    parent.removeAttribute("hide");
                else
                    parent.setAttribute("hide", "true");
            if (func) func();
        };
    }
    else {
        input.value = value;
        input.checked = (get_pref(prefname) == input.value);
        input.onclick = function (e) {
            var val = get_pref(prefname);
            set_pref(prefname, e.target.value);
            e.target.checked = true;
            var other = innersearch(parent.parentNode, ".//input[@value='" + val + "']").snapshotItem(0);
            if (other) other.checked = false;
            if (func) func();
        };
    }
    var span = newNode("span", null, "ytpc_generic", div);
    span.textContent = str;
    if (hide2) div.setAttribute("hide", "true");
}


function ytplayer_options() {
    var popup = doc.getElementById("ytpc_options_popup");
    if (popup) return;

    var parent = doc.getElementById("ytpc_ytcontrol_container");
    if (!parent) return;

    popup = newNode("span", "ytpc_options_popup", null, parent.parentNode);
    parent.parentNode.parentNode.style.overflow = "visible";

    var title_node = newNode("div", null, "ytpc_options_title", popup);
    title_node.textContent = "YouTube Player Controls";

    var closemark = newNode("span", null, "ytpc_options_close", popup);
    closemark.textContent = "\u2716";
    closemark.title = "close";
    closemark.onclick = close_ytplayer_options;

    var groupCine = newNode("div", null, "ytpc_options_group column", popup);
    new_checkbox("ytCine", "Fill Window", "span", groupCine, null, function () { resetTheaterMode(); win.location.reload(); }, true, false);
    new_checkbox("ytHide", "Auto Hide Search", "span", groupCine, null, function () { cinema(0); }, false, true);

	var groupFloat = newNode("div", null, "ytpc_options_group column", popup);
    new_checkbox("ytFloat", "Float Video", "span", groupFloat, null, function () { win.location.reload(); });
	new_checkbox("ytAutoPlay", "Disable Autoplay", "span", groupFloat, null, function () { reset_nochanges(); autoplay(20); });

	var groupAdds = newNode("div", null, "ytpc_options_group column", popup);
	new_checkbox("ytAnnot", "Hide Annotations", "span", groupAdds, null, annotation);
    new_checkbox("ytAds", "Click Skip Ads", "span", groupAdds);

    var groupRelated = newNode("div", null, "ytpc_options_group column", popup);
	new_checkbox("ytAdsExtra", "Hide Related Ads", "span", groupRelated);
    new_checkbox("ytLoad", "Click Show More", "span", groupRelated);

	var groupPause = newNode("div", null, "ytpc_options_group column", popup);
    new_checkbox("ytPause", "Pause at Start", "span", groupPause);
    new_checkbox("ytPauseEnd", "Pause at End", "span", groupPause, null, adjust_pause_end);

    var div = newNode("div", null, "ytpc_options_text", popup);
    //default, small, medium, large, hd720, hd1080, hd1440, highres;
    div.textContent = "Resolution";
    var groupDef1 = newNode("div", null, "ytpc_options_group", popup);
    var groupDef2 = newNode("div", null, "ytpc_options_group", popup);
    new_checkbox("ytDef", "Default", "span", groupDef1, "default");
    new_checkbox("ytDef", "LQ 240", "span", groupDef1, "small");
    new_checkbox("ytDef", "MQ 360", "span", groupDef1, "medium");
    new_checkbox("ytDef", "HQ 480", "span", groupDef1, "large");
    new_checkbox("ytDef", "HD 720", "span", groupDef2, "hd720");
    new_checkbox("ytDef", "HD 1080", "span", groupDef2, "hd1080");
    new_checkbox("ytDef", "HD 1440", "span", groupDef2, "hd1440");
    new_checkbox("ytDef", "MAX", "span", groupDef2, "highres");
}


function build_yt_control() {
    if (doc.getElementById("ytpc_ytcontrol_container")) return;

    var parent = doc.getElementById("gridtube_title_container");
    if (!parent) {
        var pp = docsearch("//ytd-video-primary-info-renderer").snapshotItem(0);
        if (!pp) return;
        parent = newNode("span", "gridtube_title_container", null, pp, 'first');
    }
    if (!parent) return;

    var node = newNode("span", "ytpc_ytcontrol_container", null, parent);
    if (!node) return;

    //control button
    var control = newNode("span", "ytpc_ytcontrol_button", null, node);
    //control.textContent = "Ctrl";
    control.title = "YouTube Player Controls";
    control.onclick = ytplayer_options;

    //loop button
    var loop = newNode("span", "ytpc_ytcontrol_loop", null, node);
    loop.onclick = adjust_loop;
    var img = newNode("img", null, null, loop);
    img.src = loopsrc;
    adjust_loop("noflip");
}


//==================================================================
//Theater mode

function setTheaterMode() {
    var thnode = docsearch("//*[@class='ytp-chrome-controls']//*[@title='Theater mode']").snapshotItem(0);
    if (thnode) simulClick(thnode);
}

function resetTheaterMode() {
    var thnode = docsearch("//*[@class='ytp-chrome-controls']//*[@title='Default view']").snapshotItem(0);
    if (thnode) simulClick(thnode);
}

function showmast(movetop) {
    var mastoffset = doc.getElementById("masthead-container");
    if (mastoffset) { 
		mastoffset.removeAttribute("ytpc_hide"); 
		if (!movetop)
			mastoffset.parentNode.removeAttribute("ytpc_top"); 
	}
}

function hidemast(movetop) {
    var mastoffset = doc.getElementById("masthead-container");
    if (mastoffset) { 
		mastoffset.setAttribute("ytpc_hide", ""); 
		if (movetop)
			mastoffset.parentNode.setAttribute("ytpc_top", ""); 
	}
}

function cinema(start_count) {

    //not video page
    if (win.location.href.indexOf("watch?") == -1) {
        showmast(false);
        insertStyle("", "ytpc_style_cinemode");
        return;
    }

    //video page
    if (!get_pref("ytCine")) return;

    var page = docsearch("//ytd-page-manager/ytd-watch").snapshotItem(0);
    if (!page) return;

    setTheaterMode();

    if (page.hasAttribute("theater"))
        page.parentNode.parentNode.setAttribute("ytpc_cinema", "");
    else 
        page.parentNode.parentNode.removeAttribute("ytpc_cinema");

    var hide = get_pref("ytHide");

    var H = doc.documentElement.clientHeight || doc.body.clientHeight;
    var W = doc.documentElement.clientWidth || doc.body.clientWidth;

    var height = H - (hide ? 0 : 56);
    var width = (height * 16) / 9;
    if (width > W) {
        width = W;
        height = (width * 9) / 16;
    }

    if (hide) {
        if (H >= height + 56) {
            showmast(false);
        }
        else {
			hidemast(true);
            if (doc.body.scrollTop || doc.documentElement.scrollTop)
                showmast(true);
        }
    }
    else
        showmast(false);

    //resized or first adjustment
    if (start_count > 5) return;

    var left = Math.round((W - width) / 2);
    height = Math.round(height);
    width = Math.round(width);

    insertStyle("\
        ytd-watch[theater]:not([float]) #player {height: " + height + "px !important; max-height:" + height + "px !important; min-height:" + height + "px !important;}\
        ytd-watch[theater]:not([float]) .html5-main-video {width: " + width + "px !important; height: " + height + "px !important; left: " + left + "px !important; margin-left:0px !important;}\
        ytd-watch[theater]:not([float]) .player-height {height: " + height + "px !important;}\
        ytd-watch[theater]:not([float]) .player-width {width: " + width + "px !important; left: " + left + "px !important; margin-left:0px !important;}\
        ", "ytpc_style_cinemode");
}

//==================================================================
// Float

var floatbot = 0;
var floatheight = 0;

function float() {
	if (!get_pref("ytFloat")) return;
	var cine = get_pref("ytCine");

	var page = docsearch("//ytd-page-manager/ytd-watch").snapshotItem(0);
	var vid = doc.getElementsByClassName("html5-video-player");
	if (!page || vid.length == 0) return;

	var scrollT = doc.body.scrollTop || doc.documentElement.scrollTop;
	var val = vid[0].getBoundingClientRect();
	var vwidth = val.right - val.left;
	var vheight = val.bottom - val.top;
	var vbottom = val.bottom;
	//alert(vbottom);

	var W = doc.body.clientWidth || doc.documentElement.clientWidth;
	var height = 240;
	var width = 426;
	var left = Math.round((W - width) / 2);

	var singlecolumn = W/vwidth < (vwidth <= 426 ? 1.55 : (vwidth <= 854 ? 1.40 : 1.30));
	var intheater = page.getAttribute("theater") != null;
	var infloat = page.getAttribute("float") != null;
	var inpltop = (docsearch("//*[@ytpc_top]").snapshotLength > 0);
	//alert(intheater);

	if (cine && intheater) {
		if (!infloat) {
			floatheight = vheight;
			if (inpltop) floatbot = vheight - 40;
			else floatbot = vheight + 20;
		}
	}
	else if (singlecolumn && !intheater) floatbot = vheight + 24;
	else if (intheater) floatbot = vheight + 20;
	else floatbot = 24;

	var thres = 0;

	if (cine && intheater) {
		if (inpltop) thres = floatheight - 296;
		else thres = floatheight - 240;
		if (floatheight <= 0) thres = scrollT + 1;
	}

	if (scrollT >= thres) {
		page.setAttribute("float","");
		page.parentNode.parentNode.setAttribute("float","");

		if (cine && intheater)
			insertStyle("\
				ytd-watch[theater][float] #player {position: fixed !important; top:" + 56 + "px !important; z-index:1000 !important;}\
				ytd-watch[theater][float] #player {height: " + height + "px !important; max-height:" + height + "px !important; min-height:" + height + "px !important;}\
				ytd-watch[theater][float] .html5-main-video {width: " + width + "px !important; height: " + height + "px !important; left: " + left + "px !important; margin-left:0px !important;}\
				ytd-watch[theater][float] .player-height {height: " + height + "px !important;}\
				ytd-watch[theater][float] .player-width {width: " + width + "px !important; left: " + left + "px !important; margin-left:0px !important;}\
				ytd-watch[theater][float] #top {margin-top: " + floatbot + "px !important;}\
				ytd-watch[theater][float] #container {margin-top: 0px !important;}\
				", "ytpc_style_float");
		else
			insertStyle("\
				ytd-watch[float] #player {position: fixed !important; top:" + (intheater ? 56 : 80) + "px; z-index:1000 !important;}\
				ytd-watch[float] #top {margin-top: " + floatbot + "px !important;}\
				ytd-watch[float] #container {margin-top: 0px !important;}\
				", "ytpc_style_float");
	}
	else {
		page.removeAttribute("float");
		page.parentNode.parentNode.removeAttribute("float");
		insertStyle("", "ytpc_style_float");
	}
}


//==================================================================
// autoplay

function autoplay(start_count) {
    var anode = docsearch("//*[@id='items']/ytd-compact-autoplay-renderer").snapshotItem(0);
    var cnode = docsearch("//paper-toggle-button").snapshotItem(0);
    //if (anode) insertStyle(style_autoplay, "ytpc_style_autoplay");
    if (!anode || !cnode) return;

    if (get_pref("ytAutoPlay")) {
        if (!anode.getAttribute("ytpc_disable_autoplay"))
            if (cnode.getAttribute('aria-pressed') == "true") {
                if (start_count >= 5) { //give delay for first time
                    var abutton = docsearch("//*[@id='toggleButton']").snapshotItem(0);
                    if (abutton) {
                        simulClick(abutton);
                    }
                }
            }
            else {
                insertStyle(style_autoplay, "ytpc_style_autoplay");
                anode.setAttribute("ytpc_disable_autoplay", "true");
            }
    }
    else {
        insertStyle("", "ytpc_style_autoplay");
        anode.removeAttribute("ytpc_disable_autoplay");
    }
}


//=================================================================
//ads & annotations

function skip_ads() {
    if (!get_pref("ytAds")) return;

    var button = doc.getElementsByClassName("videoAdUiSkipButton videoAdUiAction");
    if (button.length > 0)
        if (button[0].parentNode)
            if (button[0].parentNode.style.display != "none") {
                //message("will click");
                simulClick(button[0]);
            }
}

function extra_ads() {
    insertStyle(get_pref("ytAdsExtra") ? style_extra_ads : "", "ytpc_style_extra_ads");
}

function annotation() {
    insertStyle(get_pref("ytAnnot") ? style_annotations : "", "ytpc_style_annotations");
}


//==================================================================
//Load More

function auto_load(start_count) {
    if (!get_pref("ytLoad")) return;
	if (win.location.href.indexOf("watch?") == -1) return;

    var button1 = docsearch("//div[@id='related']//paper-button[contains(@class,'yt-next-continuation') and not(@buttonclicked)]").snapshotItem(0);	
	if (button1) {
		var scrollMaxY = win.scrollMaxY || (doc.documentElement.scrollHeight - doc.documentElement.clientHeight);
		var rect = button1.getBoundingClientRect();
		//message(rect.top + "  " +   win.pageYOffset);
		if (2 * win.innerHeight >= rect.top) {
			simulClick(button1);
			button1.setAttribute("buttonclicked", "true");
		}
	}

	var button2 = docsearch("//div[@id='container']//paper-button[(@id='more')"+((start_count>1)?" and not(@buttonclicked)]":"]")).snapshotItem(0);
	if (button2){
		simulClick(button2);
		button2.setAttribute("buttonclicked", "true");
	}
}


//==================================================================
// Main

var old_addr = win.location.href;
var nochanges_count = -1;
var start_count = -1;
//for yt_start
var pause_count = 0;
var def_count = 0;
var pref_ytPause = false;
var pref_ytDef = 'default';

ytplayer_script();
insertStyle(style_basic, "ytpc_style_basic");

win.addEventListener("focus", function () { reset_nochanges() }, false);
win.addEventListener("blur", function () { reset_nochanges() }, false);
win.addEventListener("resize", function () { reset_nochanges(); cinema(0); float(); auto_load(20); }, false);
win.addEventListener("scroll", function () { reset_nochanges(); cinema(0); float(); auto_load(20); }, false);
win.addEventListener("click", function () { reset_nochanges(); }, false);

function reset_nochanges() { nochanges_count = -1; }

function yt_start() {
    if (start_count == 0) {
        pause_count = 0;
        def_count = 0;
        pref_ytPause = get_pref('ytPause');
        pref_ytDef = get_pref('ytDef');
    }

    if (pref_ytPause && pause_count <= 1) {
        ytplayer_pause();
        if (success_pause()) pause_count++;
    }

    if (pref_ytDef != 'default' && def_count <= 1) {
        ytplayer_quality(pref_ytDef);
        if (success_quality()) def_count++;
    }
}


//main routine
function check_changes() {
    if (old_addr == win.location.href) {
        if (nochanges_count < 20) nochanges_count++;
        if (start_count < 20) start_count++;
    }
    else {
        old_addr = win.location.href;
        nochanges_count = 0;
        start_count = 0;
    }

    //no video page
    if (win.location.href.indexOf("watch?") == -1) {
        if (start_count < 20) {
            set_noloop();
            set_nopause_end();
            cinema(20, true); //for showmast
        }
        return;
    }

    //video page
    skip_ads();

    if (start_count < 20) {
        if (start_count == 0) {
            close_ytplayer_options();
            adjust_loop("noflip");
            adjust_pause_end();
        }
        build_yt_control();
        yt_start();
        annotation();
		extra_ads();
        auto_load(start_count);
    }

    if (nochanges_count < 20) {
        cinema(start_count);
        autoplay(start_count);
		float();
    }
}

win.setInterval(check_changes, 1000);
check_changes();