文档章节

用脚本将本地照片库批量导入到Day One中

在山的那边
 在山的那边
发布于 07/20 23:58
字数 961
阅读 38
收藏 0

因为目前iCloud 空间已经不足,其中95%都是照片,之前入手了DayOne,且空间没有限制,订阅费一年也不少,再加上DayOne作为一款日记App 也比较有名,功能方面最大的就是地理视图与照片视图,尤其是去年今日,平常用来记记东西比较方便,目前支持语音,暂时还不支持视频,上次发了封建议邮件,答复目前正在测试阶段,下一个大版本就支持,另一个不足的是不支持模板,比较背景,彩色字体,开发者答复目前没有这个计划。

工具

  1. python+Anaconda+PyCharm(也是学习python一个练手机会)
  2. magick (图片处理,不丢失exif信息)
  3. exiftool (提取照片exif信息,插入到Dayone中,尤其是地理位置与创建时间)
  4. pandas (解析csv)
  5. shutil (文件复制)

流程如下:

效果如下

导入DayOne中,时间比较长,因为没有使用多线程(不会)

问题

  1. 取到的GPS 坐标是度分秒转换成x.xxx后,位置有一定的偏移,可能是地图导致
  2. 部分照片没有exif信息,只有先按上海的坐标和今天的创建时间导入后,到时候手动修改
  3. 苹果的heic格式的照片在转换时,失败,查了下magick是支持读取,但是报错,暂时没有处理

与Alfred 结合

  1. magick在转换单张照片时速度比较快,到时候写个脚本配合Alfred 做一个照片处理,很多时候在写文档时都需要贴图,在Mac上截图的图片通常比较大,目前用imageOptim,单张图片处理时间比较长。

代码

# -*- coding: utf-8 -*-

import os
import shutil
import pandas as pd



#分离文件
def separateImgByType(path, targetPath, type=[".mp4", ".mov"]):

    if not os.path.exists(targetPath):
        os.makedirs(targetPath)

    for obj in os.listdir(path):

        if obj == '.DS_Store': continue

        suffix = os.path.splitext(os.path.join(sourcePath, obj))[1].lower()

        if suffix in type:
            shutil.move(os.path.join(path, obj), os.path.join(targetPath, obj))


#删除文件名空格
def delfileNameSpace(path):
    for obj in os.listdir(path):
        if " " in obj:
            os.rename(os.path.join(path, obj), os.path.join(path, obj.replace(" ", "~")))



def convertImg(path, targetPath, size, rate=60):

    if not os.path.exists(targetPath):
        os.makedirs(targetPath)

    rateStr = str(rate) +"%";

    for obj in os.listdir(path):

        if obj == '.DS_Store': continue

        objSize = os.path.getsize(os.path.join(path, obj))

        if objSize <= size:
            shutil.copyfile(os.path.join(path, obj), os.path.join(targetPath, obj))
            continue;


        srcfrom = os.path.join(path, obj)

        srcto = os.path.join(targetPath, obj)

        cmd = "magick convert -resize %s %s %s" % (rateStr, srcfrom, srcto)

        print(cmd)

        os.system(cmd)

def createExifInfo(path):
    csvpath = os.path.join(path, "exifInfo.csv")
    cmd = "exiftool -f -r -p '$filename,$CreateDate,$GPSLatitude,$GPSLongitude,$ImageSize,$LensModel' %s > %s" % (path, csvpath)
    os.system(cmd)


def getExifInfo(path):

    list_data = pd.read_csv(path).to_records()

    return list_data

def convertGeo(geo,type):
    GPSLatitudList = str(geo).split("'")
    d = 0
    m = 0
    s = 0
    d = int(GPSLatitudList[0] if GPSLatitudList[0] != 0 else 0)
    if len(GPSLatitudList) == 2:
        m = int(GPSLatitudList[1] if GPSLatitudList[1] != 0 else 0)
    if len(GPSLatitudList) == 3:
        d = int(GPSLatitudList[2] if GPSLatitudList[2] != 0 else 0)

    dmd = d + m / 60.0 + d / 3600.0

    if dmd == 0.0 and type == 'Latitud': #121.549927,31.277549
        return 31.277549
    elif dmd == 0.0 and type == 'Logitud':
        return 121.549927
    else:
        return dmd


