mirror of
https://github.com/SoPat712/videospeed.git
synced 2025-08-21 18:08:46 -04:00
Add advance capability; Allow Changes when paused
This commit is contained in:
@@ -15,11 +15,12 @@ HTML5 video provides a native API to accelerate playback of any video. The probl
|
|||||||
|
|
||||||
#### *[Install Chrome Extension](https://chrome.google.com/webstore/detail/video-speed-controller/nffaoalbilbmmfgbnbgppjihopabppdk)*
|
#### *[Install Chrome Extension](https://chrome.google.com/webstore/detail/video-speed-controller/nffaoalbilbmmfgbnbgppjihopabppdk)*
|
||||||
|
|
||||||
Once the extension is installed simply navigate to any page that offers HTML5 video ([example](http://www.youtube.com/watch?v=E9FxNzv1Tr8)), and you'll see a speed indicator in top left corner. Hover over the indicator to reveal the controls to accelerate, slowdown, and quickly rewind the video. Or, even better, simply use your keyboard:
|
Once the extension is installed simply navigate to any page that offers HTML5 video ([example](http://www.youtube.com/watch?v=E9FxNzv1Tr8)), and you'll see a speed indicator in top left corner. Hover over the indicator to reveal the controls to accelerate, slowdown, and quickly rewind or advance the video. Or, even better, simply use your keyboard:
|
||||||
|
|
||||||
* **a** - rewind video 10 seconds.
|
* **a** - rewind video 10 seconds.
|
||||||
* **s** - decrease playback speed.
|
* **s** - decrease playback speed.
|
||||||
* **d** - increase playback speed.
|
* **d** - increase playback speed.
|
||||||
|
* **t** - advance video 10 seconds.
|
||||||
|
|
||||||
Note that you can customize these shortcuts in the extension settings page. Also, a few tips for enabling and forcing HTML5 video:
|
Note that you can customize these shortcuts in the extension settings page. Also, a few tips for enabling and forcing HTML5 video:
|
||||||
|
|
||||||
|
15
inject.js
15
inject.js
@@ -5,10 +5,12 @@ chrome.extension.sendMessage({}, function(response) {
|
|||||||
speed: 1.0, // default 1x
|
speed: 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
|
||||||
resetKeyCode: 82, // default: R
|
resetKeyCode: 82, // default: R
|
||||||
rewindKeyCode: 65, // default: A
|
rewindKeyCode: 65, // default: A
|
||||||
slowerKeyCode: 83, // default: S
|
slowerKeyCode: 83, // default: S
|
||||||
fasterKeyCode: 68, // default: D
|
fasterKeyCode: 68, // default: D
|
||||||
|
advanceKeyCode: 84, // default: T
|
||||||
rememberSpeed: false // default: false
|
rememberSpeed: false // default: false
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -18,10 +20,12 @@ chrome.extension.sendMessage({}, function(response) {
|
|||||||
tc.settings.speed = Number(storage.speed);
|
tc.settings.speed = Number(storage.speed);
|
||||||
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.resetKeyCode = Number(storage.resetKeyCode);
|
tc.settings.resetKeyCode = Number(storage.resetKeyCode);
|
||||||
tc.settings.rewindKeyCode = Number(storage.rewindKeyCode);
|
tc.settings.rewindKeyCode = Number(storage.rewindKeyCode);
|
||||||
tc.settings.slowerKeyCode = Number(storage.slowerKeyCode);
|
tc.settings.slowerKeyCode = Number(storage.slowerKeyCode);
|
||||||
tc.settings.fasterKeyCode = Number(storage.fasterKeyCode);
|
tc.settings.fasterKeyCode = Number(storage.fasterKeyCode);
|
||||||
|
tc.settings.advanceKeyCode = Number(storage.advanceKeyCode);
|
||||||
tc.settings.rememberSpeed = Boolean(storage.rememberSpeed);
|
tc.settings.rememberSpeed = Boolean(storage.rememberSpeed);
|
||||||
|
|
||||||
readyStateCheckInterval = setInterval(initializeVideoSpeed, 10);
|
readyStateCheckInterval = setInterval(initializeVideoSpeed, 10);
|
||||||
@@ -73,17 +77,20 @@ chrome.extension.sendMessage({}, function(response) {
|
|||||||
var fasterButton = document.createElement('button');
|
var fasterButton = document.createElement('button');
|
||||||
var slowerButton = document.createElement('button');
|
var slowerButton = document.createElement('button');
|
||||||
var rewindButton = document.createElement('button');
|
var rewindButton = document.createElement('button');
|
||||||
|
var advanceButton = document.createElement('button');
|
||||||
var hideButton = document.createElement('button');
|
var hideButton = document.createElement('button');
|
||||||
|
|
||||||
rewindButton.innerHTML = '«';
|
rewindButton.innerHTML = '«';
|
||||||
fasterButton.textContent = '+';
|
fasterButton.textContent = '+';
|
||||||
slowerButton.textContent = '-';
|
slowerButton.textContent = '-';
|
||||||
|
advanceButton.innerHTML = '»';
|
||||||
hideButton.textContent = 'x';
|
hideButton.textContent = 'x';
|
||||||
hideButton.className = 'tc-hideButton';
|
hideButton.className = 'tc-hideButton';
|
||||||
|
|
||||||
controls.appendChild(rewindButton);
|
controls.appendChild(rewindButton);
|
||||||
controls.appendChild(slowerButton);
|
controls.appendChild(slowerButton);
|
||||||
controls.appendChild(fasterButton);
|
controls.appendChild(fasterButton);
|
||||||
|
controls.appendChild(advanceButton);
|
||||||
controls.appendChild(hideButton);
|
controls.appendChild(hideButton);
|
||||||
|
|
||||||
container.appendChild(speedIndicator);
|
container.appendChild(speedIndicator);
|
||||||
@@ -106,6 +113,8 @@ chrome.extension.sendMessage({}, function(response) {
|
|||||||
runAction('faster')
|
runAction('faster')
|
||||||
} else if (e.target === rewindButton) {
|
} else if (e.target === rewindButton) {
|
||||||
runAction('rewind')
|
runAction('rewind')
|
||||||
|
} else if (e.target === advanceButton) {
|
||||||
|
runAction('advance')
|
||||||
} else if (e.target === hideButton) {
|
} else if (e.target === hideButton) {
|
||||||
container.nextSibling.classList.add('vc-cancelled')
|
container.nextSibling.classList.add('vc-cancelled')
|
||||||
container.remove();
|
container.remove();
|
||||||
@@ -137,9 +146,11 @@ chrome.extension.sendMessage({}, function(response) {
|
|||||||
videoTags.forEach = Array.prototype.forEach;
|
videoTags.forEach = Array.prototype.forEach;
|
||||||
|
|
||||||
videoTags.forEach(function(v) {
|
videoTags.forEach(function(v) {
|
||||||
if (!v.paused && !v.classList.contains('vc-cancelled')) {
|
if (!v.classList.contains('vc-cancelled')) {
|
||||||
if (action === 'rewind') {
|
if (action === 'rewind') {
|
||||||
v.currentTime -= tc.settings.rewindTime;
|
v.currentTime -= tc.settings.rewindTime;
|
||||||
|
} else if (action === 'advance') {
|
||||||
|
v.currentTime += tc.settings.advanceTime;
|
||||||
} else if (action === 'faster') {
|
} else if (action === 'faster') {
|
||||||
// Maxium playback speed in Chrome is set to 16:
|
// Maxium 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://code.google.com/p/chromium/codesearch#chromium/src/media/blink/webmediaplayer_impl.cc&l=64
|
||||||
@@ -168,6 +179,8 @@ chrome.extension.sendMessage({}, function(response) {
|
|||||||
|
|
||||||
if (keyCode == tc.settings.rewindKeyCode) {
|
if (keyCode == tc.settings.rewindKeyCode) {
|
||||||
runAction('rewind')
|
runAction('rewind')
|
||||||
|
} else if (keyCode == tc.settings.advanceKeyCode) {
|
||||||
|
runAction('advance')
|
||||||
} else if (keyCode == tc.settings.fasterKeyCode) {
|
} else if (keyCode == tc.settings.fasterKeyCode) {
|
||||||
runAction('faster')
|
runAction('faster')
|
||||||
} else if (keyCode == tc.settings.slowerKeyCode) {
|
} else if (keyCode == tc.settings.slowerKeyCode) {
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
"short_name": "videospeed",
|
"short_name": "videospeed",
|
||||||
"version": "0.2.5",
|
"version": "0.2.5",
|
||||||
"manifest_version": 2,
|
"manifest_version": 2,
|
||||||
"description": "Speed up, slow down, 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/igrigorik/videospeed",
|
"homepage_url": "https://github.com/igrigorik/videospeed",
|
||||||
"icons": {
|
"icons": {
|
||||||
"16": "icons/icon16.png",
|
"16": "icons/icon16.png",
|
||||||
|
@@ -16,6 +16,10 @@
|
|||||||
<label for="rewindKeyInput">Rewind</label>
|
<label for="rewindKeyInput">Rewind</label>
|
||||||
<input id="rewindKeyInput" placeholder="press a key" type="text" value=""/>
|
<input id="rewindKeyInput" placeholder="press a key" type="text" value=""/>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<label for="advanceKeyInput">Advance</label>
|
||||||
|
<input id="advanceKeyInput" placeholder="press a key" type="text" value=""/>
|
||||||
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<label for="resetKeyInput">Reset speed</label>
|
<label for="resetKeyInput">Reset speed</label>
|
||||||
<input id="resetKeyInput" placeholder="press a key" type="text" value=""/>
|
<input id="resetKeyInput" placeholder="press a key" type="text" value=""/>
|
||||||
@@ -35,6 +39,10 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<label for="rewindTime">Rewind Time (s)</label>
|
<label for="rewindTime">Rewind Time (s)</label>
|
||||||
<input id="rewindTime" type="text" value=""/>
|
<input id="rewindTime" type="text" value=""/>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<label for="advanceTime">Advance Time (s)</label>
|
||||||
|
<input id="advanceTime" type="text" value=""/>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<label for="speedStep">Speed Change Step</label>
|
<label for="speedStep">Speed Change Step</label>
|
||||||
|
14
options.js
14
options.js
@@ -1,10 +1,12 @@
|
|||||||
var tcDefaults = {
|
var tcDefaults = {
|
||||||
speedStep: 0.1,
|
speedStep: 0.1,
|
||||||
rewindTime: 10,
|
rewindTime: 10,
|
||||||
|
advanceTime: 10,
|
||||||
resetKeyCode: 82,
|
resetKeyCode: 82,
|
||||||
rewindKeyCode: 65,
|
rewindKeyCode: 65,
|
||||||
slowerKeyCode: 83,
|
slowerKeyCode: 83,
|
||||||
fasterKeyCode: 68,
|
fasterKeyCode: 68,
|
||||||
|
advanceKeyCode: 84,
|
||||||
rememberSpeed: false
|
rememberSpeed: false
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -43,24 +45,30 @@ function save_options() {
|
|||||||
|
|
||||||
var speedStep = document.getElementById('speedStep').value;
|
var speedStep = document.getElementById('speedStep').value;
|
||||||
var rewindTime = document.getElementById('rewindTime').value;
|
var rewindTime = document.getElementById('rewindTime').value;
|
||||||
|
var advanceTime = document.getElementById('advanceTime').value;
|
||||||
var resetKeyCode = document.getElementById('resetKeyInput').keyCode;
|
var resetKeyCode = document.getElementById('resetKeyInput').keyCode;
|
||||||
var rewindKeyCode = document.getElementById('rewindKeyInput').keyCode;
|
var rewindKeyCode = document.getElementById('rewindKeyInput').keyCode;
|
||||||
|
var advanceKeyCode = document.getElementById('advanceKeyInput').keyCode;
|
||||||
var slowerKeyCode = document.getElementById('slowerKeyInput').keyCode;
|
var slowerKeyCode = document.getElementById('slowerKeyInput').keyCode;
|
||||||
var fasterKeyCode = document.getElementById('fasterKeyInput').keyCode;
|
var fasterKeyCode = document.getElementById('fasterKeyInput').keyCode;
|
||||||
var rememberSpeed = document.getElementById('rememberSpeed').checked;
|
var rememberSpeed = document.getElementById('rememberSpeed').checked;
|
||||||
|
|
||||||
speedStep = isNaN(speedStep) ? tcDefaults.speedStep : Number(speedStep);
|
speedStep = isNaN(speedStep) ? tcDefaults.speedStep : Number(speedStep);
|
||||||
rewindTime = isNaN(rewindTime) ? tcDefaults.rewindTime : Number(rewindTime);
|
rewindTime = isNaN(rewindTime) ? tcDefaults.rewindTime : Number(rewindTime);
|
||||||
resetKeyCode = isNaN(resetKeyCode) ? tcDefaults.resetKeyCode : resetKeyCode;
|
advanceTime = isNaN(advanceTime) ? tcDefaults.advanceTime : Number(advanceTime);
|
||||||
|
resetKeyCode = isNaN(resetKeyCode) ? tcDefaults.resetKeyCode : resetKeyCode;
|
||||||
rewindKeyCode = isNaN(rewindKeyCode) ? tcDefaults.rewindKeyCode : rewindKeyCode;
|
rewindKeyCode = isNaN(rewindKeyCode) ? tcDefaults.rewindKeyCode : rewindKeyCode;
|
||||||
|
advanceKeyCode = isNaN(advanceKeyCode) ? tcDefaults.advanceKeyCode : advanceKeyCode;
|
||||||
slowerKeyCode = isNaN(slowerKeyCode) ? tcDefaults.slowerKeyCode : slowerKeyCode;
|
slowerKeyCode = isNaN(slowerKeyCode) ? tcDefaults.slowerKeyCode : slowerKeyCode;
|
||||||
fasterKeyCode = isNaN(fasterKeyCode) ? tcDefaults.fasterKeyCode : fasterKeyCode;
|
fasterKeyCode = isNaN(fasterKeyCode) ? tcDefaults.fasterKeyCode : fasterKeyCode;
|
||||||
|
|
||||||
chrome.storage.sync.set({
|
chrome.storage.sync.set({
|
||||||
speedStep: speedStep,
|
speedStep: speedStep,
|
||||||
rewindTime: rewindTime,
|
rewindTime: rewindTime,
|
||||||
|
advanceTime: advanceTime,
|
||||||
resetKeyCode: resetKeyCode,
|
resetKeyCode: resetKeyCode,
|
||||||
rewindKeyCode: rewindKeyCode,
|
rewindKeyCode: rewindKeyCode,
|
||||||
|
advanceKeyCode: advanceKeyCode,
|
||||||
slowerKeyCode: slowerKeyCode,
|
slowerKeyCode: slowerKeyCode,
|
||||||
fasterKeyCode: fasterKeyCode,
|
fasterKeyCode: fasterKeyCode,
|
||||||
rememberSpeed: rememberSpeed
|
rememberSpeed: rememberSpeed
|
||||||
@@ -79,8 +87,10 @@ function restore_options() {
|
|||||||
chrome.storage.sync.get(tcDefaults, function(storage) {
|
chrome.storage.sync.get(tcDefaults, function(storage) {
|
||||||
document.getElementById('speedStep').value = storage.speedStep.toFixed(2);
|
document.getElementById('speedStep').value = storage.speedStep.toFixed(2);
|
||||||
document.getElementById('rewindTime').value = storage.rewindTime;
|
document.getElementById('rewindTime').value = storage.rewindTime;
|
||||||
|
document.getElementById('advanceTime').value = storage.advanceTime;
|
||||||
updateShortcutInputText('resetKeyInput', storage.resetKeyCode);
|
updateShortcutInputText('resetKeyInput', storage.resetKeyCode);
|
||||||
updateShortcutInputText('rewindKeyInput', storage.rewindKeyCode);
|
updateShortcutInputText('rewindKeyInput', storage.rewindKeyCode);
|
||||||
|
updateShortcutInputText('advanceKeyInput', storage.advanceKeyCode);
|
||||||
updateShortcutInputText('slowerKeyInput', storage.slowerKeyCode);
|
updateShortcutInputText('slowerKeyInput', storage.slowerKeyCode);
|
||||||
updateShortcutInputText('fasterKeyInput', storage.fasterKeyCode);
|
updateShortcutInputText('fasterKeyInput', storage.fasterKeyCode);
|
||||||
document.getElementById('rememberSpeed').checked = storage.rememberSpeed;
|
document.getElementById('rememberSpeed').checked = storage.rememberSpeed;
|
||||||
@@ -113,9 +123,11 @@ document.addEventListener('DOMContentLoaded', function () {
|
|||||||
|
|
||||||
initShortcutInput('resetKeyInput');
|
initShortcutInput('resetKeyInput');
|
||||||
initShortcutInput('rewindKeyInput');
|
initShortcutInput('rewindKeyInput');
|
||||||
|
initShortcutInput('advanceKeyInput');
|
||||||
initShortcutInput('slowerKeyInput');
|
initShortcutInput('slowerKeyInput');
|
||||||
initShortcutInput('fasterKeyInput');
|
initShortcutInput('fasterKeyInput');
|
||||||
|
|
||||||
document.getElementById('rewindTime').addEventListener('keypress', inputFilterNumbersOnly);
|
document.getElementById('rewindTime').addEventListener('keypress', inputFilterNumbersOnly);
|
||||||
|
document.getElementById('advanceTime').addEventListener('keypress', inputFilterNumbersOnly);
|
||||||
document.getElementById('speedStep').addEventListener('keypress', inputFilterNumbersOnly);
|
document.getElementById('speedStep').addEventListener('keypress', inputFilterNumbersOnly);
|
||||||
})
|
})
|
||||||
|
Reference in New Issue
Block a user