diff --git a/modules/__init__.py b/modules/__init__.py index 49ff45b..55e1d72 100644 --- a/modules/__init__.py +++ b/modules/__init__.py @@ -49,16 +49,21 @@ sourceExpirationTime = { async def handleApiRequest(command, source, songId, quality): - if (source == "kg"): - songId = songId.lower() try: - c = config.getCache('urls', f'{source}_{songId}_{quality}') - if c: - logger.debug(f'使用缓存的{source}_{songId}_{quality}数据,URL:{c["url"]}') + cache = config.getCache('urls', f'{source}_{songId}_{quality}') + if cache: + logger.debug(f'使用缓存的{source}_{songId}_{quality}数据,URL:{cache["url"]}') return { 'code': 0, 'msg': 'success', - 'data': c['url'], + 'data': { + 'url': cache['url'], + 'cache': True, + 'quality': { + 'target': quality, + 'result': quality, + } + }, } except: logger.error(traceback.format_exc()) @@ -71,18 +76,33 @@ async def handleApiRequest(command, source, songId, quality): 'data': None, } try: - url = await func(songId, quality) - logger.debug(f'获取{source}_{songId}_{quality}成功,URL:{url}') + result = await func(songId, quality) + logger.debug(f'获取{source}_{songId}_{quality}成功,URL:{result['url']}') + + canExpire = sourceExpirationTime[source]['expire'] + expireTime = sourceExpirationTime[source]['time'] + int(time.time()) config.updateCache('urls', f'{source}_{songId}_{quality}', { - "expire": sourceExpirationTime[source]['expire'], - "time": sourceExpirationTime[source]['time'] + int(time.time()), - "url": url, + "expire": canExpire, + "time": expireTime, + "url": result['url'], }) - logger.debug(f'缓存已更新:{source}_{songId}_{quality}, URL:{url}, expire: {sourceExpirationTime[source]["time"] + int(time.time())}') + logger.debug(f'缓存已更新:{source}_{songId}_{quality}, URL:{result['url']}, expire: {expireTime}') + return { 'code': 0, 'msg': 'success', - 'data': url, + 'data': { + 'url': result['url'], + 'cache': False, + 'quality': { + 'target': quality, + 'result': result['quality'], + }, + 'expire': { + 'time': expireTime, + 'canExpire': canExpire, + }, + }, } except FailedException as e: return { diff --git a/modules/kg/__init__.py b/modules/kg/__init__.py index c1cea82..31e07b5 100644 --- a/modules/kg/__init__.py +++ b/modules/kg/__init__.py @@ -63,7 +63,6 @@ def signRequest(url, params, options): return Httpx.request(url, options) def getKey(hash_): - # print(hash_ + tools.pidversec + tools.appid + tools.mid + tools.userid) return utils.createMD5(hash_.lower() + tools.pidversec + tools.appid + tools.mid + tools.userid) async def getMusicInfo(hash_): @@ -120,7 +119,7 @@ async def url(songId, quality): 'album_id': albumid, 'userid': tools.userid, 'area_code': 1, - 'hash': thash.lower(), + 'hash': thash, 'module': '', 'mid': tools.mid, 'appid': tools.appid, @@ -142,7 +141,6 @@ async def url(songId, quality): } if (tools.version == 'v5'): params['quality'] = tools.qualityMap[quality] - # print(params.quality) if (tools.version == "v4"): params['version'] = tools.clientver headers = createObject({ @@ -155,11 +153,15 @@ async def url(songId, quality): headers['x-router'] = tools['x-router']['value'] req = signRequest(tools.url, params, {'headers': headers}) body = createObject(req.json()) - + if body.status == 3: raise FailedException('该歌曲在酷狗没有版权,请换源播放') elif body.status == 2: raise FailedException('链接获取失败,请检查账号是否有会员或数字专辑是否购买') elif body.status != 1: raise FailedException('链接获取失败,可能是数字专辑或者api失效') - return body.url[0] + + return { + 'url': body.url[0], + 'quality': quality + } diff --git a/modules/kw/__init__.py b/modules/kw/__init__.py index 5ab41bd..c652e55 100644 --- a/modules/kw/__init__.py +++ b/modules/kw/__init__.py @@ -11,20 +11,25 @@ from common import Httpx from common.exceptions import FailedException tools = { -'qualityMap': { - '128k': '128kmp3', - '320k': '320kmp3', - 'flac': '2000kflac', -}, -'extMap': { - '128k': 'mp3', - '320k': 'mp3', - 'flac': 'flac', -} + 'qualityMap': { + '128k': '128kmp3', + '320k': '320kmp3', + 'flac': '2000kflac', + }, + 'qualityMapReverse': { + '128': '128k', + '320': '320k', + '2000': 'flac', + }, + 'extMap': { + '128k': 'mp3', + '320k': 'mp3', + 'flac': 'flac', + } } async def url(songId, quality): - target_url = f'''https://bd-api.kuwo.cn/api/service/music/downloadInfo/{songId}?isMv=0&format={tools['extMap'][quality]}&br={tools['qualityMap'][quality]}&level=''' + target_url = f'''https://bd-api.kuwo.cn/api/service/music/downloadInfo/{songId}?isMv=0&format={tools['extMap'][quality]}&br={tools['qualityMap'][quality]}''' req = Httpx.request(target_url, { 'method': 'GET', 'headers': { @@ -39,8 +44,14 @@ async def url(songId, quality): }) try: body = req.json() - if (body['code'] != 200) or (body['data']['audioInfo']['bitrate'] == 1): + data = body['data'] + + if (body['code'] != 200) or (data['audioInfo']['bitrate'] == 1): raise FailedException('failed') - return body['data']['url'].split('?')[0] + + return { + 'url': data['url'].split('?')[0], + 'quality': tools['qualityMapReverse'][data['audioInfo']['bitrate']] + } except: raise FailedException('failed') \ No newline at end of file diff --git a/modules/mg/__init__.py b/modules/mg/__init__.py index 1f5c958..6dea691 100644 --- a/modules/mg/__init__.py +++ b/modules/mg/__init__.py @@ -20,6 +20,12 @@ tools = { 'flac': 'SQ', 'flac24bit': 'ZQ', }, + 'qualityMapReverse': { + 'PQ': '128k', + 'HQ': '320k', + 'SQ': 'flac', + 'ZQ': 'flac24bit', + }, 'token': config.read_config('module.mg.user.token'), 'aversionid': config.read_config('module.mg.user.aversionid'), 'useragent': config.read_config('module.mg.user.useragent'), @@ -42,9 +48,14 @@ async def url(songId, quality): }) try: body = req.json() - # print((body['data']['url'])) - if ((not int(body['code']) == 0) or ( not body['data']['url'])): + data = body['data'] + + if ((not int(body['code']) == 0) or ( not data['url'])): raise FailedException('failed') - return body['data']['url'].split('?')[0] + + return { + 'url': data['url'].split('?')[0], + 'quality': tools['qualityMapReverse'][data['audioFormatType']], + } except: raise FailedException('failed') \ No newline at end of file diff --git a/modules/tx/__init__.py b/modules/tx/__init__.py index 73faa9f..f7fcee9 100644 --- a/modules/tx/__init__.py +++ b/modules/tx/__init__.py @@ -43,6 +43,14 @@ tools = createObject({ "h": "AI00", } }, + 'qualityMapReverse': { + 'M500': '128k', + 'M800': '320k', + 'F000': 'flac', + 'RS01': 'flac24bit', + 'Q000': 'dolby', + 'AI00': 'master' + }, "key": config.read_config("module.tx.user.qqmusic_key"), "loginuin": config.read_config("module.tx.user.uin"), "guid": config.read_config("module.tx.vkeyserver.guid"), @@ -107,8 +115,20 @@ async def url(songId, quality): }, } req = signRequest(requestBody) - body = CreateObject(req.json()) - # js const { purl } = data.req_0.data.midurlinfo[0] - if (not body.req_0.data.midurlinfo[0]['purl']): + body = createObject(req.json()) + data = body.req_0.data.midurlinfo[0] + url = data['purl'] + + if (not url): raise FailedException('failed') - return tools.cdnaddr + body.req_0.data.midurlinfo[0]['purl'] + + try: + resultQuality = data['filename'].split('.')[0].replace(data['songmid'], '') + except: + resultQuality = None + + return { + 'url': tools.cdnaddr + url, + 'quality': tools.qualityMapReverse[resultQuality] + } + diff --git a/modules/wy/__init__.py b/modules/wy/__init__.py index 67aa6de..2851502 100644 --- a/modules/wy/__init__.py +++ b/modules/wy/__init__.py @@ -23,6 +23,15 @@ tools = { "sky": "jysky", "master": "jymaster", }, + 'qualityMapReverse': { + 'standard': '128k', + 'exhigh': '320k', + 'lossless': 'flac', + 'hires': 'flac24bit', + "jyeffect": "dolby", + "jysky": "sky", + "jymaster": "master", + }, 'cookie': config.read_config('module.wy.user.cookie'), } @@ -43,7 +52,13 @@ async def url(songId, quality): body = json.loads(req.text) if (not body.get("data") or (not body.get("data")) or (not body.get("data")[0].get("url"))): raise FailedException("failed") + + data = body["data"][0] if (config.read_config('module.wy.reject_unmatched_quality')): - if (body['data'][0]['level'] != tools['qualityMap'][quality]): + if (data['level'] != tools['qualityMap'][quality]): raise FailedException("reject unmatched quality") - return body["data"][0]["url"].split("?")[0] + + return { + 'url': data["url"].split("?")[0], + 'quality': tools['qualityMapReverse'][data['level']] + }