This commit is contained in:
Tamius Han 2024-06-12 20:29:00 +02:00
parent d4015a86ef
commit 6c92837317
7 changed files with 58 additions and 239 deletions

View File

@ -185,6 +185,12 @@ interface SettingsInterface {
} }
}, },
ui: {
inPlayer: {
enabled: boolean
}
}
restrictions?: RestrictionsSettings; restrictions?: RestrictionsSettings;
crop: { crop: {
@ -310,52 +316,6 @@ interface SettingsInterface {
sites: { sites: {
[x: string]: SiteSettingsInterface, [x: string]: SiteSettingsInterface,
} }
// sites: {
// [x: string]: {
// defaultCrop?: any, // v6 new
// defaultStretch?: any, // v6 new
// enabled: ExtensionEnvironmentSettingsInterface, // v6 new
// enabledAard: ExtensionEnvironmentSettingsInterface,// v6 new
// // everything 'superseded by' needs to be implemented
// // as well as ported from the old settings
// mode?: ExtensionMode, // v6 — superseded by looking at enableIn
// autoar?: ExtensionMode, // v6 — superseded by looking at enableIn
// autoarFallback?: ExtensionMode, // v6 — deprecated, no replacement
// stretch?: StretchType, // v6 — superseded by defaultStretch
// videoAlignment?: VideoAlignmentType,
// keyboardShortcutsEnabled?: ExtensionMode,
// type?: string,
// override?: boolean,
// arPersistence?: boolean,
// actions?: any;
// cropModePersistence?: CropModePersistence;
// DOM?: {
// player?: {
// manual?: boolean,
// querySelectors?: string,
// additionalCss?: string,
// useRelativeAncestor?: boolean,
// videoAncestor?: any,
// playerNodeCss?: string,
// periodicallyRefreshPlayerElement?: boolean
// },
// video?: {
// manual?: boolean,
// querySelectors?: string,
// additionalCss?: string,
// useRelativeAncestor?: boolean,
// playerNodeCss?: string
// }
// },
// css?: string;
// usePlayerArInFullscreen?: boolean;
// restrictions?: RestrictionsSettings;
// }
// }
} }
export interface SiteSettingsInterface { export interface SiteSettingsInterface {

View File

@ -5,6 +5,9 @@
<h1>What's new</h1> <h1>What's new</h1>
<p>Full changelog for older versions <a href="https://github.com/tamius-han/ultrawidify/blob/master/CHANGELOG.md" target="_blank">is available here</a>.</p> <p>Full changelog for older versions <a href="https://github.com/tamius-han/ultrawidify/blob/master/CHANGELOG.md" target="_blank">is available here</a>.</p>
<h2>6.0.1</h2>
<p>Fixed external links.</p>
<h2>6.0.0</h2> <h2>6.0.0</h2>
<p> <p>
I don't think I need to write a changelog for this one. I've also been working on this, on and (mostly) off, for ... a long time, so I might have "kinda forgot" some minor things. I don't think I need to write a changelog for this one. I've also been working on this, on and (mostly) off, for ... a long time, so I might have "kinda forgot" some minor things.

View File

@ -11,129 +11,14 @@ import AspectRatioType from '../../common/enums/AspectRatioType.enum';
const ExtensionConfPatch = [ const ExtensionConfPatch = [
{ {
forVersion: '5.0.5', forVersion: '6.0.1-1',
sites: {
"app.plex.tv": {
mode: 3,
autoar: 3,
type: "community",
stretch: -1,
videoAlignment: -1,
keyboardShortcutsEnabled: 0,
DOM: {
player: {
manual: false,
querySelectors: "",
additionalCss: "",
useRelativeAncestor: false,
playerNodeCss: ""
}
},
css: "body {\n background-color: #000;\n}\n\n.application {\n background-color: #000;\n}"
}
}
}, {
forVersion: '5.0.6',
sites: {
"metaivi.com": {
mode: 0,
autoar: 0,
type: "community",
stretch: -1,
videoAlignment: -1,
DOM: {
video: {
manual: false,
querySelectors: "",
additionalCss: "position: absolute !important;"
},
player: {
manual: false,
querySelectors: "",
additionalCss: "",
useRelativeAncestor: false,
playerNodeCss: ""
}
},
"css": ""
},
"piped.kavin.rocks": {
mode: 0,
autoar: 0,
type: 'community',
autoarFallback: 0,
stretch: 0,
videoAlignment: -1,
keyboardShortcutsEnabled: 0,
DOM: {
player: {
manual: false,
querySelectors: "",
additionalCss: "",
useRelativeAncestor: false,
playerNodeCss: ""
}
},
css: ".shaka-video-container {\n flex-direction: column !important;\n}"
},
},
updateFn: (userOptions, defaultOptions) => {
// 5.0.5 initially incorrectly had app.plex.tv marked as 'user-added'
// when 'user-added' is generally reserved for marking sites with user-
// changed configuration. Site patches submitted by community should have
// 'community' type. extConfPatch for 5.0.5 was also retroactively corrected.
userOptions.sites['app.plex.tv'].type = 'community';
userOptions.sites['piped.kavin.rocks'] = {
mode: 0,
autoar: 0,
type: 'community',
autoarFallback: 0,
stretch: 0,
videoAlignment: -1,
keyboardShortcutsEnabled: 0,
DOM: {
player: {
manual: false,
querySelectors: "",
additionalCss: "",
useRelativeAncestor: false,
playerNodeCss: ""
}
},
css: ".shaka-video-container {\n flex-direction: column !important;\n}"
};
}
}, {
forVersion: '5.0.7',
updateFn: (userOptions, defaultOptions) => {
// 5.0.5 initially incorrectly had app.plex.tv marked as 'user-added'
// when 'user-added' is generally reserved for marking sites with user-
// changed configuration. Site patches submitted by community should have
// 'community' type. extConfPatch for 5.0.5 was also retroactively corrected.
userOptions.sites['www.youtube.com'].DOM.player = {
manual: true,
querySelectors: "#movie_player, #player, #c4-player",
additionalCss: "",
useRelativeAncestor: false,
playerNodeCss: "",
}
}
}, {
forVersion: '5.0.8',
updateFn: (userOptions, defaultOptions) => {
userOptions.sites['www.netflix.com'].DOM.player = {
manual: false
}
}
}, {
forVersion: '5.99.0-1',
updateFn: (userOptions: SettingsInterface, defaultOptions) => { updateFn: (userOptions: SettingsInterface, defaultOptions) => {
// add new commands // add new commands
userOptions.commands = defaultOptions.commands; userOptions.commands = defaultOptions.commands;
} }
}, { }, {
// NOTE - when releasing shit, ensure ALL alpha migrations are combined together in one function // NOTE - when releasing shit, ensure ALL alpha migrations are combined together in one function
forVersion: '5.99.0-2', forVersion: '6.0.1-2',
updateFn: (userOptions, defaultOptions) => { updateFn: (userOptions, defaultOptions) => {
userOptions.commands = defaultOptions.commands; userOptions.commands = defaultOptions.commands;
@ -204,7 +89,7 @@ const ExtensionConfPatch = [
} }
} }
}, { }, {
forVersion: '5.99.0-3', forVersion: '6.0.1-3',
updateFn: (userOptions: SettingsInterface, defaultOptions) => { updateFn: (userOptions: SettingsInterface, defaultOptions) => {
delete (userOptions as any).sites['@global'].persistOption; delete (userOptions as any).sites['@global'].persistOption;
delete (userOptions as any).sites['@empty'].persistOption; delete (userOptions as any).sites['@empty'].persistOption;
@ -213,7 +98,7 @@ const ExtensionConfPatch = [
userOptions.sites['@empty'].persistCSA = CropModePersistence.Disabled; userOptions.sites['@empty'].persistCSA = CropModePersistence.Disabled;
} }
}, { }, {
forVersion: '5.99.0-4', forVersion: '6.0.1-4',
updateFn: (userOptions: SettingsInterface, defaultOptions) => { updateFn: (userOptions: SettingsInterface, defaultOptions) => {
// deprecated much? // deprecated much?
@ -254,7 +139,7 @@ const ExtensionConfPatch = [
}) })
} }
}, { }, {
forVersion: '5.99.5', forVersion: '6.0.1-5',
updateFn: (userOptions: SettingsInterface, defaultOptions) => { updateFn: (userOptions: SettingsInterface, defaultOptions) => {
if (!userOptions.sites['@global'].defaults.alignment || !userOptions.sites['@global'].defaults.alignment.x || !userOptions.sites['@global'].defaults.alignment.y) { if (!userOptions.sites['@global'].defaults.alignment || !userOptions.sites['@global'].defaults.alignment.x || !userOptions.sites['@global'].defaults.alignment.y) {
userOptions.sites['@global'].defaults.alignment = { userOptions.sites['@global'].defaults.alignment = {
@ -265,7 +150,7 @@ const ExtensionConfPatch = [
userOptions.sites['@empty'].defaults.alignment = {x: VideoAlignmentType.Default, y: VideoAlignmentType.Default}; userOptions.sites['@empty'].defaults.alignment = {x: VideoAlignmentType.Default, y: VideoAlignmentType.Default};
} }
}, { }, {
forVersion: '5.99.6', forVersion: '6.0.1-6',
updateFn: (userOptions: SettingsInterface, defaultOptions) => { updateFn: (userOptions: SettingsInterface, defaultOptions) => {
for (const site in userOptions.sites) { for (const site in userOptions.sites) {
userOptions.sites[site].defaultType = userOptions.sites[site].type as any; userOptions.sites[site].defaultType = userOptions.sites[site].type as any;
@ -274,13 +159,18 @@ const ExtensionConfPatch = [
userOptions.sites['@empty'].defaultType = 'modified'; userOptions.sites['@empty'].defaultType = 'modified';
} }
}, { }, {
forVersion: '6.0.0', forVersion: '6.0.1-7',
updateFn: (userOptions: SettingsInterface, defaultOptions) => { updateFn: (userOptions: SettingsInterface, defaultOptions) => {
// remove custom CSS, as it is no longer needed // remove custom CSS, as it is no longer needed
for (const site in userOptions.sites) { for (const site in userOptions.sites) {
for (const domOption in userOptions.sites[site].DOMConfig) for (const domOption in userOptions.sites[site].DOMConfig)
userOptions.sites[site].DOMConfig[domOption].customCss; userOptions.sites[site].DOMConfig[domOption].customCss;
} }
userOptions.ui = {
inPlayer: {
enabled: false, // keep disabled for existing users
}
}
} }
} }
]; ];

View File

@ -141,6 +141,13 @@ const ExtensionConf: SettingsInterface = {
testRowOffset: 0.02 // we test this % of height from detected edge testRowOffset: 0.02 // we test this % of height from detected edge
} }
}, },
ui: {
inPlayer: {
enabled: true, // enable by default on new installs
}
},
crop: { crop: {
default: { default: {
type: AspectRatioType.Automatic, type: AspectRatioType.Automatic,

View File

@ -152,7 +152,15 @@ class PlayerData {
this.initEventBus(); this.initEventBus();
// this.notificationService = new PlayerNotificationUi(this.element, this.settings, this.eventBus); // this.notificationService = new PlayerNotificationUi(this.element, this.settings, this.eventBus);
this.ui = new UI('ultrawidifyUi', {parentElement: this.element, eventBus: this.eventBus}); if (this.videoData.settings.active.ui?.inPlayer?.enabled) {
this.ui = new UI(
'ultrawidifyUi',
{
parentElement: this.element,
eventBus: this.eventBus
}
);
}
this.dimensions = undefined; this.dimensions = undefined;
this.overlayNode = undefined; this.overlayNode = undefined;
@ -215,7 +223,6 @@ class PlayerData {
destroy() { destroy() {
document.removeEventListener('fullscreenchange', this.dimensionChangeListener); document.removeEventListener('fullscreenchange', this.dimensionChangeListener);
this.stopChangeDetection(); this.stopChangeDetection();
this.destroyOverlay();
this.notificationService?.destroy(); this.notificationService?.destroy();
} }
//#endregion //#endregion
@ -326,11 +333,14 @@ class PlayerData {
const canEnable = this.siteSettings.isEnabledForEnvironment(this.isFullscreen, this.isTheaterMode) === ExtensionMode.Enabled; const canEnable = this.siteSettings.isEnabledForEnvironment(this.isFullscreen, this.isTheaterMode) === ExtensionMode.Enabled;
if (this.runLevel === RunLevel.Off && canEnable) { if (this.runLevel === RunLevel.Off && canEnable) {
console.log('runLevel: off -> [anything]');
this.eventBus.send('restore-ar', null); this.eventBus.send('restore-ar', null);
// must be called after // must be called after
this.handleDimensionChanges(currentPlayerDimensions, this.dimensions); this.handleDimensionChanges(currentPlayerDimensions, this.dimensions);
} else if (!canEnable && this.runLevel !== RunLevel.Off) { } else if (!canEnable && this.runLevel !== RunLevel.Off) {
// must be called before // must be called before
console.log('runLevel: [anything] -> off');
this.handleDimensionChanges(currentPlayerDimensions, this.dimensions); this.handleDimensionChanges(currentPlayerDimensions, this.dimensions);
this.setRunLevel(RunLevel.Off); this.setRunLevel(RunLevel.Off);
} }
@ -338,8 +348,8 @@ class PlayerData {
private handleDimensionChanges(newDimensions: PlayerDimensions, oldDimensions: PlayerDimensions) { private handleDimensionChanges(newDimensions: PlayerDimensions, oldDimensions: PlayerDimensions) {
console.log('handling dimension changes'); console.log('handling dimension changes\n\nold dimensions:', oldDimensions, '\nnew dimensions:', newDimensions, '\n\nis enabled:', this.enabled, this.runLevel, RunLevel);
if (!this.enabled) { if (this.runLevel === RunLevel.Off ) {
this.logger.log('info', 'debug', "[PlayerDetect] player size changed, but PlayerDetect is in disabled state. The player element is probably too small."); this.logger.log('info', 'debug', "[PlayerDetect] player size changed, but PlayerDetect is in disabled state. The player element is probably too small.");
return; return;
} }
@ -354,8 +364,10 @@ class PlayerData {
|| newDimensions?.height != oldDimensions?.height || newDimensions?.height != oldDimensions?.height
|| newDimensions?.fullscreen != oldDimensions?.fullscreen || newDimensions?.fullscreen != oldDimensions?.fullscreen
){ ){
console.log('dimensions changed + we are enabled. Sending restore-ar ...');
// If player size changes, we restore aspect ratio // If player size changes, we restore aspect ratio
this.eventBus.send('restore-ar', null); this.eventBus.send('restore-ar', null);
this.eventBus.send('delayed-restore-ar', {delay: 500});
// this.videoData.resizer?.restore(); // this.videoData.resizer?.restore();
} }
} }
@ -424,59 +436,6 @@ class PlayerData {
this.observer.disconnect(); this.observer.disconnect();
} }
//#region interface
makeOverlay() {
if (!this.overlayNode) {
this.destroyOverlay();
}
let overlay = document.createElement('div');
overlay.style.width = '100%';
overlay.style.height = '100%';
overlay.style.position = 'absolute';
overlay.style.top = '0';
overlay.style.left = '0';
overlay.style.zIndex = '1000000000';
overlay.style.pointerEvents = 'none';
this.overlayNode = overlay;
this.element.appendChild(overlay);
}
destroyOverlay() {
if(this.playerIdElement) {
this.playerIdElement.remove();
this.playerIdElement = undefined;
}
if (this.overlayNode) {
this.overlayNode.remove();
this.overlayNode = undefined;
}
}
markPlayer(name, color) {
if (!this.overlayNode) {
this.makeOverlay();
}
if (this.playerIdElement) {
this.playerIdElement.remove();
}
this.playerIdElement = document.createElement('div');
this.playerIdElement.innerHTML = `<div style="background-color: ${color}; color: #fff; position: absolute; top: 0; left: 0">${name}</div>`;
this.overlayNode.appendChild(this.playerIdElement);
}
unmarkPlayer() {
this.logger.log('info', 'debug', "[PlayerData::unmarkPlayer] unmarking player!", {playerIdElement: this.playerIdElement});
if (this.playerIdElement) {
this.playerIdElement.innerHTML = '';
this.playerIdElement.remove();
}
this.playerIdElement = undefined;
}
//#endregion
//#region helper functions //#region helper functions
collectionHas(collection, element) { collectionHas(collection, element) {

View File

@ -739,19 +739,6 @@ class VideoData {
this.resizer.restore(); this.resizer.restore();
} }
markPlayer(name, color) {
if (this.invalid) {
return;
}
if (this.player) {
this.player.markPlayer(name, color)
}
}
unmarkPlayer() {
this.player.unmarkPlayer();
}
isPlaying() { isPlaying() {
return this.video && this.video.currentTime > 0 && !this.video.paused && !this.video.ended; return this.video && this.video.currentTime > 0 && !this.video.paused && !this.video.ended;
} }

View File

@ -18,6 +18,7 @@ import { _cp } from '../../../common/js/utils';
import Settings from '../Settings'; import Settings from '../Settings';
import { Ar } from '../../../common/interfaces/ArInterface'; import { Ar } from '../../../common/interfaces/ArInterface';
import { RunLevel } from '../../enum/run-level.enum'; import { RunLevel } from '../../enum/run-level.enum';
import * as _ from 'lodash';
if(Debug.debug) { if(Debug.debug) {
console.log("Loading: Resizer.js"); console.log("Loading: Resizer.js");
@ -133,6 +134,18 @@ class Resizer {
}], }],
'restore-ar': [{ 'restore-ar': [{
function: () => this.restore() function: () => this.restore()
}],
'delayed-restore-ar': [{
function: () => {
_.debounce(
this.restore,
500,
{
leading: true,
trailing: true
}
)
}
}] }]
} }
//#endregion //#endregion
@ -738,7 +751,7 @@ class Resizer {
const alignXOffset = (realVideoWidth * stretchFactors.xFactor - this.videoData.player.dimensions.width) * 0.5; const alignXOffset = (realVideoWidth * stretchFactors.xFactor - this.videoData.player.dimensions.width) * 0.5;
const alignYOffset = (realVideoHeight * stretchFactors.yFactor - this.videoData.player.dimensions.height) * 0.5; const alignYOffset = (realVideoHeight * stretchFactors.yFactor - this.videoData.player.dimensions.height) * 0.5;
if (this.pan.relativeOffsetX || this.pan.relativeOffsetY) { if (this.pan?.relativeOffsetX || this.pan?.relativeOffsetY) {
// don't offset when video is smaller than player // don't offset when video is smaller than player
if(alignXOffset >= 0 || alignYOffset >= 0) { if(alignXOffset >= 0 || alignYOffset >= 0) {
translate.x += alignXOffset * this.pan.relativeOffsetX * this.zoom.scale; translate.x += alignXOffset * this.pan.relativeOffsetX * this.zoom.scale;