指定フォルダの写真を自動アップロードする@Mac

Android写真をDropboxにバックアップしたら、「これを自動でFlickrにアップロードできれば楽なんじゃない?」と思いついた。ほとんどGoogle先生に聞いたらできたよ。ちなみに自分の環境は、Mac、Python2.5。

flickrapiをインストール

FlickrのAPIを利用する必要があるので、APIがモジュール化されたflickrapiをインストールする。easy_installを使えば、すぐに完了。

 

easy_install flickrapi

 

Pythonスクリプトを作成

ここを参考にすれば、すぐにできる。

Flickr 一括アップローダ – SPEAKER BREAKA

 

Flickr APIのキーを取得しようね。そして、ちょっとだけ自分用にカスタマイズしました。

 

#!/usr/bin/python 
# -*- coding:utf-8 -*-
from __future__  import with_statement
import sys
import os
import threading
import time
import re
import flickrapi
import shutil

API_KEY = "取得したAPIキー";
API_SECRET = '取得したAPIシークレット'

PAT_EXT = re.compile(r'\.(jpg|jpeg|avi)', re.I)
pict_dir = '.'

		
class UploadWorker(threading.Thread):
	"""
	"""
	def __init__(self, flickr, files, lock, name=None, args=(), kwargs={}):
		"""コンストラクタ"""
		super(UploadWorker, self).__init__()
		self.flickr = flickr
		self.files = files
		self.lock = lock
		
	def _pop_file(self):
		"""
		"""
		with self.lock:
			try:
				f = self.files.pop()
			except IndexError:
				f = None
			return f

	def run(self):
		"""
		"""
		while True:
			f = self._pop_file()
			if f is None:
				break

			print "[%s] Upload start: %s" % (self.getName(), f)
			try:
				# プライベート設定はここで。プライベートにするなら全部ゼロ
				self.flickr.upload(os.path.join(pict_dir, f), is_public=0, is_family=0, is_friend=0)
			except: print "[%s] Failed... Skip" % self.getName()
			else: print "[%s] OK: %s" % (pict_dir + "/" + f, f)

			# 画像をDropboxフォルダから移動
			shutil.move(pict_dir + "/" + f, "移動先ディレクトリ")

def init_flickr():
	"""Initialize and authenticate FlickrAPI"""
	flickr = flickrapi.FlickrAPI(API_KEY, API_SECRET)
	(token, frob) = flickr.get_token_part_one(perms='write')
	if not token: raw_input("Press ENTER after you authorized this program")
	flickr.get_token_part_two((token, frob))
	return flickr

def main():
	"""
	"""
	# 画像ディレクトリ設定
	global pict_dir
	pict_dir = "画像を格納するDropboxディレクトリ"

	# 画像ファイル名取得
	files = [f for f in os.listdir(pict_dir) if not f.startswith('.') and PAT_EXT.search(f)]
	if len(files) == 0:
		print "No files in the directory."
		sys.exit()
		print "File num: %s" % len(files)

		# Flickr API 初期化 & 認証
		flickr = init_flickr()

		# アップロード
		lock = threading.Lock()
		workers = []
		for i in xrange(5):
			w = UploadWorker(flickr, files, lock)
			workers.append(w)
			w.start()

		# 処理終了待ち
		for w in workers:
			w.join()
			print 'Done.'

def _test():
	import doctest
	doctest.testmod()

if __name__ == '__main__':
	main() 

 

Mac起動時に自動実行

自動実行するためにどうしようか考えていたが、Platypusという、スクリプトをアプリ化してくれるフリーソフトがあった。

Platypus | Macの手書き説明書

 

これでアプリを作って、「システム環境設定」⇒「アカウント」⇒「ログイン項目」に追加しておしまい。

これでここ数日運用してみたところ、GalaxySで撮った写真が自動でFlickrにアップロードすることができたので、満足。