您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Crop videos on youtube
- // ==UserScript==
- // @name Youtube video crop
- // @namespace http://tampermonkey.net/
- // @version 0.1.2
- // @description Crop videos on youtube
- // @locale en
- // @author You
- // @match *://www.youtube.com/*
- // @require https://code.jquery.com/jquery-3.2.1.min.js
- // @grant none
- // ==/UserScript==
- (function () {
- 'use strict';
- var DEBUG = false;
- function injectCSS(css) {
- var styleTag = $('<style>' + css + '</style>');
- $('html > head').append(styleTag);
- console.log('injected css:', css);
- }
- injectCSS(
- '#_area_overlay{' +
- 'display: none; position: absolute; pointer-events: none; ' +
- 'top: 0: left: 0; z-index:10; ' +
- 'background: rgba(255, 0, 0, 0.3); ' +
- '} ' +
- '._stupid_btn{'+
- 'vertical-align: top; font-weight: bold; ' +
- 'width: auto !important; '+
- 'padding-right: 5px; padding-left: 5px;' +
- '}'
- );
- var _is_down = false;
- var _area_updating = false;
- var sx,sy;
- var sx_,sy_;
- var ex,ey;
- var scale = 1;
- var overlay;
- var _is_cropped = false;
- function scale_video(x, y, scale) {
- injectCSS('.video-stream{ transform: ' +
- 'translate(-50%, -50%) ' +
- 'scale(' + scale + ') ' +
- 'translate(50%, 50%) ' +
- 'translate(-' + x + '%, -' + y + '%)' +
- '}');
- }
- function _update_area() {
- var player = $('.video-stream');
- var vwidth = player.width();
- var vheight = player.height();
- scale_video(sx, sy, scale);
- overlay.css('display', 'none');
- _area_updating = false;
- }
- function setup_cropper(){
- if(DEBUG) console.debug('Try setting up cropper.');
- if( $('.video-stream').length == 0) return;
- if(DEBUG) console.debug('Video stream found.');
- overlay = $('#_area_overlay');
- if(overlay.length > 0){
- if(DEBUG) console.debug('Overlay already present.');
- }else{
- if(DEBUG) console.debug('Creating overlay.');
- overlay = $('<div id="_area_overlay"></div>');
- $('body').append(overlay);
- if(DEBUG) console.debug('Adding buttons.');
- // we just assume if there is no overlay there are also no new buttons.
- $('.ytp-right-controls').prepend('<button class="_stupid_btn ytp-button" title="Crop video" id="_btn_crop">Crop</button>');
- // area calculation
- if(DEBUG) console.debug('Setting up area calulation event handler.');
- sx = sy = ex = ey = sx_ = sy_ = 0;
- $('#player').mousedown(function (e) {
- if (!_area_updating) return;
- _is_down = true;
- var vwidth = $('.video-stream').width();
- var vheight = $('.video-stream').height();
- var offset = $('.video-stream').offset();
- sx_ = (e.pageX - offset.left);
- sy_ = (e.pageY - offset.top);
- sx = ((100 / vwidth) * sx_);
- sy = ((100 / vheight) * sy_);
- overlay.css('top', e.pageY + 'px');
- overlay.css('left', e.pageX + 'px');
- });
- $('#player').mouseup(function (e) {
- if ((!_area_updating) || (!_is_down)) return;
- _is_down = false;
- _update_area();
- });
- $('#player').mousemove(function (e) {
- if ((!_area_updating) || (!_is_down)) return;
- var vwidth = $('.video-stream').width();
- var offset = $('.video-stream').offset();
- ex = (e.pageX - offset.left);
- ey = (e.pageY - offset.top);
- scale = (vwidth * 1) / (ex - sx_);
- overlay.css('width', (ex - sx_) + 'px');
- overlay.css('height', (ey - sy_) + 'px');
- });
- $('#player').mouseleave(function (e) {
- if ((!_area_updating) || (!_is_down)) return;
- _is_down = false;
- _update_area();
- });
- // UI buttons
- var btn = "#_btn_crop";
- if(DEBUG){
- console.debug('Setting up UI button handler.');
- var button = $('<button id="_dbg_btn"><h2>CROP</h2></button>');
- $('#player').prepend(button);
- btn += ", #_dbg_btn";
- }
- $(btn).click(function (e) {
- if(_is_cropped){
- injectCSS('.video-stream{ transform:translate(-' + 0 + '%, ' + 0 + '%) scale(1) }');
- _is_cropped = false;
- $(btn).text('Crop');
- return;
- }
- $(btn).text('Uncrop');
- overlay.css('display', 'block');
- _is_cropped = true;
- _area_updating = true;
- });
- }
- }
- addEventListener("spfdone", setup_cropper);
- setup_cropper();
- }) ();