Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
5df6612
Visually seperate the two, but don't logically
magnus-ISU Dec 15, 2021
8e137c2
Stash before I test whether I made all necessary changes
magnus-ISU Dec 15, 2021
6f88156
Still not working, can't figure out how to log either
magnus-ISU Dec 15, 2021
8282783
Working if you manually set options
magnus-ISU Dec 15, 2021
25892c9
Appears to be working?
magnus-ISU Dec 15, 2021
2fdadc1
Actually working now. There is no migration for user's old settings
magnus-ISU Dec 16, 2021
2c127b8
In the progress of refactoring common code to a constants file
magnus-ISU Dec 16, 2021
3d16740
Modularity is not possible it seems
magnus-ISU Dec 16, 2021
163b9fc
Improve comments, collapse the imports, add TODOs for things I still …
magnus-ISU Dec 16, 2021
5761444
ignore directory that the official tool `web-ext` creates for builds
magnus-ISU Dec 16, 2021
7611b58
Add another TODO where one should be
magnus-ISU Dec 16, 2021
0efef97
Remove nothing-comments that don't actually give any information abou…
magnus-ISU Dec 16, 2021
e995630
remove whitespace on a newline
magnus-ISU Dec 16, 2021
f685d20
Use imports as they should be if they worked
magnus-ISU Dec 16, 2021
9a9b17a
This is needed in script tags, might have been part of what I was doi…
magnus-ISU Dec 16, 2021
ef51c92
Fix options.js and now it works there
magnus-ISU Dec 16, 2021
2c24494
Readd inject's duplication of constants.js code
magnus-ISU Dec 16, 2021
06b0d6f
derp
magnus-ISU Dec 16, 2021
af90027
Clean up code a bit, revert a dumb change I made in the logging funct…
magnus-ISU Dec 16, 2021
6415661
Apply formatter - even though the constants code in inject.js is dupl…
magnus-ISU Dec 16, 2021
2388f56
Realized that backslashes at the start of a multiline string are actu…
magnus-ISU Dec 16, 2021
da40d24
Revert to switch on true - it is needed for regexes. Fix reddit so it…
magnus-ISU Dec 16, 2021
9e58e7d
Prepare for configurable sizes, but it is not possible yet; I want to…
magnus-ISU Dec 16, 2021
aade4d6
Merge branch 'change-size-controls' into seperate-lower-upper
magnus-ISU Dec 16, 2021
868e0b7
Customizable controller size
magnus-ISU Dec 16, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,5 @@ local
# IntelliJ IDEA
.idea/
node_modules

web-ext-artifacts/
33 changes: 33 additions & 0 deletions constants.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
//TODO verify accuracy of and fix this comment
// Strips out whitespace before a line, I think
export const regStrip = /^[\r\t\f\v ]+|[\r\t\f\v ]+$/gm;

// The default values for each setting
export const tcDefaults = {
// The default speed videos should play with
speed: 1.0,
//TODO is this value used? I don't see why it should be needed, can probably be refactored out?
displayKey: "v",
rememberSpeed: false,
audioBoolean: false,
startHidden: false,
forceLastSavedSpeed: false,
enabled: true,
controllerOpacity: 0.3,
controllerSize: "13px",
keyBindings: [
{ action: "display", key: "v", value: 0, force: false, predefined: true },
{ action: "slower", key: "s", value: 0.1, force: false, predefined: true },
{ action: "faster", key: "d", value: 0.1, force: false, predefined: true },
{ action: "rewind", key: "z", value: 10, force: false, predefined: true },
{ action: "advance", key: "x", value: 10, force: false, predefined: true },
{ action: "reset", key: "r", value: 1, force: false, predefined: true },
{ action: "fast", key: "g", value: 1.8, force: false, predefined: true }
],
blacklist: `\
www.instagram.com
twitter.com
imgur.com
teams.microsoft.com
`
};
209 changes: 106 additions & 103 deletions inject.js
Original file line number Diff line number Diff line change
@@ -1,25 +1,54 @@
var regStrip = /^[\r\t\f\v ]+|[\r\t\f\v ]+$/gm;
// Firefox is a bad browser, except all the rest - this import is not possible
//import {regStrip, tcDefaults} from "./constants.js";
const regStrip = /^[\r\t\f\v ]+|[\r\t\f\v ]+$/gm;
const tcDefaults = {
speed: 1.0,
displayKey: "v",
rememberSpeed: false,
audioBoolean: false,
startHidden: false,
forceLastSavedSpeed: false,
enabled: true,
controllerOpacity: 0.3,
controllerSize: "13px",
keyBindings: [
{ action: "display", key: "v", value: 0, force: false, predefined: true },
{ action: "slower", key: "s", value: 0.1, force: false, predefined: true },
{ action: "faster", key: "d", value: 0.1, force: false, predefined: true },
{ action: "rewind", key: "z", value: 10, force: false, predefined: true },
{ action: "advance", key: "x", value: 10, force: false, predefined: true },
{ action: "reset", key: "r", value: 1, force: false, predefined: true },
{ action: "fast", key: "g", value: 1.8, force: false, predefined: true }
],
blacklist: `\
www.instagram.com
twitter.com
imgur.com
teams.microsoft.com
`
};

