GeekFactory

int128.hatenablog.com

Picasaアルバムを撮影日ごとに仕分けする

6月に書いた記事のコードを書き直しました。新しいコードはgithubに上げています。

Picasaのアルバムにある写真を撮影日ごとに仕分けするバッチです。図に描くとこんな感じです。

PicasaにアクセスするにはGData APIを使います。Java向けにクライアントライブラリが公開されていますMavenでは公式に配布されていませんが、有志が公開しているリポジトリがあったので利用させて頂きました。

  <repositories>
    <repository>
      <id>mandubian-mvn</id>
      <url>http://mandubian-mvn.googlecode.com/svn/trunk/mandubian-mvn/repository</url>
    </repository>
  </repositories>
...
  <dependencies>
    <dependency>
      <groupId>com.google.gdata</groupId>
      <artifactId>gdata-photos-2.0</artifactId>
      <version>1.41.5</version>
      <exclusions>      
        <!-- deprecated; use guava instead -->
        <!--exclusion>          
          <artifactId>google-collections</artifactId>
          <groupId>com.google.collections</groupId>
        </exclusion-->          
      </exclusions>     
    </dependency>
    <dependency>
      <groupId>com.google.gdata</groupId>
      <artifactId>gdata-photos-meta-2.0</artifactId>
      <version>1.41.1</version>
    </dependency>
  </dependencies>

Mavenを使わない場合は下記を使います。

  • gdata-java-client
    • gdata-client-1.0.jar
    • gdata-client-meta-1.0.jar
    • gdata-core-1.0.jar
    • gdata-media-1.0.jar
    • gdata-photos-2.0.jar
    • gdata-photos-meta-2.0.jar
  • guava-libraries
    • guava-r09.jar
  • Java Mail

バッチのコントローラクラスです。

  • このジョブは毎日2:00に実行されます。
  • 指定したアルバムに含まれる写真を取得し、撮影日ごとに仕分けします。
  • Picasa APIコールが失敗した場合はタスクが再実行されます。
@DailyJob(triggers = @Time(hour = 2), timezone = "Asia/Tokyo")
public class DailyRotateController extends Controller
{
  private static final Logger logger = Logger.getLogger(DailyRotateController.class.getName());

  @Override
  public Navigation run() throws Exception
  {     
    TimeZoneLocator.set(TimeZone.getTimeZone("Asia/Tokyo"));

    PicasaService picasaService = PicasaServiceLocator.getInstance(Constants.CREDENTIAL);
    PhotoArrangementService photoArrangementService = new PhotoArrangementService(picasaService);

    AlbumFeed albumFeed = picasaService.getAlbum(Constants.DROPBOX_ID);
    List<PhotoEntry> photos = albumFeed.getPhotoEntries();
    logger.info(photos.size() + " photos will be arranged by date."); 

    photoArrangementService.arrangeByDate(photos);

    try {       
      JobScheduler jobScheduler = new JobScheduler();
      TaskHandle handle = jobScheduler.nextJob(getClass(), request.getRequestURI());
      logger.info("Next job has been scheduled at "
          + DateUtil.toString(new Date(handle.getEtaMillis()), DateUtil.ISO_DATE_TIME_PATTERN));
    }           
    catch (TaskAlreadyExistsException e) {
      logger.info("Next job has been already scheduled by past task. Perhaps duplicated tasks?");
      e.printStackTrace();
    }           

    return null;
  }     
}

写真の仕分けは PhotoArrangementService クラスの役割です。

  • PhotoArrangementService.java

公開してから一定期間を過ぎたアルバムを削除するバッチも用意しています。今のところ10日を過ぎたアルバムを削除する運用にしています。

  • DeleteOldAlbumsController.java

ご参考まで。