Build and Deploy / build-and-deploy (push) Successful in 1m55s
- MediaEntity gains overview + hasFile (informational only, doesn't affect IN_LIBRARY status); Snooze gains a permanent `blacklisted` flag alongside the existing temporary snoozedUntil; ScoringConfig gains rewatchInsertInterval. All new NOT NULL columns use @ColumnDefault to avoid repeating the watched_boost startup crash on the already-populated tables. - TmdbClient now captures `overview` and requests language=ru-RU so found titles get Russian title/overview when TMDB has a translation. - ScoringService: getRecommendations() now excludes already-watched titles from the main feed and instead splices one rewatch suggestion (a watched title no longer in the library) in every rewatchInsertInterval items, flagged for a distinguishing badge. Replaced getWatchAgain() with getWatched(includeHidden) for the new "Просмотрено" page: everything currently in the library (even unwatched - it can't be re-added anyway) plus everything ever watched, with blacklisted titles surfaced only when includeHidden is requested (for the "Вернуть" undo action). - MediaActionController: new /watched (mark watched, no status change), /blacklist and /unblacklist endpoints. - Frontend: removed the separate "Посмотреть ещё раз" page/route in favor of the rewatch-suggestion badge inline in Recommendations; added the "Просмотрено" page (library/in-library filter, sort, hidden-blacklist toggle); MediaCard/LibraryCard get a click-to-open MediaDetailModal showing the overview text; hid the inherited-rating badge when it's 0; added an intersection-count badge; added a type filter on Recommendations. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>