1
0
mirror of https://github.com/Escartem/AnimeWwise.git synced 2026-06-04 23:40:25 +08:00

browse tab finished

This commit is contained in:
Escartem
2024-11-04 14:25:30 +01:00
parent 6c483b4bc2
commit 3e8333fd61

61
app.py
View File

@@ -54,6 +54,7 @@ class BackgroundWorker(QObject):
def run(self):
if self.action == "load":
print("Loading files and mapping if necessary...")
self.currentInput = self.input
fileStructure = self.extract.load_folder(self.map, self.input, self.diff, progress=self.progress.emit)
if fileStructure is None:
self.finished.emit({"action": "error", "content": {"msg": "Nothing found !", "state": 1}})
@@ -165,6 +166,7 @@ class AnimeWwise(QMainWindow):
action_group.triggered.connect(self.updateFormat)
# utils
def updateFormat(self, event):
text = event.text()
self.format = text.split(" ")[0]
@@ -184,6 +186,14 @@ class AnimeWwise(QMainWindow):
self.actionExpand_all.setEnabled(state)
self.actionCollapse_all.setEnabled(state)
def displaySize(self, size):
if size < 1024:
return f"{size} b"
elif size > 1024 and size < 1048576:
return f"{size//1024} KiB"
elif size > 1048576:
return f"{size//1048576} MiB"
# workers
@pyqtSlot(list)
def progressBarSlot(self, progress):
@@ -252,7 +262,7 @@ class AnimeWwise(QMainWindow):
result = self.searchFiles(self.fileStructure, search)
self.updateTreeWidget(result)
def searchFiles(self, data, substring, current_path=""):
def searchFiles(self, data, substring, current_path="", flatten=False):
result = {"folders": {}, "files": []}
result["files"] = [file for file in data.get("files", []) if substring in file[0]]
@@ -262,6 +272,12 @@ class AnimeWwise(QMainWindow):
if subfolder_result["files"] or subfolder_result["folders"]:
result["folders"][folder_name] = subfolder_result
if flatten:
while result["files"] == []:
if len(result["folders"]) == 0:
break
result = list(result["folders"].values())[0]
return result
def resetTreeWidget(self):
@@ -273,7 +289,7 @@ class AnimeWwise(QMainWindow):
def updateTreeWidget(self, structure):
self.treeWidget.clear()
self.treeWidget.setColumnCount(4)
self.treeWidget.setHeaderLabels(["Name", "Duration", "Source", "Size", "Offset"])
self.treeWidget.setHeaderLabels(["Name", "Duration", "Compressed Size", "Source", "Offset"])
self.addItems(None, structure)
@@ -290,17 +306,26 @@ class AnimeWwise(QMainWindow):
self.treeWidget.setDragDropMode(QAbstractItemView.NoDragDrop)
self.treeWidget.itemClicked.connect(self.updateAudioPreview)
def computeFolderSize(self, folder):
total_size = 0
for file in folder.get("files", []):
total_size += file[1]["size"]
for subfolder_name, subfolder in folder.get("folders", {}).items():
subfolder_size = self.computeFolderSize(subfolder)
total_size += subfolder_size
folder["size"] = total_size
return total_size
def updateAudioPreview(self, item, column):
file_data = self.searchFiles(self.fileStructure, item.text(0))
file_data = self.searchFiles(self.fileStructure, item.text(0), flatten=True)
if file_data == {"folders": {}, "files": []}:
self.audioInfoLabel.setText("Click on an audio file to get more infos !")
return
# flatten path
while file_data["files"] == []:
file_data = list(file_data["folders"].values())[0]
meta = file_data["files"][0][1]["metadata"]
# show meta
@@ -310,7 +335,7 @@ class AnimeWwise(QMainWindow):
def addItems(self, parent, element):
for folder_name in sorted(element.get("folders", {}).keys()):
folder_content = element["folders"][folder_name]
folder_item = QTreeWidgetItem([folder_name, "", "", "", ""])
folder_item = QTreeWidgetItem([folder_name, "", self.displaySize(self.computeFolderSize(folder_content)), "", ""])
folder_item.setFlags(folder_item.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable)
folder_item.setCheckState(0, Qt.Unchecked)
if parent is None:
@@ -321,7 +346,7 @@ class AnimeWwise(QMainWindow):
for file in sorted(element.get("files", [])):
file_meta = file[1]
file_item = QTreeWidgetItem([file[0], f'{round(file_meta["metadata"]["duration"], 1)} seconds', file_meta["source"], str(file_meta["size"]), str(hex(file_meta["offset"]))])
file_item = QTreeWidgetItem([file[0], f'{round(file_meta["metadata"]["duration"], 1)} seconds', self.displaySize(file_meta["size"]), file_meta["source"], str(hex(file_meta["offset"]))])
file_item.setFlags(file_item.flags() | Qt.ItemIsUserCheckable)
file_item.setCheckState(0, Qt.Unchecked)
if parent is None:
@@ -335,7 +360,6 @@ class AnimeWwise(QMainWindow):
checked_items = []
# todo: use file structure instead of tree view
def check_items(item, _all):
if item.checkState(0) == Qt.Checked or _all:
if item.text(1) != "":
@@ -350,7 +374,7 @@ class AnimeWwise(QMainWindow):
# yet another block of threading bs
self.backgroundThread = QThread()
self.backgroundWorker = BackgroundWorker("extract", self.extract, {"input": self.folders["input"], "files": checked_items, "format": self.format, "output": self.folders["output"]})
self.backgroundWorker = BackgroundWorker("extract", self.extract, {"input": self.currentInput, "files": checked_items, "format": self.format, "output": self.folders["output"]})
self.backgroundWorker.moveToThread(self.backgroundThread)
self.backgroundThread.started.connect(self.backgroundWorker.run)
self.backgroundWorker.finished.connect(self.handleFinished)
@@ -368,19 +392,24 @@ class AnimeWwise(QMainWindow):
while current_item is not None:
path.insert(0, current_item.text(0))
current_item = current_item.parent()
meta = self.searchFiles(self.fileStructure, item.text(0), flatten=True)["files"][0]
name = meta[0]
meta = meta[1] # move inside
return {
"name": item.text(0),
"path": path[:-1] if path[0] in ["changed_files", "new_files"] else path[1:-1],
"source": item.text(2),
"offset": int(item.text(4), 16),
"size": int(item.text(3))
"path": path[:-1],
"source": meta["source"],
"offset": meta["offset"],
"size": meta["size"]
}
# misc
def resetApp(self):
self.resetTreeWidget()
self.extract.reset()
self.currentInput = None
self.setExtractionState(False)
self.tabs.setCurrentIndex(0)
print("Reset !")