//TODO parts of this this may be able to be refactored out by using tcDefaults
var tc = {
settings: {
lastSpeed: 1.0, // default 1x
enabled: true, // default enabled
enabled: true,
speeds: {}, // empty object to hold speed for each source

displayKeyCode: 86, // default: V
rememberSpeed: false, // default: false
forceLastSavedSpeed: false, //default: false
audioBoolean: false, // default: false
startHidden: false, // default: false
controllerOpacity: 0.3, // default: 0.3
displayKey: "v",
rememberSpeed: false,
forceLastSavedSpeed: false,
audioBoolean: false,
startHidden: false,
controllerOpacity: 0.3,
controllerSize: "13px",
keyBindings: [],
blacklist: `\
www.instagram.com
twitter.com
vine.co
imgur.com
teams.microsoft.com
`.replace(regStrip, ""),
www.instagram.com
twitter.com
imgur.com
teams.microsoft.com
`,
defaultLogLevel: 4,
logLevel: 3
},
Expand All @@ -38,110 +67,80 @@ var tc = {
*/
function log(message, level) {
verbosity = tc.settings.logLevel;
if (typeof level === "undefined") {
level = tc.settings.defaultLogLevel;
}
let to_print = "";
if (verbosity >= level) {
if (level === 2) {
console.log("ERROR:" + message);
} else if (level === 3) {
console.log("WARNING:" + message);
} else if (level === 4) {
console.log("INFO:" + message);
} else if (level === 5) {
console.log("DEBUG:" + message);
} else if (level === 6) {
console.log("DEBUG (VERBOSE):" + message);
console.trace();
switch (level) {
case 2:
to_print = "ERROR: ";
break;
case 3:
to_print = "WARNING: ";
break;
case 4:
to_print = "INFO: ";
break;
case 5:
to_print = "DEBUG: ";
break;
case 6:
to_print = "VERBOSE DEBUG: ";
console.trace();
break;
default:
console.log("ALERT: Please report how you got this to VideoSpeed");
console.trace();
}
console.log(to_print + message);
}
}

// Needed because you cannot || with "undefined". Only used in the next lambda function
function storageToString(stored_key, default_key) {
if (stored_key) {
return String(stored_key);
} else {
return default_key;
}
}

chrome.storage.sync.get(tc.settings, function (storage) {
tc.settings.keyBindings = storage.keyBindings; // Array

console.log(storage);

// The first time the extension runs...
if (storage.keyBindings.length == 0) {
// if first initialization of 0.5.3
// UPDATE
tc.settings.keyBindings.push({
action: "slower",
key: Number(storage.slowerKeyCode) || 83,
value: Number(storage.speedStep) || 0.1,
force: false,
predefined: true
}); // default S
tc.settings.keyBindings.push({
action: "faster",
key: Number(storage.fasterKeyCode) || 68,
value: Number(storage.speedStep) || 0.1,
force: false,
predefined: true
}); // default: D
tc.settings.keyBindings.push({
action: "rewind",
key: Number(storage.rewindKeyCode) || 90,
value: Number(storage.rewindTime) || 10,
force: false,
predefined: true
}); // default: Z
tc.settings.keyBindings.push({
action: "advance",
key: Number(storage.advanceKeyCode) || 88,
value: Number(storage.advanceTime) || 10,
force: false,
predefined: true
}); // default: X
tc.settings.keyBindings.push({
action: "reset",
key: Number(storage.resetKeyCode) || 82,
value: 1.0,
force: false,
predefined: true
}); // default: R
tc.settings.keyBindings.push({
action: "fast",
key: Number(storage.fastKeyCode) || 71,
value: Number(storage.fastSpeed) || 1.8,
force: false,
predefined: true
}); // default: G
tc.settings.keyBindings = tcDefaults.keyBindings;

//TODO what does this do?
tc.settings.version = "0.5.3";

//TODO we should refactor tc so we can just call chrome.storage.sync.set(tc.settings)
chrome.storage.sync.set({
keyBindings: tc.settings.keyBindings,
version: tc.settings.version,
displayKeyCode: tc.settings.displayKeyCode,
displayKey: tc.settings.displayKey,
rememberSpeed: tc.settings.rememberSpeed,
forceLastSavedSpeed: tc.settings.forceLastSavedSpeed,
audioBoolean: tc.settings.audioBoolean,
startHidden: tc.settings.startHidden,
enabled: tc.settings.enabled,
controllerOpacity: tc.settings.controllerOpacity,
controllerSize: tc.settings.controllerSize,
blacklist: tc.settings.blacklist.replace(regStrip, "")
});
}
tc.settings.lastSpeed = Number(storage.lastSpeed);
tc.settings.displayKeyCode = Number(storage.displayKeyCode);
tc.settings.displayKey = String(storage.displayKey);
tc.settings.rememberSpeed = Boolean(storage.rememberSpeed);
tc.settings.forceLastSavedSpeed = Boolean(storage.forceLastSavedSpeed);
tc.settings.audioBoolean = Boolean(storage.audioBoolean);
tc.settings.enabled = Boolean(storage.enabled);
tc.settings.startHidden = Boolean(storage.startHidden);
tc.settings.controllerOpacity = Number(storage.controllerOpacity);
tc.settings.controllerSize = String(storage.controllerSize);
tc.settings.blacklist = String(storage.blacklist);

// ensure that there is a "display" binding (for upgrades from versions that had it as a separate binding)
if (
tc.settings.keyBindings.filter((x) => x.action == "display").length == 0
) {
tc.settings.keyBindings.push({
action: "display",
key: Number(storage.displayKeyCode) || 86,
value: 0,
force: false,
predefined: true
}); // default V
}

initializeWhenReady(document);
});

Expand All @@ -154,9 +153,8 @@ function getKeyBindings(action, what = "value") {
}

function setKeyBindings(action, value) {
tc.settings.keyBindings.find((item) => item.action === action)[
"value"
] = value;
tc.settings.keyBindings.find((item) => item.action === action)["value"] =
value;
}

function defineVideoController() {
Expand Down Expand Up @@ -293,11 +291,14 @@ function defineVideoController() {
var shadowTemplate = `
<style>
@import "${chrome.runtime.getURL("shadow.css")}";
* {
font-size:${tc.settings.controllerSize};
}
</style>

<div id="controller" style="top:${top}; left:${left}; opacity:${
tc.settings.controllerOpacity
}">
};">
<span data-action="drag" class="draggable">${speed}</span>
<span id="controls">
<button data-action="rewind" class="rw">«</button>
Expand Down Expand Up @@ -344,9 +345,10 @@ function defineVideoController() {
var fragment = document.createDocumentFragment();
fragment.appendChild(wrapper);

// This seemed strange to me at first, but switching on true here allows matching regexes
switch (true) {
case location.hostname == "www.amazon.com":
case location.hostname == "www.reddit.com":
case /\.*.reddit.com/.test(location.hostname):
case /hbogo\./.test(location.hostname):
// insert before parent to bypass overlay
this.parent.parentElement.insertBefore(fragment, this.parent);
Expand All @@ -355,8 +357,9 @@ function defineVideoController() {
// this is a monstrosity but new FB design does not have *any*
// semantic handles for us to traverse the tree, and deep nesting
// that we need to bubble up from to get controller to stack correctly
let p = this.parent.parentElement.parentElement.parentElement
.parentElement.parentElement.parentElement.parentElement;
let p =
this.parent.parentElement.parentElement.parentElement.parentElement
.parentElement.parentElement.parentElement;
p.insertBefore(fragment, p.firstChild);
break;
case location.hostname == "tv.apple.com":
Expand Down Expand Up @@ -426,8 +429,7 @@ function setupListener() {
function updateSpeedFromEvent(video) {
// It's possible to get a rate change on a VIDEO/AUDIO that doesn't have
// a video controller attached to it. If we do, ignore it.
if (!video.vsc)
return;
if (!video.vsc) return;
var speedIndicator = video.vsc.speedIndicator;
var src = video.currentSrc;
var speed = Number(video.playbackRate.toFixed(2));
Expand Down Expand Up @@ -481,7 +483,7 @@ function initializeWhenReady(document) {
if (isBlacklisted()) {
return;
}
window.addEventListener('load', () => {
window.addEventListener("load", () => {
initializeNow(window.document);
});
if (document) {
Expand All @@ -497,13 +499,15 @@ function initializeWhenReady(document) {
}
log("End initializeWhenReady", 5);
}

function inIframe() {
try {
return window.self !== window.top;
} catch (e) {
return true;
}
}

function getShadow(parent) {
let result = [];
function getChild(parent) {
Expand Down Expand Up @@ -556,8 +560,8 @@ function initializeNow(document) {
doc.addEventListener(
"keydown",
function (event) {
var keyCode = event.keyCode;
log("Processing keydown event: " + keyCode, 6);
let key = event.key;
log("Processing keydown event: " + key, 6);

// Ignore if following modifier is active.
if (
Expand All @@ -569,7 +573,7 @@ function initializeNow(document) {
event.getModifierState("Hyper") ||
event.getModifierState("OS")
) {
log("Keydown event ignored due to active modifier: " + keyCode, 5);
log("Keydown event ignored due to active modifier: " + key, 5);
return;
}

Expand All @@ -587,7 +591,7 @@ function initializeNow(document) {
return false;
}

var item = tc.settings.keyBindings.find((item) => item.key === keyCode);
var item = tc.settings.keyBindings.find((item) => item.key === key);
if (item) {
runAction(item.action, item.value);
if (item.force === "true") {
Expand Down Expand Up @@ -653,8 +657,7 @@ function initializeNow(document) {
(x) => x.tagName == "VIDEO"
)[0];
if (node) {
if (node.vsc)
node.vsc.remove();
if (node.vsc) node.vsc.remove();
checkForVideo(node, node.parentNode || mutation.target, true);
}
}
Expand Down
Loading