Add watched series/authors feature

Introduce watched lists for series and authors end-to-end.

- Add DB migration to create watched_series and watched_authors tables with indexes and foreign keys.
- Implement API routes: GET/POST for listing/adding and DELETE by id for both /api/user/watched-series and /api/user/watched-authors. Validation, ownership checks, and immediate targeted job triggers are included.
- Add client hooks (useWatchedSeries, useWatchedAuthors) with add/delete helpers and SWR revalidation.
- Add UI components: WatchButton (toggle/confirm) and WatchedListsSection for profile display and removal UX.
- Add processor (check-watched-lists.processor) and service (watched-lists.service) to scrape Audible, deduplicate, check library ownership, and auto-create requests; supports targeted checks for newly watched items.
- Include tests for the watched-lists service.

These changes implement the watched-lists feature to let users watch series/authors and have the system automatically detect and request new releases.
This commit is contained in:
kikootwo
2026-03-03 21:57:38 -05:00
parent 610873af6b
commit cbf02d3e24
23 changed files with 2392 additions and 32 deletions
@@ -309,6 +309,23 @@ describe('deduplicateAudiobooks', () => {
];
expect(deduplicateAudiobooks(books)).toHaveLength(2);
});
it('collapses duplicates when narrators are listed in different order', () => {
const books = [
makeBook({
asin: 'A1', title: 'The Passengers', author: 'John Marrs',
narrator: 'Kristin Atherton, Roy McMillan, Clare Corbett, Tom Bateman, Patience Tomlinson, Shaheen Khan',
durationMinutes: 600,
}),
makeBook({
asin: 'A2', title: 'The Passengers', author: 'John Marrs',
narrator: 'Clare Corbett, Roy McMillan, Tom Bateman, Shaheen Khan, Kristin Atherton, Patience Tomlinson',
durationMinutes: 602,
}),
];
const result = deduplicateAudiobooks(books);
expect(result).toHaveLength(1);
});
});
// ---------------------------------------------------------------------------