跳转到主要内容

您的个人EXIF照片、视频和音频助手

项目描述

你好,我是Elodie

~~ 您的个人EXIF照片、视频和音频助手 ~~

Build Status Coverage Status Scrutinizer Code Quality

我从这个开源项目中创建了一个应用程序。 下载Elodie,基于EXIF的相片组织应用程序

快速入门指南

开始只需几分钟。

安装ExifTool

Elodie依赖于Phil Harvey的优秀ExifTool库。您需要为您的平台安装它。

一些视频文件的功能仅适用于ExifTool的新版本,并且已在10.20或更高版本上进行了测试。对HEIC文件的支持需要11.50或更高版本。通过输入exiftool -ver检查您的版本,如果需要,请参阅ExifTool的手动安装说明

# OSX (uses homebrew, https://brew.sh.cn/)
brew install exiftool

# Debian / Ubuntu
apt-get install libimage-exiftool-perl

# Fedora / Redhat
dnf install perl-Image-ExifTool

# Windows users can install the binary
# http://www.sno.phy.queensu.ca/~phil/exiftool/install.html

克隆Elodie仓库

您可以从GitHub克隆Elodie。您需要安装git说明)。

git clone https://github.com/jmathai/elodie.git
cd elodie
pip install -r requirements.txt

试用Elodie

现在您已安装了所有必要的依赖项,您可以开始使用Elodie。您需要一个照片、视频或音频文件以及您希望Elodie将它们组织到的文件夹。

# Run these commands from the root of the repository you just cloned.
./elodie.py import --debug --destination="/where/i/want/my/photos/to/go" /where/my/photo/is.jpg

您会注意到照片已被组织到未知位置文件夹中。这是因为您尚未设置您的MapQuest API(说明)。

现在您已经准备好了解更多关于Elodie的信息了。

慢速入门指南

阅读关于我为什么被创建的3篇博客文章以及我如何与Google Photos一起使用

我不知疲倦地工作,确保您的照片始终井然有序,以便您可以专注于更重要的事情。这里所说的照片包括JPEG、DNG、NEF以及常见的视频和音频文件。

你可能现在还不太喜欢我,但你会的。

我只做三件事。

  • 首先,我将您的现有照片集合组织成可定制的文件夹结构。
  • 其次,我帮助使您尚未拍摄的照片能够流入它们应属的位置。
  • 第三,但同样重要的是,我保证在不使用一些朋友使用的令人讨厌的专有数据库的情况下完成这一切。

注意:在运行以下命令之前,请确保您已安装了我所需的一切。请参阅此页面上方的说明

让我们整理您的现有照片

我猜您周围散落着很多照片。我将帮助您做的第一件事就是整理这些照片。无论您有数百、数千还是数万张照片,越多越好。

启动您的终端并运行此命令,该命令会复制您的照片到一个更有结构的目录中。

./elodie.py import --destination="/where/i/want/my/photos/to/go" /where/my/photos/are

我速度很快,但根据您有多少照片,您可能需要准备一些小吃。当您运行此命令时,我会随着工作的进行打印出我的工作。如果您无聊,您可以在Finder中打开/where/i/want/my/photos/to/go并观看我轻松地将您的照片复制到那里。

您会注意到,您的照片现在按日期和位置进行了组织。有些照片没有正确的日期或位置信息。我会尽力而为,在最坏的情况下,我会使用文件访问或修改时间中较早的一个。理想情况下,您的照片在EXIF中有日期和位置信息,这样我的工作就更加准确。

如果您的照片没有很多EXIF信息,请不要担心。稍后我会向您展示如何修复它们,但现在让我们先走一步。

回到您的照片。当我完成时,您应该会看到如下所示的内容。请注意,我已经通过添加拍摄日期和时间来重命名您的文件。这有助于在使用大多数查看应用程序时保持它们的顺序。稍后您会感谢我的。

├── 2015-06-Jun
│   ├── California
│   │   ├── 2015-06-29_16-34-14-img_3900.jpg
│   │   └── 2015-06-29_17-07-06-img_3901.jpg
│   └── Paris
│       └── 2015-06-30_02-40-43-img_3903.jpg
├── 2015-07-Jul
│   ├── Mountain View
│   │   ├── 2015-07-19_17-16-37-img_9426.jpg
│   │   └── 2015-07-24_19-06-33-img_9432.jpg
└── 2015-09-Sep
│   ├── Unknown Location
    │   ├── 2015-09-27_01-41-38-_dsc8705.dng
    │   └── 2015-09-27_01-41-38-_dsc8705.nef

