fix(stats): stop counting duplicate typeset subtitle lines (#191)

This commit is contained in:
2026-08-14 00:12:56 -07:00
committed by GitHub
parent 046e74ea91
commit b98d4d65c7
34 changed files with 2644 additions and 35 deletions
+12
View File
@@ -18,6 +18,7 @@ import type {
SessionTimelinePoint,
StatsAnkiNoteInfo,
StatsCoverImagesData,
StatsDuplicateLineCleanupResult,
StatsExcludedWord,
StreakCalendarDay,
TrendsDashboardData,
@@ -31,6 +32,13 @@ export type StatsTrendRange = '7d' | '30d' | '90d' | '365d' | 'all';
export type StatsTrendGroupBy = 'day' | 'month';
export type StatsMineMode = 'word' | 'sentence' | 'audio';
/** Body of `POST /api/stats/maintenance/duplicate-lines`. */
export interface StatsDuplicateLineCleanupRequest {
dryRun?: boolean;
/** Null means every recorded line, whatever its age. */
lookbackDays?: number | null;
}
export interface StatsSessionKnownWordsTimelinePoint {
linesSeen: number;
knownWordsSeen: number;
@@ -125,6 +133,7 @@ export interface StatsJsonResponseMap {
vocabulary: VocabularyEntry[];
excludedWords: StatsExcludedWord[];
setExcludedWords: StatsOkResponse;
duplicateLineCleanup: StatsDuplicateLineCleanupResult;
wordOccurrences: VocabularyOccurrenceEntry[];
sentenceSearch: SentenceSearchResult[];
kanji: KanjiEntry[];
@@ -178,6 +187,9 @@ export interface StatsHttpClient {
getVocabulary: (limit?: number) => Promise<VocabularyEntry[]>;
getExcludedWords: () => Promise<StatsExcludedWord[]>;
setExcludedWords: (words: StatsExcludedWord[]) => Promise<void>;
cleanupDuplicateLines: (
options?: StatsDuplicateLineCleanupRequest,
) => Promise<StatsDuplicateLineCleanupResult>;
getWordOccurrences: (
headword: string,
word: string,
+23
View File
@@ -82,6 +82,29 @@ export interface StatsExcludedWord {
reading: string;
}
/** One animation burst the duplicate-line cleanup found in the stats database. */
export interface StatsDuplicateLineSample {
videoId: number;
videoTitle: string | null;
text: string;
/** Events recorded for this run, including the one that is kept. */
frames: number;
removedLines: number;
startMs: number;
endMs: number;
}
export interface StatsDuplicateLineCleanupResult {
dryRun: boolean;
lookbackDays: number | null;
scannedLines: number;
burstGroups: number;
removedLines: number;
removedWordOccurrences: number;
removedKanjiOccurrences: number;
samples: StatsDuplicateLineSample[];
}
export interface StatsCoverImage {
contentType: string;
dataUrl: string;