bing-image-search
Version:
CLI tool query the Bing Image Search API
232 lines (231 loc) • 10.6 kB
JavaScript
"use strict";
var _argparse = require("argparse");
var _bingImageSearchAsyncIterator = _interopRequireDefault(require("bing-image-search-async-iterator"));
var _package = require("../package.json");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
function _asyncIterator(r) { var n, t, o, e = 2; for ("undefined" != typeof Symbol && (t = Symbol.asyncIterator, o = Symbol.iterator); e--;) { if (t && null != (n = r[t])) return n.call(r); if (o && null != (n = r[o])) return new AsyncFromSyncIterator(n.call(r)); t = "@@asyncIterator", o = "@@iterator"; } throw new TypeError("Object is not async iterable"); }
function AsyncFromSyncIterator(r) { function AsyncFromSyncIteratorContinuation(r) { if (Object(r) !== r) return Promise.reject(new TypeError(r + " is not an object.")); var n = r.done; return Promise.resolve(r.value).then(function (r) { return { value: r, done: n }; }); } return AsyncFromSyncIterator = function AsyncFromSyncIterator(r) { this.s = r, this.n = r.next; }, AsyncFromSyncIterator.prototype = { s: null, n: null, next: function next() { return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments)); }, return: function _return(r) { var n = this.s.return; return void 0 === n ? Promise.resolve({ value: r, done: !0 }) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments)); }, throw: function _throw(r) { var n = this.s.return; return void 0 === n ? Promise.reject(r) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments)); } }, new AsyncFromSyncIterator(r); }
function keyValuePairsToObject(kvps = []) {
return kvps.reduce((acc, [k, v]) => {
acc[k] = v;
return acc;
}, {});
}
_asyncToGenerator(function* () {
try {
const parser = new _argparse.ArgumentParser({
version: _package.version,
addHelp: true,
description: 'Bing Image Search'
});
const defaultAG = parser.addArgumentGroup({
description: 'Basic arguments'
});
defaultAG.addArgument(['query'], {
help: 'Search query string'
});
defaultAG.addArgument(['--key'], {
help: 'API Key (or set BING_IMAGE_SEARCH_API_KEY instead)',
defaultValue: process.env.BING_IMAGE_SEARCH_API_KEY,
required: process.env.BING_IMAGE_SEARCH_API_KEY == null
});
defaultAG.addArgument(['--amount'], {
help: 'Total results desired (default: 2000)',
type: 'int',
defaultValue: 2000
});
defaultAG.addArgument(['--market'], {
help: 'Market code (e.g., "en-US")'
});
defaultAG.addArgument(['--safeSearch'], {
help: 'Safe search ("Off", "Moderate", "Strict")',
metavar: 'MODE',
choices: ['Off', 'Moderate', 'Strict']
});
const filtersAG = parser.addArgumentGroup({
description: 'Filter arguments'
});
filtersAG.addArgument(['--aspect'], {
help: 'Aspect ratio ("Square", "Wide", "Tall", "All")',
metavar: 'ASPECT',
choices: ['Square', 'Wide', 'Tall', 'All']
});
filtersAG.addArgument(['--color'], {
help: 'Color ("ColorOnly", "Monochrome", "Black", "Blue", "Brown", "Gray", "Green", "Orange", "Pink", "Purple", "Red", "Teal", "White", "Yellow")',
metavar: 'COLOR',
choices: ['ColorOnly', 'Monochrome', 'Black', 'Blue', 'Brown', 'Gray', 'Green', 'Orange', 'Pink', 'Purple', 'Red', 'Teal', 'White', 'Yellow']
});
filtersAG.addArgument(['--imageContent'], {
help: 'Content type ("Face", "Portrait")',
metavar: 'TYPE',
choices: ['Face', 'Portrait']
});
filtersAG.addArgument(['--imageType'], {
help: 'Image type ("AnimatedGif", "AnimatedGifHttps", "Clipart", "Line", "Photo", "Shopping", "Transparent")',
metavar: 'TYPE',
choices: ['AnimatedGif', 'AnimatedGifHttps', 'Clipart', 'Line', 'Photo', 'Shopping', 'Transparent']
});
filtersAG.addArgument(['--license'], {
help: 'Image license type ("Any", "Public", "Share", "ShareCommercially", "Modify", "ModifyCommercially", "All"); "Any" excludes images without known license',
metavar: 'LICENSE',
choices: ['Any', 'Public', 'Share', 'ShareCommercially', 'Modify', 'ModifyCommercially', 'All']
});
filtersAG.addArgument(['--freshness'], {
help: 'Discovery time ("Day", "Week", "Month")',
metavar: 'VALUE',
choices: ['Day', 'Week', 'Month']
});
filtersAG.addArgument(['--size'], {
help: 'Image size ("Small", "Medium", "Large", "Wallpaper", "All")',
metavar: 'SIZE',
choices: ['Small', 'Medium', 'Large', 'Wallpaper', 'All']
});
filtersAG.addArgument(['--width'], {
help: 'Width is equal to VALUE',
type: 'int',
metavar: 'VALUE'
});
filtersAG.addArgument(['--height'], {
help: 'Height is equal to VALUE',
type: 'int',
metavar: 'VALUE'
});
filtersAG.addArgument(['--minWidth'], {
help: 'Width is greater than or equal to VALUE',
type: 'int',
metavar: 'VALUE'
});
filtersAG.addArgument(['--minHeight'], {
help: 'Height is greater than or equal to VALUE',
type: 'int',
metavar: 'VALUE'
});
filtersAG.addArgument(['--maxWidth'], {
help: 'Width is less than or equal to VALUE',
type: 'int',
metavar: 'VALUE'
});
filtersAG.addArgument(['--maxHeight'], {
help: 'Height is less than or equal to VALUE',
type: 'int',
metavar: 'VALUE'
});
filtersAG.addArgument(['--minFileSize'], {
help: 'File is size greater than or equal to VALUE',
type: 'int',
metavar: 'VALUE'
});
filtersAG.addArgument(['--maxFileSize'], {
help: 'File is size less than or equal to VALUE',
type: 'int',
metavar: 'VALUE'
});
const specialAG = parser.addArgumentGroup({
description: 'Special arguments'
});
specialAG.addArgument(['--offset'], _objectSpread({
help: 'Initial offset for API call (default: 0)',
type: 'int',
defaultValue: 0
}, {
help: _argparse.Const.SUPPRESS
}));
specialAG.addArgument(['--count'], _objectSpread({
help: 'Result count per API call (default: 150)',
type: 'int',
defaultValue: 150
}, {
help: _argparse.Const.SUPPRESS
}));
specialAG.addArgument(['--indent'], {
help: 'Spaces to indent JSON outputs (default: 2)',
type: 'int',
defaultValue: 2,
metavar: 'SPACES'
});
specialAG.addArgument(['--qparam'], {
help: 'Add query param (multiples allowed)',
nargs: 2,
action: 'append',
metavar: ['KEY', 'VALUE'],
defaultValue: []
});
specialAG.addArgument(['--hparam'], {
help: 'Add header param (multiples allowed)',
nargs: 2,
action: 'append',
metavar: ['KEY', 'VALUE'],
defaultValue: []
});
specialAG.addArgument(['--raw'], {
help: 'Do not unwrap search results from API responses',
nargs: 0
});
const args = parser.parseArgs();
const searchOpts = {
query: args.query,
key: args.key,
amount: args.amount,
market: args.market,
safeSearch: args.safeSearch,
aspect: args.aspect,
color: args.color,
imageContent: args.imageContent,
imageType: args.imageType,
license: args.license,
freshness: args.freshness,
size: args.size,
width: args.width,
height: args.height,
minWidth: args.minWidth,
minHeight: args.minHeight,
maxWidth: args.maxWidth,
maxHeight: args.maxHeight,
minFileSize: args.minFileSize,
maxFileSize: args.maxFileSize,
offset: args.offset,
count: args.count,
queryParams: keyValuePairsToObject(args.qparam),
headerParams: keyValuePairsToObject(args.hparam)
};
var _iteratorAbruptCompletion = false;
var _didIteratorError = false;
var _iteratorError;
try {
for (var _iterator = _asyncIterator((0, _bingImageSearchAsyncIterator.default)(searchOpts)), _step; _iteratorAbruptCompletion = !(_step = yield _iterator.next()).done; _iteratorAbruptCompletion = false) {
const response = _step.value;
{
const outputFn = obj => console.log(JSON.stringify(obj, null, args.indent));
if (args.raw) {
outputFn(response);
} else {
response.value.forEach(outputFn);
}
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (_iteratorAbruptCompletion && _iterator.return != null) {
yield _iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
} catch (err) {
process.exitCode = 1;
console.error(err.message);
}
})();