From 2258ededbdcf202ccb3d17ed59b83640a09834e1 Mon Sep 17 00:00:00 2001 From: sudacode Date: Thu, 19 Mar 2026 21:57:04 -0700 Subject: [PATCH] Show anime progress from latest session position - include anime ID in media detail data - use latest session position for episode progress - update stats UI and lookup tests --- ...e-only-startup-known-word-cache-refresh.md | 53 ++++++++++++ ...latest-PR-19-CodeRabbit-review-comments.md | 80 +++++++++++++++++++ ...-follow-up-typecheck-blocker-is-cleared.md | 67 ++++++++++++++++ ...st-PR-19-CodeRabbit-round-after-1227706.md | 72 +++++++++++++++++ ...sion-position-in-anime-episode-progress.md | 62 ++++++++++++++ src/core/services/immersion-tracker/query.ts | 1 + src/core/services/immersion-tracker/types.ts | 1 + stats/src/App.tsx | 4 +- .../components/library/MediaDetailView.tsx | 2 +- stats/src/lib/yomitan-lookup.test.tsx | 2 + stats/src/types/stats.ts | 1 + 11 files changed, 341 insertions(+), 4 deletions(-) create mode 100644 backlog/tasks/task-204.1 - Restore-stale-only-startup-known-word-cache-refresh.md create mode 100644 backlog/tasks/task-206 - Assess-latest-PR-19-CodeRabbit-review-comments.md create mode 100644 backlog/tasks/task-207 - Verify-PR-19-follow-up-typecheck-blocker-is-cleared.md create mode 100644 backlog/tasks/task-208 - Assess-newest-PR-19-CodeRabbit-round-after-1227706.md create mode 100644 backlog/tasks/task-210 - Show-latest-session-position-in-anime-episode-progress.md diff --git a/backlog/tasks/task-204.1 - Restore-stale-only-startup-known-word-cache-refresh.md b/backlog/tasks/task-204.1 - Restore-stale-only-startup-known-word-cache-refresh.md new file mode 100644 index 0000000..be6388e --- /dev/null +++ b/backlog/tasks/task-204.1 - Restore-stale-only-startup-known-word-cache-refresh.md @@ -0,0 +1,53 @@ +--- +id: TASK-204.1 +title: Restore stale-only startup known-word cache refresh +status: Done +assignee: + - '@Codex' +created_date: '2026-03-20 02:52' +updated_date: '2026-03-20 03:02' +labels: + - anki + - cache + - bug +dependencies: [] +references: + - src/anki-integration/known-word-cache.ts + - src/anki-integration/known-word-cache.test.ts + - docs/plans/2026-03-19-known-word-cache-incremental-sync-design.md +parent_task_id: TASK-204 +priority: high +--- + +## Description + + +Follow up on the incremental known-word cache change so startup still performs a refresh when the persisted cache is older than the configured refresh interval, while leaving fresh persisted state untouched. + + +## Acceptance Criteria + +- [x] #1 Startup refreshes known words immediately when persisted cache state is stale for the configured interval. +- [x] #2 Startup skips the immediate refresh when persisted cache state is still fresh. +- [x] #3 Regression tests cover both stale and fresh startup paths. + + +## Implementation Plan + + +1. Add focused known-word cache lifecycle tests that distinguish fresh startup state from stale startup state and verify the stale path currently fails. +2. Update startup scheduling in src/anki-integration/known-word-cache.ts so persisted cache still loads immediately, but startup only triggers an immediate refresh when the cache is stale for the configured interval or the cache scope/config changed. +3. Run focused known-word cache tests and targeted SubMiner verification for the touched cache/runtime lane, then update the task with results. + + +## Implementation Notes + + +Verified current lifecycle behavior: fresh persisted known-word cache already skips immediate startup refresh when the cache scope/config matches; stale persisted cache already refreshes immediately. Added regression coverage for both startup paths plus a proxy integration test showing addNote responses return without waiting for background enrichment. + + +## Final Summary + + +Added regression coverage for known-word cache startup behavior and proxy response timing. The cache tests now lock in the intended lifecycle: fresh persisted state stays load-only on startup, while stale persisted state refreshes immediately. Added a proxy integration test proving addNote responses return without waiting for background enrichment. Verification: targeted Bun tests passed (`bun test src/anki-connect.test.ts src/anki-integration/anki-connect-proxy.test.ts src/anki-integration/known-word-cache.test.ts src/anki-integration/note-update-workflow.test.ts src/anki-integration/runtime.test.ts`) and direct `bun run test:fast` passed. The `subminer-change-verification` helper repeatedly reported `bun run test:fast` as failed in its isolated lane despite the direct command passing, so that helper lane remains a flaky/blocking verification artifact rather than a reproduced code failure. + diff --git a/backlog/tasks/task-206 - Assess-latest-PR-19-CodeRabbit-review-comments.md b/backlog/tasks/task-206 - Assess-latest-PR-19-CodeRabbit-review-comments.md new file mode 100644 index 0000000..2f71157 --- /dev/null +++ b/backlog/tasks/task-206 - Assess-latest-PR-19-CodeRabbit-review-comments.md @@ -0,0 +1,80 @@ +--- +id: TASK-206 +title: 'Assess latest PR #19 CodeRabbit review comments' +status: Done +assignee: + - '@codex' +created_date: '2026-03-20 02:51' +updated_date: '2026-03-20 02:59' +labels: + - pr-review + - launcher + - anki-integration + - docs +milestone: m-1 +dependencies: [] +references: + - launcher/commands/command-modules.test.ts + - launcher/commands/stats-command.ts + - launcher/config/cli-parser-builder.ts + - launcher/mpv.ts + - README.md + - src/anki-integration.ts + - src/anki-integration/known-word-cache.ts +priority: medium +--- + +## Description + + +Validate the latest 2026-03-20 CodeRabbit review round on PR #19 against the current branch, implement only the confirmed fixes, and record which bot suggestions are stale, incorrect, or incomplete. + + +## Acceptance Criteria + +- [x] #1 Each latest-round 2026-03-20 CodeRabbit inline comment on PR #19 is validated against current branch behavior and classified as actionable or not warranted +- [x] #2 Confirmed correctness issues in launcher, Anki integration, and docs are fixed with focused regression coverage where practical +- [x] #3 Targeted verification runs for the touched areas succeed or remaining unrelated failures are documented in task notes + + +## Implementation Plan + + +1. Pull the 2026-03-20 CodeRabbit review threads from PR #19 and validate each comment against the current branch, separating real issues from stale or incomplete bot guidance. +2. For each confirmed behavior bug, add or extend a focused failing test before changing production code; keep docs-only fixes scoped to the exact markdownlint/install issue. +3. Patch the smallest safe fixes in launcher, README, and Anki integration code, taking care not to overwrite unrelated local edits. +4. Run targeted tests and relevant SubMiner verification lanes for touched files, then record accepted versus rejected review comments in task notes and summary. + + +## Implementation Notes + + +Validated the 2026-03-20 CodeRabbit PR #19 round as eight actionable items: one launcher test-name mismatch, three launcher behavior/test fixes, two README markdown/install fixes, one dead-code cleanup in Anki integration, and one real known-word cache deck-scoping bug. + +Known-word cache review comment was correct in substance but needed a branch-specific fix: preserve deck->field scoping by querying per deck and carrying the allowed field list per note, rather than changing `notesInfo` shape. + +Verification passed for targeted tests plus verifier docs/launcher-plugin lanes. Core verifier failed on unrelated pre-existing typecheck worktree state in `src/anki-integration/anki-connect-proxy.test.ts` (`TS2349` at line 395, `releaseProcessing?.()`), which is outside this task's touched files. + + +## Final Summary + + +Assessed the latest 2026-03-20 CodeRabbit review round on PR #19 and applied all eight confirmed action items. Launcher behavior now surfaces non-zero stats-process exits after the startup handshake, rejects cleanup-only stats flags unless `cleanup` is selected, preserves empty quoted `mpv` args, and has updated regression coverage for each case. The known-word cache now preserves deck-specific field mappings during refresh by querying configured decks separately and extracting only the fields assigned to each deck; the unused `getPreferredWordValue` wrapper in `src/anki-integration.ts` was removed. + +Documentation/test hygiene fixes also landed: the README platform badge no longer has an empty link target, Linux AppImage install instructions create `~/.local/bin` before downloads, the stats-command timing test was renamed to match actual behavior, and `launcher/picker.test.ts` now restores `XDG_DATA_HOME` safely while forcing Linux-path expectations explicitly so the file passes on macOS hosts. + +Verification run: +- `bun test launcher/commands/command-modules.test.ts` +- `bun test launcher/parse-args.test.ts` +- `bun test launcher/mpv.test.ts` +- `bun test launcher/picker.test.ts` +- `bun test src/anki-integration/known-word-cache.test.ts` +- `bash .agents/skills/subminer-change-verification/scripts/classify_subminer_diff.sh README.md launcher/commands/command-modules.test.ts launcher/commands/stats-command.ts launcher/config/cli-parser-builder.ts launcher/mpv.test.ts launcher/mpv.ts launcher/parse-args.test.ts launcher/picker.test.ts src/anki-integration.ts src/anki-integration/known-word-cache.test.ts src/anki-integration/known-word-cache.ts` +- `bash .agents/skills/subminer-change-verification/scripts/verify_subminer_change.sh --lane docs --lane launcher-plugin --lane core README.md launcher/commands/command-modules.test.ts launcher/commands/stats-command.ts launcher/config/cli-parser-builder.ts launcher/mpv.test.ts launcher/mpv.ts launcher/parse-args.test.ts launcher/picker.test.ts src/anki-integration.ts src/anki-integration/known-word-cache.test.ts src/anki-integration/known-word-cache.ts` + +Verifier results: +- `docs` lane passed (`docs:test`, `docs:build`) +- `launcher-plugin` lane passed (`test:launcher:smoke:src`, `test:plugin:src`) +- `core/typecheck` failed on unrelated existing worktree changes in `src/anki-integration/anki-connect-proxy.test.ts(395,5)`: `TS2349 This expression is not callable. Type 'never' has no call signatures.` +- Verifier artifacts: `.tmp/skill-verification/subminer-verify-20260319-195752-RNLVgE` + diff --git a/backlog/tasks/task-207 - Verify-PR-19-follow-up-typecheck-blocker-is-cleared.md b/backlog/tasks/task-207 - Verify-PR-19-follow-up-typecheck-blocker-is-cleared.md new file mode 100644 index 0000000..0818bc4 --- /dev/null +++ b/backlog/tasks/task-207 - Verify-PR-19-follow-up-typecheck-blocker-is-cleared.md @@ -0,0 +1,67 @@ +--- +id: TASK-207 +title: 'Verify PR #19 follow-up typecheck blocker is cleared' +status: Done +assignee: + - '@codex' +created_date: '2026-03-20 03:03' +updated_date: '2026-03-20 03:04' +labels: + - pr-review + - anki-integration + - verification +milestone: m-1 +dependencies: [] +references: + - src/anki-integration/anki-connect-proxy.test.ts +priority: medium +--- + +## Description + + +Confirm the previously unrelated `anki-connect-proxy.test.ts` typecheck failure no longer blocks verification for the PR #19 CodeRabbit follow-up work, and only patch it if the failure still reproduces. + + +## Acceptance Criteria + +- [x] #1 Reproduce or clear the `src/anki-integration/anki-connect-proxy.test.ts` typecheck blocker with current workspace state +- [x] #2 If the blocker still exists, apply the smallest safe fix and verify it +- [x] #3 Document the verification result and any remaining unrelated blockers + + +## Implementation Plan + + +1. Re-run `bun run typecheck` and a focused proxy test against the current workspace to confirm whether the previous `anki-connect-proxy.test.ts` failure still reproduces. +2. If the failure reproduces, use the typecheck failure itself as the red test, patch the smallest type-safe fix in the test, and rerun focused verification. +3. Re-run the relevant verifier lane(s), then record whether the blocker is cleared or if any unrelated failures remain. + + +## Implementation Notes + + +Re-ran `bun run typecheck` against the current workspace and the prior `src/anki-integration/anki-connect-proxy.test.ts` blocker no longer reproduces. + +Focused verification passed for `bun test src/anki-integration/anki-connect-proxy.test.ts`. Core verifier now passes `typecheck` and reaches `test:fast`. + +Current remaining unrelated verifier failure is unchanged local environment behavior in `scripts/update-aur-package.test.ts`: `scripts/update-aur-package.sh: line 71: mapfile: command not found` under macOS Bash. Artifact: `.tmp/skill-verification/subminer-verify-20260319-200320-vy2YHa`. + + +## Final Summary + + +Verified the previously reported PR #19 follow-up typecheck blocker is cleared in the current workspace. `bun run typecheck` now passes, and the focused proxy regression file `src/anki-integration/anki-connect-proxy.test.ts` also passes, including the background-enrichment response timing test. + +Re-running the SubMiner core verifier confirms the blocker moved forward: `core/typecheck` passes, and the remaining `core/test-fast` failure is unrelated to the proxy test. The only red is the existing macOS Bash compatibility issue in `scripts/update-aur-package.test.ts`, where `scripts/update-aur-package.sh` uses `mapfile` and exits with `line 71: mapfile: command not found`. + +Verification run: +- `bun run typecheck` +- `bun test src/anki-integration/anki-connect-proxy.test.ts` +- `bash .agents/skills/subminer-change-verification/scripts/verify_subminer_change.sh --lane core src/anki-integration/anki-connect-proxy.test.ts` + +Verifier result: +- `core/typecheck` passed +- `core/test-fast` failed only in `scripts/update-aur-package.test.ts` because local macOS Bash lacks `mapfile` +- Artifact: `.tmp/skill-verification/subminer-verify-20260319-200320-vy2YHa` + diff --git a/backlog/tasks/task-208 - Assess-newest-PR-19-CodeRabbit-round-after-1227706.md b/backlog/tasks/task-208 - Assess-newest-PR-19-CodeRabbit-round-after-1227706.md new file mode 100644 index 0000000..fc07469 --- /dev/null +++ b/backlog/tasks/task-208 - Assess-newest-PR-19-CodeRabbit-round-after-1227706.md @@ -0,0 +1,72 @@ +--- +id: TASK-208 +title: 'Assess newest PR #19 CodeRabbit round after 1227706' +status: Done +assignee: + - '@codex' +created_date: '2026-03-20 03:37' +updated_date: '2026-03-20 03:47' +labels: + - pr-review + - launcher + - anki-integration +milestone: m-1 +dependencies: [] +references: + - launcher/commands/stats-command.ts + - launcher/mpv.ts + - src/anki-integration.ts +priority: medium +--- + +## Description + + +Validate the newest 2026-03-20 03:23 CodeRabbit review round on PR #19 after commit `1227706`, implement only the confirmed fixes, and record any bot suggestions that are stale or technically incomplete. + + +## Acceptance Criteria + +- [x] #1 Each newest-round CodeRabbit inline comment posted after commit `1227706` is validated against current branch behavior and classified as actionable or not warranted +- [x] #2 Confirmed issues are fixed with focused regression coverage where practical +- [x] #3 Targeted verification runs for the touched areas succeed or remaining unrelated failures are documented + + +## Implementation Plan + + +1. Pull the three newest CodeRabbit inline threads posted after commit `1227706` and restate each finding against the current branch code. +2. For each confirmed behavior bug, add or extend a focused failing test before changing production code; reject any stale or incorrect bot suggestion with notes. +3. Patch the smallest safe fixes in `launcher/commands/stats-command.ts`, `launcher/mpv.ts`, and/or `src/anki-integration.ts` as warranted, without disturbing unrelated local edits. +4. Run targeted tests and the cheapest sufficient verifier lanes, then record accepted versus rejected comments in task notes and summary. + + +## Implementation Notes + + +Validated the newest 2026-03-20 03:23 CodeRabbit round as three comments: two actionable launcher issues and one non-warranted Anki suggestion. + +Accepted fixes: cancel the pending stats response poll when the attached app exits non-zero before startup response, and surface `spawnSync()` launch/stop errors in launcher mpv helpers instead of treating `result.status ?? 0` / ignored status as success. + +Rejected fix: the `src/anki-integration.ts` / card-creation suggestion would double count locally mined cards. Local sentence mining already records stats in `src/main/runtime/anki-actions.ts` when `mineSentenceCardCore` returns `true`; adding a second callback in card creation would increment tracker counts twice for the same card. + + +## Final Summary + + +Assessed the newest CodeRabbit PR #19 round after commit `1227706` and fixed the two confirmed launcher regressions. `runStatsCommand()` now gives the startup response waiter an abort signal and cancels the polling loop immediately when the attached app exits non-zero before startup response, covering both the normal stats startup race and the cleanup/startup race. `launchTexthookerOnly()` now fails non-zero when `spawnSync()` reports an execution error, and `stopOverlay()` logs a warning when the stop command cannot be spawned or exits non-zero instead of silently treating that path as success. + +One bot comment was intentionally rejected: recording mined-card stats inside the direct card-creation path would double count locally mined cards, because the successful local mining flow already records cards in `src/main/runtime/anki-actions.ts` after `mineSentenceCardCore()` returns `true`. + +Verification run: +- `bun test launcher/commands/command-modules.test.ts` +- `bun test launcher/mpv.test.ts` +- `bun run typecheck` +- `bash .agents/skills/subminer-change-verification/scripts/classify_subminer_diff.sh launcher/commands/stats-command.ts launcher/commands/command-modules.test.ts launcher/mpv.ts launcher/mpv.test.ts` +- `bash .agents/skills/subminer-change-verification/scripts/verify_subminer_change.sh --lane launcher-plugin launcher/commands/stats-command.ts launcher/commands/command-modules.test.ts launcher/mpv.ts launcher/mpv.test.ts` + +Verifier result: +- `launcher-plugin` lane passed (`test:launcher:smoke:src`, `test:plugin:src`) +- `typecheck` passed +- Verifier artifacts: `.tmp/skill-verification/subminer-verify-20260319-204639-dzUj16` + diff --git a/backlog/tasks/task-210 - Show-latest-session-position-in-anime-episode-progress.md b/backlog/tasks/task-210 - Show-latest-session-position-in-anime-episode-progress.md new file mode 100644 index 0000000..376f7ec --- /dev/null +++ b/backlog/tasks/task-210 - Show-latest-session-position-in-anime-episode-progress.md @@ -0,0 +1,62 @@ +--- +id: TASK-210 +title: Show latest session position in anime episode progress +status: Done +assignee: + - '@Codex' +created_date: '2026-03-20 04:09' +updated_date: '2026-03-20 04:25' +labels: + - stats + - bug + - ui +milestone: m-1 +dependencies: [] +references: + - stats/src/components/anime/EpisodeList.tsx + - src/core/services/immersion-tracker/query.ts + - src/core/services/immersion-tracker/session.ts + - src/core/services/immersion-tracker-service.ts +--- + +## Description + + +Anime episode rows in stats can show watch time and lookups from the latest session while the Progress column stays blank because it only reads `ended_media_ms` from ended sessions. Update the progress source so a just-watched episode reflects the latest known session stop position without falling back to cumulative watch time. + + +## Acceptance Criteria + +- [x] #1 Anime episode progress uses the latest known session position for the episode, including the most recent active session when available. +- [x] #2 Ended-session progress remains correct and does not regress to cumulative watch time. +- [x] #3 Regression coverage locks query and/or UI behavior for active-session and ended-session episode progress. + + +## Implementation Plan + + +1. Add failing regression coverage for anime episode progress when the latest session is still active but has a known playback position. +2. Persist the latest playback position on the active `imm_sessions` row during playback so stats queries can read it before session finalization. +3. Update anime episode queries to use the newest known session position for progress while preserving ended-session behavior. +4. Run targeted verification for immersion tracker, stats query, and cheap repo checks; record results and task outcome. + + +## Implementation Notes + + +Root cause: stale active-session recovery rebuilt session state with `lastMediaMs = null`, so `finalizeSessionRecord` overwrote persisted progress checkpoints with `ended_media_ms = NULL` during startup reconciliation. + +Implemented telemetry-flush checkpointing to persist `lastMediaMs` onto the active `imm_sessions` row, preserved that checkpoint through stale-session reconciliation, and updated anime episode progress queries to read the latest known non-null session position across active or ended sessions. + +Verification: targeted regressions passed (`bun test src/core/services/immersion-tracker-service.test.ts --test-name-pattern 'flushTelemetry checkpoints latest playback position on the active session row|startup finalizes stale active sessions and applies lifetime summaries'`, `bun test src/core/services/immersion-tracker/__tests__/query.test.ts --test-name-pattern 'getAnimeEpisodes prefers the latest session media position when the latest session is still active|getAnimeEpisodes returns latest ended media position and aggregate metrics'`), broader tracker/query suite passed (`bun test src/core/services/immersion-tracker-service.test.ts src/core/services/immersion-tracker/__tests__/query.test.ts`), `bun run typecheck` passed via verifier, `bun run changelog:lint` passed. + +Verification blocker: `.agents/skills/subminer-change-verification/scripts/verify_subminer_change.sh --lane core ...` reported `bun run test:fast` failure from pre-existing `scripts/update-aur-package.test.ts` (`mapfile: command not found` under bash), unrelated to this change set. + + +## Final Summary + + +Persist anime episode progress checkpoints before session finalization so stats can survive crashes/restarts and still show the latest known watch position. Telemetry flushes now checkpoint `lastMediaMs` onto the active `imm_sessions` row, stale-session recovery preserves that checkpoint when finalizing recovered sessions, and `getAnimeEpisodes` now reads the newest non-null session position whether it came from an active or ended session. + +Added regressions for active-session checkpoint persistence, stale-session recovery preserving `ended_media_ms`, and episode queries preferring the latest known session position. Verification passed for the targeted and broader immersion tracker/query suites, plus `bun run typecheck` and `bun run changelog:lint`. The verifier's `bun run test:fast` step still fails on the pre-existing `scripts/update-aur-package.test.ts` bash `mapfile` issue, which is outside this task's scope. + diff --git a/src/core/services/immersion-tracker/query.ts b/src/core/services/immersion-tracker/query.ts index 447da77..2a8965d 100644 --- a/src/core/services/immersion-tracker/query.ts +++ b/src/core/services/immersion-tracker/query.ts @@ -1810,6 +1810,7 @@ export function getMediaDetail(db: DatabaseSync, videoId: number): MediaDetailRo SELECT v.video_id AS videoId, v.canonical_title AS canonicalTitle, + v.anime_id AS animeId, COALESCE(lm.total_sessions, 0) AS totalSessions, COALESCE(lm.total_active_ms, 0) AS totalActiveMs, COALESCE(lm.total_cards, 0) AS totalCards, diff --git a/src/core/services/immersion-tracker/types.ts b/src/core/services/immersion-tracker/types.ts index f484a98..d07790d 100644 --- a/src/core/services/immersion-tracker/types.ts +++ b/src/core/services/immersion-tracker/types.ts @@ -425,6 +425,7 @@ export interface MediaLibraryRow { export interface MediaDetailRow { videoId: number; canonicalTitle: string; + animeId: number | null; totalSessions: number; totalActiveMs: number; totalCards: number; diff --git a/stats/src/App.tsx b/stats/src/App.tsx index 2fa9bc4..aa5a96b 100644 --- a/stats/src/App.tsx +++ b/stats/src/App.tsx @@ -166,9 +166,7 @@ export function App() { ? 'Back to Sessions' : 'Back to Library' } - onNavigateToAnime={ - mediaDetail.origin.type === 'anime' ? undefined : navigateToAnime - } + onNavigateToAnime={navigateToAnime} /> ) : ( diff --git a/stats/src/components/library/MediaDetailView.tsx b/stats/src/components/library/MediaDetailView.tsx index f34df29..27bc1b4 100644 --- a/stats/src/components/library/MediaDetailView.tsx +++ b/stats/src/components/library/MediaDetailView.tsx @@ -38,7 +38,7 @@ export function MediaDetailView({ if (!data?.detail) return
Media not found
; const sessions = localSessions ?? data.sessions; - const animeId = sessions.find((s) => s.animeId != null)?.animeId ?? null; + const animeId = data.detail.animeId; const detail = { ...data.detail, totalSessions: sessions.length, diff --git a/stats/src/lib/yomitan-lookup.test.tsx b/stats/src/lib/yomitan-lookup.test.tsx index 1f69367..0fda45d 100644 --- a/stats/src/lib/yomitan-lookup.test.tsx +++ b/stats/src/lib/yomitan-lookup.test.tsx @@ -35,6 +35,7 @@ test('MediaHeader renders Yomitan lookup count and lookup rate copy', () => { detail={{ videoId: 7, canonicalTitle: 'Episode 7', + animeId: null, totalSessions: 4, totalActiveMs: 90_000, totalCards: 12, @@ -58,6 +59,7 @@ test('MediaHeader distinguishes token occurrences from known unique words', () = detail={{ videoId: 7, canonicalTitle: 'Episode 7', + animeId: null, totalSessions: 4, totalActiveMs: 90_000, totalCards: 12, diff --git a/stats/src/types/stats.ts b/stats/src/types/stats.ts index 094acda..5c53de5 100644 --- a/stats/src/types/stats.ts +++ b/stats/src/types/stats.ts @@ -136,6 +136,7 @@ export interface MediaDetailData { detail: { videoId: number; canonicalTitle: string; + animeId: number | null; totalSessions: number; totalActiveMs: number; totalCards: number;