diff --git a/docs/README.md b/docs/README.md index a52bda9..8de1c7f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -178,3 +178,13 @@ let resource = createAudioResource(source.stream, { inputType : source.type }) // This creates resource for playing ``` + +#### cookieHeaders(headersCookie : `string[]`) + +_This is function to update youtube cookies when using external https module._ + +```js +const res = ... // You need to get response. + +play.cookieHeaders(res.headers['set-cookie']) // Updates YouTube Cookies if cookies exists. +``` \ No newline at end of file diff --git a/docs/YouTube/README.md b/docs/YouTube/README.md index 6eb7aed..ebe110e 100644 --- a/docs/YouTube/README.md +++ b/docs/YouTube/README.md @@ -50,6 +50,7 @@ let id = extractID(url) _This are the info options that can be passed as a parameter in `video_info` and `video_basic_info`_ - proxy : Optional parameter to add support of proxies. As of now, HTTPS proxies are only supported. So make sure to get HTTPS proxies only. +- htmldata : `boolean` Set this to true if you are passing a html body as first parameter. ```js const video = await video_basic_info(url, { proxy : ['url'] }) // Accepts a url which has port in it. @@ -59,6 +60,10 @@ const video = await video_basic_info(url, {proxy : [{ port : 8080 }] }) // Or add a json containing hostname and port. + +// Use any https package to use proxy and then do this + +const video = await video_basic_info(body, { htmldata : true }) // You can use video_info function also. ``` ### video_basic_info(url : `string`, options? : [`InfoOptions`](https://github.com/play-dl/play-dl/tree/main/docs/YouTube#infooptions)) diff --git a/package-lock.json b/package-lock.json index bee2f35..ed06e86 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "play-dl", - "version": "1.2.5", + "version": "1.2.6", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "play-dl", - "version": "1.2.5", + "version": "1.2.6", "license": "GPL-3.0", "devDependencies": { "@types/node": "^16.9.4", diff --git a/package.json b/package.json index 5d37ece..fb97d06 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "play-dl", - "version": "1.2.5", + "version": "1.2.6", "description": "YouTube, SoundCloud, Spotify streaming for discord.js bots", "main": "dist/index.js", "typings": "dist/index.d.ts", diff --git a/play-dl/Request/index.ts b/play-dl/Request/index.ts index 11ab034..607977e 100644 --- a/play-dl/Request/index.ts +++ b/play-dl/Request/index.ts @@ -1,7 +1,7 @@ import http, { ClientRequest, IncomingMessage } from 'node:http'; import https, { RequestOptions } from 'node:https'; import { URL } from 'node:url'; -import { getCookies, setCookie, uploadCookie } from '../YouTube/utils/cookie'; +import { cookieHeaders, getCookies } from '../YouTube/utils/cookie'; import { Proxy } from './classes'; export type ProxyOptions = ProxyOpts | string; @@ -63,16 +63,7 @@ export function request(req_url: string, options: RequestOpts = { method: 'GET' return; } if (res.headers && res.headers['set-cookie'] && cookies_added) { - res.headers['set-cookie'].forEach((x) => { - x.split(';').forEach((x) => { - const arr = x.split('='); - if (arr.length <= 1) return; - const key = arr.shift()?.trim() as string; - const value = arr.join('=').trim(); - setCookie(key, value); - }); - }); - uploadCookie(); + cookieHeaders(res.headers['set-cookie']); } if (Number(res.statusCode) >= 300 && Number(res.statusCode) < 400) { res = await https_getter(res.headers.location as string, options); @@ -98,16 +89,7 @@ export function request(req_url: string, options: RequestOpts = { method: 'GET' return; } if (res.headers && (res.headers as any)['set-cookie'] && cookies_added) { - (res.headers as any)['set-cookie'].forEach((x: string) => { - x.split(';').forEach((x) => { - const arr = x.split('='); - if (arr.length <= 1) return; - const key = arr.shift()?.trim() as string; - const value = arr.join('=').trim(); - setCookie(key, value); - }); - }); - uploadCookie(); + cookieHeaders((res.headers as any)['set-cookie']); } if (res.statusCode >= 300 && res.statusCode < 400) { res = await proxy_getter((res.headers as any)['location'], options.proxies, options.headers); diff --git a/play-dl/YouTube/index.ts b/play-dl/YouTube/index.ts index a5b2754..30b8e7d 100644 --- a/play-dl/YouTube/index.ts +++ b/play-dl/YouTube/index.ts @@ -1,3 +1,4 @@ export { stream, stream_from_info, YouTubeStream } from './stream'; export * from './utils'; export { YouTube } from './search'; +export { cookieHeaders } from './utils/cookie'; diff --git a/play-dl/YouTube/stream.ts b/play-dl/YouTube/stream.ts index 05a906a..14d0e2e 100644 --- a/play-dl/YouTube/stream.ts +++ b/play-dl/YouTube/stream.ts @@ -13,6 +13,7 @@ export enum StreamType { export interface StreamOptions { quality?: number; proxy?: Proxy[]; + htmldata?: boolean; } export interface InfoData { @@ -53,7 +54,7 @@ export type YouTubeStream = Stream | LiveStreaming; * @returns Stream class with type and stream for playing. */ export async function stream(url: string, options: StreamOptions = {}): Promise { - const info = await video_info(url, { proxy: options.proxy }); + const info = await video_info(url, { proxy: options.proxy, htmldata: options.htmldata }); const final: any[] = []; if ( info.LiveStreamData.isLive === true && diff --git a/play-dl/YouTube/utils/cookie.ts b/play-dl/YouTube/utils/cookie.ts index e4cf712..45e3447 100644 --- a/play-dl/YouTube/utils/cookie.ts +++ b/play-dl/YouTube/utils/cookie.ts @@ -46,3 +46,17 @@ export function setCookieToken(options: { cookie: string }) { youtubeData = { cookie }; youtubeData.file = false; } + +export function cookieHeaders(headCookie: string[]) { + if (!youtubeData?.cookie) return; + headCookie.forEach((x: string) => { + x.split(';').forEach((x) => { + const arr = x.split('='); + if (arr.length <= 1) return; + const key = arr.shift()?.trim() as string; + const value = arr.join('=').trim(); + setCookie(key, value); + }); + }); + uploadCookie(); +} diff --git a/play-dl/YouTube/utils/extractor.ts b/play-dl/YouTube/utils/extractor.ts index 027e71b..30cdd49 100644 --- a/play-dl/YouTube/utils/extractor.ts +++ b/play-dl/YouTube/utils/extractor.ts @@ -6,6 +6,7 @@ import { InfoData } from '../stream'; interface InfoOptions { proxy?: Proxy[]; + htmldata?: boolean; } interface PlaylistOptions { @@ -79,14 +80,19 @@ export function extractID(url: string): string { * @returns Data containing video_details, LiveStreamData and formats of video url. */ export async function video_basic_info(url: string, options: InfoOptions = {}) { - if (yt_validate(url) !== 'video') throw new Error('This is not a YouTube Watch URL'); - const video_id: string = extractID(url); - const new_url = `https://www.youtube.com/watch?v=${video_id}&has_verified=1`; - const body = await request(new_url, { - proxies: options.proxy ?? [], - headers: { 'accept-language': 'en-US,en-IN;q=0.9,en;q=0.8,hi;q=0.7' }, - cookies: true - }); + let body: string; + if (options.htmldata) { + body = url; + } else { + if (yt_validate(url) !== 'video') throw new Error('This is not a YouTube Watch URL'); + const video_id: string = extractID(url); + const new_url = `https://www.youtube.com/watch?v=${video_id}&has_verified=1`; + body = await request(new_url, { + proxies: options.proxy ?? [], + headers: { 'accept-language': 'en-US,en-IN;q=0.9,en;q=0.8,hi;q=0.7' }, + cookies: true + }); + } const player_data = body .split('var ytInitialPlayerResponse = ')?.[1] ?.split(';')[0] diff --git a/play-dl/index.ts b/play-dl/index.ts index 4083760..e14a520 100644 --- a/play-dl/index.ts +++ b/play-dl/index.ts @@ -6,7 +6,8 @@ export { yt_validate, extractID, YouTube, - YouTubeStream + YouTubeStream, + cookieHeaders } from './YouTube'; export { spotify, sp_validate, refreshToken, is_expired, Spotify } from './Spotify'; export { soundcloud, so_validate, SoundCloud, SoundCloudStream, getFreeClientID } from './SoundCloud';