前提
承接上一篇《如何批量导出Google相册所有数据》
根据上一篇的方法导出的归档数据,往往许多信息都被抹除了,也就是Meta信息丢失,其中包括但不限于照片的定位信息(经纬度)
、拍摄时间
、拍照设备
、光圈
等一大堆信息。如果你默认下载了所有相册集,那么可能会有大量重复照片等着你,最可气的是如果你没有调整IOS设备的拍照格式的话,默认拍出的都是HEIC/HEVC
格式的内容,而Google恰恰又把IOS设备默认的HEIC
格式照片直接处理成了一个jpg
加一个2到3秒左右的MOV
短视频,如果你使用HEIC
拍摄了大量照片,那可能只能一个个手动在相册选择删除。
所以一般来讲,通过归档批量导出的数据,可能会遇到以下几种情况:
- Meta信息丢失
- 重复
- 时间混乱
- 多出大量的短视频
所以我一直在思考要如何处理这些问题。
首先是Meta信息丢失,直接导致了我把照片直接导入相册后时间线混乱,可能我昨天拍的照片会出现在2007年
那一栏中,其次往往许多照片旁边伴随着一个2秒短视频
,相册一眼望过去全是重复内容,让人苦恼不堪。
用Google search了一圈,发现网上有人提出问题,但是没人解决,痛定思痛,我决定写个小脚本批量处理,然后再导入手机。(最底下有完整代码,也已经放在Github上)
最终实现了
- 视频时长短于
2s
的,放在了under2
文件夹下,短于3s
的,全部放在了under3
文件夹下 - 重复文件默认被删除,包括
.json
和视频文件,如果代码中dealDuplicate(False)
,则会归类到Duplicate
文件夹下 - 根据所有
.json
文件修复了照片的Exif
数据和日期 HEIC
格式相片统一放在了同名文件夹下json
文件统一放在json
文件夹里
脚本是python写的,没怎么用过这个语言,本着实用主义原则,代码可能并不优雅
重复照片
我仔细观察了一下,发现大量重复照片和视频的下载名称都相同,那就直接扫描文件夹,把重复文件剔除即可
def dealDuplicate(delete=True):
fileList = {
}
dg = os.walk(scanDir)
for path,dir_list,file_list in dg:
for file_name in file_list:
full_file_name = os.path.join(path, file_name)
if file_name == '元数据.json':
continue
#处理重复文件
if file_name in fileList.keys():
DupDir = scanDir + '/Duplicate/'
if not os.path.exists(DupDir):
os.makedirs(DupDir)
if delete:
os.remove(full_file_name) #这里可以直接删除
else:
if not os.path.exists(DupDir + file_name):
shutil.move(full_file_name, DupDir)
print('重复文件:' + full_file_name + ' ------ ' + fileList[file_name])
else:
fileList[file_name] = full_file_name
fileList.clear()
重复短视频
另一个就是大量HEIC
转换出来的大量短视频,都是.MOV
格式文件,这里我选择通过ffmpeg
判断视频时长,进而把时长在3s
以内的视频过滤出来,最终全部删除有选择地分门别类。
这里需要安装一下ffmpeg的扩展,pip3 install ffmpeg-python
即可
还有一点是需要提前安装好ffmepg
可执行文件并配置好环境变量,否则有可能会报找不到ffprobe错误
#文件分类
def dealClassify():
#部分文件变了,重新扫描
g = os.walk(scanDir)
for path, dir_list, file_list in g:
for file_name in file_list:
full_file_name = os.path.join(path, file_name)
#处理时长低于3s的视频
if os.path.splitext(file_name)[-1] == '.MOV':
print('根据时长分类文件:' + full_file_name)
info = ffmpeg.probe(full_file_name)
#print(info)
duration = info['format'][