if __name__ == '__main__':

    size = 1.5 * 1024 * 1024

    sourcePath = "/Users/[xxxx]/Desktop/photo/"

    compactPath = "/Users/[xxxx]/Desktop/compactTarget"

    videoPath = "/Users/[xxxx]/Desktop/video/"

    HEICPath = "/Users/[xxxx]/Desktop/heic/"

    #separateImgByType(sourcePath, videoPath);

    #separateImgByType(sourcePath, HEICPath, (".HEIC"));

    #delfileNameSpace(sourcePath)

    #convertImg(sourcePath, compactPath, size)

    #createExifInfo(compactPath)

    listdata = getExifInfo(os.path.join(compactPath, "exifInfo.csv"))

    for obj in listdata:
        cmd = "dayone2 new '[%s]' '[%s]' -p '/Users/Spring/Desktop/photo1/%s' -d '%s' -j Import -coordinate %f %f"
        filename = obj[1]
        CreateDate = str(obj[2]) if str(obj[2]) != 'nan' else '2019-07-20 09:00:00'
        GPSLatitud = str(obj[3]) if str(obj[3]) != 'nan' else 0 #纬度
        GPSLogitud = str(obj[4]) if str(obj[4]) != 'nan' else 0 #经度
        ImageSize = obj[5]
        LensModel = obj[6]

        #print(CreateDate)

        title = '%s %s' % (filename, CreateDate)

        #print(GPSLatitud,"===",GPSLogitud)

        lt = convertGeo(GPSLatitud, "Latitud")

        lg = convertGeo(GPSLogitud, "Logitud")

        content = '%s ---- %s' % (ImageSize, LensModel)

        CreateDateList = str(CreateDate).split(" ")
        CreateDateList[0] = CreateDateList[0].replace(":","-");
        CreateDate = CreateDateList[0]+" "+CreateDateList[1]

        cmd = cmd % (title,content,filename,str(CreateDate),lt, lg)

        print(cmd)

        os.system(cmd)

© 著作权归作者所有

在山的那边

在山的那边

粉丝 16
博文 58
码字总数 27728
作品 0
长宁
程序员
私信 提问
批量导入Exchange邮箱用户头像

1、首先,我们像批量开启帐号的方法一样,利用CSV文件编辑好要配置邮箱头像的帐号,如下图所示: 2、接着呢,我们将对应员工照片放入对应存放路径,如下图所示: 3、制作PowerShell脚本,以实...

Juck_Zhang
2018/01/11
0
0
照片管理软件 Shotwell 0.8.0 发布

适用于 GNOME 环境的照片管理软件 Shotwell 0.8.0 正式发布,带来视频支持和自动导入功能。 功能亮点: 支持管理主流格式的视频片段,包括从相机导入、添加到事件及增加标签。 允许将视频发布...

红薯
2010/12/25
564
2
服务器之间的svn版本库迁移工作

由于之前的代码是装在一台退役的电脑上,性能已经不够用了,之前已经搭建了开发服务器,因此想把所有的svn版本库迁移到新的开发服务器上面,以下就是自己的迁移过程,供大家参考: 旧服务器:...

Jack鸿燊
2016/03/21
105
2
Exchange 用户归档邮件导入导出PST操作实例

分享一个之前做过的Exchange邮箱数据文件的导入导出操作示例。目录内容如下: 目录 第一步 新建一个Exchange角色组并将其添加到Mailbox Import Export 管理角色中... 4 第二步 创建共享文件夹...

jialt
2017/08/03
0
0
短视频拍摄SDK--EasyVideoRecorder

EasyVideoRecorder是EasyDarwin开源团队成员开发的一款移动端短视频拍摄工具库,类似于美拍、秒拍、微拍的短视频拍摄功能,支持按住拍、滤镜、mv、照片合成、水印、本地视频导入功能,并且还...

EasyDarwin
2016/03/14
4.6K
3

没有更多内容

加载失败,请刷新页面

加载更多

Xss过滤器(Java)

问题 最近旧的系统,遇到Xss安全问题。这个系统采用用的是spring mvc的maven工程。 解决 maven依赖配置 <properties><easapi.version>2.2.0.0</easapi.version></properties><dependenci......

亚林瓜子
28分钟前
2
0
Navicat 快捷键

操作 结果 ctrl+q 打开查询窗口 ctrl+/ 注释sql语句 ctrl+shift +/ 解除注释 ctrl+r 运行查询窗口的sql语句 ctrl+shift+r 只运行选中的sql语句 F6 打开一个mysql命令行窗口 ctrl+l 删除一行 ...

低至一折起
今天
7
0
Set 和 Map

Set 1:基本概念 类数组对象, 内部元素唯一 let set = new Set([1, 2, 3, 2, 1]); console.log(set); // Set(3){ 1, 2, 3 } [...set]; // [1, 2, 3] 接收数组或迭代器对象 ...

凌兮洛
今天
1
0
PyTorch入门笔记一

张量 引入pytorch,生成一个随机的5x3张量 >>> from __future__ import print_function>>> import torch>>> x = torch.rand(5, 3)>>> print(x)tensor([[0.5555, 0.7301, 0.5655],......

仪山湖
今天
5
0
OSChina 周二乱弹 —— 开发语言和语言开发的能一样么

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @花间小酌:#今日歌曲推荐# 分享The Score的单曲《Revolution》 《Revolution》- The Score 手机党少年们想听歌,请使劲儿戳(这里) @批判派...

小小编辑
今天
2.8K
19

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部