diff --git a/play-dl/Deezer/classes.ts b/play-dl/Deezer/classes.ts index 5fa85c0..62022ad 100644 --- a/play-dl/Deezer/classes.ts +++ b/play-dl/Deezer/classes.ts @@ -493,18 +493,18 @@ export class DeezerAlbum { } /** * Fetches all the tracks in the album and returns them - * + * * ```ts * const album = await play.deezer('album url') - * + * * const tracks = await album.all_tracks() * ``` * @returns An array of {@link DeezerTrack} */ - async all_tracks(): Promise { - await this.fetch() + async all_tracks(): Promise { + await this.fetch(); - return this.tracks as DeezerTrack[] + return this.tracks as DeezerTrack[]; } /** * Converts instances of this class to JSON data @@ -763,18 +763,18 @@ export class DeezerPlaylist { } /** * Fetches all the tracks in the playlist and returns them - * + * * ```ts * const playlist = await play.deezer('playlist url') - * + * * const tracks = await playlist.all_tracks() * ``` * @returns An array of {@link DeezerTrack} */ - async all_tracks(): Promise { - await this.fetch() + async all_tracks(): Promise { + await this.fetch(); - return this.tracks as DeezerTrack[] + return this.tracks as DeezerTrack[]; } /** * Converts instances of this class to JSON data diff --git a/play-dl/SoundCloud/classes.ts b/play-dl/SoundCloud/classes.ts index ec92cf0..0fcff6e 100644 --- a/play-dl/SoundCloud/classes.ts +++ b/play-dl/SoundCloud/classes.ts @@ -326,18 +326,18 @@ export class SoundCloudPlaylist { } /** * Fetches all the tracks in the playlist and returns them - * + * * ```ts * const playlist = await play.soundcloud('playlist url') - * + * * const tracks = await playlist.all_tracks() * ``` * @returns An array of {@link SoundCloudTrack} */ async all_tracks(): Promise { - await this.fetch() + await this.fetch(); - return this.tracks as SoundCloudTrack[] + return this.tracks as SoundCloudTrack[]; } /** * Converts Class to JSON data diff --git a/play-dl/Spotify/classes.ts b/play-dl/Spotify/classes.ts index 79a7b9a..2c50259 100644 --- a/play-dl/Spotify/classes.ts +++ b/play-dl/Spotify/classes.ts @@ -325,22 +325,22 @@ export class SpotifyPlaylist { } /** * Fetches all the tracks in the playlist and returns them - * + * * ```ts * const playlist = await play.spotify('playlist url') - * + * * const tracks = await playlist.all_tracks() * ``` * @returns An array of {@link SpotifyTrack} */ - async all_tracks() : Promise{ - await this.fetch() + async all_tracks(): Promise { + await this.fetch(); - const tracks : SpotifyTrack[] = [] + const tracks: SpotifyTrack[] = []; - for(const page of this.fetched_tracks.values()) tracks.push(...page); + for (const page of this.fetched_tracks.values()) tracks.push(...page); - return tracks + return tracks; } /** * Converts Class to JSON @@ -530,22 +530,22 @@ export class SpotifyAlbum { } /** * Fetches all the tracks in the album and returns them - * + * * ```ts * const album = await play.spotify('album url') - * + * * const tracks = await album.all_tracks() * ``` * @returns An array of {@link SpotifyTrack} */ - async all_tracks() : Promise{ - await this.fetch() + async all_tracks(): Promise { + await this.fetch(); - const tracks : SpotifyTrack[] = [] + const tracks: SpotifyTrack[] = []; - for( const page of this.fetched_tracks.values() ) tracks.push(...page); + for (const page of this.fetched_tracks.values()) tracks.push(...page); - return tracks + return tracks; } /** * Converts Class to JSON diff --git a/play-dl/YouTube/classes/Playlist.ts b/play-dl/YouTube/classes/Playlist.ts index 00c171c..45d714b 100644 --- a/play-dl/YouTube/classes/Playlist.ts +++ b/play-dl/YouTube/classes/Playlist.ts @@ -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 diff --git a/play-dl/YouTube/classes/Video.ts b/play-dl/YouTube/classes/Video.ts index 6dcf2c3..63f8587 100644 --- a/play-dl/YouTube/classes/Video.ts +++ b/play-dl/YouTube/classes/Video.ts @@ -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 }; } } diff --git a/play-dl/YouTube/index.ts b/play-dl/YouTube/index.ts index d9c6850..b9f6ac6 100644 --- a/play-dl/YouTube/index.ts +++ b/play-dl/YouTube/index.ts @@ -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'; diff --git a/play-dl/YouTube/stream.ts b/play-dl/YouTube/stream.ts index 115d059..4ccee2a 100644 --- a/play-dl/YouTube/stream.ts +++ b/play-dl/YouTube/stream.ts @@ -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) diff --git a/play-dl/YouTube/utils/extractor.ts b/play-dl/YouTube/utils/extractor.ts index 3d7d835..439fcfe 100644 --- a/play-dl/YouTube/utils/extractor.ts +++ b/play-dl/YouTube/utils/extractor.ts @@ -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 ?? [])); diff --git a/play-dl/index.ts b/play-dl/index.ts index c7e3506..615af70 100644 --- a/play-dl/index.ts +++ b/play-dl/index.ts @@ -9,7 +9,8 @@ import { YouTubeStream, YouTubeChannel, YouTubePlayList, - YouTubeVideo + YouTubeVideo, + InfoData } from './YouTube'; import { spotify, @@ -73,7 +74,6 @@ import { existsSync, mkdirSync, writeFileSync } from 'node:fs'; import { stream as yt_stream, StreamOptions, stream_from_info as yt_stream_info } from './YouTube/stream'; import { yt_search } from './YouTube/search'; import { EventEmitter } from 'stream'; -import { InfoData } from './YouTube/utils/constants'; async function stream( url: string, @@ -477,7 +477,6 @@ export { SpotifyAlbum, SpotifyPlaylist, SpotifyTrack, - YouTubeStream, YouTubeChannel, YouTubePlayList, YouTubeVideo, @@ -503,11 +502,12 @@ export { validate, video_basic_info, video_info, - yt_validate + yt_validate, + InfoData }; // Export Types -export { Deezer, YouTube, SoundCloud, Spotify }; +export { Deezer, YouTube, SoundCloud, Spotify, YouTubeStream }; // Export Default export default {