#需要BaseWindow.py

from BaseWindow import *

from android import rsla,jsla

from os.path import abspath

from traceback import format_exc

XML="""<?xml version="1.0" encoding="utf-8"?>

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="#5f7faf"

android:orientation="vertical"

xmlns:android="http://schemas.android.com/apk/res/android">

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:orientation="vertical"

android:layout_weight="25">

android:layout_width="fill_parent"

android:layout_height="fill_parent" >

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

android:id="@+id/Title"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:textSize="8dp"

android:text="%s"

android:textColor="#ff0000"

android:gravity="center"

/>

android:id="@+id/MusicFileName"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="%s"

android:textColor="#0000ff"

/>%s

%s

android:id="@+id/MusicTime"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_weight="0.8"

android:layout_marginLeft="10dp"

android:layout_marginRight="10dp"

/>

android:id="@+id/MusicNowTime"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text=" "

android:textColor="#007f00"

android:layout_weight="1"

/>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:orientation="horizontal"

android:layout_weight="1">

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:text="停止"

android:id="@+id/Play"

android:textSize="8dp"

android:background="#007f7f"

android:textColor="#ffffffff"

android:layout_weight="1"

android:gravity="center"/>

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:text="暂停"

android:id="@+id/Pause"

android:textSize="8dp"

android:background="#7f7f00"

android:textColor="#ffffffff"

android:layout_weight="1"

android:gravity="center"/>

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:text="退出"

android:id="@+id/Exit"

android:textSize="8dp"

android:background="#7f3f3f"

android:textColor="#ffffffff"

android:layout_weight="1"

android:gravity="center"/>

"""

LrcXml='''

android:id="@+id/MusicNowLyric"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:textSize="8dp"

android:text=" "

android:textColor="#ef7000"

android:layout_weight="0.8"

/>''','''

android:id="@+id/Lyric"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:background="#ffffff"

android:textColor="#cf00cf"

/>'''

def getSec(Dict,Name):

try:

r=Dict[Name]

except:

return '0分0.000秒',0

s,t=divmod(r,60000)

s=int(s)

t=round(t/1000,3)

return '%2d分%6.3f秒'%(s,t),r

def TxtRead(File):

m=open(File,"rb").read()

if m[0:3]==b'\xef\xbb\xbf':#UTF-8文件头

return m[3:].decode("utf-8")

else:

try:

return m.decode("utf-8")

except:

try:

return m.decode("gbk")

except:

return m.decode("utf-16")

def LrcAna(con):

global Lrc,lrcm,LrcT

con=con.splitlines()

Lrc=[]

for a in con:

b=a.rfind(']')

if b==-1:

continue

c=a[b+1:]

d=a[1:b].replace(' ','')

e=d.split('][')

for f in e:

g=colon2Time(f)

if g==-1:

continue

Lrc.append((g,c))

Lrc=sorted(Lrc)

lrcm=len(Lrc)

LrcT=[]

for a in range(lrcm):

LrcT.append(Lrc[a][0])

Lrc[a]=Lrc[a][1]

lrcm-=1

Lrc=tuple(Lrc)

LrcT=tuple(LrcT)

def shwLrc(Time):

if Time<=LrcT[0]:

k=(LrcT[0]-Time)//1000

if k<=4:

k=Dot[1]*(4-k)+Dot[0]*k

else:

k=''

v.MusicNowLyric.text=k

return

elif Time>=LrcT[lrcm]:

v.MusicNowLyric.text=Lrc[lrcm]

return

a=0;b=lrcm

while a!=b:

c=(a+b)//2

if Time

b=c

elif Time>=LrcT[c+1]:

a=c

else:

v.MusicNowLyric.text=Lrc[c]

return

else:

v.MusicNowLyric.text=Lrc[a]

def colon2Time(Time):

T=Time.split(':',1)

try:

return int(Eval(T[0])*60000+Eval(T[1])*1000)

except:

return -1

def Eval(x):

x=x.strip()

if x[0]=='0':

x=x[1:]

if x=='':

return 0

else:

return eval(x)

Dot=chr(9675),chr(9679)

def Info():

global npo

npo=v.MusicTime.progress

while True:

if rsla('mediaIsPlaying'):

s='播放中'

