From 455c7dfb69a2ffb348d7b11003c8795ae5547b25 Mon Sep 17 00:00:00 2001 From: killer069 <65385476+killer069@users.noreply.github.com> Date: Thu, 12 Aug 2021 15:58:55 +0530 Subject: [PATCH] End soon --- node-youtube-dl/YouTube/classes/Channel.ts | 63 +++ node-youtube-dl/YouTube/classes/Playlist.ts | 119 +++++ node-youtube-dl/YouTube/classes/Thumbnail.ts | 48 ++ node-youtube-dl/YouTube/classes/Video.ts | 29 +- node-youtube-dl/YouTube/search.ts | 11 +- node-youtube-dl/YouTube/utils/parser.ts | 209 +++++++- package-lock.json | 497 +------------------ package.json | 1 - 8 files changed, 471 insertions(+), 506 deletions(-) create mode 100644 node-youtube-dl/YouTube/classes/Channel.ts create mode 100644 node-youtube-dl/YouTube/classes/Thumbnail.ts diff --git a/node-youtube-dl/YouTube/classes/Channel.ts b/node-youtube-dl/YouTube/classes/Channel.ts new file mode 100644 index 0000000..c0fa6bc --- /dev/null +++ b/node-youtube-dl/YouTube/classes/Channel.ts @@ -0,0 +1,63 @@ +export interface ChannelIconInterface { + url?: string; + width: number; + height: number; +} + +export class Channel { + name?: string; + verified!: boolean; + id?: string; + url?: string; + icon!: ChannelIconInterface; + subscribers?: string; + + constructor(data: any) { + if (!data) throw new Error(`Cannot instantiate the ${this.constructor.name} class without data!`); + + this._patch(data); + } + + private _patch(data: any): void { + if (!data) data = {}; + + this.name = data.name || null; + this.verified = !!data.verified || false; + this.id = data.id || null; + this.url = data.url || null; + this.icon = data.icon || { url: null, width: 0, height: 0 }; + this.subscribers = data.subscribers || null; + } + + /** + * Returns channel icon url + * @param {object} options Icon options + * @param {number} [options.size=0] Icon size. **Default is 0** + */ + iconURL(options = { size: 0 }): string | undefined{ + if (typeof options.size !== "number" || options.size < 0) throw new Error("invalid icon size"); + if (!this.icon.url) return undefined; + const def = this.icon.url.split("=s")[1].split("-c")[0]; + return this.icon.url.replace(`=s${def}-c`, `=s${options.size}-c`); + } + + get type(): "channel" { + return "channel"; + } + + toString(): string { + return this.name || ""; + } + + toJSON() { + return { + name: this.name, + verified: this.verified, + id: this.id, + url: this.url, + iconURL: this.iconURL(), + type: this.type, + subscribers: this.subscribers + }; + } +} \ No newline at end of file diff --git a/node-youtube-dl/YouTube/classes/Playlist.ts b/node-youtube-dl/YouTube/classes/Playlist.ts index e69de29..f321981 100644 --- a/node-youtube-dl/YouTube/classes/Playlist.ts +++ b/node-youtube-dl/YouTube/classes/Playlist.ts @@ -0,0 +1,119 @@ +import { getContinuationToken, getPlaylistVideos } from "../utils/parser"; +import { url_get } from "../utils/request"; +import { Thumbnail } from "./Thumbnail"; +import { Channel } from "./Channel"; +import { Video } from "./Video"; +const BASE_API = "https://www.youtube.com/youtubei/v1/browse?key="; + +export class PlayList{ + id?: string; + title?: string; + videoCount!: number; + lastUpdate?: string; + views?: number; + url?: string; + link?: string; + channel?: Channel; + thumbnail?: Thumbnail; + videos!: []; + private _continuation: { api?: string; token?: string; clientVersion?: string } = {}; + + constructor(data : any, searchResult : Boolean = false){ + if (!data) throw new Error(`Cannot instantiate the ${this.constructor.name} class without data!`); + + if(searchResult) this.__patchSearch(data) + else this.__patch(data) + } + + private __patch(data:any){ + this.id = data.id || undefined; + this.title = data.title || undefined; + this.videoCount = data.videoCount || 0; + this.lastUpdate = data.lastUpdate || undefined; + this.views = data.views || 0; + this.url = data.url || undefined; + this.link = data.link || undefined; + this.channel = data.author || undefined; + this.thumbnail = data.thumbnail || undefined; + this.videos = data.videos || []; + this._continuation.api = data.continuation?.api ?? undefined; + this._continuation.token = data.continuation?.token ?? undefined; + this._continuation.clientVersion = data.continuation?.clientVersion ?? ""; + } + + private __patchSearch(data: any){ + this.id = data.id || undefined; + this.title = data.title || undefined; + this.thumbnail = data.thumbnail || undefined; + this.channel = data.channel || undefined; + this.videos = []; + this.videoCount = data.videos || 0; + this.url = this.id ? `https://www.youtube.com/playlist?list=${this.id}` : undefined; + this.link = undefined; + this.lastUpdate = undefined; + this.views = 0; + } + + async next(limit: number = Infinity): Promise { + if (!this._continuation || !this._continuation.token) return []; + + let nextPage = await url_get(`${BASE_API}${this._continuation.api}`, { + method: "POST", + body: JSON.stringify({ + continuation: this._continuation.token, + context: { + client: { + utcOffsetMinutes: 0, + gl: "US", + hl: "en", + clientName: "WEB", + clientVersion: this._continuation.clientVersion + }, + user: {}, + request: {} + } + }) + }); + + let contents = JSON.parse(nextPage)?.onResponseReceivedActions[0]?.appendContinuationItemsAction?.continuationItems + if(!contents) return [] + + let playlist_videos = getPlaylistVideos(contents, limit) + this._continuation.token = getContinuationToken(contents) + + return playlist_videos + } + + async fetch(max: number = Infinity) { + let continuation = this._continuation.token; + if (!continuation) return this; + if (max < 1) max = Infinity; + + while (typeof this._continuation.token === "string" && this._continuation.token.length) { + if (this.videos.length >= max) break; + const res = await this.next(); + if (!res.length) break; + } + + return this; + } + + get type(): "playlist" { + return "playlist"; + } + + toJSON() { + return { + id: this.id, + title: this.title, + thumbnail: this.thumbnail, + channel: { + name : this.channel?.name, + id : this.channel?.id, + icon : this.channel?.iconURL() + }, + url: this.url, + videos: this.videos + }; + } +} \ No newline at end of file diff --git a/node-youtube-dl/YouTube/classes/Thumbnail.ts b/node-youtube-dl/YouTube/classes/Thumbnail.ts new file mode 100644 index 0000000..2bead19 --- /dev/null +++ b/node-youtube-dl/YouTube/classes/Thumbnail.ts @@ -0,0 +1,48 @@ +type ThumbnailType = "default" | "hqdefault" | "mqdefault" | "sddefault" | "maxresdefault" | "ultrares"; + +export class Thumbnail { + id?: string; + width!: number; + height!: number; + url?: string; + + constructor(data: any) { + if (!data) throw new Error(`Cannot instantiate the ${this.constructor.name} class without data!`); + + this._patch(data); + } + + private _patch(data: any) { + if (!data) data = {}; + + this.id = data.id || undefined; + this.width = data.width || 0; + this.height = data.height || 0; + this.url = data.url || undefined; + } + + displayThumbnailURL(thumbnailType: ThumbnailType = "maxresdefault"): string { + if (!["default", "hqdefault", "mqdefault", "sddefault", "maxresdefault", "ultrares"].includes(thumbnailType)) throw new Error(`Invalid thumbnail type "${thumbnailType}"!`); + if (thumbnailType === "ultrares") return this.url as string; + return `https://i3.ytimg.com/vi/${this.id}/${thumbnailType}.jpg`; + } + + defaultThumbnailURL(id: "0" | "1" | "2" | "3" | "4"): string { + if (!id) id = "0"; + if (!["0", "1", "2", "3", "4"].includes(id)) throw new Error(`Invalid thumbnail id "${id}"!`); + return `https://i3.ytimg.com/vi/${this.id}/${id}.jpg`; + } + + toString(): string { + return this.url ? `${this.url}` : ""; + } + + toJSON() { + return { + id: this.id, + width: this.width, + height: this.height, + url: this.url + }; + } +} diff --git a/node-youtube-dl/YouTube/classes/Video.ts b/node-youtube-dl/YouTube/classes/Video.ts index 8b6a944..2295683 100644 --- a/node-youtube-dl/YouTube/classes/Video.ts +++ b/node-youtube-dl/YouTube/classes/Video.ts @@ -1,3 +1,6 @@ +import { Channel } from "./Channel"; +import { Thumbnail } from "./Thumbnail"; + interface VideoOptions { id?: string; url? : string; @@ -7,8 +10,17 @@ interface VideoOptions { duration: number; uploadedAt?: string; views: number; - thumbnail?: JSON; - channel?: JSON; + thumbnail?: { + id: string | undefined; + width: number; + height: number; + url: string | undefined; + }; + channel?: { + name : string, + id : string, + icon : string + }; videos?: Video[]; type : string; ratings : { @@ -28,8 +40,8 @@ export class Video { duration: number; uploadedAt?: string; views: number; - thumbnail?: JSON; - channel?: JSON; + thumbnail?: Thumbnail; + channel?: Channel; videos?: Video[]; likes: number; dislikes: number; @@ -39,6 +51,7 @@ export class Video { constructor(data : any){ if(!data) throw new Error(`Can not initiate ${this.constructor.name} without data`) + this.id = data.id || undefined; this.title = data.title || undefined; this.description = data.description || undefined; @@ -77,8 +90,12 @@ export class Video { duration: this.duration, duration_formatted: this.durationFormatted, uploadedAt: this.uploadedAt, - thumbnail: this.thumbnail, - channel: this.channel, + thumbnail: this.thumbnail?.toJSON(), + channel: { + name: this.channel?.name as string, + id: this.channel?.id as string, + icon: this.channel?.iconURL() as string + }, views: this.views, type: this.type, tags: this.tags, diff --git a/node-youtube-dl/YouTube/search.ts b/node-youtube-dl/YouTube/search.ts index 8aed895..76d7c7f 100644 --- a/node-youtube-dl/YouTube/search.ts +++ b/node-youtube-dl/YouTube/search.ts @@ -1,10 +1,13 @@ import { url_get } from "./utils/request"; import fs from 'fs' +import { ParseSearchInterface, ParseSearchResult } from "./utils/parser"; +import { Video } from "./classes/Video"; +import { Channel } from "./classes/Channel"; +import { PlayList } from "./classes/Playlist"; -export async function search(url:string, options? : {limit : number}) { +export async function search(url:string, options? : ParseSearchInterface): Promise<(Video | Channel | PlayList)[]> { let body = await url_get(url) - let json_convert = body.split("var ytInitialData = ")[1].split(";")[0] - let result = JSON.parse(json_convert).contents.twoColumnSearchResultsRenderer.primaryContents.sectionListRenderer.contents[0].itemSectionRenderer.contents - console.log(result.length) + let data = ParseSearchResult(body) + return data } \ No newline at end of file diff --git a/node-youtube-dl/YouTube/utils/parser.ts b/node-youtube-dl/YouTube/utils/parser.ts index 13ddda5..5fc1dbf 100644 --- a/node-youtube-dl/YouTube/utils/parser.ts +++ b/node-youtube-dl/YouTube/utils/parser.ts @@ -1,6 +1,211 @@ import { Video } from "../classes/Video"; +import { PlayList } from "../classes/Playlist"; +import { Channel } from "../classes/Channel"; +import { RequestInit } from "node-fetch"; +export interface ParseSearchInterface { + type?: "video" | "playlist" | "channel" | "all"; + limit?: number; + requestOptions?: RequestInit; +} -export function ParseSearchResult(html:string) { - +export function ParseSearchResult(html :string, options? : ParseSearchInterface): (Video | PlayList | Channel)[] { + if(!html) throw new Error('Can\'t parse Search result without data') + if (!options) options = { type: "video", limit: 0 }; + if (!options.type) options.type = "video"; + + let results = [] + let details = [] + let fetched = false; + + try { + let data = html.split("ytInitialData = JSON.parse('")[1].split("');")[0]; + html = data.replace(/\\x([0-9A-F]{2})/gi, (...items) => { + return String.fromCharCode(parseInt(items[1], 16)); + }); + } catch { + /* do nothing */ + } + + try { + details = JSON.parse(html.split('{"itemSectionRenderer":{"contents":')[html.split('{"itemSectionRenderer":{"contents":').length - 1].split(',"continuations":[{')[0]); + fetched = true; + } catch { + /* do nothing */ + } + + if (!fetched) { + try { + details = JSON.parse(html.split('{"itemSectionRenderer":')[html.split('{"itemSectionRenderer":').length - 1].split('},{"continuationItemRenderer":{')[0]).contents; + fetched = true; + } catch { + /* do nothing */ + } + } + + if (!fetched) throw new Error('Failed to Fetch the data') + + for (let i = 0; i < details.length; i++) { + if (typeof options.limit === "number" && options.limit > 0 && results.length >= options.limit) break; + let data = details[i]; + let res; + if (options.type === "all") { + if (!!data.videoRenderer) options.type = "video"; + else if (!!data.channelRenderer) options.type = "channel"; + else if (!!data.playlistRenderer) options.type = "playlist"; + else continue; + } + + if (options.type === "video") { + const parsed = parseVideo(data); + if (!parsed) continue; + res = parsed; + } else if (options.type === "channel") { + const parsed = parseChannel(data); + if (!parsed) continue; + res = parsed; + } else if (options.type === "playlist") { + const parsed = parsePlaylist(data); + if (!parsed) continue; + res = parsed; + } + + results.push(res); + } + +return results as (Video | Channel | PlayList)[]; +} + +export function getPlaylistVideos(data:any, limit : number = Infinity) : Video[] { + const videos = []; + + for (let i = 0; i < data.length; i++) { + if (limit === videos.length) break; + const info = data[i].playlistVideoRenderer; + if (!info || !info.shortBylineText) continue; + + videos.push( + new Video({ + id: info.videoId, + index: parseInt(info.index?.simpleText) || 0, + duration: parseDuration(info.lengthText?.simpleText) || 0, + duration_raw: info.lengthText?.simpleText ?? "0:00", + thumbnail: { + id: info.videoId, + url: info.thumbnail.thumbnails[info.thumbnail.thumbnails.length - 1].url, + height: info.thumbnail.thumbnails[info.thumbnail.thumbnails.length - 1].height, + width: info.thumbnail.thumbnails[info.thumbnail.thumbnails.length - 1].width + }, + title: info.title.runs[0].text, + channel: { + id: info.shortBylineText.runs[0].navigationEndpoint.browseEndpoint.browseId || undefined, + name: info.shortBylineText.runs[0].text || undefined, + url: `https://www.youtube.com${info.shortBylineText.runs[0].navigationEndpoint.browseEndpoint.canonicalBaseUrl || info.shortBylineText.runs[0].navigationEndpoint.commandMetadata.webCommandMetadata.url}`, + icon: undefined + } + }) + ); + } + return videos +} + +export function parseDuration(duration: string): number { + duration ??= "0:00"; + const args = duration.split(":"); + let dur = 0; + + switch (args.length) { + case 3: + dur = parseInt(args[0]) * 60 * 60 + parseInt(args[1]) * 60 + parseInt(args[2]); + break; + case 2: + dur = parseInt(args[0]) * 60 + parseInt(args[1]); + break; + default: + dur = parseInt(args[0]); + } + + return dur; +} + +export function getContinuationToken(data:any): string { + const continuationToken = data.find((x: any) => Object.keys(x)[0] === "continuationItemRenderer")?.continuationItemRenderer.continuationEndpoint?.continuationCommand?.token; + return continuationToken; +} + +export function parseChannel(data?: any): Channel | void { + if (!data || !data.channelRenderer) return; + const badge = data.channelRenderer.ownerBadges && data.channelRenderer.ownerBadges[0]; + let url = `https://www.youtube.com${data.channelRenderer.navigationEndpoint.browseEndpoint.canonicalBaseUrl || data.channelRenderer.navigationEndpoint.commandMetadata.webCommandMetadata.url}`; + let res = new Channel({ + id: data.channelRenderer.channelId, + name: data.channelRenderer.title.simpleText, + icon: data.channelRenderer.thumbnail.thumbnails[data.channelRenderer.thumbnail.thumbnails.length - 1], + url: url, + verified: Boolean(badge?.metadataBadgeRenderer?.style?.toLowerCase().includes("verified")), + subscribers: data.channelRenderer.subscriberCountText.simpleText + }); + + return res; +} + +export function parseVideo(data?: any): Video | void { + if (!data || !data.videoRenderer) return; + + const badge = data.videoRenderer.ownerBadges && data.videoRenderer.ownerBadges[0]; + let res = new Video({ + id: data.videoRenderer.videoId, + url: `https://www.youtube.com/watch?v=${data.videoRenderer.videoId}`, + title: data.videoRenderer.title.runs[0].text, + description: data.videoRenderer.descriptionSnippet && data.videoRenderer.descriptionSnippet.runs[0] ? data.videoRenderer.descriptionSnippet.runs[0].text : "", + duration: data.videoRenderer.lengthText ? parseDuration(data.videoRenderer.lengthText.simpleText) : 0, + duration_raw: data.videoRenderer.lengthText ? data.videoRenderer.lengthText.simpleText : null, + thumbnail: { + id: data.videoRenderer.videoId, + url: data.videoRenderer.thumbnail.thumbnails[data.videoRenderer.thumbnail.thumbnails.length - 1].url, + height: data.videoRenderer.thumbnail.thumbnails[data.videoRenderer.thumbnail.thumbnails.length - 1].height, + width: data.videoRenderer.thumbnail.thumbnails[data.videoRenderer.thumbnail.thumbnails.length - 1].width + }, + channel: { + id: data.videoRenderer.ownerText.runs[0].navigationEndpoint.browseEndpoint.browseId || null, + name: data.videoRenderer.ownerText.runs[0].text || null, + url: `https://www.youtube.com${data.videoRenderer.ownerText.runs[0].navigationEndpoint.browseEndpoint.canonicalBaseUrl || data.videoRenderer.ownerText.runs[0].navigationEndpoint.commandMetadata.webCommandMetadata.url}`, + icon: { + url: data.videoRenderer.channelThumbnailSupportedRenderers.channelThumbnailWithLinkRenderer.thumbnail.thumbnails[0].url, + width: data.videoRenderer.channelThumbnailSupportedRenderers.channelThumbnailWithLinkRenderer.thumbnail.thumbnails[0].width, + height: data.videoRenderer.channelThumbnailSupportedRenderers.channelThumbnailWithLinkRenderer.thumbnail.thumbnails[0].height + }, + verified: Boolean(badge?.metadataBadgeRenderer?.style?.toLowerCase().includes("verified")) + }, + uploadedAt: data.videoRenderer.publishedTimeText?.simpleText ?? null, + views: data.videoRenderer.viewCountText?.simpleText?.replace(/[^0-9]/g, "") ?? 0 + }); + + return res; +} + +export function parsePlaylist(data?: any): PlayList | void { + if (!data.playlistRenderer) return; + + const res = new PlayList( + { + id: data.playlistRenderer.playlistId, + title: data.playlistRenderer.title.simpleText, + thumbnail: { + id: data.playlistRenderer.playlistId, + url: data.playlistRenderer.thumbnails[0].thumbnails[data.playlistRenderer.thumbnails[0].thumbnails.length - 1].url, + height: data.playlistRenderer.thumbnails[0].thumbnails[data.playlistRenderer.thumbnails[0].thumbnails.length - 1].height, + width: data.playlistRenderer.thumbnails[0].thumbnails[data.playlistRenderer.thumbnails[0].thumbnails.length - 1].width + }, + channel: { + id: data.playlistRenderer.shortBylineText.runs[0].navigationEndpoint.browseEndpoint.browseId, + name: data.playlistRenderer.shortBylineText.runs[0].text, + url: `https://www.youtube.com${data.playlistRenderer.shortBylineText.runs[0].navigationEndpoint.commandMetadata.webCommandMetadata.url}` + }, + videos: parseInt(data.playlistRenderer.videoCount.replace(/[^0-9]/g, "")) + }, + true + ); + + return res; } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index d2f5cc0..81a5c9b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,63 +9,17 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "got": "^11.8.2", "node-fetch": "^2.6.1" }, "devDependencies": { "@types/node-fetch": "^2.5.12" } }, - "node_modules/@sindresorhus/is": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.0.1.tgz", - "integrity": "sha512-Qm9hBEBu18wt1PO2flE7LPb30BHMQt1eQgbV76YntdNk73XZGpn3izvGTYxbGgzXKgbCjiia0uxTd3aTNQrY/g==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" - }, - "node_modules/@types/keyv": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.2.tgz", - "integrity": "sha512-/FvAK2p4jQOaJ6CGDHJTqZcUtbZe820qIeTg7o0Shg7drB4JHeL+V/dhSaly7NXx6u8eSee+r7coT+yuJEvDLg==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/node": { "version": "16.4.13", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.4.13.tgz", - "integrity": "sha512-bLL69sKtd25w7p1nvg9pigE4gtKVpGTPojBFLMkGHXuUgap2sLqQt2qUnqmVCDfzGUL0DRNZP+1prIZJbMeAXg==" + "integrity": "sha512-bLL69sKtd25w7p1nvg9pigE4gtKVpGTPojBFLMkGHXuUgap2sLqQt2qUnqmVCDfzGUL0DRNZP+1prIZJbMeAXg==", + "dev": true }, "node_modules/@types/node-fetch": { "version": "2.5.12", @@ -77,53 +31,12 @@ "form-data": "^3.0.0" } }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dependencies": { - "mimic-response": "^1.0.0" - } - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -136,39 +49,6 @@ "node": ">= 0.8" } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "engines": { - "node": ">=10" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -178,14 +58,6 @@ "node": ">=0.4.0" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/form-data": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", @@ -200,82 +72,6 @@ "node": ">= 6" } }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/got": { - "version": "11.8.2", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.2.tgz", - "integrity": "sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ==", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.1", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "node_modules/keyv": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz", - "integrity": "sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, "node_modules/mime-db": { "version": "1.49.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", @@ -297,14 +93,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "engines": { - "node": ">=4" - } - }, "node_modules/node-fetch": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", @@ -312,115 +100,14 @@ "engines": { "node": "4.x || >=6.0.0" } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.0.tgz", - "integrity": "sha512-e4FNQs+9cINYMO5NMFc6kOUCdohjqFPSgMuwuZAOUWqrfWsen+Yjy5qZFkV5K7VO7tFSLKcUL97olkED7sCBHA==" - }, - "node_modules/responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", - "dependencies": { - "lowercase-keys": "^2.0.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" } }, "dependencies": { - "@sindresorhus/is": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.0.1.tgz", - "integrity": "sha512-Qm9hBEBu18wt1PO2flE7LPb30BHMQt1eQgbV76YntdNk73XZGpn3izvGTYxbGgzXKgbCjiia0uxTd3aTNQrY/g==" - }, - "@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "requires": { - "defer-to-connect": "^2.0.0" - } - }, - "@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" - }, - "@types/keyv": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.2.tgz", - "integrity": "sha512-/FvAK2p4jQOaJ6CGDHJTqZcUtbZe820qIeTg7o0Shg7drB4JHeL+V/dhSaly7NXx6u8eSee+r7coT+yuJEvDLg==", - "requires": { - "@types/node": "*" - } - }, "@types/node": { "version": "16.4.13", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.4.13.tgz", - "integrity": "sha512-bLL69sKtd25w7p1nvg9pigE4gtKVpGTPojBFLMkGHXuUgap2sLqQt2qUnqmVCDfzGUL0DRNZP+1prIZJbMeAXg==" + "integrity": "sha512-bLL69sKtd25w7p1nvg9pigE4gtKVpGTPojBFLMkGHXuUgap2sLqQt2qUnqmVCDfzGUL0DRNZP+1prIZJbMeAXg==", + "dev": true }, "@types/node-fetch": { "version": "2.5.12", @@ -432,47 +119,12 @@ "form-data": "^3.0.0" } }, - "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "requires": { - "@types/node": "*" - } - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, - "cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" - }, - "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - } - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "requires": { - "mimic-response": "^1.0.0" - } - }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -482,40 +134,12 @@ "delayed-stream": "~1.0.0" } }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "requires": { - "mimic-response": "^3.1.0" - }, - "dependencies": { - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" - } - } - }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, "form-data": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", @@ -527,64 +151,6 @@ "mime-types": "^2.1.12" } }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - }, - "got": { - "version": "11.8.2", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.2.tgz", - "integrity": "sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ==", - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.1", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, - "http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - } - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "keyv": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz", - "integrity": "sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==", - "requires": { - "json-buffer": "3.0.1" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - }, "mime-db": { "version": "1.49.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", @@ -600,65 +166,10 @@ "mime-db": "1.49.0" } }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - }, "node-fetch": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" - }, - "resolve-alpn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.0.tgz", - "integrity": "sha512-e4FNQs+9cINYMO5NMFc6kOUCdohjqFPSgMuwuZAOUWqrfWsen+Yjy5qZFkV5K7VO7tFSLKcUL97olkED7sCBHA==" - }, - "responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", - "requires": { - "lowercase-keys": "^2.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" } } } diff --git a/package.json b/package.json index cd5f8af..27a6b00 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,6 @@ }, "homepage": "https://github.com/killer069/node-youtube-dl#readme", "dependencies": { - "got": "^11.8.2", "node-fetch": "^2.6.1" }, "devDependencies": {