Video Framing Sliders - for YouTube

Gives new tools for youtbe playback

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Video Framing Sliders - for YouTube
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  Gives new tools for youtbe playback
// @author       RGSoftware
// @include     *.youtube.*/watch?v=*
// @grant        none
// @runat        document-body
// @locale       en-us
// @require      https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js
// ==/UserScript==

/*
.:Notes:.
I didn't want to use Jquery, but then I did a little. But too lazy to rewrite the vanilla javascript in jquery
*/

tools = {

    createElement: function(parent, id, eletype, value, style, className, textClassName, onclickFunc){

        parent                  = document.getElementById(parent);
        var e                   = document.createElement(eletype);
        e.className             = className;
        e.onclick               = onclickFunc === null ? '' : onclickFunc;
        parent.appendChild(e);
        var label               = document.createElement('span');
        label.innerHTML         = value;
        label.className         = textClassName;

        e.setAttribute('style', style);
        e.appendChild(label);

        return e; // return handle
    },

    toggle: false,
    toggleTools : function(motherEle, toolsDiv){

        tools.toggle = !tools.toggle;
        /*
        var x = document.getElementById(e);
        var z = document.getElementById(toolsDiv);
        */
        var animSpeed = 500;
        var e = $("#"+toolsDiv);

        if (tools.toggle){

            e.animate({height: "150px"}, animSpeed);
            /*
             $("#"+motherEle).animate({minHeight: "300px"}, animSpeed);
             x.setAttribute("style", "min-height:300px");
             z.style.height = "150px";
            */
        }else{
            e.animate({height: "0px"}, animSpeed);
            /*
            $("#"+motherEle).animate({minHeight: "150px"}, animSpeed);
            z.style.height = "0px"
            x.setAttribute("style", "min-height:150px");
            */

        }
    },
    createElementAlt : function(elementType, data, type, className, style, id, parent){

        var e  = document.createElement(elementType);
        parent = document.getElementById(parent);

        switch (elementType.toUpperCase()){

            case "INPUT":

                e.setAttribute('type', type);
                e.value     = data;
                break;

            case "BUTTON":

                e.value     = data;
                break;

            case "SPAN":

                e.innerHTML = data;
                break;
        }

        e.id        = id;
        e.innerHTML = data;
        e.value     = data;
        e.className = className;
        e.setAttribute('style', style);
        parent.appendChild(e);

    },
};

/*Some constants, infos*/
var youtube = {
    btnStyle1 : 'yt-uix-button yt-uix-button-size-default yt-uix-button-opacity yt-uix-button-has-icon no-icon-markup pause-resume-autoplay action-panel-trigger action-panel-trigger-share   yt-uix-tooltip',
    btnStyle2 : 'yt-uix-button yt-uix-button-size-default yt-uix-button-opacity yt-uix-button-has-icon no-icon-markup pause-resume-autoplay yt-uix-menu-trigger yt-uix-tooltip',
};


/* Main elements creation */

//div
tools.createElementAlt("div", '', '', '', 'height:0px; overflow:hidden;', 'myDiv', 'watch-header'); //watch8-secondary-actions //height:153px; width:843px;
var toolsDiv = document.getElementById('myDiv');

var toggleToolsBtn = tools.createElement("watch8-secondary-actions", "myBtn", "button", "Show Tools", "", youtube.btnStyle1, "t-uix-button-content", null);
toggleToolsBtn.onclick = function(){tools.toggleTools('watch-header','myDiv');};
/*
item 1 - label
tools.createElementAlt('span', 'Scale X', '', '', '', 'scaleXSliderLabel', 'myDiv');
item 1 - Scale X Slider
tools.createElementAlt('input', '1', 'range', '', '', 'scaleXSlider', 'myDiv');
item 2 - label
tools.createElementAlt('span', 'Scale Y', '', '', '', 'scaleYSliderLabel', 'myDiv');
item 2 - Scale Y Slider
tools.createElementAlt('input', '1', 'range', '', '', 'scaleYSlider', 'myDiv');
item 3 - lock Scale checkbox
tools.createElementAlt('input', '', 'checkbox', '', '', 'lockScaleCheckbox', 'myDiv');
item 3 - lock Scale checkbox label
tools.createElementAlt('label', 'Lock Scale X+Y', '', '', '', 'LabelForCheckbox', 'myDiv');
*/

function ElementWithLabel(elementType, text, type, className, style, id, parent){

    this.elementType  = elementType;
    this.text         = text;
    this.type         = type;
    this.className    = className;
    this.style        = style;
    this.elementId    = id;
    this.labelId      = id+'-container';
    this.parent       = parent;
    //create elements first!
    tools.createElementAlt('span', this.text, '', '', '', this.labelId, this.parent); //LABEL WRAP
    tools.createElementAlt(this.elementType, '', this.type, this.className, this.style, this.elementId, this.labelId); //CHECKBOX
    //now you can return the element 'handle'
    this.labelElement = document.getElementById(this.labelId);
    this.element      = document.getElementById(this.elementId);

}

