From 4dfc1ab33ca843ce300aa8d756795cada3aedf74 Mon Sep 17 00:00:00 2001 From: Jamie Hardt Date: Mon, 19 Aug 2019 11:39:13 -0700 Subject: [PATCH] Added iXML track list parsing --- setup.py | 2 +- tests/test_wave_parsing.py | 7 +++++++ wavinfo/__init__.py | 2 +- wavinfo/wave_ixml_reader.py | 19 ++++++++++++++++++- 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index d147e2f..ff2dbf5 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ with open("README.md", "r") as fh: long_description = fh.read() setup(name='wavinfo', - version='1.2', + version='1.3', author='Jamie Hardt', author_email='jamiehardt@me.com', description='Probe WAVE Files for iXML, Broadcast-WAVE and other metadata.', diff --git a/tests/test_wave_parsing.py b/tests/test_wave_parsing.py index da99c4f..18926a5 100644 --- a/tests/test_wave_parsing.py +++ b/tests/test_wave_parsing.py @@ -87,3 +87,10 @@ class TestWaveInfo(TestCase): self.assertEqual( e['take'], info.ixml.take ) self.assertEqual( e['tape'], info.ixml.tape ) self.assertEqual( e['family_uid'], info.ixml.family_uid ) + + for track in info.ixml.track_list: + self.assertIsNotNone(track.channel_index) + if basename == 'A101_4.WAV' and track.channel_index == '1': + self.assertTrue(track.name == 'MKH516 A') + + diff --git a/wavinfo/__init__.py b/wavinfo/__init__.py index 01893a2..cdbdf58 100644 --- a/wavinfo/__init__.py +++ b/wavinfo/__init__.py @@ -10,5 +10,5 @@ from .wave_reader import WavInfoReader -__version__ = '1.1' +__version__ = '1.3' __author__ = 'Jamie Hardt' diff --git a/wavinfo/wave_ixml_reader.py b/wavinfo/wave_ixml_reader.py index ca3555f..c050280 100644 --- a/wavinfo/wave_ixml_reader.py +++ b/wavinfo/wave_ixml_reader.py @@ -1,6 +1,10 @@ #import xml.etree.ElementTree as ET from lxml import etree as ET import io +from collections import namedtuple + + +IXMLTrack = namedtuple('IXMLTrack', ['channel_index', 'interleave_index', 'name', 'function']) class WavIXMLFormat: """ @@ -33,7 +37,20 @@ class WavIXMLFormat: The root entity of the iXML document. """ return self.parsed - + + @property + def track_list(self): + """ + A description of each track. + :return: An Iterator + """ + for track in self.parsed.find("./TRACK_LIST").iter(): + if track.tag == 'TRACK': + yield IXMLTrack(channel_index=track.xpath('string(CHANNEL_INDEX/text())'), + interleave_index=track.xpath('string(INTERLEAVE_INDEX/text())'), + name=track.xpath('string(NAME/text())'), + function=track.xpath('string(FUNCTION/text())')) + @property def project(self): """