Commit Graph

9476 Commits

Author SHA1 Message Date
copilot-swe-agent[bot]
98bc9a9eea Optimize multi-ROM exclusion matching pass
Co-authored-by: gantoine <3247106+gantoine@users.noreply.github.com>
2026-05-21 18:52:55 +00:00
copilot-swe-agent[bot]
5a1e238a5f perf: pre-normalize exclusions once and use set for O(1) lookup in exclude_multi_roms
Co-authored-by: gantoine <3247106+gantoine@users.noreply.github.com>
2026-05-21 18:50:45 +00:00
copilot-swe-agent[bot]
9e3f85b085 Fix ES-DE multi-folder exclusion matching
Agent-Logs-Url: https://github.com/rommapp/romm/sessions/2213cb94-9971-48a6-8d17-9efc5c209db4

Co-authored-by: gantoine <3247106+gantoine@users.noreply.github.com>
2026-05-21 11:22:21 +00:00
copilot-swe-agent[bot]
fbd086f487 Initial plan 2026-05-21 11:16:28 +00:00
Georges-Antoine Assi
76d8af6b55 Merge pull request #3397 from rommapp/tolerate-launchbox-basepath
Tolerate launchbox basepath
2026-05-21 07:06:43 -04:00
Georges-Antoine Assi
94d011ee5e tolerate launchbox basepath 2026-05-21 06:56:36 -04:00
Georges-Antoine Assi
ce20d403aa Merge pull request #3396 from rommapp/fix-ss-multi-region-priority
fix(screenscraper): respect region priority for multi-region ROMs
2026-05-20 20:21:50 -04:00
Georges-Antoine Assi
4f5f85554f Merge pull request #3395 from rommapp/copilot/fix-complete-rescan-metadata
Fix Complete Rescan not clearing unselected metadata sources
2026-05-20 18:51:45 -04:00
Georges-Antoine Assi
a245ac7330 fix lint 2026-05-20 18:13:09 -04:00
Georges-Antoine Assi
aeb17b95a8 add tests 2026-05-20 18:10:25 -04:00
Georges-Antoine Assi
2e7beeec5b remove meta source fields 2026-05-20 17:43:50 -04:00
Georges-Antoine Assi
6c84241ef5 Extract METADATA_SOURCE_FIELDS constant in scan_handler
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 17:37:20 -04:00
Georges-Antoine Assi
c4a1cfb250 Merge pull request #3394 from rommapp/copilot/fix-libretro-games-identified
Treat Libretro-only ROM matches as identified during scan
2026-05-20 17:23:43 -04:00
Georges-Antoine Assi
fe5af3ef9c fix(screenscraper): respect region priority for multi-region ROMs
For ROMs tagged with multiple regions (e.g. "(Japan, USA)"), filename order
previously decided which region's name and box art won. Now reorder the rom's
filename-tagged regions by SCAN_REGION_PRIORITY before prepending, so the
user's configured preference wins among the regions the file is actually
tagged as. Untagged priority regions still cannot outrank a filename-tagged
region.

Also tweak the Total Rescan → Complete Rescan label in en_GB/en_US scan
locales.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 17:20:54 -04:00
copilot-swe-agent[bot]
440f55ba89 Fix Complete Rescan not clearing unselected metadata sources
Agent-Logs-Url: https://github.com/rommapp/romm/sessions/e76abf0d-7039-4dae-ad88-5f1f1c4f422f

Co-authored-by: gantoine <3247106+gantoine@users.noreply.github.com>
2026-05-20 19:15:56 +00:00
copilot-swe-agent[bot]
f284ef2fba fix: treat libretro-matched roms as identified
Agent-Logs-Url: https://github.com/rommapp/romm/sessions/9cc2e55e-af48-40bd-b2e9-492b6fd6046a

