本帖最后由 mlyde 于 2021-5-4 21:55 编辑
将lrc歌词整体提前或推迟
想把以前下载的一些歌配上歌词,但有的歌词比歌曲整体慢了几秒,一句句手改就太麻烦了,于是写了这个python脚本,顺便练练手,将lrc中的时间标签全部加或减一点儿。(当然,要手动听一下确认要加还是减,加减的幅度)
本来lrc是支持时间补偿的,就是在前面注释的位置加上[Offset:毫秒数] 就可以,但我的播放器不支持这样,只好改一下时间标签了。
说明
因为是覆盖保存,使用前请备份您要修改的文件。
如果出现文件编码不支持,请将 .lrc 文件以 UTF-8 保存。可以用记事本打开>文件>另存为>编码,选择 UTF-8 。
使用方法
输入要修改的 .lrc 文件名,若不在同一目录下,需输入完整路径,带不带引号均可。
例: TheStar-阿泱.lrc ,D:\Desktop\TheStar-阿泱.lrc ,“D:\Desktop\TheStar-阿泱.lrc” 等。
输入歌词要提前的时间,单位为秒(s),推迟时间用负数。
例: 1 ,0.5 ,-2 等。
确认覆盖并保存。
代码
[Python] 纯文本查看 复制代码 # 将.lrc歌词全部提前或推迟, 并以原文件名覆盖保存
import os
import re
# 文件名
filename = ''
# 歌词
lrc = ''
def readfile():
""" 打开(.lrc)文件并返回文件内容 """
global filename
filename = input('filename(.lrc):')
filename = filename.replace('"', '', 2) # 将两个"删去
if os.path.isfile(filename):
if os.path.exists(filename):
# file exists
try:
with open(filename, 'r', encoding='utf-8') as fp:
return fp.read()
except UnicodeDecodeError:
print('\a文件编码不支持!')
os.system('pause')
return 0
else:
# file not exists
return 0
else:
# not a normal file
return 0
def change(second):
""" 修改并写回改变后的内容 """
global lrc
# 找到时间标签, 匹配 [01:23.456]
timestamp = re.findall('\[([0-9]{0,3}\:[0-9]{0,2}\.[0-9]{0,3})\]', lrc)
timestamp_n = []
for i in range(len(timestamp)):
min = timestamp[i].split(':')
second_n = int(min[0]) * 60 + float(min[1]) - second
if second_n < 0: # 避免出现负值
second_n = 0
min_n = second_n // 60
second_n = second_n % 60
timestamp_n.append(('%02d' % min_n) + ':' + ('%05.2f' % second_n))
lrc = lrc.replace(timestamp[i], timestamp_n[i])
return lrc
def save():
""" 覆盖保存文件 """
with open(filename, 'w', encoding='utf-8') as fp:
fp.write(lrc)
def main():
""" 主函数 """
global lrc
# 读取文件
while True:
lrc = readfile()
if not lrc:
print('\aNot Found! (文件名为文件夹 或 文件不存在)\n')
else:
break
# 询问提前时间
while True:
try:
second = float(input('输入歌词要提前的时间(s): '))
break
# 防止输入非数字导致的程序终止
except ValueError:
print('请输入数字!\n\a')
# 修改lrc
lrc = change(second)
# 提示保存
while True:
result = input('是否覆盖并保存(Y/N)? ')
if result == 'Y' or result == 'y':
save()
break
if result == 'N' or result == 'n':
break
if __name__ == "__main__":
main()
|