v1.0.0
parent
3e7ea8ca29
commit
70c81ba6ef
@ -0,0 +1,58 @@
|
|||||||
|
# ia-headers
|
||||||
|
|
||||||
|
This module converts an object containing metadata into valid HTTP headers for the [Internet Archive](https://archive.org/) S3 API.
|
||||||
|
|
||||||
|
This is not a full-blown API client - it simply generates the metadata headers. You can use a module like [bhttp](https://www.npmjs.com/package/bhttp) to interact with the API. The documentation for the Internet Archive S3 API can be found [here](https://archive.org/help/abouts3.txt). API keys can be obtained [here](http://archive.org/account/s3.php).
|
||||||
|
|
||||||
|
`ia-header` supports multiple values for a metadata field - simply pass them in as an array (see also the Usage example below). Underscores are translated into double dashes, as per the IA S3 documentation.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
[WTFPL](http://www.wtfpl.net/txt/copying/) or [CC0](https://creativecommons.org/publicdomain/zero/1.0/), whichever you prefer. A donation and/or attribution are appreciated, but not required.
|
||||||
|
|
||||||
|
## Donate
|
||||||
|
|
||||||
|
My income consists entirely of donations for my projects. If this module is useful to you, consider [making a donation](http://cryto.net/~joepie91/donate.html)!
|
||||||
|
|
||||||
|
You can donate using Bitcoin, PayPal, Gratipay, Flattr, cash-in-mail, SEPA transfers, and pretty much anything else.
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Pull requests welcome. Please make sure your modifications are in line with the overall code style, and ensure that you're editing the `.coffee` files, not the `.js` files.
|
||||||
|
|
||||||
|
Build tool of choice is `gulp`; simply run `gulp` while developing, and it will watch for changes.
|
||||||
|
|
||||||
|
Be aware that by making a pull request, you agree to release your modifications under the licenses stated above.
|
||||||
|
|
||||||
|
## Caveats
|
||||||
|
|
||||||
|
* Metadata keys (not values!) may only be ASCII. The Internet Archive does not currently support non-ASCII metadata keys.
|
||||||
|
* All non-ASCII and non-printable characters in metadata values are URL-encoded - this could cause potentially significant header size increases. In most cases, this won't matter.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var iaHeaders = require("ia-headers");
|
||||||
|
|
||||||
|
var metadata = {
|
||||||
|
subject: ["mirror", "pdf.yt"],
|
||||||
|
mediatype: "texts",
|
||||||
|
collection: "pdfymirrors",
|
||||||
|
date: "2014-03-01",
|
||||||
|
title: "Some Document (PDFy mirror)",
|
||||||
|
description: "This is a document from PDFy.<br>It's a mirror."
|
||||||
|
}
|
||||||
|
|
||||||
|
var metadataHeaders = iaHeaders(metadata);
|
||||||
|
console.log(metadataHeaders);
|
||||||
|
|
||||||
|
/* Result:
|
||||||
|
{ 'x-archive-meta1-subject': 'mirror',
|
||||||
|
'x-archive-meta2-subject': 'pdf.yt',
|
||||||
|
'x-archive-meta-mediatype': 'texts',
|
||||||
|
'x-archive-meta-collection': 'pdfymirrors',
|
||||||
|
'x-archive-meta-date': '2014-03-01',
|
||||||
|
'x-archive-meta-title': 'Some Document (PDFy mirror)',
|
||||||
|
'x-archive-meta-description': 'This is a document from PDFy.<br>It\'s a mirror.' }
|
||||||
|
*/
|
||||||
|
```
|
@ -0,0 +1,28 @@
|
|||||||
|
var gulp = require('gulp');
|
||||||
|
|
||||||
|
/* CoffeeScript compile deps */
|
||||||
|
var path = require('path');
|
||||||
|
var gutil = require('gulp-util');
|
||||||
|
var concat = require('gulp-concat');
|
||||||
|
var rename = require('gulp-rename');
|
||||||
|
var coffee = require('gulp-coffee');
|
||||||
|
var cache = require('gulp-cached');
|
||||||
|
var remember = require('gulp-remember');
|
||||||
|
var plumber = require('gulp-plumber');
|
||||||
|
|
||||||
|
var source = ["lib/**/*.coffee", "index.coffee"]
|
||||||
|
|
||||||
|
gulp.task('coffee', function() {
|
||||||
|
return gulp.src(source, {base: "."})
|
||||||
|
.pipe(plumber())
|
||||||
|
.pipe(cache("coffee"))
|
||||||
|
.pipe(coffee({bare: true}).on('error', gutil.log)).on('data', gutil.log)
|
||||||
|
.pipe(remember("coffee"))
|
||||||
|
.pipe(gulp.dest("."));
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task('watch', function () {
|
||||||
|
gulp.watch(source, ['coffee']);
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task('default', ['coffee', 'watch']);
|
@ -0,0 +1 @@
|
|||||||
|
module.exports = require "./lib"
|
@ -0,0 +1,34 @@
|
|||||||
|
zeroFill = require "zero-fill"
|
||||||
|
|
||||||
|
maybeEncodeValue = (value) ->
|
||||||
|
if /[^ -~]/.exec(value) # Matches any Unicode and non-printable characters.
|
||||||
|
encoded = encodeURIComponent(value)
|
||||||
|
return "uri(#{encoded})"
|
||||||
|
else
|
||||||
|
return value
|
||||||
|
|
||||||
|
module.exports = (metadata) ->
|
||||||
|
headers = {}
|
||||||
|
|
||||||
|
for key, values of metadata
|
||||||
|
# It's easier to just always operate on an array, even if there's only a single value.
|
||||||
|
if not Array.isArray values
|
||||||
|
values = [values]
|
||||||
|
|
||||||
|
# Per RFC 822, we cannot have underscores in the header names. The IA S3 API will automatically convert double hyphens to an underscore, so we do the inverse.
|
||||||
|
key = key.replace("_", "--")
|
||||||
|
|
||||||
|
itemCount = values.length
|
||||||
|
|
||||||
|
if itemCount == 0
|
||||||
|
continue
|
||||||
|
else if itemCount == 1
|
||||||
|
headers["x-archive-meta-#{key}"] = maybeEncodeValue(values[0])
|
||||||
|
else
|
||||||
|
numberWidth = itemCount.toString().length
|
||||||
|
|
||||||
|
for value, i in values
|
||||||
|
headerName = "x-archive-meta#{zeroFill(numberWidth, i + 1)}-#{key}"
|
||||||
|
headers[headerName] = maybeEncodeValue(value)
|
||||||
|
|
||||||
|
return headers
|
@ -0,0 +1,39 @@
|
|||||||
|
var maybeEncodeValue, zeroFill;
|
||||||
|
|
||||||
|
zeroFill = require("zero-fill");
|
||||||
|
|
||||||
|
maybeEncodeValue = function(value) {
|
||||||
|
var encoded;
|
||||||
|
if (/[^ -~]/.exec(value)) {
|
||||||
|
encoded = encodeURIComponent(value);
|
||||||
|
return "uri(" + encoded + ")";
|
||||||
|
} else {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = function(metadata) {
|
||||||
|
var headerName, headers, i, itemCount, key, numberWidth, value, values, _i, _len;
|
||||||
|
headers = {};
|
||||||
|
for (key in metadata) {
|
||||||
|
values = metadata[key];
|
||||||
|
if (!Array.isArray(values)) {
|
||||||
|
values = [values];
|
||||||
|
}
|
||||||
|
key = key.replace("_", "--");
|
||||||
|
itemCount = values.length;
|
||||||
|
if (itemCount === 0) {
|
||||||
|
continue;
|
||||||
|
} else if (itemCount === 1) {
|
||||||
|
headers["x-archive-meta-" + key] = maybeEncodeValue(values[0]);
|
||||||
|
} else {
|
||||||
|
numberWidth = itemCount.toString().length;
|
||||||
|
for (i = _i = 0, _len = values.length; _i < _len; i = ++_i) {
|
||||||
|
value = values[i];
|
||||||
|
headerName = "x-archive-meta" + (zeroFill(numberWidth, i + 1)) + "-" + key;
|
||||||
|
headers[headerName] = maybeEncodeValue(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return headers;
|
||||||
|
};
|
@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"name": "ia-headers",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Takes a metadata object, and turns it into valid HTTP headers for the Internet Archive S3 API.",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git@git.cryto.net:projects/joepie91/node-ia-headers"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"internet",
|
||||||
|
"archive",
|
||||||
|
"s3",
|
||||||
|
"api",
|
||||||
|
"http",
|
||||||
|
"metadata"
|
||||||
|
],
|
||||||
|
"author": "Sven Slootweg",
|
||||||
|
"license": "WTFPL",
|
||||||
|
"dependencies": {
|
||||||
|
"zero-fill": "^2.2.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"gulp": "~3.8.0",
|
||||||
|
"gulp-cached": "~0.0.3",
|
||||||
|
"gulp-coffee": "~2.0.1",
|
||||||
|
"gulp-concat": "~2.2.0",
|
||||||
|
"gulp-livereload": "~2.1.0",
|
||||||
|
"gulp-nodemon": "~1.0.4",
|
||||||
|
"gulp-plumber": "~0.6.3",
|
||||||
|
"gulp-remember": "~0.2.0",
|
||||||
|
"gulp-rename": "~1.2.0",
|
||||||
|
"gulp-util": "~2.2.17"
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue