Socket
Socket
Sign inDemoInstall

ytfps

Package Overview
Dependencies
2
Maintainers
1
Versions
9
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 1.0.6 to 1.1.0

31

lib/index.ts
import ax, { AxiosRequestConfig } from 'axios';
import { YTPlaylist, YTvideo } from './interfaces';
import { YTFPSOptions, YTPlaylist, YTvideo } from './interfaces';

@@ -20,4 +20,9 @@ export = fetchFromPlaylist;

* @param url URL or ID of the playlist you want to scrap
* @param opts an optional YTFPSOptions object
*/
async function fetchFromPlaylist(url: string) : Promise<YTPlaylist> {
async function fetchFromPlaylist(url: string, opts: YTFPSOptions = {}) : Promise<YTPlaylist> {
if(typeof opts.limit != 'undefined' && (typeof opts.limit != 'number' || isNaN(opts.limit) || opts.limit < 0))
throw Error("Could not parse the limit option. Make sure it's an integer > 0, Infinity or undefined.");
opts.limit = opts.limit ?? Infinity;
let test = /[?&]list=([^#\&\?]+)|^([a-zA-Z0-9-_]+)$/.exec(url);

@@ -49,5 +54,5 @@ if(!test)

if(listData.contents)
videos.push(...parseVideosFromJson(listData.contents));
if(contToken)
videos.push(...(await getAllVideos(contToken)));
videos.push(...parseVideosFromJson(listData.contents, opts));
if(contToken && opts.limit > 0)
videos.push(...(await getAllVideos(contToken, opts)));

@@ -80,7 +85,10 @@ try {

function parseVideosFromJson(videoDataArray: any[]) : YTvideo[] {
function parseVideosFromJson(videoDataArray: any[], opts: YTFPSOptions) : YTvideo[] {
try {
let videos: YTvideo[] = [];
for(let v of videoDataArray.map(v => v.playlistVideoRenderer))
for(const vid of videoDataArray)
try {
if(opts.limit! <= 0)
break;
const v = vid.playlistVideoRenderer;
videos.push({

@@ -97,3 +105,4 @@ title: v.title.runs[0].text,

}
} );
});
--opts.limit!;
} catch {

@@ -108,8 +117,8 @@ continue;

async function getAllVideos(ajax_url: string, videos: YTvideo[] = []) : Promise<YTvideo[]> {
async function getAllVideos(ajax_url: string, opts: YTFPSOptions, videos: YTvideo[] = []) : Promise<YTvideo[]> {
try {
let ytAppendData = (await ax.post(baseURL + '/youtubei/v1/browse?key=' + iAPIkey, {"context":{"client":{"clientName":"WEB","clientVersion":"2.20210401.08.00"}},"continuation":ajax_url}, rqOpts)).data;
let contToken: any = ytAppendData.onResponseReceivedActions?.[0]?.appendContinuationItemsAction?.continuationItems?.slice(-1)?.[0]?.continuationItemRenderer?.continuationEndpoint?.continuationCommand?.token;
videos.push(...parseVideosFromJson(ytAppendData.onResponseReceivedActions[0].appendContinuationItemsAction.continuationItems));
return contToken ? await getAllVideos(contToken, videos) : videos;
videos.push(...parseVideosFromJson(ytAppendData.onResponseReceivedActions[0].appendContinuationItemsAction.continuationItems, opts));
return (contToken && opts.limit! > 0) ? await getAllVideos(contToken, opts, videos) : videos;
} catch {

@@ -116,0 +125,0 @@ throw Error('An error has occured while trying to fetch more videos');

@@ -31,1 +31,5 @@ export interface YTPlaylist {

}
export interface YTFPSOptions {
limit?: number
}

@@ -1,2 +0,2 @@

import { YTPlaylist } from './interfaces';
import { YTFPSOptions, YTPlaylist } from './interfaces';
export = fetchFromPlaylist;

@@ -6,4 +6,5 @@ /**

* @param url URL or ID of the playlist you want to scrap
* @param opts an optional YTFPSOptions object
*/
declare function fetchFromPlaylist(url: string): Promise<YTPlaylist>;
declare function fetchFromPlaylist(url: string, opts?: YTFPSOptions): Promise<YTPlaylist>;
//# sourceMappingURL=index.d.ts.map

@@ -18,5 +18,9 @@ "use strict";

* @param url URL or ID of the playlist you want to scrap
* @param opts an optional YTFPSOptions object
*/
async function fetchFromPlaylist(url) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2;
async function fetchFromPlaylist(url, opts = {}) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3;
if (typeof opts.limit != 'undefined' && (typeof opts.limit != 'number' || isNaN(opts.limit) || opts.limit < 0))
throw Error("Could not parse the limit option. Make sure it's an integer > 0, Infinity or undefined.");
opts.limit = (_a = opts.limit) !== null && _a !== void 0 ? _a : Infinity;
let test = /[?&]list=([^#\&\?]+)|^([a-zA-Z0-9-_]+)$/.exec(url);

@@ -30,6 +34,6 @@ if (!test)

let body = (await axios_1.default.get('https://youtube.com/playlist?list=' + encodeURI(playlistID), rqOpts)).data;
iAPIkey = (_a = /"INNERTUBE_API_KEY":"(.*?)"/.exec(body)) === null || _a === void 0 ? void 0 : _a[1];
ytInitialData = JSON.parse(((_b = /(?:window\["ytInitialData"\])|(?:ytInitialData) =.*?({.*?});/s.exec(body)) === null || _b === void 0 ? void 0 : _b[1]) || '{}');
iAPIkey = (_b = /"INNERTUBE_API_KEY":"(.*?)"/.exec(body)) === null || _b === void 0 ? void 0 : _b[1];
ytInitialData = JSON.parse(((_c = /(?:window\["ytInitialData"\])|(?:ytInitialData) =.*?({.*?});/s.exec(body)) === null || _c === void 0 ? void 0 : _c[1]) || '{}');
}
catch (_3) {
catch (_4) {
throw Error('Could not fetch/parse playlist');

@@ -39,17 +43,17 @@ }

throw Error('Could not extract internal API key');
if ((_c = JSON.stringify(ytInitialData.alerts)) === null || _c === void 0 ? void 0 : _c.includes("ERROR"))
if ((_d = JSON.stringify(ytInitialData.alerts)) === null || _d === void 0 ? void 0 : _d.includes("ERROR"))
throw Error('This playlist is private or broken');
if (!((_q = (_p = (_o = (_m = (_l = (_k = (_j = (_h = (_g = (_f = (_e = (_d = ytInitialData === null || ytInitialData === void 0 ? void 0 : ytInitialData.contents) === null || _d === void 0 ? void 0 : _d.twoColumnBrowseResultsRenderer) === null || _e === void 0 ? void 0 : _e.tabs) === null || _f === void 0 ? void 0 : _f[0]) === null || _g === void 0 ? void 0 : _g.tabRenderer) === null || _h === void 0 ? void 0 : _h.content) === null || _j === void 0 ? void 0 : _j.sectionListRenderer) === null || _k === void 0 ? void 0 : _k.contents) === null || _l === void 0 ? void 0 : _l[0]) === null || _m === void 0 ? void 0 : _m.itemSectionRenderer) === null || _o === void 0 ? void 0 : _o.contents) === null || _p === void 0 ? void 0 : _p[0]) === null || _q === void 0 ? void 0 : _q.playlistVideoListRenderer))
if (!((_r = (_q = (_p = (_o = (_m = (_l = (_k = (_j = (_h = (_g = (_f = (_e = ytInitialData === null || ytInitialData === void 0 ? void 0 : ytInitialData.contents) === null || _e === void 0 ? void 0 : _e.twoColumnBrowseResultsRenderer) === null || _f === void 0 ? void 0 : _f.tabs) === null || _g === void 0 ? void 0 : _g[0]) === null || _h === void 0 ? void 0 : _h.tabRenderer) === null || _j === void 0 ? void 0 : _j.content) === null || _k === void 0 ? void 0 : _k.sectionListRenderer) === null || _l === void 0 ? void 0 : _l.contents) === null || _m === void 0 ? void 0 : _m[0]) === null || _o === void 0 ? void 0 : _o.itemSectionRenderer) === null || _p === void 0 ? void 0 : _p.contents) === null || _q === void 0 ? void 0 : _q[0]) === null || _r === void 0 ? void 0 : _r.playlistVideoListRenderer))
throw Error('Cannot find valid playlist JSON data. Is the playlist ID correct?');
let listData = ytInitialData.contents.twoColumnBrowseResultsRenderer.tabs[0].tabRenderer.content.sectionListRenderer.contents[0].itemSectionRenderer.contents[0].playlistVideoListRenderer;
let d = ytInitialData;
let contToken = ((_w = (_v = (_u = (_t = (_s = (_r = listData === null || listData === void 0 ? void 0 : listData.contents) === null || _r === void 0 ? void 0 : _r.slice(-1)) === null || _s === void 0 ? void 0 : _s[0]) === null || _t === void 0 ? void 0 : _t.continuationItemRenderer) === null || _u === void 0 ? void 0 : _u.continuationEndpoint) === null || _v === void 0 ? void 0 : _v.continuationCommand) === null || _w === void 0 ? void 0 : _w.token) || '';
let contToken = ((_x = (_w = (_v = (_u = (_t = (_s = listData === null || listData === void 0 ? void 0 : listData.contents) === null || _s === void 0 ? void 0 : _s.slice(-1)) === null || _t === void 0 ? void 0 : _t[0]) === null || _u === void 0 ? void 0 : _u.continuationItemRenderer) === null || _v === void 0 ? void 0 : _v.continuationEndpoint) === null || _w === void 0 ? void 0 : _w.continuationCommand) === null || _x === void 0 ? void 0 : _x.token) || '';
if (listData.contents)
videos.push(...parseVideosFromJson(listData.contents));
if (contToken)
videos.push(...(await getAllVideos(contToken)));
videos.push(...parseVideosFromJson(listData.contents, opts));
if (contToken && opts.limit > 0)
videos.push(...(await getAllVideos(contToken, opts)));
try {
let mf = d.microformat.microformatDataRenderer;
let si0 = d.sidebar.playlistSidebarRenderer.items[0].playlistSidebarPrimaryInfoRenderer;
let si1 = (_x = d.sidebar.playlistSidebarRenderer.items[1]) === null || _x === void 0 ? void 0 : _x.playlistSidebarSecondaryInfoRenderer.videoOwner.videoOwnerRenderer;
let si1 = (_y = d.sidebar.playlistSidebarRenderer.items[1]) === null || _y === void 0 ? void 0 : _y.playlistSidebarSecondaryInfoRenderer.videoOwner.videoOwnerRenderer;
return {

@@ -59,4 +63,4 @@ title: mf.title,

id: listData.playlistId,
video_count: +((_z = (_y = si0.stats[0].runs[0]) === null || _y === void 0 ? void 0 : _y.text) === null || _z === void 0 ? void 0 : _z.replace(/[^0-9]/g, '')),
view_count: +((_1 = (_0 = si0.stats[1]) === null || _0 === void 0 ? void 0 : _0.simpleText) === null || _1 === void 0 ? void 0 : _1.replace(/[^0-9]/g, '')) || 0,
video_count: +((_0 = (_z = si0.stats[0].runs[0]) === null || _z === void 0 ? void 0 : _z.text) === null || _0 === void 0 ? void 0 : _0.replace(/[^0-9]/g, '')),
view_count: +((_2 = (_1 = si0.stats[1]) === null || _1 === void 0 ? void 0 : _1.simpleText) === null || _2 === void 0 ? void 0 : _2.replace(/[^0-9]/g, '')) || 0,
description: mf.description,

@@ -75,10 +79,13 @@ isUnlisted: mf.unlisted,

catch (e) {
throw Error('Could not parse playlist metadata: ' + ((_2 = e) === null || _2 === void 0 ? void 0 : _2.message));
throw Error('Could not parse playlist metadata: ' + ((_3 = e) === null || _3 === void 0 ? void 0 : _3.message));
}
}
function parseVideosFromJson(videoDataArray) {
function parseVideosFromJson(videoDataArray, opts) {
try {
let videos = [];
for (let v of videoDataArray.map(v => v.playlistVideoRenderer))
for (const vid of videoDataArray)
try {
if (opts.limit <= 0)
break;
const v = vid.playlistVideoRenderer;
videos.push({

@@ -96,2 +103,3 @@ title: v.title.runs[0].text,

});
--opts.limit;
}

@@ -107,3 +115,3 @@ catch (_a) {

}
async function getAllVideos(ajax_url, videos = []) {
async function getAllVideos(ajax_url, opts, videos = []) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j;

@@ -113,4 +121,4 @@ try {

let contToken = (_j = (_h = (_g = (_f = (_e = (_d = (_c = (_b = (_a = ytAppendData.onResponseReceivedActions) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.appendContinuationItemsAction) === null || _c === void 0 ? void 0 : _c.continuationItems) === null || _d === void 0 ? void 0 : _d.slice(-1)) === null || _e === void 0 ? void 0 : _e[0]) === null || _f === void 0 ? void 0 : _f.continuationItemRenderer) === null || _g === void 0 ? void 0 : _g.continuationEndpoint) === null || _h === void 0 ? void 0 : _h.continuationCommand) === null || _j === void 0 ? void 0 : _j.token;
videos.push(...parseVideosFromJson(ytAppendData.onResponseReceivedActions[0].appendContinuationItemsAction.continuationItems));
return contToken ? await getAllVideos(contToken, videos) : videos;
videos.push(...parseVideosFromJson(ytAppendData.onResponseReceivedActions[0].appendContinuationItemsAction.continuationItems, opts));
return (contToken && opts.limit > 0) ? await getAllVideos(contToken, opts, videos) : videos;
}

@@ -122,2 +130,2 @@ catch (_k) {

module.exports = fetchFromPlaylist;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLGtEQUErQztBQUsvQyxNQUFNLE1BQU0sR0FBdUI7SUFDL0IsT0FBTyxFQUFFO1FBQ0wsWUFBWSxFQUFFLGFBQWE7UUFDM0IsdUJBQXVCLEVBQUUsQ0FBQztRQUMxQiwwQkFBMEIsRUFBRSxrQkFBa0I7S0FDakQ7Q0FDSixDQUFBO0FBRUQsTUFBTSxPQUFPLEdBQUcseUJBQXlCLENBQUM7QUFDMUMsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBRWpCOzs7R0FHRztBQUNILEtBQUssVUFBVSxpQkFBaUIsQ0FBQyxHQUFXOztJQUN4QyxJQUFJLElBQUksR0FBRyx5Q0FBeUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0QsSUFBRyxDQUFDLElBQUk7UUFDSixNQUFNLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQzlDLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsSUFBSSxNQUFNLEdBQWMsRUFBRSxDQUFDO0lBQzNCLElBQUksYUFBa0IsQ0FBQztJQUV2QixJQUFJO1FBQ0EsSUFBSSxJQUFJLEdBQUcsQ0FBQyxNQUFNLGVBQUUsQ0FBQyxHQUFHLENBQUMsb0NBQW9DLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBYyxDQUFDO1FBQy9HLE9BQU8sR0FBRyxNQUFBLDZCQUE2QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsMENBQUcsQ0FBQyxDQUFXLENBQUM7UUFDbEUsYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBQSwrREFBK0QsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLDBDQUFHLENBQUMsTUFBSyxJQUFJLENBQUMsQ0FBQztLQUN2SDtJ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QUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztRQUMvSCxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxZQUFZLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7S0FDckU7SUFBQyxXQUFNO1FBQ0osTUFBTSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztLQUN6RTtBQUNMLENBQUM7QUE3R0QsaUJBQVMsaUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXgsIHsgQXhpb3NSZXF1ZXN0Q29uZmlnIH0gZnJvbSAnYXhpb3MnO1xyXG5pbXBvcnQgeyBZVFBsYXlsaXN0LCBZVHZpZGVvIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcclxuXHJcbmV4cG9ydCA9IGZldGNoRnJvbVBsYXlsaXN0O1xyXG5cclxuY29uc3QgcnFPcHRzOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XHJcbiAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgJ1VzZXItQWdlbnQnOiAnaGVsbG9iaWN6ZXMnLFxyXG4gICAgICAgICd4LXlvdXR1YmUtY2xpZW50LW5hbWUnOiAxLFxyXG4gICAgICAgICd4LXlvdXR1YmUtY2xpZW50LXZlcnNpb24nOiAnMi4yMDIwMDczMS4wMi4wMSdcclxuICAgIH1cclxufVxyXG5cclxuY29uc3QgYmFzZVVSTCA9ICdodHRwczovL3d3dy55b3V0dWJlLmNvbSc7XHJcbmxldCBpQVBJa2V5ID0gJyc7XHJcblxyXG4vKipcclxuICogU2NyYXBzIHlvdXR1YmUgcGxheWxpc3QgbWV0YWRhdGEgYW5kIGFsbCBpdHMgdmlkZW9zXHJcbiAqIEBwYXJhbSB1cmwgVVJMIG9yIElEIG9mIHRoZSBwbGF5bGlzdCB5b3Ugd2FudCB0byBzY3JhcFxyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hGcm9tUGxheWxpc3QodXJsOiBzdHJpbmcpIDogUHJvbWlzZTxZVFBsYXlsaXN0PiB7XHJcbiAgICBsZXQgdGVzdCA9IC9bPyZdbGlzdD0oW14jXFwmXFw/XSspfF4oW2EtekEtWjAtOS1fXSspJC8uZXhlYyh1cmwpO1xyXG4gICAgaWYoIXRlc3QpXHJcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0ludmFsaWQgcGxheWxpc3QgVVJMIG9yIElEJyk7XHJcbiAgICBsZXQgcGxheWxpc3RJRCA9IHRlc3RbMV0gfHwgdGVzdFsyXTtcclxuICAgIGxldCB2aWRlb3M6IFlUdmlkZW9bXSA9IFtdO1xyXG4gICAgbGV0IHl0SW5pdGlhbERhdGE6IGFueTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAgIGxldCBib2R5ID0gKGF3YWl0IGF4LmdldCgnaHR0cHM6Ly95b3V0dWJlLmNvbS9wbGF5bGlzdD9saXN0PScgKyBlbmNvZGVVUkkocGxheWxpc3RJRCksIHJxT3B0cykpLmRhdGEgYXMgc3RyaW5nO1xyXG4gICAgICAgIGlBUElrZXkgPSAvXCJJTk5FUlRVQkVfQVBJX0tFWVwiOlwiKC4qPylcIi8uZXhlYyhib2R5KT8uWzFdIGFzIHN0cmluZztcclxuICAgICAgICB5dEluaXRpYWxEYXRhID0gSlNPTi5wYXJzZSgvKD86d2luZG93XFxbXCJ5dEluaXRpYWxEYXRhXCJcXF0pfCg/Onl0SW5pdGlhbERhdGEpID0uKj8oey4qP30pOy9zLmV4ZWMoYm9keSk/LlsxXSB8fCAne30nKTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIHRocm93IEVycm9yKCdDb3VsZCBub3QgZmV0Y2gvcGFyc2UgcGxheWxpc3QnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZighaUFQSWtleSlcclxuICAgICAgICB0aHJvdyBFcnJvcignQ291bGQgbm90IGV4dHJhY3QgaW50ZXJuYWwgQVBJIGtleScpO1xyXG4gICAgaWYoSlNPTi5zdHJpbmdpZnkoeXRJbml0aWFsRGF0YS5hbGVydHMpPy5pbmNsdWRlcyhcIkVSUk9SXCIpKVxyXG4gICAgICAgIHRocm93IEVycm9yKCdUaGlzIHBsYXlsaXN0IGlzIHByaXZhdGUgb3IgYnJva2VuJyk7XHJcbiAgICBpZigheXRJbml0aWFsRGF0YT8uY29udGVudHM/LnR3b0NvbHVtbkJyb3dzZVJlc3VsdHNSZW5kZXJlcj8udGFicz8uWzBdPy50YWJSZW5kZXJlcj8uY29udGVudD8uc2VjdGlvbkxpc3RSZW5kZXJlcj8uY29udGVudHM/LlswXT8uaXRlbVNlY3Rpb25SZW5kZXJlcj8uY29udGVudHM/LlswXT8ucGxheWxpc3RWaWRlb0xpc3RSZW5kZXJlcilcclxuICAgICAgICB0aHJvdyBFcnJvcignQ2Fubm90IGZpbmQgdmFsaWQgcGxheWxpc3QgSlNPTiBkYXRhLiBJcyB0aGUgcGxheWxpc3QgSUQgY29ycmVjdD8nKTtcclxuICAgIGxldCBsaXN0RGF0YSA9IHl0SW5pdGlhbERhdGEuY29udGVudHMudHdvQ29sdW1uQnJvd3NlUmVzdWx0c1JlbmRlcmVyLnRhYnNbMF0udGFiUmVuZGVyZXIuY29udGVudC5zZWN0aW9uTGlzdFJlbmRlcmVyLmNvbnRlbnRzWzBdLml0ZW1TZWN0aW9uUmVuZGVyZXIuY29udGVudHNbMF0ucGxheWxpc3RWaWRlb0xpc3RSZW5kZXJlcjtcclxuICAgIGxldCBkID0geXRJbml0aWFsRGF0YTtcclxuXHJcbiAgICBsZXQgY29udFRva2VuOiBzdHJpbmcgPSBsaXN0RGF0YT8uY29udGVudHM/LnNsaWNlKC0xKT8uWzBdPy5jb250aW51YXRpb25JdGVtUmVuZGVyZXI/LmNvbnRpbnVhdGlvbkVuZHBvaW50Py5jb250aW51YXRpb25Db21tYW5kPy50b2tlbiB8fCAnJztcclxuICAgIGlmKGxpc3REYXRhLmNvbnRlbnRzKVxyXG4gICAgICAgIHZpZGVvcy5wdXNoKC4uLnBhcnNlVmlkZW9zRnJvbUpzb24obGlzdERhdGEuY29udGVudHMpKTtcclxuICAgIGlmKGNvbnRUb2tlbilcclxuICAgICAgICB2aWRlb3MucHVzaCguLi4oYXdhaXQgZ2V0QWxsVmlkZW9zKGNvbnRUb2tlbikpKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAgIGxldCBtZiA9IGQubWljcm9mb3JtYXQubWljcm9mb3JtYXREYXRhUmVuZGVyZXI7XHJcbiAgICAgICAgbGV0IHNpMCA9IGQuc2lkZWJhci5wbGF5bGlzdFNpZGViYXJSZW5kZXJlci5pdGVtc1swXS5wbGF5bGlzdFNpZGViYXJQcmltYXJ5SW5mb1JlbmRlcmVyO1xyXG4gICAgICAgIGxldCBzaTEgPSBkLnNpZGViYXIucGxheWxpc3RTaWRlYmFyUmVuZGVyZXIuaXRlbXNbMV0/LnBsYXlsaXN0U2lkZWJhclNlY29uZGFyeUluZm9SZW5kZXJlci52aWRlb093bmVyLnZpZGVvT3duZXJSZW5kZXJlcjtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0aXRsZTogbWYudGl0bGUsXHJcbiAgICAgICAgICAgIHVybDogYmFzZVVSTCArICcvcGxheWxpc3Q/bGlzdD0nICsgbGlzdERhdGEucGxheWxpc3RJZCxcclxuICAgICAgICAgICAgaWQ6IGxpc3REYXRhLnBsYXlsaXN0SWQsXHJcbiAgICAgICAgICAgIHZpZGVvX2NvdW50OiArc2kwLnN0YXRzWzBdLnJ1bnNbMF0/LnRleHQ/LnJlcGxhY2UoL1teMC05XS9nLCAnJyksXHJcbiAgICAgICAgICAgIHZpZXdfY291bnQ6ICtzaTAuc3RhdHNbMV0/LnNpbXBsZVRleHQ/LnJlcGxhY2UoL1teMC05XS9nLCAnJykgfHwgMCxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246IG1mLmRlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgICBpc1VubGlzdGVkOiBtZi51bmxpc3RlZCxcclxuICAgICAgICAgICAgaXNBbGJ1bTogJ2FsYnVtTmFtZScgaW4gZC5tZXRhZGF0YS5wbGF5bGlzdE1ldGFkYXRhUmVuZGVyZXIsXHJcbiAgICAgICAgICAgIHRodW1ibmFpbF91cmw6IG1mLnRodW1ibmFpbC50aHVtYm5haWxzLnBvcCgpLnVybC5yZXBsYWNlKC8oPzomdj18JmRheXMpLiovLCAnJyksXHJcbiAgICAgICAgICAgIGF1dGhvcjogc2kxICYmIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IHNpMS50aXRsZS5ydW5zWzBdLnRleHQsXHJcbiAgICAgICAgICAgICAgICB1cmw6IGJhc2VVUkwgKyBzaTEudGl0bGUucnVuc1swXS5uYXZpZ2F0aW9uRW5kcG9pbnQuY29tbWFuZE1ldGFkYXRhLndlYkNvbW1hbmRNZXRhZGF0YS51cmwsXHJcbiAgICAgICAgICAgICAgICBhdmF0YXJfdXJsOiBzaTEudGh1bWJuYWlsLnRodW1ibmFpbHMucG9wKCkudXJsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHZpZGVvczogdmlkZW9zXHJcbiAgICAgICAgfVxyXG4gICAgfSBjYXRjaChlKSB7XHJcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0NvdWxkIG5vdCBwYXJzZSBwbGF5bGlzdCBtZXRhZGF0YTogJyArIChlIGFzIEVycm9yKT8ubWVzc2FnZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhcnNlVmlkZW9zRnJvbUpzb24odmlkZW9EYXRhQXJyYXk6IGFueVtdKSA6IFlUdmlkZW9bXSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGxldCB2aWRlb3M6IFlUdmlkZW9bXSA9IFtdO1xyXG4gICAgICAgIGZvcihsZXQgdiBvZiB2aWRlb0RhdGFBcnJheS5tYXAodiA9PiB2LnBsYXlsaXN0VmlkZW9SZW5kZXJlcikpXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB2aWRlb3MucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHYudGl0bGUucnVuc1swXS50ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIHVybDogYmFzZVVSTCArICcvd2F0Y2g/dj0nICsgdi52aWRlb0lkLFxyXG4gICAgICAgICAgICAgICAgICAgIGlkOiB2LnZpZGVvSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiB2Lmxlbmd0aFRleHQuc2ltcGxlVGV4dCxcclxuICAgICAgICAgICAgICAgICAgICBtaWxpc19sZW5ndGg6ICt2Lmxlbmd0aFNlY29uZHMgKiAxMDAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbF91cmw6ICdodHRwczovL2kueXRpbWcuY29tL3ZpLycgKyB2LnZpZGVvSWQgKyAnL2hxZGVmYXVsdC5qcGcnLFxyXG4gICAgICAgICAgICAgICAgICAgIGF1dGhvcjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB2LnNob3J0QnlsaW5lVGV4dC5ydW5zWzBdLnRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogYmFzZVVSTCArIHYuc2hvcnRCeWxpbmVUZXh0LnJ1bnNbMF0ubmF2aWdhdGlvbkVuZHBvaW50LmNvbW1hbmRNZXRhZGF0YS53ZWJDb21tYW5kTWV0YWRhdGEudXJsXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9ICAgKTtcclxuICAgICAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2aWRlb3M7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgICB0aHJvdyBFcnJvcignQ291bGQgbm90IHBhcnNlIHZpZGVvcyBmcm9tIHZpZGVvRGF0YSBKU09OJyk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGdldEFsbFZpZGVvcyhhamF4X3VybDogc3RyaW5nLCB2aWRlb3M6IFlUdmlkZW9bXSA9IFtdKSA6IFByb21pc2U8WVR2aWRlb1tdPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGxldCB5dEFwcGVuZERhdGEgPSAoYXdhaXQgYXgucG9zdChiYXNlVVJMICsgJy95b3V0dWJlaS92MS9icm93c2U/a2V5PScgKyBpQVBJa2V5LCB7XCJjb250ZXh0XCI6e1wiY2xpZW50XCI6e1wiY2xpZW50TmFtZVwiOlwiV0VCXCIsXCJjbGllbnRWZXJzaW9uXCI6XCIyLjIwMjEwNDAxLjA4LjAwXCJ9fSxcImNvbnRpbnVhdGlvblwiOmFqYXhfdXJsfSwgcnFPcHRzKSkuZGF0YTtcclxuICAgICAgICBsZXQgY29udFRva2VuOiBhbnkgPSB5dEFwcGVuZERhdGEub25SZXNwb25zZVJlY2VpdmVkQWN0aW9ucz8uWzBdPy5hcHBlbmRDb250aW51YXRpb25JdGVtc0FjdGlvbj8uY29udGludWF0aW9uSXRlbXM/LnNsaWNlKC0xKT8uWzBdPy5jb250aW51YXRpb25JdGVtUmVuZGVyZXI/LmNvbnRpbnVhdGlvbkVuZHBvaW50Py5jb250aW51YXRpb25Db21tYW5kPy50b2tlbjtcclxuICAgICAgICB2aWRlb3MucHVzaCguLi5wYXJzZVZpZGVvc0Zyb21Kc29uKHl0QXBwZW5kRGF0YS5vblJlc3BvbnNlUmVjZWl2ZWRBY3Rpb25zWzBdLmFwcGVuZENvbnRpbnVhdGlvbkl0ZW1zQWN0aW9uLmNvbnRpbnVhdGlvbkl0ZW1zKSk7XHJcbiAgICAgICAgcmV0dXJuIGNvbnRUb2tlbiA/IGF3YWl0IGdldEFsbFZpZGVvcyhjb250VG9rZW4sIHZpZGVvcykgOiB2aWRlb3M7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgICB0aHJvdyBFcnJvcignQW4gZXJyb3IgaGFzIG9jY3VyZWQgd2hpbGUgdHJ5aW5nIHRvIGZldGNoIG1vcmUgdmlkZW9zJyk7XHJcbiAgICB9XHJcbn1cclxuIl19
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLGtEQUErQztBQUsvQyxNQUFNLE1BQU0sR0FBdUI7SUFDL0IsT0FBTyxFQUFFO1FBQ0wsWUFBWSxFQUFFLGFBQWE7UUFDM0IsdUJBQXVCLEVBQUUsQ0FBQztRQUMxQiwwQkFBMEIsRUFBRSxrQkFBa0I7S0FDakQ7Q0FDSixDQUFBO0FBRUQsTUFBTSxPQUFPLEdBQUcseUJBQXlCLENBQUM7QUFDMUMsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBRWpCOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsaUJBQWlCLENBQUMsR0FBVyxFQUFFLE9BQXFCLEVBQUU7O0lBQ2pFLElBQUcsT0FBTyxJQUFJLENBQUMsS0FBSyxJQUFJLFdBQVcsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssSUFBSSxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUN6RyxNQUFNLEtBQUssQ0FBQyx5RkFBeUYsQ0FBQyxDQUFDO0lBRTNHLElBQUksQ0FBQyxLQUFLLFNBQUcsSUFBSSxDQUFDLEtBQUssbUNBQUksUUFBUSxDQUFDO0lBQ3BDLElBQUksSUFBSSxHQUFHLHlDQUF5QyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvRCxJQUFHLENBQUMsSUFBSTtRQUNKLE1BQU0sS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDOUMsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQyxJQUFJLE1BQU0sR0FBYyxFQUFFLENBQUM7SUFDM0IsSUFBSSxhQUFrQixDQUFDO0lBRXZCLElBQUk7UUFDQSxJQUFJLElBQUksR0FBRyxDQUFDLE1BQU0sZUFBRSxDQUFDLEdBQUcsQ0FBQyxvQ0FBb0MsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFjLENBQUM7UUFDL0csT0FBTyxHQUFHLE1BQUEsNkJBQTZCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQywwQ0FBRyxDQUFDLENBQVcsQ0FBQztRQUNsRSxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFBLCtEQUErRCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsMENBQUcsQ0FBQyxNQUFLLElBQUksQ0FBQyxDQUFDO0tBQ3ZIO0lBQUMsV0FBTTtRQUNKLE1BQU0sS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7S0FDakQ7SUFFRCxJQUFHLENBQUMsT0FBTztRQUNQLE1BQU0sS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7SUFDdEQsVUFBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsMENBQUUsUUFBUSxDQUFDLE9BQU87UUFDckQsTUFBTSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztJQUN0RCxJQUFHLDBFQUFDLGFBQWEsYUFBYixhQUFhLHVCQUFiLGFBQWEsQ0FBRSxRQUFRLDBDQUFFLDhCQUE4QiwwQ0FBRSxJQUFJLDBDQUFHLENBQUMsMkNBQUcsV0FBVywwQ0FBRSxPQUFPLDBDQUFFLG1CQUFtQiwwQ0FBRSxRQUFRLDBDQUFHLENBQUMsMkNBQUcsbUJBQW1CLDBDQUFFLFFBQVEsMENBQUcsQ0FBQywyQ0FBRyx5QkFBeUIsQ0FBQTtRQUMzTCxNQUFNLEtBQUssQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDO0lBQ3JGLElBQUksUUFBUSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQztJQUMzTCxJQUFJLENBQUMsR0FBRyxhQUFhLENBQUM7SUFFdEIsSUFBSSxTQUFTLEdBQVcscUNBQUEsUUFBUSxhQUFSLFFBQVEsdUJBQVIsUUFBUSxDQUFFLFFBQVEsMENBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQywyQ0FBSSxDQUFDLDJDQUFHLHdCQUF3QiwwQ0FBRSxvQkFBb0IsMENBQUUsbUJBQW1CLDBDQUFFLEtBQUssS0FBSSxFQUFFLENBQUM7SUFDN0ksSUFBRyxRQUFRLENBQUMsUUFBUTtRQUNoQixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsbUJBQW1CLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLElBQUcsU0FBUyxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQztRQUMxQixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLFlBQVksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTFELElBQUk7UUFDQSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLHVCQUF1QixDQUFDO1FBQy9DLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtDQUFrQyxDQUFDO1FBQ3hGLElBQUksR0FBRyxTQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQywwQ0FBRSxvQ0FBb0MsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUM7UUFDekgsT0FBTztZQUNILEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSztZQUNmLEdBQUcsRUFBRSxPQUFPLEdBQUcsaUJBQWlCLEdBQUcsUUFBUSxDQUFDLFVBQVU7WUFDdEQsRUFBRSxFQUFFLFFBQVEsQ0FBQyxVQUFVO1lBQ3ZCLFdBQVcsRUFBRSxjQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQywwQ0FBRSxJQUFJLDBDQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFDO1lBQ2hFLFVBQVUsRUFBRSxjQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLDBDQUFFLFVBQVUsMENBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUMsSUFBSSxDQUFDO1lBQ2xFLFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVztZQUMzQixVQUFVLEVBQUUsRUFBRSxDQUFDLFFBQVE7WUFDdkIsT0FBTyxFQUFFLFdBQVcsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLHdCQUF3QjtZQUMzRCxhQUFhLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUM7WUFDL0UsTUFBTSxFQUFFLEdBQUcsSUFBSTtnQkFDWCxJQUFJLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtnQkFDNUIsR0FBRyxFQUFFLE9BQU8sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsR0FBRztnQkFDMUYsVUFBVSxFQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUc7YUFDakQ7WUFDRCxNQUFNLEVBQUUsTUFBTTtTQUNqQixDQUFBO0tBQ0o7SUFBQyxPQUFNLENBQUMsRUFBRTtRQUNQLE1BQU0sS0FBSyxDQUFDLHFDQUFxQyxVQUFJLENBQVcsMENBQUUsT0FBTyxDQUFBLENBQUMsQ0FBQztLQUM5RTtBQUNMLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLGNBQXFCLEVBQUUsSUFBa0I7SUFDbEUsSUFBSTtRQUNBLElBQUksTUFBTSxHQUFjLEVBQUUsQ0FBQztRQUMzQixLQUFJLE1BQU0sR0FBRyxJQUFJLGNBQWM7WUFDM0IsSUFBSTtnQkFDQSxJQUFHLElBQUksQ0FBQyxLQUFNLElBQUksQ0FBQztvQkFDZixNQUFNO2dCQUNWLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQztnQkFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDUixLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtvQkFDM0IsR0FBRyxFQUFFLE9BQU8sR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDLE9BQU87b0JBQ3RDLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTztvQkFDYixNQUFNLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVO29CQUMvQixZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxHQUFHLElBQUk7b0JBQ3JDLGFBQWEsRUFBRSx5QkFBeUIsR0FBRyxDQUFDLENBQUMsT0FBTyxHQUFHLGdCQUFnQjtvQkFDdkUsTUFBTSxFQUFFO3dCQUNKLElBQUksRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO3dCQUNwQyxHQUFHLEVBQUUsT0FBTyxHQUFHLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHO3FCQUNyRztpQkFDSixDQUFDLENBQUM7Z0JBQ0gsRUFBRSxJQUFJLENBQUMsS0FBTSxDQUFDO2FBQ2pCO1lBQUMsV0FBTTtnQkFDSixTQUFTO2FBQ1o7UUFDTCxPQUFPLE1BQU0sQ0FBQztLQUNqQjtJQUFDLFdBQU07UUFDSixNQUFNLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO0tBQzdEO0FBQ0wsQ0FBQztBQUVELEtBQUssVUFBVSxZQUFZLENBQUMsUUFBZ0IsRUFBRSxJQUFrQixFQUFFLFNBQW9CLEVBQUU7O0lBQ3BGLElBQUk7UUFDQSxJQUFJLFlBQVksR0FBRyxDQUFDLE1BQU0sZUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsMEJBQTBCLEdBQUcsT0FBTyxFQUFFLEVBQUMsU0FBUyxFQUFDLEVBQUMsUUFBUSxFQUFDLEVBQUMsWUFBWSxFQUFDLEtBQUssRUFBQyxlQUFlLEVBQUMsa0JBQWtCLEVBQUMsRUFBQyxFQUFDLGNBQWMsRUFBQyxRQUFRLEVBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN4TSxJQUFJLFNBQVMseURBQVEsWUFBWSxDQUFDLHlCQUF5QiwwQ0FBRyxDQUFDLDJDQUFHLDZCQUE2QiwwQ0FBRSxpQkFBaUIsMENBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQywyQ0FBSSxDQUFDLDJDQUFHLHdCQUF3QiwwQ0FBRSxvQkFBb0IsMENBQUUsbUJBQW1CLDBDQUFFLEtBQUssQ0FBQztRQUMvTSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsbUJBQW1CLENBQUMsWUFBWSxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDckksT0FBTyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsS0FBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLFlBQVksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7S0FDaEc7SUFBQyxXQUFNO1FBQ0osTUFBTSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztLQUN6RTtBQUNMLENBQUM7QUF0SEQsaUJBQVMsaUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXgsIHsgQXhpb3NSZXF1ZXN0Q29uZmlnIH0gZnJvbSAnYXhpb3MnO1xyXG5pbXBvcnQgeyBZVEZQU09wdGlvbnMsIFlUUGxheWxpc3QsIFlUdmlkZW8gfSBmcm9tICcuL2ludGVyZmFjZXMnO1xyXG5cclxuZXhwb3J0ID0gZmV0Y2hGcm9tUGxheWxpc3Q7XHJcblxyXG5jb25zdCBycU9wdHM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAnVXNlci1BZ2VudCc6ICdoZWxsb2JpY3plcycsXHJcbiAgICAgICAgJ3gteW91dHViZS1jbGllbnQtbmFtZSc6IDEsXHJcbiAgICAgICAgJ3gteW91dHViZS1jbGllbnQtdmVyc2lvbic6ICcyLjIwMjAwNzMxLjAyLjAxJ1xyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBiYXNlVVJMID0gJ2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tJztcclxubGV0IGlBUElrZXkgPSAnJztcclxuXHJcbi8qKlxyXG4gKiBTY3JhcHMgeW91dHViZSBwbGF5bGlzdCBtZXRhZGF0YSBhbmQgYWxsIGl0cyB2aWRlb3NcclxuICogQHBhcmFtIHVybCBVUkwgb3IgSUQgb2YgdGhlIHBsYXlsaXN0IHlvdSB3YW50IHRvIHNjcmFwXHJcbiAqIEBwYXJhbSBvcHRzIGFuIG9wdGlvbmFsIFlURlBTT3B0aW9ucyBvYmplY3RcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIGZldGNoRnJvbVBsYXlsaXN0KHVybDogc3RyaW5nLCBvcHRzOiBZVEZQU09wdGlvbnMgPSB7fSkgOiBQcm9taXNlPFlUUGxheWxpc3Q+IHtcclxuICAgIGlmKHR5cGVvZiBvcHRzLmxpbWl0ICE9ICd1bmRlZmluZWQnICYmICh0eXBlb2Ygb3B0cy5saW1pdCAhPSAnbnVtYmVyJyB8fCBpc05hTihvcHRzLmxpbWl0KSB8fCBvcHRzLmxpbWl0IDwgMCkpXHJcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJDb3VsZCBub3QgcGFyc2UgdGhlIGxpbWl0IG9wdGlvbi4gTWFrZSBzdXJlIGl0J3MgYW4gaW50ZWdlciA+IDAsIEluZmluaXR5IG9yIHVuZGVmaW5lZC5cIik7XHJcblxyXG4gICAgb3B0cy5saW1pdCA9IG9wdHMubGltaXQgPz8gSW5maW5pdHk7XHJcbiAgICBsZXQgdGVzdCA9IC9bPyZdbGlzdD0oW14jXFwmXFw/XSspfF4oW2EtekEtWjAtOS1fXSspJC8uZXhlYyh1cmwpO1xyXG4gICAgaWYoIXRlc3QpXHJcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0ludmFsaWQgcGxheWxpc3QgVVJMIG9yIElEJyk7XHJcbiAgICBsZXQgcGxheWxpc3RJRCA9IHRlc3RbMV0gfHwgdGVzdFsyXTtcclxuICAgIGxldCB2aWRlb3M6IFlUdmlkZW9bXSA9IFtdO1xyXG4gICAgbGV0IHl0SW5pdGlhbERhdGE6IGFueTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAgIGxldCBib2R5ID0gKGF3YWl0IGF4LmdldCgnaHR0cHM6Ly95b3V0dWJlLmNvbS9wbGF5bGlzdD9saXN0PScgKyBlbmNvZGVVUkkocGxheWxpc3RJRCksIHJxT3B0cykpLmRhdGEgYXMgc3RyaW5nO1xyXG4gICAgICAgIGlBUElrZXkgPSAvXCJJTk5FUlRVQkVfQVBJX0tFWVwiOlwiKC4qPylcIi8uZXhlYyhib2R5KT8uWzFdIGFzIHN0cmluZztcclxuICAgICAgICB5dEluaXRpYWxEYXRhID0gSlNPTi5wYXJzZSgvKD86d2luZG93XFxbXCJ5dEluaXRpYWxEYXRhXCJcXF0pfCg/Onl0SW5pdGlhbERhdGEpID0uKj8oey4qP30pOy9zLmV4ZWMoYm9keSk/LlsxXSB8fCAne30nKTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIHRocm93IEVycm9yKCdDb3VsZCBub3QgZmV0Y2gvcGFyc2UgcGxheWxpc3QnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZighaUFQSWtleSlcclxuICAgICAgICB0aHJvdyBFcnJvcignQ291bGQgbm90IGV4dHJhY3QgaW50ZXJuYWwgQVBJIGtleScpO1xyXG4gICAgaWYoSlNPTi5zdHJpbmdpZnkoeXRJbml0aWFsRGF0YS5hbGVydHMpPy5pbmNsdWRlcyhcIkVSUk9SXCIpKVxyXG4gICAgICAgIHRocm93IEVycm9yKCdUaGlzIHBsYXlsaXN0IGlzIHByaXZhdGUgb3IgYnJva2VuJyk7XHJcbiAgICBpZigheXRJbml0aWFsRGF0YT8uY29udGVudHM/LnR3b0NvbHVtbkJyb3dzZVJlc3VsdHNSZW5kZXJlcj8udGFicz8uWzBdPy50YWJSZW5kZXJlcj8uY29udGVudD8uc2VjdGlvbkxpc3RSZW5kZXJlcj8uY29udGVudHM/LlswXT8uaXRlbVNlY3Rpb25SZW5kZXJlcj8uY29udGVudHM/LlswXT8ucGxheWxpc3RWaWRlb0xpc3RSZW5kZXJlcilcclxuICAgICAgICB0aHJvdyBFcnJvcignQ2Fubm90IGZpbmQgdmFsaWQgcGxheWxpc3QgSlNPTiBkYXRhLiBJcyB0aGUgcGxheWxpc3QgSUQgY29ycmVjdD8nKTtcclxuICAgIGxldCBsaXN0RGF0YSA9IHl0SW5pdGlhbERhdGEuY29udGVudHMudHdvQ29sdW1uQnJvd3NlUmVzdWx0c1JlbmRlcmVyLnRhYnNbMF0udGFiUmVuZGVyZXIuY29udGVudC5zZWN0aW9uTGlzdFJlbmRlcmVyLmNvbnRlbnRzWzBdLml0ZW1TZWN0aW9uUmVuZGVyZXIuY29udGVudHNbMF0ucGxheWxpc3RWaWRlb0xpc3RSZW5kZXJlcjtcclxuICAgIGxldCBkID0geXRJbml0aWFsRGF0YTtcclxuXHJcbiAgICBsZXQgY29udFRva2VuOiBzdHJpbmcgPSBsaXN0RGF0YT8uY29udGVudHM/LnNsaWNlKC0xKT8uWzBdPy5jb250aW51YXRpb25JdGVtUmVuZGVyZXI/LmNvbnRpbnVhdGlvbkVuZHBvaW50Py5jb250aW51YXRpb25Db21tYW5kPy50b2tlbiB8fCAnJztcclxuICAgIGlmKGxpc3REYXRhLmNvbnRlbnRzKVxyXG4gICAgICAgIHZpZGVvcy5wdXNoKC4uLnBhcnNlVmlkZW9zRnJvbUpzb24obGlzdERhdGEuY29udGVudHMsIG9wdHMpKTtcclxuICAgIGlmKGNvbnRUb2tlbiAmJiBvcHRzLmxpbWl0ID4gMClcclxuICAgICAgICB2aWRlb3MucHVzaCguLi4oYXdhaXQgZ2V0QWxsVmlkZW9zKGNvbnRUb2tlbiwgb3B0cykpKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAgIGxldCBtZiA9IGQubWljcm9mb3JtYXQubWljcm9mb3JtYXREYXRhUmVuZGVyZXI7XHJcbiAgICAgICAgbGV0IHNpMCA9IGQuc2lkZWJhci5wbGF5bGlzdFNpZGViYXJSZW5kZXJlci5pdGVtc1swXS5wbGF5bGlzdFNpZGViYXJQcmltYXJ5SW5mb1JlbmRlcmVyO1xyXG4gICAgICAgIGxldCBzaTEgPSBkLnNpZGViYXIucGxheWxpc3RTaWRlYmFyUmVuZGVyZXIuaXRlbXNbMV0/LnBsYXlsaXN0U2lkZWJhclNlY29uZGFyeUluZm9SZW5kZXJlci52aWRlb093bmVyLnZpZGVvT3duZXJSZW5kZXJlcjtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0aXRsZTogbWYudGl0bGUsXHJcbiAgICAgICAgICAgIHVybDogYmFzZVVSTCArICcvcGxheWxpc3Q/bGlzdD0nICsgbGlzdERhdGEucGxheWxpc3RJZCxcclxuICAgICAgICAgICAgaWQ6IGxpc3REYXRhLnBsYXlsaXN0SWQsXHJcbiAgICAgICAgICAgIHZpZGVvX2NvdW50OiArc2kwLnN0YXRzWzBdLnJ1bnNbMF0/LnRleHQ/LnJlcGxhY2UoL1teMC05XS9nLCAnJyksXHJcbiAgICAgICAgICAgIHZpZXdfY291bnQ6ICtzaTAuc3RhdHNbMV0/LnNpbXBsZVRleHQ/LnJlcGxhY2UoL1teMC05XS9nLCAnJykgfHwgMCxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246IG1mLmRlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgICBpc1VubGlzdGVkOiBtZi51bmxpc3RlZCxcclxuICAgICAgICAgICAgaXNBbGJ1bTogJ2FsYnVtTmFtZScgaW4gZC5tZXRhZGF0YS5wbGF5bGlzdE1ldGFkYXRhUmVuZGVyZXIsXHJcbiAgICAgICAgICAgIHRodW1ibmFpbF91cmw6IG1mLnRodW1ibmFpbC50aHVtYm5haWxzLnBvcCgpLnVybC5yZXBsYWNlKC8oPzomdj18JmRheXMpLiovLCAnJyksXHJcbiAgICAgICAgICAgIGF1dGhvcjogc2kxICYmIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IHNpMS50aXRsZS5ydW5zWzBdLnRleHQsXHJcbiAgICAgICAgICAgICAgICB1cmw6IGJhc2VVUkwgKyBzaTEudGl0bGUucnVuc1swXS5uYXZpZ2F0aW9uRW5kcG9pbnQuY29tbWFuZE1ldGFkYXRhLndlYkNvbW1hbmRNZXRhZGF0YS51cmwsXHJcbiAgICAgICAgICAgICAgICBhdmF0YXJfdXJsOiBzaTEudGh1bWJuYWlsLnRodW1ibmFpbHMucG9wKCkudXJsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHZpZGVvczogdmlkZW9zXHJcbiAgICAgICAgfVxyXG4gICAgfSBjYXRjaChlKSB7XHJcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0NvdWxkIG5vdCBwYXJzZSBwbGF5bGlzdCBtZXRhZGF0YTogJyArIChlIGFzIEVycm9yKT8ubWVzc2FnZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhcnNlVmlkZW9zRnJvbUpzb24odmlkZW9EYXRhQXJyYXk6IGFueVtdLCBvcHRzOiBZVEZQU09wdGlvbnMpIDogWVR2aWRlb1tdIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgbGV0IHZpZGVvczogWVR2aWRlb1tdID0gW107XHJcbiAgICAgICAgZm9yKGNvbnN0IHZpZCBvZiB2aWRlb0RhdGFBcnJheSlcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmKG9wdHMubGltaXQhIDw9IDApXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2ID0gdmlkLnBsYXlsaXN0VmlkZW9SZW5kZXJlcjtcclxuICAgICAgICAgICAgICAgIHZpZGVvcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdi50aXRsZS5ydW5zWzBdLnRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBiYXNlVVJMICsgJy93YXRjaD92PScgKyB2LnZpZGVvSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHYudmlkZW9JZCxcclxuICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IHYubGVuZ3RoVGV4dC5zaW1wbGVUZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIG1pbGlzX2xlbmd0aDogK3YubGVuZ3RoU2Vjb25kcyAqIDEwMDAsXHJcbiAgICAgICAgICAgICAgICAgICAgdGh1bWJuYWlsX3VybDogJ2h0dHBzOi8vaS55dGltZy5jb20vdmkvJyArIHYudmlkZW9JZCArICcvaHFkZWZhdWx0LmpwZycsXHJcbiAgICAgICAgICAgICAgICAgICAgYXV0aG9yOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHYuc2hvcnRCeWxpbmVUZXh0LnJ1bnNbMF0udGV4dCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBiYXNlVVJMICsgdi5zaG9ydEJ5bGluZVRleHQucnVuc1swXS5uYXZpZ2F0aW9uRW5kcG9pbnQuY29tbWFuZE1ldGFkYXRhLndlYkNvbW1hbmRNZXRhZGF0YS51cmxcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIC0tb3B0cy5saW1pdCE7XHJcbiAgICAgICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmlkZW9zO1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0NvdWxkIG5vdCBwYXJzZSB2aWRlb3MgZnJvbSB2aWRlb0RhdGEgSlNPTicpO1xyXG4gICAgfVxyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiBnZXRBbGxWaWRlb3MoYWpheF91cmw6IHN0cmluZywgb3B0czogWVRGUFNPcHRpb25zLCB2aWRlb3M6IFlUdmlkZW9bXSA9IFtdKSA6IFByb21pc2U8WVR2aWRlb1tdPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGxldCB5dEFwcGVuZERhdGEgPSAoYXdhaXQgYXgucG9zdChiYXNlVVJMICsgJy95b3V0dWJlaS92MS9icm93c2U/a2V5PScgKyBpQVBJa2V5LCB7XCJjb250ZXh0XCI6e1wiY2xpZW50XCI6e1wiY2xpZW50TmFtZVwiOlwiV0VCXCIsXCJjbGllbnRWZXJzaW9uXCI6XCIyLjIwMjEwNDAxLjA4LjAwXCJ9fSxcImNvbnRpbnVhdGlvblwiOmFqYXhfdXJsfSwgcnFPcHRzKSkuZGF0YTtcclxuICAgICAgICBsZXQgY29udFRva2VuOiBhbnkgPSB5dEFwcGVuZERhdGEub25SZXNwb25zZVJlY2VpdmVkQWN0aW9ucz8uWzBdPy5hcHBlbmRDb250aW51YXRpb25JdGVtc0FjdGlvbj8uY29udGludWF0aW9uSXRlbXM/LnNsaWNlKC0xKT8uWzBdPy5jb250aW51YXRpb25JdGVtUmVuZGVyZXI/LmNvbnRpbnVhdGlvbkVuZHBvaW50Py5jb250aW51YXRpb25Db21tYW5kPy50b2tlbjtcclxuICAgICAgICB2aWRlb3MucHVzaCguLi5wYXJzZVZpZGVvc0Zyb21Kc29uKHl0QXBwZW5kRGF0YS5vblJlc3BvbnNlUmVjZWl2ZWRBY3Rpb25zWzBdLmFwcGVuZENvbnRpbnVhdGlvbkl0ZW1zQWN0aW9uLmNvbnRpbnVhdGlvbkl0ZW1zLCBvcHRzKSk7XHJcbiAgICAgICAgcmV0dXJuIChjb250VG9rZW4gJiYgb3B0cy5saW1pdCEgPiAwKSA/IGF3YWl0IGdldEFsbFZpZGVvcyhjb250VG9rZW4sIG9wdHMsIHZpZGVvcykgOiB2aWRlb3M7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgICB0aHJvdyBFcnJvcignQW4gZXJyb3IgaGFzIG9jY3VyZWQgd2hpbGUgdHJ5aW5nIHRvIGZldGNoIG1vcmUgdmlkZW9zJyk7XHJcbiAgICB9XHJcbn1cclxuIl19

@@ -30,2 +30,5 @@ export interface YTPlaylist {

}
export interface YTFPSOptions {
limit?: number;
}
//# sourceMappingURL=interfaces.d.ts.map
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2xpYi9pbnRlcmZhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIFlUUGxheWxpc3Qge1xyXG4gICAgdGl0bGU6IHN0cmluZ1xyXG4gICAgdXJsOiBzdHJpbmdcclxuICAgIGlkOiBzdHJpbmdcclxuICAgIHZpZGVvX2NvdW50OiBudW1iZXJcclxuICAgIHZpZXdfY291bnQ/OiBudW1iZXJcclxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcclxuICAgIGlzVW5saXN0ZWQ6IGJvb2xlYW5cclxuICAgIGlzQWxidW06IGJvb2xlYW5cclxuICAgIHRodW1ibmFpbF91cmw6IHN0cmluZ1xyXG4gICAgYXV0aG9yPzogeyAvL2FsYnVtIHBsYXlsaXN0cyBjb250YWluIG5vIGF1dGhvciBpbmZvcm1hdGlvbj9cclxuICAgICAgICBuYW1lOiBzdHJpbmdcclxuICAgICAgICB1cmw6IHN0cmluZ1xyXG4gICAgICAgIGF2YXRhcl91cmw6IHN0cmluZ1xyXG4gICAgfVxyXG4gICAgdmlkZW9zOiBZVHZpZGVvW11cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBZVHZpZGVvIHtcclxuICAgIHRpdGxlOiBzdHJpbmdcclxuICAgIHVybDogc3RyaW5nXHJcbiAgICBpZDogc3RyaW5nXHJcbiAgICBsZW5ndGg6IHN0cmluZ1xyXG4gICAgbWlsaXNfbGVuZ3RoOiBudW1iZXJcclxuICAgIHRodW1ibmFpbF91cmw6IHN0cmluZ1xyXG4gICAgYXV0aG9yOiB7XHJcbiAgICAgICAgbmFtZTogc3RyaW5nXHJcbiAgICAgICAgdXJsOiBzdHJpbmdcclxuICAgIH1cclxufVxyXG4iXX0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2xpYi9pbnRlcmZhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIFlUUGxheWxpc3Qge1xyXG4gICAgdGl0bGU6IHN0cmluZ1xyXG4gICAgdXJsOiBzdHJpbmdcclxuICAgIGlkOiBzdHJpbmdcclxuICAgIHZpZGVvX2NvdW50OiBudW1iZXJcclxuICAgIHZpZXdfY291bnQ/OiBudW1iZXJcclxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcclxuICAgIGlzVW5saXN0ZWQ6IGJvb2xlYW5cclxuICAgIGlzQWxidW06IGJvb2xlYW5cclxuICAgIHRodW1ibmFpbF91cmw6IHN0cmluZ1xyXG4gICAgYXV0aG9yPzogeyAvL2FsYnVtIHBsYXlsaXN0cyBjb250YWluIG5vIGF1dGhvciBpbmZvcm1hdGlvbj9cclxuICAgICAgICBuYW1lOiBzdHJpbmdcclxuICAgICAgICB1cmw6IHN0cmluZ1xyXG4gICAgICAgIGF2YXRhcl91cmw6IHN0cmluZ1xyXG4gICAgfVxyXG4gICAgdmlkZW9zOiBZVHZpZGVvW11cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBZVHZpZGVvIHtcclxuICAgIHRpdGxlOiBzdHJpbmdcclxuICAgIHVybDogc3RyaW5nXHJcbiAgICBpZDogc3RyaW5nXHJcbiAgICBsZW5ndGg6IHN0cmluZ1xyXG4gICAgbWlsaXNfbGVuZ3RoOiBudW1iZXJcclxuICAgIHRodW1ibmFpbF91cmw6IHN0cmluZ1xyXG4gICAgYXV0aG9yOiB7XHJcbiAgICAgICAgbmFtZTogc3RyaW5nXHJcbiAgICAgICAgdXJsOiBzdHJpbmdcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBZVEZQU09wdGlvbnMge1xyXG4gICAgbGltaXQ/OiBudW1iZXJcclxufSJdfQ==
{
"name": "ytfps",
"version": "1.0.6",
"version": "1.1.0",
"description": "scraps youtube playlist metadata and all its videos (not limited to 100), does not require API key",

@@ -5,0 +5,0 @@ "keywords": [

@@ -19,8 +19,11 @@ # ytfps

}).catch(err => {
throw err;
handle_error(err);
});
//you can also pass an YTFPSOptions object to limit the amount of videos you want to scrap:
let playlist = await ytfps(playlistId, { limit: 13 });
```
# API
ytfps(id)
ytfps(id, opts?);

@@ -32,2 +35,9 @@ Scraps the supplied playlist and returns a promise with its metadata.

* or youtube playlist's URL
* `opts`
* an optional YTFPSOptions object:
```ts
interface YTFPSOptions {
limit?: number
}
```

@@ -34,0 +44,0 @@ * [Example response](https://github.com/Caier/ytfps/blob/master/example/output.json)

@@ -12,3 +12,3 @@ {

"url": "https://www.youtube.com/user/CairoPl",
"avatar_url": "https://yt3.ggpht.com/ytc/AKedOLSWzNdncoPdCV9F0RVWzjiZJcd58IF0AQqKYw4k=s176-c-k-c0x00ffffff-no-rj"
"avatar_url": "https://yt3.ggpht.com/ytc/AMLnZu_WWtWWhmwG6J6-q2ePGseqlHYSRsCIdDqZMaKs=s176-c-k-c0x00ffffff-no-rj"
},

@@ -15,0 +15,0 @@ "videos": [

@@ -38,2 +38,12 @@ const ytfps = require('../out/index');

});
it("should return 12 results", async () => {
let res = await ytfps(top500Playlist, { limit: 12 });
expect(res.videos.length).to.be.equal(12);
});
it("should return 232 results", async () => {
let res = await ytfps(top500Playlist, { limit: 232 });
expect(res.videos.length).to.be.equal(232);
});
});

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc