Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Question: Different method for release approach #15

Open
phirestalker opened this issue Oct 22, 2023 · 25 comments
Open

Question: Different method for release approach #15

phirestalker opened this issue Oct 22, 2023 · 25 comments

Comments

@phirestalker
Copy link

I am using releases approach since you mentioned it is more accurate. I had to spin up my own musicbrainz server because HOLY CRAP is it slow. It is much faster with. my own server, but still pretty slow. At least it should finish today.

I was looking through the code and an example recording that has an associated work. I realize we must fetch the work from the work id. I noticed that each item has a 'start' and 'end' key with a date. I was wondering why the 'start' or 'end' dates are not used instead of fetching the recording for each item in 'recording-relation-list'? Are those dates not reliable?

For example:
Poker face by Lady Gaga
Recording ID: 35618652-47d7-495d-806a-ee1b88eeb776 has the associated work id: 9f6363b8-7df7-3732-b2b6-94c0f02e0bde
and when using musicbrainzngs.get_work_by_id('9f6363b8-7df7-3732-b2b6-94c0f02e0bde', ['recording-rels'])['work'], I get the following data.

{'id': '9f6363b8-7df7-3732-b2b6-94c0f02e0bde', 'type': 'Song', 'title': 'Poker Face', 'language': 'eng', 'iswc': 'T-901.751.548-9', 'iswc-list': ['T-901.751.548-9'], 'attribute-list': [{'attribute': 'BMI ID', 'value': '9990767'}, {'attribute': 'AACIMH ID', 'value': '3923568'}, {'attribute': 'ACAM ID', 'value': '3923568'}, {'attribute': 'AEI ID', 'value': '3923568'}, {'attribute': 'AGADU ID', 'value': '6145641'}, {'attribute': 'AKM ID', 'value': '576954201'}, {'attribute': 'APA ID', 'value': '5796906'}, {'attribute': 'APDAYC ID', 'value': '3125255'}, {'attribute': 'APRA ID', 'value': 'GW37090318'}, {'attribute': 'ARTISJUS ID', 'value': '4000251094'}, {'attribute': 'BUMA/STEMRA ID', 'value': 'W-005497488'}, {'attribute': 'COMPASS ID', 'value': '8988023'}, {'attribute': 'COMPASS ID', 'value': '8808605'}, {'attribute': 'COMPASS ID', 'value': '9092601'}, {'attribute': 'COMPASS ID', 'value': '9946198'}, {'attribute': 'COMPASS ID', 'value': '6513714'}, {'attribute': 'ECAD ID', 'value': '2972669'}, {'attribute': 'GEMA ID', 'value': '10515346-001'}, {'attribute': 'JASRAC ID', 'value': '0Z6-7276-1'}, {'attribute': 'NICAUTOR ID', 'value': '3923568'}, {'attribute': 'PRS tune code', 'value': '9026025T'}, {'attribute': 'SABAM ID', 'value': '182653050'}, {'attribute': 'SACEM ID', 'value': '23 759 517 11'}, {'attribute': 'SACIM ID', 'value': '3923568'}, {'attribute': 'SACM ID', 'value': '155751365'}, {'attribute': 'SACVEN ID', 'value': '3863718'}, {'attribute': 'SADAIC ID', 'value': '895238'}, {'attribute': 'SAYCE ID', 'value': '5496814'}, {'attribute': 'SAYCO ID', 'value': '5496814'}, {'attribute': 'SGACEDOM ID', 'value': '3923568'}, {'attribute': 'SGAE ID', 'value': '9.440.739'}, {'attribute': 'SIAE ID', 'value': '8852307900'}, {'attribute': 'SIAE ID', 'value': '8861599100'}, {'attribute': 'SOBODAYCOM ID', 'value': '3923568'}, {'attribute': 'SOCAN ID', 'value': '47754524'}, {'attribute': 'SOCAN ID', 'value': '41066551'}, {'attribute': 'SPA ID', 'value': '1190568'}, {'attribute': 'SPAC ID', 'value': '3923568'}, {'attribute': 'SUISA ID', 'value': '004077 606 57'}], 'recording-relation-list': [{'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'fc1cbf87-420b-426c-ae24-0a09f582b75f', 'ordering-key': '2', 'direction': 'backward', 'begin': '2009-06-21', 'end': '2009-06-21', 'ended': 'true', 'attribute-list': ['live', 'medley'], 'recording': {'id': 'fc1cbf87-420b-426c-ae24-0a09f582b75f', 'title': 'Love Game / Poker Face', 'length': '359320', 'disambiguation': 'live, 2009-06-21, MMVAs: 299 Queen Street West, Toronto, ON, Canada'}, 'attributes': [{'type-id': '70007db6-a8bc-46d7-a770-80e6a0bb551a', 'attribute': 'live'}, {'type-id': '37da3398-5d1b-4acb-be25-df95e33e423c', 'attribute': 'medley'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'ebad65c6-fda5-49dd-aad2-7b147c62392b', 'direction': 'backward', 'begin': '2009-09-28', 'end': '2009-09-28', 'ended': 'true', 'attribute-list': ['cover', 'live'], 'recording': {'id': 'ebad65c6-fda5-49dd-aad2-7b147c62392b', 'title': 'Poker Face', 'length': '188000', 'disambiguation': "live, 2009-09-28: BBC Radio 1's Live Lounge: London, UK"}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}, {'type-id': '70007db6-a8bc-46d7-a770-80e6a0bb551a', 'attribute': 'live'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '35a97504-f9b3-461c-99f3-aa2561a1e4e5', 'direction': 'backward', 'begin': '2019-05-19', 'end': '2019-05-23', 'ended': 'true', 'attribute-list': ['cover'], 'recording': {'id': '35a97504-f9b3-461c-99f3-aa2561a1e4e5', 'title': 'Poker Face', 'length': '236000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '6feec9d8-d3e0-4dba-99d6-e29256ddafa4', 'direction': 'backward', 'attribute-list': ['cover', 'live', 'medley', 'partial'], 'recording': {'id': '6feec9d8-d3e0-4dba-99d6-e29256ddafa4', 'title': 'Anniversary Medley Part 3', 'length': '389773'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}, {'type-id': '70007db6-a8bc-46d7-a770-80e6a0bb551a', 'attribute': 'live'}, {'type-id': '37da3398-5d1b-4acb-be25-df95e33e423c', 'attribute': 'medley'}, {'type-id': 'd2b63be6-91ec-426a-987a-30b47f8aae2d', 'attribute': 'partial'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '8a4e862b-06c1-450d-ae40-fde560d41d76', 'direction': 'backward', 'attribute-list': ['cover', 'live', 'medley'], 'recording': {'id': '8a4e862b-06c1-450d-ae40-fde560d41d76', 'title': 'Ein bisschen Gaga', 'length': '224613'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}, {'type-id': '70007db6-a8bc-46d7-a770-80e6a0bb551a', 'attribute': 'live'}, {'type-id': '37da3398-5d1b-4acb-be25-df95e33e423c', 'attribute': 'medley'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'daddb3fe-59e0-4442-ba9a-9fbbe0cf3a41', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'daddb3fe-59e0-4442-ba9a-9fbbe0cf3a41', 'title': 'Lady Gaga ‘Poker Face’', 'length': '232000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '6f8de9eb-a43c-4954-b092-279ac855019a', 'direction': 'backward', 'attribute-list': ['medley'], 'recording': {'id': '6f8de9eb-a43c-4954-b092-279ac855019a', 'title': 'Lady Gaga Medley', 'length': '234000'}, 'attributes': [{'type-id': '37da3398-5d1b-4acb-be25-df95e33e423c', 'attribute': 'medley'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '8c78fe62-a67c-4942-9744-a79901a4d9ec', 'direction': 'backward', 'attribute-list': ['cover', 'medley'], 'recording': {'id': '8c78fe62-a67c-4942-9744-a79901a4d9ec', 'title': 'Lady Gaga Medley', 'length': '175000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}, {'type-id': '37da3398-5d1b-4acb-be25-df95e33e423c', 'attribute': 'medley'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '31730583-2acb-4499-a44c-aff134c4ffab', 'direction': 'backward', 'attribute-list': ['live', 'medley'], 'recording': {'id': '31730583-2acb-4499-a44c-aff134c4ffab', 'title': 'Medley "Étrange avion" : Poker Face / L’eté s’ra chaud / Y’a le printemps qui chante (Viens à la maison) / Rolling in the Deep / French Cancan / Party Rock Anthem', 'length': '928813', 'disambiguation': 'live, 2012-02: Halle Tony-Garnier, Lyon, France'}, 'attributes': [{'type-id': '70007db6-a8bc-46d7-a770-80e6a0bb551a', 'attribute': 'live'}, {'type-id': '37da3398-5d1b-4acb-be25-df95e33e423c', 'attribute': 'medley'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '650de76f-982d-4082-ad39-ce2fe0dc3690', 'direction': 'backward', 'attribute-list': ['cover', 'live', 'medley'], 'recording': {'id': '650de76f-982d-4082-ad39-ce2fe0dc3690', 'title': 'Medley: Poker Face / Paparazzi / Just Dance', 'length': '159000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}, {'type-id': '70007db6-a8bc-46d7-a770-80e6a0bb551a', 'attribute': 'live'}, {'type-id': '37da3398-5d1b-4acb-be25-df95e33e423c', 'attribute': 'medley'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '70c25444-ca06-4b4a-8104-18a21c910d96', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': '70c25444-ca06-4b4a-8104-18a21c910d96', 'title': 'Poker Face', 'length': '195506'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '9f01f1ed-fa30-406d-9032-dec4bcd5a0db', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': '9f01f1ed-fa30-406d-9032-dec4bcd5a0db', 'title': 'Poker Face', 'length': '237000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '52ad2eaa-82ea-48ab-a492-a2c75c2bfbf3', 'direction': 'backward', 'attribute-list': ['live'], 'recording': {'id': '52ad2eaa-82ea-48ab-a492-a2c75c2bfbf3', 'title': 'Poker Face', 'length': '244466', 'disambiguation': 'BBC Radio 1ʼs Live Lounge'}, 'attributes': [{'type-id': '70007db6-a8bc-46d7-a770-80e6a0bb551a', 'attribute': 'live'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '97cc32ce-4e3c-48a4-b93b-8a3b5cdbeda1', 'direction': 'backward', 'recording': {'id': '97cc32ce-4e3c-48a4-b93b-8a3b5cdbeda1', 'title': 'Poker Face', 'length': '181000'}}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '0f958372-8cfb-454e-9692-bbd28434917a', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': '0f958372-8cfb-454e-9692-bbd28434917a', 'title': 'Poker Face', 'length': '219613'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '6b8e790e-cc12-4e48-bd42-4f82ffb74345', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': '6b8e790e-cc12-4e48-bd42-4f82ffb74345', 'title': 'Poker Face', 'length': '266000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '3dd2b0dd-540c-4e21-8f02-b3f0d45db9e7', 'direction': 'backward', 'attribute-list': ['cover', 'live'], 'recording': {'id': '3dd2b0dd-540c-4e21-8f02-b3f0d45db9e7', 'title': 'Poker Face', 'length': '186000', 'disambiguation': 'Live Lounge version'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}, {'type-id': '70007db6-a8bc-46d7-a770-80e6a0bb551a', 'attribute': 'live'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'd63ac673-d1f4-43c9-9a26-bbc1a2d493e4', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'd63ac673-d1f4-43c9-9a26-bbc1a2d493e4', 'title': 'Poker Face', 'length': '148000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'f7677742-c278-4285-b20e-d91e6d70bc52', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'f7677742-c278-4285-b20e-d91e6d70bc52', 'title': 'Poker Face', 'length': '195000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'edae55a8-463d-459f-8511-46ea3c0aa87c', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'edae55a8-463d-459f-8511-46ea3c0aa87c', 'title': 'Poker Face', 'length': '196000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'b9d11e7e-7415-4b40-8550-6cfb363439ae', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'b9d11e7e-7415-4b40-8550-6cfb363439ae', 'title': 'Poker Face', 'length': '196000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'fd2f4a84-207c-466d-bbba-18fa1ca0d1f6', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'fd2f4a84-207c-466d-bbba-18fa1ca0d1f6', 'title': 'Poker Face', 'length': '109413'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'fc5774b2-e5e4-44a3-8b43-26f5baadae4d', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'fc5774b2-e5e4-44a3-8b43-26f5baadae4d', 'title': 'Poker Face', 'length': '194120'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'a6a82356-272c-4114-bd6d-b407002ff069', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'a6a82356-272c-4114-bd6d-b407002ff069', 'title': 'Poker Face', 'length': '195000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '0e5a2b99-a21f-4ad5-b3c0-bd086b5b543e', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': '0e5a2b99-a21f-4ad5-b3c0-bd086b5b543e', 'title': 'Poker Face', 'length': '206000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'd61f4526-f302-450a-b669-d014198294a5', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'd61f4526-f302-450a-b669-d014198294a5', 'title': 'Poker Face', 'length': '210000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '5556f48a-4c6b-4dbf-829a-961474b04079', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': '5556f48a-4c6b-4dbf-829a-961474b04079', 'title': 'Poker Face', 'length': '190000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '9f00b471-a2bb-4b74-8aa4-6b37e7e3b903', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': '9f00b471-a2bb-4b74-8aa4-6b37e7e3b903', 'title': 'Poker Face', 'length': '236000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '1e7b7ed7-b421-4d62-8d89-b9134cb3f2c1', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': '1e7b7ed7-b421-4d62-8d89-b9134cb3f2c1', 'title': 'Poker Face', 'length': '195000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '82a74df5-4012-49b6-a5ae-3fc6a83e5cfc', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': '82a74df5-4012-49b6-a5ae-3fc6a83e5cfc', 'title': 'Poker Face', 'length': '190000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '2578115d-f195-42d1-8e39-ac1a222227ad', 'direction': 'backward', 'attribute-list': ['cover', 'instrumental'], 'recording': {'id': '2578115d-f195-42d1-8e39-ac1a222227ad', 'title': 'Poker Face', 'length': '196000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}, {'type-id': 'c031ed4f-c9bb-4394-8cf5-e8ce4db512ae', 'attribute': 'instrumental'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '50a5b075-0085-407f-b5b8-0d5945f49c9b', 'direction': 'backward', 'attribute-list': ['cover', 'live'], 'recording': {'id': '50a5b075-0085-407f-b5b8-0d5945f49c9b', 'title': 'Poker Face', 'length': '165000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}, {'type-id': '70007db6-a8bc-46d7-a770-80e6a0bb551a', 'attribute': 'live'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '9f01c23e-aa4d-48c7-afcc-546cad46af78', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': '9f01c23e-aa4d-48c7-afcc-546cad46af78', 'title': 'Poker Face', 'length': '199758'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '18ba1ca8-8ec6-448a-971c-673f4572b1c1', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': '18ba1ca8-8ec6-448a-971c-673f4572b1c1', 'title': 'Poker Face'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '7e2fa731-a8fc-4b4e-a9ea-01bb9ef682ed', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': '7e2fa731-a8fc-4b4e-a9ea-01bb9ef682ed', 'title': 'Poker Face'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'a23a7b9a-e392-4faf-b7af-a1909b229e35', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'a23a7b9a-e392-4faf-b7af-a1909b229e35', 'title': 'Poker Face', 'length': '213000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '6d02a953-f1b9-43fb-9bbe-bf3f8c815757', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': '6d02a953-f1b9-43fb-9bbe-bf3f8c815757', 'title': 'Poker Face', 'length': '254653'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'c50bb732-29fe-4bc3-8872-540c7708e88a', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'c50bb732-29fe-4bc3-8872-540c7708e88a', 'title': 'Poker Face', 'length': '143000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '8b84bd89-de81-43d1-a165-fe2ffaf36900', 'direction': 'backward', 'attribute-list': ['cover', 'live'], 'recording': {'id': '8b84bd89-de81-43d1-a165-fe2ffaf36900', 'title': 'Poker Face', 'length': '213773', 'disambiguation': 'live: Dermot O’Leary’s Saturday Sessions'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}, {'type-id': '70007db6-a8bc-46d7-a770-80e6a0bb551a', 'attribute': 'live'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '3a0de943-d5fa-4588-aaf3-cb69b3f3ba41', 'direction': 'backward', 'attribute-list': ['cover', 'live'], 'recording': {'id': '3a0de943-d5fa-4588-aaf3-cb69b3f3ba41', 'title': 'Poker Face', 'length': '126626', 'disambiguation': 'live, 2018-10-13: L’Olympia, Paris, France'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}, {'type-id': '70007db6-a8bc-46d7-a770-80e6a0bb551a', 'attribute': 'live'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'c82c3989-2ad3-4eb8-b013-8279e3927e4e', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'c82c3989-2ad3-4eb8-b013-8279e3927e4e', 'title': 'Poker Face', 'length': '209000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'fb8e4152-9e19-4c8f-a07a-6268aa2aa617', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'fb8e4152-9e19-4c8f-a07a-6268aa2aa617', 'title': 'Poker Face', 'length': '226000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'd9dbef28-35ee-479a-8acf-d3d8624105a2', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'd9dbef28-35ee-479a-8acf-d3d8624105a2', 'title': 'Poker Face', 'length': '229346'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'a0d0078e-6a3f-4904-b19f-5e2547d43413', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'a0d0078e-6a3f-4904-b19f-5e2547d43413', 'title': 'Poker Face', 'length': '181000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '1c7c744a-7b7d-4cca-8abb-0b3cc801a97e', 'direction': 'backward', 'recording': {'id': '1c7c744a-7b7d-4cca-8abb-0b3cc801a97e', 'title': 'Poker Face', 'length': '229320'}}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'd4c727f6-76c5-4145-aba7-2542a79bb637', 'direction': 'backward', 'recording': {'id': 'd4c727f6-76c5-4145-aba7-2542a79bb637', 'title': 'Poker Face', 'length': '219000', 'video': 'true'}}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '35618652-47d7-495d-806a-ee1b88eeb776', 'direction': 'backward', 'attribute-list': ['live'], 'recording': {'id': '35618652-47d7-495d-806a-ee1b88eeb776', 'title': 'Poker Face', 'length': '219000', 'disambiguation': 'live at Madison Square Garden', 'video': 'true'}, 'attributes': [{'type-id': '70007db6-a8bc-46d7-a770-80e6a0bb551a', 'attribute': 'live'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'd3de65f7-dd13-4a92-9a21-c66e5cde3e58', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'd3de65f7-dd13-4a92-9a21-c66e5cde3e58', 'title': 'Poker Face', 'length': '201500'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '16728e21-ab7a-402a-96c2-34e9c9eabc5e', 'direction': 'backward', 'attribute-list': ['cover', 'instrumental'], 'recording': {'id': '16728e21-ab7a-402a-96c2-34e9c9eabc5e', 'title': 'Poker Face', 'length': '241513'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}, {'type-id': 'c031ed4f-c9bb-4394-8cf5-e8ce4db512ae', 'attribute': 'instrumental'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '9830a208-a262-4903-a8ca-53296640fef0', 'direction': 'backward', 'recording': {'id': '9830a208-a262-4903-a8ca-53296640fef0', 'title': 'Poker Face', 'length': '260820'}}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'f1c3abeb-0748-4517-a706-f9b57bba853a', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'f1c3abeb-0748-4517-a706-f9b57bba853a', 'title': 'Poker Face', 'length': '229000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '98df0733-8deb-4bb7-8409-b391b3fe540b', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': '98df0733-8deb-4bb7-8409-b391b3fe540b', 'title': 'Poker Face', 'length': '200118'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '92c1ac16-84bf-496c-aaf1-98b4098f1f68', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': '92c1ac16-84bf-496c-aaf1-98b4098f1f68', 'title': 'Poker Face', 'length': '229479'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '647127ff-335d-4dbc-ae73-236832c0c549', 'direction': 'backward', 'attribute-list': ['cover', 'instrumental'], 'recording': {'id': '647127ff-335d-4dbc-ae73-236832c0c549', 'title': 'Poker Face', 'length': '192000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}, {'type-id': 'c031ed4f-c9bb-4394-8cf5-e8ce4db512ae', 'attribute': 'instrumental'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '051ea4df-92cf-433b-93f6-1f873e7e57e7', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': '051ea4df-92cf-433b-93f6-1f873e7e57e7', 'title': 'Poker Face', 'length': '239000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '01fbfb3f-5deb-455e-8d3f-51f7dc291739', 'direction': 'backward', 'attribute-list': ['live'], 'recording': {'id': '01fbfb3f-5deb-455e-8d3f-51f7dc291739', 'title': 'Poker Face', 'disambiguation': 'V Festival Girls: England 2009', 'video': 'true'}, 'attributes': [{'type-id': '70007db6-a8bc-46d7-a770-80e6a0bb551a', 'attribute': 'live'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'd5dab08a-e578-4ce7-8802-3f4bd795bd5d', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'd5dab08a-e578-4ce7-8802-3f4bd795bd5d', 'title': 'Poker Face', 'length': '234573'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'ce3a5a96-e755-4742-9f20-2578600daa4c', 'direction': 'backward', 'recording': {'id': 'ce3a5a96-e755-4742-9f20-2578600daa4c', 'title': 'Poker Face', 'length': '237640'}}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'aa39420c-a848-4a8c-8577-ba49c88328e4', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'aa39420c-a848-4a8c-8577-ba49c88328e4', 'title': 'Poker Face', 'length': '153000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '7e20b226-1d3e-4e20-850c-fe8c7a78b665', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': '7e20b226-1d3e-4e20-850c-fe8c7a78b665', 'title': 'Poker Face', 'length': '205000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'cdb0a73f-9488-4eac-9f2c-c4f545afc80f', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'cdb0a73f-9488-4eac-9f2c-c4f545afc80f', 'title': 'Poker Face (A.R. remix)', 'length': '297000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'acf9b48d-f957-42db-92fc-c394b7b21516', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'acf9b48d-f957-42db-92fc-c394b7b21516', 'title': 'Poker Face (club mix)', 'disambiguation': 'part of “Bump 24” DJ‐mix'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'f4d3a530-ab46-4048-8b92-0571a8103b2b', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'f4d3a530-ab46-4048-8b92-0571a8103b2b', 'title': 'Poker Face (Club Mix)', 'length': '325000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'ffc98ea6-e33d-423b-9c61-80df0aace885', 'direction': 'backward', 'recording': {'id': 'ffc98ea6-e33d-423b-9c61-80df0aace885', 'title': 'Poker Face (Dave Aude dub remix)', 'length': '448000'}}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '076d8b92-54c8-4c65-9580-b217b22fa13a', 'direction': 'backward', 'recording': {'id': '076d8b92-54c8-4c65-9580-b217b22fa13a', 'title': 'Poker Face (Dave Audé mix)', 'length': '439000', 'disambiguation': 'part of “Ultra Dance 11” DJ‐mix'}}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'c6dd7a4a-30a7-4add-bd57-20fd969ec4a5', 'direction': 'backward', 'recording': {'id': 'c6dd7a4a-30a7-4add-bd57-20fd969ec4a5', 'title': 'Poker Face (Dave Aude radio remix)', 'length': '231000'}}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '786350a9-c7e3-4f8c-8529-7cf6d2a997fe', 'direction': 'backward', 'recording': {'id': '786350a9-c7e3-4f8c-8529-7cf6d2a997fe', 'title': 'Poker Face (Dave Audé remix)', 'length': '333000', 'disambiguation': 'part of a “Kontor: Top of the Clubs, Volume 43” DJ‐mix'}}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '333c2c32-2600-4afd-92f3-dace5b8209e6', 'direction': 'backward', 'recording': {'id': '333c2c32-2600-4afd-92f3-dace5b8209e6', 'title': 'Poker Face (Dave Audé remix)', 'length': '393760'}}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '7ad83002-d113-4658-a46e-b2c6bd44c627', 'direction': 'backward', 'recording': {'id': '7ad83002-d113-4658-a46e-b2c6bd44c627', 'title': 'Poker Face (Dave Audé remix)', 'length': '493000'}}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'd2832e72-6b2f-4998-9371-2b206d9176a9', 'direction': 'backward', 'recording': {'id': 'd2832e72-6b2f-4998-9371-2b206d9176a9', 'title': 'Poker Face (DJ’s From Mars remix)', 'length': '303000'}}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '51705b03-1cbc-40bf-94cb-7cf66fd75f7c', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': '51705b03-1cbc-40bf-94cb-7cf66fd75f7c', 'title': 'Poker Face (Elektrik Edit)', 'length': '216000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'e8aa8e6a-8566-4d2b-9912-6f4ba7eec637', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'e8aa8e6a-8566-4d2b-9912-6f4ba7eec637', 'title': 'Poker Face (Elektrik Mix)', 'length': '326000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'cfbd376f-ea9d-4e72-aeff-5392e11094d2', 'direction': 'backward', 'recording': {'id': 'cfbd376f-ea9d-4e72-aeff-5392e11094d2', 'title': 'Poker Face (Glam as You club mix by Guéna LG)', 'length': '472000'}}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '165b7536-ba5a-4f84-a276-c6a61ff5f318', 'direction': 'backward', 'recording': {'id': '165b7536-ba5a-4f84-a276-c6a61ff5f318', 'title': 'Poker Face (Glam as You mix)', 'length': '231813'}}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '5c97ca6b-ae08-426a-a6cb-961e290a94e8', 'direction': 'backward', 'recording': {'id': '5c97ca6b-ae08-426a-a6cb-961e290a94e8', 'title': 'Poker Face (Glam as You radio mix)', 'length': '228280'}}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'ef7df7c3-d6f6-4268-809b-d8ca40bfe7cb', 'direction': 'backward', 'attribute-list': ['instrumental'], 'recording': {'id': 'ef7df7c3-d6f6-4268-809b-d8ca40bfe7cb', 'title': 'Poker Face (instrumental)', 'length': '234893'}, 'attributes': [{'type-id': 'c031ed4f-c9bb-4394-8cf5-e8ce4db512ae', 'attribute': 'instrumental'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '4ed3cd31-2279-434e-9a7e-e212e4e3ee5e', 'direction': 'backward', 'recording': {'id': '4ed3cd31-2279-434e-9a7e-e212e4e3ee5e', 'title': 'Poker Face (Jody den Broeder club remix)', 'length': '485000'}}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '8dbcc1af-7bf1-49c3-a426-4c3a70cee91c', 'direction': 'backward', 'recording': {'id': '8dbcc1af-7bf1-49c3-a426-4c3a70cee91c', 'title': 'Poker Face (Jody den Broeder edit)', 'length': '193000'}}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '6ff9e2a4-04a4-467e-8900-fa35f839c392', 'direction': 'backward', 'recording': {'id': '6ff9e2a4-04a4-467e-8900-fa35f839c392', 'title': 'Poker Face (Jody den Broeder radio edit)', 'length': '261720'}}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'b0d7dae8-9da4-4894-821e-626455bb2775', 'direction': 'backward', 'recording': {'id': 'b0d7dae8-9da4-4894-821e-626455bb2775', 'title': 'Poker Face (Jody den Broeder remix)', 'length': '296000', 'disambiguation': 'part of compilation "ThriveMix Presents Dance Nation"'}}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'fa3848d4-ee7a-4852-b0c8-2cae92b6e7c8', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'fa3848d4-ee7a-4852-b0c8-2cae92b6e7c8', 'title': 'Poker Face (Kindervater remix edit)', 'length': '184000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '4917dca0-a07e-4a08-804a-d9648a15cd19', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': '4917dca0-a07e-4a08-804a-d9648a15cd19', 'title': 'Poker Face (Kindervater Remix Edit)', 'length': '184000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'c1ceddcf-3674-4368-b79e-c3490fd61730', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'c1ceddcf-3674-4368-b79e-c3490fd61730', 'title': 'Poker Face (Kindervater Remix)', 'length': '284000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '8ab44e25-7b0e-4543-b8ea-e4e5c0574f17', 'direction': 'backward', 'attribute-list': ['live'], 'recording': {'id': '8ab44e25-7b0e-4543-b8ea-e4e5c0574f17', 'title': 'Poker Face (live at The Cherrytree House piano & voice version)', 'length': '218960'}, 'attributes': [{'type-id': '70007db6-a8bc-46d7-a770-80e6a0bb551a', 'attribute': 'live'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'a507eef2-250b-4b35-9deb-265b675d3cc5', 'direction': 'backward', 'recording': {'id': 'a507eef2-250b-4b35-9deb-265b675d3cc5', 'title': 'Poker Face (LLG vs. GLG club mix)', 'length': '391000'}}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '58d44e9d-f036-4ca1-b559-ff22442fd374', 'direction': 'backward', 'recording': {'id': '58d44e9d-f036-4ca1-b559-ff22442fd374', 'title': 'Poker Face (LLG vs. GLG radio mix)', 'length': '243026'}}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '53ef6400-c506-49b9-8ff0-60954b2a9755', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': '53ef6400-c506-49b9-8ff0-60954b2a9755', 'title': 'Poker Face (radio edit)', 'length': '195000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'b7c01133-b99b-4255-a6cd-0fbadeffe5ee', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'b7c01133-b99b-4255-a6cd-0fbadeffe5ee', 'title': 'Poker Face (radio edit)', 'length': '196000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'cf225771-df74-4ad0-bb7e-73735dc5b21d', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'cf225771-df74-4ad0-bb7e-73735dc5b21d', 'title': 'Poker Face (radio edit)', 'length': '193000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'd6378491-e2e0-4acd-acf0-91c0ba9139fd', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'd6378491-e2e0-4acd-acf0-91c0ba9139fd', 'title': 'Poker Face (Radio Edit)', 'length': '194000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '34ed65be-26ca-417d-8e57-b2096ff4d57f', 'direction': 'backward', 'recording': {'id': '34ed65be-26ca-417d-8e57-b2096ff4d57f', 'title': 'Poker Face (Space Cowboy remix)', 'length': '294906'}}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '5d1c50b1-507b-498d-b309-e8e5a9d086fe', 'direction': 'backward', 'recording': {'id': '5d1c50b1-507b-498d-b309-e8e5a9d086fe', 'title': 'Poker Face (Space Cowboys mix)', 'length': '141493'}}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'e2ba87cd-82b2-4975-a12a-8fd54b6a1288', 'direction': 'backward', 'recording': {'id': 'e2ba87cd-82b2-4975-a12a-8fd54b6a1288', 'title': 'Poker Face (Tommy Sparks & The Fury remix)', 'length': '238613'}}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'cc9b2db7-2c32-4777-ba24-69f91569d12a', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'cc9b2db7-2c32-4777-ba24-69f91569d12a', 'title': 'Poker Face (Walker & Daniels Remix Edit)', 'length': '210000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'ddb00cfc-c16d-4546-bcdc-e4b03a805ef6', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'ddb00cfc-c16d-4546-bcdc-e4b03a805ef6', 'title': 'Poker Face (Walker & Daniels remix)', 'length': '325000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'b850a2f3-07e6-4004-85ec-ee8093b531c8', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'b850a2f3-07e6-4004-85ec-ee8093b531c8', 'title': 'Poker Face (Walker & Daniels remix)', 'length': '225586', 'disambiguation': 'part of “Tunnel Trance Force, Volume 49” DJ-mix'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'f5d2c3fa-39ea-4926-a828-2197fa6e393f', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'f5d2c3fa-39ea-4926-a828-2197fa6e393f', 'title': 'Poker Face (Walker & Daniels Remix)', 'length': '323000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'b8692f53-fa70-4a5d-9faa-326f217da0d5', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'b8692f53-fa70-4a5d-9faa-326f217da0d5', 'title': 'Poker Face [Lady Gaga]', 'length': '192000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '9dba5dac-84da-4165-9532-fd5ad0cdf996', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': '9dba5dac-84da-4165-9532-fd5ad0cdf996', 'title': 'Pokerface', 'length': '191000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '0a174127-a27f-4372-b13c-dc24943a90a0', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': '0a174127-a27f-4372-b13c-dc24943a90a0', 'title': 'Pokerface', 'length': '255000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '56ca63eb-bc85-494b-88e2-cc8a2b505387', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': '56ca63eb-bc85-494b-88e2-cc8a2b505387', 'title': 'Pokerface', 'length': '172000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'bcc498b1-dacd-4444-89e5-c706165d8e1f', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': 'bcc498b1-dacd-4444-89e5-c706165d8e1f', 'title': 'Pokerface', 'length': '225000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'da23efb2-6142-4467-a301-a6203b552866', 'direction': 'backward', 'recording': {'id': 'da23efb2-6142-4467-a301-a6203b552866', 'title': 'Pokerface (DJ Gigi Smart Special av8 blend)', 'length': '205000'}}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '2faf243f-ef0f-4a25-9bb7-c539121eaa7c', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': '2faf243f-ef0f-4a25-9bb7-c539121eaa7c', 'title': 'Polka Face', 'length': '258000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': '5de41ce3-a3bc-43ab-8827-3ef146141b79', 'direction': 'backward', 'attribute-list': ['cover'], 'recording': {'id': '5de41ce3-a3bc-43ab-8827-3ef146141b79', 'title': "Somebody's Watching My Poker Face", 'length': '257000'}, 'attributes': [{'type-id': '1e8536bd-6eda-3822-8e78-1c0f4d3d2113', 'attribute': 'cover'}]}, {'type': 'performance', 'type-id': 'a3005666-a872-32c3-ad06-98af558e99b0', 'target': 'c13fbfad-76ec-4362-b2f7-948ba3f04901', 'direction': 'backward', 'recording': {'id': 'c13fbfad-76ec-4362-b2f7-948ba3f04901', 'title': 'Stand Up To My Pokerface (Blend Brothers mix)', 'length': '379000'}}]}

If I am understanding the structure correctly, you could filter out the covers or whatever, and then each one has the 'start', 'end' and under 'recording' is the title, which you could match with the current title to make sure it is the same.

I would like to know your thoughts on this approach. Did you consider it, and it did not give accurate results? Or might it speed things up by using less requests to MB?

Great plugin by the way.

@phirestalker
Copy link
Author

I spent a little more time looking through that mass of data and found a lot of the items were missing the 'begin' and 'end' keys. Also, some of the dates are way off. I saw a 1925 in there for the 'begin' and 'end' on one of the recordings. Seems your method is by far the best. I just wish that it allowed you fetch the whole recording for each of the items in the recording-relation-list when you grab the work. Oh well. Thanks again.

@kernitus
Copy link
Owner

Yes, unfortunately there is a lot of incomplete data and fetching all of the releases is the only way to guarantee good accuracy. The problem is that each one is a separate request, which makes it very slow. If Musicbrainz implemented something like GraphQL, the amount of requests could be reduced significantly, but for now a good workaround is to run your own mirror.

@kernitus
Copy link
Owner

@phirestalker I have made a fair few changes to close all open issues. If you'd like to test them, you can let me know if the plugin still works as intended and the changes too.

Regarding this issue, I thought of a different, more heuristic approach. It is theoretically possible to perform a search for releases, with a specific artist ID and the title of the track. Such a search can return up to 100 matches, including the date fields for the release. This can be used to get this information in one request, see example below.

https://musicbrainz.org/ws/2/release/?query=arid:83d91898-7763-47d7-b03b-b92132375c47%20AND%20release:%22wish%20you%20were%20here%22&limit=100&fmt=json

However, it's possible for the search to return unrelated items, which would somehow have to be detected and removed. It also remains to see if the artist id on various releases is correctly set, for it might work properly for well-known artists, but might not be accurate enough for more obscure ones. Still, it seems worth investigating.

@kernitus kernitus reopened this Oct 29, 2023
@phirestalker
Copy link
Author

phirestalker commented Oct 30, 2023

That sounds interesting, and it should be relatively trivial to filter the unrelated ones. Another interesting thing I found while rebuilding my local musicbrainz server

Building release_first_release_date

To me, that sounds like a material table that has the exact data we want. I wonder if they make it available to the API easily somehow?

EDIT:
Oh, and they also have a recording_first_release_date table. These tables are built with SQL commands and are denormalized to speed up certain searches. Imagine if we could just run SQL commands, that would take just one query I bet. Anyway, some interesting things to consider indeed.

@kernitus
Copy link
Owner

kernitus commented Oct 30, 2023

The problem with filtering the search is with slightly different versions of the same song. For example, the matched recording you picked has Remix/Edit/Remaster in the title, and thus the original version will not show up in the search, although these words could be easily filtered out.

A different problem occurs when the title is slightly different because it's two songs in one, or it includes ft. Artist. This can also be filtered out, although less easily. The search feature supports Lucene queries meaning fuzzy / regex / proximity searches are supported.

Regarding the release_first_release_date and recording_first_release_date fields, these seem to be accessible through the search api, e.g. firstreleasedate on Recording, and Release Group. However, I don't know if this field is maintained by the database or user-edited, and whether it actually corresponds to the oldest possible date or not.

For example, you perform a search for recordings with a specific artist ID that match a specific release/recording title, and look for the first-release-date field for each and find the oldest:

import requests
from datetime import datetime
from urllib.parse import quote_plus

artist_id = "83d91898-7763-47d7-b03b-b92132375c47"
release_title = "wish you were here"

url = f"https://musicbrainz.org/ws/2/recording/?query=arid:{quote_plus(artist_id)}%20AND%20recording:%22{quote_plus(release_title)}%22&limit=100&fmt=json"

response = requests.get(url)
data = response.json()

oldest_date = datetime.max

for recording in data['recordings']:
    # Check if 'first-release-date' is in the recording data
    if 'first-release-date' in recording:
        for format in ["%Y-%m-%d", "%Y-%m", "%Y"]:
            try:
                release_date = datetime.strptime(recording['first-release-date'], format)
                if release_date < oldest_date:
                    oldest_date = release_date
                break
            except ValueError:
                pass

print(f"The oldest release date is: {oldest_date.strftime('%Y-%m-%d')}")

The oldest release date is: 1981-11-23

@phirestalker
Copy link
Author

It may take me a couple of days, but I will incorporate this into a function and run it alongside your releases method. Then compare the date returned for the oldest date. I will try to get some metrics on when they match and print a list of the ones that don't match so we can analyze those cases. I may attempt to contact metabrainz and ask them how this table is generated, with user entries or from data already in the database using a query similar to how you do it now.

I guess I will need to save some data for the ones that don't match so we know if it is using the wrong recordings like you mentioned.

@phirestalker
Copy link
Author

Quick question. Your code uses a search function to get the first-release-date field. Does that mean it is not returned when using get_recording_by_id in musicbrainzngs? If so I wonder if that is a failing of the library or if musicbrainz does not offer it through those queries.

@kernitus
Copy link
Owner

kernitus commented Nov 1, 2023

I now notice that first-release-date seems to be included when fetching a recording - at least directly through the API:

https://musicbrainz.org/ws/2/recording/8f3471b5-7e6a-48da-86a9-c1c07a0f47ae?fmt=json

However, this doesn't solve the fundamental problem of needing to fetch every single recording (or enough of them) to get the real original date for a song.

Besides, it isn't included with all recordings, because sometimes the releases do not have a date associated with them:

https://musicbrainz.org/ws/2/recording/aae44009-6745-40ae-a477-f215c4f76488?fmt=json

It appears musicbrainzngs does not return this field:

https://github.com/alastair/python-musicbrainzngs/blob/1638c6271e0beb9560243c2123d354461ec9f842/musicbrainzngs/musicbrainz.py#L137

@phirestalker
Copy link
Author

phirestalker commented Nov 2, 2023

I guess we can't use that until musicbrainzngs adds it. I noticed that recordings that have first-release-date have no other date field. I wonder if they are working to clean up the data so that the album has a release date and each track has a first-release-date linked to a work? That would be fantastic.

I think if musicbrainzngs returned it, it might be ok (once we determine its accuracy) to use first-release-date if it exists, and switch to using the user set approach after that, or make it another ooption to approach.

To make theses tests I am creating a new OldestDatePlugin object and setting config options directly. How would I be able o set the mb host and rate limit since those are set at the beets level?

EDIT:
Nevermind, I figured out how to set the mb host and ratelimit.

@phirestalker
Copy link
Author

Man, I started this test on Thursday and it is still running. Because of the way os.walk() works I can't use a progress bar wrapped around it, so I have no idea how long it has taken or how long it has left to run. No big, but I wanted to keep you updated.

@kernitus
Copy link
Owner

kernitus commented Nov 4, 2023

Man, I started this test on Thursday and it is still running. Because of the way os.walk() works I can't use a progress bar wrapped around it, so I have no idea how long it has taken or how long it has left to run. No big, but I wanted to keep you updated.

Which fields are you planning on comparing? The first-release-date on a given recording? Or a search?

@phirestalker
Copy link
Author

I am fetching a certain recording and its first-recording-date. I then use the same MB id to feed to your plugin with the releases approach and save the date it gives. I will show the amonut of recordings missing a first-recording-date, the number of those that found a date with your method. I will also show when the dates differ between methods and which one is older. I'm not sure how much deeper I can go since your function only returns the date and not the recording or release it go tthe date from.

Let me know what other metrics or data you would like.
Come to think of it, I wonder if I should get the genres of the music to see if there is more coverage for certain ones.

@phirestalker
Copy link
Author

Finally!
Here we go.
It looks like there are only 14 recordings missing first-recording-date out of 9312. However, there are 1554 out of 9312 songs where your method has an older date than first-recording-date. Some of these are arbitrary like day 01 instead of 02, but there seems to be enough egregious ones to make it not usable.

Well, that was fun. Let me know if you want me to test the idea you had before I saw first-recording-date.

@kernitus
Copy link
Owner

kernitus commented Nov 7, 2023

Finally! Here we go. It looks like there are only 14 recordings missing first-recording-date out of 9312. However, there are 1554 out of 9312 songs where your method has an older date than first-recording-date. Some of these are arbitrary like day 01 instead of 02, but there seems to be enough egregious ones to make it not usable.

Well, that was fun. Let me know if you want me to test the idea you had before I saw first-recording-date.

Can you elaborate more on what exactly you tested?

Did you just compare getting the first-recording-date or first-release-date for a singular recording at a time?

@phirestalker
Copy link
Author

I took the id from the tags of each song on my computer and used that to query the recording info directly. In that info is the first-recording-date. I saved that and then used the id to call _get_oldest_date and saved the date returned from that. I ddi not test for first-release-date. I am not sure how to do that properly. I guess I would find all the releases of a recording and get the first-release-date for each of them saving the oldest.

I am willing to test many more methods. I can always expand the sqlite database to store more information. I just don't know what else to try out.

@kernitus
Copy link
Owner

I took the id from the tags of each song on my computer and used that to query the recording info directly. In that info is the first-recording-date. I saved that and then used the id to call _get_oldest_date and saved the date returned from that. I ddi not test for first-release-date. I am not sure how to do that properly. I guess I would find all the releases of a recording and get the first-release-date for each of them saving the oldest.

I am willing to test many more methods. I can always expand the sqlite database to store more information. I just don't know what else to try out.

No, first-release-date is available as a field on the recording object, not release. This is because each release has a date and each recording has multiple releases, only one of which can be the oldest. This would be exactly the same as the releases approach the plugin currently follows, because we would still need to fetch every recording.

What is worth investigating however is performing a search with an artist id and the title of the recording (i.e. track name), then getting the list of all first-release-date fields from those recordings, and finding the oldest. This would only require one request, but the results might need to be filtered for e.g. "remaster" etc. If you can adapt the sample code i put above and test its accuracy that would be helpful.

@phirestalker
Copy link
Author

I reversed those. My test does indeed use the first-release-date from the recording and not first-recording-date. I'm not sure how I mixed them up.

I will try to start work on testing the search method you mentioned in a little while. Luckily I won't have to redo getting the date using the plugin method. I might use fuzzywuzzy to match the titles to make it a little easier, and remove matches that contain words like remaster. I will store the title of the matched recording along with the first-release-date. Let me know if that sounds good.

@kernitus
Copy link
Owner

Yes, i reckon there can be list of words like remaster, remix that can be removed from the title, then Lucene search syntax can be used to do a fuzzy search.

@phirestalker
Copy link
Author

Are you saying that I can clean the title of my track first and then trust the search results from MB using that cleaned title?

@phirestalker
Copy link
Author

phirestalker commented Nov 11, 2023

I only removed remix and remaster from my titles before the search. My results are as follows:
using the query select count(id) from recordings where first_release_date is not null and arid_release_date is not null and first_release_date < arid_release_date; I get 259. Then I filtered that by adding the clause title = matched_title and got 177.
So, only 177 were wrong for the exact same title. The others might be corrected by more filtering.

EDIT: forgot some metrics
select count(id) from recordings where arid_release_date is null; 154
select count(id) from recordings where first_release_date is null; 14
select count(id) from recordings where first_release_date is not null and arid_release_date is not null and first_title != matched_title; 1344

@phirestalker
Copy link
Author

I used the wrong field for comparison. The one that stores the date from your plugin is oldest_date. So here are some correct metrics.
select count(id) from recordings where oldest_date is not null and arid_release_date is not null and oldest_date < arid_release_date and first_title = matched_title; 445
select count(id) from recordings where oldest_date is null; 28
select count(id) from recordings where oldest_date is not null and arid_release_date is not null and first_title != matched_title; 1343

@kernitus
Copy link
Owner

I used the wrong field for comparison. The one that stores the date from your plugin is oldest_date. So here are some correct metrics. select count(id) from recordings where oldest_date is not null and arid_release_date is not null and oldest_date < arid_release_date and first_title = matched_title; 445 select count(id) from recordings where oldest_date is null; 28 select count(id) from recordings where oldest_date is not null and arid_release_date is not null and first_title != matched_title; 1343

What exactly are those numbers showing here?

@phirestalker
Copy link
Author

phirestalker commented Nov 14, 2023

445 items where your plug-in has the oldest date there are only 28 times that your plug-in did not find a date. Also, there are 1343 times where the artist ID search method didn't get the exact same title. Let me know what other information you would like.

@kernitus
Copy link
Owner

445 items where your plug-in has the oldest date there are only 28 times that your plug-in did not find a date. Also, there are 1343 times where the artist ID search method didn't get the exact same title. Let me know what other information you would like.

How many times did the search method not find a date as old as the releases method?
Is it just because it's not matching the title properly?

@phirestalker
Copy link
Author

This line select count(id) from recordings where oldest_date is not null and arid_release_date is not null and oldest_date < arid_release_date and first_title = matched_title; 445 means that when the titles are exactly the same, the releases method still beat the search method 445 times. So, it isn't just the title not matching. The releases method is still the most accurate it seems. I wonder why though. You would imagine that they could source the right date to put into that field for us with access to all the same data. If I have some time I will try to contact them and see if they are improving it or if it is not meant for what it sounds like it is.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants