mirror of
https://github.com/Escartem/AnimeWwise.git
synced 2026-06-10 03:28:21 +08:00
fix bugs and update extract tab
This commit is contained in:
29
app.py
29
app.py
@@ -138,6 +138,9 @@ class AnimeWwise(QMainWindow):
|
|||||||
self.actionReset.triggered.connect(lambda: self.resetApp())
|
self.actionReset.triggered.connect(lambda: self.resetApp())
|
||||||
self.actionExit.triggered.connect(lambda: self.close())
|
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_Selected.triggered.connect(lambda: self.extractItems(False))
|
||||||
self.actionExtract_All.triggered.connect(lambda: self.extractItems(True))
|
self.actionExtract_All.triggered.connect(lambda: self.extractItems(True))
|
||||||
|
|
||||||
@@ -196,6 +199,7 @@ class AnimeWwise(QMainWindow):
|
|||||||
if data["action"] == "load":
|
if data["action"] == "load":
|
||||||
self.fileStructure = data["content"]
|
self.fileStructure = data["content"]
|
||||||
self.updateTreeWidget(self.fileStructure)
|
self.updateTreeWidget(self.fileStructure)
|
||||||
|
self.loadFilesButton.setEnabled(True)
|
||||||
self.setExtractionState(True)
|
self.setExtractionState(True)
|
||||||
self.tabs.setCurrentIndex(1)
|
self.tabs.setCurrentIndex(1)
|
||||||
print("Done !")
|
print("Done !")
|
||||||
@@ -224,6 +228,7 @@ class AnimeWwise(QMainWindow):
|
|||||||
_map = None
|
_map = None
|
||||||
|
|
||||||
self.resetTreeWidget()
|
self.resetTreeWidget()
|
||||||
|
self.loadFilesButton.setEnabled(False)
|
||||||
|
|
||||||
# why is all this required for threading damnit
|
# why is all this required for threading damnit
|
||||||
self.backgroundThread = QThread()
|
self.backgroundThread = QThread()
|
||||||
@@ -262,6 +267,7 @@ class AnimeWwise(QMainWindow):
|
|||||||
def resetTreeWidget(self):
|
def resetTreeWidget(self):
|
||||||
self.treeWidget.clear()
|
self.treeWidget.clear()
|
||||||
self.fileStructure = {"folders": {}, "files": []}
|
self.fileStructure = {"folders": {}, "files": []}
|
||||||
|
self.audioInfoLabel.setText("Click on an audio file to get more infos !")
|
||||||
self.setExtractionState(False)
|
self.setExtractionState(False)
|
||||||
|
|
||||||
def updateTreeWidget(self, structure):
|
def updateTreeWidget(self, structure):
|
||||||
@@ -285,7 +291,21 @@ class AnimeWwise(QMainWindow):
|
|||||||
self.treeWidget.itemClicked.connect(self.updateAudioPreview)
|
self.treeWidget.itemClicked.connect(self.updateAudioPreview)
|
||||||
|
|
||||||
def updateAudioPreview(self, item, column):
|
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):
|
def addItems(self, parent, element):
|
||||||
for folder_name in sorted(element.get("folders", {}).keys()):
|
for folder_name in sorted(element.get("folders", {}).keys()):
|
||||||
@@ -301,7 +321,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"], 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.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:
|
||||||
@@ -313,10 +333,6 @@ class AnimeWwise(QMainWindow):
|
|||||||
def extractItems(self, _all):
|
def extractItems(self, _all):
|
||||||
self.setFolder(folder="output")
|
self.setFolder(folder="output")
|
||||||
|
|
||||||
if self.folders["output"] == "":
|
|
||||||
QMessageBox.warning(None, "Warning", "Missing output folder !", QMessageBox.Ok)
|
|
||||||
return
|
|
||||||
|
|
||||||
checked_items = []
|
checked_items = []
|
||||||
|
|
||||||
# todo: use file structure instead of tree view
|
# todo: use file structure instead of tree view
|
||||||
@@ -366,6 +382,7 @@ class AnimeWwise(QMainWindow):
|
|||||||
self.resetTreeWidget()
|
self.resetTreeWidget()
|
||||||
self.extract.reset()
|
self.extract.reset()
|
||||||
self.setExtractionState(False)
|
self.setExtractionState(False)
|
||||||
|
self.tabs.setCurrentIndex(0)
|
||||||
print("Reset !")
|
print("Reset !")
|
||||||
|
|
||||||
def _appendText(self, text):
|
def _appendText(self, text):
|
||||||
|
|||||||
35
gui.ui
35
gui.ui
@@ -241,9 +241,9 @@
|
|||||||
<widget class="QWidget" name="horizontalLayoutWidget">
|
<widget class="QWidget" name="horizontalLayoutWidget">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>10</x>
|
||||||
<y>580</y>
|
<y>580</y>
|
||||||
<width>1081</width>
|
<width>1061</width>
|
||||||
<height>31</height>
|
<height>31</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
@@ -251,34 +251,7 @@
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="audioInfoLabel">
|
<widget class="QLabel" name="audioInfoLabel">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>sample_long_name.wem | Duration : 00:00 | Stereo (48000Hz)</string>
|
<string>Click on an audio file to get more infos !</string>
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="audioPlayPadding">
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="playAudioBtn">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Play</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="stopAudioBtn">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Stop</string>
|
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -366,7 +339,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>1100</width>
|
<width>1100</width>
|
||||||
<height>26</height>
|
<height>21</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QMenu" name="menuFile">
|
<widget class="QMenu" name="menuFile">
|
||||||
|
|||||||
15
wwise.py
15
wwise.py
@@ -60,6 +60,7 @@ def parse_wwise(reader):
|
|||||||
"channelLayout": None,
|
"channelLayout": None,
|
||||||
"channelType": None,
|
"channelType": None,
|
||||||
"codec": None,
|
"codec": None,
|
||||||
|
"codecDisplay": None,
|
||||||
"layoutType": None,
|
"layoutType": None,
|
||||||
"interleaveBlockSize": None,
|
"interleaveBlockSize": None,
|
||||||
"numSamples": None,
|
"numSamples": None,
|
||||||
@@ -109,10 +110,21 @@ def parse_wwise(reader):
|
|||||||
codec = codecs[metadata["format"]]
|
codec = codecs[metadata["format"]]
|
||||||
|
|
||||||
if codec not in ["PTADPCM", "VORBIS"]: # Platinum "PtADPCM" custom ADPCM for Wwise
|
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
|
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
|
# parse more infos
|
||||||
if metadata["codec"] == "PTADPCM":
|
if metadata["codec"] == "PTADPCM":
|
||||||
metadata["layoutType"] = "interleave"
|
metadata["layoutType"] = "interleave"
|
||||||
@@ -124,4 +136,3 @@ def parse_wwise(reader):
|
|||||||
return metadata
|
return metadata
|
||||||
|
|
||||||
# TODO: parse VORBIS
|
# TODO: parse VORBIS
|
||||||
# TODO: rewrite codec ?
|
|
||||||
|
|||||||
Reference in New Issue
Block a user