Archived
1
0
Fork 0
This repository has been archived on 2024-04-26. You can view files and clone it, but cannot push or open issues or pull requests.
akari-bot/modules/ncmusic/__init__.py

140 lines
5.8 KiB
Python
Raw Normal View History

2023-12-13 11:52:56 +00:00
from core.builtins import Bot, Plain, Image, Url
2023-06-14 14:31:21 +00:00
from core.component import module
from core.utils.image_table import image_table_render, ImageTable
2023-06-14 14:31:21 +00:00
from core.utils.http import get_url
from core.logger import logger
2023-06-14 14:31:21 +00:00
2023-06-14 14:51:37 +00:00
ncmusic = module('ncmusic',
2023-06-14 14:31:21 +00:00
developers=['bugungu', 'DoroWolf'],
2023-12-10 14:00:12 +00:00
desc='{ncmusic.help.desc}',
2023-06-14 14:31:21 +00:00
support_languages=['zh_cn'])
2023-11-28 11:11:33 +00:00
@ncmusic.handle(['search <keyword> {{ncmusic.help.search}}',
'search legacy <keyword> {{ncmusic.help.search.legacy}}'])
2023-06-14 14:31:21 +00:00
async def search(msg: Bot.MessageSession, keyword: str):
2023-09-29 05:54:37 +00:00
url = f"https://ncmusic.akari-bot.top/search?keywords={keyword}"
2023-06-14 14:31:21 +00:00
result = await get_url(url, 200, fmt='json')
2023-12-13 11:35:26 +00:00
song_count = result['result']['songCount']
2023-09-30 16:45:25 +00:00
legacy = True
2023-06-14 14:31:21 +00:00
2023-12-13 11:35:26 +00:00
if song_count == 0:
2023-06-14 14:31:21 +00:00
await msg.finish(msg.locale.t('ncmusic.message.search.not_found'))
2023-09-30 16:45:25 +00:00
songs = result['result']['songs'][:10]
2023-06-14 14:31:21 +00:00
2023-11-28 16:50:57 +00:00
if not msg.parsed_msg.get('legacy', False) and msg.Feature.image:
2023-06-14 14:31:21 +00:00
2023-09-30 16:59:24 +00:00
send_msg = [Plain(msg.locale.t('ncmusic.message.search.result') + '\n')]
2023-09-30 16:45:25 +00:00
data = [[
str(i),
song['name'] + (f" ({' / '.join(song['transNames'])})" if 'transNames' in song else ''),
f"{' / '.join(artist['name'] for artist in song['artists'])}",
f"{song['album']['name']}" + (f" ({' / '.join(song['album']['transNames'])})" if 'transNames' in song['album'] else ''),
f"{song['id']}"
] for i, song in enumerate(songs, start=1)
]
2023-06-14 14:31:21 +00:00
2023-09-30 16:45:25 +00:00
tables = ImageTable(data, [
msg.locale.t('ncmusic.message.search.table.header.id'),
msg.locale.t('ncmusic.message.search.table.header.name'),
msg.locale.t('ncmusic.message.search.table.header.artists'),
msg.locale.t('ncmusic.message.search.table.header.album'),
'ID'
])
2023-12-09 04:41:35 +00:00
img = await image_table_render(tables)
if img:
legacy = False
2023-09-30 16:45:25 +00:00
2023-12-09 04:41:35 +00:00
send_msg.append(Image(img))
2023-12-13 11:35:26 +00:00
if song_count > 10:
song_count = 10
2023-12-13 14:50:05 +00:00
send_msg.append(Plain(msg.locale.t("message.collapse", amount="10")))
2023-12-13 11:35:26 +00:00
if song_count == 1:
send_msg.append(Plain(msg.locale.t('ncmusic.message.search.confirm')))
query = await msg.wait_confirm(send_msg, delete=False)
if query:
sid = result['result']['songs'][0]['id']
2023-12-13 11:49:08 +00:00
else:
return
2023-12-13 11:35:26 +00:00
else:
2023-12-09 04:41:35 +00:00
send_msg.append(Plain(msg.locale.t('ncmusic.message.search.prompt')))
2023-12-13 10:56:27 +00:00
query = await msg.wait_reply(send_msg)
2023-12-09 04:41:35 +00:00
query = query.as_display(text_only=True)
2023-12-13 11:35:26 +00:00
if query.isdigit():
2023-12-09 04:41:35 +00:00
query = int(query)
2023-12-13 11:35:26 +00:00
if query > song_count:
await msg.finish(msg.locale.t("mod_dl.message.invalid.out_of_range"))
else:
sid = result['result']['songs'][query - 1]['id']
else:
2023-12-09 04:41:35 +00:00
await msg.finish(msg.locale.t('ncmusic.message.search.invalid.non_digital'))
2023-09-30 16:45:25 +00:00
2023-12-13 11:35:26 +00:00
await info(msg, sid)
2023-09-30 16:45:25 +00:00
if legacy:
2023-09-30 16:59:24 +00:00
send_msg = msg.locale.t('ncmusic.message.search.result') + '\n'
2023-09-30 17:06:10 +00:00
2023-09-30 16:45:25 +00:00
for i, song in enumerate(songs, start=1):
2023-09-30 17:28:39 +00:00
send_msg += f"{i}\u200B. {song['name']}"
2023-09-30 16:47:02 +00:00
if 'transNames' in song:
send_msg += f"{' / '.join(song['transNames'])}"
send_msg += f"——{' / '.join(artist['name'] for artist in song['artists'])}"
2023-12-13 11:35:26 +00:00
if song['album']['name']:
send_msg += f"{song['album']['name']}"
2023-09-30 16:47:02 +00:00
if 'transNames' in song['album']:
send_msg += f"{' / '.join(song['album']['transNames'])}"
send_msg += f"{song['id']}\n"
2023-09-30 16:45:25 +00:00
2023-12-13 11:35:26 +00:00
if song_count > 10:
song_count = 10
2023-12-13 14:50:05 +00:00
send_msg += msg.locale.t("message.collapse", amount="10")
2023-12-13 11:35:26 +00:00
if song_count == 1:
send_msg += '\n' + msg.locale.t('ncmusic.message.search.confirm')
query = await msg.wait_confirm(send_msg, delete=False)
if query:
sid = result['result']['songs'][0]['id']
2023-12-13 11:49:08 +00:00
else:
return
2023-12-13 11:37:03 +00:00
else:
2023-12-13 11:35:26 +00:00
send_msg += '\n' + msg.locale.t('ncmusic.message.search.prompt')
query = await msg.wait_reply(send_msg)
query = query.as_display(text_only=True)
if query.isdigit():
query = int(query)
if query > song_count:
await msg.finish(msg.locale.t("mod_dl.message.invalid.out_of_range"))
else:
sid = result['result']['songs'][query - 1]['id']
else:
await msg.finish(msg.locale.t('ncmusic.message.search.invalid.non_digital'))
await info(msg, sid)
2023-09-30 16:45:25 +00:00
2023-06-14 14:31:21 +00:00
@ncmusic.handle('info <sid> {{ncmusic.help.info}}')
async def info(msg: Bot.MessageSession, sid: str):
2023-09-29 05:54:37 +00:00
url = f"https://ncmusic.akari-bot.top/song/detail?ids={sid}"
2023-06-14 14:31:21 +00:00
result = await get_url(url, 200, fmt='json')
2023-12-10 14:00:12 +00:00
if result['songs']:
info = result['songs'][0]
artist = ' / '.join([ar['name'] for ar in info['ar']])
2023-12-13 11:52:56 +00:00
song_url = f"https://music.163.com/#/song?id={info['id']}"
2023-12-10 14:00:12 +00:00
send_msg = msg.locale.t('ncmusic.message.info',
2023-12-13 11:54:26 +00:00
name=info['name'],
id=info['id'],
artists=artist,
album=info['al']['name'],
album_id=info['al']['id'])
2023-12-10 14:00:12 +00:00
2023-12-13 11:52:56 +00:00
await msg.finish([Image(info['al']['picUrl']), Url(song_url), Plain(send_msg)])
2023-12-10 14:00:12 +00:00
else:
await msg.finish(msg.locale.t('ncmusic.message.info.not_found'))