diff --git a/wavinfo/wave_ixml_reader.py b/wavinfo/wave_ixml_reader.py new file mode 100644 index 0000000..9a023bf --- /dev/null +++ b/wavinfo/wave_ixml_reader.py @@ -0,0 +1,41 @@ +import xml.etree.ElementTree as ET + +class WavIXMLFormat: + """ + iXML recorder metadata, as defined by iXML 2.0 + """ + def __init__(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: + return e.text + + @property + def project(self): + return _get_text_value("PROJECT") + + @property + def scene(self): + return _get_text_value("SCECE") + + @property + def take(self): + return _get_text_value("TAKE") + + @property + def tape(self): + return _get_text_value("TAPE") + + @property + def family_uid(self): + return _get_text_value("FILE_SET/FAMILY_UID") + + @property + def family_name(self): + return _get_text_value("FILE_SET/FAMILY_NAME") + + diff --git a/wavinfo/wave_parser.py b/wavinfo/wave_parser.py new file mode 100644 index 0000000..98d6d38 --- /dev/null +++ b/wavinfo/wave_parser.py @@ -0,0 +1,151 @@ + +import struct + +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) + + +def parse_list_chunk(stream, length): + children = [] + + start = stream.tell() + + signature = stream.read(4) + + while (stream.tell() - start) < length: + children.append(parse_chunk(stream)) + + return ListChunkDescriptor(signature=signature, children=children) + + +def parse_chunk(stream): + ident = stream.read(4) + if len(ident) != 4: + return + + sizeb = stream.read(4) + size = struct.unpack('