Saber 酱的抱枕

Fly me to the moon

10/13
2024
软件

使用视频文件的“创建媒体日期”进行重命名

其实扩大一点说,本质是使用文件的某项 EXIF 属性来进行重命名。现在很多重命名软件对这个功能的支持相当有限,我因为找不到符合要求的,所以自己动手写了个 py 文件进行处理。

使用场景

这些视频文件的修改日期不是原始日期,创建媒体日期才是原始日期:

我想使用创建媒体日期进行重命名,具体来说就是提取年月日,并把它们添加到原文件名前面,例如 2019-11-06 原文件名.mp4

但是许多重命名软件都没有这样的功能,所以我想自己动手做一下这个功能。

我也问了群友有没有这样的软件,结果还真有,这个叫“菲菲更名宝贝”的软件可以实现:

它的功能非常细致,也可以使用许多属性。不过这个视频编码日期只对 mp4 文件有用,对 mkv 文件无效,因为这两种文件的“创建媒体日期”其实是不同的属性。如果对 mkv 也有用的话我就不用做这个脚本了。

使用 ExifTool 提取需要的属性

首先需要获取文件的元数据,这里我使用了 ExifTool,它是一个很好用的命令行软件,同时也有 GUI 版。

ExifTool 官网:https://exiftool.org/

我从官网下载了 Windows x64 的可执行文件,解压之后是这样的:

exiftool(-k).exe 重命名为 exiftool.exe 以便之后使用。

在命令行里执行 exiftool.exe 视频文件,查看这个视频的元数据:

输出了一大堆内容,其中 mp4 文件的创建媒体日期是 Media Create Date 属性:

Media Create Date               : 2019:11:05 16:51:52

mkv 文件则是 Date/Time Original

我们不必每次都输出所有的元数据,因为 ExifTool 可以指定要输出的属性。对于 mp4 文件,使用 -MediaCreateDate 参数即可:

对于 mkv 则使用 -DateTimeOriginal 参数。

接下来需要提取后面的日期字符串,我一开始想的是继续在 CMD 里处理,但是它的 find 和 findstr 命令都只能输出整行,无法只输出日期部分,遂放弃。

接下来上 Python 大法!并且为了方便使用,我把 ExifTool 添加到了环境变量里,其实就是把 exiftool.exe 和其文件夹都移动到了 system32 目录里。

编写 Python 脚本

Python 是可以执行 shell 命令的,所以它也可以使用相同的命令来获取创建媒体日期。

使用 subprocess.run 来执行外部命令,并获得输出内容,例如:

import subprocess

def get_metadata(file_path):
    command = ['exiftool', '-MediaCreateDate', file_path]
    result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
    if result.returncode == 0:
        print(result.stdout)  # 输出元数据信息
    else:
        print(f"Error: {result.stderr}")

file_path = r'D:\download\t\ハロウィン_デンジャラスビーストキリアちゃん_.mp4'
get_metadata(file_path)

正常输出了结果:

接下来需要提取日期部分,并将其转换为本地时间。这是因为原始数据是 UTC 日期,而中国是 +8 时区。这一步的目的是把 2019:11:05 16:51:52 转换成 2019-11-06 00:51:52,并返回 2019-11-06 部分。

最后就是遍历每个文件并重命名了。代码略。

下载 py 文件

我在 GitHub 上建了个仓库:Rename Video Files Using Media Create Date

里面有使用说明。

PS:里面提到了文件名中的某些特殊字符可能会导致 ExifTool 报错,如果你像我一样经常下载日本资源的话应该也会遇到。

比如一个名为 1・2.txt 的文件,用 exiftool 去查看它的元数据就会报错:

FileName encoding not specified.  Use "-charset FileName=CHARSET"

文件名编码未指定是什么意思?其实当我们在 cmd 里执行 exiftool "1・2.txt"时,cmd 发送给 exiftool 的文件名并不是 UTF8 编码,而是系统代码页。这就导致有些 Unicode 字符未能以原样传递给 exiftool,导致 exiftool 找不到这个文件,进而报错。

我试了按照报错提示添加 -charset FileName=UTF8 参数,但是没卵用,最后看 stackoverflow 上的解决办法,修改系统区域设置为 UTF-8 解决了此问题。

PS:修改为 UTF-8 之后,FF14 打不开了。登录器能打开,但是登录后游戏不会启动,只好把这个设置关了,重启电脑才行。傻逼游戏。

使用视频文件的“创建媒体日期”进行重命名

  1. sowevo
    Google Chrome 129Google Chrome 129Mac OS X 10.15.7Mac OS X 10.15.7

    exiftool自己就有重命名的功能,
    # 对 `当前目录下` 的媒体文件进行整理
    exiftool -d %Y-%m-%d/%Y-%m-%d_%H%M%S%%-c.%%ue "-filename<filemodifydate" "-filename<createdate" "-filename<datetimeoriginal" -r .

    不要漏掉结尾的 .

    回复
    1. sowevo
      Google Chrome 129Google Chrome 129Mac OS X 10.15.7Mac OS X 10.15.7

      效果类似这样
      .
      ├── 2017-11-10
      │   ├── 2017-11-10_211755.JPG
      │   ├── 2017-11-10_211835.JPG
      │   ├── 2017-11-10_230031.JPG
      │   ├── 2017-11-10_230117.JPG
      │   └── 2017-11-10_231214.JPG
      └── 2020-09-25
      ├── 2020-09-25_083821.MP4
      └── 2020-09-25_085303.MP4

      回复
    1. saber 文章作者
      Google Chrome 129Google Chrome 129WindowsWindows

      我没用过其他 exif 库,不过感觉还是使用 ExifTool 最为稳妥。
      至于调用方式确实不太优雅,其实我觉得无所谓,但这样确实存在效率低下的问题,因为每次都要重新运行 exiftool。刚才我搜了下有个 PyExifTool 库是对 ExifTool 的包装,似乎可以不用复用进程。不过它有自己的方法和返回值,我懒得研究了,就这样吧

      回复