还不错,对吧?等等,什么是未知位置?如果我没有能够弄清楚照片是在哪里拍摄的,我会将其放入一个名为未知位置的文件夹中。这通常发生在照片中没有EXIF中的GPS信息时。对于智能手机拍摄的照片,您不应该看到这种情况,但对于数码相机和单反相机来说,这通常是情况。我可以帮助您添加GPS信息到这些照片,并将它们组织得更好。让我向您展示如何。

使用说明

您可以在命令行中通过输入./elodie.py import --help./elodie.py update --help./elodie.py generate-db --help来查看这些说明。

导入照片

Usage: elodie.py import [OPTIONS] [PATHS]...

  Import files or directories by reading their EXIF and organizing them
  accordingly.

Options:
  --destination DIRECTORY  Copy imported files into this directory.
                           [required]
  --source DIRECTORY       Import files from this directory, if specified.
  --file PATH              Import this file, if specified.
  --album-from-folder      Use images' folders as their album names.
  --trash                  After copying files, move the old files to the
                           trash.
  --allow-duplicates       Import the file even if it's already been imported.
  --debug                  Override the value in constants.py with True.
  --exclude-regex TEXT     Regular expression for directories or files to
                           exclude.
  --help                   Show this message and exit.

更新照片

Usage: elodie.py update [OPTIONS] FILES...

  Update a file's EXIF. Automatically modifies the file's location and file
  name accordingly.

Options:
  --album TEXT     Update the image album.
  --location TEXT  Update the image location. Location should be the name of a
                   place, like "Las Vegas, NV".
  --time TEXT      Update the image time. Time should be in YYYY-mm-dd
                   hh:ii:ss or YYYY-mm-dd format.
  --title TEXT     Update the image title.
  --help           Show this message and exit.

(重新)生成校验和数据库

Usage: elodie.py generate-db [OPTIONS]

  Regenerate the hash.json database which contains all of the sha256
  signatures of media files. The hash.json file is located at ~/.elodie/.

Options:
  --source DIRECTORY  Source of your photo library.  [required]
  --help              Show this message and exit.

验证库以防止比特腐化/数据损坏

Usage: elodie.py verify

排除文件夹和文件以进行导入

如果您有特定文件夹或文件希望防止导入,您可以提供正则表达式,这些正则表达式将被用来匹配并跳过导入的文件。

您可以在运行时通过使用import命令的--exclude-regex参数来指定排除项。您可以传递多个--exclude-regex参数,所有匹配的文件夹/文件路径都将(静默地)被跳过。

如果您绝对不想导入某些文件或文件夹路径,您还可以在config.ini文件中添加一个[Exclusions]部分。类似于命令行参数,您可以提供多个排除项。以下是一个示例。

[Exclusions]
synology_folders=@eaDir
thumbnails=.thumbnails

创建自己的文件夹结构

好的,如果你不喜欢文件夹命名为 2015-07-Jul/Mountain View,怎么办呢?没问题!

你可以通过编辑你的 config.ini 文件来添加自定义文件夹结构(该文件应该放置在 ~/.elodie/config.ini 下)。如果你想使用不同的配置文件文件夹,请设置一个名为 ELODIE_APPLICATION_DIRECTORY 的环境变量,并使用完整的目录路径。

自定义文件夹示例

有时候,示例比解释更容易理解,所以我将从这里开始。如果你想了解我的魔法,我将在以下示例中详细介绍。你可以在 config.iniDirectory 部分自定义你的文件夹结构。有关支持的格式详细信息,请参阅 strftime.org

[Directory]
location=%city, %state
year=%Y
full_path=%year/%location
# -> 2015/Sunnyvale, California

location=%city, %state
month=%B
year=%Y
full_path=%year/%month/%location
# -> 2015/December/Sunnyvale, California

location=%city, %state
month=%m
year=%Y
full_path=%year-%month/%location
# -> 2015-12/Sunnyvale, California

date=%Y
location=%city, %state
custom=%date %album
full_path=%location/%custom
# -> Sunnyvale, California/2015 Birthday Party

使用后备文件夹

有时候,正确命名文件夹所需的 EXIF 信息不存在于照片中。我提出了后备文件夹来帮助你处理这种情况。下面是如何工作的。

你可以通过用 | 分隔来指定一系列文件夹名称。这是一个管道符号,不是一个 L。让我们看看一个例子。

[Directory]
month=%m
year=%Y
location=%city
full_path=%month/%year/%album|%location|%"Beats me"

这要求我使用在 EXIF 中找到的专辑名称来命名最后一个文件夹。如果我没有在 EXIF 中找到专辑,则应使用位置。如果没有 GPS 在 EXIF 中,则应将最后一个文件夹命名为 Beats me

文件夹自定义的工作方式

你可以通过组合位置、日期和相机制造商/型号来构建你的文件夹结构。在你的 config.ini 文件的 Directory 部分中,你可以定义占位符名称并为每个分配一个值。例如,date=%Y-%m 将创建一个具有值 YYYY-MM 的日期占位符,该值将使用照片的 EXIF 中的日期填充。

