読者です 読者をやめる 読者になる 読者になる

Flickrの写真を一括でダウンロードできるアプリを作った

Flickr Fast DownloaderというFlickrから写真やビデオをまとめてダウンロードできるツールを作りました。

http://flickrdownloader.laboone.net/

元々は、Flickrにあげている自分の写真のバックアップを取っておきたいという理由から自分用のツールとして作っていましたが、どうせなら公開しようと思いたち、2月ぐらいから今まで約6ヶ月もかかりましたが、なんとか公開することができました。
ここでは、その作業ログを残しておこうと思います。

=== 追記(2014/8/17) ===
窓の杜さんがFlickr Fast Downloaderの記事を書いてくれました。
機能については、窓の杜さんの以下の記事を参照してください。

シンプルな“Flickr”のバックアップ・ダウンロードツール「Flickr Fast Downloader」
==================

使用した技術について

開発に使った言語はC#です。
GUIWPFを使って作成しました。
mahapps.metroというWPF用のフレームワークがあり、これを使うと良い感じのデザインにできるのでお薦めです。
FlickrOAuth認証回りとGoolge Walletでのライセンス購入回りはASP.NET MVC、Web APIを使いました。

開発についての諸々

スクロールに応じて画像を遅延ロード

写真は画面のスクロールに応じて遅延ロードするようにしています。
これは、WPF Data Virtualizaitonを参考に実装しました。
このキモになるところは、以下のとおりです。

  • IListを継承してCountプロパティでリストに表示する全要素数を非同期で取得
  • 取得したらCollectionChangedのイベントに着火
  • UIで表示した要素数分だけリストへのアクセスが発生するので、1ページを100画像としてアクセスがあればページ単位でFlickrから写真を非同期で取得して表示
  • ページ内の半分までアクセスが発生したら、次のページの画像をFlickrから非同期で取得(先読み)

写真やビデオのダウンロード

写真やビデオのダウンロードにはProducer-Consumerパターンを使ってマルチスレッドでダウンロードしています。
Producer-Consumerパターンを実装するにはBlockingCollectionがとても便利です。
これを知らなくて最初はオレオレ実装していましたが、BlockingCollectionで書き直したらコードがすっきりしました。

参考:
http://stackoverflow.com/questions/6512033/classic-producer-consumer-pattern-using-blockingcollection-and-tasks-net-4-tpl

FlickrOAuth認証

デスクトップアプリでFlickrの認証を行う場合、Flickrの認証ページを開く→ユーザがFlickrにログインする→表示されるコードをアプリに貼り付けるという手順が一番実装が簡単ですが、コードを貼り付ける手順が省けるようにコードをWebサイト上で記録して、アプリケーション側からWeb APIを叩いてコードを取得するという実装にしています。

Goolge Walletの決済サービス

今回のアプリケーションでは、オリジナル写真のダウンロードにライセンスの購入が必要としています。
この決済回りにはGoogle Wallet、WebPay、Stripe、FastPay、SPIKE、PayPalなどの決済サービスを調べてみて、国内外ともに使えるGoogle Walletにしました。
色々なサイトでよく見かけるのはPayPalなので、PayPalを使おうかとも思いましたが、最終的にはチュートリアルやマニュアルがわかりやすいGoogle Walletにしました。
Googleはドキュメントがわかりやすくてよいですね。

はじめてのWordpress

アプリを公開しているサイトWordPressで作りました。
WordPressはさわったことがなく最初は結構とまどいました(汗
WordPressについては、以下の本がとてもわかりやすかったです。


総括

いざ公開するアプリケーションを作るとなると細かい作業が多く、且つ、今回はアプリケーションの言語を英語にしたので地味にそこも大変でした。
おかしな英語もあると思いますので、なにかおかしなところがあれば教えてくださいm(_ _)m

ということで、Flickr Fast Downloaderをぜひ使ってみてください!