diff --git a/catalog/common/models.py b/catalog/common/models.py index 90381641..83716535 100644 --- a/catalog/common/models.py +++ b/catalog/common/models.py @@ -44,7 +44,7 @@ class IdType(models.TextChoices): ISSN = "issn", _("ISSN") CUBN = "cubn", _("统一书号") ISRC = "isrc", _("ISRC") # only for songs - GTIN = "gtin", _("GTIN UPC EAN码") # ISBN is separate + GTIN = "gtin", _("GTIN UPC EAN码") # GTIN-13, ISBN is separate RSS = "rss", _("RSS Feed URL") IMDB = "imdb", _("IMDb") TMDB_TV = "tmdb_tv", _("TMDB剧集") diff --git a/catalog/music/tests.py b/catalog/music/tests.py index 58837fa1..ef616327 100644 --- a/catalog/music/tests.py +++ b/catalog/music/tests.py @@ -1,6 +1,16 @@ from django.test import TestCase from catalog.common import * from catalog.models import * +from catalog.music.utils import * + + +class BasicMusicTest(TestCase): + def test_gtin(self): + self.assertIsNone(upc_to_gtin_13("018771208112X")) + self.assertIsNone(upc_to_gtin_13("999018771208112")) + self.assertEqual(upc_to_gtin_13("018771208112"), "0018771208112") + self.assertEqual(upc_to_gtin_13("00042281006722"), "0042281006722") + self.assertEqual(upc_to_gtin_13("0042281006722"), "0042281006722") class SpotifyTestCase(TestCase): @@ -60,6 +70,14 @@ class MultiMusicSitesTestCase(TestCase): p2 = SiteManager.get_site_by_url(url2).get_resource_ready() self.assertEqual(p1.item.id, p2.item.id) + @use_local_response + def test_albums_discogs(self): + url1 = "https://www.discogs.com/release/13574140" + url2 = "https://open.spotify.com/album/0I8vpSE1bSmysN2PhmHoQg" + p1 = SiteManager.get_site_by_url(url1).get_resource_ready() + p2 = SiteManager.get_site_by_url(url2).get_resource_ready() + self.assertEqual(p1.item.id, p2.item.id) + class BandcampTestCase(TestCase): def test_parse(self): @@ -98,6 +116,8 @@ class DiscogsReleaseTestCase(TestCase): site = SiteManager.get_site_by_url(t_url) self.assertEqual(site.url, t_url_2) self.assertEqual(site.id_value, t_id_value) + site = SiteManager.get_site_by_url(t_url_2) + self.assertIsNotNone(site) @use_local_response def test_scrape(self): @@ -109,7 +129,7 @@ class DiscogsReleaseTestCase(TestCase): self.assertEqual(site.resource.metadata["title"], "The Never Story") self.assertEqual(site.resource.metadata["artist"], ["J.I.D"]) self.assertIsInstance(site.resource.item, Album) - self.assertEqual(site.resource.item.barcode, "602445804689") + self.assertEqual(site.resource.item.barcode, "0602445804689") class DiscogsMasterTestCase(TestCase): diff --git a/catalog/music/utils.py b/catalog/music/utils.py new file mode 100644 index 00000000..01bc086a --- /dev/null +++ b/catalog/music/utils.py @@ -0,0 +1,20 @@ +import re + + +def upc_to_gtin_13(upc: str): + """ + Convert UPC-A to GTIN-13, return None if validation failed + + may add or remove padding 0s from different source + """ + s = upc.strip() if upc else "" + if not re.match(r"^\d+$", s): + return None + if len(s) < 13: + s = s.zfill(13) + elif len(s) > 13: + if re.match(r"^0+$", s[0 : len(s) - 13]): + s = s[len(s) - 13 :] + else: + return None + return s diff --git a/catalog/sites/discogs.py b/catalog/sites/discogs.py index 51c08adc..95d17661 100644 --- a/catalog/sites/discogs.py +++ b/catalog/sites/discogs.py @@ -4,6 +4,7 @@ Discogs. from django.conf import settings from catalog.common import * from catalog.models import * +from catalog.music.utils import upc_to_gtin_13 from .douban import * import json import logging @@ -17,12 +18,12 @@ _logger = logging.getLogger(__name__) class DiscogsRelease(AbstractSite): SITE_NAME = SiteName.Discogs ID_TYPE = IdType.Discogs_Release - URL_PATTERNS = [r"https://www\.discogs\.com/release/(\d+)-.+"] + URL_PATTERNS = [r"https://www\.discogs\.com/release/(\d+)[^\d]*"] WIKI_PROPERTY_ID = "?" DEFAULT_MODEL = Album @classmethod - def id_to_url(self, id_value): + def id_to_url(cls, id_value): return f"https://www.discogs.com/release/{id_value}" def scrape(self): @@ -31,7 +32,9 @@ class DiscogsRelease(AbstractSite): artist = [artist.get("name") for artist in release.get("artists")] genre = release.get("genres") track_list = [track.get("title") for track in release.get("tracklist")] - company = [company.get("name") for company in release.get("companies")] + company = list( + set([company.get("name") for company in release.get("companies")]) + ) media, disc_count = None, None formats = release.get("formats") @@ -44,7 +47,9 @@ class DiscogsRelease(AbstractSite): if identifiers: for i in identifiers: if i["type"] == "Barcode": - barcode = i["value"].replace(" ", "").replace("-", "") + barcode = upc_to_gtin_13( + i["value"].replace(" ", "").replace("-", "") + ) image_url = None if len(release.get("images")) > 0: image_url = release["images"][0].get("uri") @@ -79,12 +84,12 @@ class DiscogsRelease(AbstractSite): class DiscogsMaster(AbstractSite): SITE_NAME = SiteName.Discogs ID_TYPE = IdType.Discogs_Master - URL_PATTERNS = [r"https://www\.discogs\.com/master/(\d+)-.+"] + URL_PATTERNS = [r"https://www\.discogs\.com/master/(\d+)[^\d]*"] WIKI_PROPERTY_ID = "?" DEFAULT_MODEL = Album @classmethod - def id_to_url(self, id_value): + def id_to_url(cls, id_value): return f"https://www.discogs.com/master/{id_value}" def scrape(self): diff --git a/catalog/sites/douban_music.py b/catalog/sites/douban_music.py index db31a7b0..7ef01f7d 100644 --- a/catalog/sites/douban_music.py +++ b/catalog/sites/douban_music.py @@ -1,5 +1,6 @@ from catalog.common import * from catalog.models import * +from catalog.music.utils import upc_to_gtin_13 from .douban import DoubanDownloader import dateparser import logging @@ -20,7 +21,7 @@ class DoubanMusic(AbstractSite): DEFAULT_MODEL = Album @classmethod - def id_to_url(self, id_value): + def id_to_url(cls, id_value): return "https://music.douban.com/subject/" + id_value + "/" def scrape(self): @@ -114,7 +115,7 @@ class DoubanMusic(AbstractSite): "//div[@id='info']//span[text()='条形码:']/following-sibling::text()[1]" ) if other_elem: - gtin = other_elem[0].strip() + gtin = upc_to_gtin_13(other_elem[0].strip()) other_elem = content.xpath( "//div[@id='info']//span[text()='碟片数:']/following-sibling::text()[1]" ) diff --git a/catalog/sites/spotify.py b/catalog/sites/spotify.py index 5656cc1a..e0aa4f35 100644 --- a/catalog/sites/spotify.py +++ b/catalog/sites/spotify.py @@ -4,6 +4,7 @@ Spotify from django.conf import settings from catalog.common import * from catalog.models import * +from catalog.music.utils import upc_to_gtin_13 from .douban import * import time import datetime @@ -28,11 +29,11 @@ class Spotify(AbstractSite): DEFAULT_MODEL = Album @classmethod - def id_to_url(self, id_value): + def id_to_url(cls, id_value): return f"https://open.spotify.com/album/{id_value}" def scrape(self): - api_url = "https://api.spotify.com/v1/albums/" + self.id_value + api_url = f"https://api.spotify.com/v1/albums/{self.id_value}" headers = {"Authorization": f"Bearer {get_spotify_token()}"} res_data = BasicDownloader(api_url, headers=headers).download().json() artist = [] @@ -70,9 +71,9 @@ class Spotify(AbstractSite): gtin = None if res_data["external_ids"].get("upc"): - gtin = res_data["external_ids"].get("upc") + gtin = upc_to_gtin_13(res_data["external_ids"].get("upc")) if res_data["external_ids"].get("ean"): - gtin = res_data["external_ids"].get("ean") + gtin = upc_to_gtin_13(res_data["external_ids"].get("ean")) isrc = None if res_data["external_ids"].get("isrc"): isrc = res_data["external_ids"].get("isrc") diff --git a/test_data/https___api_discogs_com_releases_13574140 b/test_data/https___api_discogs_com_releases_13574140 new file mode 100644 index 00000000..4dd539b7 --- /dev/null +++ b/test_data/https___api_discogs_com_releases_13574140 @@ -0,0 +1 @@ +{"id": 13574140, "status": "Accepted", "year": 0, "resource_url": "https://api.discogs.com/releases/13574140", "uri": "https://www.discogs.com/release/13574140-Keith-Jarrett-The-K%C3%B6ln-Concert", "artists": [{"name": "Keith Jarrett", "anv": "", "join": "", "role": "", "tracks": "", "id": 145273, "resource_url": "https://api.discogs.com/artists/145273", "thumbnail_url": "https://i.discogs.com/yhocDFtms0V6-Jo4Z2k204T11G488hAAVPLF2MhQtIk/rs:fit/g:sm/q:40/h:709/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9BLTE0NTI3/My0xNjUxMTA3MDUz/LTM3MDIuanBlZw.jpeg"}], "artists_sort": "Keith Jarrett", "labels": [{"name": "ECM Records", "catno": "ECM 1064/65", "entity_type": "1", "entity_type_name": "Label", "id": 6785, "resource_url": "https://api.discogs.com/labels/6785", "thumbnail_url": "https://i.discogs.com/jVjnvBkPNJ-yW9WgmNhgroalvFmH-CTVveBv5mxbxDI/rs:fit/g:sm/q:40/h:585/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9MLTY3ODUt/MTUyMTU3MzQ5NS00/MDIxLmpwZWc.jpeg"}, {"name": "ECM Records", "catno": "810 067-2", "entity_type": "1", "entity_type_name": "Label", "id": 6785, "resource_url": "https://api.discogs.com/labels/6785", "thumbnail_url": "https://i.discogs.com/jVjnvBkPNJ-yW9WgmNhgroalvFmH-CTVveBv5mxbxDI/rs:fit/g:sm/q:40/h:585/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9MLTY3ODUt/MTUyMTU3MzQ5NS00/MDIxLmpwZWc.jpeg"}], "series": [], "companies": [{"name": "ECM Records GmbH", "catno": "", "entity_type": "13", "entity_type_name": "Phonographic Copyright (p)", "id": 33313, "resource_url": "https://api.discogs.com/labels/33313", "thumbnail_url": "https://i.discogs.com/Yl_w_lJx5nL-AgVExIsqjnR7AC1TIdmxyquPcnGKAcA/rs:fit/g:sm/q:40/h:114/w:171/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9MLTMzMzEz/LTEzMTUxNDQwMzEu/cG5n.jpeg"}, {"name": "ECM Records GmbH", "catno": "", "entity_type": "14", "entity_type_name": "Copyright (c)", "id": 33313, "resource_url": "https://api.discogs.com/labels/33313", "thumbnail_url": "https://i.discogs.com/Yl_w_lJx5nL-AgVExIsqjnR7AC1TIdmxyquPcnGKAcA/rs:fit/g:sm/q:40/h:114/w:171/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9MLTMzMzEz/LTEzMTUxNDQwMzEu/cG5n.jpeg"}, {"name": "Cavelight Music", "catno": "", "entity_type": "21", "entity_type_name": "Published By", "id": 281563, "resource_url": "https://api.discogs.com/labels/281563", "thumbnail_url": ""}, {"name": "Oper K\u00f6ln", "catno": "", "entity_type": "23", "entity_type_name": "Recorded At", "id": 486641, "resource_url": "https://api.discogs.com/labels/486641", "thumbnail_url": "https://i.discogs.com/87DqBoCiBYdQ4ogf-Fge7ruGONuY87wAklPxk2taeA4/rs:fit/g:sm/q:40/h:500/w:500/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9MLTQ4NjY0/MS0xMzU3MTQ3MDIx/LTYzNTYuanBlZw.jpeg"}, {"name": "Arvato", "catno": "52863281", "entity_type": "31", "entity_type_name": "Glass Mastered At", "id": 504648, "resource_url": "https://api.discogs.com/labels/504648", "thumbnail_url": "https://i.discogs.com/6U9B5HYqTgtbhpHpWEPEn2fuwS9EjZ_ZGUXioPxXn0E/rs:fit/g:sm/q:40/h:169/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9MLTUwNDY0/OC0xNTUyNTY5NTc4/LTg5NjkucG5n.jpeg"}], "formats": [{"name": "CD", "qty": "1", "text": "Arvato", "descriptions": ["Album", "Reissue"]}], "data_quality": "Needs Vote", "community": {"have": 367, "want": 71, "rating": {"count": 19, "average": 4.58}, "submitter": {"username": "softcorrea", "resource_url": "https://api.discogs.com/users/softcorrea"}, "contributors": [{"username": "softcorrea", "resource_url": "https://api.discogs.com/users/softcorrea"}, {"username": "thorenj", "resource_url": "https://api.discogs.com/users/thorenj"}, {"username": "lamorgue", "resource_url": "https://api.discogs.com/users/lamorgue"}, {"username": "florette69", "resource_url": "https://api.discogs.com/users/florette69"}], "data_quality": "Needs Vote", "status": "Accepted"}, "format_quantity": 1, "date_added": "2019-05-02T01:29:13-07:00", "date_changed": "2021-06-26T01:50:58-07:00", "num_for_sale": 20, "lowest_price": 3.0, "master_id": 26241, "master_url": "https://api.discogs.com/masters/26241", "title": "The K\u00f6ln Concert", "country": "Germany", "notes": "Published by Cavelight Music BMI/AMRA\n\nRecorded live at the opera in K\u00f6ln, Germany\nJanuary 24, 1975\n\nAn ECM Production\n\n\u21171975 ECM Records GmbH\n\u00a91975 ECM Records GmbH\nwww.ecmrecords.com [66:10]\n\nAlso available on LP & MC", "identifiers": [{"type": "Barcode", "value": "0 42281 00672 2", "description": "Text"}, {"type": "Barcode", "value": "042281006722", "description": "Scanned"}, {"type": "Matrix / Runout", "value": "arvato 528663281/00042281006722 22 [4x Universal logo]"}, {"type": "Mastering SID Code", "value": "IFPI LB45"}, {"type": "Mould SID Code", "value": "IFPI 073Y"}, {"type": "Label Code", "value": "LC 02516"}, {"type": "Rights Society", "value": "GEMA"}, {"type": "Price Code", "value": "PG 900"}, {"type": "SPARS Code", "value": "AAD"}], "videos": [{"uri": "https://www.youtube.com/watch?v=T_IW1wLZhzE", "title": "Keith Jarrett - THE K\u00d6LN CONCERT - complete, Tomasz Trzcinski - piano", "description": "Interpretation by Tomasz Trzci\u0144ski | ((( Spotify ))) https://open.spotify.com/user/1142024168/playlist/1Yleg1iCJwnCHYjeTjInsP?si=psznc7FSS86Xz_G9n4SeCQ\n\nPart I [0:05 - 28:15] Part IIa [28:15 - 43:35] Part IIb [43:35 - 1:04:35] Part IIc [1:04:45 - 1:11:11", "duration": 4271, "embed": true}, {"uri": "https://www.youtube.com/watch?v=MrlWkchbm4U", "title": "Episode 250: Keith Jarrett - The K\u00f6ln Concert", "description": "Story and review of Keith Jarrett's blockbuster record from 1975, the second release in his series of remarkable solo improvised concerts, forged out of significant adversity and a recording which reverberated far beyond the world of jazz. 5 out of 5 star", "duration": 0, "embed": true}, {"uri": "https://www.youtube.com/watch?v=Hfe3hsLpmfs", "title": "Keith Jarrett - 1975 - Treasure Island (piano solo live)", "description": "Encore Treasure Island, solo piano live in Bremen, 1975-02-02.", "duration": 661, "embed": true}], "genres": ["Jazz"], "styles": ["Free Improvisation"], "tracklist": [{"position": "1", "type_": "track", "title": "K\u00f6ln, January 24, 1975 Part I", "duration": "26:02"}, {"position": "2", "type_": "track", "title": "K\u00f6ln, January 24, 1975 Part II A", "duration": "14:54"}, {"position": "3", "type_": "track", "title": "K\u00f6ln, January 24, 1975 Part II B", "duration": "18:13"}, {"position": "4", "type_": "track", "title": "K\u00f6ln, January 24, 1975 Part II C", "duration": "6:59"}], "extraartists": [{"name": "B & B Wojirsch", "anv": "", "join": "", "role": "Design [Cover]", "tracks": "", "id": 1838299, "resource_url": "https://api.discogs.com/artists/1838299", "thumbnail_url": ""}, {"name": "Martin Wieland", "anv": "", "join": "", "role": "Engineer", "tracks": "", "id": 331054, "resource_url": "https://api.discogs.com/artists/331054", "thumbnail_url": "https://i.discogs.com/32MvB8_OsNsP5F3z2syXYquWvON5qqbaX9PUCOG7gGY/rs:fit/g:sm/q:40/h:450/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9BLTMzMTA1/NC0xNjEzMjM0NTU4/LTc3NDUuanBlZw.jpeg"}, {"name": "Wolfgang Frankenstein", "anv": "", "join": "", "role": "Photography By", "tracks": "", "id": 2332986, "resource_url": "https://api.discogs.com/artists/2332986", "thumbnail_url": ""}, {"name": "Keith Jarrett", "anv": "", "join": "", "role": "Piano, Composed By", "tracks": "", "id": 145273, "resource_url": "https://api.discogs.com/artists/145273", "thumbnail_url": "https://i.discogs.com/yhocDFtms0V6-Jo4Z2k204T11G488hAAVPLF2MhQtIk/rs:fit/g:sm/q:40/h:709/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9BLTE0NTI3/My0xNjUxMTA3MDUz/LTM3MDIuanBlZw.jpeg"}, {"name": "Manfred Eicher", "anv": "", "join": "", "role": "Producer", "tracks": "", "id": 247567, "resource_url": "https://api.discogs.com/artists/247567", "thumbnail_url": "https://i.discogs.com/NRONsMLAxciy7muj4LarWtTcyDh_UulNVw5TyZmbMb8/rs:fit/g:sm/q:40/h:506/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9BLTI0NzU2/Ny0xMzQ1NDU1Mzk1/LTczMTkuanBlZw.jpeg"}], "images": [{"type": "primary", "uri": "https://i.discogs.com/n1XZn_PtM9POxEYxyLjXDyP5OeV5qSBgvGprQfeDeAM/rs:fit/g:sm/q:90/h:597/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1NTY3OTQz/MDAtODU4NS5wbmc.jpeg", "resource_url": "https://i.discogs.com/n1XZn_PtM9POxEYxyLjXDyP5OeV5qSBgvGprQfeDeAM/rs:fit/g:sm/q:90/h:597/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1NTY3OTQz/MDAtODU4NS5wbmc.jpeg", "uri150": "https://i.discogs.com/KO0LsGqRrcQ0PTD50cjM886Of-N9GnsWGf3GNOiaQmM/rs:fit/g:sm/q:40/h:150/w:150/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1NTY3OTQz/MDAtODU4NS5wbmc.jpeg", "width": 600, "height": 597}, {"type": "secondary", "uri": "https://i.discogs.com/2YHpLZFOcl1tFJc41koxTIQocPPOk-BYQBEtD4SKnZk/rs:fit/g:sm/q:90/h:476/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1NTY3OTQz/MDEtMjg1Ny5wbmc.jpeg", "resource_url": "https://i.discogs.com/2YHpLZFOcl1tFJc41koxTIQocPPOk-BYQBEtD4SKnZk/rs:fit/g:sm/q:90/h:476/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1NTY3OTQz/MDEtMjg1Ny5wbmc.jpeg", "uri150": "https://i.discogs.com/jKyQrmRgTrdev2WYjANmjdGd6931pbn_lYdDtFUtqvY/rs:fit/g:sm/q:40/h:150/w:150/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1NTY3OTQz/MDEtMjg1Ny5wbmc.jpeg", "width": 600, "height": 476}, {"type": "secondary", "uri": "https://i.discogs.com/nZG5NGhuGF7mGGfzCkwKQo-ZlzxylZpd2s9hpoj25hQ/rs:fit/g:sm/q:90/h:200/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1NTY3OTQz/MDEtMzM2My5wbmc.jpeg", "resource_url": "https://i.discogs.com/nZG5NGhuGF7mGGfzCkwKQo-ZlzxylZpd2s9hpoj25hQ/rs:fit/g:sm/q:90/h:200/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1NTY3OTQz/MDEtMzM2My5wbmc.jpeg", "uri150": "https://i.discogs.com/C70P7m23ll2Jz4_Zex6gqOdBtXBYoJupKwFTIEPyNu0/rs:fit/g:sm/q:40/h:150/w:150/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1NTY3OTQz/MDEtMzM2My5wbmc.jpeg", "width": 600, "height": 200}, {"type": "secondary", "uri": "https://i.discogs.com/kRY5VRYsmzdto8jEeQKJXDZyNyGnthgyUZ1iqxGBE5k/rs:fit/g:sm/q:90/h:202/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1NTY3OTQz/MDEtNTIyMS5wbmc.jpeg", "resource_url": "https://i.discogs.com/kRY5VRYsmzdto8jEeQKJXDZyNyGnthgyUZ1iqxGBE5k/rs:fit/g:sm/q:90/h:202/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1NTY3OTQz/MDEtNTIyMS5wbmc.jpeg", "uri150": "https://i.discogs.com/f7FqmkUL51KfMfIUWljdVxc1hjQr8SQ5daF_97oirx0/rs:fit/g:sm/q:40/h:150/w:150/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1NTY3OTQz/MDEtNTIyMS5wbmc.jpeg", "width": 600, "height": 202}, {"type": "secondary", "uri": "https://i.discogs.com/CP2-qryh2oLmbXdVCDgAgCGRjuD8txVhQb_wE9W_E_M/rs:fit/g:sm/q:90/h:599/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1NTY3OTQz/MDItMjg3My5wbmc.jpeg", "resource_url": "https://i.discogs.com/CP2-qryh2oLmbXdVCDgAgCGRjuD8txVhQb_wE9W_E_M/rs:fit/g:sm/q:90/h:599/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1NTY3OTQz/MDItMjg3My5wbmc.jpeg", "uri150": "https://i.discogs.com/Sxq8YTvkMZPmHf4lA0ZFRAixdp2iQXHro4H7fyt-GEQ/rs:fit/g:sm/q:40/h:150/w:150/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1NTY3OTQz/MDItMjg3My5wbmc.jpeg", "width": 600, "height": 599}, {"type": "secondary", "uri": "https://i.discogs.com/5oXUh6BibD9ZwwIBT_XBdkCeood3PZfqHH-eW32gA0k/rs:fit/g:sm/q:90/h:583/w:559/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1NTY3OTQy/OTktNzc2OC5wbmc.jpeg", "resource_url": "https://i.discogs.com/5oXUh6BibD9ZwwIBT_XBdkCeood3PZfqHH-eW32gA0k/rs:fit/g:sm/q:90/h:583/w:559/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1NTY3OTQy/OTktNzc2OC5wbmc.jpeg", "uri150": "https://i.discogs.com/5AP59mutTNWNJk8XIsFqEkqBx64IU5hvjawYsSh3Aq0/rs:fit/g:sm/q:40/h:150/w:150/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1NTY3OTQy/OTktNzc2OC5wbmc.jpeg", "width": 559, "height": 583}, {"type": "secondary", "uri": "https://i.discogs.com/tQtJokLil8xbIuQeu1PcgwO9lZl5CPrAsUZD5S_NYhU/rs:fit/g:sm/q:90/h:600/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1Njg0OTI5/NDYtODYxMi5qcGVn.jpeg", "resource_url": "https://i.discogs.com/tQtJokLil8xbIuQeu1PcgwO9lZl5CPrAsUZD5S_NYhU/rs:fit/g:sm/q:90/h:600/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1Njg0OTI5/NDYtODYxMi5qcGVn.jpeg", "uri150": "https://i.discogs.com/fkCvASLUIjVjCXADCp_937W3je0UasLdAK1m1LYMkJ4/rs:fit/g:sm/q:40/h:150/w:150/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1Njg0OTI5/NDYtODYxMi5qcGVn.jpeg", "width": 600, "height": 600}, {"type": "secondary", "uri": "https://i.discogs.com/-vS2uC_7gCwj7N_JF10bXUstZ2vyX9rxLfTx5zlpLo0/rs:fit/g:sm/q:90/h:600/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1Njg0OTI5/NTUtMzM3My5qcGVn.jpeg", "resource_url": "https://i.discogs.com/-vS2uC_7gCwj7N_JF10bXUstZ2vyX9rxLfTx5zlpLo0/rs:fit/g:sm/q:90/h:600/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1Njg0OTI5/NTUtMzM3My5qcGVn.jpeg", "uri150": "https://i.discogs.com/lXo-Vo_oOv94ozMpLkqFXYM067YfGzRQJjRxkca-YTQ/rs:fit/g:sm/q:40/h:150/w:150/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1Njg0OTI5/NTUtMzM3My5qcGVn.jpeg", "width": 600, "height": 600}, {"type": "secondary", "uri": "https://i.discogs.com/ZuN9b8pLxEphj9bumGQYkCQiSnwZ_SWhpMsidUrwhtI/rs:fit/g:sm/q:90/h:600/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1Njg0OTI5/NjktODM5Ni5qcGVn.jpeg", "resource_url": "https://i.discogs.com/ZuN9b8pLxEphj9bumGQYkCQiSnwZ_SWhpMsidUrwhtI/rs:fit/g:sm/q:90/h:600/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1Njg0OTI5/NjktODM5Ni5qcGVn.jpeg", "uri150": "https://i.discogs.com/jq47euZlOkbPVGmjyYEUCWVZjlFl4lZzErNdSc4oluo/rs:fit/g:sm/q:40/h:150/w:150/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1Njg0OTI5/NjktODM5Ni5qcGVn.jpeg", "width": 600, "height": 600}, {"type": "secondary", "uri": "https://i.discogs.com/s2CrDiRHAimjIem1n8PsNhOJsd-BWJ7CsAyHKNZk6RA/rs:fit/g:sm/q:90/h:467/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1Njg0OTMw/MDQtOTY0MS5qcGVn.jpeg", "resource_url": "https://i.discogs.com/s2CrDiRHAimjIem1n8PsNhOJsd-BWJ7CsAyHKNZk6RA/rs:fit/g:sm/q:90/h:467/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1Njg0OTMw/MDQtOTY0MS5qcGVn.jpeg", "uri150": "https://i.discogs.com/hQCSGkbRybjFa5XS0X4xk-0-voK1S1iQtTbz1mXNnfs/rs:fit/g:sm/q:40/h:150/w:150/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1Njg0OTMw/MDQtOTY0MS5qcGVn.jpeg", "width": 600, "height": 467}, {"type": "secondary", "uri": "https://i.discogs.com/MUwOP8OvosTOnJVuMiwQLg-wik2MFuYxKxEUiUf-oJo/rs:fit/g:sm/q:90/h:600/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1Njg0OTMw/MzItMzc2OS5qcGVn.jpeg", "resource_url": "https://i.discogs.com/MUwOP8OvosTOnJVuMiwQLg-wik2MFuYxKxEUiUf-oJo/rs:fit/g:sm/q:90/h:600/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1Njg0OTMw/MzItMzc2OS5qcGVn.jpeg", "uri150": "https://i.discogs.com/6X02UAqdRnA_RegU0bzV67gXHR8w6FpMTYNsdqvbexk/rs:fit/g:sm/q:40/h:150/w:150/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1Njg0OTMw/MzItMzc2OS5qcGVn.jpeg", "width": 600, "height": 600}, {"type": "secondary", "uri": "https://i.discogs.com/3lfJEl2tYnAxBj7siYJYRSkerwp8gYtjxcAVajhH9X8/rs:fit/g:sm/q:90/h:600/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1Njg0OTMw/NDMtNTc1MC5qcGVn.jpeg", "resource_url": "https://i.discogs.com/3lfJEl2tYnAxBj7siYJYRSkerwp8gYtjxcAVajhH9X8/rs:fit/g:sm/q:90/h:600/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1Njg0OTMw/NDMtNTc1MC5qcGVn.jpeg", "uri150": "https://i.discogs.com/ap05CZqMNK8Bjw13ZWSkGiWg3AVh84KI9ALAyorEUKk/rs:fit/g:sm/q:40/h:150/w:150/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1Njg0OTMw/NDMtNTc1MC5qcGVn.jpeg", "width": 600, "height": 600}], "thumb": "https://i.discogs.com/KO0LsGqRrcQ0PTD50cjM886Of-N9GnsWGf3GNOiaQmM/rs:fit/g:sm/q:40/h:150/w:150/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTEzNTc0/MTQwLTE1NTY3OTQz/MDAtODU4NS5wbmc.jpeg", "estimated_weight": 85, "blocked_from_sale": false} diff --git a/test_data/https___api_spotify_com_v1_albums_0I8vpSE1bSmysN2PhmHoQg b/test_data/https___api_spotify_com_v1_albums_0I8vpSE1bSmysN2PhmHoQg new file mode 100644 index 00000000..87bbed55 --- /dev/null +++ b/test_data/https___api_spotify_com_v1_albums_0I8vpSE1bSmysN2PhmHoQg @@ -0,0 +1,164 @@ +{ + "album_type" : "album", + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/0F3Aew9DSd6fb6192K1K0Y" + }, + "href" : "https://api.spotify.com/v1/artists/0F3Aew9DSd6fb6192K1K0Y", + "id" : "0F3Aew9DSd6fb6192K1K0Y", + "name" : "Keith Jarrett", + "type" : "artist", + "uri" : "spotify:artist:0F3Aew9DSd6fb6192K1K0Y" + } ], + "available_markets" : [ "AD", "AE", "AG", "AL", "AM", "AO", "AR", "AT", "AU", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BN", "BO", "BR", "BS", "BT", "BW", "BY", "BZ", "CA", "CD", "CG", "CH", "CI", "CL", "CM", "CO", "CR", "CV", "CW", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG", "ES", "FI", "FJ", "FM", "FR", "GA", "GB", "GD", "GE", "GH", "GM", "GN", "GQ", "GR", "GT", "GW", "GY", "HK", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IN", "IQ", "IS", "IT", "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM", "KN", "KR", "KW", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "ME", "MG", "MH", "MK", "ML", "MN", "MO", "MR", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "NA", "NE", "NG", "NI", "NL", "NO", "NP", "NR", "NZ", "OM", "PA", "PE", "PG", "PH", "PK", "PL", "PS", "PT", "PW", "PY", "QA", "RO", "RS", "RW", "SA", "SB", "SC", "SE", "SG", "SI", "SK", "SL", "SM", "SN", "SR", "ST", "SV", "SZ", "TD", "TG", "TH", "TJ", "TL", "TN", "TO", "TR", "TT", "TV", "TW", "TZ", "UA", "UG", "US", "UY", "UZ", "VC", "VE", "VN", "VU", "WS", "XK", "ZA", "ZM", "ZW" ], + "copyrights" : [ { + "text" : "© 1975 ECM Records GmbH, under exclusive license to Deutsche Grammophon GmbH, Berlin", + "type" : "C" + }, { + "text" : "℗ 1975 ECM Records GmbH, under exclusive license to Deutsche Grammophon GmbH, Berlin", + "type" : "P" + } ], + "external_ids" : { + "upc" : "00042281006722" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/album/0I8vpSE1bSmysN2PhmHoQg" + }, + "genres" : [ ], + "href" : "https://api.spotify.com/v1/albums/0I8vpSE1bSmysN2PhmHoQg", + "id" : "0I8vpSE1bSmysN2PhmHoQg", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/ab67616d0000b27364d8292b7825888183e4da28", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/ab67616d00001e0264d8292b7825888183e4da28", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/ab67616d0000485164d8292b7825888183e4da28", + "width" : 64 + } ], + "label" : "ECM Records", + "name" : "The Köln Concert", + "popularity" : 48, + "release_date" : "1975-11-30", + "release_date_precision" : "day", + "total_tracks" : 4, + "tracks" : { + "href" : "https://api.spotify.com/v1/albums/0I8vpSE1bSmysN2PhmHoQg/tracks?offset=0&limit=50", + "items" : [ { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/0F3Aew9DSd6fb6192K1K0Y" + }, + "href" : "https://api.spotify.com/v1/artists/0F3Aew9DSd6fb6192K1K0Y", + "id" : "0F3Aew9DSd6fb6192K1K0Y", + "name" : "Keith Jarrett", + "type" : "artist", + "uri" : "spotify:artist:0F3Aew9DSd6fb6192K1K0Y" + } ], + "available_markets" : [ "AD", "AE", "AG", "AL", "AM", "AO", "AR", "AT", "AU", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BN", "BO", "BR", "BS", "BT", "BW", "BY", "BZ", "CA", "CD", "CG", "CH", "CI", "CL", "CM", "CO", "CR", "CV", "CW", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG", "ES", "ET", "FI", "FJ", "FM", "FR", "GA", "GB", "GD", "GE", "GH", "GM", "GN", "GQ", "GR", "GT", "GW", "GY", "HK", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IN", "IQ", "IS", "IT", "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM", "KN", "KR", "KW", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "ME", "MG", "MH", "MK", "ML", "MN", "MO", "MR", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "NA", "NE", "NG", "NI", "NL", "NO", "NP", "NR", "NZ", "OM", "PA", "PE", "PG", "PH", "PK", "PL", "PS", "PT", "PW", "PY", "QA", "RO", "RS", "RW", "SA", "SB", "SC", "SE", "SG", "SI", "SK", "SL", "SM", "SN", "SR", "ST", "SV", "SZ", "TD", "TG", "TH", "TJ", "TL", "TN", "TO", "TR", "TT", "TV", "TW", "TZ", "UA", "UG", "US", "UY", "UZ", "VC", "VE", "VN", "VU", "WS", "XK", "ZA", "ZM", "ZW" ], + "disc_number" : 1, + "duration_ms" : 1561600, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/0T4KV1pj8as2xvdHZAP5ae" + }, + "href" : "https://api.spotify.com/v1/tracks/0T4KV1pj8as2xvdHZAP5ae", + "id" : "0T4KV1pj8as2xvdHZAP5ae", + "is_local" : false, + "name" : "Köln, January 24, 1975, Pt. I - Live", + "preview_url" : null, + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:0T4KV1pj8as2xvdHZAP5ae" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/0F3Aew9DSd6fb6192K1K0Y" + }, + "href" : "https://api.spotify.com/v1/artists/0F3Aew9DSd6fb6192K1K0Y", + "id" : "0F3Aew9DSd6fb6192K1K0Y", + "name" : "Keith Jarrett", + "type" : "artist", + "uri" : "spotify:artist:0F3Aew9DSd6fb6192K1K0Y" + } ], + "available_markets" : [ "AD", "AE", "AG", "AL", "AM", "AO", "AR", "AT", "AU", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BN", "BO", "BR", "BS", "BT", "BW", "BY", "BZ", "CA", "CD", "CG", "CH", "CI", "CL", "CM", "CO", "CR", "CV", "CW", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG", "ES", "ET", "FI", "FJ", "FM", "FR", "GA", "GB", "GD", "GE", "GH", "GM", "GN", "GQ", "GR", "GT", "GW", "GY", "HK", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IN", "IQ", "IS", "IT", "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM", "KN", "KR", "KW", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "ME", "MG", "MH", "MK", "ML", "MN", "MO", "MR", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "NA", "NE", "NG", "NI", "NL", "NO", "NP", "NR", "NZ", "OM", "PA", "PE", "PG", "PH", "PK", "PL", "PS", "PT", "PW", "PY", "QA", "RO", "RS", "RW", "SA", "SB", "SC", "SE", "SG", "SI", "SK", "SL", "SM", "SN", "SR", "ST", "SV", "SZ", "TD", "TG", "TH", "TJ", "TL", "TN", "TO", "TR", "TT", "TV", "TW", "TZ", "UA", "UG", "US", "UY", "UZ", "VC", "VE", "VN", "VU", "WS", "XK", "ZA", "ZM", "ZW" ], + "disc_number" : 1, + "duration_ms" : 894733, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/3hrt1fLgEZIZPONUbcDY0c" + }, + "href" : "https://api.spotify.com/v1/tracks/3hrt1fLgEZIZPONUbcDY0c", + "id" : "3hrt1fLgEZIZPONUbcDY0c", + "is_local" : false, + "name" : "Köln, January 24, 1975, Pt. II A - Live", + "preview_url" : null, + "track_number" : 2, + "type" : "track", + "uri" : "spotify:track:3hrt1fLgEZIZPONUbcDY0c" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/0F3Aew9DSd6fb6192K1K0Y" + }, + "href" : "https://api.spotify.com/v1/artists/0F3Aew9DSd6fb6192K1K0Y", + "id" : "0F3Aew9DSd6fb6192K1K0Y", + "name" : "Keith Jarrett", + "type" : "artist", + "uri" : "spotify:artist:0F3Aew9DSd6fb6192K1K0Y" + } ], + "available_markets" : [ "AD", "AE", "AG", "AL", "AM", "AO", "AR", "AT", "AU", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BN", "BO", "BR", "BS", "BT", "BW", "BY", "BZ", "CA", "CD", "CG", "CH", "CI", "CL", "CM", "CO", "CR", "CV", "CW", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG", "ES", "ET", "FI", "FJ", "FM", "FR", "GA", "GB", "GD", "GE", "GH", "GM", "GN", "GQ", "GR", "GT", "GW", "GY", "HK", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IN", "IQ", "IS", "IT", "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM", "KN", "KR", "KW", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "ME", "MG", "MH", "MK", "ML", "MN", "MO", "MR", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "NA", "NE", "NG", "NI", "NL", "NO", "NP", "NR", "NZ", "OM", "PA", "PE", "PG", "PH", "PK", "PL", "PS", "PT", "PW", "PY", "QA", "RO", "RS", "RW", "SA", "SB", "SC", "SE", "SG", "SI", "SK", "SL", "SM", "SN", "SR", "ST", "SV", "SZ", "TD", "TG", "TH", "TJ", "TL", "TN", "TO", "TR", "TT", "TV", "TW", "TZ", "UA", "UG", "US", "UY", "UZ", "VC", "VE", "VN", "VU", "WS", "XK", "ZA", "ZM", "ZW" ], + "disc_number" : 1, + "duration_ms" : 1094493, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/5E2TkoLzEpqvxwWzkgh0kT" + }, + "href" : "https://api.spotify.com/v1/tracks/5E2TkoLzEpqvxwWzkgh0kT", + "id" : "5E2TkoLzEpqvxwWzkgh0kT", + "is_local" : false, + "name" : "Köln, January 24, 1975, Pt. II B - Live", + "preview_url" : null, + "track_number" : 3, + "type" : "track", + "uri" : "spotify:track:5E2TkoLzEpqvxwWzkgh0kT" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/0F3Aew9DSd6fb6192K1K0Y" + }, + "href" : "https://api.spotify.com/v1/artists/0F3Aew9DSd6fb6192K1K0Y", + "id" : "0F3Aew9DSd6fb6192K1K0Y", + "name" : "Keith Jarrett", + "type" : "artist", + "uri" : "spotify:artist:0F3Aew9DSd6fb6192K1K0Y" + } ], + "available_markets" : [ "AD", "AE", "AG", "AL", "AM", "AO", "AR", "AT", "AU", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BN", "BO", "BR", "BS", "BT", "BW", "BY", "BZ", "CA", "CD", "CG", "CH", "CI", "CL", "CM", "CO", "CR", "CV", "CW", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG", "ES", "ET", "FI", "FJ", "FM", "FR", "GA", "GB", "GD", "GE", "GH", "GM", "GN", "GQ", "GR", "GT", "GW", "GY", "HK", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IN", "IQ", "IS", "IT", "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM", "KN", "KR", "KW", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "ME", "MG", "MH", "MK", "ML", "MN", "MO", "MR", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "NA", "NE", "NG", "NI", "NL", "NO", "NP", "NR", "NZ", "OM", "PA", "PE", "PG", "PH", "PK", "PL", "PS", "PT", "PW", "PY", "QA", "RO", "RS", "RW", "SA", "SB", "SC", "SE", "SG", "SI", "SK", "SL", "SM", "SN", "SR", "ST", "SV", "SZ", "TD", "TG", "TH", "TJ", "TL", "TN", "TO", "TR", "TT", "TV", "TW", "TZ", "UA", "UG", "US", "UY", "UZ", "VC", "VE", "VN", "VU", "WS", "XK", "ZA", "ZM", "ZW" ], + "disc_number" : 1, + "duration_ms" : 416840, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/4FMI4Ln1LhyxGldkNXan5e" + }, + "href" : "https://api.spotify.com/v1/tracks/4FMI4Ln1LhyxGldkNXan5e", + "id" : "4FMI4Ln1LhyxGldkNXan5e", + "is_local" : false, + "name" : "Köln, January 24, 1975, Pt. II C - Live", + "preview_url" : null, + "track_number" : 4, + "type" : "track", + "uri" : "spotify:track:4FMI4Ln1LhyxGldkNXan5e" + } ], + "limit" : 50, + "next" : null, + "offset" : 0, + "previous" : null, + "total" : 4 + }, + "type" : "album", + "uri" : "spotify:album:0I8vpSE1bSmysN2PhmHoQg" +}