mirror of
https://github.com/SoPat712/videospeed.git
synced 2025-08-21 18:08:46 -04:00
Merge branch 'master' into webextensions-port
# Conflicts: # inject.js
This commit is contained in:
@@ -44,7 +44,7 @@
|
|||||||
/* shift YT 3D controller down */
|
/* shift YT 3D controller down */
|
||||||
/* e.g. https://www.youtube.com/watch?v=erftYPflJzQ */
|
/* e.g. https://www.youtube.com/watch?v=erftYPflJzQ */
|
||||||
.ytp-webgl-spherical-control {
|
.ytp-webgl-spherical-control {
|
||||||
top: 50px !important;
|
top: 60px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ytp-fullscreen .ytp-webgl-spherical-control {
|
.ytp-fullscreen .ytp-webgl-spherical-control {
|
||||||
|
45
inject.js
45
inject.js
@@ -2,6 +2,7 @@ chrome.runtime.sendMessage({}, function(response) {
|
|||||||
var tc = {
|
var tc = {
|
||||||
settings: {
|
settings: {
|
||||||
speed: 1.0, // default 1x
|
speed: 1.0, // default 1x
|
||||||
|
resetSpeed: 1.0, // default 1x
|
||||||
speedStep: 0.1, // default 0.1x
|
speedStep: 0.1, // default 0.1x
|
||||||
rewindTime: 10, // default 10s
|
rewindTime: 10, // default 10s
|
||||||
advanceTime: 10, // default 10s
|
advanceTime: 10, // default 10s
|
||||||
@@ -12,6 +13,7 @@ chrome.runtime.sendMessage({}, function(response) {
|
|||||||
advanceKeyCode: 88, // default: X
|
advanceKeyCode: 88, // default: X
|
||||||
displayKeyCode: 86, // default: V
|
displayKeyCode: 86, // default: V
|
||||||
rememberSpeed: false, // default: false
|
rememberSpeed: false, // default: false
|
||||||
|
startHidden: false, // default: false
|
||||||
blacklist: `
|
blacklist: `
|
||||||
www.instagram.com
|
www.instagram.com
|
||||||
twitter.com
|
twitter.com
|
||||||
@@ -23,6 +25,7 @@ chrome.runtime.sendMessage({}, function(response) {
|
|||||||
|
|
||||||
chrome.storage.local.get(tc.settings, function(storage) {
|
chrome.storage.local.get(tc.settings, function(storage) {
|
||||||
tc.settings.speed = Number(storage.speed);
|
tc.settings.speed = Number(storage.speed);
|
||||||
|
tc.settings.resetSpeed = Number(storage.resetSpeed);
|
||||||
tc.settings.speedStep = Number(storage.speedStep);
|
tc.settings.speedStep = Number(storage.speedStep);
|
||||||
tc.settings.rewindTime = Number(storage.rewindTime);
|
tc.settings.rewindTime = Number(storage.rewindTime);
|
||||||
tc.settings.advanceTime = Number(storage.advanceTime);
|
tc.settings.advanceTime = Number(storage.advanceTime);
|
||||||
@@ -33,6 +36,7 @@ chrome.runtime.sendMessage({}, function(response) {
|
|||||||
tc.settings.displayKeyCode = Number(storage.displayKeyCode);
|
tc.settings.displayKeyCode = Number(storage.displayKeyCode);
|
||||||
tc.settings.advanceKeyCode = Number(storage.advanceKeyCode);
|
tc.settings.advanceKeyCode = Number(storage.advanceKeyCode);
|
||||||
tc.settings.rememberSpeed = Boolean(storage.rememberSpeed);
|
tc.settings.rememberSpeed = Boolean(storage.rememberSpeed);
|
||||||
|
tc.settings.startHidden = Boolean(storage.startHidden);
|
||||||
tc.settings.blacklist = String(storage.blacklist);
|
tc.settings.blacklist = String(storage.blacklist);
|
||||||
|
|
||||||
initializeWhenReady(document);
|
initializeWhenReady(document);
|
||||||
@@ -48,6 +52,7 @@ chrome.runtime.sendMessage({}, function(response) {
|
|||||||
this.id = Math.random().toString(36).substr(2, 9);
|
this.id = Math.random().toString(36).substr(2, 9);
|
||||||
if (!tc.settings.rememberSpeed) {
|
if (!tc.settings.rememberSpeed) {
|
||||||
tc.settings.speed = 1.0;
|
tc.settings.speed = 1.0;
|
||||||
|
tc.settings.resetSpeed = 1.0;
|
||||||
}
|
}
|
||||||
this.initializeControls();
|
this.initializeControls();
|
||||||
|
|
||||||
@@ -193,7 +198,7 @@ chrome.runtime.sendMessage({}, function(response) {
|
|||||||
// Ignore keydown event if typing in an input box
|
// Ignore keydown event if typing in an input box
|
||||||
if ((document.activeElement.nodeName === 'INPUT'
|
if ((document.activeElement.nodeName === 'INPUT'
|
||||||
&& document.activeElement.getAttribute('type') === 'text')
|
&& document.activeElement.getAttribute('type') === 'text')
|
||||||
|| document.activeElement.nodeName === 'TEXTAREA'
|
|| document.activeElement.nodeName === 'TEXTAREA'
|
||||||
|| document.activeElement.isContentEditable) {
|
|| document.activeElement.isContentEditable) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -218,15 +223,7 @@ chrome.runtime.sendMessage({}, function(response) {
|
|||||||
function checkForVideo(node, parent, added) {
|
function checkForVideo(node, parent, added) {
|
||||||
if (node.nodeName === 'VIDEO') {
|
if (node.nodeName === 'VIDEO') {
|
||||||
if (added) {
|
if (added) {
|
||||||
if (!node.classList.contains('vsc-initialized') && !node.dataset['vscid']) {
|
if (!node.dataset['vscid']) {
|
||||||
new tc.videoController(node, parent);
|
|
||||||
}
|
|
||||||
// if the video has already been initialized, then it has been mutated
|
|
||||||
// we may need to update the controller location to reflect this
|
|
||||||
else {
|
|
||||||
let id = node.dataset['vscid'];
|
|
||||||
let ctrl = document.querySelector(`div[data-vscid="${id}"]`);
|
|
||||||
if (ctrl) ctrl.remove();
|
|
||||||
new tc.videoController(node, parent);
|
new tc.videoController(node, parent);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -235,6 +232,7 @@ chrome.runtime.sendMessage({}, function(response) {
|
|||||||
let ctrl = document.querySelector(`div[data-vscid="${id}"]`)
|
let ctrl = document.querySelector(`div[data-vscid="${id}"]`)
|
||||||
if (ctrl) {
|
if (ctrl) {
|
||||||
node.classList.remove('vsc-initialized');
|
node.classList.remove('vsc-initialized');
|
||||||
|
delete node.dataset['vscid'];
|
||||||
ctrl.remove();
|
ctrl.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -284,8 +282,7 @@ chrome.runtime.sendMessage({}, function(response) {
|
|||||||
var id = v.dataset['vscid'];
|
var id = v.dataset['vscid'];
|
||||||
var controller = document.querySelector(`div[data-vscid="${id}"]`);
|
var controller = document.querySelector(`div[data-vscid="${id}"]`);
|
||||||
|
|
||||||
if (keyboard)
|
showController(controller);
|
||||||
showController(controller);
|
|
||||||
|
|
||||||
if (!v.classList.contains('vsc-cancelled')) {
|
if (!v.classList.contains('vsc-cancelled')) {
|
||||||
if (action === 'rewind') {
|
if (action === 'rewind') {
|
||||||
@@ -294,16 +291,24 @@ chrome.runtime.sendMessage({}, function(response) {
|
|||||||
v.currentTime += tc.settings.advanceTime;
|
v.currentTime += tc.settings.advanceTime;
|
||||||
} else if (action === 'faster') {
|
} else if (action === 'faster') {
|
||||||
// Maximum playback speed in Chrome is set to 16:
|
// Maximum playback speed in Chrome is set to 16:
|
||||||
// https://code.google.com/p/chromium/codesearch#chromium/src/media/blink/webmediaplayer_impl.cc&l=64
|
// https://cs.chromium.org/chromium/src/media/blink/webmediaplayer_impl.cc?l=103
|
||||||
var s = Math.min(v.playbackRate + tc.settings.speedStep, 16);
|
var s = Math.min(v.playbackRate + tc.settings.speedStep, 16);
|
||||||
v.playbackRate = Number(s.toFixed(2));
|
v.playbackRate = Number(s.toFixed(2));
|
||||||
} else if (action === 'slower') {
|
} else if (action === 'slower') {
|
||||||
// Audio playback is cut at 0.05:
|
// Audio playback is cut at 0.05:
|
||||||
// https://code.google.com/p/chromium/codesearch#chromium/src/media/filters/audio_renderer_algorithm.cc&l=49
|
// https://cs.chromium.org/chromium/src/media/filters/audio_renderer_algorithm.cc?l=49
|
||||||
var s = Math.max(v.playbackRate - tc.settings.speedStep, 0);
|
// Video min rate is 0.0625:
|
||||||
|
// https://cs.chromium.org/chromium/src/media/blink/webmediaplayer_impl.cc?l=102
|
||||||
|
var s = Math.max(v.playbackRate - tc.settings.speedStep, 0.0625);
|
||||||
v.playbackRate = Number(s.toFixed(2));
|
v.playbackRate = Number(s.toFixed(2));
|
||||||
} else if (action === 'reset') {
|
} else if (action === 'reset') {
|
||||||
v.playbackRate = 1.0;
|
if(v.playbackRate === 1.0) {
|
||||||
|
v.playbackRate = tc.settings.resetSpeed;
|
||||||
|
} else {
|
||||||
|
tc.settings.resetSpeed = v.playbackRate;
|
||||||
|
chrome.storage.sync.set({'resetSpeed': v.playbackRate});
|
||||||
|
v.playbackRate = 1.0;
|
||||||
|
}
|
||||||
} else if (action === 'close') {
|
} else if (action === 'close') {
|
||||||
v.classList.add('vsc-cancelled');
|
v.classList.add('vsc-cancelled');
|
||||||
controller.remove();
|
controller.remove();
|
||||||
@@ -329,11 +334,9 @@ chrome.runtime.sendMessage({}, function(response) {
|
|||||||
shadowController.classList.add('dragging');
|
shadowController.classList.add('dragging');
|
||||||
|
|
||||||
const startDragging = (e) => {
|
const startDragging = (e) => {
|
||||||
let newLeft = Math.max(0, e.clientX - offsetLeft);
|
let style = shadowController.style;
|
||||||
let newTop = Math.max(0, e.clientY - offsetTop);
|
style.left = parseInt(style.left) + e.movementX + 'px';
|
||||||
|
style.top = parseInt(style.top) + e.movementY + 'px';
|
||||||
shadowController.style.left = newLeft + 'px';
|
|
||||||
shadowController.style.top = newTop + 'px';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const stopDragging = () => {
|
const stopDragging = () => {
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "Video Speed Controller",
|
"name": "Video Speed Controller",
|
||||||
"short_name": "videospeed",
|
"short_name": "videospeed",
|
||||||
"version": "0.4.2",
|
"version": "0.4.4",
|
||||||
"manifest_version": 2,
|
"manifest_version": 2,
|
||||||
"description": "Speed up, slow down, advance and rewind any HTML5 video with quick shortcuts.",
|
"description": "Speed up, slow down, advance and rewind any HTML5 video with quick shortcuts.",
|
||||||
"homepage_url": "https://github.com/codebicycle/videospeed",
|
"homepage_url": "https://github.com/codebicycle/videospeed",
|
||||||
|
@@ -36,6 +36,10 @@
|
|||||||
<label for="displayKeyInput">Show/hide controller</label>
|
<label for="displayKeyInput">Show/hide controller</label>
|
||||||
<input id="displayKeyInput" placeholder="press a key" type="text" value=""/>
|
<input id="displayKeyInput" placeholder="press a key" type="text" value=""/>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<label for="rememberSpeed">Hide controller by default</label>
|
||||||
|
<input id="startHidden" type="checkbox"/>
|
||||||
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
|
@@ -10,6 +10,7 @@ var tcDefaults = {
|
|||||||
advanceKeyCode: 88, // default: X
|
advanceKeyCode: 88, // default: X
|
||||||
displayKeyCode: 86, // default: V
|
displayKeyCode: 86, // default: V
|
||||||
rememberSpeed: false, // default: false
|
rememberSpeed: false, // default: false
|
||||||
|
startHidden: false, // default: false
|
||||||
blacklist: `
|
blacklist: `
|
||||||
www.instagram.com
|
www.instagram.com
|
||||||
twitter.com
|
twitter.com
|
||||||
@@ -98,6 +99,7 @@ function save_options() {
|
|||||||
var fasterKeyCode = document.getElementById('fasterKeyInput').keyCode;
|
var fasterKeyCode = document.getElementById('fasterKeyInput').keyCode;
|
||||||
var displayKeyCode = document.getElementById('displayKeyInput').keyCode;
|
var displayKeyCode = document.getElementById('displayKeyInput').keyCode;
|
||||||
var rememberSpeed = document.getElementById('rememberSpeed').checked;
|
var rememberSpeed = document.getElementById('rememberSpeed').checked;
|
||||||
|
var startHidden = document.getElementById('startHidden').checked;
|
||||||
var blacklist = document.getElementById('blacklist').value;
|
var blacklist = document.getElementById('blacklist').value;
|
||||||
|
|
||||||
speedStep = isNaN(speedStep) ? tcDefaults.speedStep : Number(speedStep);
|
speedStep = isNaN(speedStep) ? tcDefaults.speedStep : Number(speedStep);
|
||||||
@@ -121,6 +123,7 @@ function save_options() {
|
|||||||
fasterKeyCode: fasterKeyCode,
|
fasterKeyCode: fasterKeyCode,
|
||||||
displayKeyCode: displayKeyCode,
|
displayKeyCode: displayKeyCode,
|
||||||
rememberSpeed: rememberSpeed,
|
rememberSpeed: rememberSpeed,
|
||||||
|
startHidden: startHidden,
|
||||||
blacklist: blacklist.replace(/^\s+|\s+$/gm,'')
|
blacklist: blacklist.replace(/^\s+|\s+$/gm,'')
|
||||||
}, function() {
|
}, function() {
|
||||||
// Update status to let user know options were saved.
|
// Update status to let user know options were saved.
|
||||||
@@ -145,6 +148,7 @@ function restore_options() {
|
|||||||
updateShortcutInputText('fasterKeyInput', storage.fasterKeyCode);
|
updateShortcutInputText('fasterKeyInput', storage.fasterKeyCode);
|
||||||
updateShortcutInputText('displayKeyInput', storage.displayKeyCode);
|
updateShortcutInputText('displayKeyInput', storage.displayKeyCode);
|
||||||
document.getElementById('rememberSpeed').checked = storage.rememberSpeed;
|
document.getElementById('rememberSpeed').checked = storage.rememberSpeed;
|
||||||
|
document.getElementById('startHidden').checked = storage.startHidden;
|
||||||
document.getElementById('blacklist').value = storage.blacklist;
|
document.getElementById('blacklist').value = storage.blacklist;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user