mirror of
https://github.com/Escartem/AnimeWwise.git
synced 2026-06-11 04:05:37 +08:00
browse tab finished
This commit is contained in:
59
app.py
59
app.py
@@ -54,6 +54,7 @@ class BackgroundWorker(QObject):
|
|||||||
def run(self):
|
def run(self):
|
||||||
if self.action == "load":
|
if self.action == "load":
|
||||||
print("Loading files and mapping if necessary...")
|
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)
|
fileStructure = self.extract.load_folder(self.map, self.input, self.diff, progress=self.progress.emit)
|
||||||
if fileStructure is None:
|
if fileStructure is None:
|
||||||
self.finished.emit({"action": "error", "content": {"msg": "Nothing found !", "state": 1}})
|
self.finished.emit({"action": "error", "content": {"msg": "Nothing found !", "state": 1}})
|
||||||
@@ -165,6 +166,7 @@ class AnimeWwise(QMainWindow):
|
|||||||
|
|
||||||
action_group.triggered.connect(self.updateFormat)
|
action_group.triggered.connect(self.updateFormat)
|
||||||
|
|
||||||
|
# utils
|
||||||
def updateFormat(self, event):
|
def updateFormat(self, event):
|
||||||
text = event.text()
|
text = event.text()
|
||||||
self.format = text.split(" ")[0]
|
self.format = text.split(" ")[0]
|
||||||
@@ -184,6 +186,14 @@ class AnimeWwise(QMainWindow):
|
|||||||
self.actionExpand_all.setEnabled(state)
|
self.actionExpand_all.setEnabled(state)
|
||||||
self.actionCollapse_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
|
# workers
|
||||||
@pyqtSlot(list)
|
@pyqtSlot(list)
|
||||||
def progressBarSlot(self, progress):
|
def progressBarSlot(self, progress):
|
||||||
@@ -252,7 +262,7 @@ class AnimeWwise(QMainWindow):
|
|||||||
result = self.searchFiles(self.fileStructure, search)
|
result = self.searchFiles(self.fileStructure, search)
|
||||||
self.updateTreeWidget(result)
|
self.updateTreeWidget(result)
|
||||||
|
|
||||||
def searchFiles(self, data, substring, current_path=""):
|
def searchFiles(self, data, substring, current_path="", flatten=False):
|
||||||
result = {"folders": {}, "files": []}
|
result = {"folders": {}, "files": []}
|
||||||
|
|
||||||
result["files"] = [file for file in data.get("files", []) if substring in file[0]]
|
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"]:
|
if subfolder_result["files"] or subfolder_result["folders"]:
|
||||||
result["folders"][folder_name] = subfolder_result
|
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
|
return result
|
||||||
|
|
||||||
def resetTreeWidget(self):
|
def resetTreeWidget(self):
|
||||||
@@ -273,7 +289,7 @@ class AnimeWwise(QMainWindow):
|
|||||||
def updateTreeWidget(self, structure):
|
def updateTreeWidget(self, structure):
|
||||||
self.treeWidget.clear()
|
self.treeWidget.clear()
|
||||||
self.treeWidget.setColumnCount(4)
|
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)
|
self.addItems(None, structure)
|
||||||
|
|
||||||
@@ -290,17 +306,26 @@ class AnimeWwise(QMainWindow):
|
|||||||
self.treeWidget.setDragDropMode(QAbstractItemView.NoDragDrop)
|
self.treeWidget.setDragDropMode(QAbstractItemView.NoDragDrop)
|
||||||
self.treeWidget.itemClicked.connect(self.updateAudioPreview)
|
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):
|
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": []}:
|
if file_data == {"folders": {}, "files": []}:
|
||||||
self.audioInfoLabel.setText("Click on an audio file to get more infos !")
|
self.audioInfoLabel.setText("Click on an audio file to get more infos !")
|
||||||
return
|
return
|
||||||
|
|
||||||
# flatten path
|
|
||||||
while file_data["files"] == []:
|
|
||||||
file_data = list(file_data["folders"].values())[0]
|
|
||||||
|
|
||||||
meta = file_data["files"][0][1]["metadata"]
|
meta = file_data["files"][0][1]["metadata"]
|
||||||
|
|
||||||
# show meta
|
# show meta
|
||||||
@@ -310,7 +335,7 @@ class AnimeWwise(QMainWindow):
|
|||||||
def addItems(self, parent, element):
|
def addItems(self, parent, element):
|
||||||
for folder_name in sorted(element.get("folders", {}).keys()):
|
for folder_name in sorted(element.get("folders", {}).keys()):
|
||||||
folder_content = element["folders"][folder_name]
|
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.setFlags(folder_item.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable)
|
||||||
folder_item.setCheckState(0, Qt.Unchecked)
|
folder_item.setCheckState(0, Qt.Unchecked)
|
||||||
if parent is None:
|
if parent is None:
|
||||||
@@ -321,7 +346,7 @@ class AnimeWwise(QMainWindow):
|
|||||||
|
|
||||||
for file in sorted(element.get("files", [])):
|
for file in sorted(element.get("files", [])):
|
||||||
file_meta = file[1]
|
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.setFlags(file_item.flags() | Qt.ItemIsUserCheckable)
|
||||||
file_item.setCheckState(0, Qt.Unchecked)
|
file_item.setCheckState(0, Qt.Unchecked)
|
||||||
if parent is None:
|
if parent is None:
|
||||||
@@ -335,7 +360,6 @@ class AnimeWwise(QMainWindow):
|
|||||||
|
|
||||||
checked_items = []
|
checked_items = []
|
||||||
|
|
||||||
# todo: use file structure instead of tree view
|
|
||||||
def check_items(item, _all):
|
def check_items(item, _all):
|
||||||
if item.checkState(0) == Qt.Checked or _all:
|
if item.checkState(0) == Qt.Checked or _all:
|
||||||
if item.text(1) != "":
|
if item.text(1) != "":
|
||||||
@@ -350,7 +374,7 @@ class AnimeWwise(QMainWindow):
|
|||||||
|
|
||||||
# yet another block of threading bs
|
# yet another block of threading bs
|
||||||
self.backgroundThread = QThread()
|
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.backgroundWorker.moveToThread(self.backgroundThread)
|
||||||
self.backgroundThread.started.connect(self.backgroundWorker.run)
|
self.backgroundThread.started.connect(self.backgroundWorker.run)
|
||||||
self.backgroundWorker.finished.connect(self.handleFinished)
|
self.backgroundWorker.finished.connect(self.handleFinished)
|
||||||
@@ -369,18 +393,23 @@ class AnimeWwise(QMainWindow):
|
|||||||
path.insert(0, current_item.text(0))
|
path.insert(0, current_item.text(0))
|
||||||
current_item = current_item.parent()
|
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 {
|
return {
|
||||||
"name": item.text(0),
|
"name": item.text(0),
|
||||||
"path": path[:-1] if path[0] in ["changed_files", "new_files"] else path[1:-1],
|
"path": path[:-1],
|
||||||
"source": item.text(2),
|
"source": meta["source"],
|
||||||
"offset": int(item.text(4), 16),
|
"offset": meta["offset"],
|
||||||
"size": int(item.text(3))
|
"size": meta["size"]
|
||||||
}
|
}
|
||||||
|
|
||||||
# misc
|
# misc
|
||||||
def resetApp(self):
|
def resetApp(self):
|
||||||
self.resetTreeWidget()
|
self.resetTreeWidget()
|
||||||
self.extract.reset()
|
self.extract.reset()
|
||||||
|
self.currentInput = None
|
||||||
self.setExtractionState(False)
|
self.setExtractionState(False)
|
||||||
self.tabs.setCurrentIndex(0)
|
self.tabs.setCurrentIndex(0)
|
||||||
print("Reset !")
|
print("Reset !")
|
||||||
|
|||||||
Reference in New Issue
Block a user