Repository navigation
Regional release dates, previous/next game, processed uploads, RA card and unscraped-count fixes - #25
Merged
Merged
Conversation
… width fixes (3.34.0) RPCS3 compatibility - services/rpcs3_compat.py reads the local RPCS3's GuiConfigs/compat_database.dat (the rpcs3.net export RPCS3 downloads via Manage > Databases > Download Compatibility Database), re-read only when the file changes, and looks games up by disc serial. Never stored, never downloaded by RetroDB. Local PS3 ROMs only; imported games are skipped. - Shown on Library and console cards, the quick view and the game page; the game page hints how to get the list when RPCS3 has none. - Serials: PARAM.SFO for PSN/installed folders, and a serial in a file or folder name ([BLUS30443]); missing serials are read in the background. - _rpcs3_dirs also looks beside rpcs3.exe (Windows), in a portable folder and in macOS Application Support, matching RPCS3's get_config_dir(). Sales figures - games.units_sold (migration 023), asked of the AI in the scrape's gap-fill and in AI Fill, from free published sources; parse_units_sold() normalises "2.4 million", "~850k" and the like. Shown on the game page and in the quick view. AI Fill now uses AI_FILLABLE_FIELDS instead of a copy of it. Fixes - Franchise / Series and Platform Availability switches in the edit windows did nothing: their <label for> pointed at the hidden text input, not the checkbox. Their labels are now translated. - Achievements tabs each capped the page from their own card size (RA/Steam/Xbox 1463px, PSN 1563px, RPCS3 1845px); all now share .achievements-page's tokens. - AI Fill's rating inference called .strip() on integer columns. - Library card completion and score tooltips are translated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013s5ztLcay7qP1ezTvc85UA
…RA card and unscraped-count fixes (3.35.0)
Release dates by region
- games.release_dates (migration 024): a JSON object of region code -> date
({"JP": "2002-11-17", "NA": "2002-11"}), asked of the AI in the scrape's
gap-fill and in AI Fill, fill-only. services/release_dates.py parses what a
model returns (codes, region names, {region, date} lists), drops unknown
regions and impossible dates, and writes region names and dates in the
user's language (CLDR). Shown on the game page and in the quick view.
Previous / next game
- The game page shows Previous / Next and the game's position in the list
it was opened from: ?from=library steps through the Library, otherwise
its console. AllGamesController saves each list's filters and sort per tab
(RetroDB.saveGameNavContext); the page sends them to the new
/api/games/neighbors. A version folded into its group's card is placed at
that card; a game outside the saved filters steps through the whole list.
Uploads
- Uploaded covers, 3D boxes, fanart and screenshots go through the scraper's
pipeline: the configured image format, size standardization and the
-sm/-md variants. Uploaded screenshots get the perceptual-hash duplicate
check; dropped duplicates are reported. A replaced cover's old file and
variants are removed when no other game uses it; remove_media_file now
removes variants too.
Fixes
- The game page's RA card read a fresh RA title search on every load, which
missed games the RA refresh had matched by ROM name, so games with the
Library's RA badge had no card (Metroid Prime / Prime 2 on GameCube). It
now uses the stored ra_game_id link and counts, asking RA by id only when
no count is stored.
- The Systems page counted unscraped bonus discs, which the console list
and its Unscraped filter never show (Sony PlayStation: 2 unscraped, filter
empty).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013s5ztJjyQyt3pKwNu4uwpS
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
games.release_datescolumn (migration 024). The AI is asked for it in a scrape's gap-fill and in AI Fill. The game page and the quick view show the dates.This PR is built on #24's branch and targets
mainso that CI runs on it. Until #24 merges, this diff also shows #24's commit; merge #24 first. I built on it because migrations are numbered by position: #24 adds migration 023, sorelease_dateshas to be 024. Building on it also avoids conflicts inscrape_ai.py,hybrid_scraper.py, the game page and the quick view, which both PRs change.Why
All five were requested on 2026-10-27.
How
routes/systems.pymissing_countnow leaves outis_bonus_discrows, the same rule as/system/<id>and the dashboard.get_retroachievements_info(game)builds the card fromra_game_id,ra_achievement_countandra_points. It asks RA by ID (get_game_info) only when no count is stored. The page also no longer waits on an RA request each time it loads.services/game_media_service.py):save_upload(..., image_type=...)names the file with the configured extension (WebP by default), as scraped files are. It then runsfinalize_downloaded_image: format check, resize and-sm/-mdvariants.save_screenshotsprocesses each screenshot the same way, then runskeep_screenshot_if_uniqueagainst the game's existing screenshots and the earlier files in the same upload. It returns how many were dropped, and the page tells you that number.remove_media_filenow also deletes the-sm/-mdfiles. Before this, a re-upload left the old file on disk.try_standardizeis replaced by this path.AllGamesControllersaves each list's filter and sort params for the current tab (sessionStorage, one key for the Library and one per console) viaRetroDB.saveGameNavContext.gameDetailUrlnow adds?from=systemon console pages.GET /api/games/neighbors. It uses the same_build_games_queryas/api/gamesand returns{found, position, total, prev, next}. It is capped like/api/games/ids.services/release_dates.pyreads what the AI returns: region codes, region names such as "Japan" or "PAL", or a list of{region, date}. It drops unknown regions and impossible dates.COALESCE), the same asunits_sold, and cleared by "Clear scraped data".release_dateis unchanged; it stays the date of that ROM's own release.Version / changelog: this opens 3.35.0. #24's 3.34.0 entry already has 7 items, so these 5 make a new release. Expect small conflicts with #21–#24 in
config.example.py, at the top ofdata/changelog.yamland in the translation catalogs. Keep 3.35.0 above 3.34.0, and regenerate the catalogs with the CLAUDE.md §8 command. The per-locale changelogs are not updated; they go in at release time, as done before.Mandatory-workflow checklist
config.example.py(APP_VERSION3.35.0;APP_LAST_UPDATEis already 2026-10-27).config.pyis untracked.data/changelog.yaml(3.35.0, 5 items)main)release_datesand the Previous/Next wiring. Also updated:docs/specs/api-contracts.md(/api/games/neighbors),migrations.md,scrapers.md, andretrodb.spec(lists migration 024).check_i18n_fresh.pypasses. Three new strings; the region names come from CLDR.Verification
pytest -n 8,ruff check .,node --checkon the changed JS, andscripts/ci_local.sh --docs.tests/test_game_neighbors.py,test_release_dates.py,test_upload_image_pipeline.py(real image bytes),test_game_page_ra_card.pyandtest_systems_unscraped_count.py.routes/systems.py.?from=library.found: false.9_custom.webp, 1440×1080, with-smand-mdcopies;9_tgdb.jpgdeleted it and its two variants;Screenshots (UI changes only)
Taken in the session, not attached: the game page at 1400px and 375px with Previous/Next, the release dates and the RA card.
Generated by Claude Code