根据文件夹和子文件夹中的文件名递归设置所有 MP4 文件的 Title 属性

根据文件夹和子文件夹中的文件名递归设置所有 MP4 文件的 Title 属性

我正在寻找一种方法来根据文件名设置文件夹和子文件夹中所有 MP4 文件的“标题”属性。

例如,它应该将“Sample Video.mp4”文件的标题更改为“Sample Video”,并以类似的方式对文件夹(从中执行脚本的文件夹)和子文件夹中的所有文件执行此操作。

我搜索了使用 ffmpeg 和 exiftool 执行此操作的方法,但这两个选项都需要复制整个文件才能设置这个简单的属性,而 Windows 资源管理器可以从文件选择 -> 右侧详细信息窗格或文件 -> 属性 -> 详细信息轻松完成此操作。在这两个选项中,它都可以在几秒钟内设置文件属性,而无需复制整个文件。

答案1

您需要 python、MKVtoolnix 和 Kid3-cli。Exif 实际上会重写文件;此方法只会写入元数据。速度飞快。非常感谢Github 上的 Harvey

从 Python 运行此脚本。我将该文件复制到要编辑文件的父目录中。然后在该父目录中,我转到地址栏并cmd在地址栏中输入,然后输入以下命令来运行该脚本。

python remeta_mp4.py mp4仅适用于当前目录并python remeta_mp4.py mp4 -r更改其子目录中的所有 mp4 文件

复制并保存到记事本中,并确保保存为.py 扩展名。

import glob
import subprocess
import os
import sys

def mp4_string(title):
    name, name_extension = os.path.splitext(os.path.basename(title).replace("'", "\\'"))
    return name

def exec_mp4(mp4name):
    mp4name_title = mp4_string(mp4name)
    subprocess.run(["kid3-cli", "-c", f"set title '{mp4name_title}'", mp4name], shell=True)

def mp4(recursive=False):
    if recursive:
        for mp4name in glob.glob('**/*.mp4', recursive=True):
            exec_mp4(mp4name)
            print(f"Title metadata of {mp4name} has been changed")
    else:
        for mp4name in glob.glob("*.mp4"):
            exec_mp4(mp4name)
            print(f"Title metadata of {mp4name} has been changed")

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage: python rmeta.py mp4 [-r] for recursive operations")
        sys.exit(1)

    action_type = sys.argv[1]
    recursive = False
    if len(sys.argv) > 2 and sys.argv[2] == "-r":
        recursive = True

    if action_type == "mp4":
        mp4(recursive)
    else:
        print("Usage: python rmeta.py mp4 [-r] for recursive operations")
        sys.exit(1)

如果您希望能够双击 .py 文件而不是使用 cmd 提示符,则可以使用以下代码。以下代码将写入当前和子目录中的所有 .mp4 文件。只需确保将其保存为 .py 文件即可

import glob
import subprocess
import os
import sys

def mp4_string(title):
    name, name_extension = os.path.splitext(os.path.basename(title).replace("'", "\\'"))
    return name

def exec_mp4(mp4name):
    mp4name_title = mp4_string(mp4name)
    subprocess.run(["kid3-cli", "-c", f"set title '{mp4name_title}'", mp4name], shell=True)

def mp4(recursive=True):
    if recursive:
        for mp4name in glob.glob('**/*.mp4', recursive=True):
            exec_mp4(mp4name)
            print(f"Title metadata of {mp4name} has been changed")
    else:
        for mp4name in glob.glob("*.mp4"):
            exec_mp4(mp4name)
            print(f"Title metadata of {mp4name} has been changed")

if __name__ == "__main__":
mp4()

相关内容