From 22ce88dcb7bb86459f3ec1f631607cb09e88841c Mon Sep 17 00:00:00 2001 From: Reinhold Kainhofer Date: Wed, 14 Nov 2007 16:17:51 +0100 Subject: [PATCH] MusicXML: Add support for compressed MusicXML files (command-line option -z) MusicXML also defined a compressed format, where the .xml file is stored inside a ZIP archive (with extension .mxl) . In this case, we need to read the META-INF/container.xml file from the archive to get the name of the XML file inside the archive, and then load this file. Thanks to the zipfile module and the StringIO module, implementing this was quite easy. I also fixed some other small bugs that led to crashes. --- .../20a-Compressed-MusicXML-Sample.mxl | Bin 0 -> 28492 bytes scripts/musicxml2ly.py | 61 ++++++++++++++---- 2 files changed, 49 insertions(+), 12 deletions(-) create mode 100644 input/regression/musicxml/20a-Compressed-MusicXML-Sample.mxl diff --git a/input/regression/musicxml/20a-Compressed-MusicXML-Sample.mxl b/input/regression/musicxml/20a-Compressed-MusicXML-Sample.mxl new file mode 100644 index 0000000000000000000000000000000000000000..0d41bf3eaac0d7d890f2ecc2fc341da4226fc3c2 GIT binary patch literal 28492 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 elements have no specified meaning @@ -1624,6 +1626,12 @@ Copyright (c) 2005--2007 by dest="use_lxml", help=_ ("Use lxml.etree; uses less memory and cpu time.")) + p.add_option ('-z', '--compressed', + action = "store_true", + dest = 'compressed', + default = False, + help = _ ("Input file is a zip-compressed MusicXML file.")) + p.add_option ('-l', '--language', action = "store", help = _ ("Use a different language file, e.g. 'deutsch' for deutsch.ly.")) @@ -1734,28 +1742,54 @@ def print_ly_additional_definitions (printer, filename): printer.print_verbatim (additional_definitions.get (a, '')) printer.newline () - -def read_musicxml (filename, use_lxml): +# Read in the tree from the given I/O object (either file or string) and +# demarshall it using the classes from the musicxml.py file +def read_xml (io_object, use_lxml): if use_lxml: import lxml.etree - - tree = lxml.etree.parse (filename) + tree = lxml.etree.parse (io_object) mxl_tree = musicxml.lxml_demarshal_node (tree.getroot ()) return mxl_tree else: from xml.dom import minidom, Node - - doc = minidom.parse(filename) + doc = minidom.parse(io_object) node = doc.documentElement return musicxml.minidom_demarshal_node (node) - return None +def read_musicxml (filename, compressed, use_lxml): + raw_string = None + if compressed: + progress ("Input file %s is compressed, extracting raw MusicXML data" % filename) + z = zipfile.ZipFile (filename, "r") + container_xml = z.read ("META-INF/container.xml") + if not container_xml: + return None + container = read_xml (StringIO.StringIO (container_xml), use_lxml) + if not container: + return None + rootfiles = container.get_maybe_exist_named_child ('rootfiles') + if not rootfiles: + return None + rootfile_list = rootfiles.get_named_children ('rootfile') + mxml_file = None + if len (rootfile_list) > 0: + mxml_file = getattr (rootfile_list[0], 'full-path', None) + if mxml_file: + raw_string = z.read (mxml_file) + + io_object = filename + if raw_string: + io_object = StringIO.StringIO (raw_string) + + return read_xml (io_object, use_lxml) + + def convert (filename, options): progress ("Reading MusicXML from %s ..." % filename) - tree = read_musicxml (filename, options.use_lxml) + tree = read_musicxml (filename, options.compressed, options.use_lxml) parts = tree.get_typed_children (musicxml.Part) (voices, staff_info) = get_all_voices (parts) @@ -1808,10 +1842,10 @@ def convert (filename, options): def get_existing_filename_with_extension (filename, ext): if os.path.exists (filename): return filename - newfilename = filename + ".xml" + newfilename = filename + "." + ext if os.path.exists (newfilename): return newfilename; - newfilename = filename + "xml" + newfilename = filename + ext if os.path.exists (newfilename): return newfilename; return '' @@ -1832,6 +1866,9 @@ def main (): # Allow the user to leave out the .xml or xml on the filename filename = get_existing_filename_with_extension (args[0], "xml") + if not filename: + filename = get_existing_filename_with_extension (args[0], "mxl") + options.compressed = True if filename and os.path.exists (filename): voices = convert (filename, options) else: -- 2.39.5