iajs
Version:
Internet Archive JavaScript Client
1,101 lines (938 loc) • 39.3 kB
JavaScript
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
(function (global, factory) {
(typeof exports === "undefined" ? "undefined" : _typeof(exports)) === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('node-fetch'), require('xmldom')) : typeof define === 'function' && define.amd ? define(['node-fetch', 'xmldom'], factory) : (global = global || self, global.ia = factory(global.fetch, global.xmldom));
})(this, function (fetch, xmldom) {
'use strict';
fetch = fetch && Object.prototype.hasOwnProperty.call(fetch, 'default') ? fetch['default'] : fetch;
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
function createCommonjsModule(fn, module) {
return module = {
exports: {}
}, fn(module, module.exports), module.exports;
}
var fetchJsonp = createCommonjsModule(function (module, exports) {
(function (global, factory) {
{
factory(exports, module);
}
})(commonjsGlobal, function (exports, module) {
var defaultOptions = {
timeout: 5000,
jsonpCallback: 'callback',
jsonpCallbackFunction: null
};
function generateCallbackFunction() {
return 'jsonp_' + Date.now() + '_' + Math.ceil(Math.random() * 100000);
}
function clearFunction(functionName) {
// IE8 throws an exception when you try to delete a property on window
// http://stackoverflow.com/a/1824228/751089
try {
delete window[functionName];
} catch (e) {
window[functionName] = undefined;
}
}
function removeScript(scriptId) {
var script = document.getElementById(scriptId);
if (script) {
document.getElementsByTagName('head')[0].removeChild(script);
}
}
function fetchJsonp(_url) {
var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; // to avoid param reassign
var url = _url;
var timeout = options.timeout || defaultOptions.timeout;
var jsonpCallback = options.jsonpCallback || defaultOptions.jsonpCallback;
var timeoutId = undefined;
return new Promise(function (resolve, reject) {
var callbackFunction = options.jsonpCallbackFunction || generateCallbackFunction();
var scriptId = jsonpCallback + '_' + callbackFunction;
window[callbackFunction] = function (response) {
resolve({
ok: true,
// keep consistent with fetch API
json: function json() {
return Promise.resolve(response);
}
});
if (timeoutId) clearTimeout(timeoutId);
removeScript(scriptId);
clearFunction(callbackFunction);
}; // Check if the user set their own params, and if not add a ? to start a list of params
url += url.indexOf('?') === -1 ? '?' : '&';
var jsonpScript = document.createElement('script');
jsonpScript.setAttribute('src', '' + url + jsonpCallback + '=' + callbackFunction);
if (options.charset) {
jsonpScript.setAttribute('charset', options.charset);
}
jsonpScript.id = scriptId;
document.getElementsByTagName('head')[0].appendChild(jsonpScript);
timeoutId = setTimeout(function () {
reject(new Error('JSONP request to ' + _url + ' timed out'));
clearFunction(callbackFunction);
removeScript(scriptId);
window[callbackFunction] = function () {
clearFunction(callbackFunction);
};
}, timeout); // Caught if got 404/500
jsonpScript.onerror = function () {
reject(new Error('JSONP request to ' + _url + ' failed'));
clearFunction(callbackFunction);
removeScript(scriptId);
if (timeoutId) clearTimeout(timeoutId);
};
});
} // export as global function
/*
let local;
if (typeof global !== 'undefined') {
local = global;
} else if (typeof self !== 'undefined') {
local = self;
} else {
try {
local = Function('return this')();
} catch (e) {
throw new Error('polyfill failed because global object is unavailable in this environment');
}
}
local.fetchJsonp = fetchJsonp;
*/
module.exports = fetchJsonp;
});
});
var CORS_PROXY = "https://iajs-cors.rchrd2.workers.dev";
var enc = encodeURIComponent;
var paramify = function paramify(obj) {
return new URLSearchParams(obj).toString();
};
var str2arr = function str2arr(v) {
return Array.isArray(v) ? v : [v];
};
var isInBrowser = function isInBrowser() {
return !(typeof window === "undefined");
};
var corsWorkAround = function corsWorkAround(url) {
if (isInBrowser()) {
return "".concat(CORS_PROXY, "/").concat(url);
} else {
return url;
}
};
var fetchJson = function fetchJson(url, options) {
return Promise.resolve().then(function () {
return fetch(url, options);
}).then(function (_resp) {
var res = _resp;
return res.json();
});
};
var authToHeaderS3 = function authToHeaderS3(auth) {
return auth.values.s3.access && auth.values.s3.secret ? {
Authorization: "LOW ".concat(auth.values.s3.access, ":").concat(auth.values.s3.secret)
} : {};
};
var authToHeaderCookies = function authToHeaderCookies(auth) {
if (auth.values.cookies["logged-in-sig"] && auth.values.cookies["logged-in-user"]) {
var cookieStr = "logged-in-sig=".concat(auth.values.cookies["logged-in-sig"], ";");
cookieStr += " logged-in-user=".concat(auth.values.cookies["logged-in-user"]);
var headers = {
Cookie: cookieStr
};
if (isInBrowser()) {
headers["X-Cookie-Cors"] = cookieStr;
}
return headers;
} else {
return {};
}
};
var newEmptyAuth = function newEmptyAuth() {
return JSON.parse(JSON.stringify({
success: false,
values: {
cookies: {
"logged-in-sig": null,
"logged-in-user": null
},
email: null,
itemname: null,
s3: {
access: null,
secret: null
},
screenname: null
},
version: 1
}));
};
var Auth = /*#__PURE__*/function () {
function Auth() {
_classCallCheck(this, Auth);
this.XAUTH_BASE = corsWorkAround("https://archive.org/services/xauthn/");
}
_createClass(Auth, [{
key: "login",
value: function login(email, password) {
var _this2 = this;
return Promise.resolve().then(function () {
return Promise.resolve().then(function () {
var fetchOptions = {
method: "POST",
body: "email=".concat(enc(email), "&password=").concat(enc(password)),
headers: {
"Content-Type": "application/x-www-form-urlencoded"
}
};
return fetch("".concat(_this2.XAUTH_BASE, "?op=login"), fetchOptions);
}).then(function (_resp) {
var response = _resp;
return response.json();
}).then(function (_resp) {
var data = _resp;
if (!data.success) {
data.values = _objectSpread(_objectSpread({}, data.values), newEmptyAuth().values);
}
return data;
})["catch"](function (e) {
// TODO figure out syntax for catching error reponse
return newEmptyAuth();
});
}).then(function () {});
}
}, {
key: "fromS3",
value: function fromS3(access, secret) {
var newAuth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : newEmptyAuth();
return Promise.resolve().then(function () {
newAuth.success = 1;
newAuth.values.s3.access = access;
newAuth.values.s3.secret = secret;
return fetchJson("https://s3.us.archive.org?check_auth=1", {
headers: authToHeaderS3(newAuth)
});
}).then(function (_resp) {
var info = _resp;
newAuth.values.email = info.username;
newAuth.values.itemname = info.itemname;
newAuth.values.screenname = info.screenname; // Note the auth object is missing cookie fields.
// It is still TBD if those are needed
return newAuth;
});
}
}, {
key: "fromCookies",
value: function fromCookies(loggedInSig, loggedInUser) {
var newAuth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : newEmptyAuth();
var _this4 = this;
return Promise.resolve().then(function () {
newAuth.values.cookies["logged-in-sig"] = loggedInSig;
newAuth.values.cookies["logged-in-user"] = loggedInUser;
return fetch(corsWorkAround("https://archive.org/account/s3.php?output_json=1"), {
headers: authToHeaderCookies(newAuth)
});
}).then(function (_resp) {
var s3response = _resp;
return s3response.json();
}).then(function (_resp) {
var s3 = _resp;
if (!s3.success) {
throw new Error();
}
return _this4.fromS3(s3.key.s3accesskey, s3.key.s3secretkey, newAuth);
});
}
}]);
return Auth;
}();
var BookReaderAPI = function BookReaderAPI() {
_classCallCheck(this, BookReaderAPI);
};
var FavoritesAPI = /*#__PURE__*/function () {
function FavoritesAPI() {
_classCallCheck(this, FavoritesAPI);
this.API_BASE = corsWorkAround("https://archive.org/bookmarks.php"); // TODO support this non-json explore endpoint
this.EXPLORE_API_BASE = "https://archive.org/bookmarks-explore.php";
}
_createClass(FavoritesAPI, [{
key: "get",
value: function get(_ref) {
var _ref$screenname = _ref.screenname,
screenname = _ref$screenname === void 0 ? null : _ref$screenname,
_ref$auth = _ref.auth,
auth = _ref$auth === void 0 ? newEmptyAuth() : _ref$auth;
var _this5 = this;
return Promise.resolve().then(function () {
if (!screenname && auth.values.screenname) {
screenname = auth.values.screenname;
}
if (screenname) {
var params = {
output: "json",
screenname: screenname
};
return fetchJson("".concat(_this5.API_BASE, "?").concat(paramify(params)));
} else {
throw new Error("Neither screenname or auth provided for bookmarks lookup");
}
});
}
}, {
key: "add",
value: function add() {
var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref2$identifier = _ref2.identifier,
identifier = _ref2$identifier === void 0 ? null : _ref2$identifier,
_ref2$comments = _ref2.comments,
comments = _ref2$comments === void 0 ? "" : _ref2$comments,
_ref2$auth = _ref2.auth,
auth = _ref2$auth === void 0 ? newEmptyAuth() : _ref2$auth;
var _this6 = this;
return Promise.resolve().then(function () {
return _this6.modify({
identifier: identifier,
add_bookmark: 1
}, auth);
});
}
}, {
key: "remove",
value: function remove() {
var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref3$identifier = _ref3.identifier,
identifier = _ref3$identifier === void 0 ? null : _ref3$identifier,
_ref3$auth = _ref3.auth,
auth = _ref3$auth === void 0 ? null : _ref3$auth;
var _this7 = this;
return Promise.resolve().then(function () {
return _this7.modify({
identifier: identifier,
del_bookmark: identifier
}, auth);
});
}
}, {
key: "modify",
value: function modify(params, auth) {
var _this8 = this;
return Promise.resolve().then(function () {
return Promise.resolve().then(function () {
return iajs.MetadataAPI.get({
identifier: params.identifier,
path: "/metadata"
});
}).then(function (_resp) {
var mdResponse = _resp;
params.title = str2arr(mdResponse.result.title).join(", ");
params.mediatype = mdResponse.result.mediatype;
})["catch"](function (e) {
throw new Error("Metadata lookup failed for: ".concat(params.identifier));
});
}).then(function () {
params.output = "json";
return fetch("".concat(_this8.API_BASE, "?").concat(paramify(params)), {
method: "POST",
headers: authToHeaderCookies(auth)
});
}).then(function (_resp) {
var response = _resp;
return response.json()["catch"](function (e) {
return {
error: e
};
});
});
}
}]);
return FavoritesAPI;
}();
var GifcitiesAPI = /*#__PURE__*/function () {
function GifcitiesAPI() {
_classCallCheck(this, GifcitiesAPI);
this.API_BASE = "https://gifcities.archive.org/api/v1/gifsearch";
}
_createClass(GifcitiesAPI, [{
key: "get",
value: function get() {
var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref4$q = _ref4.q,
q = _ref4$q === void 0 ? null : _ref4$q;
var _this9 = this;
return Promise.resolve().then(function () {
if (q === null) {
return [];
} else {
return fetchJson("".concat(_this9.API_BASE, "?q=").concat(enc(q)));
}
});
}
}, {
key: "search",
value: function search(q) {
var _this10 = this;
return Promise.resolve().then(function () {
return _this10.get({
q: q
});
});
}
}]);
return GifcitiesAPI;
}();
var MetadataAPI = /*#__PURE__*/function () {
function MetadataAPI() {
_classCallCheck(this, MetadataAPI);
this.READ_API_BASE = "https://archive.org/metadata";
this.WRITE_API_BASE = corsWorkAround("https://archive.org/metadata");
}
_createClass(MetadataAPI, [{
key: "get",
value: function get() {
var _ref5 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref5$identifier = _ref5.identifier,
identifier = _ref5$identifier === void 0 ? null : _ref5$identifier,
_ref5$path = _ref5.path,
path = _ref5$path === void 0 ? "" : _ref5$path,
_ref5$auth = _ref5.auth,
auth = _ref5$auth === void 0 ? newEmptyAuth() : _ref5$auth;
var _this11 = this;
return Promise.resolve().then(function () {
var options = {};
options.headers = authToHeaderS3(auth);
return fetchJson("".concat(_this11.READ_API_BASE, "/").concat(identifier, "/").concat(path), options);
});
}
}, {
key: "patch",
value: function patch() {
var _ref6 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref6$identifier = _ref6.identifier,
identifier = _ref6$identifier === void 0 ? null : _ref6$identifier,
_ref6$target = _ref6.target,
target = _ref6$target === void 0 ? "metadata" : _ref6$target,
_ref6$priority = _ref6.priority,
priority = _ref6$priority === void 0 ? -5 : _ref6$priority,
_ref6$patch = _ref6.patch,
_patch = _ref6$patch === void 0 ? {} : _ref6$patch,
_ref6$auth = _ref6.auth,
auth = _ref6$auth === void 0 ? newEmptyAuth() : _ref6$auth;
var _this12 = this;
return Promise.resolve().then(function () {
// https://archive.org/services/docs/api/metadata.html#targets
var reqParams = {
"-target": target,
"-patch": JSON.stringify(_patch),
priority: priority,
secret: auth.values.s3.secret,
access: auth.values.s3.access
};
var url = "".concat(_this12.WRITE_API_BASE, "/").concat(identifier);
var body = paramify(reqParams);
return fetch(url, {
method: "POST",
body: body,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
}
});
}).then(function (_resp) {
var response = _resp;
return response.json();
});
}
}]);
return MetadataAPI;
}();
var RelatedAPI = /*#__PURE__*/function () {
function RelatedAPI() {
_classCallCheck(this, RelatedAPI);
this.API_BASE = "https://be-api.us.archive.org/mds/v1";
}
_createClass(RelatedAPI, [{
key: "get",
value: function get() {
var _ref7 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref7$identifier = _ref7.identifier,
identifier = _ref7$identifier === void 0 ? null : _ref7$identifier;
var _this13 = this;
return Promise.resolve().then(function () {
return fetchJson("".concat(_this13.API_BASE, "/get_related/all/").concat(identifier));
});
}
}]);
return RelatedAPI;
}();
var ReviewsAPI = /*#__PURE__*/function () {
function ReviewsAPI() {
_classCallCheck(this, ReviewsAPI);
this.WRITE_API_BASE = corsWorkAround("https://archive.org/services/reviews.php?identifier=");
this.READ_API_BASE = "https://archive.org/metadata";
}
_createClass(ReviewsAPI, [{
key: "get",
value: function get() {
var _ref8 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref8$identifier = _ref8.identifier,
identifier = _ref8$identifier === void 0 ? null : _ref8$identifier;
var _this14 = this;
return Promise.resolve().then(function () {
return fetchJson("".concat(_this14.READ_API_BASE, "/").concat(identifier, "/reviews"));
});
}
}, {
key: "add",
value: function add() {
var _ref9 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref9$identifier = _ref9.identifier,
identifier = _ref9$identifier === void 0 ? null : _ref9$identifier,
_ref9$title = _ref9.title,
title = _ref9$title === void 0 ? null : _ref9$title,
_ref9$body = _ref9.body,
body = _ref9$body === void 0 ? null : _ref9$body,
_ref9$stars = _ref9.stars,
stars = _ref9$stars === void 0 ? null : _ref9$stars,
_ref9$auth = _ref9.auth,
auth = _ref9$auth === void 0 ? newEmptyAuth() : _ref9$auth;
var _this15 = this;
return Promise.resolve().then(function () {
var url = "".concat(_this15.WRITE_API_BASE).concat(identifier);
return fetch(url, {
method: "POST",
body: JSON.stringify({
title: title,
body: body,
stars: stars
}),
headers: _objectSpread({
"Content-Type": "application/json"
}, authToHeaderS3(auth))
});
}).then(function (_resp) {
var response = _resp;
return response.json();
});
}
}]);
return ReviewsAPI;
}();
var S3API = /*#__PURE__*/function () {
function S3API() {
_classCallCheck(this, S3API);
this.API_BASE = "https://s3.us.archive.org";
}
_createClass(S3API, [{
key: "ls",
value: function ls() {
var _ref10 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref10$identifier = _ref10.identifier,
identifier = _ref10$identifier === void 0 ? null : _ref10$identifier,
_ref10$auth = _ref10.auth,
auth = _ref10$auth === void 0 ? newEmptyAuth() : _ref10$auth;
var _this16 = this;
return Promise.resolve().then(function () {
// throw new Error("TODO parse that XML");
if (!identifier) {
throw new Error("Missing required args");
}
return fetch("".concat(_this16.API_BASE, "/").concat(identifier));
}).then(function (_resp) {
return _resp.text();
});
}
}, {
key: "createEmptyItem",
value: function createEmptyItem() {
var _ref11 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref11$identifier = _ref11.identifier,
identifier = _ref11$identifier === void 0 ? null : _ref11$identifier,
_ref11$testItem = _ref11.testItem,
testItem = _ref11$testItem === void 0 ? false : _ref11$testItem,
_ref11$metadata = _ref11.metadata,
metadata = _ref11$metadata === void 0 ? {} : _ref11$metadata,
_ref11$headers = _ref11.headers,
headers = _ref11$headers === void 0 ? {} : _ref11$headers,
_ref11$wait = _ref11.wait,
wait = _ref11$wait === void 0 ? true : _ref11$wait,
_ref11$auth = _ref11.auth,
auth = _ref11$auth === void 0 ? newEmptyAuth() : _ref11$auth;
var _this17 = this;
return Promise.resolve().then(function () {
return _this17.upload({
identifier: identifier,
testItem: testItem,
metadata: metadata,
headers: headers,
wait: wait,
auth: auth,
autocreate: true
});
});
}
}, {
key: "upload",
value: function upload(_ref12) {
var _ref12$identifier = _ref12.identifier,
identifier = _ref12$identifier === void 0 ? null : _ref12$identifier,
_ref12$key = _ref12.key,
key = _ref12$key === void 0 ? null : _ref12$key,
_ref12$body = _ref12.body,
body = _ref12$body === void 0 ? "" : _ref12$body,
_ref12$autocreate = _ref12.autocreate,
autocreate = _ref12$autocreate === void 0 ? false : _ref12$autocreate,
_ref12$skipDerive = _ref12.skipDerive,
skipDerive = _ref12$skipDerive === void 0 ? false : _ref12$skipDerive,
_ref12$testItem = _ref12.testItem,
testItem = _ref12$testItem === void 0 ? false : _ref12$testItem,
_ref12$keepOldVersion = _ref12.keepOldVersions,
keepOldVersions = _ref12$keepOldVersion === void 0 ? true : _ref12$keepOldVersion,
_ref12$metadata = _ref12.metadata,
metadata = _ref12$metadata === void 0 ? {} : _ref12$metadata,
_ref12$headers = _ref12.headers,
headers = _ref12$headers === void 0 ? {} : _ref12$headers,
_ref12$wait = _ref12.wait,
wait = _ref12$wait === void 0 ? true : _ref12$wait,
_ref12$auth = _ref12.auth,
auth = _ref12$auth === void 0 ? newEmptyAuth() : _ref12$auth;
var _this18 = this;
return Promise.resolve().then(function () {
if (!identifier) {
throw new Error("Missing required args");
}
if (testItem) {
metadata["collection"] = "test_collection";
}
var requestHeaders = {};
Object.keys(metadata).forEach(function (k) {
str2arr(metadata[k]).forEach(function (v, idx) {
k = k.replace(/_/g, "--");
var headerKey = "x-archive-meta".concat(idx, "-").concat(k);
requestHeaders[headerKey] = v;
});
});
Object.assign(requestHeaders, headers, authToHeaderS3(auth));
if (autocreate) {
requestHeaders["x-archive-auto-make-bucket"] = 1;
}
if (skipDerive) {
requestHeaders["x-archive-queue-derive"] = 0;
}
requestHeaders["x-archive-keep-old-version"] = keepOldVersions ? 1 : 0;
var requestUrl = key ? "".concat(_this18.API_BASE, "/").concat(identifier, "/").concat(key) : "".concat(_this18.API_BASE, "/").concat(identifier);
return fetch(requestUrl, {
method: "PUT",
headers: requestHeaders,
body: body
});
}).then(function (_resp) {
var response = _resp;
if (response.status !== 200) {
// NOTE this may not be the right thing to check.
// Maybe different codes are okay
throw new Error("Response: ".concat(response.status));
}
if (!wait) {
return response;
} else {
// The finished response seems to be empty
return response.text();
}
});
}
}]);
return S3API;
}();
var SearchAPI = /*#__PURE__*/function () {
function SearchAPI() {
_classCallCheck(this, SearchAPI);
this.API_BASE = "https://archive.org/advancedsearch.php";
}
_createClass(SearchAPI, [{
key: "get",
value: function get() {
var _ref13 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref13$q = _ref13.q,
q = _ref13$q === void 0 ? null : _ref13$q,
_ref13$page = _ref13.page,
page = _ref13$page === void 0 ? 1 : _ref13$page,
_ref13$fields = _ref13.fields,
fields = _ref13$fields === void 0 ? ["identifier"] : _ref13$fields,
options = _objectWithoutProperties(_ref13, ["q", "page", "fields"]);
var _this19 = this;
return Promise.resolve().then(function () {
if (!q) {
throw new Error("Missing required arg 'q'");
}
if (_typeof(q) == "object") {
q = _this19.buildQueryFromObject(q);
}
var reqParams = _objectSpread(_objectSpread({
q: q,
page: page,
fl: fields
}, options), {}, {
output: "json"
});
var encodedParams = paramify(reqParams);
var url = "".concat(_this19.API_BASE, "?").concat(encodedParams);
return fetchJson(url);
});
}
}, {
key: "search",
value: function search(q) {
var _this20 = this;
return Promise.resolve().then(function () {
return _this20.get({
q: q
});
});
}
}, {
key: "buildQueryFromObject",
value: function buildQueryFromObject(qObject) {
// Map dictionary to a key=val search query
return Object.keys(qObject).map(function (key) {
if (Array.isArray(qObject[key])) {
return "".concat(key, ":( ").concat(qObject[key].map(function (v) {
return "\"".concat(v, "\"");
}).join(" OR "), " )");
} else {
return "".concat(key, ":\"").concat(qObject[key], "\"");
}
}).join(" AND ");
}
}]);
return SearchAPI;
}();
var SearchTextAPI = function SearchTextAPI() {
_classCallCheck(this, SearchTextAPI);
};
var ViewsAPI = /*#__PURE__*/function () {
function ViewsAPI() {
_classCallCheck(this, ViewsAPI);
// https://be-api.us.archive.org/views/v1/short/<identifier>[,<identifier>,...]
this.API_BASE = "https://be-api.us.archive.org/views/v1/short";
}
_createClass(ViewsAPI, [{
key: "get",
value: function get() {
var _ref14 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref14$identifier = _ref14.identifier,
identifier = _ref14$identifier === void 0 ? null : _ref14$identifier;
var _this21 = this;
return Promise.resolve().then(function () {
identifier = Array.isArray(identifier) ? identifier.join(",") : identifier;
return fetchJson("".concat(_this21.API_BASE, "/").concat(identifier));
});
}
}]);
return ViewsAPI;
}();
var WaybackAPI = /*#__PURE__*/function () {
function WaybackAPI() {
_classCallCheck(this, WaybackAPI);
this.AVAILABLE_API_BASE = "https://archive.org/wayback/available";
this.CDX_API_BASE = corsWorkAround("https://web.archive.org/cdx/search/");
this.SAVE_API_BASE = corsWorkAround("https://web.archive.org/save/");
}
/**
* @see https://archive.org/help/wayback_api.php
*/
_createClass(WaybackAPI, [{
key: "available",
value: function available() {
var _ref15 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref15$url = _ref15.url,
url = _ref15$url === void 0 ? null : _ref15$url,
_ref15$timestamp = _ref15.timestamp,
timestamp = _ref15$timestamp === void 0 ? null : _ref15$timestamp;
var _this22 = this;
return Promise.resolve().then(function () {
var params = {
url: url
};
if (timestamp !== null) {
params.timestamp = timestamp;
}
var searchParams = paramify(params);
var fetchFunction = isInBrowser() ? fetchJsonp : fetch;
return fetchFunction("".concat(_this22.AVAILABLE_API_BASE, "?").concat(searchParams));
}).then(function (_resp) {
var response = _resp;
return response.json();
});
}
/**
* @see https://github.com/internetarchive/wayback/tree/master/wayback-cdx-server
*/
}, {
key: "cdx",
value: function cdx() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var _this23 = this;
return Promise.resolve().then(function () {
options.output = "json";
var searchParams = paramify(options);
return fetch("".concat(_this23.CDX_API_BASE, "?").concat(searchParams));
}).then(function (_resp) {
var response = _resp;
return response.text();
}).then(function (_resp) {
var raw = _resp;
var json;
try {
json = JSON.parse(raw);
} catch (e) {
json = {
error: raw.trim()
};
}
return json;
});
}
/**
* @see https://docs.google.com/document/d/1Nsv52MvSjbLb2PCpHlat0gkzw0EvtSgpKHu4mk0MnrA/edit
*/
}, {
key: "savePageNow",
value: function savePageNow() {
var _ref16 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref16$url = _ref16.url,
url = _ref16$url === void 0 ? null : _ref16$url,
_ref16$captureOutlink = _ref16.captureOutlinks,
captureOutlinks = _ref16$captureOutlink === void 0 ? 0 : _ref16$captureOutlink,
_ref16$captureAll = _ref16.captureAll,
captureAll = _ref16$captureAll === void 0 ? true : _ref16$captureAll,
_ref16$captureScreens = _ref16.captureScreenshot,
captureScreenshot = _ref16$captureScreens === void 0 ? false : _ref16$captureScreens,
_ref16$skipFirstArchi = _ref16.skipFirstArchive,
skipFirstArchive = _ref16$skipFirstArchi === void 0 ? true : _ref16$skipFirstArchi,
_ref16$ifNotArchivedW = _ref16.ifNotArchivedWithin,
ifNotArchivedWithin = _ref16$ifNotArchivedW === void 0 ? null : _ref16$ifNotArchivedW,
_ref16$auth = _ref16.auth,
auth = _ref16$auth === void 0 ? newEmptyAuth() : _ref16$auth;
var _this24 = this;
return Promise.resolve().then(function () {
url = url.replace(/^https?\:\/\//, "");
var params = {
url: url,
capture_outlinks: captureOutlinks,
capture_all: captureAll ? "1" : "0",
capture_screenshot: captureScreenshot ? "1" : "0",
skip_first_archive: skipFirstArchive ? "1" : "0"
};
if (ifNotArchivedWithin) {
params.if_not_archived_within = ifNotArchivedWithin;
}
return fetch(_this24.SAVE_API_BASE, {
credentials: "omit",
method: "POST",
body: paramify(params),
headers: _objectSpread({
Accept: "application/json",
"Content-Type": "application/x-www-form-urlencoded"
}, authToHeaderS3(auth))
});
}).then(function (_resp) {
var response = _resp;
return response.json();
});
}
}]);
return WaybackAPI;
}();
var ZipFileAPI = /*#__PURE__*/function () {
function ZipFileAPI() {
_classCallCheck(this, ZipFileAPI);
}
_createClass(ZipFileAPI, [{
key: "ls",
/**
* List the contents of a zip file in an item
* Eg: https://archive.org/download/goodytwoshoes00newyiala/goodytwoshoes00newyiala_jp2.zip/
*/
value: function ls(identifier, zipPath) {
var auth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : newEmptyAuth();
return Promise.resolve().then(function () {
if (!zipPath.match(/\.(7z|cbr|cbz|cdr|iso|rar|tar|zip)$/)) {
throw new Error("Invalid zip type");
}
var requestUrl = corsWorkAround("https://archive.org/download/".concat(identifier, "/").concat(enc(zipPath), "/"));
return fetch(requestUrl, {
headers: authToHeaderCookies(auth)
});
}).then(function (_resp) {
var response = _resp;
if (response.status != 200) {
throw Error({
error: "not found"
});
}
return response.text();
}).then(function (_resp) {
var html = _resp; // This page has <td>'s without closing el tags (took a while to
// figure this out). This breaks the DOMparser, so I added a workaround
// to add closing tags
var tableHtml = html.match(/(<table class="archext">[\w\W]*<\/table>)/g)[0];
tableHtml = tableHtml.replace(/(<td[^>]*>[\w\W]*?)(?=<(?:td|\/tr))/g, "$1</td>");
var table = new xmldom.DOMParser().parseFromString(tableHtml);
var rows = table.getElementsByTagName("tr");
var results = [];
var _loop = function _loop(i) {
var cells = rows.item(i).getElementsByTagName("td");
if (cells.length != 4) {
return "continue";
}
try {
var a = cells.item(0).getElementsByTagName("a").item(0);
results.push({
key: a.textContent,
href: "https:" + a.getAttribute("href"),
jpegUrl: function () {
try {
return "https:" + cells.item(1).getElementsByTagName("a").item(0).getAttribute("href");
} catch (e) {
return null;
}
}(),
timestamp: cells.item(2).textContent,
size: cells.item(3).textContent
});
} catch (e) {}
};
for (var i = 0; i < rows.length; i++) {
var _ret = _loop(i);
if (_ret === "continue") continue;
}
return results;
});
}
}]);
return ZipFileAPI;
}();
var iajs = {
Auth: new Auth(),
BookReaderAPI: new BookReaderAPI(),
GifcitiesAPI: new GifcitiesAPI(),
FavoritesAPI: new FavoritesAPI(),
MetadataAPI: new MetadataAPI(),
RelatedAPI: new RelatedAPI(),
ReviewsAPI: new ReviewsAPI(),
SearchAPI: new SearchAPI(),
SearchTextAPI: new SearchTextAPI(),
S3API: new S3API(),
ViewsAPI: new ViewsAPI(),
WaybackAPI: new WaybackAPI(),
ZipFileAPI: new ZipFileAPI()
};
return iajs;
});