占位符可以用来定义你想要创建的文件夹结构。默认结构看起来像 2015-07-Jul/Mountain View

我有一些可以自定义的日期占位符。你可以使用任何 标准的 Python 时间指令来自定义日期格式。

  • %day 照片拍摄的日期。
  • %month 照片拍摄的月份。
  • %year 照片拍摄的年份。

我有一些相机制造商和型号占位符,可以用来将相机制造商和型号包含到文件夹路径中。

  • %camera_make 拍摄照片的相机制造商。
  • %camera_model 拍摄照片的相机型号。

我还提供了一些内置的位置占位符,你可以使用它们来构建在 full_path 中使用的 %location

  • %city 照片拍摄的城市名称。需要 EXIF 中的地理位置数据。
  • %state 照片拍摄的州名称。需要 EXIF 中的地理位置数据。
  • %country 照片拍摄的国家名称。需要 EXIF 中的地理位置数据。

除了我的内置和日期占位符,你还可以将它们组合成一个单一的文件夹名称,使用我的复杂占位符。

  • %location 可以用来组合 %city%state%country 的多个值。例如,location=%city, %state 将导致文件夹名称如 Sunnyvale, California
  • %date 可以用来组合来自 标准的 Python 时间指令 的多个值。例如,date=%Y-%m 将导致文件夹名称如 2015-12
  • %custom 可以用来组合来自其他任何东西的多个值。将其视为当 %location%date 无法满足你的需求时的一个通配符。

文件自定义的工作方式

您可以使用占位符来配置Elodie如何命名您的文件。这与文件夹定制的工作方式类似。默认命名格式在本文档的其他地方有所提及,并具有许多深思熟虑的优点。使用默认设置将使您的文件命名类似于 2015-09-27_01-41-38-_dsc8705.jpg

  • 最大程度地减少命名冲突的可能性。
  • 将重要的EXIF信息编码到文件名中。
  • 优化排序顺序,以便在大多数文件和图片查看器中列出。

如果您想指定自己的命名约定,建议您包含一些几乎唯一的元素,如包含秒的时间。您需要在 config.ini 文件中包含一个带有名称属性的 [File] 部分。如果一个占位符没有值,那么它以及任何前面的非字母字符将被删除。

默认情况下,生成的文件名全部是小写的。要更改此行为为大写,请添加 capitalization=upper。

[File]
date=%Y-%m-%b-%H-%M-%S
name=%date-%original_name-%title.jpg
# -> 2012-05-mar-12-59-30-dsc_1234-my-title.jpg

date=%Y-%m-%b-%H-%M-%S
name=%date-%original_name-%album.jpg
capitalization=upper
# -> 2012-05-MAR-12-59-30-DSC_1234-MY-ALBUM.JPG

通过更改位置和日期进行重新组织

如果您注意到一些照片组织不当,您应该告诉我。在上面的示例中,我将两张照片放入了 未知位置 文件夹,因为我没有在它们的EXIF中找到GPS信息。为了解决这个问题,我会帮助您将这些照片的GPS信息添加到EXIF中,然后我会重新组织它们。

告诉我您的照片是在哪里拍摄的

如果您想告诉我照片是在拉斯维加斯拍摄的,请运行以下命令。虽然您不需要全部输入,但直接输入 ./elodie.py update --location="拉斯维加斯,NV" 并将文件从 OS X Finder 拖放到终端会更简单。

./elodie.py update --location="Las Vegas, NV" /where/i/want/my/photos/to/go/2015-09-Sep/Unknown\ Location/2015-09-27_01-41-38-_dsc8705.dng /where/i/want/my/photos/to/go/2015-09-Sep/Unknown\ Location/2015-09-27_01-41-38-_dsc8705.nef

运行该命令后,您应该会看到这个。

└── 2015-09-Sep
│   ├── Las Vegas
    │   ├── 2015-09-27_01-41-38-_dsc8705.dng
    │   └── 2015-09-27_01-41-38-_dsc8705.nef

告诉我您何时拍摄了照片

如果您在组织照片时日期有误,请运行以下命令。与上面的命令类似,您可以将文件从 Finder 拖放到终端。

./elodie.py update --time="2015-04-15" /where/i/want/my/photos/to/go/2015-09-Sep/Unknown\ Location/2015-09-27_01-41-38-_dsc8705.dng /where/i/want/my/photos/to/go/2015-09-Sep/Unknown\ Location/2015-09-27_01-41-38-_dsc8705.nef

这将改变日期文件夹如下。

└── 2015-04-Apr
│   ├── Las Vegas
    │   ├── 2015-09-27_01-41-38-_dsc8705.dng
    │   └── 2015-09-27_01-41-38-_dsc8705.nef

