mirror of
https://github.com/TeamPGM/PagerMaid_Plugins.git
synced 2024-11-22 02:35:34 +00:00
128 lines
6.5 KiB
Python
128 lines
6.5 KiB
Python
|
import json
|
|||
|
import requests
|
|||
|
import re
|
|||
|
from time import sleep
|
|||
|
from pagermaid.listener import listener
|
|||
|
from os import remove, path
|
|||
|
from collections import defaultdict
|
|||
|
|
|||
|
|
|||
|
@listener(is_plugin=True, outgoing=True, command="music",
|
|||
|
description="网抑云搜歌。",
|
|||
|
parameters="<指令> <关键词>")
|
|||
|
async def music(context):
|
|||
|
if len(context.parameter) < 2:
|
|||
|
await context.edit("使用方法:-music <指令> <关键词>\n(指令s为搜索,指令p为播放\n播放时关键词可填歌曲ID,此时为精准播放)")
|
|||
|
return
|
|||
|
else:
|
|||
|
keyword = ''
|
|||
|
for i in range(1, len(context.parameter)):
|
|||
|
keyword += context.parameter[i] + " "
|
|||
|
if context.parameter[0] == "s": #搜索功能
|
|||
|
await context.edit("搜索中 . . .")
|
|||
|
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063',
|
|||
|
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"}
|
|||
|
url = "http://music.163.com/api/search/pc?&s=" + keyword + "&offset=0&limit=5&type=1"
|
|||
|
for _ in range(20): #最多尝试20次
|
|||
|
status=False
|
|||
|
req = requests.request("GET", url, headers=headers)
|
|||
|
if req.status_code == 200:
|
|||
|
req = json.loads(req.content)
|
|||
|
if req['result']:
|
|||
|
info=defaultdict()
|
|||
|
for i in range(len(req['result']['songs'])):
|
|||
|
info[i]={'id':'', 'title':'', 'alias':'', 'album':'', 'artist':''}
|
|||
|
info[i]['id']=req['result']['songs'][i]['id']
|
|||
|
info[i]['title']=req['result']['songs'][i]['name']
|
|||
|
info[i]['alias']=req['result']['songs'][i]['alias']
|
|||
|
info[i]['album']=req['result']['songs'][i]['album']['name']
|
|||
|
for j in range(len(req['result']['songs'][i]['artists'])):
|
|||
|
info[i]['artist']+=req['result']['songs'][i]['artists'][j]['name'] + " "
|
|||
|
text="网易云搜索结果如下 \n"
|
|||
|
for i in range(len(info)):
|
|||
|
text+=f"{i+1}: \n歌名: {info[i]['title']} \n"
|
|||
|
if info[i]['alias']:
|
|||
|
text+=f"别名: {info[i]['alias'][0]} \n"
|
|||
|
text+=f"专辑: {info[i]['album']} \n作者: {info[i]['artist']}\n歌曲ID: {info[i]['id']} \n\n"
|
|||
|
await context.edit(text)
|
|||
|
status=True
|
|||
|
break
|
|||
|
else:
|
|||
|
await context.edit("未搜索到结果")
|
|||
|
status=True
|
|||
|
break
|
|||
|
else:
|
|||
|
continue
|
|||
|
if status is False:
|
|||
|
await context.edit("出错了呜呜呜 ~ 试了好多好多次都无法访问到 API 服务器 。")
|
|||
|
sleep(2)
|
|||
|
await context.delete()
|
|||
|
return
|
|||
|
|
|||
|
if context.parameter[0] == "p": #播放功能
|
|||
|
await context.edit("获取中 . . .")
|
|||
|
try:
|
|||
|
import eyed3
|
|||
|
imported = True
|
|||
|
except ImportError:
|
|||
|
imported = False
|
|||
|
await context.edit("获取中 . . .\n(eyeD3支持库未安装,歌曲文件信息将无法导入\n请使用-sh pip3 install eyed3安装,或自行ssh安装)")
|
|||
|
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063',
|
|||
|
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"}
|
|||
|
url = "http://music.163.com/api/search/pc?&s=" + keyword + "&offset=0&limit=1&type=1"
|
|||
|
for _ in range(20): #最多尝试20次
|
|||
|
status=False
|
|||
|
req = requests.request("GET", url, headers=headers)
|
|||
|
if req.status_code == 200:
|
|||
|
req = json.loads(req.content)
|
|||
|
if req['result']:
|
|||
|
info={'id':'', 'title':'', 'alias':'', 'album':'', 'albumpic':'', 'artist':''}
|
|||
|
info['id']=req['result']['songs'][0]['id']
|
|||
|
info['title']=req['result']['songs'][0]['name']
|
|||
|
info['alias']=req['result']['songs'][0]['alias']
|
|||
|
info['album']=req['result']['songs'][0]['album']['name']
|
|||
|
info['albumpic']=req['result']['songs'][0]['album']['picUrl']
|
|||
|
for j in range(len(req['result']['songs'][0]['artists'])):
|
|||
|
info['artist']+=req['result']['songs'][0]['artists'][j]['name'] + ";"
|
|||
|
info['artist']=info['artist'][:-1]
|
|||
|
music = requests.request("GET", "http://music.163.com/song/media/outer/url?id=" + str(info['id']) +".mp3", headers=headers)
|
|||
|
name = info['title'] + ".mp3"
|
|||
|
cap = info['artist'].replace(';',', ') + " - " + info['title']
|
|||
|
pic = requests.get(info['albumpic'])
|
|||
|
with open(name, 'wb') as f:
|
|||
|
f.write(music.content)
|
|||
|
if (path.getsize(name) / 1024) < 100:
|
|||
|
remove(name)
|
|||
|
continue
|
|||
|
if imported is True:
|
|||
|
tag = eyed3.load(name).tag
|
|||
|
tag.encoding = '\x01'
|
|||
|
tag.artist = info['artist']
|
|||
|
tag.title = info['title']
|
|||
|
tag.album = info['album']
|
|||
|
tag.images.set(3, pic.content, "image/jpeg", u'')
|
|||
|
tag.save()
|
|||
|
await context.client.send_file(
|
|||
|
context.chat_id,
|
|||
|
name,
|
|||
|
caption=cap,
|
|||
|
link_preview=False,
|
|||
|
force_document=False)
|
|||
|
try:
|
|||
|
remove(name)
|
|||
|
except:
|
|||
|
pass
|
|||
|
await context.delete()
|
|||
|
status = True
|
|||
|
break
|
|||
|
else:
|
|||
|
await context.edit("未搜索到结果")
|
|||
|
status=True
|
|||
|
break
|
|||
|
else:
|
|||
|
continue
|
|||
|
if status is False:
|
|||
|
await context.edit("出错了呜呜呜 ~ 试了好多好多次都无法访问到 API 服务器 。")
|
|||
|
sleep(2)
|
|||
|
await context.delete()
|