ブログ移転
Tinkerer にしました!
ホーム — yuyunko's blog
http://yuyunko.bitbucket.org/blog/html/index.html
rubyでFlickrに全写真アップロード
いよいよFlickrに全写真をアップロード。
Flickr.rb
# -*- encoding: utf-8 -*- require 'pp' require 'rubygems' require 'flickraw' class MyFlickr < FlickRaw::Flickr API_KEY='' SHARED_SECRET='' ACCESS_TOKEN='' ACCESS_SECRET='' def initialize FlickRaw.api_key = API_KEY FlickRaw.shared_secret = SHARED_SECRET @flickr = FlickRaw::Flickr.new @flickr.access_token = ACCESS_TOKEN @flickr.access_secret = ACCESS_SECRET end def uploadPhotos(path=".") Dir.chdir(path) pp Dir.pwd Dir.glob('*.{jpg,jpeg,png}',File::FNM_CASEFOLD).each do |f| puts "#{f}" begin photo = @flickr.photos.search(:user_id => 'me', :text => "#{f}") if photo.to_a.empty? then @flickr.upload_photo "#{f}", :title => "#{f}", :is_public => 0, :is_friend => 0, :is_family => 0 puts "#{Time.now} upload success #{f}" else puts "#{f} is already uploaded." end rescue => ex puts "#{Time.now} error raised" puts ex.message end end end end
uploadFlickr.rb
# -*- encoding: utf-8 -*- require 'pp' require 'rubygems' require 'flickraw' $:.unshift(File.dirname(__FILE__)) # http://cyakarin.kuronowish.com/index.cgi?path require './Flickr.rb' myflickr = MyFlickr.new if ARGV.size == 1 then myflickr.uploadPhotos ARGV[0] else myflickr.uploadPhotos end
これでFlickrに写真を全てアップロード出来る。
既にアップロードされているかどうかを毎回検索してアップロードされて
いなければアップロードする、という処理を行なっている。
なので非常に遅い・・・。
次はアップロードされている写真をsqliteかなんかのDBに格納しておいて、
そのDBと比較してアップするか否かを決める方針にしたい。
重複ファイル削除
先ほどの記事にてexiftoolで
写真の整理を行う方法を書いたが、この方法だとたくさんの重複ファイルが出来る可能性が
ある。
そこでmd5sumを用いて重複ファイルの整理を行うスクリプトを書いた。
#!/bin/bash # tmp_dir TMP_DIR=_TMP_DELETE_FILES_ TMP_FILE=_TMP_ONLY_UNIQ_LIST_ if [ ! -d ${TMP_DIR} ]; then mkdir ${TMP_DIR} fi find . -type f -maxdepth 1 -print0 | xargs -0 -I{} mv -iv {} "${TMP_DIR}" cd "${TMP_DIR}" find . -type f -maxdepth 1 -print0 | xargs -0 md5sum >> ${TMP_FILE} sort -rk 1 ${TMP_FILE} | uniq -w 32 | cut -d ' ' -f 3- | while read UNIQ_MD5_FILE do mv -iv "${UNIQ_MD5_FILE}" ../ done cd ../ rm ${TMP_FILE}
重複ファイルのあるディレクトリでこのスクリプトを実行すると、_TMP_DELETE_FILES_というディレクトリ
が作成され、その中に重複ファイルが入る。
後はそのディレクトリを丸ごと削除すればおk
yyyy-mm ディレクトリがたくさんある場合、for文で全てに実行出来る。
上記のスクリプトをOnlyUniqFile.shという名前で~/に保存したとすると、
$ cd ~/Pictures $ for i in * $ do $ cd "$i" $ ~/OnlyUniqFile.sh $ cd ../ $ done
これで全てのディレクトリに_TMP_DELETE_FILES_というディレクトリが出来て、
その中に重複ファイルが格納される。
全て削除するには、
$ find ~/Pictures -name "_TMP_DELETE_FILES_" -exec rm -rf {} +
で出来る。
exiftoolを使った写真の整理方法
exiftoolを使った写真の整理方法
Flickrにローカルの全写真をアップしたい。
ということで、その前にローカルの写真を整理。
exiftoolを使用すると簡単に整理出来る。
$ brew install exiftool
写真がたくさん入っているディレクトリで以下を実行。
$ exiftool '-FileName < CreateDate' -d ~/Pictures/%Y-%m/%Y-%m-%d_%H-%M-%S%%-c.%%e *.(JPG|jpg)
これで、例えば
~/Pictures/2012-06/2012-06-23_10-23-34.JPG
~/Pictures/2012-06/2012-06-25_11-23-34.JPG
~/Pictures/2012-07/2012-07-05_01-13-54.JPG
~/Pictures/2012-07/2012-07-05_01-51-54.JPG
...
のようにフォルダ分けされて、写真の名前もEXIF情報にもとづいてリネームされる。
また、同じ名前のファイルが既にあった場合は、以下のようになる。
~/Pictures/2012-06/2012-06-23_10-23-34.JPG
~/Pictures/2012-06/2012-06-25_11-23-34.JPG
~/Pictures/2012-06/2012-06-25_11-23-34-1.JPG
~/Pictures/2012-06/2012-06-25_11-23-34-2.JPG
~/Pictures/2012-06/2012-06-25_11-23-34-3.JPG
これで写真は整理出来る。
しかし、中にはEXIFのCreateDateが設定されていないファイルも存在する。
この場合、FileModifyDateが使用出来たりするのでこちらを用いる事も出来る。
$ exiftool '-FileName < FileModifyDate' -d ~/Pictures/%Y-%m/%Y-%m-%d_%H-%M-%S%%-c.%%e *.(png|PNG)
また、m2tsの動画ファイルなんかは、DateTimeOriginalが設定されていることもある。
$ exiftool '-FileName < DateTimeOriginal' -d ~/Movies/%Y-%m/%Y-%m-%d_%H-%M-%S%%-c.%%e *.(m2ts|M2TS)
そのファイルに何が設定されているか確認するには以下の通り
$ exiftool -s hoge.jpg
rubyでFlickrの写真全部削除
Flickrに写真を全部アップロードするにあたって、
まず既存のよくわからん写真を全て削除。
# -*- encoding: utf-8 -*- require 'pp' require 'rubygems' require 'flickraw' class MyFlickr < FlickRaw::Flickr API_KEY='' SHARED_SECRET='' ACCESS_TOKEN='' ACCESS_SECRET='' def initialize FlickRaw.api_key = API_KEY FlickRaw.shared_secret = SHARED_SECRET @flickr = FlickRaw::Flickr.new @flickr.access_token = ACCESS_TOKEN @flickr.access_secret = ACCESS_SECRET end def deletePhotos list = @flickr.photos.search :user_id => 'me' pp pages = list.pages pages.times do |i| @flickr.photos.search(:user_id => 'me').each do |photo| pp photo @flickr.photos.delete :photo_id => photo.id #sleep 1 end end end end if __FILE__ == $0 myflickr = MyFlickr.new myflickr.deletePhotos end
rbenvインストール方法ぼうびろく
rbenvのインストール方法
$ brew install rbenv $ brew install ruby-build $ brew install readline $ brew install openssl $ brew link readline $ brew link openssl $ CONFIGURE_OPTS="--with-readline-dir=/usr/local --with-openssl-dir=/usr/local" rbenv install 1.9.3-p194 $ rbenv global 1.9.3-p194 $ rbenv rehash
また、以下を.zshrcに記述しておく。
# rbenv if which rbenv > /dev/null; then eval "$(rbenv init -)" if [ -d "${HOME}/.rbenv/completions" ]; then source ~/.rbenv/completions/rbenv.zsh fi # http://d.hatena.ne.jp/clmind/20111109/1320814435 alias gem='rbenv exec gem' fi
rubyでFlickr API
Flickrに写真を大量にアップしたい。
その為にrubyでFlickr APIを使用する。
とりあえず自分の写真のPhoto_IDを取ってくるとこまで・・・
flickrawというgemを使った。
searchで自分を指定する場合、'me'とすればいいらしい。
(通常は@を含むUSER_ID)
# -*- encoding: utf-8 -*- require 'pp' require 'rubygems' require 'flickraw' class MyFlickr < FlickRaw::Flickr API_KEY='' SHARED_SECRET='' ACCESS_TOKEN='' ACCESS_SECRET='' def initialize FlickRaw.api_key = API_KEY FlickRaw.shared_secret = SHARED_SECRET @flickr = FlickRaw::Flickr.new @flickr.access_token = ACCESS_TOKEN @flickr.access_secret = ACCESS_SECRET end def printPhotos list = @flickr.photos.search :user_id => 'me' list.each do |photo| p photo p photo.id sleep 1 end end end if __FILE__ == $0 myflickr = MyFlickr.new myflickr.printPhotos end