Dark theme, scan auto-ingest, packaging prep, and README refresh
This commit is contained in:
@@ -3,15 +3,16 @@ the name is terrible, i know.
|
||||
|
||||

|
||||
|
||||
Native Linux GUI (PySide6) for preserving PSP UMD **games** and **videos** as
|
||||
`.iso` files. It scans your discs, verifies them against the full Redump catalog
|
||||
(Redump DATs), reports what's missing, and retags/renames discs to a canonical
|
||||
scheme. It also fetches cover art and metadata, syncs discs and save-data with a
|
||||
real PSP, can pull missing discs from your own Redump 7z archive collection, and
|
||||
converts PlayStation 1 ISO/CUE/BIN rips into PSP `EBOOT.PBP` homebrew.
|
||||
A cross-platform (Linux + Windows) desktop GUI — PySide6 — for preserving PSP
|
||||
UMD **games** and **videos** as `.iso` files. It scans your discs, verifies them
|
||||
against the Redump/No-Intro catalogs, reports what's missing, and retags/renames
|
||||
discs to a canonical scheme. It fetches cover art and metadata, syncs discs and
|
||||
save-data with a real PSP, can pull missing discs from a Redump 7z archive
|
||||
collection, downloads PSN content from NoPayStation, and converts PlayStation 1
|
||||
ISO/CUE/BIN rips into PSP `EBOOT.PBP` homebrew.
|
||||
|
||||

|
||||
* Use default app theme for Qt.
|
||||
* Dark theme with a blue accent — the Library tab in cover view. *
|
||||
|
||||
## Features
|
||||
|
||||
@@ -35,9 +36,9 @@ converts PlayStation 1 ISO/CUE/BIN rips into PSP `EBOOT.PBP` homebrew.
|
||||
|
||||
## Requirements
|
||||
|
||||
- Linux + Python 3
|
||||
- `PySide6` + `pycryptodome` (`pip install -r requirements.txt`)
|
||||
- `7z` (p7zip) — used to peek/extract disc images from store archives
|
||||
- Python 3.10+ on Linux or Windows
|
||||
- `PySide6`, `curl_cffi`, `pycryptodome` (`pip install -r requirements.txt`)
|
||||
- `7z` (p7zip / 7-Zip) — used to peek/extract disc images from store archives
|
||||
- PPSSPP (optional) — to launch discs from the details panel
|
||||
|
||||
NoPayStation `.pkg` files are decrypted by the bundled **pure-Python
|
||||
@@ -66,14 +67,15 @@ python3 -m app.main
|
||||
Redump lacks — keeps serial-based matching working).
|
||||
- videos: No-Intro `Sony - PlayStation Portable (UMD Video)` (Redump has
|
||||
no UMD Video DAT).
|
||||
2. Ingest them into the local SQLite library:
|
||||
2. Start the app — any DATs missing from the library are ingested automatically
|
||||
at startup (no manual step). You can also re-ingest on demand:
|
||||
|
||||
```bash
|
||||
python3 -m app.ingest
|
||||
```
|
||||
|
||||
3. Open the GUI and point **Settings → General → Games/Videos directory** at
|
||||
your disc folders (or set `PSP_GAMES_ROOTS` / `PSP_VIDEO_ROOTS`).
|
||||
3. Point **Settings → General → Games/Videos directory** at your disc folders
|
||||
(or set `PSP_GAMES_ROOTS` / `PSP_VIDEO_ROOTS`).
|
||||
4. (Optional) PS1 conversion — copy any PSN PS1 classic `EBOOT.PBP` to
|
||||
`data/base.PBP` (it supplies Sony's encrypted loader). Then set the **PS1
|
||||
directory**, **PS1 output directory** and **PS1 base.pbp** in
|
||||
@@ -105,19 +107,22 @@ Discs are matched by hash first (most precise), then serial, then filename.
|
||||
- `data/ps1_templates/` — optional PS1 Classics art templates
|
||||
(`ICON0.PNG` case frame, `PIC1.PNG` launch background); the app falls back
|
||||
to drawn art when they're absent.
|
||||
- `data/nps/` — NoPayStation TSV lists (cached here on first store scan; drop
|
||||
`PSP_GAMES.tsv` / `PSX_GAMES.tsv` manually to work offline).
|
||||
- `data/nps/` — NoPayStation TSV lists (cached here on first store scan in dev;
|
||||
a packaged build stores them under the state dir instead).
|
||||
- `data/bin/pkg2zip.exe` — bundled `pkg2zip` binary (MIT, by mmozeiko) kept
|
||||
only as an optional fallback decryptor; the app normally uses its own
|
||||
pure-Python decryptor (`app/pkg.py`) and never needs Wine.
|
||||
See `data/bin/ATTRIBUTION.md`.
|
||||
- State dir (`~/.local/state/psp-preserve/` by default, or `$XDG_STATE_HOME/psp-preserve`):
|
||||
- State dir (`~/.local/state/psp-preserve/` on Linux, `%LOCALAPPDATA%\PSPPreserve`
|
||||
on Windows, or `$PSP_STATE_DIR`):
|
||||
- `library.sqlite` — the catalog + library database.
|
||||
- `covers/` — downloaded cover cache.
|
||||
- `data/` — user-writable data in packaged builds (credentials, manual
|
||||
covers, PS1 templates, NPS TSV cache).
|
||||
|
||||
SQLite is kept on a local disk because SQLite locking is unreliable over
|
||||
network filesystems; the DATs, manual covers and credentials stay in `data/`
|
||||
(which may be a network share).
|
||||
network filesystems. Read-only resources (DATs, the POPS loader, icons) are
|
||||
bundled with the app; user-writable data lives in the state dir.
|
||||
|
||||
## Configuration
|
||||
|
||||
@@ -146,7 +151,8 @@ QSettings under `PSPPreserve`) taking precedence where noted.
|
||||
| `PSP_NPS_TSV_BASE` | `https://nopaystation.com/tsv/` | NoPayStation TSV base URL |
|
||||
| `PSP_PKG2ZIP_PATH` | *(empty)* | pkg2zip binary path (else auto-detected) |
|
||||
| `PSP_API_TOKEN` | *(empty)* | server API bearer token (unset = open) |
|
||||
| `PSP_CREDENTIALS` | `$PSP_DATA_DIR/credentials.json` | credentials file |
|
||||
| `PSP_USER_DATA_DIR` | `<state>/data` (packaged) / `./data` (dev) | user-writable data (credentials, manual covers, PS1 templates, NPS cache) |
|
||||
| `PSP_CREDENTIALS` | `$PSP_USER_DATA_DIR/credentials.json` | credentials file |
|
||||
| `PSP_LIBRETRO_COVERS_URL` | *(empty)* | direct URL for `libretro-covers.zip` (else derived from store server) |
|
||||
| `PSP_OVGDB_COVERS_URL` | *(empty)* | direct URL for `openvgdb-covers.zip` (else derived from store server) |
|
||||
|
||||
@@ -235,7 +241,7 @@ Configure the folders in **Settings → General** (or `PSP_PS1_ROOTS` /
|
||||
`PSP_PS1_OUTPUT_DIR`). Current limits: single-disc games only (no multi-disc
|
||||
PBP); disc data is DEFLATE-compressed (level 1 by default, `--complevel 0-9`).
|
||||
|
||||
## Store — archive.org and local folder
|
||||
## Store — four sources
|
||||
|
||||
The **Store** tab downloads missing discs from a Redump 7z archive collection
|
||||
(`Name (Region) (tags).7z`, containing the `.iso`/`.cso` inside). It has three
|
||||
|
||||
Reference in New Issue
Block a user