Resolves #17
This commit is contained in:
		
							
								
								
									
										234
									
								
								lastfm_wrapper.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										234
									
								
								lastfm_wrapper.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,234 @@ | ||||
| #!/usr/bin/env python3.11 | ||||
|  | ||||
| from aiohttp import ClientSession, ClientTimeout | ||||
| import json | ||||
| import regex | ||||
| import traceback | ||||
|  | ||||
| from constants import Constants | ||||
| from typing import Union, Any | ||||
|  | ||||
| class LastFM: | ||||
|     def __init__(self, noInit: Union[None, bool] = False): | ||||
|         self.creds = Constants().LFM_CREDS | ||||
|         self.api_base_url = "https://ws.audioscrobbler.com/2.0/?method=" | ||||
|          | ||||
|          | ||||
|     async def search_artist(self, artist=None): | ||||
|         try: | ||||
|             if artist is None: | ||||
|                 return { | ||||
|                     'err': 'No artist specified.' | ||||
|                 } | ||||
|                  | ||||
|             async with ClientSession() as session:                 | ||||
|                 async with session.get(f"{self.api_base_url}artist.getinfo&artist={artist}&api_key={self.creds.get('key')}&autocorrect=1&format=json",  timeout=ClientTimeout(connect=3, sock_read=8)) as request: | ||||
|                     assert request.status in [200, 204] | ||||
|                     data = await request.json() | ||||
|                     data = data.get('artist') | ||||
|  | ||||
|                 print(f"Using data:\n{data}") | ||||
|                 # return data.get('results') | ||||
|                 retObj = { | ||||
|                             'id': data.get('mbid'), | ||||
|                             'touring': data.get('ontour'), | ||||
|                             'name': data.get('name'), | ||||
|                             'bio': data.get('bio').get('summary').strip().split("<a href")[0] | ||||
|                         } | ||||
|                 return retObj | ||||
|         except: | ||||
|             print(traceback.format_exc()) | ||||
|             return { | ||||
|                 'err': 'Failed' | ||||
|             } | ||||
|      | ||||
|     async def get_track_info(self, artist=None, track=None): | ||||
|         try: | ||||
|             if artist is None or track is None: | ||||
|                 print("inv request") | ||||
|                 return { | ||||
|                     'err': 'Invalid/No artist or track specified' | ||||
|                 } | ||||
|  | ||||
|             async with ClientSession() as session: | ||||
|                 async with session.get(f"{self.api_base_url}track.getInfo&api_key={self.creds.get('key')}&autocorrect=1&artist={artist}&track={track}&format=json",  timeout=ClientTimeout(connect=3, sock_read=8)) as request: | ||||
|                     assert request.status in [200, 204] | ||||
|                     data = await request.json() | ||||
|                     data = data.get('track') | ||||
|                     retObj = { | ||||
|                         'artist_mbid': data.get('artist').get('mbid'), | ||||
|                         'album': data.get('album').get('title') | ||||
|                     } | ||||
|                     print(f"Returning:\n{retObj}") | ||||
|                     return retObj | ||||
|         except: | ||||
|             print(traceback.format_exc()) | ||||
|             return { | ||||
|                 'err': 'General Failure' | ||||
|             } | ||||
|              | ||||
|     async def get_album_tracklist(self, artist=None, album=None): | ||||
|         try: | ||||
|             if artist is None or album is None: | ||||
|                 print("inv request") | ||||
|                 return { | ||||
|                     'err': 'No artist or album specified' | ||||
|                 } | ||||
|              | ||||
|             tracks = await self.get_release(artist=artist, album=album) | ||||
|             tracks = tracks.get('tracks') | ||||
|             retObj = { | ||||
|                 'tracks': tracks | ||||
|             }  | ||||
|                  | ||||
|             print(f"Returning:\n{retObj}") | ||||
|             return retObj | ||||
|                  | ||||
|         except: | ||||
|             print(traceback.format_exc()) | ||||
|             return { | ||||
|                 'err': 'General Failure' | ||||
|             }                 | ||||
|                         | ||||
|     async def get_artist_albums(self, artist=None): | ||||
|         try: | ||||
|             if artist is None: | ||||
|                 return { | ||||
|                     'err': 'No artist specified.' | ||||
|                 } | ||||
|              | ||||
|             async with ClientSession() as session: | ||||
|                 async with session.get(f"{self.api_base_url}artist.gettopalbums&artist={artist}&api_key={self.creds.get('key')}&autocorrect=1&format=json",  timeout=ClientTimeout(connect=3, sock_read=8)) as request: | ||||
|                     assert request.status in [200, 204] | ||||
|                     # return request.text | ||||
|                     data = await request.json() | ||||
|                     data = data.get('topalbums').get('album') | ||||
|                     # print(f"Data:\n{data}") | ||||
|                     retObj = [ | ||||
|                         { | ||||
|                             'title': item.get('name') | ||||
|                         } for item in data if not(item.get('name').lower() == "(null)") and not(int(item.get('playcount')) < 50) | ||||
|                     ] | ||||
|                     # # print(f"Keys: {data[0].keys()}") | ||||
|                     return retObj             | ||||
|         except: | ||||
|             print(traceback.format_exc()) | ||||
|             return { | ||||
|                 'err': 'Failed' | ||||
|             } | ||||
|          | ||||
|     async def get_artist_id(self, artist=None): | ||||
|         try: | ||||
|             if artist is None: | ||||
|                 return { | ||||
|                     'err': 'No artist specified.' | ||||
|                 } | ||||
|             artist_search = await self.search_artist(artist=artist) | ||||
|             if artist_search is None or len(artist_search) < 1: | ||||
|                 print("[get_artist_id] Throwing no result error") | ||||
|                 return { | ||||
|                     'err': 'No results.' | ||||
|                 } | ||||
|             artist_id = artist_search[0].get('id') | ||||
|             return artist_id | ||||
|         except: | ||||
|             print(traceback.format_exc()) | ||||
|             return { | ||||
|                 'err': 'Failed' | ||||
|             } | ||||
|              | ||||
|     async def get_artist_info_by_id(self, artist_id=None): | ||||
|         try: | ||||
|             if artist_id is None or not(str(artist_id).isnumeric()): | ||||
|                 return { | ||||
|                     'err': 'Invalid/no artist_id specified.' | ||||
|                 } | ||||
|              | ||||
|             async with ClientSession() as session: | ||||
|                 async with session.get(f"{self.api_base_url}artists/{artist_id}?key={self.creds.get('key')}&secret={self.creds.get('secret')}",  timeout=ClientTimeout(connect=3, sock_read=8)) as request: | ||||
|                     assert request.status in [200, 204] | ||||
|                     data = await request.json() | ||||
|                      | ||||
|                     retObj = { | ||||
|                         'id': data.get('id'), | ||||
|                         'name': data.get('name'), | ||||
|                         'profile': regex.sub(r"(\[(\/{0,})(u|b|i)])", "", data.get('profile')), | ||||
|                         'members': data.get('members') | ||||
|                     } | ||||
|                     return retObj | ||||
|         except: | ||||
|             print(traceback.format_exc()) | ||||
|             return { | ||||
|                 'err': 'Failed' | ||||
|             } | ||||
|              | ||||
|     async def get_artist_info(self, artist=None): | ||||
|         try: | ||||
|             if artist is None: | ||||
|                 return { | ||||
|                     'err': 'No artist specified.' | ||||
|                 } | ||||
|             # artist_id = await self.get_artist_id(artist=artist) | ||||
|             # if artist_id is None: | ||||
|             #     return { | ||||
|             #         'err': Failed | ||||
|             #     } | ||||
|             artist_info = await self.get_artist_info_by_id(artist_id=artist_id) | ||||
|             if artist_info is None: | ||||
|                 return { | ||||
|                     'err': Failed | ||||
|                 } | ||||
|             return artist_info | ||||
|         except: | ||||
|             print(traceback.format_exc()) | ||||
|             return { | ||||
|                 'err': 'Failed' | ||||
|             } | ||||
|              | ||||
|     async def get_release(self, artist=None, album=None): | ||||
|         try: | ||||
|             if artist is None or album is None: | ||||
|                 return { | ||||
|                     'err': 'Invalid artist/album pair' | ||||
|                 } | ||||
|              | ||||
|             async with ClientSession() as session: | ||||
|                 async with session.get(f"{self.api_base_url}album.getinfo&artist={artist}&album={album}&api_key={self.creds.get('key')}&autocorrect=1&format=json",  timeout=ClientTimeout(connect=3, sock_read=8)) as request: | ||||
|                     assert request.status in [200, 204] | ||||
|                     data = await request.json() | ||||
|                     data = data.get('album') | ||||
|                     retObj = { | ||||
|                         'id': data.get('mbid'), | ||||
|                         'artists': data.get('artist'), | ||||
|                         'tags': data.get('tags'), | ||||
|                         'title': data.get('name'), | ||||
|                         'summary': data.get('wiki').get('summary').split("<a href")[0] if "wiki" in data.keys() else "No summary available for this release.", | ||||
|                     } | ||||
|                     try: | ||||
|                         track_key = data.get('tracks').get('track') | ||||
|                     except: track_key = [] | ||||
|                     if type(track_key) == list: | ||||
|                         print(f"Track key: {track_key}") | ||||
|                         retObj['tracks'] = [ | ||||
|                             { | ||||
|                             'duration': item.get('duration', 'N/A'), | ||||
|                             'title': item.get('name') | ||||
|                         } for item in track_key] | ||||
|                     else: | ||||
|                         retObj['tracks'] = [ | ||||
|                         { | ||||
|                             'duration': data.get('tracks').get('track').get('duration'), | ||||
|                             'title': data.get('tracks').get('track').get('name') | ||||
|                         } | ||||
|                     ] | ||||
|                     return retObj | ||||
|         except: | ||||
|             print(traceback.format_exc()) | ||||
|             return { | ||||
|                 'err': 'Failed' | ||||
|             } | ||||
|              | ||||
|              | ||||
|  | ||||
|      | ||||
|          | ||||
		Reference in New Issue
	
	Block a user