1. 程式人生 > >用指令碼將本地照片庫批量匯入到Day One中

用指令碼將本地照片庫批量匯入到Day One中

因為目前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.s