Merge pull request 'New methods to get new releases and detailed album search' (#63) from kermit/deemix:new-release into main
Reviewed-on: https://codeberg.org/RemixDev/deemix/pulls/63
This commit is contained in:
commit
31b3ae1d87
|
@ -1,5 +1,6 @@
|
||||||
import eventlet
|
import eventlet
|
||||||
import binascii
|
import binascii
|
||||||
|
import datetime
|
||||||
import time
|
import time
|
||||||
|
|
||||||
requests = eventlet.import_patched('requests')
|
requests = eventlet.import_patched('requests')
|
||||||
|
@ -109,18 +110,20 @@ class Deezer:
|
||||||
filesizes[key+"_TESTED"] = False
|
filesizes[key+"_TESTED"] = False
|
||||||
return filesizes
|
return filesizes
|
||||||
|
|
||||||
def gw_api_call(self, method, args=None):
|
def gw_api_call(self, method, args=None, params=None):
|
||||||
if args is None:
|
if args is None:
|
||||||
args = {}
|
args = {}
|
||||||
|
if params is None:
|
||||||
|
params = {}
|
||||||
|
p = {'api_version': "1.0",
|
||||||
|
'api_token': 'null' if method == 'deezer.getUserData' else self.get_token(),
|
||||||
|
'input': '3',
|
||||||
|
'method': method}
|
||||||
|
p.update(params)
|
||||||
try:
|
try:
|
||||||
result = self.session.post(
|
result = self.session.post(
|
||||||
self.api_url,
|
self.api_url,
|
||||||
params={
|
params=p,
|
||||||
'api_version': "1.0",
|
|
||||||
'api_token': 'null' if method == 'deezer.getUserData' else self.get_token(),
|
|
||||||
'input': '3',
|
|
||||||
'method': method
|
|
||||||
},
|
|
||||||
timeout=30,
|
timeout=30,
|
||||||
json=args,
|
json=args,
|
||||||
headers=self.http_headers
|
headers=self.http_headers
|
||||||
|
@ -128,7 +131,7 @@ class Deezer:
|
||||||
result_json = result.json()
|
result_json = result.json()
|
||||||
except:
|
except:
|
||||||
eventlet.sleep(2)
|
eventlet.sleep(2)
|
||||||
return self.gw_api_call(method, args)
|
return self.gw_api_call(method, args, params)
|
||||||
if len(result_json['error']):
|
if len(result_json['error']):
|
||||||
raise APIError(json.dumps(result_json['error']))
|
raise APIError(json.dumps(result_json['error']))
|
||||||
return result.json()
|
return result.json()
|
||||||
|
@ -290,6 +293,29 @@ class Deezer:
|
||||||
def get_album_gw(self, alb_id):
|
def get_album_gw(self, alb_id):
|
||||||
return self.gw_api_call('album.getData', {'alb_id': alb_id})['results']
|
return self.gw_api_call('album.getData', {'alb_id': alb_id})['results']
|
||||||
|
|
||||||
|
def get_album_details_gw(self, alb_id):
|
||||||
|
result = self.gw_api_call('deezer.pageAlbum',
|
||||||
|
{
|
||||||
|
'alb_id': alb_id,
|
||||||
|
'lang': 'en',
|
||||||
|
'header': True,
|
||||||
|
'tab': 0
|
||||||
|
})['results']
|
||||||
|
output = result['DATA']
|
||||||
|
|
||||||
|
duration = 0
|
||||||
|
for x in result['SONGS']['data']:
|
||||||
|
try:
|
||||||
|
duration += int(x['DURATION'])
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
output['DURATION'] = duration
|
||||||
|
output['NUMBER_TRACK'] = result['SONGS']['total']
|
||||||
|
output['LINK'] = f"https://deezer.com/album/{str(output['ALB_ID'])}"
|
||||||
|
|
||||||
|
return output
|
||||||
|
|
||||||
def get_album_tracks_gw(self, alb_id):
|
def get_album_tracks_gw(self, alb_id):
|
||||||
tracks_array = []
|
tracks_array = []
|
||||||
body = self.gw_api_call('song.getListByAlbum', {'alb_id': alb_id, 'nb': -1})
|
body = self.gw_api_call('song.getListByAlbum', {'alb_id': alb_id, 'nb': -1})
|
||||||
|
@ -444,6 +470,66 @@ class Deezer:
|
||||||
{"query": clean_search_query(term), "filter": "ALL", "output": type, "start": start, "nb": nb})[
|
{"query": clean_search_query(term), "filter": "ALL", "output": type, "start": start, "nb": nb})[
|
||||||
'results']
|
'results']
|
||||||
|
|
||||||
|
def search_album_gw(self, term, start, nb=20):
|
||||||
|
results = self.search_gw(term, "ALBUM", start, nb)
|
||||||
|
ids = [x['ALB_ID'] for x in results['data']]
|
||||||
|
|
||||||
|
pool = eventlet.GreenPool(100)
|
||||||
|
albums = [a for a in pool.imap(self.get_album_details_gw, ids)]
|
||||||
|
|
||||||
|
return albums
|
||||||
|
|
||||||
|
def get_page_gw(self, page):
|
||||||
|
params = {
|
||||||
|
'gateway_input': json.dumps({
|
||||||
|
'PAGE': page,
|
||||||
|
'VERSION': '2.3',
|
||||||
|
'SUPPORT': {
|
||||||
|
'grid': [
|
||||||
|
'channel',
|
||||||
|
'album'
|
||||||
|
],
|
||||||
|
'horizontal-grid': [
|
||||||
|
'album'
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'LANG': 'en'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return self.gw_api_call('page.get', params=params)
|
||||||
|
|
||||||
|
def get_new_releases(self):
|
||||||
|
explore = self.get_page_gw('channels/explore')
|
||||||
|
music_section = next((x for x in explore['results']['sections'] if x['title'] == 'Music'), None)
|
||||||
|
channels = [x['target'] for x in music_section['items']]
|
||||||
|
|
||||||
|
pool = eventlet.GreenPool(100)
|
||||||
|
new_releases_lists = [x for x in pool.imap(self.get_channel_new_releases, channels)]
|
||||||
|
|
||||||
|
seen = set()
|
||||||
|
new_releases = [seen.add(x['ALB_ID']) or x for list in new_releases_lists for x in list if x['ALB_ID'] not in seen]
|
||||||
|
new_releases.sort(key=lambda x: x['DIGITAL_RELEASE_DATE'], reverse=True)
|
||||||
|
|
||||||
|
now = datetime.datetime.now()
|
||||||
|
delta = datetime.timedelta(days=8)
|
||||||
|
recent_releases = [x for x in new_releases if now - datetime.datetime.strptime(x['DIGITAL_RELEASE_DATE'], "%Y-%m-%d") < delta]
|
||||||
|
recent_releases.sort(key=lambda x: x['ALB_ID'], reverse=True)
|
||||||
|
|
||||||
|
albums = [a for a in pool.imap(self.get_album_details_gw, [x['ALB_ID'] for x in recent_releases])]
|
||||||
|
|
||||||
|
return albums
|
||||||
|
|
||||||
|
def get_channel_new_releases(self, channel_name):
|
||||||
|
channel_data = self.get_page_gw(channel_name)
|
||||||
|
pattern = '^New.*releases$'
|
||||||
|
new_releases = next((x for x in channel_data['results']['sections'] if re.match(pattern, x['title'])), None)
|
||||||
|
if new_releases is not None:
|
||||||
|
show_all = self.get_page_gw(new_releases['target'])
|
||||||
|
albums = [x['data'] for x in show_all['results']['sections'][0]['items']]
|
||||||
|
return albums
|
||||||
|
|
||||||
|
return []
|
||||||
|
|
||||||
def get_lyrics_gw(self, sng_id):
|
def get_lyrics_gw(self, sng_id):
|
||||||
return self.gw_api_call('song.getLyrics', {'sng_id': sng_id})["results"]
|
return self.gw_api_call('song.getLyrics', {'sng_id': sng_id})["results"]
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue