python实现音乐播放和下载小程序功能


Posted in Python onApril 26, 2020

(本篇部分代码综合整理自B站,B站有手把手说明的教程)

1.网易云非付费内容爬取器(声明:由于技术十分简单,未到触犯软件使用规则的程度)驱动Edge浏览器(自己写驱动会更高端)进入界面,爬取列表中第一个音频地址并存入相应文件夹中。这里有一个最简单的爬虫程序和一个最简单的tkinter GUI编程。

注意,要先在网易云音乐网页中将第一个对应音频链接的位置定位:

python实现音乐播放和下载小程序功能

对于以上定位可通过如下方式获得(定位器):

req = driver.find_element_by_id('m-search')
 a_id = req.find_element_by_xpath('.//div[@class = "item f-cb h-flag "]/div[2]//a').get_attribute("href")

在XML语言中寻找链接路径的方法可参见find_element_by_xpath
创建目录参见makedirs

这里的GUI需要tkinter添加文本。用text控件insert(插入文本)、see(滚动)、update(更新)等方法显示正在下载和已下载图样;在get_music_name函数中,首先从输入窗口获取名称,然后调用Edge驱动访问网易云音乐主页,通过'http://music.163.com/song/media/outer/url?id={}.mp3'.format(song_id)搜到歌曲,通过上述定位器找到歌曲地址和歌名。注意到第一个函数传入的应该是字典类型(有了这种语句:song_id = item['song_id']),那就创建一个字典后在函数体内调用song_load实现下载。在这之前,驱动就完成了任务,所以可以关闭驱动。
至于Tkinter的控件内容,应该根据实际情况试错和设计,界面编程相对还是比较简单的。(分别创建标签控件、输入框、列表框、按钮,并依次确定它们在主界面中的位置)

from tkinter import *
from selenium import webdriver
global entry
import os
from urllib.request import urlretrieve
#2.下载歌曲
def song_load(item):


 song_id = item['song_id']
 song_name = item['song_name']

 song_url = 'http://music.163.com/song/media/outer/url?id={}.mp3'.format(song_id)

 #创建文件夹
 os.makedirs('music_netease',exist_ok=True)
 path = 'music_netease\{}.mp3'.format(song_name)

 #显示数据到文本框
 text.insert(END,'歌曲:{},正在下载...'.format(song_name))
 #文本框滚动
 text.see(END)
 #更新
 text.update()
 #下载
 urlretrieve(song_url,path)
 #显示数据到文本框
 text.insert(END,'歌曲:{},下载完毕'.format(song_name))
 #文本框滚动
 text.see(END)
 #更新
 text.update()
#1.搜索
def get_music_name():
 #获取输入的内容
 name = entry.get()

 url = 'https://music.163.com/#/search/m/?s={}&type=1'.format(name)
 #搜索页面

 option = webdriver.EdgeOptions()
 option.add_argument('--headless')
 #driver = webdriver.Edge(edge_options=option)

 driver = webdriver.Edge('D:\\python\\msedgedriver')

 driver.get(url)
 driver.switch_to.frame('g_iframe')
 #获取歌曲的id
 req = driver.find_element_by_id('m-search')
 a_id = req.find_element_by_xpath('.//div[@class = "item f-cb h-flag "]/div[2]//a').get_attribute("href")

 song_id = a_id.split('=')[-1]
 print(song_id)

 song_name = req.find_element_by_xpath('.//div[@class="item f-cb h-flag "]/div[2]//b').get_attribute("title")
 print(song_name)
 #构造字典
 item = {}
 item['song_id'] = song_id
 item['song_name'] = song_name
 driver.quit()
 #下载歌曲
 song_load(item)

#get_music_name()


#形象工程
# 搭建界面
#创建画板
root = Tk()

#标题
root.title('网易云下载器')
#设置窗口大小
root.geometry('560x450+400+200')
#标签控件
label = Label(root,text = '输入要下载的歌曲:',font = ('华文行楷',20))
#标签定位
label.grid()
#输入框
entry = Entry(root,font = ('楷书',20))
#定位
entry.grid(row = 0,column = 1)
#列表框
text = Listbox(root,font = ('隶书',16),width = 50, heigh = 15)
text.grid(row = 1,columnspan = 2)
#点击按钮
button = Button(root,text = '开始下载',font = ('楷书',15),command=get_music_name)
button.grid(row=2, column=0,sticky=W)

button1 = Button(root,text = '退出程序',font = ('楷书',15),command=root.quit)
button1.grid(row=2, column=1,sticky=E)
#显示当前的界面内容
root.mainloop()

运行效果

python实现音乐播放和下载小程序功能

发现music_netease文件夹中相关文件赫然在列。

python实现音乐播放和下载小程序功能

简易音乐播放器:
这个控件在界面上仍然使用Tkinter,只不过没有通过编程,而是利用pygame库中的音频模块,在逻辑上增加了上一曲、下一曲(读取上一个文件、下一个文件)、音量控制、简单的线程控制等。

import os
import tkinter
import tkinter.filedialog
import time
import threading
import pygame

#第一步 搭建界面
root = tkinter.Tk()
root.title('音乐播放器')
#窗口大小和位置
root.geometry('460x600+500+100')
#不能拉伸
root.resizable(False,False)

folder = ''#文件路径
res = []
num = 0
now_music = ''
#第二步 功能实现
def buttonChooseClik():
 '''添加文件函数'''
 global folder
 global res
 if not folder:
  folder = tkinter.filedialog.askdirectory()#选择目录
  musics = [folder + '\\' + music
     for music in os.listdir(folder) if music.endswith(('.mp3','ogg'))]
  ret = []
  for i in musics:
   ret.append(i.split('\\')[1:])
   res.append(i.replace('\\','/'))
  var2 = tkinter.StringVar()
  var2.set(ret)
  #放入列表框
  lb = tkinter.Listbox(root,listvariable =var2)
  lb.place(x=50,y=100,width=260,height=300)
 if not folder:
  return
 global playing
 playing = True

 # 根据情况禁用和启用相应的按钮
 buttonPlay['state'] = 'normal'
 buttonStop['state'] = 'normal'
 pause_resume.set('播放')


def play():
 '''播放音乐的函数'''
 #初始化混音器设备
 if len(res):
  pygame.mixer.init()
  global num
  while playing:
   if not pygame.mixer.music.get_busy():
    #随机播放一首歌曲
    nextMusic =res[num]
    print(nextMusic)
    print(num)
    pygame.mixer.music.load(nextMusic.encode())
    #播放一次
    pygame.mixer.music.play(1)
    #print(len(res)-1)
    if len(res) -1==num:
     num=0
    else:
     num = num+1
    nextMusic = nextMusic.split('\\')[1:]
    musicName.set('playing....'+''.join(nextMusic))
   else:
    time.sleep(0.1)

def bottonPlayClik():
 '''点击播放'''
 buttonNext['state'] = 'normal'
 buttonPrev['state'] = 'normal'

 if pause_resume.get() == '播放':
  pause_resume.set('暂停')
  global folder
  if not folder:
   #选择目录,返回目录名
   folder = tkinter.filedialog.askdirectory()
  if not folder:
   return
  global playing
  playing = True

  #创建线程,主线程接受用户操作

  t = threading.Thread(target=play)
  t.start()
 elif pause_resume.get() == '暂停':
  pygame.mixer.music.pause()
  pause_resume.set('继续')
 elif pause_resume.get() == '继续':
  pygame.mixer.music.unpause()
  pause_resume.set('暂停')


def bottonStopClik():
 '''停止播放'''
 global playing
 playing = False
 pygame.mixer.music.stop()
def bottonNextClik():
 '''播放下一首'''
 global playing
 playing = False
 pygame.mixer.music.stop()
 global num
 if len(res)== num:
  num = 0
 playing = True

 t = threading.Thread(target=play)
 t.start()

def bottonPrevClik():
 '''播放上一首'''
 global playing
 playing = True
 pygame.mixer.music.stop()
 global num
 if num == 0:
  num = len(res)-2
 elif num == len(res) - 1:
  num -= 2
 else:
  num -=2
 print(num)

 playing = True

 t = threading.Thread(target = play)

 t.start()

def closeWindow():
 '''关闭窗口'''
 global playing
 playing = False
 time.sleep(0.3)
 try:
  pygame.mixer.music.stop()
  pygame.mixer.quit()
 except:
  pass
 root.destroy()

def control_voice(value = 0.5):
 pygame.mixer.music.set_volume(float(value))

#关闭窗口
root.protocol('WM_DELETE_WINDOW',closeWindow)
#添加按钮
buttonChoose = tkinter.Button(root,text='添加',command=buttonChooseClik)
#布局
buttonChoose.place(x=50,y=10,width=50,height=20)
#播放按钮 跟踪变量值的变化
pause_resume = tkinter.StringVar(root,value='播放')
buttonPlay= tkinter.Button(root,textvariable=pause_resume,command=bottonPlayClik)
buttonPlay.place(x=190,y=10,width=50,height=20)
buttonPlay['state'] = 'disabled'
#停止播放
buttonStop = tkinter.Button(root,text = '停止',command=bottonStopClik)
#布局
buttonStop.place(x=120,y=10,width=50,height=20)
#状态
buttonStop['state'] = 'disabled'
# 下一首
buttonNext = tkinter.Button(root,text='下一首',command =bottonNextClik)

buttonNext.place(x=260,y=10,width=50,height=20)

buttonNext['state'] = 'disabled'

