我正在寻找一种方法来根据文件名设置文件夹和子文件夹中所有 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()