Cache chapter nesting results

This commit is contained in:
mini-bomba
2025-09-19 16:17:30 +02:00
parent 5043a5fbe2
commit 915fd70274

View File

@@ -28,8 +28,8 @@ enum SegmentListTab {
Chapter Chapter
} }
interface segmentWithNesting extends SponsorTime { interface SegmentWithNesting extends SponsorTime {
innerChapters?: (segmentWithNesting|SponsorTime)[]; innerChapters?: (SegmentWithNesting|SponsorTime)[];
} }
export const SegmentListComponent = (props: SegmentListComponentProps) => { export const SegmentListComponent = (props: SegmentListComponentProps) => {
@@ -58,37 +58,41 @@ export const SegmentListComponent = (props: SegmentListComponentProps) => {
} }
}; };
const segmentsWithNesting: segmentWithNesting[] = []; const segmentsWithNesting = React.useMemo(() => {
let nbTrailingNonChapters = 0; const result: SegmentWithNesting[] = [];
function nestChapters(segments: segmentWithNesting[], seg: SponsorTime, topLevel?: boolean) { let nbTrailingNonChapters = 0;
if (seg.actionType === ActionType.Chapter && segments.length) { function nestChapters(segments: SegmentWithNesting[], seg: SponsorTime, topLevel?: boolean) {
// trailing non-chapters can only exist at top level if (seg.actionType === ActionType.Chapter && segments.length) {
const lastElement = segments[segments.length - (topLevel ? nbTrailingNonChapters + 1 : 1)] // trailing non-chapters can only exist at top level
const lastElement = segments[segments.length - (topLevel ? nbTrailingNonChapters + 1 : 1)]
if (lastElement.actionType === ActionType.Chapter if (lastElement.actionType === ActionType.Chapter
&& lastElement.segment[0] <= seg.segment[0] && lastElement.segment[0] <= seg.segment[0]
&& lastElement.segment[1] >= seg.segment[1]) { && lastElement.segment[1] >= seg.segment[1]) {
if (lastElement.innerChapters){ if (lastElement.innerChapters){
nestChapters(lastElement.innerChapters, seg); nestChapters(lastElement.innerChapters, seg);
} else {
lastElement.innerChapters = [seg];
}
} else { } else {
lastElement.innerChapters = [seg]; if (topLevel) {
} nbTrailingNonChapters = 0;
} else { }
if (topLevel) {
nbTrailingNonChapters = 0;
}
segments.push(seg); segments.push(seg);
}
} else {
if (seg.actionType !== ActionType.Chapter) {
nbTrailingNonChapters++;
} }
} else {
if (seg.actionType !== ActionType.Chapter) {
nbTrailingNonChapters++;
}
segments.push(seg); segments.push(seg);
}
} }
} props.segments.forEach((seg) => nestChapters(result, {...seg}, true));
props.segments.forEach((seg) => nestChapters(segmentsWithNesting, {...seg}, true)); return result;
}, [props.segments])
return ( return (
<div id="issueReporterContainer"> <div id="issueReporterContainer">
@@ -136,7 +140,7 @@ export const SegmentListComponent = (props: SegmentListComponentProps) => {
}; };
function SegmentListItem({ segment, videoID, currentTime, isVip, loopedChapter, tabFilter, sendMessage }: { function SegmentListItem({ segment, videoID, currentTime, isVip, loopedChapter, tabFilter, sendMessage }: {
segment: segmentWithNesting; segment: SegmentWithNesting;
videoID: VideoID; videoID: VideoID;
currentTime: number; currentTime: number;
isVip: boolean; isVip: boolean;
@@ -351,7 +355,7 @@ function SegmentListItem({ segment, videoID, currentTime, isVip, loopedChapter,
} }
function InnerChapterList({ chapters, videoID, currentTime, isVip, loopedChapter, tabFilter, sendMessage }: { function InnerChapterList({ chapters, videoID, currentTime, isVip, loopedChapter, tabFilter, sendMessage }: {
chapters: (segmentWithNesting)[]; chapters: (SegmentWithNesting)[];
videoID: VideoID; videoID: VideoID;
currentTime: number; currentTime: number;
isVip: boolean; isVip: boolean;