From 8be20837c5ccad127f35e5dd038e8140540686e3 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sat, 12 Apr 2014 01:23:42 -0400 Subject: initial implementation --- bin/pinboard_export | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 bin/pinboard_export (limited to 'bin') diff --git a/bin/pinboard_export b/bin/pinboard_export new file mode 100644 index 0000000..5876809 --- /dev/null +++ b/bin/pinboard_export @@ -0,0 +1,86 @@ +#!perl +use strict; +use warnings; + +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; -- cgit v1.2.3-54-g00ecf