乐于分享
好东西不私藏

“那些年月的时光” 软件说明书

“那些年月的时光” 软件说明书

1. 软件概述

1.1 基本信息

– 开发软件:WorkBuddy

– 软件名称:那些年月的时光  

– 版 本 号 :v2.06.260501

1.1.1 适用场景

1. 主要用于在 Windows 10/11 系统中整理手机备份文件。  

2. 将指定文件夹内的照片、视频、音频、文档等文件按年月分组归档。  

3. 不适用于专业的档案分组管理。

1.1.2 版本历史

– v0.1 ~ 1.0:简化人为操作,实现手机照片按年月分组归档。  

– v1.01 ~ 1.19:提升归档准确性,支持照片、视频、音频、文档按年月分组;科学提取照片及微信图片的日期信息;提高处理速度并显示执行时间。  

– v2.01 ~ 2.06:重构设计思路,新增统计分析报表,实现归档结果预览,使整理与查重过程更清晰可控。

1.2 核心功能

1.2.1 媒体文件识别与分类

– 支持 图片、视频、音频 三类媒体文件  

– 按拍摄日期自动归类到 YYYYMM 格式的子目录  

– 多源日期提取:EXIF、ffprobe、ID3、文件名、文件修改时间

1.2.2 统计分析功能

– 并行处理,高速分析目录内所有文件  

– 自动标记 MD5 相同的重复文件  

– 导出 Excel 报表

1.2.3 清理重复功能

– 一键清理各分类目录中 MD5 相同的重复文件  

– 保留最老的文件,其余移动到 清理重复 目录

2. 支持的文件格式

2.1 图片格式

– 标准格式:JPG, JPEG, PNG, BMP, GIF  

– 高级格式:HEIC, WebP, TIFF  

– RAW格式:CR2, NEF, ARW, DNG, RAW

2.2 视频格式

– 常见格式:MP4, MOV, AVI, MKV, WMV, FLV  

– Web格式:WebM, M4V  

– 移动格式:3GP, MTS, M2TS

2.3 音频格式

– 常见格式:MP3, WAV, AAC, M4A, OGG  

– 无损格式:FLAC, APE  

– 其他格式:WMA, Opus

3. 日期提取机制(核心算法)

日期提取遵循严格的优先级顺序,所有提取的日期都会经过合理性校验。

3.1 第一优先级:图片 EXIF 元数据

– 提取字段:DateTimeOriginal(优先) → DateTimeDigitized → DateTime  

– EXIF 格式:YYYY:MM:DD HH:MM:SS  

– 合理性校验:年份必须在 1980 ~ 当前年份之间  

– 失败处理:继续下一优先级

3.2 第二优先级:视频 ffprobe 元数据

– 调用 ffprobe.exe 读取标签  

– 支持字段:creation_time, creation_date, DATE  

– 支持格式:ISO(2024-06-15T10:30:00.000Z)、标准(%Y-%m-%d %H:%M:%S)、短格式(%Y-%m-%d)、斜杠格式(%Y/%m/%d %H:%M:%S)  

– 超时设置:10 秒  

– 合理性校验:年份 1980 ~ 当前年份  

– 失败处理:继续下一优先级

3.3 第三优先级:音频 ID3 标签

– 支持格式:MP3, FLAC, WAV, OGG  

– 支持标签:date, recordingdate, creationdate, TDRC, TCOR  

– 支持格式:完整日期(%Y-%m-%d)、纯数字(%Y%m%d)、年份(%Y)  

– 合理性校验:年份 1980 ~ 当前年份  

– 失败处理:继续下一优先级

3.4 第四优先级:文件名解析

3.4.1 时间戳格式(优先于标准日期格式)

– 微信 13 位毫秒时间戳  

正则:mmexport(\d{13}),示例:mmexport1701248706486_1.jpg,除以 1000 转秒,范围校验 946684800 ~ 4102444800(2000–2100 年),与文件修改时间相差 ≤ 365 天。  

– 微信 10 位秒时间戳  

正则:mmexport(\d{10}),示例:mmexport1701248706.jpg,直接转秒,范围与合理性校验同上。  

– 下划线分隔的 13 位时间戳  

正则:_(\d{13})_,示例:_1701248706486_.mp4,处理方式同 13 位毫秒戳。

3.4.2 标准日期格式(时间戳匹配失败后)

– 四位年份格式  

正则:(\d{4})[-_.\s]?(\d{2})[-_.\s]?(\d{2}),示例:20240615、2024-06-15、2024_06_15、24.06.15;月份 1–12,日期 1–31,年份 1980 ~ 当前。  

– 两位年份格式  

正则:(\d{2})(\d{2})(\d{2}),示例:240615 → 自动加 2000 年 → 2024年6月15日,校验同上。

3.5 第五优先级:文件修改时间

– 来源:操作系统文件修改时间  

– 作为最终回退方案,无需合理性校验

4. 分类规则

4.1 目标目录规则

– 格式:{源目录}/{YYYYMM}/  

– YYYY:四位年份,MM:两位月份(01–12)  

– 示例:202406 表示 2024 年 6 月

4.2 特殊目录

– 未知日期:197001(默认回退目录)  

– 清理重复目录:清理重复

4.3 来源标签说明

– [exif]:图片 EXIF 元数据  

– :视频 ffprobe 标签  

– :音频 ID3 标签  

– [filename]:文件名解析  

– 无标签:文件修改时间

5. 文件移动规则

5.1 移动策略

– 安全机制:先复制再删除,避免中断导致文件丢失

5.2 冲突处理规则

– 目标目录无同名文件:直接移动  

