-
-
Notifications
You must be signed in to change notification settings - Fork 209
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fixed import playlist from Spotify (#2896)
* migrated code to troi * fixed troi tag --------- Co-authored-by: Rimma Kubanova <[email protected]>
- Loading branch information
1 parent
9cca0ea
commit 2d7e3fb
Showing
2 changed files
with
15 additions
and
74 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters