1.2.6
Added option to pass html body data directly to video_basic_info | video_info | stream functions. Fixed Playlist ID regexp to allow multiple playlist ID support. Added Dezer advanced search Improved Deezer Share Link handling. Added cookiesHeaders options to update cookies when using external https request module. Added Artists badge in YouTubeChannel Class.
This commit is contained in:
commit
4c8162ecdd
@ -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.
|
||||
```
|
||||
@ -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))
|
||||
|
||||
4
package-lock.json
generated
4
package-lock.json
generated
@ -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",
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
export { stream, stream_from_info, YouTubeStream } from './stream';
|
||||
export * from './utils';
|
||||
export { YouTube } from './search';
|
||||
export { cookieHeaders } from './utils/cookie';
|
||||
|
||||
@ -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<YouTubeStream> {
|
||||
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 &&
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
@ -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 = {}) {
|
||||
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`;
|
||||
const body = await request(new_url, {
|
||||
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(';</script>')[0]
|
||||
|
||||
@ -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';
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user