– 目标有同名文件:  

  – MD5 一致 → 覆盖目标文件  

  – MD5 不一致 → 添加数字后缀(_1, _2, _3……)  

– 源路径 = 目标路径:跳过(文件已在目录中)

5.3 运行中文件检测

– 检测方式:独占模式打开文件  

– 被占用处理:只复制不移动(避免其他程序占用时移动失败)

6. 统计分析功能

6.1 输出字段

  字段     说明                               

  文件路径   完整绝对路径                           

  分类目录   根据日期确定的相对路径                      

  文件名   文件名称                             

  文件类型   图片 / 视频 / 音频 / 文件                

  文件名日期 从文件名解析出的日期(YYYY-MM-DD)           

  元数据日期 EXIF/ffprobe/ID3 中的日期(YYYY-MM-DD)

  文件修改日期 文件系统修改时间(YYYY-MM-DD)             

  微信时间戳 微信文件名中的时间戳转换后日期(YYYY-MM-DD)      

  文件大小   KB / MB / GB 格式                  

  MD5   32位十六进制哈希值                       

  重复标识   原始文件(n个) / 重复-N                  

6.2 重复标识规则

– 分组依据:MD5 哈希值  

– 首文件:原始文件(n个)(n 为该组总文件数)  

– 其余文件:重复-1, 重复-2……  

– 空 MD5 不参与重复检测

6.3 清理重复规则

– 保留策略:保留最老的文件(基于分类日期 YYYYMM)  

– 处理方式:移动到 清理重复 目录,保持原始路径结构  

– 示例:/Photos/202401/photo.jpg → /清理重复/Photos/202401/photo.jpg

6.4 MD5 计算规则

– 快速模式(默认):文件大小 > 128KB 时,读取前 64KB + 后 64KB + 文件大小,提升大文件处理速度  

– 完整模式:文件大小 ≤ 128KB 时,完整读取文件

7. Excel 报表导出

7.1 导出字段

文件路径、分类目录、文件名、文件类型、文件名日期、元数据日期、文件修改日期、微信时间戳、文件大小、MD5、重复标识

7.2 列宽设置(部分关键列)

– 文件路径:30  

– 分类目录:10  

– 文件名:25  

– 文件类型:10  

– 日期类字段:15  

– MD5:10

7.3 保存位置

– 自动保存到程序所在目录  

– 文件名格式:统计分析_YYYYMMDD_HHMMSS.xlsx

8. 界面功能

8.1 主界面布局

– 标题栏:那些年月的时光 v{版本号}  

– 默认窗口尺寸:700×500,最小尺寸:550×400,屏幕居中

8.2 目录选择区

– 显示当前选中的文件夹路径,默认状态为“未选择目录”,支持拖拽选择(可选)

8.3 功能按钮

– 选择目录、统计分析、报表导出、开始分类、清理重复、打开目录(资源管理器)

8.4 进度显示

– 进度条、计时器(⏱ X 秒)、完成状态(✓ 耗时 XX 秒)

8.5 日志输出区

– 启动时显示 README.md 内容,运行时切换为操作日志  

– 最大行数:500 行(自动清理旧日志),提供清空按钮

9. 版本号规范

格式:v主版本.递增序号.日期码  

示例:v2.06.260501 → 主版本 2,递增序号 06(01–99 循环),日期码 260501(YYMMDD)

10. 技术规格

10.1 运行环境

– Python:3.13  

– GUI 框架:Tkinter  

– 操作系统:Windows 10/11(64位)

10.2 依赖库

– Pillow >= 10.0.0:EXIF 读取  

– mutagen >= 1.47.0:音频元数据  

– openpyxl:Excel 导出  

– ffprobe.exe:视频元数据提取

10.3 技术特性

– 多线程处理:GUI 主线程 + 文件操作后台线程  

– 并行处理:统计分析使用多线程  

– 实时进度:每秒更新进度和计时  

– 内存管理:日志超 500 行自动清理

11. 注意事项

11.1 数据安全

– 分类会移动文件,请提前备份重要数据  

– 正在运行的文件只复制不移动,避免占用冲突  

– 文件名冲突时自动添加数字后缀

11.2 特殊情况

– 未知日期文件 → 归类到 197001 目录  

– 清理重复:保留最老文件,其余移到 清理重复 目录(保持原始路径结构)

11.3 已处理情况

– 年份合理性校验(1980–当前年份)  

– 时间戳合理性校验(与修改时间相差 ≤ 365 天)  

– 日期合法性校验(考虑月份天数)

12. 错误处理

12.1 常见错误

– ffprobe.exe 不存在:跳过视频元数据提取  

– EXIF 读取失败:继续下一优先级  

– 文件被占用:只复制不移动  

– MD5 计算失败:返回空字符串

12.2 超时处理

– ffprobe 超时(10 秒):跳过并继续处理下一个文件

附录 A:核心模块说明

– date_extractor.py:从各种来源获取文件拍摄日期  

– file_organizer.py:安全移动文件,处理冲突  

– statistics.py:扫描目录,提取详细信息,标记重复文件  

– logger.py:日志回调和格式化输出

附录 B:文件结构

    media-date-sorter/

    ├── main.py      # 主程序入口,GUI界面

    ├── core/

    │   ├── __init__.py

    │   ├── date_extractor.py

    │   ├── file_organizer.py

    │   └── statistics.py

    ├── utils/

    │   ├── __init__.py

    │   └── logger.py

    ├── requirements.txt

    ├── ffprobe.exe

    └── README.md

附录 C:命令行打包

pyinstaller –onefile –windowed –name NaxYears_v206_260501 main.py –clean

打包后重命名为:那些年月的时光v2.06.260501.exe