From 36efe139ba2f689d3af0210cd3e1497bfb606e57 Mon Sep 17 00:00:00 2001 From: Ajay Date: Tue, 4 Oct 2022 22:08:19 -0400 Subject: [PATCH] Fix wait for element not working on embed, causing segments not to load Fix #1497 --- src/content.ts | 11 +++++++---- src/types.ts | 3 ++- src/utils.ts | 21 ++++++++++++++------- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/content.ts b/src/content.ts index c30a35c8..e2faa8dd 100644 --- a/src/content.ts +++ b/src/content.ts @@ -130,8 +130,9 @@ const playerButtons: Record Config.config !== null, 1000, 1).then(() => videoIDChange(getYouTubeVideoID(document))); // wait for hover preview to appear, and refresh attachments if ever found -utils.waitForElement(".ytp-inline-preview-ui").then(() => refreshVideoAttachments()) -utils.waitForElement("a.ytp-title-link[data-sessionlink='feature=player-title']").then(() => videoIDChange(getYouTubeVideoID(document)).then()) +utils.waitForElement(".ytp-inline-preview-ui").then(() => refreshVideoAttachments()); +utils.waitForElement("a.ytp-title-link[data-sessionlink='feature=player-title']") + .then(() => videoIDChange(getYouTubeVideoID(document))); addPageListeners(); addHotkeyListener(); @@ -1223,7 +1224,7 @@ function getYouTubeVideoID(document: Document, url?: string): string | boolean { // clips should never skip, going from clip to full video has no indications. if (url.includes("youtube.com/clip/")) return false; // skip to document and don't hide if on /embed/ - if (url.includes("/embed/") && url.includes("youtube.com")) return getYouTubeVideoIDFromDocument(false); + if (url.includes("/embed/") && url.includes("youtube.com")) return getYouTubeVideoIDFromDocument(false, PageType.Embed); // skip to URL if matches youtube watch or invidious or matches youtube pattern if ((!url.includes("youtube.com")) || url.includes("/watch") || url.includes("/shorts/") || url.includes("playlist")) return getYouTubeVideoIDFromURL(url); // skip to document if matches pattern @@ -1233,8 +1234,10 @@ function getYouTubeVideoID(document: Document, url?: string): string | boolean { } function getYouTubeVideoIDFromDocument(hideIcon = true, pageHint = PageType.Watch): string | boolean { + const selector = "a.ytp-title-link[data-sessionlink='feature=player-title']"; // get ID from document (channel trailer / embedded playlist) - const element = video?.parentElement?.parentElement?.querySelector("a.ytp-title-link[data-sessionlink='feature=player-title']"); + const element = pageHint === PageType.Embed ? document.querySelector(selector) + : video?.parentElement?.parentElement?.querySelector(selector); const videoURL = element?.getAttribute("href"); if (videoURL) { onInvidious = hideIcon; diff --git a/src/types.ts b/src/types.ts index f90d199d..50b20374 100644 --- a/src/types.ts +++ b/src/types.ts @@ -244,7 +244,8 @@ export enum PageType { Watch = "watch", Search = "search", Browse = "browse", - Channel = "channel" + Channel = "channel", + Embed = "embed" } export interface ButtonListener { diff --git a/src/utils.ts b/src/utils.ts index 081e014e..fd24cc3b 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -65,7 +65,7 @@ export default class Utils { private setupWaitingMutationListener(): void { if (!this.waitingMutationObserver) { - this.waitingMutationObserver = new MutationObserver(() => { + const checkForObjects = () => { const foundSelectors = []; for (const { selector, visibleCheck, callback } of this.waitingElements) { const element = this.getElement(selector, visibleCheck); @@ -78,16 +78,23 @@ export default class Utils { this.waitingElements = this.waitingElements.filter((element) => !foundSelectors.includes(element.selector)); if (this.waitingElements.length === 0) { - this.waitingMutationObserver.disconnect(); + this.waitingMutationObserver?.disconnect(); this.waitingMutationObserver = null; this.creatingWaitingMutationObserver = false; } - }); + }; - this.waitingMutationObserver.observe(document.body, { - childList: true, - subtree: true - }); + // Do an initial check over all objects + checkForObjects(); + + if (this.waitingElements.length > 0) { + this.waitingMutationObserver = new MutationObserver(checkForObjects); + + this.waitingMutationObserver.observe(document.body, { + childList: true, + subtree: true + }); + } } }