Spaces:
Running
Running
import re | |
import spotipy | |
from spotipy.oauth2 import SpotifyClientCredentials | |
from youtubesearchpython.__future__ import VideosSearch | |
import config | |
class SpotifyAPI: | |
def __init__(self): | |
self.regex = r"^(https:\/\/open.spotify.com\/)(.*)$" | |
self.client_id = config.SPOTIFY_CLIENT_ID | |
self.client_secret = config.SPOTIFY_CLIENT_SECRET | |
if config.SPOTIFY_CLIENT_ID and config.SPOTIFY_CLIENT_SECRET: | |
self.client_credentials_manager = SpotifyClientCredentials( | |
self.client_id, self.client_secret | |
) | |
self.spotify = spotipy.Spotify( | |
client_credentials_manager=self.client_credentials_manager | |
) | |
else: | |
self.spotify = None | |
async def valid(self, link: str): | |
if re.search(self.regex, link): | |
return True | |
else: | |
return False | |
async def track(self, link: str): | |
track = self.spotify.track(link) | |
info = track["name"] | |
for artist in track["artists"]: | |
fetched = f' {artist["name"]}' | |
if "Various Artists" not in fetched: | |
info += fetched | |
results = VideosSearch(info, limit=1) | |
for result in (await results.next())["result"]: | |
ytlink = result["link"] | |
title = result["title"] | |
vidid = result["id"] | |
duration_min = result["duration"] | |
thumbnail = result["thumbnails"][0]["url"].split("?")[0] | |
track_details = { | |
"title": title, | |
"link": ytlink, | |
"vidid": vidid, | |
"duration_min": duration_min, | |
"thumb": thumbnail, | |
} | |
return track_details, vidid | |
async def playlist(self, url): | |
playlist = self.spotify.playlist(url) | |
playlist_id = playlist["id"] | |
results = [] | |
for item in playlist["tracks"]["items"]: | |
music_track = item["track"] | |
info = music_track["name"] | |
for artist in music_track["artists"]: | |
fetched = f' {artist["name"]}' | |
if "Various Artists" not in fetched: | |
info += fetched | |
results.append(info) | |
return results, playlist_id | |
async def album(self, url): | |
album = self.spotify.album(url) | |
album_id = album["id"] | |
results = [] | |
for item in album["tracks"]["items"]: | |
info = item["name"] | |
for artist in item["artists"]: | |
fetched = f' {artist["name"]}' | |
if "Various Artists" not in fetched: | |
info += fetched | |
results.append(info) | |
return ( | |
results, | |
album_id, | |
) | |
async def artist(self, url): | |
artistinfo = self.spotify.artist(url) | |
artist_id = artistinfo["id"] | |
results = [] | |
artisttoptracks = self.spotify.artist_top_tracks(url) | |
for item in artisttoptracks["tracks"]: | |
info = item["name"] | |
for artist in item["artists"]: | |
fetched = f' {artist["name"]}' | |
if "Various Artists" not in fetched: | |
info += fetched | |
results.append(info) | |
return results, artist_id | |