PagerMaid_Plugins/neteasemusic.py

128 lines
6.5 KiB
Python
Raw Normal View History

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()