Google App Engine で Picasa と連携してみた

Google App EnginePicasaから写真を取得するコードを書いたのでメモ。
ネットで調べていたら、@shin1ogawaさんがズバりなコードを書いていたのでパクらせてもらいましたw

アプリの内容

リクエストを受け取ったら、ServletPathを元にPicasaから写真取得し、出力するServletを作成する

1.appengine-web.xmlでの設定

開発環境だと動くんだけど、プロダクション環境にアップして写真が出力されず、暫くハマった。
で、こんな設定があるのを思い出した。


  
  
  
  

この設定を行わないと、「/images/aaa.jpg」へのリクエストが静的ファイルとして扱われ、ファイルが見つからん!と怒られてしまう。

2.写真の取得

最初の考えは、ServletPathから取得したファイル名でPicasaから写真を取得するつもりだった。
が、どーやらそんな機能は無いようなので、写真のリストを取得することにした。

写真のリストを取得
List getPhotoList() throws IOException, ServiceException {
  URL feedUrl = new URL("http://picasaweb.google.com/data/feed/api/user/" + user + "/albumid/" + albumId);
  AlbumFeed feed = service.getFeed(feedUrl, AlbumFeed.class);
  List list = new ArrayList();
  for (GphotoEntry entry : feed.getEntries()) {
   list.add(new PicasaPhoto(
    entry.getId(),  // id
    albumId,  // アルバムid
    entry.getTitle().getPlainText(),  // ファイル名
    entry.getMediaEditLink().getHref()));  // url
 }
 return list;
}

このコードで、指定したアルバムの写真一覧が取り出せる。
ここから、写真名をキーとしたmapを作成し、『ServletPathから取得したファイル名⇒Picasaの写真を取得』という流れができる。

3.写真を出力

String url = photoMap.get(fileName);
HTTPResponse response = URLFetchServiceFactory.getURLFetchService().fetch(url);
byte[] image = response.getContent();
response.setContentType("image/jpeg");
response.setContentLength(protect.length);
response.getOutputStream().write(protect);

ServletPathからファイル名を取得し、mapに格納した情報を元にidを取得し、URLフェッチを利用してPicasaの写真を取得する流れ。
その後はServletで画像を出力するときのいつものコード

4.まとめ

かなりコードを省略したけど、こんな感じでGoogle App EnginePicasaを連携させて画像を出力するプログラムができた。
他にも写真のアップロードなどもできるみたいだが、それは専用のアプリを利用するつもり。

写真を取得する肝となるmapをどのタイミングで作るか考えたが、Servletの初期化時で今のところspin-upも問題無さそう。
まだ写真の数が少ないので今後対処する必要があるかも知れないけど。