Co-authored-by: gantoine <3247106+gantoine@users.noreply.github.com>
2026-05-20 19:14:35 +00:00
copilot-swe-agent[bot]
80886957d4 Initial plan 2026-05-20 19:07:35 +00:00
copilot-swe-agent[bot]
5b6a48c1cc Initial plan 2026-05-20 19:07:00 +00:00
Georges-Antoine Assi
db4e75e362 Merge pull request #3391 from rommapp/dependabot/uv/idna-3.15
chore(deps): bump idna from 3.10 to 3.15
4.9.0-alpha.4
2026-05-20 09:19:08 -04:00
Georges-Antoine Assi
21663fc922 cleanup fomratter 2026-05-20 09:17:35 -04:00
Georges-Antoine Assi
052245f344 Merge pull request #3384 from Spinnich/pr/screenscraper-api-and-redaction
fix(screenscraper): improve API handling, KO scrape data, and metadata sanitization
2026-05-20 09:11:36 -04:00
dependabot[bot]
1213d760a1 chore(deps): bump idna from 3.10 to 3.15
Bumps [idna](https://github.com/kjd/idna) from 3.10 to 3.15.
- [Release notes](https://github.com/kjd/idna/releases)
- [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.md)
- [Commits](https://github.com/kjd/idna/compare/v3.10...v3.15)

---
updated-dependencies:
- dependency-name: idna
  dependency-version: '3.15'
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-20 04:26:38 +00:00
Spinnich
12c424f829 fix(screenscraper): improve API handling and redact credentials in logs
Fix several issues in ScreenScraper API request/response handling:

- Correctly handle SS-specific HTTP error codes (KO responses, 429, 431,
  and the SS-quirk of returning 401 when server CPU >60%).
- Construct requests with proper parameter encoding so jeuInfos lookups
  and search queries return the expected results.
- Store media URLs returned by SS as-is, preserving the dev credential
  query parameters required for media playback. Removing them broke
  downstream media fetches.

To keep dev credentials out of log output, add a redacting formatter in
the logger pipeline that scrubs ssid/sspassword/devid/devpassword query
parameters from any URL it sees.

Test coverage added for the new HTTP error paths and the as-is URL
storage behaviour.
2026-05-19 19:39:55 -04:00
Georges-Antoine Assi
405f678514 Merge pull request #3388 from rommapp/hardlink-resources-gamelist
feat(fs): hardlink import/export assets, harden sync init
2026-05-19 09:04:18 -04:00
Georges-Antoine Assi
584f35b797 changes from bot review 2026-05-19 07:52:43 -04:00
Georges-Antoine Assi
adb050f164 commit and push 2026-05-19 07:31:25 -04:00
Georges-Antoine Assi
8c3d82784f fix cleanup orphaned resources 2026-05-18 20:30:18 -04:00
Georges-Antoine Assi
f84796da08 Merge pull request #3385 from Spinnich/pr/chd-raw-hashing
feat(hashing): compute raw CHD hashes and route disc-data SHA1 to Hasheous
2026-05-18 14:52:54 -04:00
Georges-Antoine Assi
591b07ec49 changes from bot review 2026-05-18 14:44:52 -04:00
Georges-Antoine Assi
e6d4ede939 cleanup 2026-05-18 07:40:59 -04:00
Georges-Antoine Assi
757fafae5f feat(fs): hardlink import/export assets when possible, harden sync init
Importer (gamelist/launchbox file:// flows) and exporters (gamelist.xml,
metadata.pegasus.txt local exports) now hardlink media assets when source
and destination share a filesystem, falling back transparently to a copy
on EXDEV / EPERM / EOPNOTSUPP / EMLINK / EACCES (cross-device, FAT32,
exFAT, network mounts, etc.). Saves disk space and is effectively
instantaneous on large files (videos, manuals, miximages).

Covers keep a real copy (allow_link=False) because _store_cover resizes
the small cover in place via PIL.Image.save, which would truncate the
shared inode and corrupt the user's source image.

Also makes FSSyncHandler tolerate a missing/unwritable /romm/sync at
startup: an OSError from mkdir now logs a warning instead of crashing
the whole app at module-import time. Sync calls still fail at use time
if the mount remains broken — the right place to surface the error.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 07:38:11 -04:00
Zurdi
c7ecf5d197 Merge pull request #3387 from enlewof/master
Exclude the videos directory from scanning for batocera config
2026-05-18 11:15:09 +02:00
Allen Lew
f104dd9204 Merge pull request #1 from enlewof/enlewof-exclude-videos-for-batocera-config
Update config.batocera-retrobat.yml
2026-05-17 22:40:35 -07:00
Allen Lew
76ca0b6ac9 Update config.batocera-retrobat.yml
Exclude the videos directory from scanning
2026-05-17 22:39:37 -07:00
Georges-Antoine Assi
6f725d35a2 Merge pull request #3386 from rommapp/romm-sync-path
feat(sync): default SYNC_BASE_PATH to /var/lib/romm/sync
2026-05-17 19:20:13 -04:00
Georges-Antoine Assi
ba25477a2d changes from bot review 2026-05-17 19:07:57 -04:00
Georges-Antoine Assi
887bdad0ef mark local 2026-05-17 17:52:47 -04:00
Georges-Antoine Assi
3557850701 refactor 2026-05-17 17:52:14 -04:00
Georges-Antoine Assi
51f0522193 undo 2026-05-17 17:39:47 -04:00
Georges-Antoine Assi
46357f0fa2 test: set SYNC_BASE_PATH to romm_test/sync for pytest
CI runs pytest without root, so the new /var/lib/romm/sync default
fails when FSSyncHandler tries to mkdir its base path at import time.
The other handlers stay writable in tests because they derive from
ROMM_BASE_PATH=romm_test (relative); pin SYNC_BASE_PATH the same way.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 17:25:23 -04:00
Georges-Antoine Assi
ea22b06502 fix(sync): export SYNC_BASE_PATH so the Python child inherits it
The shell fallback was assigned locally but never exported, so
sync_watcher.py and the Python config layer never saw the resolved
value. They happened to land on the same /var/lib/romm/sync default by
coincidence; export it so the shell and Python defaults stay linked
through a single source of truth.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 17:22:54 -04:00
Georges-Antoine Assi
e5c9d0faf7 fix(sync): create SYNC_BASE_PATH at startup before watching
The prod Dockerfile creates /var/lib/romm/sync at build time, but if a
user overrides SYNC_BASE_PATH to a path that doesn't exist (or runs the
dev entrypoint, which never created the default), watchfiles fails to
start because its target directory is missing. Have both entrypoints
mkdir -p the resolved path before handing it to watchfiles.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 14:12:16 -04:00
Georges-Antoine Assi
c97ec449e2 drop more aspect ratrio 2026-05-17 14:07:46 -04:00
Georges-Antoine Assi
90945685e4 Stuff 2026-05-17 12:43:33 -04:00
Georges-Antoine Assi
18a271b653 fix(home): center-align recently added cards vertically
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 12:42:59 -04:00
Georges-Antoine Assi
10d3eb2079 feat(sync): default SYNC_BASE_PATH to /var/lib/romm/sync
Move the sync staging folder out of ROMM_BASE_PATH so it lives on a
dedicated writable mount. This lets the container run with a read-only
root filesystem without losing in-flight save uploads, and keeps
app-owned state separate from the user-curated library volume.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 09:28:39 -04:00
Spinnich
01f0b1d2b5 feat(hashing): compute raw CHD hashes and route disc-data SHA1 to Hasheous
CHD files now follow the same hash logic as all other file types — CRC32,
MD5, and SHA1 are computed from raw container bytes. This allows
ScreenScraper to log KO entries for unrecognised CHD files, which it
could not do when only the disc-data SHA1 was being computed.

The CHD header SHA1 (disc-data SHA1) is separately extracted and stored
in a new chd_sha1_hash field on RomFile, with a migration adding the
column to rom_files. Hasheous receives only this disc-data SHA1 (no
CRC/MD5) since it indexes disc-based games by disc-data SHA1, not raw
file hashes.

The RAHasher multi-file path now passes the largest CHD directly instead
of a /* wildcard, which RAHasher cannot expand. Hash computations are
wrapped in asyncio.to_thread to avoid blocking the event loop during
large reads.

Hash-lookup metadata handlers (ScreenScraper, Hasheous, Playmatch) now
fall back to rom.files (stored DB hashes) when fs_rom files are not
rehashed, fixing hash-based matching for UNMATCHED and UPDATE scan types.

The Disc SHA-1 is displayed in the ROM detail view for both single-file
(FileInfo.vue) and multi-file (FileSelectItem.vue) CHD games.
2026-05-17 08:01:05 -04:00
Georges-Antoine Assi
016cc1ce52 Merge pull request #3382 from rommapp/copilot/fix-safari-webkit-upload-issues
Avoid Safari/WebKit stalls during chunked ROM uploads
4.9.0-alpha.3
2026-05-16 20:07:37 -04:00
Georges-Antoine Assi
6df37f50cf run fmt 2026-05-16 20:05:18 -04:00
Georges-Antoine Assi
d72e645049 use bowser 2026-05-16 19:17:38 -04:00