diff --git a/src/components/options/AdvancedSkipOptionsComponent.tsx b/src/components/options/AdvancedSkipOptionsComponent.tsx index ddc31efe..374ff1bb 100644 --- a/src/components/options/AdvancedSkipOptionsComponent.tsx +++ b/src/components/options/AdvancedSkipOptionsComponent.tsx @@ -141,7 +141,7 @@ function compileConfig(config: string): AdvancedSkipRuleSet[] | null { return null; // Invalid category value } else if (attribute === SkipRuleAttribute.Source && operator === SkipRuleOperator.Equal - && !["local", "youtube", "server"].includes(value as string)) { + && !["local", "youtube", "autogenerated", "server"].includes(value as string)) { return null; // Invalid category value } diff --git a/src/js-components/previewBar.ts b/src/js-components/previewBar.ts index 9cb0d1d0..bbd70daa 100644 --- a/src/js-components/previewBar.ts +++ b/src/js-components/previewBar.ts @@ -299,14 +299,14 @@ class PreviewBar { set(segments: PreviewBarSegment[], videoDuration: number): void { this.segments = segments ?? []; this.videoDuration = videoDuration ?? 0; - this.hasYouTubeChapters = segments.some((segment) => segment.source === SponsorSourceType.YouTube); + this.hasYouTubeChapters = segments.some((segment) => [SponsorSourceType.YouTube, SponsorSourceType.Autogenerated].includes(segment.source)); // Remove unnecessary original chapters if submitted replacements exist for (const chapter of this.segments.filter((s) => s.actionType === ActionType.Chapter && s.source === SponsorSourceType.Server)) { const segmentDuration = chapter.segment[1] - chapter.segment[0]; const duplicate = this.segments.find((s) => s.actionType === ActionType.Chapter - && s.source === SponsorSourceType.YouTube + && [SponsorSourceType.YouTube, SponsorSourceType.Autogenerated].includes(s.source) && Math.abs(s.segment[0] - chapter.segment[0]) < Math.min(3, segmentDuration / 3) && Math.abs(s.segment[1] - chapter.segment[1]) < Math.min(3, segmentDuration / 3)); @@ -354,7 +354,7 @@ class PreviewBar { this.chapterMargin = 2; if (this.originalChapterBar) { this.originalChapterBarBlocks = this.originalChapterBar.querySelectorAll(":scope > div") as NodeListOf - this.existingChapters = this.segments.filter((s) => s.source === SponsorSourceType.YouTube).sort((a, b) => a.segment[0] - b.segment[0]); + this.existingChapters = this.segments.filter((s) => [SponsorSourceType.YouTube, SponsorSourceType.Autogenerated].includes(s.source)).sort((a, b) => a.segment[0] - b.segment[0]); if (this.existingChapters?.length > 0) { const margin = parseFloat(this.originalChapterBarBlocks?.[0]?.style?.marginRight?.replace("px", "")); @@ -376,7 +376,7 @@ class PreviewBar { this.createChaptersBar(this.segments.sort((a, b) => a.segment[0] - b.segment[0])); if (chapterChevron) { - if (this.segments.some((segment) => segment.source === SponsorSourceType.YouTube)) { + if (this.segments.some((segment) => [SponsorSourceType.YouTube, SponsorSourceType.Autogenerated].includes(segment.source))) { chapterChevron.style.removeProperty("display"); } else if (this.segments) { chapterChevron.style.display = "none"; @@ -438,10 +438,10 @@ class PreviewBar { this.unfilteredChapterGroups = this.createChapterRenderGroups(segments); } - if ((segments.every((segments) => segments.source === SponsorSourceType.YouTube) + if ((segments.every((segment) => [SponsorSourceType.YouTube, SponsorSourceType.Autogenerated].includes(segment.source)) || (!Config.config.renderSegmentsAsChapters && segments.every((segment) => segment.actionType !== ActionType.Chapter - || segment.source === SponsorSourceType.YouTube))) + || [SponsorSourceType.YouTube, SponsorSourceType.Autogenerated].includes(segment.source)))) && !(hasAutogeneratedChapters() && !Config.config.showAutogeneratedChapters)) { if (this.customChaptersBar) this.customChaptersBar.style.display = "none"; diff --git a/src/types.ts b/src/types.ts index d994ba36..69cc53f1 100644 --- a/src/types.ts +++ b/src/types.ts @@ -70,7 +70,8 @@ export type Category = string & { __categoryBrand: unknown }; export enum SponsorSourceType { Server = undefined, Local = 1, - YouTube = 2 + YouTube = 2, + Autogenerated = 3 } export interface SegmentContainer { diff --git a/src/utils/exporter.ts b/src/utils/exporter.ts index c3f2ee2d..46494ba8 100644 --- a/src/utils/exporter.ts +++ b/src/utils/exporter.ts @@ -16,7 +16,7 @@ export function exportTimes(segments: SponsorTime[]): string { let result = ""; for (const segment of segments) { if (![ActionType.Full, ActionType.Mute].includes(segment.actionType) - && segment.source !== SponsorSourceType.YouTube) { + && [SponsorSourceType.YouTube, SponsorSourceType.Autogenerated].includes(segment.source)) { result += exportTime(segment) + "\n"; } } diff --git a/src/utils/pageUtils.ts b/src/utils/pageUtils.ts index e9b681f0..9d09e62c 100644 --- a/src/utils/pageUtils.ts +++ b/src/utils/pageUtils.ts @@ -68,7 +68,9 @@ export function getExistingChapters(currentVideoID: VideoID, duration: number): 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 autogenerated = hasAutogeneratedChapters(); + if (!Config.config.showAutogeneratedChapters && autogenerated) return []; const chapters: SponsorTime[] = []; // .ytp-timed-markers-container indicates that key-moments are present, which should not be divided @@ -92,7 +94,7 @@ export function getExistingChapters(currentVideoID: VideoID, duration: number): category: "chapter" as Category, actionType: ActionType.Chapter, description: description.innerText, - source: SponsorSourceType.YouTube, + source: autogenerated ? SponsorSourceType.Autogenerated : SponsorSourceType.YouTube, UUID: null }; } diff --git a/src/utils/segmentData.ts b/src/utils/segmentData.ts index a8ad3c91..77f7a83c 100644 --- a/src/utils/segmentData.ts +++ b/src/utils/segmentData.ts @@ -139,6 +139,8 @@ function getSkipRuleValue(segment: SponsorTime | VideoLabelsCacheData, rule: Adv return "local"; case SponsorSourceType.YouTube: return "youtube"; + case SponsorSourceType.Autogenerated: + return "autogenerated"; case SponsorSourceType.Server: return "server"; }