function slider(labeltext, id, parent, min, max, step, startValue){

    this.id               = id;
    this.parent           = parent;
    this.labeltext        = labeltext;
    this.min              = min;
    this.max              = max;
    this.step             = step;
    this.startValue       = startValue;
    this.create           = createSlider(this.labeltext, this.id, this.parent, this.startValue);
    this.setDefaults      = setDefaults(this.id, this.min, this.max, this.step);
    this.element          = document.getElementById(this.id);
    this.getPercentLabel  = this.id + "Percent";
    this.percentage       = this.element.value + "%";
    this.updateLabel      = function(){sliderSeeked(this.getPercentLabel, this.id);};
    // this.resetValue       = function(){resetValue(this.id);};

    this.element.ondblclick = function(){
        resetValue(this.id, startValue);
    };
    // setDefaults(this.id, -5, 5, 0.01);
}


function createSlider(labeltext, id, parent, startVal){

    var cstyle = "position:relative; top:-6px; padding:5px;"; //middle align top:-11px;
    var contParent = id+"-container";
    tools.createElementAlt('div', '', '','', 'border: 1px solid black;', contParent, parent);                       //Container
    tools.createElementAlt('span', labeltext, '', '', cstyle, id+"label", contParent);                              //Label
    tools.createElementAlt('input', startVal, 'range', '', 'width:150px;', id, contParent);                         //Slider
    tools.createElementAlt('span', startVal+"%", '', '', cstyle, id+"Percent", contParent);                         //PercentLabel
}

function sliderSeeked(percentlbl, sliderEle){

    var slider = document.getElementById(sliderEle);
    var sVal = parseFloat(slider.value).toFixed(2);
    document.getElementById(percentlbl).innerHTML = + sVal + "%"; 
}

function resetValue(e, startVal){
    var slider = document.getElementById(e);
    slider.value = startVal;   
}

function setDefaults(e, min, max, step){
    var x  = document.getElementById(e);
    x.max  = max;
    x.min  = min;
    x.step = step;
}

//slider(labeltext, id, parent)
var sliderX = new slider("Scale X", "scaleXSlider", "myDiv", -5, 5, 0.01, 1);
sliderX.element.onmousemove = function(){
    var sVal = parseFloat(sliderX.element.value).toFixed(2);
    sliderX.updateLabel();
    video.scaleX(sVal);

    if (lockScaleCheckbox.element.checked === true){
        video.scaleY(sVal);
        sliderY.element.value = sVal; 
        sliderY.updateLabel();
    }
};

var sliderY = new slider("Scale Y", "scaleYSlider", "myDiv", -5, 5, 0.01, 1);
sliderY.element.onmousemove = function(){
    var sVal = parseFloat(sliderY.element.value).toFixed(2);
    sliderY.updateLabel();
    video.scaleY(sVal);

    if (lockScaleCheckbox.element.checked === true){
        video.scaleX(sVal);
        sliderX.element.value = sVal;
        sliderX.updateLabel();
    }
};

//function ElementWithLabel(elementType, text, type, className, style, id, parent){
var lockScaleCheckbox = new ElementWithLabel('input', 'Lock Scale', 'checkbox', '','', 'scaleLock-checkbox', 'myDiv');

//if (lockScaleCheckbox.element.checked === true){
//  video.scaleY(sVal); sliderY.element.value = sVal; sliderY.updateLabel(); //LOCKED TEST ONLY
//}

//tools.createCheckboxWithLabel('input', 'lock scale', 'checkbox', '', '', 'scaleLock-checkbox', 'myDiv');


var sliderTranslateX = new slider("Translate X", "translateXSlider", "myDiv", -1000, 1000, 1, 0);
sliderTranslateX.element.onmousemove = function(){
    var sVal = parseFloat(sliderTranslateX.element.value).toFixed(2);
    sliderTranslateX.updateLabel();
    video.translateX(sVal);
};

var sliderTranslateY = new slider("Translate Y", "translateYSlider", "myDiv", -1000, 1000, 1, 0);
sliderTranslateY.element.onmousemove = function(){
    var sVal = parseFloat(sliderTranslateY.element.value).toFixed(2);
    sliderTranslateY.updateLabel();
    video.translateY(sVal);
};


//matrix(scaleX(),skewY(),skewX(),scaleY(),translateX(),translateY()):
var video = {
    g_scaleX: 1,
    g_scaleY: 1,
    g_skewX: 0,
    g_skewY: 0,
    g_translateX: 0,
    g_translateY: 0,

    matrix2d: function(){
        var vid = document.getElementsByClassName(video.className)[0];
        vid.setAttribute('style', 'transform:matrix(' + this.g_scaleX +
                         "," + this.g_skewY + 
                         "," + this.g_skewX + 
                         "," + this.g_scaleY + 
                         "," + this.g_translateX + 
                         "," + this.g_translateY + ')');
    },

    className: 'html5-video-container',

    scaleX : function(_scaleX){
        this.g_scaleX = _scaleX;
        video.matrix2d();
    },

    scaleY : function(_scaleY){
        this.g_scaleY = _scaleY;
        video.matrix2d();
    },

    translateX : function(_translateX){
        this.g_translateX = _translateX;
        video.matrix2d();
    },
    translateY : function(_translateY){
        this.g_translateY = _translateY;
        video.matrix2d();
    },
};


//var lfchkbx = document.getElementById('LabelForCheckbox');
//lfchkbx.setAttribute('for', 'lockScaleCheckbox');

//var scaleChkbx = document.getElementById('lockScaleCheckbox');
//scaleChkbx.checked = true;