linux 下 python 调用 mplayer 解析歌词同步播放显示

加载同目录同名歌词同步显示

#!/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])
时间: 2024-10-18 03:02:38

linux 下 python 调用 mplayer 解析歌词同步播放显示的相关文章

linux下python调用c模块

在C调用Python模块时需要初始化Python解释器,导入模块等,但Python调用C模块却比较简单,下面还是以helloWorld.c 和 main.py 做一说明:   (1)编写C代码,hello.c代码很简单,只是输出“Hello World!”:         (2)将编写的C代码编译成动态链接库的形式,具体命令:   此时在当前目录下就生成了libhello.so 的动态链接库:         (3)在main.py中导入动态链接库,并调用C函数 这里的ctypes是Pytho

Linux下python安装升级详细步骤 | Python2 升级 Python3 转载

Linux下python升级步骤  Python2 ->Python3 多数情况下,系统自动的Python版本是2.x 或者yum直接安装的也是2.x 但是,现在多数情况下建议使用3.x 那么如何升级呢? 下面老徐详细讲解升级步骤: 首先下载源tar包 可利用linux自带下载工具wget下载,如下所示: wget http://www.python.org/ftp/python/3.3.0/Python-3.3.0.tgz 下载完成后到下载目录下,解压 tar -xzvf Python-3.3

Linux下otl调用MySQL数据库

整体流程结构 otl用头文件otlv4.h来声明接口,具体实现在linux下是由unixODBC来实现:通过FreeTDS驱动最终调用MySQL的DBMS(个人观点) 要安装的软件及步骤 所以要安装的有unixODBC,FreeTDS 具体安装参考:http://wenku.baidu.com/view/89e9e711a2161479171128de.html(此文章里面的设置有问题,参考本文中的"关于odbcinst.ini和odbc.ini的说明一节") 关于odbcinst.i

Linux下Rsync+Inotify-tools实现数据实时同步

说明: 一.先安装好rsync的服务端和客户端: http://douya.blog.51cto.com/6173221/1573968 二.安装,使用inotify-tools,实时同步 1.查看服务器内核是否支持inotify ll /proc/sys/fs/inotify   #列出文件目录,出现下面的内容,说明服务器内核支持inotify -rw-r--r-- 1 root root 0 Mar  7 02:17 max_queued_events -rw-r--r-- 1 root r

Linux下Rsync+sersync实现数据实时同步

inotify 的同步备份机制有着缺点,于是看了sersync同步,弥补了rsync的缺点.以下转自:http://www.osyunwei.com/archives/7447.html 前言: 一.为什么要用Rsync+sersync架构? 1.sersync是基于Inotify开发的,类似于Inotify-tools的工具 2.sersync可以记录下被监听目录中发生变化的(包括增加.删除.修改)具体某一个文件或某一个目录的名字,然后使用rsync同步的时候,只同步发生变化的这个文件或者这个

Linux下python安装升级详细步骤 | Python2 升级 Python3

Linux下python升级步骤  Python2 ->Python3 多数情况下,系统自动的Python版本是2.x 或者yum直接安装的也是2.x 但是,现在多数情况下建议使用3.x 那么如何升级呢? 下面老徐详细讲解升级步骤: 首先下载源tar包 可利用linux自带下载工具wget下载,如下所示: wget http://www.python.org/ftp/python/3.3.0/Python-3.3.0.tgz 下载完成后到下载目录下,解压 tar -xzvf Python-3.3

Linux下Rsync+Inotify-tools实现数据实时同步-(转载)

说明: 操作系统:CentOS 5.X 源服务器:192.168.21.129 目标服务器:192.168.21.127,192.168.21.128 目的:把源服务器上/home/www.osyunwei.com目录实时同步到目标服务器的/home/www.osyunwei.com下 具体操作: 第一部分:分别在两台目标服务器192.168.21.127,192.168.21.128上操作 一.分别在两台在目标服务器安装Rsync服务端 1.关闭SELINUX vi /etc/selinux/

Linux下python玩转MySQLdb

(0)目录 VMware 下安装Ubuntu的吐血经历 零基础学习Shell编程 Linux下的makefile的妙用 Linux调试神器 -- gdb 十分钟学会Python的基本类型 分布式版本管理神器--GIT GIT文件的三种状态 & Git SSH秘钥问题 十分钟学习Python的进阶语法 配置SSH无密码访问及Linux热键.重启.kill进程 Java的不定长参数和Python的不定长参数对比 Linux下python玩转MySQLdb 一:起因 (1)Linux下安装python

linux下python升级 及 pymongo安装

由于需要使用列表统计模块collection.Counter,而Counter模块只有在python2.7以上版本才有支持,所以将python2.6升级到2.7.  在linux下升级python,比如从2.6到2.7,大概需要这么几步:    1. 下载python2.7 从这里下载:http://www.python.org/ftp/python/ ,选择需要的版本 2. 安装pyhon2.7 下载好了以后,解压并安装    $ bzip2 -d Python-2.7.tar.bz2 (-d