2023-06-14 14:31:21 +00:00
|
|
|
|
from core.builtins import Bot, Plain, Image
|
|
|
|
|
from core.component import module
|
2023-09-30 08:19:50 +00:00
|
|
|
|
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
|
2023-10-03 06:35:09 +00:00
|
|
|
|
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-09-30 16:45:25 +00:00
|
|
|
|
legacy = True
|
2023-06-14 14:31:21 +00:00
|
|
|
|
|
|
|
|
|
if result['result']['songCount'] == 0:
|
|
|
|
|
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))
|
|
|
|
|
if len(result['result']['songs']) > 10:
|
|
|
|
|
send_msg.append(Plain(msg.locale.t('ncmusic.message.search.collapse')))
|
|
|
|
|
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)
|
|
|
|
|
try:
|
|
|
|
|
query = int(query)
|
|
|
|
|
if query > 10:
|
|
|
|
|
await msg.finish(msg.locale.t('ncmusic.message.search.invalid.out_of_range'))
|
|
|
|
|
sid = result['result']['songs'][query - 1]['id']
|
|
|
|
|
url = f"https://ncmusic.akari-bot.top/song/detail?ids={sid}"
|
|
|
|
|
info = await get_url(url, 200, fmt='json')
|
|
|
|
|
info = info['songs'][0]
|
|
|
|
|
artist = ' / '.join([ar['name'] for ar in info['ar']])
|
|
|
|
|
song_page = f"https://music.163.com/#/song?id={info['id']}"
|
2023-09-30 16:45:25 +00:00
|
|
|
|
|
2023-12-09 04:41:35 +00:00
|
|
|
|
send_msg = msg.locale.t('ncmusic.message.info',
|
|
|
|
|
name=info['name'], id=info['id'],
|
|
|
|
|
album=info['al']['name'], album_id=info['al']['id'],
|
|
|
|
|
artists=artist, detail=song_page)
|
|
|
|
|
await msg.finish([Image(info['al']['picUrl']), Plain(send_msg)])
|
|
|
|
|
except Exception:
|
|
|
|
|
await msg.finish(msg.locale.t('ncmusic.message.search.invalid.non_digital'))
|
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'])}"
|
|
|
|
|
send_msg += f"《{song['album']['name']}》"
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
if len(result['result']['songs']) > 10:
|
2023-09-30 16:48:19 +00:00
|
|
|
|
send_msg += msg.locale.t('ncmusic.message.search.collapse')
|
2023-10-03 06:35:09 +00:00
|
|
|
|
send_msg += '\n'
|
|
|
|
|
send_msg += msg.locale.t('ncmusic.message.search.prompt')
|
2023-12-13 10:56:27 +00:00
|
|
|
|
query = await msg.wait_reply(send_msg)
|
2023-10-03 06:35:09 +00:00
|
|
|
|
query = query.as_display(text_only=True)
|
|
|
|
|
try:
|
|
|
|
|
query = int(query)
|
|
|
|
|
if query > 10:
|
|
|
|
|
await msg.finish(msg.locale.t('ncmusic.message.search.invalid.out_of_range'))
|
|
|
|
|
sid = result['result']['songs'][query - 1]['id']
|
|
|
|
|
url = f"https://ncmusic.akari-bot.top/song/detail?ids={sid}"
|
|
|
|
|
info = await get_url(url, 200, fmt='json')
|
|
|
|
|
info = info['songs'][0]
|
|
|
|
|
artist = ' / '.join([ar['name'] for ar in info['ar']])
|
|
|
|
|
song_page = f"https://music.163.com/#/song?id={info['id']}"
|
|
|
|
|
|
|
|
|
|
send_msg = msg.locale.t('ncmusic.message.info',
|
|
|
|
|
name=info['name'], id=info['id'],
|
|
|
|
|
album=info['al']['name'], album_id=info['al']['id'],
|
|
|
|
|
artists=artist, detail=song_page)
|
|
|
|
|
await msg.finish([Image(info['al']['picUrl']), Plain(send_msg)])
|
|
|
|
|
except Exception:
|
|
|
|
|
await msg.finish(msg.locale.t('ncmusic.message.search.invalid.non_digital'))
|
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']])
|
|
|
|
|
song_page = f"https://music.163.com/#/song?id={info['id']}"
|
|
|
|
|
|
|
|
|
|
send_msg = msg.locale.t('ncmusic.message.info',
|
|
|
|
|
name=info['name'], id=info['id'],
|
|
|
|
|
album=info['al']['name'], album_id=info['al']['id'],
|
|
|
|
|
artists=artist, detail=song_page)
|
|
|
|
|
|
|
|
|
|
await msg.finish([Image(info['al']['picUrl']), Plain(send_msg)])
|
|
|
|
|
else:
|
|
|
|
|
await msg.finish(msg.locale.t('ncmusic.message.info.not_found'))
|