加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

终端播放音乐同步显示本地或网络歌词

发布时间:2020-12-17 17:30:48 所属栏目:Python 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 #!/usr/bin/python# -*- encoding:utf-8 -*-#=========================================# Filename : music.py# Filetype : Python# Author : Colben

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

#!/usr/bin/python
# -*- encoding:utf-8 -*-
#=========================================
# Filename : music.py
# Filetype : Python
# Author   : Colben
# Create   : 2015-08-04 20:50:17
#=========================================

import sys,os,time,subprocess,re,chardet,urllib2,json,threading

def load_lrc(lrc_basename):
    try:
        lrc_contains = open(lrc_basename+'.lrc','rb').read()
    except:
        print '33[4;0H33[Kt Local lrc not found,checking internet ...'
        try:
            lrc_contains = urllib2.urlopen(json.loads(urllib2.urlopen('http://geci.me/api/lyric/'+os.path.split(lrc_basename)[1]).read())['result'][0]['lrc']).read()
        except Exception,e:
            print '33[4;0H33[Kt Lrc not found ...'
            return
    try:
        lrc_fp.close()
    except:
        pass
    encoding = chardet.detect(lrc_contains)['encoding']
    if 'utf-8' != encoding:
        lrc_contains = lrc_contains.decode(encoding).encode('utf-8')
    for eachline in re.split(r'n',lrc_contains):
        line = re.split(r']',eachline)
        if 1 < len(line):
            for tm in line[0:-1]:
                try:
                    time = re.match(r'(dd)s*:s*(dd)',tm.strip(' [')).groups()
                    pos = 60*int(time[0]) + int(time[1])
                    lrc[pos] = line[-1]
                except Exception,e:
                    pass
    return

def main(song):
    global lrc
    lrc = {}
    print '33[2J33[2;0HtPlaying %s ...'%song[:60]
    try:
        p = subprocess.Popen('mplayer %s 2>&1'%song,stdout = subprocess.PIPE,shell = True)
    except Exception,e:
        print '33[9;0Ht%s'%e
        p.kill()
        return 1

    while True:
        match = re.match(r'A:.*[d:.()]* of (d+)',p.stdout.read(30))
        if None != p.poll():
            print '33[9;0HtFailed to recognize file format .'
            return 1
        if not match:
            output = p.stdout.readline()
        else:
            tot_time = int(match.group(1)) - 1
            for jump in range(1,10):
                if 70 >= tot_time/jump:
                    break
            #print '33[15;0Httotal time: %d'%tot_time
            break
    print '33[?25l'
    thread_load_lrc = threading.Thread(target = load_lrc,args = (os.path.splitext(song)[0],))
    thread_load_lrc.start()
    while True:
        cur_char = p.stdout.read(1)
        if 'A' == cur_char:
            try:
                cur_time = int(p.stdout.read(5)[1:])
                print '33[6;0H33[KtCurrent %d / Total %d'%(cur_time,tot_time)
                print '33[1;0H','-'*(tot_time/jump)
                print '33[1;0H','='*(cur_time/jump)
                print '33[7;0H','-'*(tot_time/jump)
                print '33[7;0H','='*(cur_time/jump)
                if tot_time <= cur_time:
                    print '33[8;0H33[Ktquit'
                    break
                print '33[4;0H33[Kt%s'%lrc[cur_time]
            except Exception,e:
                #print '33[17;0HtERROR:',e
                pass
        elif 'E' == cur_char:
            print '33[8;0H33[Ktquit'
            break

    p.wait()
    print '33[10;0H33[?25h'
    return 0

if '__main__' == __name__:
    if 2 != len(sys.argv) or not os.path.isfile(sys.argv[1]):
        print 'nUsage:',sys.argv[0],'{exist music filename}n'
    else:
        main(sys.argv[1])

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读