标签:
加载同目录同名歌词同步显示
#!/usr/bin/python # -*- coding: utf-8 -*- import sys, os, time, subprocess, re, chardet def load_lrc(lrc_file): try: lrc_contains = open(lrc_file, ‘rb‘).read() encoding = chardet.detect(lrc_contains)[‘encoding‘] if ‘utf-8‘ != encoding: lrc_contains = lrc_contains.decode(encoding).encode(‘utf-8‘) except Exception, e: print ‘\033[4;0H\033[K\tNo lrc or in encoding found‘ return {} lrc = {} 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: #print ‘\033[4;0H\033[K\tLrc fromat error‘ #lrc_fp.close() #return {} pass #lrc_fp.close() return lrc def main(song): print ‘\033[2J\033[2;0H\tPlaying %s ...‘%song[:60] p = subprocess.Popen(‘mplayer %s 2>/dev/null‘%song, stdout = subprocess.PIPE, shell = True) 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‘ lrc = load_lrc(os.path.splitext(song)[0] + ‘.lrc‘) 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])
linux 下 python 调用 mplayer 解析歌词同步播放显示
标签:
原文地址:http://my.oschina.net/colben/blog/480546