diff --git a/src/index.ts b/src/index.ts index 5666d0a..ff0c946 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,8 +2,8 @@ import YTMusic from "./YTMusic" const ytmusic = new YTMusic() ytmusic.initialize().then(() => { - ytmusic.search("Lilac", "ALBUM").then(res => { - ytmusic.getAlbum(res[0].albumId).then(res => { + ytmusic.search("Lilac", "PLAYLIST").then(res => { + ytmusic.getPlaylist(res[0].playlistId).then(res => { console.log(res) }) }) diff --git a/src/parsers/SongParser.ts b/src/parsers/SongParser.ts index 57f5570..ca403b1 100644 --- a/src/parsers/SongParser.ts +++ b/src/parsers/SongParser.ts @@ -4,10 +4,11 @@ import traverse from "../utils/traverse" export default class SongParser { public static parseSearchResult(item: any): YTMusic.SongDetailed { const flexColumns = traverse(item, "flexColumns") + const videoId = traverse(item, "playlistItemData", "videoId") return { type: "SONG", - videoId: traverse(item, "playlistItemData", "videoId"), + videoId: videoId instanceof Array ? null : videoId, name: traverse(flexColumns[0], "runs", "text"), artists: traverse(flexColumns[1], "runs") .filter((run: any) => "navigationEndpoint" in run) @@ -23,10 +24,11 @@ export default class SongParser { public static parseArtistSong(item: any): YTMusic.SongDetailed { const flexColumns = traverse(item, "flexColumns") + const videoId = traverse(item, "playlistItemData", "videoId") return { type: "SONG", - videoId: traverse(item, "playlistItemData", "videoId"), + videoId: videoId instanceof Array ? null : videoId, name: traverse(flexColumns[0], "runs", "text"), artists: [traverse(flexColumns[1], "runs")] .flat() @@ -49,10 +51,11 @@ export default class SongParser { artistBasic: YTMusic.ArtistBasic ): Omit { const flexColumns = traverse(item, "flexColumns") + const videoId = traverse(item, "playlistItemData", "videoId") return { type: "SONG", - videoId: traverse(item, "playlistItemData", "videoId"), + videoId: videoId instanceof Array ? null : videoId, name: traverse(flexColumns[0], "runs", "text"), artists: [artistBasic], album: { @@ -70,10 +73,11 @@ export default class SongParser { thumbnails: YTMusic.ThumbnailFull[] ): YTMusic.SongDetailed { const flexColumns = traverse(item, "flexColumns") + const videoId = traverse(item, "playlistItemData", "videoId") return { type: "SONG", - videoId: traverse(item, "playlistItemData", "videoId"), + videoId: videoId instanceof Array ? null : videoId, name: traverse(flexColumns[0], "runs", "text"), artists, album: albumBasic, diff --git a/src/tests/interfaces.ts b/src/tests/interfaces.ts index 8e26a2c..271b1b8 100644 --- a/src/tests/interfaces.ts +++ b/src/tests/interfaces.ts @@ -19,7 +19,7 @@ export const ALBUM_BASIC: ObjectValidator = OBJECT({ export const SONG_DETAILED: ObjectValidator = OBJECT({ type: STRING("SONG"), - videoId: STRING(), + videoId: OR(STRING(), NULL()), name: STRING(), artists: LIST(ARTIST_BASIC), album: ALBUM_BASIC, diff --git a/src/types.d.ts b/src/types.d.ts index 01bea28..1212514 100644 --- a/src/types.d.ts +++ b/src/types.d.ts @@ -7,7 +7,7 @@ declare namespace YTMusic { interface SongDetailed { type: "SONG" - videoId: string + videoId: string | null name: string artists: ArtistBasic[] album: AlbumBasic