Bootstrap

python 实现 PC端剪映字幕转换SRT格式工具代码-Python 实现

#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()

;