Skip to content

Commit 0944e94

Browse files
committed
Setup everything
1 parent 641c3db commit 0944e94

File tree

2 files changed

+119
-17
lines changed

2 files changed

+119
-17
lines changed

injected/src/features/duck-player-native.js

+21-17
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import ContentFeature from '../content-feature.js';
22
// import { isBeingFramed } from '../utils.js';
33
import { DuckPlayerNativeMessages } from './duckplayer-native/messages.js';
44
import { mockTransport } from './duckplayer-native/mock-transport.js';
5-
import { setupDuckPlayerForNoCookie, setupDuckPlayerForSerp, setupDuckPlayerForYouTube } from './duckplayer-native/duckplayer-native.js';
5+
import { setupDuckPlayerForEverything, setupDuckPlayerForNoCookie, setupDuckPlayerForSerp, setupDuckPlayerForYouTube } from './duckplayer-native/duckplayer-native.js';
66
import { Environment } from './duckplayer-native/environment.js';
77

88
/** @import {DuckPlayerNative} from './duckplayer-native/duckplayer-native.js' */
@@ -49,24 +49,28 @@ export class DuckPlayerNativeFeature extends ContentFeature {
4949
const comms = new DuckPlayerNativeMessages(this.messaging);
5050
const settings = { selectors };
5151

52+
this.current = setupDuckPlayerForEverything(settings, env, comms);
53+
5254
comms.subscribeToURLChange(({ pageType }) => {
5355
console.log('GOT PAGE TYPE', pageType);
54-
let next;
55-
56-
switch (pageType) {
57-
case 'NOCOOKIE':
58-
next = setupDuckPlayerForNoCookie(settings, env, comms);
59-
break;
60-
case 'YOUTUBE':
61-
next = setupDuckPlayerForYouTube(settings, env, comms);
62-
break;
63-
case 'SERP':
64-
next = setupDuckPlayerForSerp(settings, env, comms);
65-
break;
66-
case 'UNKNOWN':
67-
default:
68-
console.warn('No known pageType');
69-
}
56+
// let next;
57+
//
58+
// switch (pageType) {
59+
// case 'NOCOOKIE':
60+
// next = setupDuckPlayerForNoCookie(settings, env, comms);
61+
// break;
62+
// case 'YOUTUBE':
63+
// next = setupDuckPlayerForYouTube(settings, env, comms);
64+
// break;
65+
// case 'SERP':
66+
// next = setupDuckPlayerForSerp(settings, env, comms);
67+
// break;
68+
// case 'UNKNOWN':
69+
// default:
70+
// console.warn('No known pageType');
71+
// }
72+
73+
const next = setupDuckPlayerForEverything(settings, env, comms);
7074

7175
if (next) {
7276
console.log('LOADING NEXT INSTANCE', this.current, next);

injected/src/features/duckplayer-native/duckplayer-native.js

+98
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,104 @@ export function setupDuckPlayerForYouTube(settings, environment, messages) {
162162
return duckPlayerNative;
163163
}
164164

165+
/**
166+
* @param {Settings} settings
167+
* @param {Environment} environment
168+
* @param {DuckPlayerNativeMessages} messages
169+
*/
170+
export function setupDuckPlayerForEverything(settings, environment, messages) {
171+
const onLoad = (sideEffects, logger) => {
172+
sideEffects.add('started polling current timestamp', () => {
173+
const handler = (timestamp) => {
174+
messages.notifyCurrentTimestamp(timestamp.toFixed(0));
175+
};
176+
177+
return pollTimestamp(300, handler);
178+
});
179+
180+
const errorContainer = settings.selectors?.errorContainer;
181+
const signInRequiredError = settings.selectors?.signInRequiredError;
182+
if (!errorContainer || !signInRequiredError) {
183+
logger.warn('Missing error selectors in configuration');
184+
return;
185+
}
186+
187+
/** @type {(errorId: import('./error-detection.js').YouTubeError) => void} */
188+
const errorHandler = (errorId) => {
189+
logger.log('Received error', errorId);
190+
191+
// Notify the browser of the error
192+
messages.notifyYouTubeError(errorId);
193+
194+
const targetElement = document.querySelector(errorContainer);
195+
if (targetElement) {
196+
showError(/** @type {HTMLElement} */ (targetElement), errorId, environment);
197+
}
198+
};
199+
200+
/** @type {ErrorDetectionSettings} */
201+
const errorDetectionSettings = {
202+
selectors: settings.selectors,
203+
testMode: environment.isTestMode(),
204+
callback: errorHandler,
205+
};
206+
207+
sideEffects.add('setting up error detection', () => {
208+
const errorDetection = new ErrorDetection(errorDetectionSettings);
209+
const destroy = errorDetection.observe();
210+
211+
return () => {
212+
if (destroy) destroy();
213+
};
214+
});
215+
};
216+
217+
const onInit = (sideEffects, logger) => {
218+
sideEffects.add('subscribe to media control', () => {
219+
return messages.subscribeToMediaControl(({ pause }) => {
220+
logger.log('Running media control handler. Pause:', pause);
221+
222+
const videoElement = settings.selectors?.videoElement;
223+
const videoElementContainer = settings.selectors?.videoElementContainer;
224+
if (!videoElementContainer || !videoElement) {
225+
logger.warn('Missing media control selectors in config');
226+
return;
227+
}
228+
229+
const targetElement = document.querySelector(videoElementContainer);
230+
if (targetElement) {
231+
232+
if (pause) {
233+
sideEffects.add('stopping video from playing', () => stopVideoFromPlaying(videoElement));
234+
sideEffects.add('appending thumbnail', () =>
235+
appendThumbnailOverlay(/** @type {HTMLElement} */ (targetElement), environment),
236+
);
237+
} else {
238+
sideEffects.destroy('stopping video from playing');
239+
sideEffects.destroy('appending thumbnail');
240+
}
241+
}
242+
});
243+
})
244+
245+
sideEffects.add('subscribing to mute audio', () => {
246+
return messages.subscribeToMuteAudio(({ mute }) => {
247+
logger.log('Running mute audio handler. Mute:', mute);
248+
muteAudio(mute);
249+
});
250+
});
251+
};
252+
253+
const duckPlayerNative = new DuckPlayerNative({
254+
settings,
255+
environment,
256+
messages,
257+
onInit,
258+
onLoad,
259+
});
260+
return duckPlayerNative;
261+
}
262+
165263
/**
166264
* @param {Settings} settings
167265
* @param {Environment} environment

0 commit comments

Comments
 (0)