jamendo_obs/lib/jamendo.py

55 lines
2.2 KiB
Python

from enum import Enum
from typing import Literal
import requests
import urllib.parse
API_BASE = 'https://api.jamendo.com/v3.0/'
ImageSize = Literal[25, 35, 50, 55, 60, 65, 70, 75, 85, 100, 130, 150, 200, 300, 400, 500, 600]
AudioFormat = Literal['mp31', 'mp32', 'ogg', 'flac']
VocalInstrumental = Literal['vocal', 'instrumental']
AcousticElectric = Literal['acoustic', 'electric']
Order = Literal['relevance', 'buzzrate', 'downloads_week', 'downloads_month', 'downloads_total', 'listens_week', 'listens_month', 'listens_total', 'popularity_week', 'popularity_month', 'popularity_total', 'name', 'album_name', 'artist_name', 'releasedate', 'duration', 'id']
Speed = Literal['verylow', 'low', 'medium', 'high', 'veryhigh']
class JamendoClient:
def __init__(self, client_id: str):
self._client_id = client_id
self._session = requests.session()
def tracks(self, tags: str, offset: int = 0, order: Order = 'relevance',
audioformat: AudioFormat = 'ogg', imagesize: ImageSize = 600,
vocalinstrumental: VocalInstrumental = None,
acousticelectric: AcousticElectric = None,
speed: Speed = None, ccsa: bool = False,
ccnd: bool = False, ccnc: bool = False,
):
params = {
'client_id': self._client_id,
'offset': offset,
'format': 'json',
'tags': tags,
'audioformat': audioformat,
'imagesize': imagesize,
'ccsa': ccsa,
'ccnd': ccnd,
'ccnc': ccnc,
'limit': 5
}
if vocalinstrumental: params['vocalinstrumental'] = vocalinstrumental
if acousticelectric: params['acousticelectric'] = acousticelectric
if speed: params['speed'] = speed
url = urllib.parse.urljoin(API_BASE, f'tracks/?{urllib.parse.urlencode(params)}')
with self._session.get(url) as r:
r.raise_for_status()
result = r.json()
if 'results' in result:
return result['results']
def download(self, url: str, fp):
with self._session.get(url, stream=True) as r:
r.raise_for_status()
for chunk in r.iter_content(chunk_size=1024):
fp.write(chunk)