#!/usr/bin/perl
# getZoteroPDFs - get pdfs from zotero with a particular tag, using MozRepl
#
# Requires installation of MozRepl from CPAN, Firefox, Zotero, and MozRepl
#                          firefox extension.
#
# The directory / tag is specified below 
#
# Jason Friedman (write.to.jason@gmail.com, www.curiousjason.com)
# Last updated 14th September 2016: Change timeout to 120s
# Updated 4th October 2015: Don't crash when filename is undefined

use strict;
use warnings;
use MozRepl;

# output dir
my $outputDir = "~/Dropbox/toread";
# tags to extract PDFs
my $tag = 'toread';

my $repl = MozRepl->new;
# Make it quiet
$repl->setup_log([qw/error fatal/]);
$repl->setup;
$repl->client->{telnet}->timeout(120);
my $executestring = 'var outputDir = "' . $outputDir . '";var tag = "' . $tag . '";';
$executestring .= q|var tmpDir = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);  
tmpDir.initWithPath(outputDir);

var items = Zotero.Items.getAll(); 

for(i=0; i<items.length; i++) {
  var item = items[i];
  var tags = item.getTags();
  for (var j=0; j<tags.length; j++) {
    if (tags[j].name == tag) {
      attachments = item.getAttachments(); 
      for (var k=0; k<attachments.length;k++) {
	// only copy pdfs
	var file = Zotero.Items.get(attachments[k]).getFile();
	var filename = file.leafName;
        if (typeof filename !== 'undefined') {
       	  filenamelength = filename.length;
	  var ending = filename.substr(filenamelength-3,3);
	  if (ending=='pdf') {
                var file2 = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
                file2.initWithPath(outputDir + file.leafName);  
                if (file2.exists())  
                      file2.remove(false);  
    	        file.copyTo(tmpDir,file.leafName);
          }
        }
      }
    }
  }
 }
|;

$repl->execute($executestring);