else:

s='未播放'

v.Play.text='播放'

v.Pause.text='继续'

Seek()

t=rsla('mediaPlayInfo')

t,i=getSec(t,'position')

ShwLrc(i)

npo=v.MusicTime.progress=str(i//1000)

v.MusicNowTime.text='%s/%s  %s'%(t,dur,s)

if s=='未播放' or v.Pause.checked=='true' or v.Play.checked=='true' or v.Exit.checked=='true':

break

def Seek():

if npo!=v.MusicTime.progress:

jsla('mediaPlaySeek',int(v.MusicTime.progress)*1000)

def Err():

v.MusicFileName.text=v.MusicFileName.text+"\n"+format_exc()

jsla('mediaPlayClose')

class MainScreen(Layout):

def on_show(self):

global v

v=self.views

v.Play.add_event(click_EventHandler(v.Play,self.play))

v.Pause.add_event(click_EventHandler(v.Pause,self.pause))

v.MusicTime.add_event(click_EventHandler(v.MusicTime,Info))

v.Exit.add_event(click_EventHandler(v.Exit,self.exit))

try:

if rsla('mediaIsPlaying'):

jsla('mediaPlayClose')

global dur

if dur:

v.Lyric.text=dur

jsla('mediaPlay',Path)

r=rsla('mediaPlayInfo')

dur,r=getSec(r,'duration')

v.MusicTime.max=str(r//1000)

Info()

except:

Err()

def on_close(self):

pass

def play(self,view,dummy):

try:

if rsla('mediaIsPlaying'):

jsla('mediaPlayClose')

else:

jsla('mediaPlay',Path)

v.Play.text='停止'

v.Pause.text='暂停'

v.Play.checked='false'

Info()

except:

Err()

def pause(self,view,dummy):

try:

if rsla('mediaIsPlaying'):

jsla('mediaPlayPause')

else:

Seek()

jsla('mediaPlayStart')

v.Pause.text='暂停'

v.Play.text='停止'

v.Pause.checked='false'

Info()

except:

Err()

def exit(self,view,dummy):

jsla('mediaPlayClose')

FullScreenWrapper2App.close_layout()

def MusicPlay(MusicPath='',Title='QPython3 Music Player'):#主函数

#音乐播放(音乐文件路径,标题)

#支持LRC歌词文件,支持无损音乐格式

#例如MusicPlay("Aa/Bb.mp3"),如果"Aa/Bb.lrc"同时存在,则两个文件会被同时导入

global Path,Path2,dur,Lrc,ShwLrc

Path=abspath(MusicPath)

Path2=MusicPath

try:

dur=TxtRead(Path[:Path.rfind('.')]+'.lrc')

LrcAna(dur)

x=Str2Xml(Title),Str2Xml(Path2),LrcXml[1],LrcXml[0]

ShwLrc=shwLrc

except:

dur='';Lrc=()

x=Str2Xml(Title),Str2Xml(Path2),'',''

ShwLrc=lambda s:None

FullScreenWrapper2App.show_layout(MainScreen(XML%x,'Music'))

FullScreenWrapper2App.eventloop()

__all__=('MusicPlay','droid')

#QPython3 Music Player by 乘着船

含LRC歌词

含LRC歌词

含LRC歌词

不含LRC歌词

支持无损音乐格式

python3 音乐播放器_Android QPython3 可视化-音乐播放:MusicPlay.py相关推荐

  1. html音乐播放器换歌,web-audio-api可视化音乐播放器,实现暂停切换歌曲功能,粉色系专场~...

    可视化的音乐播放器,可戳我观看效果 了解Web-Audio-Api 基础知识 标签是HTML5的新标签,通过添加src属性实现音乐播放. AudioContext是音频播放环境,原理与canvas的绘 ...

  2. html+css+js本地音乐播放器,实现可视化音频频谱

    效果 html+css+js本地音乐播放器,实现可视化音频频谱 前言 之前用swing写了个本地音乐播放器(如下图),但是效果一言难尽,界面丑,功能bug也多,唉 所以后面又重新用html写了个,界面 ...

  3. 仿网易云音乐html代码,仿网易云音乐外链播放器UI的HTML5音乐播放器插件

    简要教程 APlayer是一款仿网易云音乐外链播放器UI的HTML5音乐播放器插件.APlayer音乐播放器可以自定义歌曲封面,可以自定义同步歌词等,界面时尚大方,是一款非常好的HTML5音乐播放器插 ...

  4. html5自动播放音乐外链,仿网易云音乐外链播放器UI的HTML5音乐播放器插件

    APlayer是一款仿网易云音乐外链播放器UI的HTML5音乐播放器插件.APlayer音乐播放器可以自定义歌曲封面,可以自定义同步歌词等,界面时尚大方,是一款非常好的HTML5音乐播放器插件. 安装 ...

  5. html制作在线视频音乐播放器,用html5制作音乐播放器,这3款就足够了!

    用HTML5结合Jquery做一个简易版的音乐播放器 代码展示: 三生草 var sum = 1; function ssss(a) { var s = document.getElementById ...

  6. android音乐播放器文章,Android论文音乐播放器文章.doc

    毕业论文毕业设计开题报告论文报告设计报告可行性研究报告 移动互联网开发 结业论文设计 学生姓名: 黄敏 学 号: k031241508 班 级: k0312415 论文题目: 音乐播放器 摘要: 当今 ...

  7. 基于android的音乐播放器毕业设计,基于android音乐播放器的毕业设计ppt

    <基于android音乐播放器的毕业设计ppt>由会员分享,可在线阅读,更多相关<基于android音乐播放器的毕业设计ppt(29页珍藏版)>请在人人文库网上搜索. 1.1. ...

  8. android 音乐播放器设计,基于Android音乐播放器设计的实现毕业论文.pdf

    摘要 随着手机的智能化以及网络的普及和应用,人类将进入移动互联 网的新时代.在国内,随着4G牌照的下发,三大运行商也在加紧抢 占移动互联网领域的制高点.在此过程中,人们对新一代移动互联终 端设备的功能 ...

  9. 单片机音乐播放器课程设计C语言,单片机音乐播放器课程设计中音乐代码怎么弄...

    单片机音乐播放器课程设计中音乐代码怎么弄 答案:2  信息版本:手机版 解决时间 2019-10-06 13:16 已解决 2019-10-06 02:07 单片机音乐播放器课程设计中音乐代码怎么弄 ...

最新文章

  1. scrapy 模块功能流程--转
  2. 5分钟快速掌握 Python 定时任务框架
  3. qldump 备份所有表_MySQL中的备份和恢复是怎样执行的?
  4. X86汇编语言从实模式到保护模式08:中断和动态时钟显示
  5. Gradle学习之闭包
  6. win7字体安装_PR CC 下载和安装教程
  7. 生物信息分析中的reads是什么
  8. AADL Inspector 故障树安全分析模块
  9. adb devices后出现设备offline的解决方法
  10. java自行车DH32,中国国际自行车嘉年华之Enduro、DH装备篇
  11. 2020版熊猫金币解读及购买方式
  12. excel表格内文字怎么换行_Excel单元格内如何换行,这几招快拿小本本记下来
  13. 2006-09-28 墨子的双眼皮
  14. 16999元!华为Mate X终于发布了!附上手视频
  15. 易周金融 | 邮惠万家银行开业;微信公众号叫停四类金融营销宣传
  16. 在git clone报错
  17. 易地推招生拓客分享:如何让社群招生成为培训机构招生利器?
  18. 《计算机网络-谢希仁》读书笔记---概述
  19. Macbook M1 软件不兼容的解决办法
  20. 驱动程序之_3_网络设备_3_网卡驱动移植

热门文章

  1. 可视化不确定网络的概率图布局方法
  2. 4-20mA、0-5v模拟信号隔离器(光电)、安全栅、0-10v信号变送器
  3. 【openfire,smack使用总结】--Smack库的使用
  4. opencv resize方法总结
  5. 还原数据库bak文件
  6. Pycharm更换国内源(最新版无mange repositories)
  7. Github查看代码小技巧
  8. 趣头条“花钱买用户”?你看懂趣头条真正玩法了吗
  9. 趣头条——前区块链时代一次不成功的实验
  10. 普京称:一旦美国向乌提供爱国者防空系统,俄罗斯将100% 摧毁它们,如何解读其表态?...