当然,您可以要求我更改位置和时间。我会很乐意更新照片并相应地移动它们。

./elodie.py update --location="Las Vegas, NV" --time="2015-04-15" /where/i/want/my/photos/to/go/2015-09-Sep/Unknown\ Location/2015-09-27_01-41-38-_dsc8705.dng /where/i/want/my/photos/to/go/2015-09-Sep/Unknown\ Location/2015-09-27_01-41-38-_dsc8705.nef

关于我未来拍摄的照片怎么办?

组织现有的照片非常好。但如果我说我只是其中之一能帮您做这件事,那我就撒谎了。与其他程序不同,我为将来的图书馆组织投入了与最初组织一样多的努力。

让我知道您何时有更多照片要组织

为了整理我尚未整理的新照片,我需要有人告诉我它们的情况。没有唯一的方法可以做到这一点。您可以使用inotify、cron、Automator或我最喜欢的应用程序Hazel;这无关紧要。

如果您想让我知道要添加到您图书馆的具体照片或照片组,请运行以下命令之一。由于您不会手动运行此命令,请使用完全合格的路径。

# I can import a single file into your library.
./elodie.py import --destination="/where/i/want/my/photo/to/go" /full/path/to/file.jpg

# I can also import all the photos from a directory into your library.
./elodie.py import --destination="/where/i/want/my/photo/to/go" /where/my/photos/are

为什么不用数据库呢?

看,我不是认为数据库是邪恶的。我的一个朋友就是数据库。只是我做这件事已经很长时间了,我总是使用数据库。最后,它们带来的麻烦比它们的价值大。我应该听从母亲的话,不要和数据库交往。

没有数据库整理照片需要更多的工作。难怪每个人都使用它们。但您的快乐就是我的快乐。如果我在这里付出一点努力能让您快乐,那我乐意做。

关于我如何在不使用数据库的情况下做所有这些的简要说明

每张照片本质上都是一个数据库。所以,更准确地说,我使用您已经拥有的数千个微型的数据库来组织您的照片。

我很简单。我将照片放入正确的位置。我可以更新照片,使其日期或位置正确。后者触发前者;形成一个组织良好的良性循环。

我不会做其他任何事情,所以不要费心问我。

EXIF 和 XMP 标签

当我组织照片时,我会查看嵌入的元数据。以下是我按照优先级确定要使用哪些信息的详细情况。

尺寸 字段 备注
拍摄日期(照片) EXIF:DateTimeOriginal,EXIF:CreateDate,EXIF:ModifyDate,文件创建,文件修改
拍摄日期(视频,音频) QuickTime:CreationDate,QuickTime:CreationDate-und-US,QuickTime:MediaCreateDate,文件创建,文件修改
位置(照片) EXIF:GPSLatitude/EXIF:GPSLatitudeRef,EXIF:GPSLongitude/EXIF:GPSLongitudeRef
位置(视频,音频) XMP:GPSLatitude,Composite:GPSLatitude,XMP:GPSLongitude,Composite:GPSLongitude 复合标签是只读的
标题(照片) XMP:Title
标题(视频,音频) XMP:DisplayName
相册 XMP-xmpDM:Album,XMP:Album XMP:Album 在 configs/ExifTool_config 中由用户定义,以实现向后兼容
相机品牌(照片,视频) EXIF:Make,QuickTime:Make
相机型号(照片,视频) EXIF:Model,QuickTime:Model

使用 MapQuest 的 OpenStreetMap 数据

我使用 MapQuest 帮助您根据位置组织您的照片。您需要注册一个免费开发者账户 并获取一个 API 密钥。他们每月提供 15,000 次调用,所以我不能做更多,除非您支付一大笔钱。一旦我达到我的限制,我最好的办法是 未知位置 直到下一个月。

注册后,您需要获取一个 API 密钥并将其复制到名为 ~/.elodie/config.ini 的文件中。我已经包括了一个 config.ini-sample 文件,您可以将其复制到 config.ini

mkdir ~/.elodie
cp config.ini-sample ~/.elodie/config.ini
# now you're ready to add your MapQuest key

如果您是英语使用者,那么您可能希望向 [MapQuest] 部分添加 prefer_english_names=True,否则您将看到使用当地语言的城镇名称。

有疑问、评论或担忧吗?

提供反馈的最佳方式是通过打开GitHub 问题 或通过电子邮件jaisen@jmathai.com 发送给我。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。

源代码发行版

此发行版没有可用的源代码发行版文件。请参阅生成发行版存档 的教程。

构建发行版

elodie-0.0.1b0-py3-none-any.whl (33.0 kB 查看散列值)

上传时间 Python 3

支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面