根据视频编码时间批量重命名视频文件

整理收藏的小视频的时候发现很多视频命名很随意,自己命名又太麻烦,看着乱糟糟的文件又心烦,所有写了这个程序,代码如下:

import os
 
from filetype import filetype
from pymediainfo import MediaInfo
 
video_extension = ('mp4', 'm4v', 'mov')
 
 
def RenameByEncodeTime(videos_path: str):
    """靠视频文件的编码时间来重命名当前路径下的所有视频文件"""
    # 统计操作次数个数
    count = 0
    # 遍历目录
    for root, dirs, files in os.walk(videos_path):
        # 循环目录中的文件
        for file in files:
            # 获取当前操作文件路径
            old_path = os.path.join(root, file)
            # 获取当前操作文件的拓展名
            extension = filetype.guess_extension(old_path)
            # 如果当前操作文件是视频才继续
            if extension in video_extension:
                # 解析当前操作文件的媒体信息
                media_info = MediaInfo.parse(old_path)
                # 然后遍历 media_info.tracks 中的每个轨道。
                for track in media_info.tracks:
                    # 如果轨道的类型是”General“
                    if track.track_type == 'General':
                        encode_data = track.encoded_date
                        # 编码时间不为空的情况
                        if encode_data:
                            # 去掉文件名中的“:"和“UTC ”
                            new_name = f'{encode_data.replace(":", "").replace("UTC ", "")}'
                            # 获取当前操作文件所在目录的路径
                            dir_name = os.path.dirname(old_path)
                            # 根据新文件名组合新路径
                            new_path = f'{dir_name}\\{new_name}.{extension}'
                            # 初始编码时间下存在文件
                            if os.path.exists(new_path):
                                # 判断旧文件名和新文件名的绝对路径是否相同,防止对已经完成命名的文件重复命名
                                # 先转换为小写是为了解决后缀名大写导致的判断通过的问题
                                if old_path.lower() != new_path.lower():
                                    # 重复计数
                                    repeat_count = 1
                                    # 循环判断加编号后直到不存在文件后重命名
                                    repeat_path = new_path
                                    while os.path.exists(repeat_path):
                                        repeat_count += 1
                                        repeat_path = f'{dir_name}\\{new_name}-{repeat_count}.{extension}'
                                    os.rename(old_path, repeat_path)
                                    # 重命名后输出路径信息并计数加1
                                    print(f'{old_path} -> {repeat_path}')
                                    count += 1
                                    # 如果同一个编码时间下已存在两个文件时,给使用这个初始编码时间的文件重命名加编号
                                    if repeat_count == 2:
                                        # 加编号”-1“后的路径
                                        first_path = f'{dir_name}\\{new_name}-1.{extension}'
                                        os.rename(new_path, first_path)
                                        # 重命名后输出路径信息并计数加1
                                        print(f'{new_path} -> {first_path}')
                                        count += 1
                            # 初始编码时间下是不存在文件,即为初始编码时间下的重命名
                            else:
                                # 重复计数
                                repeat_count = 2
                                # 加编号”-1“后的路径
                                first_path = f'{dir_name}\\{new_name}-1.{extension}'
                                # 不存在加编号”-1“后的文件则证明当前重命名为初始编码时间重命名
                                if not os.path.exists(first_path):
                                    # 重命名后输出路径信息并计数加1
                                    os.rename(old_path, new_path)
                                    print(f'{old_path} -> {new_path}')
                                    count += 1
                                # 如果存在加编号”-1“后的文件则证明当前编码时间下存在多个文件
                                else:
                                    # 循环判断加编号直到不存在文件后重命名
                                    repeat_path = first_path
                                    while os.path.exists(repeat_path):
                                        repeat_count += 1
                                        repeat_path = f'{dir_name}\\{new_name}-{repeat_count}.{extension}'
                                    os.rename(old_path, repeat_path)
                                    # 重命名后输出路径信息并计数加1
                                    print(f'{old_path} -> {repeat_path}')
                                    count += 1
 
    print(f'\n已处理次数:{count}')
 
if __name__ == '__main__':
    print('根据视频编码时间批量重命名视频文件')
    # 视频文件所在目录
    path = input("请输入视频文件所在目录的路径:")
    while path == '':
        path = input('路径不能为空:')
    RenameByEncodeTime(path)
    input('按任意键继续……')

运行截图: 

根据视频编码时间批量重命名视频文件_第1张图片

 注意:有些视频被二次编编码后,它的编码时间可能被删除,这些视频不会被重命名;目前只测试了mp4、m4v、mov这三种格式,代码中也限定了只修改这三种格式,需要修改其他格式请自行修改代码

你可能感兴趣的:(Python,音视频,python,算法)