Non-English grabs now work (#41)
Every non-English force-grab used to be dead in the water — Radarr rejected with English is wanted, but found <lang> and the bypass only swapped qualityProfileId, never the language that actually lives on qualityProfile.language.
- Guarded language gate, run before any mutation: reads
release/push'slanguagesvs the title'soriginalLanguage. A wrong-language release is refused outright with the reason — no profile swap, no API writes — unlessforceLanguage: trueis passed. - Radarr bypass: swaps the movie onto a temporary Any-language (
id -1) quality profile, re-pushes, then restores the original profile and deletes the temp profile infinally(no leak — verified 6 → 6). - Sonarr fails honestly: its
languageprofilePOST/PUT return 202 but never persist, so there is no writable path; it now reports why instead of silently no-oping. DeadlanguageProfileIdbranch removed.
Import verification (#40)
Scan the drop folder, not the file path, and verify the import actually produced a file rather than trusting an accepted command.
Housekeeping
- In-range dependency updates (axios 1.20, elysia 1.4.30, react 19.3.0, vite 8.3.2, …). Majors deliberately held back:
typescript5→7,vitest4→5,@types/bun. - Version bump to 1.2.0.
Verification
bun test→ 64 pass / 0 fail, 8 files on the promoted tip.vite build✓.- Live end-to-end on Radarr: Run Lola Run (German) force-grabbed —
grabbedin Radarr history, queuedownloading, temp profile cleaned up, movie restored to its original profile and tags.