用指令碼將本地照片庫批量匯入到Day One中
阿新 • • 發佈:2019-07-21
因為目前iCloud 空間已經不足,其中95%都是照片,之前入手了DayOne,且空間沒有限制,訂閱費一年也不少,再加上DayOne作為一款日記App 也比較有名,功能方面最大的就是地理檢視與照片檢視,尤其是去年今日,平常用來記記東西比較方便,目前支援語音,暫時還不支援視訊,上次發了封建議郵件,答覆目前正在測試階段,下一個大版本就支援,另一個不足的是不支援模板,比較背景,彩色字型,開發者答覆目前沒有這個計劃。
工具
- python+Anaconda+PyCharm(也是學習python一個練手機會)
- magick (圖片處理,不丟失exif資訊)
- exiftool (提取照片exif資訊,插入到Dayone中,尤其是地理位置與建立時間)
- pandas (解析csv)
- shutil (檔案複製)
流程如下:
效果如下
匯入DayOne中,時間比較長,因為沒有使用多執行緒(不會)
問題
- 取到的GPS 座標是度分秒轉換成x.xxx後,位置有一定的偏移,可能是地圖導致
- 部分照片沒有exif資訊,只有先按上海的座標和今天的建立時間匯入後,到時候手動修改
- 蘋果的heic格式的照片在轉換時,失敗,查了下magick是支援讀取,但是報錯,暫時沒有處理
與Alfred 結合
- 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