- #!/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 '\\033[4;0H\\033[K\\t 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 '\\033[4;0H\\033[K\\t 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'(\\d\\d)\\s*:\\s*(\\d\\d)',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 '\\033[2J\\033[2;0H\\tPlaying %s ...'%song[:60]
- try:
- p = subprocess.Popen('mplayer %s 2>&1'%song, stdout = subprocess.PIPE, shell = True)
- except Exception, e:
- print '\\033[9;0H\\t%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 '\\033[9;0H\\tFailed 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 '\\033[15;0H\\ttotal time: %d'%tot_time
- break
- print '\\033[?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 '\\033[6;0H\\033[K\\tCurrent %d / Total %d'%(cur_time, tot_time)
- print '\\033[1;0H', '-'*(tot_time/jump)
- print '\\033[1;0H', '='*(cur_time/jump)
- print '\\033[7;0H', '-'*(tot_time/jump)
- print '\\033[7;0H', '='*(cur_time/jump)
- if tot_time <= cur_time:
- print '\\033[8;0H\\033[K\\tquit'
- break
- print '\\033[4;0H\\033[K\\t%s'%lrc[cur_time]
- except Exception, e:
- #print '\\033[17;0H\\tERROR:', e
- pass
- elif 'E' == cur_char:
- print '\\033[8;0H\\033[K\\tquit'
- break
- p.wait()
- print '\\033[10;0H\\033[?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])
- #该片段来自于http://www.codesnippet.cn/detail/0508201513338.html
来源: http://www.codesnippet.cn/detail/0508201513338.html