From 37a9849b4e2ad2b1bb572991cad83df2d898568e Mon Sep 17 00:00:00 2001 From: Jamie Hardt Date: Mon, 31 Dec 2018 14:00:57 -0800 Subject: [PATCH] Fixes and testing with files --- wavinfo/__init__.py | 1 + wavinfo/wave_ixml_reader.py | 24 +++++---- wavinfo/wave_parser.py | 100 ++++-------------------------------- wavinfo/wave_reader.py | 100 ++++++++++++++++++++++++++++++++++++ 4 files changed, 124 insertions(+), 101 deletions(-) create mode 100644 wavinfo/__init__.py create mode 100644 wavinfo/wave_reader.py diff --git a/wavinfo/__init__.py b/wavinfo/__init__.py new file mode 100644 index 0000000..d62a6cf --- /dev/null +++ b/wavinfo/__init__.py @@ -0,0 +1 @@ +from .wave_reader import WavInfoReader diff --git a/wavinfo/wave_ixml_reader.py b/wavinfo/wave_ixml_reader.py index 9a023bf..f207cb3 100644 --- a/wavinfo/wave_ixml_reader.py +++ b/wavinfo/wave_ixml_reader.py @@ -4,38 +4,40 @@ class WavIXMLFormat: """ iXML recorder metadata, as defined by iXML 2.0 """ - def __init__(xml): + def __init__(self, xml): self.source = xml self.parsed = ET.fromstring(xml) - def _get_text_value(xpath): - root = self.parsed.getroot() - e = root.find("//BWFXML/" + xpath) - if e: + def _get_text_value(self, xpath): + print("xpath",xpath) + print("search", "./" + xpath) + e = self.parsed.find("./" + xpath) + print("result was", e) + if e is not None: return e.text @property def project(self): - return _get_text_value("PROJECT") + return self._get_text_value("PROJECT") @property def scene(self): - return _get_text_value("SCECE") + return self._get_text_value("SCENE") @property def take(self): - return _get_text_value("TAKE") + return self._get_text_value("TAKE") @property def tape(self): - return _get_text_value("TAPE") + return self._get_text_value("TAPE") @property def family_uid(self): - return _get_text_value("FILE_SET/FAMILY_UID") + return self._get_text_value("FILE_SET/FAMILY_UID") @property def family_name(self): - return _get_text_value("FILE_SET/FAMILY_NAME") + return self._get_text_value("FILE_SET/FAMILY_NAME") diff --git a/wavinfo/wave_parser.py b/wavinfo/wave_parser.py index 98d6d38..8f0bdf2 100644 --- a/wavinfo/wave_parser.py +++ b/wavinfo/wave_parser.py @@ -1,16 +1,19 @@ import struct + +from .wave_ixml_reader import WavIXMLFormat + from collections import namedtuple ListChunkDescriptor = namedtuple('ListChunk' , 'signature children') -class ChunkDescriptor(namedtuple('Chunk', 'ident start length'): - def read_data(from_stream): - from_stream.seek(start) - return from_stream.read(length) +class ChunkDescriptor(namedtuple('Chunk', 'ident start length') ): + def read_data(self, from_stream): + from_stream.seek(self.start) + return from_stream.read(self.length) def parse_list_chunk(stream, length): @@ -50,95 +53,12 @@ def parse_chunk(stream): WavInfoFormat = namedtuple("WavInfoFormat",'audio_format channel_count sample_rate byte_rate block_align bits_per_sample') WavBextFormat = namedtuple("WavBextFormat",'description originator originator_ref ' + - 'originator_date originator_time time_reference version umid loudness_value ' + - 'loudness_range max_true_peak max_momentary_loudness max_shortterm_loudness coding_history') + 'originator_date originator_time time_reference version umid ' + + 'loudness_value loudness_range max_true_peak max_momentary_loudness max_shortterm_loudness ' + + 'coding_history') -class WavInfoReader( namedtuple("_WavInfoReaderImpl", "format bext ixml") ): - """ - format : WAV format - bext : The Broadcast-WAV extension as definied by EBU Tech 3285 v2 (2011) - - """ - - def __init__(self, path): - with open(path, 'rb') as f: - chunks = parse_chunk(f) - - f.seek(0) - - self.format = _get_format(chunks,f) - self.info = _get_bext(chunks,f) - self.ixml = _get_ixml(chunks,f) - - - def _get_format(chunks,f): - fmt_chunk = next(chunk for chunk in chunks if chunk.ident == b'fmt ') - fmt_data = chunk.read_data(from_stream=f) - - # The format chunk is - # audio_format U16 - # channel_count U16 - # sample_rate U32 Note an integer - # byte_rate U32 == SampleRate * NumChannels * BitsPerSample/8 - # block_align U16 == NumChannels * BitsPerSample/8 - # bits_per_sampl U16 - unpacked = struct.unpack("