其实扩大一点说,本质是使用文件的某项 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 打不开了。登录器能打开,但是登录后游戏不会启动,只好把这个设置关了,重启电脑才行。傻逼游戏。
使用视频文件的“创建媒体日期”进行重命名
-
Google Chrome 129Mac OS X 10.15.7 -
Google Chrome 129Mac 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
-
-
Google Chrome 129GNU/Linux x64 Python应该也有提取exif信息的库呀,用Python调用本地二进制程序总感觉怪怪的~
exiftool自己就有重命名的功能,
# 对 `当前目录下` 的媒体文件进行整理
exiftool -d %Y-%m-%d/%Y-%m-%d_%H%M%S%%-c.%%ue "-filename<filemodifydate" "-filename<createdate" "-filename<datetimeoriginal" -r .
不要漏掉结尾的 .