#!/usr/bin/perl use warnings; use Data::Dumper; use Term::Prompt; use LWP::UserAgent; use URI::Find; use Bookmarks::Parser; use Getopt::Long; $|++; my $skipknown; GetOptions("skipknown" => \$skipknown); my $ua = LWP::UserAgent->new(); my $bookmarksfile = '/home/castaway/.opera8.0/opera6.adr'; $bookmarksfile = prompt('x', 'Bookmarks file to add to:', '', $bookmarksfile); die "$!" unless(-e $bookmarksfile); print "Using $bookmarksfile.\n"; $bookmarksfilenew = prompt('x', 'Bookmarks file to save as:', '', "${bookmarksfile}.new"); ## url bookmarks? my $bookmarks = Bookmarks::Parser->new(); $bookmarks->parse({filename => $bookmarksfile}); die "Can't parse $bookmarksfile\n" unless($bookmarks); my $srcfile = '/home/castaway/stuff'; $srcfile = prompt('x', 'Import from file:', '', $srcfile); die "$!" unless(-e $srcfile); print "Importing from $srcfile ...\n"; my $srcfh; my $storeduris = 0; my $doneimporting = 0; my $parseuri = URI::Find->new(\&adduri); open($srcfh, "<$srcfile") or die "Can't open $srcfile ($!)"; while(my $srcdata = <$srcfh>) { $storeduris += $parseuri->find(\$srcdata); last if($doneimporting); } close($srcfh); print "Imported $storeduris URLs\n"; # print Dumper($bookmarks); if(!-e "${bookmarksfilenew}") { $bookmarks->write_file({filename => "${bookmarksfilenew}"}); } sub adduri { my ($uri, $uristr) = @_; my @find = $bookmarks->find_items({url => $uristr}); return $uristr if(@find && $skipknown); if(@find) { # print Dumper(\@find); print "Found $uristr already at:\n"; foreach my $item (@find) { print " ", $bookmarks->get_path_of($item), "\n"; } } my $title; my $get_title_ref = sub { my ($data, $response, $protocol) = @_; ($title) = $data =~ m{(.+?)}i; die if($title); }; $ua->get($uristr, ':content_cb' => $get_title_ref, ':read_size_hint' => 1024); $title ||= ''; print "Page title is $title\n"; return $uristr if(!prompt('y', "Add $uristr?", '', 'n')); my $urititle = prompt('x', 'Enter title for this URI:', '', $title); die "No title!" if(!$urititle); my $addhere = 0; my @folders = ({name => 'root', type => 'folder'}); my $path = ''; my $action = ''; my $f; until($action =~ /a/i) { my @names = ('..', map {$_->{type} eq 'folder' ? $_->{name}: () } @folders); $addhere = prompt('m', { prompt => 'Pick a folder:', title => "Folders ($path)", items => \@names, cols => 1, }, '', '1'); if($addhere == 0) { @folders = $f->{parent} ? $bookmarks->get_folder_contents($bookmarks->get_from_id($f->{parent})) : $bookmarks->get_top_level(); $path =~ s{([^/]+)/$}{}; next; } ($f) = grep {$_->{name} eq $names[$addhere]} @folders; # print Dumper($f); ## Add new folder? print "Current folder: ", $bookmarks->get_path_of($f), $f->{name}, "\n"; $action = prompt('x', '(s)subfolder, (a)dd here, (d)done, (c)ancel (q)uit:', '', 's'); if($action eq 's') { @folders = defined $f->{id} ? $bookmarks->get_folder_contents($f) : $bookmarks->get_top_level(); $path .= $f->{name} . '/'; } elsif($action eq 'd') { # done adding, save what we have ? $doneimporting = 1; return $uristr; } elsif($action eq 'c') { # decided not to add this uri after all print "Not adding $uristr, ok\n"; return $uristr; } elsif($action eq 'q') { die "Quitting without saving changes\n"; } # print Dumper($f); # print Dumper(\@folders); } print "Adding $uristr to ", $f->{name}, ".\n"; my $newbm = { name => $urititle, url => $uristr, created => time(), type => 'url', }; my $bm = $bookmarks->add_bookmark($newbm, $f); print Dumper($bm); return $uristr; }