Skip to content

Commit

Permalink
Add type-id parsing to all entities
Browse files Browse the repository at this point in the history
Add type-id and value-id to work attributes
Fixes #234

Signed-off-by: Alastair Porter <[email protected]>
  • Loading branch information
alastair committed Jan 16, 2022
1 parent 1638c62 commit 54f9c8a
Show file tree
Hide file tree
Showing 6 changed files with 49 additions and 26 deletions.
28 changes: 17 additions & 11 deletions musicbrainzngs/mbxml.py
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ def parse_area_list(al):

def parse_area(area):
result = {}
attribs = ["id", "type", "ext:score"]
attribs = ["id", "type", "type-id", "ext:score"]
elements = ["name", "sort-name", "disambiguation"]
inner_els = {"life-span": parse_lifespan,
"alias-list": parse_alias_list,
Expand All @@ -233,7 +233,7 @@ def parse_artist_list(al):

def parse_artist(artist):
result = {}
attribs = ["id", "type", "ext:score"]
attribs = ["id", "type", "type-id", "ext:score"]
elements = ["name", "sort-name", "country", "user-rating",
"disambiguation", "gender", "ipi"]
inner_els = {"area": parse_area,
Expand Down Expand Up @@ -266,7 +266,7 @@ def parse_place_list(pl):

def parse_place(place):
result = {}
attribs = ["id", "type", "ext:score"]
attribs = ["id", "type", "type-id", "ext:score"]
elements = ["name", "address",
"ipi", "disambiguation"]
inner_els = {"area": parse_area,
Expand All @@ -288,7 +288,7 @@ def parse_event_list(el):

def parse_event(event):
result = {}
attribs = ["id", "type", "ext:score"]
attribs = ["id", "type", "type-id", "ext:score"]
elements = ["name", "time", "setlist", "cancelled", "disambiguation", "user-rating"]
inner_els = {"life-span": parse_lifespan,
"relation-list": parse_relation_list,
Expand All @@ -304,7 +304,7 @@ def parse_event(event):

def parse_instrument(instrument):
result = {}
attribs = ["id", "type", "ext:score"]
attribs = ["id", "type", "type-id", "ext:score"]
elements = ["name", "description", "disambiguation"]
inner_els = {"relation-list": parse_relation_list,
"tag-list": parse_tag_list,
Expand All @@ -320,7 +320,7 @@ def parse_label_list(ll):

def parse_label(label):
result = {}
attribs = ["id", "type", "ext:score"]
attribs = ["id", "type", "type-id", "ext:score"]
elements = ["name", "sort-name", "country", "label-code", "user-rating",
"ipi", "disambiguation"]
inner_els = {"area": parse_area,
Expand Down Expand Up @@ -473,7 +473,7 @@ def parse_text_representation(textr):

def parse_release_group(rg):
result = {}
attribs = ["id", "type", "ext:score"]
attribs = ["id", "type", "type-id", "ext:score"]
elements = ["title", "user-rating", "first-release-date", "primary-type",
"disambiguation"]
inner_els = {"artist-credit": parse_artist_credit,
Expand Down Expand Up @@ -517,7 +517,7 @@ def parse_series_list(sl):

def parse_series(series):
result = {}
attribs = ["id", "type", "ext:score"]
attribs = ["id", "type", "type-id", "ext:score"]
elements = ["name", "disambiguation"]
inner_els = {"alias-list": parse_alias_list,
"relation-list": parse_relation_list,
Expand All @@ -539,7 +539,7 @@ def parse_work_list(wl):

def parse_work(work):
result = {}
attribs = ["id", "ext:score", "type"]
attribs = ["id", "ext:score", "type", "type-id"]
elements = ["title", "user-rating", "language", "iswc", "disambiguation"]
inner_els = {"tag-list": parse_tag_list,
"user-tag-list": parse_tag_list,
Expand All @@ -560,12 +560,18 @@ def parse_work_attribute_list(wal):
return [parse_work_attribute(wa) for wa in wal]

def parse_work_attribute(wa):
attribs = ["type"]
attribs = ["type", "type-id", "value-id"]
typeinfo = parse_attributes(attribs, wa)
print(typeinfo)
result = {}
if typeinfo:
result = {"attribute": typeinfo["type"],
"type": typeinfo["type"],
"value": wa.text}
if "value-id" in typeinfo:
result["value-id"] = typeinfo["value-id"]
if "type-id" in typeinfo:
result["type-id"] = typeinfo["type-id"]

return result

Expand Down Expand Up @@ -734,7 +740,7 @@ def parse_alias_list(al):

def parse_alias(alias):
result = {}
attribs = ["locale", "sort-name", "type", "primary",
attribs = ["locale", "sort-name", "type", "type-id", "primary",
"begin-date", "end-date"]

result.update(parse_attributes(attribs, alias))
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?><metadata xmlns="http://musicbrainz.org/ns/mmd-2.0#"><work id="3d7c7cd2-da79-37f4-98b8-ccfb1a4ac6c4"><title>Symphony No. 2 in E minor, Op. 27: III. Adagio</title><alias-list count="10"><alias sort-name="Adagio from Symphony No. 2 in E minor, Op. 27">Adagio from Symphony No. 2 in E minor, Op. 27</alias><alias sort-name="Adagio from Symphony No. 2 in E minor, Op. 27">Adagio from Symphony No. 2 in E minor, Op. 27</alias><alias sort-name="III. Adagio from Symphony No. 2 in E minor, Op. 27">III. Adagio from Symphony No. 2 in E minor, Op. 27</alias><alias sort-name="Sinfonie Nr. 2 e-moll, Op. 27: III. Adagio">Sinfonie Nr. 2 e-moll, Op. 27: III. Adagio</alias><alias sort-name="Symphonie No. 2 in E minor, Op. 27: III. Adagio">Symphonie No. 2 in E minor, Op. 27: III. Adagio</alias><alias sort-name="Symphony No. 2 in E minor, Op. 27: III. Adagio">Symphony No. 2 in E minor, Op. 27: III. Adagio</alias><alias sort-name="Symphony No. 2 in E minor, Op. 27: III. Adagio">Symphony No. 2 in E minor, Op. 27: III. Adagio</alias><alias sort-name="Symphony No. 2 in E minor, Op. 27: III. Adagio">Symphony No. 2 in E minor, Op. 27: III. Adagio</alias><alias sort-name="Symphony No. 3 in A minor, Op. 44: II. Adagio ma non troppo">Symphony No. 3 in A minor, Op. 44: II. Adagio ma non troppo</alias><alias sort-name="교향곡 2번 3악장 &quot;아다지오&quot; [Symphony No. 2 in E minor, Op. 27: III. Adagio]">교향곡 2번 3악장 &quot;아다지오&quot; [Symphony No. 2 in E minor, Op. 27: III. Adagio]</alias></alias-list></work></metadata>
<?xml version="1.0" encoding="UTF-8"?>
<metadata xmlns="http://musicbrainz.org/ns/mmd-2.0#"><work id="3d7c7cd2-da79-37f4-98b8-ccfb1a4ac6c4"><title>Symphony no. 2 in E minor, op. 27: III. Adagio</title><language>zxx</language><language-list><language>zxx</language></language-list><alias-list count="11"><alias sort-name="Adagio from Symphony No. 2 in E minor, Op. 27">Adagio from Symphony No. 2 in E minor, Op. 27</alias><alias sort-name="Adagio from Symphony No. 2 in E minor, Op. 27">Adagio from Symphony No. 2 in E minor, Op. 27</alias><alias sort-name="III. Adagio from Symphony No. 2 in E minor, Op. 27">III. Adagio from Symphony No. 2 in E minor, Op. 27</alias><alias sort-name="Sinfonie Nr. 2 e-moll, Op. 27: III. Adagio">Sinfonie Nr. 2 e-moll, Op. 27: III. Adagio</alias><alias sort-name="Symphonie No. 2 in E minor, Op. 27: III. Adagio">Symphonie No. 2 in E minor, Op. 27: III. Adagio</alias><alias sort-name="Symphony No. 2 in E minor, Op. 27: III. Adagio">Symphony No. 2 in E minor, Op. 27: III. Adagio</alias><alias sort-name="Symphony No. 2 in E minor, Op. 27: III. Adagio">Symphony No. 2 in E minor, Op. 27: III. Adagio</alias><alias sort-name="Symphony No. 2 in E minor, Op. 27: III. Adagio">Symphony No. 2 in E minor, Op. 27: III. Adagio</alias><alias sort-name="Symphony No. 2 in E minor, Op. 27: slow movement">Symphony No. 2 in E minor, Op. 27: slow movement</alias><alias sort-name="Symphony No. 3 in A minor, Op. 44: II. Adagio ma non troppo">Symphony No. 3 in A minor, Op. 44: II. Adagio ma non troppo</alias><alias sort-name="교향곡 2번 3악장 &quot;아다지오&quot; [Symphony No. 2 in E minor, Op. 27: III. Adagio]">교향곡 2번 3악장 "아다지오" [Symphony No. 2 in E minor, Op. 27: III. Adagio]</alias></alias-list></work></metadata>
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?><metadata xmlns="http://musicbrainz.org/ns/mmd-2.0#"><work type="Cantata" id="72c9aad2-3c95-4e3e-8a01-3974f8fef8eb"><title>Cantata, BuxWV 1 &quot;Accedite gentes, accurite populi&quot;</title><language>lat</language><relation-list target-type="series"><relation type="part of" type-id="b0d44366-cdf0-3acb-bee6-0f65a77a6ef0"><target>0790fa51-15d9-40a2-bca9-9c8eaaa96bef</target><ordering-key>1</ordering-key><direction>backward</direction><attribute-list><attribute value="BuxWV 1">number</attribute></attribute-list><series type="Catalogue" id="0790fa51-15d9-40a2-bca9-9c8eaaa96bef"><name>Buxtehude-Werke-Verzeichnis</name></series></relation></relation-list></work></metadata>
<?xml version="1.0" encoding="UTF-8"?>
<metadata xmlns="http://musicbrainz.org/ns/mmd-2.0#"><work id="72c9aad2-3c95-4e3e-8a01-3974f8fef8eb" type="Cantata" type-id="0db2f555-15f9-393f-af4c-739db5711146"><title>Cantata, BuxWV 1 "Accedite gentes, accurite populi"</title><language>lat</language><language-list><language>lat</language></language-list><relation-list target-type="series"><relation type="part of" type-id="b0d44366-cdf0-3acb-bee6-0f65a77a6ef0"><target>0790fa51-15d9-40a2-bca9-9c8eaaa96bef</target><ordering-key>1</ordering-key><direction>backward</direction><attribute-list><attribute type-id="a59c5830-5ec7-38fe-9a21-c7ea54f6650a" value="BuxWV 1">number</attribute></attribute-list><series id="0790fa51-15d9-40a2-bca9-9c8eaaa96bef" type="Catalogue" type-id="49482ff0-fc9e-3b8c-a2d0-30e84d9df002"><name>Buxtehude-Werke-Verzeichnis</name></series></relation></relation-list></work></metadata>
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<metadata xmlns="http://musicbrainz.org/ns/mmd-2.0#"><work type="Symphony" id="80737426-8ef3-3a9c-a3a6-9507afb93e93"><title>Symphony no. 3 in E-flat major, op. 55 "Eroica"</title><language>zxx</language><attribute-list><attribute type="Key">E-flat major</attribute></attribute-list><alias-list count="2"><alias sort-name="Symphonie Nr. 3 Es-Dur, Op. 55 &quot;Eroica&quot;">Symphonie Nr. 3 Es-Dur, Op. 55 "Eroica"</alias><alias sort-name="Symphony No. 3, Op. 55 &quot;Eroica&quot;">Symphony No. 3, Op. 55 "Eroica"</alias></alias-list></work></metadata>
<metadata xmlns="http://musicbrainz.org/ns/mmd-2.0#"><work id="80737426-8ef3-3a9c-a3a6-9507afb93e93" type="Symphony" type-id="174314aa-0aa4-30cf-96a6-50b281d8d208"><title>Symphony no. 3 in E-flat major, op. 55 Eroica</title><language>zxx</language><language-list><language>zxx</language></language-list><attribute-list><attribute value-id="7ed963d7-dba9-3357-aefa-f34accb047cd" type="Key" type-id="7526c19d-3be4-3420-b6cc-9fb6e49fa1a9">E-flat major</attribute></attribute-list><alias-list count="3"><alias locale="fi" sort-name="Sinfonia nro 3 Es-duuri, op. 55 ”Eroica”" type="Work name" type-id="a18cab3f-0ae2-3978-8f75-dd9c09702b25" primary="primary">Sinfonia nro 3 Es-duuri, op. 55 ”Eroica”</alias><alias sort-name="Symphonie Nr. 3 Es-Dur, Op. 55 &quot;Eroica&quot;">Symphonie Nr. 3 Es-Dur, Op. 55 "Eroica"</alias><alias sort-name="Symphony No. 3, Op. 55 &quot;Eroica&quot;">Symphony No. 3, Op. 55 "Eroica"</alias></alias-list></work></metadata>
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><metadata xmlns="http://musicbrainz.org/ns/mmd-2.0#"><work id="8e134b32-99b8-4e96-ae5c-426f3be85f4c"><title>Hüzzam Peşrev</title><language>zxx</language><attribute-list><attribute type="Makam (Ottoman, Turkish)">Hüzzam</attribute><attribute type="Form (Ottoman, Turkish)">Peşrev</attribute><attribute type="Usul (Ottoman, Turkish)">Fahte</attribute></attribute-list></work></metadata>
<?xml version="1.0" encoding="UTF-8"?><metadata xmlns="http://musicbrainz.org/ns/mmd-2.0#"><work id="8e134b32-99b8-4e96-ae5c-426f3be85f4c"><title>Hüzzam Peşrev</title><language>zxx</language><language-list><language>zxx</language></language-list><attribute-list><attribute value-id="583b64cf-bc36-3dae-8b1d-f834e0a7d9f6" type="Makam (Ottoman, Turkish)" type-id="d7979776-ba34-3e8d-980f-4849b38143d2">Hüzzam</attribute><attribute value-id="e2d21124-9c1f-3091-b8cc-b49714a84c8b" type="Form (Ottoman, Turkish)" type-id="77d00f78-0b30-3d91-80de-209a014d33a2">Peşrev</attribute><attribute value-id="70636c0a-30da-310c-a7e8-c1113f35dab8" type="Usul (Ottoman, Turkish)" type-id="29a16dc2-8602-3fee-9a03-a8cc87fa961d">Fahte</attribute></attribute-list></work></metadata>
37 changes: 26 additions & 11 deletions test/test_mbxml_work.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,19 @@ def setUp(self):
def testWorkAliases(self):
res = _common.open_and_parse_test_data(self.datadir, "80737426-8ef3-3a9c-a3a6-9507afb93e93-aliases.xml")
aliases = res["work"]["alias-list"]
self.assertEqual(len(aliases), 2)
self.assertEqual(len(aliases), 3)

a0 = aliases[0]
self.assertEqual(a0["alias"], 'Symphonie Nr. 3 Es-Dur, Op. 55 "Eroica"')
self.assertEqual(a0["sort-name"], 'Symphonie Nr. 3 Es-Dur, Op. 55 "Eroica"')
self.assertEqual(a0["alias"], u'Sinfonia nro 3 Es-duuri, op. 55 Eroica')
self.assertEqual(a0["sort-name"], u'Sinfonia nro 3 Es-duuri, op. 55 Eroica')

a1 = aliases[1]
a1 = aliases[2]
self.assertEqual(a1["alias"], 'Symphony No. 3, Op. 55 "Eroica"')
self.assertEqual(a1["sort-name"], 'Symphony No. 3, Op. 55 "Eroica"')


res = _common.open_and_parse_test_data(self.datadir, "3d7c7cd2-da79-37f4-98b8-ccfb1a4ac6c4-aliases.xml")
aliases = res["work"]["alias-list"]
self.assertEqual(len(aliases), 10)
self.assertEqual(len(aliases), 11)

a0 = aliases[0]
self.assertEqual(a0["alias"], "Adagio from Symphony No. 2 in E minor, Op. 27")
Expand All @@ -38,17 +37,33 @@ def testWorkAttributes(self):
self.assertEqual(len(work_attrs), 1)
attr = work_attrs[0]

expected = {"attribute": "Key", "value": "E-flat major"}
expected = {"attribute": "Key",
"type": "Key",
"type-id": "7526c19d-3be4-3420-b6cc-9fb6e49fa1a9",
"value": "E-flat major",
"value-id": "7ed963d7-dba9-3357-aefa-f34accb047cd"}
self.assertEqual(expected, attr)

res = _common.open_and_parse_test_data(self.datadir, "8e134b32-99b8-4e96-ae5c-426f3be85f4c-attributes.xml")
work_attrs = res["work"]["attribute-list"]
self.assertEqual(len(work_attrs), 3)
expected = {"attribute": "Makam (Ottoman, Turkish)", "value": b"H\xc3\xbczzam".decode("utf-8")}
expected = {"type": "Makam (Ottoman, Turkish)",
"attribute": "Makam (Ottoman, Turkish)",
"value": b"H\xc3\xbczzam".decode("utf-8"),
"type-id": "d7979776-ba34-3e8d-980f-4849b38143d2",
"value-id": "583b64cf-bc36-3dae-8b1d-f834e0a7d9f6"}
self.assertEqual(expected, work_attrs[0])
expected = {"attribute": "Form (Ottoman, Turkish)", "value": b"Pe\xc5\x9frev".decode("utf-8")}
expected = {"type": "Form (Ottoman, Turkish)",
"attribute": "Form (Ottoman, Turkish)",
"value": b"Pe\xc5\x9frev".decode("utf-8"),
"type-id": "77d00f78-0b30-3d91-80de-209a014d33a2",
"value-id": "e2d21124-9c1f-3091-b8cc-b49714a84c8b"}
self.assertEqual(expected, work_attrs[1])
expected = {"attribute": "Usul (Ottoman, Turkish)", "value": "Fahte"}
expected = {"type": "Usul (Ottoman, Turkish)",
"attribute": "Usul (Ottoman, Turkish)",
"value": "Fahte",
"type-id": "29a16dc2-8602-3fee-9a03-a8cc87fa961d",
"value-id": "70636c0a-30da-310c-a7e8-c1113f35dab8"}
self.assertEqual(expected, work_attrs[2])

def testWorkRelationAttributes(self):
Expand All @@ -65,5 +80,5 @@ def testWorkRelationAttributes(self):

# New attribute dict format
attributes = rels[0]["attributes"]
expected = {"attribute": "number", "value": "BuxWV 1"}
expected = {"attribute": "number", "value": "BuxWV 1", "type-id": "a59c5830-5ec7-38fe-9a21-c7ea54f6650a"}
self.assertEqual(expected, attributes[0])

0 comments on commit 54f9c8a

Please sign in to comment.