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
バッチのコントローラクラスです。
@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
ご参考まで。