summaryrefslogtreecommitdiffstats
path: root/bin
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-04-12 01:23:42 -0400
committerJesse Luehrs <doy@tozt.net>2014-04-12 01:23:42 -0400
commit8be20837c5ccad127f35e5dd038e8140540686e3 (patch)
tree37f15637c4cb15ed3573170d9286006fa97fe0bd /bin
parent9bcd372e9d29c75351772f10596b6c1b68a91a8f (diff)
downloadwww-pinboard-8be20837c5ccad127f35e5dd038e8140540686e3.tar.gz
www-pinboard-8be20837c5ccad127f35e5dd038e8140540686e3.zip
initial implementation
Diffstat (limited to 'bin')
-rw-r--r--bin/pinboard_export86
1 files changed, 86 insertions, 0 deletions
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;