#!perl use strict; use warnings; # PODNAME: pinboard_export # ABSTRACT: data exporter for pinboard use DBI; use Getopt::Long qw(:config pass_through); use WWW::Pinboard; use Term::ProgressBar; my ($dsn, $token, $quiet); GetOptions( 'dsn=s' => \$dsn, 'token=s' => \$token, 'quiet' => \$quiet, ); die "--dsn is required" unless $dsn; die "--token is required" unless $token; my $dbh = DBI->connect($dsn, '', '', { RaiseError => 1, AutoCommit => 0 }); my $fromdt = '1970-01-01T00:00:00Z'; if (!$dbh->tables(undef, undef, 'posts')) { $dbh->do(<<''); CREATE TABLE `posts` ( href TEXT NOT NULL, description TEXT NOT NULL, extended TEXT NOT NULL, tags TEXT NOT NULL, time TEXT NOT NULL, toread TEXT NOT NULL ); } else { ($fromdt) = $dbh->selectrow_array( 'SELECT time FROM posts ORDER BY strftime("%s", time) DESC LIMIT 1' ); } my $api = WWW::Pinboard->new(token => $token); if ($fromdt ge $api->update->{update_time}) { $dbh->disconnect; exit(0); } my $progress; my $sth = $dbh->prepare( 'INSERT INTO posts (href, description, extended, tags, time, toread) VALUES (?, ?, ?, ?, ?, ?)' ); my $posts = $api->all(fromdt => $fromdt, progress => sub { my ($chunk, $res) = @_; if (!$progress && !$quiet && defined $res->{headers}{'content-length'}) { $progress = Term::ProgressBar->new({ count => $res->{headers}{'content-length'}, ETA => 'linear', }); $progress->message("downloading new posts..."); } $res->{content} .= $chunk; $progress->update(length($res->{content})) if $progress; }); if (!$quiet) { $progress = Term::ProgressBar->new({ count => scalar(@$posts), ETA => 'linear', }); $progress->message('importing posts...'); } for my $post (@$posts) { $sth->execute( $post->{href}, $post->{description}, $post->{extended}, $post->{tags}, $post->{time}, $post->{toread}, ); $progress->update if $progress; } $dbh->commit; $dbh->disconnect;