pinxport
Version:
Pinboard and Delicious command-line export script
83 lines (70 loc) • 2.16 kB
JavaScript
// Generated by CoffeeScript 1.4.0
(function() {
var argv, csvLineItem, jsonToCsv, optimist, options, quote_re, request, tagstr, xml2js;
request = require('request');
optimist = require('optimist');
xml2js = require('xml2js');
optimist = optimist.usage('Usage: $0 --token [Pinboard token] --tag [tag] --output [csv] --site [site uri]').alias('t', 'tag')["default"]('output', 'csv')["default"]('site', 'api.pinboard.in');
quote_re = new RegExp('"', 'g');
argv = optimist.argv;
csvLineItem = function(item) {
return '"' + item.replace(quote_re, '""') + '"';
};
jsonToCsv = function(posts) {
var csv, line, post, tags, _i, _len;
csv = [];
csv.push('"tags", "title", "uri"');
for (_i = 0, _len = posts.length; _i < _len; _i++) {
post = posts[_i];
tags = post.tags || post.tag;
line = '';
line += csvLineItem(tags) + ',';
line += csvLineItem(post.description) + ',';
line += csvLineItem(post.href);
csv.push(line);
}
return csv.join('\n');
};
if (argv.tag != null) {
tagstr = typeof argv.tag === 'string' ? argv.tag : argv.tag.join(',');
} else {
tagstr = '';
}
options = {
uri: 'https://' + argv.site + '/v1/posts/all',
qs: {
auth_token: argv.token,
tag: tagstr,
format: 'json'
},
json: true,
headers: {
Connection: 'close',
'User-Agent': 'pinXport (https://github.com/webjay/pinXport)'
}
};
request.get(options, function(err, request, posts) {
var parser;
if (err != null) {
return console.error(err);
}
if (request.statusCode !== 200) {
console.error('Status: ' + request.statusCode);
console.error(optimist.help());
return;
}
if (typeof posts !== 'object') {
parser = new xml2js.Parser({
mergeAttrs: true
});
return parser.parseString(posts, function(err, json) {
if (err != null) {
return console.error('Error parsing XML: ' + err);
}
return console.log(jsonToCsv(json.posts.post));
});
} else {
return console.log(jsonToCsv(posts));
}
});
}).call(this);