@sugarcube/plugin-youtube
Version:
A SugarCube plugin to fetch videos from Youtube.
95 lines (78 loc) • 2.64 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _fp = require("lodash/fp");
var _dashp = require("dashp");
var _core = require("@sugarcube/core");
var _utils = require("@sugarcube/utils");
var _api = require("../api");
var _utils2 = require("../utils");
const querySource = "youtube_video";
const fetchVideos = async (envelope, {
cfg,
log,
stats
}) => {
const decisions = (0, _core.createFeatureDecisions)();
const key = (0, _fp.get)("youtube.api_key", cfg);
const queries = _core.envelope.queriesByType(querySource, envelope).map(term => (0, _utils2.parseYoutubeVideo)(term));
const logCounter = (0, _utils.counter)(envelope.data.length, ({
cnt,
total,
percent
}) => log.debug(`Progress: ${cnt}/${total} units (${percent}%).`), {
threshold: 50,
steps: 25
});
log.info(`Querying for ${queries.length} videos.`);
const videos = await (0, _dashp.flatmapP)((0, _dashp.flowP)([async qs => {
stats.count("total", qs.length);
log.info(`Fetch details for ${qs.length} videos.`);
let results = [];
let failMsg = "Doesn't exist";
try {
results = await (0, _api.videosList)(key, qs);
stats.count("success", results.length);
} catch (e) {
failMsg = e.message;
}
if (results.length !== qs.length) {
const missing = qs.reduce((memo, q) => results.find(({
id
}) => id === q) == null ? memo.concat({
type: querySource,
term: q,
reason: failMsg
}) : memo, []);
missing.forEach(stats.fail);
}
qs.forEach(logCounter); // Merge the query into the data unit.
return results.map(r => {
const q = envelope.queries.find(({
type,
term
}) => {
const videoId = decisions.canNcube() ? r._sc_id : r.id;
return type === querySource && (0, _utils2.parseYoutubeVideo)(term) === videoId;
});
if (q == null) return r;
const {
tags,
...query
} = q;
return Object.assign(r, {
_sc_queries: Array.isArray(r._sc_queries) ? r._sc_queries.concat(query) : [query]
}, Array.isArray(tags) && tags.length > 0 ? {
_sc_tags: Array.isArray(r._sc_tags) ? r._sc_tags.concat(tags) : tags
} : undefined);
});
}, (0, _dashp.delayP)(1000)]), (0, _fp.chunk)(50, queries));
return _core.envelope.concatData(videos, envelope);
};
const plugin = _core.plugin.liftManyA2([_utils2.assertCredentials, fetchVideos]);
plugin.desc = "List details for individual videos.";
plugin.argv = {};
var _default = plugin;
exports.default = _default;