Skip to content

Commit

Permalink
Fixed import playlist from Spotify (#2896)
Browse files Browse the repository at this point in the history
* migrated code to troi

* fixed troi tag

---------

Co-authored-by: Rimma Kubanova <[email protected]>
  • Loading branch information
rimma-kubanova and Rimma Kubanova committed Jun 21, 2024
1 parent 9cca0ea commit 2d7e3fb
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 74 deletions.
87 changes: 14 additions & 73 deletions listenbrainz/troi/import_ms.py
Original file line number Diff line number Diff line change
@@ -1,78 +1,19 @@
import spotipy
import requests
from troi import Recording
import troi.playlist
from troi.musicbrainz.recording import RecordingListElement
import sys
from troi.patches.playlist_from_ms import ImportPlaylistPatch


def import_from_spotify(token, user, playlist_id):
tracks_from_playlist, title, description = get_tracks_from_playlist(token, playlist_id)
tracks = []
for track in tracks_from_playlist["items"]:
artists = track["track"].get("artists", [])
artist_names = []
for a in artists:
name = a.get("name")
if name is not None:
artist_names.append(name)
artist_name = ", ".join(artist_names)
tracks.append({
"recording_name": track["track"]["name"],
"artist_name": artist_name,
})
# select track_name and artist_name for each track
mbid_mapped_tracks = mbid_mapping_spotify(tracks)
# pass the tracks as Recording
recordings = []
if mbid_mapped_tracks:
for track in mbid_mapped_tracks:
if track is not None and "recording_mbid" in track:
recordings.append(Recording(mbid=track["recording_mbid"]))
else:
return None

recording_list = RecordingListElement(recordings)
try:
playlist = troi.playlist.PlaylistElement()
playlist.set_sources(recording_list)
result = playlist.generate(True)

playlist.playlists[0].name = title
playlist.playlists[0].descripton = description

print("done.")
except troi.PipelineError as err:
print("Failed to generate playlist: %s" % err, file=sys.stderr)
return None

if result is not None and user:
for url, _ in playlist.submit(user, None):
print("Submitted playlist: %s" % url)

args = {
"ms_token": token,
"token": user,
"playlist_id": playlist_id,
"upload": True,
"created_for": None,
"echo": False,
"min_recordings": 1
}
patch = ImportPlaylistPatch(args)
playlist = patch.generate_playlist()
result = playlist.get_jspf()
result.update({"identifier": url})

return result

result.update({"identifier": playlist.playlists[0].mbid})

def get_tracks_from_playlist(spotify_token, playlist_id):
""" Get the tracks from Spotify playlist.
"""
sp = spotipy.Spotify(auth=spotify_token, requests_timeout=10, retries=10)
playlist_info = sp.playlist(playlist_id)
playlists = sp.playlist_items(playlist_id, limit=100)
name = playlist_info["name"]
description = playlist_info["description"]

return playlists, name, description


def mbid_mapping_spotify(tracks):
url = "https://api.listenbrainz.org/1/metadata/lookup/"
response = requests.post(url, json={"recordings": tracks})
if response.status_code == 200:
data = response.json()
return data
else:
print("Error occurred: ", response.status_code, response.text)
return result
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ pika == 1.2.1
brainzutils@git+https://github.com/metabrainz/brainzutils-python.git@upgrade-deps
spotipy>=2.22.1
datasethoster@git+https://github.com/metabrainz/data-set-hoster.git@830ecb2b2120acbd5deed2dab4587784c7be04b6
troi@git+https://github.com/metabrainz/troi-recommendation-playground.git@v-2024-05-28.0
troi@git+https://github.com/metabrainz/troi-recommendation-playground.git@v-2024-06-21.0
PyYAML==6.0
eventlet == 0.35.2
# eventlet fails to patch dnspython >= 2.3 https://github.com/eventlet/eventlet/issues/781
Expand Down

0 comments on commit 2d7e3fb

Please sign in to comment.