Skip to content

Commit 6045f47

Browse files
committed
Add composer and producer tags
1 parent 3511e15 commit 6045f47

File tree

4 files changed

+28
-0
lines changed

4 files changed

+28
-0
lines changed

spotify_web_downloader/cli.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,9 +391,12 @@ def main(
391391
album_metadata = spotify_api.get_album(
392392
spotify_api.gid_to_track_id(metadata_gid["album"]["gid"])
393393
)
394+
logger.debug("Getting track credits")
395+
track_credits = spotify_api.get_track_credits(track_id)
394396
tags = downloader_song.get_tags(
395397
metadata_gid,
396398
album_metadata,
399+
track_credits,
397400
lyrics.unsynced,
398401
)
399402
final_path = downloader_song.get_final_path(tags)

spotify_web_downloader/constants.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
"album_artist": "aART",
1313
"artist": "\xa9ART",
1414
"comment": "\xa9cmt",
15+
"composer": "\xa9wrt",
1516
"copyright": "cprt",
1617
"lyrics": "\xa9lyr",
1718
"media_type": "stik",
19+
"producer": "\xa9prd",
1820
"rating": "rtng",
1921
"release_date": "\xa9day",
2022
"title": "\xa9nam",

spotify_web_downloader/downloader_song.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ def get_tags(
8787
self,
8888
metadata_gid: dict,
8989
album_metadata: dict,
90+
track_credits: dict,
9091
lyrics_unsynced: str,
9192
) -> dict:
9293
isrc = None
@@ -97,6 +98,16 @@ def get_tags(
9798
release_date_datetime_obj = self.downloader.get_release_date_datetime_obj(
9899
metadata_gid
99100
)
101+
producers = next(
102+
role
103+
for role in track_credits["roleCredits"]
104+
if role["roleTitle"] == "Producers"
105+
)["artists"]
106+
composers = next(
107+
role
108+
for role in track_credits["roleCredits"]
109+
if role["roleTitle"] == "Writers"
110+
)["artists"]
100111
tags = {
101112
"album": album_metadata["name"],
102113
"album_artist": self.downloader.get_artist(album_metadata["artists"]),
@@ -105,6 +116,7 @@ def get_tags(
105116
"compilation": (
106117
True if album_metadata["album_type"] == "compilation" else False
107118
),
119+
"composer": self.downloader.get_artist(composers) if composers else None,
108120
"copyright": next(
109121
(i["text"] for i in album_metadata["copyrights"] if i["type"] == "P"),
110122
None,
@@ -115,6 +127,7 @@ def get_tags(
115127
"label": album_metadata.get("label"),
116128
"lyrics": lyrics_unsynced,
117129
"media_type": 1,
130+
"producer": self.downloader.get_artist(producers) if producers else None,
118131
"rating": 1 if metadata_gid.get("explicit") else 0,
119132
"release_date": self.downloader.get_release_date_tag(
120133
release_date_datetime_obj

spotify_web_downloader/spotify_api.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ class SpotifyApi:
2828
)
2929
METADATA_API_URL = "https://api.spotify.com/v1/{type}/{track_id}"
3030
PATHFINDER_API_URL = "https://api-partner.spotify.com/pathfinder/v1/query"
31+
TRACK_CREDITS_API_URL = (
32+
"https://spclient.wg.spotify.com/track-credits-view/v0/experimental/{track_id}/credits"
33+
)
3134
EXTEND_TRACK_COLLECTION_WAIT_TIME = 0.5
3235

3336
def __init__(
@@ -195,3 +198,10 @@ def get_now_playing_view(self, track_id: str, artist_id: str) -> dict:
195198
)
196199
self._check_response(response)
197200
return response.json()
201+
202+
def get_track_credits(self, track_id: str) -> dict:
203+
response = self.session.get(
204+
self.TRACK_CREDITS_API_URL.format(track_id=track_id)
205+
)
206+
self._check_response(response)
207+
return response.json()

0 commit comments

Comments
 (0)