diff --git a/app.py b/app.py index ce266f8..c77cdab 100644 --- a/app.py +++ b/app.py @@ -138,6 +138,9 @@ class AnimeWwise(QMainWindow): self.actionReset.triggered.connect(lambda: self.resetApp()) self.actionExit.triggered.connect(lambda: self.close()) + self.actionExpand_all.triggered.connect(lambda: self.treeWidget.expandAll()) + self.actionCollapse_all.triggered.connect(lambda: self.treeWidget.collapseAll()) + self.actionExtract_Selected.triggered.connect(lambda: self.extractItems(False)) self.actionExtract_All.triggered.connect(lambda: self.extractItems(True)) @@ -196,6 +199,7 @@ class AnimeWwise(QMainWindow): if data["action"] == "load": self.fileStructure = data["content"] self.updateTreeWidget(self.fileStructure) + self.loadFilesButton.setEnabled(True) self.setExtractionState(True) self.tabs.setCurrentIndex(1) print("Done !") @@ -224,6 +228,7 @@ class AnimeWwise(QMainWindow): _map = None self.resetTreeWidget() + self.loadFilesButton.setEnabled(False) # why is all this required for threading damnit self.backgroundThread = QThread() @@ -262,6 +267,7 @@ class AnimeWwise(QMainWindow): def resetTreeWidget(self): self.treeWidget.clear() self.fileStructure = {"folders": {}, "files": []} + self.audioInfoLabel.setText("Click on an audio file to get more infos !") self.setExtractionState(False) def updateTreeWidget(self, structure): @@ -285,7 +291,21 @@ class AnimeWwise(QMainWindow): self.treeWidget.itemClicked.connect(self.updateAudioPreview) def updateAudioPreview(self, item, column): - print(item.text(0)) + file_data = self.searchFiles(self.fileStructure, item.text(0)) + + 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 + text = f'Infos for {item.text(0)} => Channels : {meta["channels"]} | Sample rate : {meta["sampleRate"]} Hz | Bitrate : {meta["avgBitrate"]} kbps | Codec : {meta["codecDisplay"]} | Layout type : {meta["layoutType"]}' + self.audioInfoLabel.setText(text) def addItems(self, parent, element): for folder_name in sorted(element.get("folders", {}).keys()): @@ -301,7 +321,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"], 2)} 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', file_meta["source"], str(file_meta["size"]), str(hex(file_meta["offset"]))]) file_item.setFlags(file_item.flags() | Qt.ItemIsUserCheckable) file_item.setCheckState(0, Qt.Unchecked) if parent is None: @@ -313,10 +333,6 @@ class AnimeWwise(QMainWindow): def extractItems(self, _all): self.setFolder(folder="output") - if self.folders["output"] == "": - QMessageBox.warning(None, "Warning", "Missing output folder !", QMessageBox.Ok) - return - checked_items = [] # todo: use file structure instead of tree view @@ -366,6 +382,7 @@ class AnimeWwise(QMainWindow): self.resetTreeWidget() self.extract.reset() self.setExtractionState(False) + self.tabs.setCurrentIndex(0) print("Reset !") def _appendText(self, text): diff --git a/gui.ui b/gui.ui index 6e641bb..de16afa 100644 --- a/gui.ui +++ b/gui.ui @@ -241,9 +241,9 @@ - 0 + 10 580 - 1081 + 1061 31 @@ -251,34 +251,7 @@ - sample_long_name.wem | Duration : 00:00 | Stereo (48000Hz) - - - - - - - - - - - - - - false - - - Play - - - - - - - false - - - Stop + Click on an audio file to get more infos ! @@ -366,7 +339,7 @@ 0 0 1100 - 26 + 21 diff --git a/wwise.py b/wwise.py index 056388e..93de3b7 100644 --- a/wwise.py +++ b/wwise.py @@ -60,6 +60,7 @@ def parse_wwise(reader): "channelLayout": None, "channelType": None, "codec": None, + "codecDisplay": None, "layoutType": None, "interleaveBlockSize": None, "numSamples": None, @@ -109,10 +110,21 @@ def parse_wwise(reader): codec = codecs[metadata["format"]] if codec not in ["PTADPCM", "VORBIS"]: # Platinum "PtADPCM" custom ADPCM for Wwise - raise Exception(f"unhandled codec -> {codec}") + print(f"unhandled codec -> {codec}") metadata["codec"] = codec + # codec name + codecs_names = { + "PTADPCM": "Platinum 4-bit ADPCM", + "VORBIS": "Custom Vorbis" + } + + if codec in codecs_names: + metadata["codecDisplay"] = codecs_names[codec] + else: + metadata["codecDisplay"] = codec + # parse more infos if metadata["codec"] == "PTADPCM": metadata["layoutType"] = "interleave" @@ -124,4 +136,3 @@ def parse_wwise(reader): return metadata # TODO: parse VORBIS - # TODO: rewrite codec ?