首页  :: 新随笔  :: 管理

1、效果图

2、Python代码:

# coding=UTF-8
import codecs
import os
import re

# 正则校验是否为浮点数字
def is_number(num):
  pattern = re.compile(r'^[-+]?[-0-9]\d*\.\d*|[-+]?\.?[0-9]\d*$')
  result = pattern.match(num)
  if result:
    return True
  else:
    return False

# 解析歌词文件为结构化
def lrcParser(file_path):
    new = []
    f = codecs.open(file_path, 'r', encoding='utf-8')
    lines = f.readlines()
    f.close()

    for i in xrange(len(lines)):
        if i==0 :
            continue
        startTimes=lines[i-1].split("[")[1].split("]")[0].split(":")
        endTimes=lines[i].split("[")[1].split("]")[0].split(":")

        sentenceTxts =str(i-1)+":["+startTimes[1]+"]  "+ lines[i-1].split("]")[1]
        if is_number(startTimes[1]) and  is_number(endTimes[1]) :
            startPoint=-1;
            if is_number(startTimes[0]):
                startPoint=float(startTimes[0])*60+float(startTimes[1])
            else:
                startPoint = float(startTimes[1])
            endPoint=float(endTimes[0])*60+float(endTimes[1])+0.5
            new.append(str(startPoint )+","+str(endPoint)+","+sentenceTxts)

            if (i + 1) == len(lines):
                new.append(str(endPoint) + ",document.getElementById('audio1').duration-1," + (str(i)+":["+str(startTimes[1])+"]  "+ lines[i].split("]")[1]))
        else:
            new.append("0,0,"+sentenceTxts)

    return new;

# 生成每个歌词控制语句
def generateSentenceControl(lrcs):
    controlList=[]
    for i in xrange(len(lrcs)):
        lines=lrcs[i].split(",")
        control='<button onclick="setCurEndTimeAndPlay('+lines[0]+','+lines[1]+')" type="button">'+lines[2]+'</button></br>\n'
        controlList.append(control)
    return controlList;

def generateHtml(lrcs_arry,mp3):
    html=[]
    html.append(u"\n<!DOCTYPE html>");
    html.append(u"\n<html lang=\'EN\'>");
    html.append(u"\n<head>");
    html.append(u"\n    <meta charset=\'utf-8\'>");
    html.append(u"\n    <meta name=\'viewport\' content=\'width=device-width, initial-scale=1, shrink-to-fit=no\'>");
    html.append(u"\n    <title>"+mp3+"</title>");
    html.append(u"\n    <style type=\'text/css\'>");
    html.append(u"\n        button {");
    html.append(u"\n            margin: 5px;");
    html.append(u"\n        }");
    html.append(u"\n    </style>");
    html.append(u"\n</head>");
    html.append(u"\n<body>");

    html.append(u"\n<audio id=\'audio1\' controls=\'controls\'><source src=\'"+mp3+"\'></audio><br/>");
    html.append(u"\n\n\n")

    for i in xrange(len(lrcs_arry)):
        html.append(lrcs_arry[i])

    html.append(u"\n<script>");
    html.append(u"\n// https://stackoverflow.com/questions/19355952/make-html5-video-stop-at-indicated-time");
    html.append(u"\nvar myAud=document.getElementById(\'audio1\');");
    html.append(u"\nfunction setCurEndTimeAndPlay(startTime,endTime){");
    html.append(u"\n	// 设置当前时间");
    html.append(u"\n	myAud.currentTime=startTime;");
    html.append(u"\nvar pausing_function = function(){");
    html.append(u"\n	// 播放");
    html.append(u"\n	myAud.play();");
    html.append(u"\n    if(myAud.currentTime >= endTime) {");
    html.append(u"\n    	myAud.pause();");
    html.append(u"\n        // remove the event listener after you paused the playback");
    html.append(u"\n        myAud.removeEventListener(\'timeupdate\',pausing_function);");
    html.append(u"\n    }");
    html.append(u"\n};");
    html.append(u"\nmyAud.addEventListener(\'timeupdate\', pausing_function);	  ");
    html.append(u"\n  } ");
    html.append(u"\n</script> ");
    html.append(u"\n</body>");
    html.append(u"\n</html>");
    return html

def save(html,file):
    f = codecs.open(file, 'w', encoding='utf-8')
    f.writelines(html)
    f.close()


if __name__ == '__main__':
    path = u'/Users/jifeng/Downloads/学习音乐/';
    mp3=u'红玫瑰.mp3';

    lrc_file = path + u'红玫瑰.lrc'  # 放原txt文件的目录,注意有的字符需要转义
    result = path + u'红玫瑰.lrc.html'  # 结果文件名
    lrcs_arry = lrcParser(lrc_file)  # 解析歌词文件
    controlList = generateSentenceControl(lrcs_arry)  # 生产行控制语句
    html=generateHtml(controlList,mp3)
    save(html,result)

  

3、获取歌词LRC

  参见我的另外一篇记录:QQ音乐2019客户端-获取任意歌单完整歌曲列表和下载音乐文件方法,增加QQ音乐LRC歌词方法

 

4、代码下载地址

https://download.csdn.net/download/jifeng3518/12340371

 

参考:HTML5音频播放 - 指定时间段播放

智读 | 成都会领科技有限公司官网 | 智读App下载 | 每天听本书的博客 | |