diff --git a/wavinfo/wave_ixml_reader.py b/wavinfo/wave_ixml_reader.py index d4f39c1..a3b19af 100644 --- a/wavinfo/wave_ixml_reader.py +++ b/wavinfo/wave_ixml_reader.py @@ -9,7 +9,7 @@ IXMLTrack = namedtuple('IXMLTrack', ['channel_index', 'interleave_index', 'name' class SteinbergMetadata: """ - Vendor-specific Steinberg metadata + Vendor-specific Steinberg metadata. """ class AudioSpeakerArrangement(IntEnum): @@ -49,20 +49,87 @@ class SteinbergMetadata: AURO_13_0 = 41 AURO_13_1 = 42 - def __init__(self, xml : ET.ElementTree) -> None: + Steinberg_xpath = "//BWFXML/STEINBERG" + + @classmethod + def present(cls, xml: ET.ElementTree) -> bool: """ - Parse Steinberg iXML data + Test if `xml` has Steinberg metadata. + :param xml: an iXML ElementTree + """ + x = xml.find(cls.Steinberg_xpath) + return len(x) > 0 + + def __init__(self, xml: ET.ElementTree) -> None: + """ + Parse Steinberg iXML data. :param xml: The entire iXML Tree """ self.parsed = xml.find("//BWFXML/STEINBERG") @property def audio_speaker_arrangement(self) -> AudioSpeakerArrangement: + """ + AudioSpeakerArrangement + """ val = self.parsed.find("./ATTR_LIST/ATTR[NAME/text() = 'AudioSpeakerArrangement']/VALUE/text()") return type(self).AudioSpeakerArrangement(int(val)) - + @property + def sample_format_size(self) -> Optional[int]: + """ + AudioSampleFormatSize + """ + pass + @property + def media_company(self) -> Optional[str]: + """ + MediaCompany + """ + pass + + @property + def media_drop_frames(self) -> Optional[bool]: + """ + MediaDropFrames + """ + pass + + @property + def media_duration(self) -> Optional[float]: + """ + MediaDuration + """ + pass + + @property + def media_start_time(self) -> Optional[float]: + """ + MediaStartTime + """ + pass + + @property + def media_track_title(self) -> Optional[str]: + """ + MediaTrackTitle + """ + pass + + @property + def program_name(self) -> Optional[str]: + """ + ProgramName + """ + pass + + @property + def program_version(self) -> Optional[str]: + """ + ProgramVersion + """ + pass class WavIXMLFormat: @@ -158,7 +225,10 @@ class WavIXMLFormat: """ Steinberg vendor iXML metadata if present. """ - return SteinbergMetadata(self.raw_xml) + if SteinbergMetadata.present(self.raw_xml): + return SteinbergMetadata(self.raw_xml) + else: + return None def to_dict(self): return dict(track_list=list(map(lambda x: x._asdict(), self.track_list)), @@ -169,86 +239,3 @@ class WavIXMLFormat: family_uid=self.family_uid, family_name=self.family_name ) - -# Nuendo Audio Speaker Arrangement Codes - - - - - -# Nuendo Keys -# AudioSampleFormatSize, AudioSpeakerArrangement, MediaCompany, MediaDropFrames, MediaDuration(float) (seconds, session length?), -# MediaStartTime(float), MediaTrackTitle, ProgramName, ProgramVersion, - - - - -# tests/test_files/nuendo//wavinfo Test Project - Audio - LRCS.wav -# 14 -# tests/test_files/nuendo//wavinfo Test Project - Audio - Stereo.wav -# 1 -# tests/test_files/nuendo//wavinfo Test Project - Audio - LRC.wav -# 10 -# tests/test_files/nuendo//wavinfo Test Project - Audio - Mono.wav -# 0 -# tests/test_files/nuendo//wavinfo Test Project - Audio - Quad.wav -# 15 -# tests/test_files/nuendo//wavinfo Test Project - Audio - 5.1.wav -# 19 -# tests/test_files/nuendo//wavinfo Test Project - Audio - 5.0.wav -# 18 -# tests/test_files/nuendo//wavinfo Test Project - Audio - 6.1 Surround EX.wav -# 22 -# tests/test_files/nuendo//wavinfo Test Project - Audio - 6.0 Surround EX.wav -# 20 -# tests/test_files/nuendo//wavinfo Test Project - Audio - 7.1 SDDS.wav -# 26 -# tests/test_files/nuendo//wavinfo Test Project - Audio - 7.0 SDDS.wav -# 24 -# tests/test_files/nuendo//wavinfo Test Project - Audio - 7.0.wav -# 25 -# tests/test_files/nuendo//wavinfo Test Project - Audio - 7.1.wav -# 27 -# tests/test_files/nuendo//wavinfo Test Project - Audio - 6.1 Music.wav -# 23 - -# tests/test_files/nuendo//wavinfo Test Project - Audio - Atmos 7.1.2.wav -# 33 -# tests/test_files/nuendo//wavinfo Test Project - Audio - Atmos 5.0.4.wav -# 35 -# tests/test_files/nuendo//wavinfo Test Project - Audio - Atmos 5.1.4.wav -# 36 - -# tests/test_files/nuendo//wavinfo Test Project - Audio - Atmos 7.0.2.wav -# 48 -# tests/test_files/nuendo//wavinfo Test Project - Audio - Atmos 7.1.4.wav -# 44 - -# tests/test_files/nuendo//wavinfo Test Project - Audio - Atmos 7.1.6.wav -# 51 - -# tests/test_files/nuendo//wavinfo Test Project - Audio - Atmos 9.1.4.wav -# 53 -# tests/test_files/nuendo//wavinfo Test Project - Audio - Atmos 9.1.6.wav -# 55 -# tests/test_files/nuendo//wavinfo Test Project - Audio - 3OA.wav -# 47 - -# tests/test_files/nuendo//wavinfo Test Project - Audio - 1OA.wav -# 45 -# tests/test_files/nuendo//wavinfo Test Project - Audio - 2OA.wav -# 46 - -# tests/test_files/nuendo//wavinfo Test Project - Audio - Auro3d 10.0.wav -# 37 -# tests/test_files/nuendo//wavinfo Test Project - Audio - Auro3d 10.1.wav -# 38 - -# tests/test_files/nuendo//wavinfo Test Project - Audio - Auro3d 13.1.wav -# 42 -# tests/test_files/nuendo//wavinfo Test Project - Audio - Auro3d 13.0.wav -# 41 -# tests/test_files/nuendo//wavinfo Test Project - Audio - Auro3d 11.0.wav -# 39 -# tests/test_files/nuendo//wavinfo Test Project - Audio - Auro3d 11.1.wav -# 40