#encoding:utf-8
import json
import time
import datetime
import os
import socket
import getpass
user_name = getpass.getuser() # 获取当前用户名
hostname = socket.gethostname() # 获取当前主机名
def readjson():
"""
读取字幕文本
:return:
"""
with open(readfiles(),'r',encoding='utf-8') as load_f:
load_dict = json.load(load_f)
return load_dict
def get_content():
"""
获取字幕内容
:return:
"""
materials = readjson()['materials']
texts = materials['texts']
content = {}
for tt in texts:
textId = tt['id']
text_content = tt['content']
text_dict = {textId:text_content}
content.update(text_dict)
return content
def get_tracks():
"""
获取时间
:return:
"""
tracks = readjson()['tracks']
durations_dict = {}
for tk in tracks:
flag = tk['flag']
if str(flag) == '1':
segments = tk['segments']
for s in segments:
material_id = s['material_id']
target_timerange = s['target_timerange']
duration = {material_id:target_timerange}
durations_dict.update(duration)
return durations_dict
def merger_content():
"""
把时间与字幕内容合并
:return:
"""
content = get_content()
duration_time = get_tracks()
subtitle = []
for k,v in content.items():
durationinfo = duration_time[k]
duration = int(durationinfo['duration']) # 字幕片段时长时间
start = int(durationinfo['start'])/1000000 # 字幕片段开始时间
statrTime = datetime.timedelta(seconds=start) #转换成时间格式
endduration = (int(int(durationinfo['duration'])) + int(durationinfo['start']))/1000000
endTime = datetime.timedelta(seconds=endduration)
duration_list = [str(statrTime),str(endTime)]
t = [v] + duration_list
subtitle.append(t)
return subtitle
def run():
"""
执行函数
:return:
"""
t = "*********************** 剪映字幕转换器 ***********************"
print(t)
print("")
filename = input("请输入字幕文件名称:")
filefolder = f'data/{filename}'
createFolder(filefolder)
timeName = time.time()
time_array = time.localtime(timeName)
str_date = time.strftime("%Y%m%d%H%M%S", time_array)
newfilename = f"{filename}_{str_date}"
savepath = os.path.join(filefolder,newfilename)
content = merger_content()
n = 0
for ct in content:
n += 1
content_text = ct[0]
start_duration = timeFormat(str(ct[1]).replace('.',','))
end_duration = timeFormat(str(ct[-1]).replace('.',','))
text_duration = f"{start_duration} --> {end_duration}"
text_n = ""
writefile(savepath, n)
writefile(savepath, text_duration)
writefile(savepath, content_text)
writefile(savepath, text_n)
print("")
input(f"{filename}字幕 生成成功[回车结束]:")
def timeFormat(t):
h = t.split(':')[0]
m = t.split(':')[1]
s = t.split(':')[-1][0:6]
if len(h) == 1 :
timeT = ["0"+str(h)] + [m] + [s]
timeT = ":".join(timeT)
return timeT
if len(h) == 2:
timeT = [h] + [m] + [s]
timeT = ":".join(timeT)
return timeT
def writefile(filename,content):
with open(f'{filename}.srt','a+',encoding='utf-8') as f:
f.write(str(content)+'\n')
f.close()
print(f"successful write:{content}")
def readfiles():
path = fr"C:\Users\{user_name}\AppData\Local\JianyingPro\User Data\Projects\com.lveditor.draft"
path = new_report(path)
file = os.listdir(path)
draft_content = [x for x in file if 'draft_content.json' == x][0]
subtitle_path = os.path.join(path, draft_content)
print("读取到 剪映字幕文件")
return subtitle_path
def new_report(test_report):
"""
读取文件,并返回最新的目录(文件夹)路径
:param test_report:
:return:
"""
file = os.listdir(test_report) # 列出目录的下所有文件和文件夹保存到lists
folderlist = []
tdict = {}
for f in file:
filepath = os.path.join(test_report, f)
if os.path.isdir(filepath) == True:
folderlist.append(str(f))
ctime = time.ctime(os.path.getctime(filepath))
s = int(time.mktime(time.strptime(ctime,"%a %b %d %H:%M:%S %Y")))
t = {s:f}
tdict.update(t)
max_time = max(list(tdict.keys()))
new_filepath = os.path.join(test_report, tdict[max_time])
return new_filepath
def createFolder(path):
while True:
if os.path.isdir(path):
break
else:
os.makedirs(path)
if __name__ == '__main__':
run()