«前の日記(2011-08-01(月)) 最新 次の日記(2011-08-06(土))» 編集
RSS feed

からっぽの日記


2011-08-02(火) [長年日記]

フォト蔵プラグイン改良に向けて調べてみた

jQuery も Ajax もしらない私ですが、プラグインの picasa.rb が画面遷移なしで "アルバム取得→写真のサムネイル表示→テキストエリアに挿入" をできるのを見てすごいと思い、フォト蔵でもできないかなと思ったわけですがムズカシイ。甘くはない...

  • フォト蔵 API は XML で返してくるのでクロスドメイン制限に引っかかる。
  • photo_album APIメソッドは BASIC 認証が必要だ。公開アルバムだけでも認証なしならなぁ...
  • photo_list_public APIメソッドで取得したデータを加工すれば代用できそうだけど、許容なデータ量とかよくわからない... 加工も大変か?
  • アルバムのサムネイルは作れるのかなぁ。テキストで我慢?

jQuery + Ajax なサンプルコード書くまで知らんかったですが、クロスドメイン制限に引っかかるのですね... ということで、画面遷移なしは現実的ではないのかな... 画面遷移ありで考えても、そもそもどう実装するんだか描けてない。プラグインの書き方というか Web の知識がないからな、まだまだ遠い。

とりあえず4年前に書いたソースを晒してみます。bookmarklet で写真 ID を取得して、プラグイン記法をクリップボードにコピーするとかを作るのが私の限界かもなぁ。bookmarklet もよく知らないけど^^;

require "open-uri"
require "rexml/document"
require "kconv"


def photozou(photo_id, size = "medium", place = "photozou")
  photo = photozou_photo_info(photo_id.to_s, size)
  unless photo
    return "[ERROR] photozou.rb: failed to get photo."
  end

  if @cgi.mobile_agent?
    body = %Q|<a href="#{photo[:src]}">#{photo[:title]}</a>|
  else
    body = %Q|<a href="#{photo[:page]}"><img class="#{place}" title="#{photo[:title]}" alt="#{photo[:title]}" src="#{photo[:src]}"|
    body << %Q| width="#{photo[:width]}"| if photo[:width]
    body << %Q| height="#{photo[:height]}"| if photo[:height]
    body << %Q|></a>|
  end

  body
end

def photozou_left(photo_id, size = "medium")
  photozou(photo_id, size, "left")
end

def photozou_right(photo_id, size = "medium")
  photozou(photo_id, size, "right")
end

def photozou_open(photo_id)
  api_photo_info = "http://api.photozou.jp/rest/photo_info?photo_id=#{photo_id}"

  cache_dir = "#{@cache_path}/photozou"
  Dir::mkdir(cache_dir) unless File::directory?(cache_dir)

  file = "#{cache_dir}/#{photo_id}.xml"

  unless File.exist?(file)
    begin
      timeout(5) do
        open(file, "w") do |f|
          open(api_photo_info).each do |line|
            f.puts line
          end
        end
      end
    rescue TimeoutError => e
      File.delete(file)
      raise e
    end
  end

  open(file) {|f| yield f }
end

def photozou_photo_info(photo_id, size = "medium")
  photo_info = {}
  photo_size = {}
  photo_tag = ""

  begin
    photozou_open(photo_id) do |f|
      res = REXML::Document.new(f)
      photo_info[:page]  = res.elements["//rsp/info/photo/url"].text
      photo_info[:title] = res.elements["//rsp/info/photo/photo_title"].text
      photo_info[:src]   = res.elements["//rsp/info/photo/image_url"].text

    case size
    when "small"
        photo_tag = res.elements["//rsp/info/photo/large_tag"].text
      when "medium"
        photo_tag = res.elements["//rsp/info/photo/medium_tag"].text
      when "large"
        photo_tag = res.elements["//rsp/info/photo/large_tag"].text
      else
        photo_tag = res.elements["//rsp/info/photo/medium_tag"].text
      end
    end

    photo_size = get_photo_size(photo_tag, size)
    photo_info[:width]  = photo_size[:width]
    photo_info[:height] = photo_size[:height]
  rescue Exception => e
    return nil
  end

  photo_info
end

def get_photo_size(photo_tag, size)
  photo_size = {}

  if /width="(\d+)".*height="(\d+)"/ =~ photo_tag
    if size == "small"
       photo_size[:width]  = ($1.to_i / 3).to_s
       photo_size[:height] = ($2.to_i / 3).to_s
    else
       photo_size[:width]  = $1
       photo_size[:height] = $2
    end
  end

  photo_size
end

«前の日記(2011-08-01(月)) 最新 次の日記(2011-08-06(土))» 編集
RSS feed