yuyunko's blog

ぼうびろく

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に写真を大量にアップしたい。
その為にrubyFlickr 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