Skip to content

feat(metadata): read/write book languages instead of hardcoded "en"#130

Merged
phildenhoff merged 3 commits into
mainfrom
cdl-2-language-metadata-read-write-instead-of-ha
Jun 15, 2026
Merged

feat(metadata): read/write book languages instead of hardcoded "en"#130
phildenhoff merged 3 commits into
mainfrom
cdl-2-language-metadata-read-write-instead-of-ha

Conversation

@phildenhoff

Copy link
Copy Markdown
Member

What & why

Book never read the languages / books_languages_link tables, BookUpdate had no language field, and OPF generation hardcoded <dc:language>en</dc:language> — multilingual libraries were silently mislabeled, a Calibre-compatibility lie.

Changes

libcalibre

  • entities/language.rs + queries/languages.rs: canonicalize_lang_code (ISO 639-1→Calibre 639-3, eneng), set_for_book (replace / clear / dedupe, item_order preserved), batched + single readers (raw SQL — there's no diesel joinable! for languages).
  • Book.language_codes, BookUpdate.language_codes (Some=replace / empty=clear / None=untouched), BookAdd.language.
  • OPF emits one <dc:language> per real code (und when none). New Library::regenerate_metadata_opf rebuilds metadata.opf from DB state and runs on both add and update, so the derived OPF stays faithful for every field — not just language.

Tauri + frontend

  • LibraryBook.language_list, BookUpdate DTO language_list, and ImportableBookMetadata.language now flows into to_book_add (previously parsed then dropped).
  • Multi-value Languages row on the Edit Book page (ui TagsInput) backed by src/lib/languages.ts code↔name mapping.

Verification

  • New libcalibre integration tests (canonicalize, add/persist round-trip, update replace/clear/untouched, OPF emit + regenerate-on-update); all existing libcalibre + src-tauri tests pass.
  • tsc clean, vitest green (incl. new languages.test.ts), lint/format clean.
  • Live (WebDriver, headless): a book showed eng→English, added French, saved, reloaded → persisted; DB eng(0)+fra(1) order-preserved; OPF emitted both codes; removing a chip cleared just that link.

Fixes CDL-2

🤖 Generated with Claude Code

phildenhoff and others added 2 commits June 13, 2026 18:08
The main window starts hidden and is revealed from the frontend once
settings hydrate. show() made it visible but never activated the app,
so Citadel could launch behind whatever window already had focus. Focus
the window right after showing it, mirroring the settings-window pattern.

Fixes CDL-16

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Book never read the languages/books_languages_link tables, BookUpdate had
no language field, and OPF generation hardcoded <dc:language>en</dc:language>
— multilingual libraries were silently mislabeled.

- libcalibre: Language entity + queries (canonicalize ISO 639-1→639-3,
  set_for_book replace/clear, batched + single readers via raw SQL since
  there's no diesel joinable! for languages). Book.language_codes,
  BookUpdate.language_codes (Some=replace/empty=clear/None=untouched),
  BookAdd.language.
- OPF emits one <dc:language> per real code (und when none). New
  Library::regenerate_metadata_opf rebuilds metadata.opf from DB state and
  runs on both add and update, so the derived OPF stays faithful for every
  field — not just language.
- Tauri: LibraryBook.language_list, BookUpdate DTO.language_list, and
  ImportableBookMetadata.language now flows into to_book_add (was dropped).
- UI: multi-value Languages row on Edit Book (ui TagsInput) backed by
  src/lib/languages.ts code↔name mapping.

Fixes CDL-2

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@linear-code

linear-code Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

CDL-2

@phildenhoff phildenhoff enabled auto-merge (squash) June 15, 2026 06:55
Resolves the metadata-providers refactor that landed on main:
- hardcover-import.ts/.test.ts deleted on main → dropped; the BookUpdate
  build moved to src/lib/metadata-import.ts (added language_list: null).
- EditBook.tsx: took main's metadata-providers version, re-applied the
  Languages row, form value, and name↔code save mapping.
@github-actions

Copy link
Copy Markdown

libcalibre Test Coverage Report

Overall coverage: 81.63%

📊 Download HTML Report

Coverage breakdown available in the artifacts.

@phildenhoff phildenhoff merged commit 265d7f6 into main Jun 15, 2026
7 checks passed
@phildenhoff phildenhoff deleted the cdl-2-language-metadata-read-write-instead-of-ha branch June 15, 2026 07:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant