From 15976777ed95699df46251f792d19f07a32ecb30 Mon Sep 17 00:00:00 2001 From: Ajay Date: Sun, 8 Dec 2024 20:02:32 -0500 Subject: Add option to hide autogenerated chapters by YouTube --- public/_locales | 2 +- .../options/CategorySkipOptionsComponent.tsx | 4 +++ src/config.ts | 2 ++ src/content.ts | 10 +++++-- src/js-components/previewBar.ts | 34 ++++++++++++++++++---- src/utils/pageUtils.ts | 6 ++++ 6 files changed, 50 insertions(+), 8 deletions(-) diff --git a/public/_locales b/public/_locales index 66783829..ffa40bb0 160000 --- a/public/_locales +++ b/public/_locales @@ -1 +1 @@ -Subproject commit 667838290d4d5803586479f6b4de7a90feb20f84 +Subproject commit ffa40bb0a2471906da284f47f830c85aec993c08 diff --git a/src/components/options/CategorySkipOptionsComponent.tsx b/src/components/options/CategorySkipOptionsComponent.tsx index d9d89cf0..99c4e973 100644 --- a/src/components/options/CategorySkipOptionsComponent.tsx +++ b/src/components/options/CategorySkipOptionsComponent.tsx @@ -234,6 +234,10 @@ class CategorySkipOptionsComponent extends React.Component { importingChaptersWaiting = false; }); // eslint-disable-line @typescript-eslint/no-empty-function + }).catch(() => { importingChaptersWaiting = false; }); + + if (!Config.config.showAutogeneratedChapters) { + waitFor(() => hasAutogeneratedChapters(), wait ? 15000 : 0, 400).then(() => { + updateActiveSegment(getCurrentTime()); + }).catch(() => { }); // eslint-disable-line @typescript-eslint/no-empty-function + } } } } diff --git a/src/js-components/previewBar.ts b/src/js-components/previewBar.ts index 84c1e2fd..59b4484f 100644 --- a/src/js-components/previewBar.ts +++ b/src/js-components/previewBar.ts @@ -13,7 +13,7 @@ import { DEFAULT_CATEGORY, shortCategoryName } from "../utils/categoryUtils"; import { normalizeChapterName } from "../utils/exporter"; import { findValidElement } from "../../maze-utils/src/dom"; import { addCleanupListener } from "../../maze-utils/src/cleanup"; -import { isVisible } from "../utils/pageUtils"; +import { hasAutogeneratedChapters, isVisible } from "../utils/pageUtils"; import { isVorapisInstalled } from "../utils/compatibility"; const TOOLTIP_VISIBLE_CLASS = 'sponsorCategoryTooltipVisible'; @@ -365,11 +365,13 @@ class PreviewBar { // Merge overlapping chapters this.unfilteredChapterGroups = this.createChapterRenderGroups(segments); } - - if (segments.every((segments) => segments.source === SponsorSourceType.YouTube) + + if ((segments.every((segments) => segments.source === SponsorSourceType.YouTube) || (!Config.config.renderSegmentsAsChapters && segments.every((segment) => segment.actionType !== ActionType.Chapter - || segment.source === SponsorSourceType.YouTube))) { + || segment.source === SponsorSourceType.YouTube))) + && !(hasAutogeneratedChapters() && !Config.config.showAutogeneratedChapters)) { + if (this.customChaptersBar) this.customChaptersBar.style.display = "none"; this.originalChapterBar.style.removeProperty("display"); return; @@ -395,6 +397,15 @@ class PreviewBar { this.chapterGroups = this.unfilteredChapterGroups; } + if (this.chapterGroups.length === 0 && !Config.config.showAutogeneratedChapters && hasAutogeneratedChapters()) { + // Add placeholder chapter group for whole video + this.chapterGroups = [{ + segment: [0, this.videoDuration], + originalDuration: 0, + actionType: null + }]; + } + if (!this.chapterGroups || this.chapterGroups.length <= 0) { if (this.customChaptersBar) this.customChaptersBar.style.display = "none"; this.originalChapterBar.style.removeProperty("display"); @@ -787,7 +798,8 @@ class PreviewBar { updateChapterText(segments: SponsorTime[], submittingSegments: SponsorTime[], currentTime: number): SponsorTime[] { if (!Config.config.showSegmentNameInChapterBar || Config.config.disableSkipping - || ((!segments || segments.length <= 0) && submittingSegments?.length <= 0)) { + || ((!segments || segments.length <= 0) && submittingSegments?.length <= 0 + && (Config.config.showAutogeneratedChapters || !hasAutogeneratedChapters()))) { const chaptersContainer = this.getChaptersContainer(); if (chaptersContainer) { chaptersContainer.querySelector(".sponsorChapterText")?.remove(); @@ -875,6 +887,18 @@ class PreviewBar { } else { this.chapterVote.setVisibility(false); } + } else if (!Config.config.showAutogeneratedChapters && hasAutogeneratedChapters()) { + // Keep original hidden + chaptersContainer.querySelector(".sponsorChapterText")?.remove(); + const chapterTitle = chaptersContainer.querySelector(".ytp-chapter-title-content") as HTMLDivElement; + + chapterTitle.style.display = "none"; + chaptersContainer.classList.remove("sponsorblock-chapter-visible"); + + const titlePrefixDot = chaptersContainer.querySelector(".ytp-chapter-title-prefix") as HTMLElement; + if (titlePrefixDot) titlePrefixDot.style.display = "none"; + + this.chapterVote.setVisibility(false); } else { chaptersContainer.querySelector(".sponsorChapterText")?.remove(); const chapterTitle = chaptersContainer.querySelector(".ytp-chapter-title-content") as HTMLDivElement; diff --git a/src/utils/pageUtils.ts b/src/utils/pageUtils.ts index 69c9d7f4..4727ecc5 100644 --- a/src/utils/pageUtils.ts +++ b/src/utils/pageUtils.ts @@ -1,5 +1,6 @@ import { ActionType, Category, SponsorSourceType, SponsorTime, VideoID } from "../types"; import { getFormattedTimeToSeconds } from "../../maze-utils/src/formating"; +import Config from "../config"; export function getControls(): HTMLElement { const controlsSelectors = [ @@ -55,10 +56,15 @@ export function getHashParams(): Record { return {}; } +export function hasAutogeneratedChapters(): boolean { + return !!document.querySelector("ytd-engagement-panel-section-list-renderer ytd-macro-markers-list-renderer #menu"); +} + export function getExistingChapters(currentVideoID: VideoID, duration: number): SponsorTime[] { const chaptersBox = document.querySelector("ytd-macro-markers-list-renderer"); const title = chaptersBox?.closest("ytd-engagement-panel-section-list-renderer")?.querySelector("#title-text.ytd-engagement-panel-title-header-renderer"); if (title?.textContent?.includes("Key moment")) return []; + if (!Config.config.showAutogeneratedChapters && hasAutogeneratedChapters()) return []; const chapters: SponsorTime[] = []; // .ytp-timed-markers-container indicates that key-moments are present, which should not be divided -- cgit v1.2.3