83 Commits
Author SHA1 Message Date
quoije 196e3ac82f gui: show the source filename in Library and Store details
Add a muted, selectable filename line under the title in both details
panels, with the full path as its tooltip (archive name in the Store,
disc/ISO filename in the Library).
2026-09-07 20:05:31 -04:00
quoije 2c6b07e286 psp: detect installed PS1 games (incl. Category Lite folders)
PS1 EBOOTs install as PSP/GAME/{category}/{GAME_ID}/EBOOT.PBP, which the
PSP index ignored (it only indexed ISO games/videos), so the app never
marked them 'on PSP'. Index homebrew EBOOTs by folder id + embedded title,
match PS1 library items against them, and make 'Delete from PSP' remove the
whole game folder.
2026-09-07 19:59:30 -04:00
quoije 0ebd173af7 ps1: IGDB-first only for EBOOT icon, restore usual library order
Library covers go back to libretro -> OpenVGDB -> ScreenScraper ->
Wikipedia -> IGDB (last resort) for all systems, including PS1. The EBOOT
ICON0 (ps1_art) alone now tries IGDB first for clean banner-less box art,
falling back to the normal pipeline.
2026-09-07 19:46:50 -04:00
quoije c0c0f841d6 gui: label PS1 games as 'PS1' in the PSP sync table
The sync table reused a games/videos check, so PS1 entries showed as
'Video'. Use the same system->label map as the library table.
2026-09-07 19:39:14 -04:00
quoije 78b57af79e ps1: fit whole cover in ICON0 frame, show full PIC0 title
- ICON0: scale the cover to fit the case slot (no cropping), centred with
  the frame's dark background behind the letterbox bars.
- PIC0: shrink the title font until the full name fits instead of cutting
  it with an ellipsis (falls back to eliding only below 10px).
2026-09-07 19:33:21 -04:00
quoije 43263aa644 ps1: IGDB-first covers, elided PIC0 text, drop PS3 badge
- Cover art: try IGDB first for PS1 so the cover is clean box art without
  the PlayStation banner that libretro/ScreenScraper thumbnails bake in
  (redundant with the ICON0 case frame).
- PIC0: elide long titles with an ellipsis and word-wrap the description to
  3 lines with a trailing ellipsis instead of clipping/overflowing.
- PIC0: remove the PS3 badge; PSP only for now (PS3/PS4 packaging is future
  work).
2026-09-07 19:29:19 -04:00
quoije f6dccbec24 ps1: official-style ICON0/PIC0/PIC1 artwork with PSN templates
Replaces the letterboxed 144x80 icon + cropped PIC1 with official-looking
PS1 Classics art:
- ICON0 (80x80): cover art composited into the bundled case frame (PS logo
  + 'PlayStation.' wordmark) from data/ps1_templates/ICON0.PNG.
- PIC0 (310x180): a PSN-style info board drawn in code — title, IGDB
  description, ESRB badge (from IGDB age_ratings) and PS3/PSP badges.
- PIC1 (480x272): the bundled launch background template.

