mirror of
https://github.com/YuzuZensai/play-dl-test.git
synced 2026-01-31 14:58:05 +00:00
Pretty Code + Music property added in YouTube Video
This commit is contained in:
@@ -218,10 +218,10 @@ export class YouTubePlayList {
|
||||
}
|
||||
/**
|
||||
* Fetches all the videos in the playlist and returns them
|
||||
*
|
||||
*
|
||||
* ```ts
|
||||
* const playlist = await play.playlist_info('playlist url')
|
||||
*
|
||||
*
|
||||
* const videos = await playlist.all_videos()
|
||||
* ```
|
||||
* @returns An array of {@link YouTubeVideo} objects
|
||||
|
||||
@@ -1,6 +1,14 @@
|
||||
import { YouTubeChannel } from './Channel';
|
||||
import { YouTubeThumbnail } from './Thumbnail';
|
||||
|
||||
interface VideoMusic {
|
||||
song?: string;
|
||||
artist?: string;
|
||||
album?: string;
|
||||
writers?: string;
|
||||
license?: string;
|
||||
}
|
||||
|
||||
interface VideoOptions {
|
||||
/**
|
||||
* YouTube Video ID
|
||||
@@ -66,6 +74,10 @@ interface VideoOptions {
|
||||
* `true` if the video has been identified by the YouTube community as inappropriate or offensive to some audiences and viewer discretion is advised
|
||||
*/
|
||||
discretionAdvised?: boolean;
|
||||
/**
|
||||
* Gives info about music content in that video.
|
||||
*/
|
||||
music?: VideoMusic[];
|
||||
}
|
||||
/**
|
||||
* Class for YouTube Video url
|
||||
@@ -135,6 +147,10 @@ export class YouTubeVideo {
|
||||
* `true` if the video has been identified by the YouTube community as inappropriate or offensive to some audiences and viewer discretion is advised
|
||||
*/
|
||||
discretionAdvised?: boolean;
|
||||
/**
|
||||
* Gives info about music content in that video.
|
||||
*/
|
||||
music?: VideoMusic[];
|
||||
/**
|
||||
* Constructor for YouTube Video Class
|
||||
* @param data JSON parsed data.
|
||||
@@ -161,7 +177,8 @@ export class YouTubeVideo {
|
||||
this.live = !!data.live;
|
||||
this.private = !!data.private;
|
||||
this.tags = data.tags || [];
|
||||
this.discretionAdvised = data.discretionAdvised === undefined ? undefined : data.discretionAdvised;
|
||||
this.discretionAdvised = data.discretionAdvised ?? undefined;
|
||||
this.music = data.music || [];
|
||||
}
|
||||
/**
|
||||
* Converts class to title name of video.
|
||||
@@ -190,7 +207,8 @@ export class YouTubeVideo {
|
||||
likes: this.likes,
|
||||
live: this.live,
|
||||
private: this.private,
|
||||
discretionAdvised: this.discretionAdvised
|
||||
discretionAdvised: this.discretionAdvised,
|
||||
music: this.music
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,3 +4,4 @@ export { YouTube } from './search';
|
||||
export { YouTubeVideo } from './classes/Video';
|
||||
export { YouTubePlayList } from './classes/Playlist';
|
||||
export { YouTubeChannel } from './classes/Channel';
|
||||
export { InfoData } from './utils/constants';
|
||||
|
||||
@@ -83,7 +83,7 @@ export async function stream_from_info(
|
||||
else final.push(info.format[info.format.length - 1]);
|
||||
let type: StreamType =
|
||||
final[0].codec === 'opus' && final[0].container === 'webm' ? StreamType.WebmOpus : StreamType.Arbitrary;
|
||||
await request_stream(`https://${new URL(final[0].url).host}/generate_204`)
|
||||
await request_stream(`https://${new URL(final[0].url).host}/generate_204`);
|
||||
if (options.seek) {
|
||||
if (type === StreamType.WebmOpus) {
|
||||
if (options.seek >= info.video_details.durationInSec || options.seek <= 0)
|
||||
|
||||
@@ -200,6 +200,25 @@ export async function video_basic_info(url: string, options: InfoOptions = {}):
|
||||
}
|
||||
);
|
||||
const microformat = player_response.microformat.playerMicroformatRenderer;
|
||||
const musicInfo =
|
||||
initial_response.contents.twoColumnWatchNextResults.results.results.contents?.[1]?.videoSecondaryInfoRenderer
|
||||
?.metadataRowContainer?.metadataRowContainerRenderer?.rows;
|
||||
const music: any[] = [];
|
||||
if (musicInfo) {
|
||||
let incompleteInfo: any = {};
|
||||
musicInfo.forEach((x: any) => {
|
||||
if (!x.metadataRowRenderer) return;
|
||||
if (x.metadataRowRenderer.title.simpleText.toLowerCase() === 'song') {
|
||||
music.push(incompleteInfo);
|
||||
incompleteInfo = {};
|
||||
incompleteInfo.song =
|
||||
x.metadataRowRenderer.contents[0].simpleText ?? x.metadataRowRenderer.contents[0]?.runs?.[0]?.text;
|
||||
} else
|
||||
incompleteInfo[x.metadataRowRenderer.title.simpleText.toLowerCase()] =
|
||||
x.metadataRowRenderer.contents[0].simpleText ?? x.metadataRowRenderer.contents[0]?.runs?.[0]?.text;
|
||||
});
|
||||
}
|
||||
music.shift();
|
||||
const video_details = new YouTubeVideo({
|
||||
id: vid.videoId,
|
||||
title: vid.title,
|
||||
@@ -228,7 +247,8 @@ export async function video_basic_info(url: string, options: InfoOptions = {}):
|
||||
),
|
||||
live: vid.isLiveContent,
|
||||
private: vid.isPrivate,
|
||||
discretionAdvised
|
||||
discretionAdvised,
|
||||
music
|
||||
});
|
||||
const format = player_response.streamingData.formats ?? [];
|
||||
format.push(...(player_response.streamingData.adaptiveFormats ?? []));
|
||||
|
||||
Reference in New Issue
Block a user