サブディレクトリ以下も含むすべての画像をFlickrにアップロードする。 with Flickr.NetとPowerShell

今まで撮り貯めた大量の写真をクラウド上で管理しようと思い立ち、Flickrのプレミアムアカウントに登録した。
ローカルにある大量にある画像ファイル(日付ごとにフォルダ分けされている)を一括でアップロードしようと思い、ツール類を探したけどサブディレクトリ配下も含め一括でアップロードするツールって無いみたい・・・
FlickrAPIをしこしこ使うかと思っていたところ、Flickr.Netなる物を発見。PowerShellの勉強がてらアップロードスクリプトを組んでみた。

事前準備

FlickrAPIキーを取得
http://www.flickr.com/services/apps/create/apply
から Non-Commercial Keyを取得 
What's the name of your app? は Bulk Upload Batch とか適当に
What are you building? は Bulk upload from my local file とか適当に
下二つのチェックボックスにチェックを入れるとAPI Keyがもらえるのでそれをメモ


Flickr.Netの取得
http://flickrnet.codeplex.com/
の、Downloadsからダウンロード。解凍してその中のFlickrNet.dllをC:\temp\以下に配置


PowerShellの環境設定
コマンドラインよりPowerShellを起動して

PS C:\ > Set-ExecutionPolicy RemoteSigned

として、スクリプトを実行可能なように権限変更。
PowerShellってそのままだと自作スクリプト動かせないのね・・・

スクリプト作成

以下のスクリプトをコピーして、Upload.ps1 とか適当な名前でC:\の直下にでも保存

#可変部分 任意に書き換えてください
$apikey = "自分のAPI Key"
$secret = "自分の Secret"
#アップロードするローカルディレクトリ。このディレクトリ以下サブディレクトリもアップロードされます
$uploadDir = "c:\写真"

#DLL 読み込み
[void][System.Reflection.Assembly]::LoadFile("C:\Temp\FlickrNet.dll")
#FlickrNetの認証処理
$fckr = New-Object FlickrNet.Flickr($apikey, $secret)
$frob = $fckr.AuthGetFrob()
$url = $fckr.AuthCalcUrl($frob, [FlickrNet.AuthLevel]::Write)
[System.Diagnostics.Process]::Start($url)

#ブラウザで認証画面が上がるので、認証後に処理を続行できるようにキー入力待ちにしておく
Write-Host "Press any key to continue ..."
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
 
#認証の取得
$auth = $fckr.AuthGetToken($frob)
$fckr.AuthToken = $auth.Token

#サブディレクトリ内のファイルも含めループ
#jpgだけをUpload対象
dir $uploadDir -Recurse -include *.jpg | % {
	#Uploadするファイルの情報を設定
	#アップロード対象のファイルパス
	$file = $_.FullName
	#タイトル
	$title = ""
	#詳細
	$descripton = ""
	#タグ 一応目印をつけておく
	$tags = "BulkUpload"
	 
	#アップロードする
	$x = $fckr.UploadPicture($file, $title, $description, $tags)
	Write-Host "upload : " $_.FullName
}
Write-Host "end upload"



下記部分は任意に書き換え

$apikey = "自分のAPI Key"
$secret = "自分の Secret"

の部分に自分で取得したAPI Keyと Secretを入れておく

$uploadDir = "c:\写真"

は、Upload対象のディレクトリを指定

スクリプト実行

コマンドラインからPowerShellを起動して

PS C:\> ./Upload.ps1

のように実行するとブラウザの認証画面が出るので、認証してからコマンドラインに戻り何かキーを押すと処理が続行される。


こんな感じ



1枚あたり2〜30秒でアップロードされます。
UploadPictureAsyncメソッドを使えば平行アップロードできそうなんだけど、確実性をとって直列アップロードです。
※15,000枚くらいのファイルアップロードしたら30時間くらいかかった・・・

さいごに

PhotoStreamの並びがめちゃくちゃだったり、setも設定できないので、iPhoneiPhotoで見たときに見づらいのでsetもスクリプトで設定したいなー。
Flickr.Netのヘルプを見ると、いろんなAPIがあるので、だいたいのことは出来そう。


PowerShellも初めて触ったけど、便利だね−

参考サイト

PowerShellについて
http://www.atmarkit.co.jp/fwin2k/win2ktips/1023ps1sec/ps1sec.html
Flickr.Netのサンプル 基本はこのページからのパクリです
http://blogs.gine.jp/kusa/archives/15