The converter now embeds PIC0, the PS1 tab previews all three images, and
ps1_art pulls IGDB description/ESRB as best effort. Templates are git-ignored
(user-supplied, like base.PBP) with a drawn-art fallback when missing.
2026-09-07 19:23:38 -04:00
quoije 2433240628 ps1: show only pending discs in the PS1 tab
Converted games already appear in the Library tab, so the PS1 tab now
lists only raw discs that still need converting. Auto-selects the first
pending disc so the preview loads immediately.
2026-09-07 18:45:55 -04:00
quoije c1fcf6176d ps1: preview EBOOT icon/background in the PS1 tab before converting
Selecting a pending disc in the PS1 tab now shows a live preview of the
ICON0 (144x80 XMB icon) and PIC1 (480x272 launch background) that the
converter would embed, fetched asynchronously so the UI stays responsive.
Converted discs/EBOOTs show an 'already converted' notice, and ps1_art now
falls back to a name-derived cache key when a disc has no serial.
2026-09-07 18:42:46 -04:00
quoije fb2a98dd21 ps1: embed real game art (ICON0 + PIC1) in converted EBOOTs
Fetch the game's cover art (libretro / ScreenScraper / IGDB / Wikipedia,
reusing the local cover cache) and bake it into the EBOOT's ICON0 (144x80
XMB icon) and PIC1 (480x272 launch background) instead of the default PS1
icon. Best-effort: falls back to the base icon/empty background when no art
is found. convert()/convert_to_folder() gain optional icon0/pic1 params.
2026-09-07 18:39:29 -04:00
quoije f9d9d639ed queue: add job Type column (Download/Copy to PSP/PS1 convert/etc.)
Add a 'Type' column to the Queue table mapping each job kind to a friendly
label, so downloads, copies, PS1 conversions, UMD dumps and save syncs are
distinguishable at a glance.
2026-09-07 18:27:43 -04:00
quoije abd201396c matcher: token pre-filter for fuzzy name matching (6x faster startup)
The fuzzy fallback ran difflib against every catalog release (~11k) for each
unmatched disc, dominating library load (2.7s) and startup scans. Pre-filter
candidates to those sharing a significant (>=3 char) word with the disc
filename or PARAM.SFO title before the expensive comparison, and cache the
pre-computed word sets. Library load: 2.7s -> 0.44s; scan: ~0.5s.
2026-09-07 18:23:28 -04:00
quoije e179bf2f2e library: refresh scraped cover in grid even when items were rebuilt
refresh_item matched the grid row by object identity, which silently fails
when the library list was rebuilt (background scan/store refresh) while the
scrape dialog was open. Match by release_id + system as a fallback, like
update_item_label already does, so the cover tile updates without a Reload.
2026-09-07 18:16:20 -04:00
quoije 02ed99c9c7 library: only show converted PS1 EBOOTs
Pending PS1 source discs stay in the PS1 tab; the Library now lists only
converted EBOOT entries.
2026-09-07 18:07:08 -04:00
quoije bcc2f4f73c gui: switch to Queue tab on PS1 convert; PS1 Category Lite folder
- _on_ps1_convert now opens the Queue tab so the user sees the conversion
  job start when converting from the Library or PS1 tab.
- Add a 'PS1 category (Category Lite)' setting (ps1_category) alongside the
  existing ISO category; PS1 EBOOTs copy to /PSP/GAME/<category>/<ID>/
  when set, matching the ISO category behaviour.
2026-09-07 18:05:53 -04:00
quoije f61a77a31f ps1: bundle plain-ELF POPS loader + KEYS.BIN (iPoPS, MIT)
Fix 80020148 'game could not be started' on ARK-5: the base PBP's encrypted
~PSP loader fails to link on modern CFW. Use the bundled plain-ELF loader
(data/loader/DATA.PSP) as the DATA.PSP section instead, and write the 16-byte
NPDRM version key (data/loader/KEYS.BIN) alongside the EBOOT so CFW can
decrypt the STARTDAT PGD. Both assets are from iPoPS (MIT, attributed).

- load_data_psp: prefer the bundled ELF, fall back to the base ~PSP loader.
- load_keys_bin: return the bundled 16-byte key when present.
- convert: write KEYS.BIN next to the output EBOOT.
- README + data/loader/ATTRIBUTION.md: document the loader and its license.
2026-09-07 17:44:54 -04:00
quoije ea08f52d44 ps1: general STARTDAT lookup + warn on old base.pbp loader
- extract_startdat: locate STARTDAT at PSAR + p1 (the u32 at PSAR+0x0C)
  instead of popstation's p1 + 0x50000 absolute offset, which only worked
  for bases whose PSAR was aligned to 0x50000. Any PS1 classic can now be
  used as a base.
- _warn_old_base: print a warning when the base PBP is a 3.xx-era classic,
  since its POPS loader often fails to link on 6.60/6.61 CFW (error
  80020148 'game could not be started').
