chore: 完善返回数据

This commit is contained in:
“Folltoshe” 2023-12-10 23:47:21 +08:00
parent 92236c549a
commit a8cfd47e15
6 changed files with 119 additions and 40 deletions

View File

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

View File

@ -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({
@ -162,4 +160,8 @@ async def url(songId, quality):
raise FailedException('链接获取失败,请检查账号是否有会员或数字专辑是否购买')
elif body.status != 1:
raise FailedException('链接获取失败可能是数字专辑或者api失效')
return body.url[0]
return {
'url': body.url[0],
'quality': quality
}

View File

@ -11,20 +11,25 @@ from common import Httpx
from common.exceptions import FailedException
tools = {
'qualityMap': {
'qualityMap': {
'128k': '128kmp3',
'320k': '320kmp3',
'flac': '2000kflac',
},
'extMap': {
},
'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')

View File

@ -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')

View File

@ -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]
}

View File

@ -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']]
}