|
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 |
|
|