python 基于wx实现音乐播放
#-*-coding:utf-8-*-
"""
CreatedonSatApr2518:15:362020
@author:Administrator
"""
importrequests
importbinascii
importjson
importdatetime
importtraceback
fromCrypto.CipherimportAES
fromtkinterimport*
FAKE_HEADERS={
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',#noqa
'Accept-Charset':'UTF-8,*;q=0.5',
'Accept-Encoding':'gzip,deflate,sdch',
'Accept-Language':'en-US,en;q=0.8',
'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64;rv:60.0)Gecko/20100101Firefox/60.0',#noqa
'referer':'https://www.google.com'
}
defnetease_search(keyword)->list:
'''从网易云音乐搜索'''
count=30
eparams={
'method':'POST',
'url':'http://music.163.com/api/cloudsearch/pc',
'params':{
's':keyword,
'type':1,
'offset':0,
'limit':count
}
}
data={'eparams':encode_netease_data(eparams)}
s=requests.Session()
s.headers.update(FAKE_HEADERS)
s.headers.update({
'referer':'http://music.163.com/',
})
r=s.post('http://music.163.com/api/linux/forward',data=data)
j=r.json()
music_list=[]
ID=0
try:
forminj['result']['songs']:
ifm['privilege']['fl']==0:
#没有版权
continue
#获得歌手名字
singers=[]
forsingerinm['ar']:
singers.append(singer['name'])
#获得最优音质的文件大小
ifm['privilege']['fl']>=320000and'h'inm.keys()andm['h']:
#有时候即使>=320000,h属性依然为None
size=m['h']['size']
elifm['privilege']['fl']>=192000and'm'inm.keys()andm['m']:
size=m['m']['size']
else:
size=m['l']['size']
music={
'title':m['name'],
'id':m['id'],
'duration':str(datetime.timedelta(seconds=int(m['dt']/1000))),
'singer':'、'.join(singers),
'album':m['al']['name'],
'size':round(size/1048576,2),
'source':'netease'
}
music=[]
print(m['name'])
music.append(ID)
music.append(m['name'])
music.append('、'.join(singers))
href="http://music.163.com/song/media/outer/url?id="rel="externalnofollow"+str(m['id'])+".mp3"
print(href)
music.append(href)
music.append(m['id'])
music_list.append(music)
ID=ID+1
exceptException:
#如果是详细模式则输出详细错误信息
#err=traceback.format_exc()ifglovar.get_option('verbose')elsestr(e)
#raiseDataError(err)
pass
returnmusic_list
defencode_netease_data(data)->str:
data=json.dumps(data)
key=binascii.unhexlify('7246674226682325323F5E6544673A51')
encryptor=AES.new(key,AES.MODE_ECB)
#补足data长度,使其是16的倍数
pad=16-len(data)%16
fix=chr(pad)*pad
byte_data=(data+fix).encode('utf-8')
returnbinascii.hexlify(encryptor.encrypt(byte_data)).upper().decode()
defQQ_search(keyword):
importurllib.parseasparse
fromurllib.requestimporturlretrieve
importrequests
importjson
importos
importtime
importsys
w=parse.urlencode({'w':keyword})
url='https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=63229658163010696&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=30&%s&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0'%(w)
content=requests.get(url=url)
str_1=content.text
dict_1=json.loads(str_1)
song_list=dict_1['data']['song']['list']
str_3='''https://u.y.qq.com/cgi-bin/musicu.fcg?-=getplaysongvkey5559460738919986&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0&data={"req":{"module":"CDN.SrfCdnDispatchServer","method":"GetCdnDispatch","param":{"guid":"1825194589","calltype":0,"userip":""}},"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"1825194589","songmid":["%s"],"songtype":[0],"uin":"0","loginflag":1,"platform":"20"}},"comm":{"uin":0,"format":"json","ct":24,"cv":0}}'''
ID=0
music_list=[]
url_list=[]
foriinrange(len(song_list)):
#music_name.append(song_list[i]['name']+'-'+song_list[i]['singer'][0]['name'])
#print('{}.{}-{}'.format(i+1,song_list[i]['name'],song_list[i]['singer'][0]['name']))
url_list.append(str_3%(song_list[i]['mid']))
#
#print(url_list[id-1])
music=[]
#print(m['songname'])
music.append(ID)
music.append(song_list[i]['name'])
music.append(song_list[i]['singer'][0]['name'])
content_json=requests.get(url=url_list[ID])
dict_2=json.loads(content_json.text)
url_ip=dict_2['req']['data']['freeflowsip'][1]
purl=dict_2['req_0']['data']['midurlinfo'][0]['purl']
href=url_ip+purl
music.append(href)
music.append(song_list[i]['mid'])
music_list.append(music)
ID=ID+1
returnmusic_list
importwx
importtime
defmusic_play(arr):
print("双击函数已启动")
#必须加上全局变量,否则不唱歌
globalmp3
importmp3play
path="http://m10.music.126.net/20200414222927/e509cfbb086d358e701e6bb5cfedfeaa/ymusic/0759/030f/540b/039ace5c004ebd382de4ca163145cf9b.mp3"
path=arr[3]
print("path:-->"+path)
mp3=mp3play.load(path)
mp3.play()
defmusic_pyplay(arr):
importos
importtime
importpygame
source_file_path=arr[3]
pygame.mixer.init()
pygame.mixer.music.load(source_file_path)
pygame.mixer.music.set_volume(0.5)
pygame.mixer.music.play(-1)
classMyFrame(wx.Frame):
def__init__(self):
wx.Frame.__init__(self,None,-1,'ButtonExample',
size=(1300,700),pos=(-10,0))
panel=wx.Panel(self,-1)
panel.SetSize(1300,700)
panel.SetBackgroundColour("#D2B48C")
self.sousuotxt=wx.TextCtrl(panel,pos=(0,0),size=(100,30))
lblList=['网易','QQ','酷狗']
self.rbox=wx.RadioBox(panel,label='',pos=(100,-15),size=(100,30),choices=lblList,majorDimension=1,style=wx.RA_SPECIFY_ROWS)
self.rbox.Bind(wx.EVT_RADIOBOX,self.onRadioBox)
self.button=wx.Button(panel,-1,"搜索",pos=(350,0))
self.Bind(wx.EVT_BUTTON,self.OnClick,self.button)
self.mylove=wx.Button(panel,-1,"同步我喜欢的音乐",pos=(500,0))
self.Bind(wx.EVT_BUTTON,self.Dmylove,self.mylove)
languages=[]
foriinrange(1000):
languages.append(str(i))
self.choice=wx.Choice(panel,choices=languages,pos=(0,30))
self.choice.SetStringSelection("0")
self.button5=wx.Button(panel,-1,"本地文件",pos=(50,30))
self.Bind(wx.EVT_BUTTON,self.OnButton,self.button5)
self.button1=wx.Button(panel,-1,"播放",pos=(150,30))
self.Bind(wx.EVT_BUTTON,self.OnClick1,self.button1)
self.button2=wx.Button(panel,-1,"暂停",pos=(250,30))
self.Bind(wx.EVT_BUTTON,self.OnClick2,self.button2)
self.button3=wx.Button(panel,-1,"下载",pos=(350,30))
self.Bind(wx.EVT_BUTTON,self.OnClick3,self.button3)
font=wx.Font(15,wx.DEFAULT,wx.FONTSTYLE_NORMAL,wx.NORMAL)
self.music_ID=wx.StaticText(panel,label="ID",pos=(0,100),size=(30,500),style=wx.ALIGN_CENTER)
self.music_ID.SetBackgroundColour("#D2B48C")
self.music_ID.SetFont(font)
self.music_name=wx.StaticText(panel,label="歌名",pos=(30,100),size=(400,500),style=wx.ALIGN_CENTER)
self.music_name.SetBackgroundColour("#D2B48C")
self.music_name.SetFont(font)
languages=[]
foriinrange(1,100):
languages.append("第"+str(i)+"页")
self.pagenum=wx.Choice(panel,choices=languages,pos=(50,600))
self.pagenum.SetStringSelection("第1页")
self.button4=wx.Button(panel,-1,"跳转",pos=(150,600))
self.Bind(wx.EVT_BUTTON,self.OnClick4,self.button4)
self.prepage=wx.Button(panel,-1,"上一页",pos=(250,600))
self.Bind(wx.EVT_BUTTON,self.PrePage,self.prepage)
self.nextpage=wx.Button(panel,-1,"下一页",pos=(350,600))
self.Bind(wx.EVT_BUTTON,self.NextPage,self.nextpage)
self.path="D://downmusic/歌曲"
self.music_arr=[]
self.getfile()
self.setData()
self.key1="本地音乐"
defonRadioBox(self,event):
#print(self.rbox.GetStringSelection(),'isclickedfromRadioBox')
pass
defOnClick(self,event):
self.rbox.GetStringSelection()
print(self.rbox.GetStringSelection())
rboxtext=self.rbox.GetStringSelection()
ifrboxtext=="网易":
s=self.sousuotxt.GetValue()
self.music_arr=netease_search(s)
print(self.music_arr)
self.setData()
print("搜索")
self.key1="在线音乐"
elifrboxtext=="QQ":
s=self.sousuotxt.GetValue()
self.music_arr=QQ_search(s)
print(self.music_arr)
self.setData()
print("搜索")
self.key1="在线音乐"
else:
pass
#播放
defOnClick1(self,event):
#self.button1.SetLabel("Clicked")
print("播放")
y=self.choice.GetStringSelection()
foriinself.music_arr:
ify==str(i[0]):
ifself.key1=="在线音乐":
music_play(i)
else:
self.music_pyplay(i)
defmusic_pyplay(self,arr):
importos
importtime
importpygame
source_file_path=arr[3]
pygame.mixer.init()
pygame.mixer.music.load(source_file_path)
pygame.mixer.music.set_volume(0.5)
pygame.mixer.music.play(-1)
importos
path="D://downmusic/歌词/"
importpygame
importtime
importos
f_url=""
ifarr[2]=="sen":
f_url=path+str(arr[1])+".lrc"
else:
f_url=path+str(arr[1])+"-"+str(arr[2])+".lrc"
f=open(f_url)
s=""
foriinf.readlines():
ifi[1]!="0":
pass
else:
s=s+i
print(s)
f.close()
strLrc=s
f.close()
dictLrc={}
#对歌词进行按行切割
lineListLrc=strLrc.splitlines()
#遍历每一行歌词
geci=""
forlineLrcinlineListLrc:
#时间和歌词分开
listLrc=lineLrc.split("]")
timeLrc=listLrc[0][1:].split(':')
#转换时间格式
times=float(timeLrc[0])*60+float(timeLrc[1])
#把时间当做key,歌词当做value存放在字典中
dictLrc[times]=listLrc[1]
geci=geci+listLrc[1]+"\n"
tempTime=0
#音频初始化
root=Tk()#初始化Tk()
root.overrideredirect(True)#隐藏标题栏
root.title("label-test")#设置窗口标题
root.geometry("1300x800+0+0")#设置窗口大小注意:是x不是*
root.resizable(width=True,height=True)#设置窗口是否可以变化长/宽,False不可变,True可变,默认为True
l=Label(root,text="label",bg="pink",font=("Arial",60),width=300,height=800)
l["text"]="wusen"
#加载音频文件路径(路径必须真实存在,音频文件格式支持mp3/ogg等格式)
forkeyindictLrc.keys():
tempTime=key-tempTime
#判断是否在播放音乐
ifnotpygame.mixer.music.get_busy():
pygame.mixer.music.play()
#歌词显示的时间
time.sleep(tempTime)
#显示歌词
print(dictLrc[key])
tempTime=key
importtime
#time.sleep(1)
#music_IRC.SetLabel(time.strftime("%H:%M:%S",time.localtime(time.time())))
print(time.strftime("%H:%M:%S",time.localtime(time.time())))
#l["text"]=time.strftime("%H:%M:%S",time.localtime(time.time()))
l["text"]=dictLrc[key]
l.pack(side=TOP)
l.update()
root.destroy()
#print(s)
#暂停
defOnClick2(self,event):
#self.button2.SetLabel("Clicked")
print("暂停")
#下载
defOnClick3(self,event):
y=self.choice.GetStringSelection()
#self.button3.SetLabel("Clicked")
print("下载")
print(y)
foriinself.music_arr:
ify==str(i[0]):
self.down_music(i)
#跳转
defdown_music(self,arr):
self.rbox.GetStringSelection()
print(self.rbox.GetStringSelection())
rboxtext=self.rbox.GetStringSelection()
ifrboxtext=="网易":
headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/79.0.3945.130Safari/537.36'}
importrequests
url=arr[3]
name=str(arr[1])+"-"+str(arr[2])
res=requests.get(url,headers=headers)
print(res)
m=res.content
mv=open("D://downmusic/歌曲/"+name+".mp3","wb")
mv.write(m)
mv.close()
#下载歌词
importrequests
importjson
importos
url='http://music.163.com/api/song/lyric?'+'id='+str(arr[4])+'&lv=1&kv=1&tv=-1'
r=requests.get(url,headers=headers)
json_obj=r.text
print(r.text)
print(url)
j=json.loads(json_obj)
print(j['lrc']['lyric'])
f=open("D://downmusic/歌词/"+name+".lrc","w")
f.write(j['lrc']['lyric'])
f.close()
elifrboxtext=="QQ":
headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/79.0.3945.130Safari/537.36'}
importrequests
url=arr[3]
name=str(arr[1])+"-"+str(arr[2])
res=requests.get(url,headers=headers)
print(res)
m=res.content
QQmusicpath="D://downmusic/歌曲/"+name+".mp3"
mv=open(QQmusicpath,"wb")
mv.write(m)
mv.close()
importos
s="e://python/ffmpeg-20200403-52523b6-win64-static/bin/ffmpeg-iD://downmusic/歌曲/a.mp3"+QQmusicpath
os.system(s)
os.remove("D://downmusic/歌曲/a.mp3")
#下载歌词
pass
else:
pass
defOnClick4(self,event):
self.setData()
#刷新页面赋值内容
defsetData(self):
y=self.pagenum.GetStringSelection()
#self.button4.SetLabel("Clicked")
print("跳转")
print(y)
ID=""
name=""
singer=""
foriinself.music_arr[(int(y[1:-1])-1)*10:(int(y[1:-1])-1)*10+10]:
ID=ID+str(i[0])+"\n"+"----\n"
name=name+str(i[1])+"-"+str(i[2])+"\n"+"------------------------------------------------------------------------------------------\n"
#singer=singer+str(i[2])+"\n"+"----------\n"
self.music_ID.SetLabel(ID)
self.music_name.SetLabel(name)
#self.music_singer.SetLabel(singer)
defgetfile(self):
self.music_arr.clear()
importos
local_url=self.path+"/"
ifos.path.isdir(local_url):
pass
else:
os.mkdir(local_url)
print("路径已创建")
file=os.listdir(self.path)
j=0
foriinfile:
k=[]
music_name=i[:-4].split("-",1)[0]
try:
music_singer=i[:-4].split("-",1)[1]
except:
music_singer="sen"
music_ID="0"
music_edition="本地歌曲"
music_url=self.path+"/"+i
k.append(j)
k.append(music_name)
k.append(music_singer)
k.append(music_url)
k.append(music_edition)
print(j)
print(music_name)
print(music_singer)
print(music_url)
print(music_edition)
print("----------")
self.music_arr.append(k)
j=j+1
self.key1="本地音乐"
#选择本地文件
defOnButton(self,event):
""""""
dlg=wx.DirDialog(self,u"选择文件夹",style=wx.DD_DEFAULT_STYLE)
ifdlg.ShowModal()==wx.ID_OK:
print(dlg.GetPath())#文件夹路径
self.path=dlg.GetPath()
dlg.Destroy()
self.getfile()
self.setData()
#下一页
defNextPage(self,event):
y=self.pagenum.GetStringSelection()
self.pagenum.SetStringSelection("第"+str(int(y[1:-1])+1)+"页")
self.setData()
#上一页
defPrePage(self,event):
y=self.pagenum.GetStringSelection()
self.pagenum.SetStringSelection("第"+str(int(y[1:-1])-1)+"页")
self.setData()
defDmylove(self,event):
#同步网易云音乐
importrequests
frombs4importBeautifulSoup
importurllib.request
fromlxmlimporthtml
etree=html.etree
#这里是设置请求头
headers={
'Referer':'http://music.163.com/',
'Host':'music.163.com',
'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/62.0.3202.75Safari/537.36',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
}
#歌单的url地址这里改id
play_url='http://music.163.com/playlist?id=587771511'
s=requests.session()
response=s.get(play_url,headers=headers).content
#使用bs4匹配出对应的歌曲名称和地址
s=BeautifulSoup(response,'lxml')
main=s.find('ul',{'class':'f-hide'})
#print(main.find_all('a'))
lists=[]
formusicinmain.find_all('a'):
list=[]
#print('{}:{}'.format(music.text,music['href']))
musicUrl='http://music.163.com/song/media/outer/url'+music['href'][5:]+'.mp3'
musicName=music.text
#单首歌曲的名字和地址放在list列表中
list.append(musicName)
list.append(musicUrl)
list.append(music['href'][9:])
#全部歌曲信息放在lists列表中
lists.append(list)
#下载列表中的全部歌曲,并以歌曲名命名下载后的文件,文件位置为当前文件夹
foriinlists:
url=i[1]
name=i[0]
try:
importos
ifos.path.exists("d:/downmusic/歌曲/"+name+".mp3"):
pass
else:
print('正在下载',name)
#这里修改路径,随便指定盘符,但是得存在
urllib.request.urlretrieve(url,'d:/downmusic/歌曲/%s.mp3'%name)
importrequests
importjson
url='http://music.163.com/api/song/lyric?'+'id='+str(i[2])+'&lv=1&kv=1&tv=-1'
r=requests.get(url,headers=headers)
json_obj=r.text
print(r.text)
print(url)
j=json.loads(json_obj)
print(j['lrc']['lyric'])
f=open("d://downmusic/歌词/"+name+".lrc","w")
f.write(j['lrc']['lyric'])
f.close()
print('下载成功')
except:
print('下载失败')
if__name__=='__main__':
app=wx.PySimpleApp()
frame=MyFrame()
frame.Show()
app.MainLoop()
#
#pyinstaller-D-wWX音乐播放器.py-pD:/anaconda/Lib/site-packages
#pyinstaller-DWX音乐播放器.py-pD:/anaconda/Lib/site-packages
#
#pyinstaller-DWX音乐播放器.py
以上就是python基于wx实现音乐播放的详细内容,更多关于python音乐播放的资料请关注毛票票其它相关文章!