v1.0.9-beta.075 - fix: overhaul Metron integration, prevent duplicate issues, and enhance release calendar
🐛 Bug Fixes
- Duplicate Issue Prevention: Implemented a unified isSameIssue helper function across Importer, Queue, and MetadataFetcher using regex-based float and suffix splitting. Safely maps zero-padded numbers (001 vs 1) and decimal chapters (1.0 vs 1) without destroying variant letter tags (1A vs 1B).
- Ghost Sweeper Race Condition: Updated library-scanner.ts and diagnostics/route.ts to spare missing folders if the series is actively monitored or has pending requests attached to it.
- Cover Art Preservation: Added fallback logic during metadata syncs to inherit existing covers if the provider API temporarily fails to return an image URL.
- Cloudflare Image Proxy: Updated cover/route.ts to mimic standard browser User-Agent and Accept headers, successfully bypassing 403 Forbidden blocks on external cover art.
🌐 Metron API & Global Pull List
- Metron API Loop: Switched from /?series= to the /series/{id}/issue_list/ relationship endpoint to prevent Metron from returning its entire database and consuming the user's daily rate limit in a single click.
- Metron Deep Metadata: Added extractName and hasRole parsers to correctly interpret Metron's nested array structures for creators and roles, fixing blank Issue Credit sections.
- API Protocol & Parameters: Converted the Metron API fetch back to native Node.js fetch with explicit Basic Auth headers to prevent FlareSolverr proxies from stripping credentials. Reverted query parameters back to custom store_date_range_after filters to resolve gateway timeouts.
- Global Pull List Requests: Updated the Request & Monitor button to instantly trigger a backlog search (monitorOnly: false), and passed releaseDate to the backend so future issues are safely queued as UNRELEASED instead of stalling. Bumped calendar cache keys to overwrite broken arrays.
✨ New Features & Improvements
- Tracked Series Calendar: Added week-by-week pagination controls (Previous/Next/Today) to the local tracked series tab on the frontend. Updated the /api/calendar route to support the weekOffset parameter with strict Sunday-to-Saturday boundary math, while keeping a backwards-compatibility failsafe for external dashboard widgets.
- Metron Lazy-Loading: Fully implemented getIssueDetails for Metron, allowing the app to lazily fetch heavy metadata (Writers, Artists, Characters, Arcs) only when an issue is clicked.
- Smart UI Pre-selection: The Series Page will now automatically select the first missing issue if no files have been downloaded yet, instantly triggering the lazy-load engine to populate the UI.
🛠️ Architecture & Performance
- BullMQ UI Offloading: Transitioned the manual and bulk Refresh Metadata routes to push jobs into the BullMQ background queue, keeping the UI instantly responsive and preventing 504 Gateway Timeouts.
- Folder Creation Guarantee: Added fs.mkdirSync to the metadata fetcher to ensure physical series folders are generated before attempting to save local cover.jpg files.
Addresses #148, Addresses #146, Addresses #144, Addresses #112