API extracts volume numbers from release titles and matches them against
missing volumes sent by the frontend. Matched results are highlighted in
green with badges indicating which missing volumes were found.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add a new GET /authors endpoint that aggregates unique authors from books
with book/series counts, pagination and search. Add author filter to
GET /books. Backoffice gets a list page with search/sort and a detail
page showing the author's series and books.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add metadata_refresh_mode (manual/hourly/daily/weekly) to libraries,
with automatic scheduling via the indexer. Includes API support,
backoffice UI controls, i18n translations, and DB migration.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Next.js monitoring route was dropping metadata_refresh_mode from the
request body, so the value was never forwarded to the Rust API and
reverted on reload.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add text input for custom search queries in Prowlarr modal
- Quick search badges pre-fill the input and trigger search
- Default query uses quoted series name for exact match
- Add custom_query support to backend API
- Limit badge area height with vertical scroll
- Add debug logging for Prowlarr API responses
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Move Prowlarr search button before Metadata button
- Add amber collection progress bar showing owned/expected books ratio
- Remove yellow missing count badge from MetadataSearchModal (now shown in progress bar)
- Fix i18n plural parameter for series read count
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Send Prowlarr search results directly to qBittorrent from the modal.
Backend authenticates via SID cookie (login + add torrent endpoints).
- Backend: qbittorrent module with add and test endpoints
- Migration: add qbittorrent settings (url, username, password)
- Settings UI: qBittorrent config card with test connection
- ProwlarrSearchModal: send-to-qBittorrent button per result row
with spinner/checkmark state progression
- Button only shown when qBittorrent is configured
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add Prowlarr indexer integration (step 1: config + manual search).
Allows searching for comics/ebooks releases on Prowlarr indexers
directly from the series detail page, with download links and
per-volume search for missing books.
- Backend: new prowlarr module with search and test endpoints
- Migration: add prowlarr settings (url, api_key, categories)
- Settings UI: Prowlarr config card with test connection button
- ProwlarrSearchModal: auto-search on open, missing volumes shortcuts
- Fix series.readCount i18n plural parameter on series pages
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Make mapped_status nullable so unmapping (X button) sets NULL instead of
deleting the row — provider statuses never disappear from the UI
- normalize_series_status now returns the raw provider status (lowercased)
when no mapping exists, so all statuses are stored in series_metadata
- Fix series_statuses query crash caused by NULL mapped_status values
- Fix metadata batch/refresh server actions crashing page on 400 errors
- StatusMappingDto.mapped_status is now string | null in the backoffice
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
normalize_series_status now returns None when no mapping exists,
so unknown provider statuses won't pollute series_metadata.status.
Users can see unmapped statuses in Settings and assign them before
they get stored.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- LOWER() all series_metadata.status values in the statuses endpoint
to prevent "One shot" / "one shot" appearing as separate targets
- Migration 0040: lowercase all existing status values in DB
- Use LOWER() in series status filter queries for consistency
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add a status_mappings table to replace hardcoded provider status
normalization. Users can now configure how provider statuses (e.g.
"releasing", "finie") map to target statuses (e.g. "ongoing", "ended")
via the Settings > Integrations page.
- Migration 0038: status_mappings table with pre-seeded mappings
- Migration 0039: re-normalize existing series_metadata.status values
- API: CRUD endpoints for status mappings, DB-based normalize function
- API: new GET /series/provider-statuses endpoint
- Backoffice: StatusMappingsCard component with create target, assign,
and delete capabilities
- Fix all clippy warnings across the API crate
- Fix missing OpenAPI schema refs (MetadataStats, ProviderCount)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Restructure LiveSearchForm: full-width search input with magnifying glass
icon, filters in a compact row below with contextual icons per field
(library, status, sort, etc.) and inline labels. Remove per-field
className overrides from series and books pages.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace flat button row + separate reference card with a single card
organized in 3 visual groups (Indexation, Thumbnails, Metadata).
Each action is a card-like button with inline description.
Destructive actions have distinct warning styling.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a new job type that refreshes metadata from external providers for
all series already linked via approved external_metadata_links. Tracks
and displays per-field diffs (series and book level), respects locked
fields, and provides a detailed change report in the job detail page.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add a new metadata row to the dashboard with three cards:
- Series metadata coverage (linked vs unlinked donut)
- Provider breakdown (donut by provider)
- Book metadata quality (summary and ISBN fill rates)
Includes API changes (stats.rs), frontend types, and FR/EN translations.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Bedetheque uses "Légendaires (Les) - Résistance" while local series
names are "Les légendaires - Résistance". Add normalize_title() that
strips leading articles and articles in parentheses before comparing,
so these forms correctly produce a 100% confidence match.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When multiple provider results exist but the best has 100% confidence,
compare local book count with external total_volumes. If they match,
treat it as an auto-match and link+sync series and book metadata
automatically instead of requiring manual review.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add `metadata_provider` query param to series API endpoints (linked/unlinked/specific provider)
- Return `metadata_provider` field in series response
- Add metadata filter dropdown on series page with all provider options
- Show small provider icon badge on linked series cards
- LiveSearchForm now wraps filters on two rows when needed
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Links series names to their detail page where the metadata search
modal can be triggered for quick provider lookup.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implement full internationalization for the Next.js backoffice:
- i18n infrastructure: type-safe dictionaries (fr.ts/en.ts), cookie-based locale detection, React Context for client components, server-side translation helper
- Language selector in Settings page (General tab) with cookie + DB persistence
- All ~35 pages and components translated via t() / useTranslation()
- Default locale set to English, French available via settings
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add metadata_batch job type with background processing via tokio::spawn
- Auto-apply metadata only when single result at 100% confidence
- Support primary + fallback provider per library, "none" to opt out
- Add batch report/results API endpoints and job detail UI
- Add series_status and has_missing filters to both series listing pages
- Add GET /series/statuses endpoint for dynamic filter options
- Normalize series_metadata status values (migration 0036)
- Hide ComicVine provider tab when no API key configured
- Translate entire backoffice UI from English to French
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add series status concept (ongoing/ended/hiatus/cancelled/upcoming)
with normalization across all providers
- Add status field to series_metadata table (migration 0033)
- AniList: use chapters as fallback for volume count on ongoing series,
add books_message when both volumes and chapters are null
- Bedetheque: extract description from meta tag, genres, parution status,
origin/language; rewrite book parsing with itemprop microdata for
clean ISBN, dates, page counts, covers; filter placeholder authors
- Add comprehensive e2e provider tests with field coverage reporting
- Wire status into EditSeriesForm, MetadataSearchModal, and series page
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When books have no volume number, use their 1-based position in the
backoffice sort order (volume ASC NULLS LAST, natural title sort) as
effective volume for matching against external provider books.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>