您需要先安装一个扩展,例如 篡改猴、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(); }) ();