DDG

 view release on metacpan or  search on metacpan

lib/DDG/Meta/Data.pm  view on Meta::CPAN


    debug && warn "Processing metadata";

    my $f = "$mdir/metadata.json.bz2";
    my $tmp_bak = "$f.bak";
    my @timestamps = (stat $f)[8,9];
    if(-e $f){
        copy $f, $tmp_bak or die "Failed to copy $f to $tmp_bak: $!";;
    }
    utime @timestamps, $tmp_bak;
    my $restore_backup = sub {
        move $tmp_bak, $f or die "Failed to move backup $tmp_bak to $f: $!";
        utime @timestamps, $f;
    };

    unless($ENV{NO_METADATA_DOWNLOAD}){
        my $ua = LWP::UserAgent->new;
        $ua->timeout(5);
        $ua->default_header('Accept-Encoding' => scalar HTTP::Message::decodable());
        my $res = $ua->mirror('http://ddg-community.s3.amazonaws.com/metadata/repo_all.json.bz2', $f);
        unless($res->is_success || $res->code == 304){
            debug && warn "Failed to download metdata: " . $res->status_line . " .  Restoring backup from $tmp_bak";
            $restore_backup->();
        }
    }

    my $metadata;
    while(!$metadata){
        eval {
            # Decompress to command-line
            open my $fh, "bzip2 -dc $f |" or die "Failed to open file $f: $!";
            # slurp into a single string
            my $json = do { local $/;  <$fh> };
            $metadata = decode_json($json);
        }
        or do {
            if(-e $tmp_bak){
                debug && warn "Failed to process metadata $f: $@. Restoring backup from $tmp_bak";
                $restore_backup->();
            }
            else{
                die "Failed to to process metadata from $f: $@";
            }
        };
    }
    unlink $tmp_bak if -e $tmp_bak;

    # { "<id>": {
    #     "id": " "



( run in 0.880 second using v1.01-cache-2.11-cpan-49f99fa48dc )