WebService::SimpleでFlickrのfavoritesの写真を一括ダウンロード

| 0 Comments | 0 TrackBacks | このエントリーをはてなブックマークに追加 このエントリーのはてなブックマーク件数

最近カメラが空前のマイブームで、お気に入りの写真をiPodに入れて持ち歩いたりして、もっと綺麗な写真に触れる機会を増やしたいと思っていました。


そんなこんなで、Flickrのfavoritesにお気に入り写真を登録していってるんですが、Flickrから写真をダウンロードするのがだるい!ということで、favoritesの写真を一括ダウンロードするスクリプトを書いてみました。

#!/usr/bin/env perl
use strict;
use warnings;
use WebService::Simple;
use Digest::MD5 qw(md5_hex);
use Path::Class qw(dir);
use Perl6::Say;
use HTTP::Async;
use HTTP::Request;

# config
my $api_key = "Your API Key";
my $user_id = 'Your nsid';

my $api = WebService::Simple->new(
    base_url => "http://api.flickr.com/services/rest/",
    param    => { api_key => $api_key, }
);

sub main {
    fetch_favorite_photos();
}

sub fetch_favorite_photos {
    my $photos = get_favorite_photo_lists();
    return unless $photos;
    my $photo_urls = collect_photo_urls($photos);

    download_photos($photo_urls);
}

sub get_favorite_photo_lists {
    my $response = $api->get(
        {   method   => "flickr.favorites.getPublicList",
            user_id  => $user_id,
            per_page => 500,
        }
    );
    my $ref = $response->parse_response;
    return unless $ref->{photos}->{total};
    return $ref->{photos}->{photo};
}

sub collect_photo_urls {
    my $photos     = shift;
    my $photo_urls = [];
    foreach my $photo_id ( keys %{$photos} ) {
        my $url = _get_photo_url($photo_id);
        push @{$photo_urls}, $url if $url;
    }
    return $photo_urls;
}

sub _get_photo_url {
    my $photo_id = shift;
    my $response = $api->get(
        {   method   => 'flickr.photos.getSizes',
            photo_id => $photo_id,
        }
    );
    my $ref = $response->parse_response;
    my $url;
    foreach my $size ( @{ $ref->{sizes}->{size} } ) {
        if ( $size->{label} eq 'Original' || $size->{label} eq 'Large' ) {
            $url = $size->{source};
        }
    }
    say "Collecting Photo urls: " . $url if $url;
    $url;
}

sub download_photos {
    my $photo_urls = shift;
    my $ua         = LWP::UserAgent->new;
    my $dir        = setup_download_dir();
    say "### Downloading photos ###";
    foreach my $url ( @{$photo_urls} ) {
        my $file = $dir->file( md5_hex($url) . ".jpg" );
        my $res = $ua->mirror( $url, $file->absolute );
        say "Download status : " . $res->status_line . " - $url";
    }
}

sub setup_download_dir {
    my $dir = dir("photos");
    $dir->mkpath;
    $dir;
}

main();

頻繁にfavoritesを登録する人は、HTTP::Asyncなどを使ってダウンロード部分を並列化したりしてみるといいかもしれないですね。

No TrackBacks

TrackBack URL: http://perl-mongers.org/MT/mt-tb.cgi/61

Leave a comment

About this Entry

This page contains a single entry by http://coderepos.org/share/wiki/Committers/dann published on June 21, 2008 5:40 PM.

実用! Perlで縦長連続画像を1フレームずつバラして鑑賞 was the previous entry in this blog.

Livedoor picsに写真を一括アップロード is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.

Categories

Pages

Creative Commons License
This blog is licensed under a Creative Commons License.
Powered by Movable Type 4.21-en