PSP Sync: list themes and DLC in the device inventory

This commit is contained in:
2026-09-08 22:45:36 -04:00
parent 42fac24cf1
commit 46c675ce79
3 changed files with 70 additions and 12 deletions
+34 -9
View File
@@ -2599,7 +2599,7 @@ class PspSyncPage(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self._root = ""
self._inventory = {"games": [], "videos": [], "homebrew": [], "pkg": []}
self._inventory = {"games": [], "videos": [], "homebrew": [], "pkg": [], "themes": [], "dlc": []}
self._library_items = []
self._lib_raw = {}
self._lib_norm = {}
@@ -2638,16 +2638,21 @@ class PspSyncPage(QWidget):
self.games_table = self._make_table(["", "Name", "Category", "Added", "Release", "Region", "Size"], stretch_col=1)
self.videos_table = self._make_table(["", "Name", "Added", "Size"], stretch_col=1)
self.homebrew_table = self._make_table(["", "ID", "Name", "Added", "Size"], stretch_col=2)
self.themes_table = self._make_table(["", "Name", "Added", "Size"], stretch_col=1)
self.dlc_table = self._make_table(["", "Game", "Name", "Added", "Size"], stretch_col=2)
self.pkg_table = self._make_table(["", "Name", "Added", "Size"], stretch_col=1)
self.tabs.addTab(self.games_table, "Games")
self.tabs.addTab(self.videos_table, "UMD Videos")
self.tabs.addTab(self.homebrew_table, "Homebrew / PSN")
self.tabs.addTab(self.themes_table, "Themes")
self.tabs.addTab(self.dlc_table, "DLC")
self.tabs.addTab(self.pkg_table, "PKG")
self.tabs.addTab(self._build_umd_tab(), "UMD")
self.tabs.addTab(self._build_sync_tab(), "Sync from Library")
layout.addWidget(self.tabs, 1)
for tbl in (self.games_table, self.videos_table, self.homebrew_table, self.pkg_table):
for tbl in (self.games_table, self.videos_table, self.homebrew_table,
self.themes_table, self.dlc_table, self.pkg_table):
tbl.itemSelectionChanged.connect(self._update_delete_enabled)
tbl.itemChanged.connect(self._update_delete_enabled)
tbl.setContextMenuPolicy(Qt.CustomContextMenu)
@@ -2711,7 +2716,7 @@ class PspSyncPage(QWidget):
self.sync_search.textChanged.connect(self._filter_sync)
bar.addWidget(self.sync_search, 1)
self.sync_type = QComboBox()
self.sync_type.addItems(["All", "Games", "Videos"])
self.sync_type.addItems(["All", "Games", "Videos", "PS1", "Themes", "DLC"])
self.sync_type.currentTextChanged.connect(self._filter_sync)
bar.addWidget(self.sync_type)
self.sync_installed = QComboBox()
@@ -2883,6 +2888,12 @@ class PspSyncPage(QWidget):
continue
if typ == "Videos" and it.get("system") != "videos":
continue
if typ == "PS1" and it.get("system") != "ps1":
continue
if typ == "Themes" and it.get("system") != "theme":
continue
if typ == "DLC" and it.get("system") != "dlc":
continue
on_psp = bool(it.get("on_psp"))
if inst == "Not installed" and on_psp:
continue
@@ -2906,7 +2917,8 @@ class PspSyncPage(QWidget):
title = QTableWidgetItem(label)
title.setData(Qt.UserRole, it)
self.sync_table.setItem(row, 1, title)
kind_label = {"games": "Game", "videos": "Video", "ps1": "PS1"}.get(it.get("system"), "Game")
kind_label = {"games": "Game", "videos": "Video", "ps1": "PS1",
"theme": "Theme", "dlc": "DLC"}.get(it.get("system"), "Game")
self.sync_table.setItem(row, 2, QTableWidgetItem(kind_label))
size = it.get("size")
self.sync_table.setItem(row, 3, NumericItem(f"{size / (1024 * 1024):.1f} MB" if size else "", size or 0))
@@ -2959,7 +2971,7 @@ class PspSyncPage(QWidget):
self._gen += 1
gen = self._gen
if not self._root:
self._inventory = {"games": [], "videos": [], "homebrew": [], "pkg": []}
self._inventory = {"games": [], "videos": [], "homebrew": [], "pkg": [], "themes": [], "dlc": []}
self.status.setText("No PSP connected")
self._populate(self._inventory)
return
@@ -2979,21 +2991,26 @@ class PspSyncPage(QWidget):
if gen != self._gen:
return
if "error" in res:
self._inventory = {"games": [], "videos": [], "homebrew": [], "pkg": []}
self._inventory = {"games": [], "videos": [], "homebrew": [], "pkg": [], "themes": [], "dlc": []}
self.status.setText(f"Error reading PSP: {res['error']}")
log.warning("psp inventory error: %s", res["error"])
else:
inventory = res["inventory"]
self._inventory = inventory
log.info("psp inventory: %d game(s), %d video(s), %d homebrew, %d pkg",
log.info("psp inventory: %d game(s), %d video(s), %d homebrew, %d theme(s), %d dlc, %d pkg",
len(inventory["games"]), len(inventory["videos"]),
len(inventory["homebrew"]), len(inventory.get("pkg", [])))
len(inventory["homebrew"]), len(inventory.get("themes", [])),
len(inventory.get("dlc", [])), len(inventory.get("pkg", [])))
usage = res.get("usage")
parts = [
f"{len(inventory['games'])} game(s)",
f"{len(inventory['videos'])} video(s)",
f"{len(inventory['homebrew'])} homebrew",
]
if inventory.get("themes"):
parts.append(f"{len(inventory['themes'])} theme(s)")
if inventory.get("dlc"):
parts.append(f"{len(inventory['dlc'])} dlc")
if usage is not None:
free_mb = usage["free"] / (1024 * 1024)
total_mb = usage["total"] / (1024 * 1024)
@@ -3007,6 +3024,8 @@ class PspSyncPage(QWidget):
self._fill_table(self.games_table, inventory.get("games", []), "games")
self._fill_table(self.videos_table, inventory.get("videos", []), "videos")
self._fill_table(self.homebrew_table, inventory.get("homebrew", []), "homebrew")
self._fill_table(self.themes_table, inventory.get("themes", []), "theme")
self._fill_table(self.dlc_table, inventory.get("dlc", []), "dlc")
self._fill_table(self.pkg_table, inventory.get("pkg", []), "pkg")
@staticmethod
@@ -3055,6 +3074,11 @@ class PspSyncPage(QWidget):
table.setItem(row, 2, name)
table.setItem(row, 3, QTableWidgetItem(added))
table.setItem(row, 4, NumericItem(f"{size / (1024 * 1024):.1f} MB" if size else "", size))
elif kind == "dlc":
table.setItem(row, 1, QTableWidgetItem(it.get("id") or ""))
table.setItem(row, 2, name)
table.setItem(row, 3, QTableWidgetItem(added))
table.setItem(row, 4, NumericItem(f"{size / (1024 * 1024):.1f} MB" if size else "", size))
else:
table.setItem(row, 1, name)
table.setItem(row, 2, QTableWidgetItem(added))
@@ -3064,7 +3088,8 @@ class PspSyncPage(QWidget):
def _current_inventory_table(self):
w = self.tabs.currentWidget()
if w in (self.games_table, self.videos_table, self.homebrew_table, self.pkg_table):
if w in (self.games_table, self.videos_table, self.homebrew_table,
self.themes_table, self.dlc_table, self.pkg_table):
return w
return None