#上一首
buttonPrev = tkinter.Button(root,text='上一首',command =bottonPrevClik)
buttonPrev.place(x = 330,y=10,width=50,height=20)
buttonPrev['state'] = 'disabled'

musicName = tkinter.StringVar(root,value='暂时没有播放音乐')
labelName = tkinter.Label(root,textvariable=musicName)

labelName.place(x=10,y=30,width=260,height=20)

#添加控件
s = tkinter.Scale(root,label='音量',from_=0,to=1,orient=tkinter.HORIZONTAL,
     length=240,showvalue=0,tickinterval=2,resolution=0.1,command=control_voice)

s.place(x=50,y=50,width=200)

#启动消息循环
root.mainloop()

运行效果:

python实现音乐播放和下载小程序功能

到此这篇关于python实现音乐播放和下载小程序功能的文章就介绍到这了,更多相关python--音乐播放和下载小程序内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python实现将xml导入至excel
Nov 20 Python
在Ubuntu系统下安装使用Python的GUI工具wxPython
Feb 18 Python
Python实现监控键盘鼠标操作示例【基于pyHook与pythoncom模块】
Sep 04 Python
Python实现查找字符串数组最长公共前缀示例
Mar 27 Python
Python Flask框架模板操作实例分析
May 03 Python
Django网络框架之HelloDjango项目创建教程
Jun 06 Python
Jacobi迭代算法的Python实现详解
Jun 29 Python
django迁移数据库错误问题解决
Jul 29 Python
Django自带日志 settings.py文件配置方法
Aug 30 Python
numpy ndarray 取出满足特定条件的某些行实例
Dec 05 Python
python实现图像全景拼接
Mar 27 Python
python实现监听键盘
Apr 26 Python
使用Python内置模块与函数进行不同进制的数的转换
Apr 26 #Python
Python接口开发实现步骤详解
Apr 26 #Python
使用tensorflow框架在Colab上跑通猫狗识别代码
Apr 26 #Python
Python request使用方法及问题总结
Apr 26 #Python
Python基于paramunittest模块实现excl参数化
Apr 26 #Python
在python里创建一个任务(Task)实例
Apr 25 #Python
python 实现任务管理清单案例
Apr 25 #Python
You might like
在Windows版的PHP中使用ADO
2006/10/09 PHP
PHP中运用jQuery的Ajax跨域调用实现代码
2012/02/21 PHP
PHP函数func_num_args用法实例分析
2015/12/07 PHP
yii框架数据库关联查询操作示例
2019/10/14 PHP
阻止JavaScript事件冒泡传递(cancelBubble 、stopPropagation)
2007/05/08 Javascript
jQuery 性能优化手册 推荐
2010/02/23 Javascript
常用一些Javascript判断函数
2012/08/14 Javascript
flash遮住div问题的正确解决方法
2014/02/27 Javascript
js实现分割上传大文件
2016/03/09 Javascript
全面理解JavaScript中的闭包
2016/05/12 Javascript
BootStrap.css 在手机端滑动时右侧出现空白的原因及解决办法
2016/06/07 Javascript
jqGrid用法汇总(全经典)
2016/06/28 Javascript
js事件冒泡与事件捕获详解
2017/02/20 Javascript
10 种最常见的 Javascript 错误(频率最高)
2018/02/08 Javascript
Vue获取页面元素的相对位置的方法示例
2020/02/05 Javascript
Vue封装全局过滤器Filters的步骤
2020/09/16 Javascript
vue实现点击出现操作弹出框的示例
2020/11/05 Javascript
Python django使用多进程连接mysql错误的解决方法
2018/10/08 Python
Pycharm设置utf-8自动显示方法
2019/01/17 Python
Python Web版语音合成实例详解
2019/07/16 Python
Python基础之函数基本用法与进阶详解
2020/01/02 Python
使用Python FastAPI构建Web服务的实现
2020/06/08 Python
CSS3实现div从下往上滑入滑出效果示例
2020/04/28 HTML / CSS
丝芙兰加拿大官方网站:SEPHORA加拿大
2018/11/20 全球购物
索尼巴西商店:Sony巴西
2019/06/21 全球购物
Java模拟试题
2014/11/10 面试题
公务员个人自我评价分享
2013/11/06 职场文书
学生会个人自荐书范文
2014/02/12 职场文书
《最大的麦穗》教学反思
2014/04/17 职场文书
学校个人对照检查材料
2014/08/26 职场文书
岗位职责范本大全
2015/02/26 职场文书
优质服务标语口号
2015/12/26 职场文书
股东协议书范本2016
2016/03/21 职场文书
python opencv通过按键采集图片源码
2021/05/20 Python
欧元符号 €
2022/02/17 杂记
Python必备技巧之字符数据操作详解
2022/03/23 Python