- README: document the 6.60/6.61 base preference and DEFLATE compression.
2026-09-07 17:36:16 -04:00
quoije e50cd02f2a ps1: compress disc data (raw DEFLATE) for real-hardware boot
POPS on real PSP hardware refuses to boot uncompressed (level-0) PSARs
(noted in pop-fe: 'Uncompressed EBOOTs don't work'), which caused 'the game
cannot be started'. Compress each 0x9300 disc block with raw DEFLATE and
switch the index table to the pop-fe layout (offset u32, length u16, flags
u8, SHA-1[16]); patch p1/p2 after the compressed size is known.

- _write_disc_block: deflate each block; store raw bytes when a block does
  not shrink.
- _write_psar: reserve + patch the index table and p1/p2.
- convert/convert_to_folder/CLI: complevel parameter (default 1).
- Reuse the base PBP's ICON0 and drop generated PIC1 to match popstation.
- Self-test: add a DEFLATE round-trip with index/SHA-1 checks.
2026-09-07 17:05:31 -04:00
quoije 2f1fc760a1 ps1: byte-exact popstation output; fix TOC, DATA.PSP, SFO, pregap
Fix the EBOOT.PBP 'data is corrupted' boot failure on CFW by making the
converter match popstation byte-for-byte where it counts:

- build_toc: A0 entry byte 8 is the raw Red Book disc-type bitfield 0x20
  (CD-ROM XA), not BCD(0x20)=0x32; A-point entries use control 0x41.
- extract_data_psp: copy only prx_size (u32 at DATA.PSP+0x2C), not the
  whole zero-padded section.
- PSAR_ALIGNMENT: 0x50000 (matches popstation and the base PBP).
- SFO: patch the base PBP's PARAM.SFO in place (title + DISC_ID) instead
  of rebuilding, preserving integer field types (0x0404) and values.
- Cue pregap: INDEX 00 pregap is already inside the bin file, so do not
  re-emit zero sectors; only a PREGAP command adds external pregap.
  Track starts/lead-out now match PSXPackager's merged-cue output.
2026-09-07 16:50:52 -04:00
quoije 02b4adb1c1 PS1: match popstation PSAR header byte-for-byte; drop fake KEYS.BIN/DOCUMENT.DAT 2026-09-07 16:20:39 -04:00
quoije a9c371c221 PS1: output PSN-style game folders (EBOOT.PBP + KEYS.BIN + DOCUMENT.DAT) 2026-09-07 16:20:39 -04:00
quoije 4d5c48cb94 Add PS1 games to the Library with covers, metadata, and EBOOT actions 2026-09-07 16:20:39 -04:00
quoije 625e2f8718 UMD videos: add Wikipedia + Google image cover sources to scrape 2026-09-07 16:20:39 -04:00
quoije 7d8b449846 Scrape: restore full-size movie poster URL for UMD video covers 2026-09-07 16:20:39 -04:00
quoije 27e482d344 Library: refresh details cover box after a scrape 2026-09-07 16:20:39 -04:00
quoije 5d619e5f59 Scrape: include libretro + OpenVGDB covers alongside IGDB 2026-09-07 16:20:39 -04:00
quoije 743d5e8e90 Phase 2: PS1 library scan, settings, conversion queue, and PS1 tab 2026-09-07 16:20:39 -04:00
quoije bb1b8dea66 Use Redump + No-Intro DATs together for games; dedupe fuzzy matches 2026-09-07 16:20:39 -04:00
quoije 2d599141f9 Add Logiqx XML DAT parsing (Redump) and clear stale file matches on re-ingest 2026-09-07 16:20:39 -04:00
quoije 922c01d17c Target Redump DATs/catalog instead of No-Intro 2026-09-07 16:20:39 -04:00
quoije 128b62e5b8 Generate PS1 TOC in EBOOT converter 2026-09-07 16:20:39 -04:00
quoije da3429d918 Add pure-Python PS1 to EBOOT.PBP converter (phase 1) 2026-09-07 16:20:39 -04:00
quoije 83627e788b Initial commit 2026-09-06 22:30:13 -04:00