From 0331126508f29707efa06e6b4abbca8446f1f2e1 Mon Sep 17 00:00:00 2001 From: Clisson Date: Tue, 3 Oct 2023 19:46:41 -0400 Subject: [PATCH] feat: add featured on and similar artists parsers --- src/parsers/ArtistParser.ts | 25 +++++++++++++++++++++++++ src/parsers/PlaylistParser.ts | 16 ++++++++++++++++ src/schemas.ts | 2 ++ 3 files changed, 43 insertions(+) diff --git a/src/parsers/ArtistParser.ts b/src/parsers/ArtistParser.ts index 53954d4..41b1974 100644 --- a/src/parsers/ArtistParser.ts +++ b/src/parsers/ArtistParser.ts @@ -5,6 +5,7 @@ import traverseString from "../utils/traverseString" import AlbumParser from "./AlbumParser" import SongParser from "./SongParser" import VideoParser from "./VideoParser" +import PlaylistParser from "./PlaylistParser"; export default class ArtistParser { public static parse(data: any, artistId: string): ArtistFull { @@ -42,6 +43,18 @@ export default class ArtistParser { ?.contents.map((item: any) => VideoParser.parseArtistTopVideo(item, artistBasic), ) ?? [], + featuredOn: + traverseList(data, "musicCarouselShelfRenderer") + ?.at(3) + ?.contents.map((item: any) => + PlaylistParser.parseArtistFeaturedOn(item), + ) ?? [], + similarArtists: + traverseList(data, "musicCarouselShelfRenderer") + ?.at(4) + ?.contents.map((item: any) => + this.parseSimilarArtists(item), + ) ?? [], }, ArtistFull, ) @@ -60,4 +73,16 @@ export default class ArtistParser { ArtistDetailed, ) } + + public static parseSimilarArtists(item: any): ArtistDetailed { + return checkType( + { + type: "ARTIST", + artistId: traverseString(item, "browseId")(), + name: traverseString(item, "runs", "text")(), + thumbnails: traverseList(item, "thumbnails"), + }, + ArtistDetailed, + ) + } } diff --git a/src/parsers/PlaylistParser.ts b/src/parsers/PlaylistParser.ts index 4e6e42a..131aea6 100644 --- a/src/parsers/PlaylistParser.ts +++ b/src/parsers/PlaylistParser.ts @@ -43,4 +43,20 @@ export default class PlaylistParser { PlaylistDetailed, ) } + + public static parseArtistFeaturedOn(item: any): PlaylistDetailed { + return checkType( + { + type: "PLAYLIST", + playlistId: traverseString(item, "navigationEndpoint", "browseId")(), + name: traverseString(item, "runs", "text")(), + artist: { + artistId: traverseString(item, "browseId")(), + name: traverseString(item, "runs", "text")(-3), + }, + thumbnails: traverseList(item, "thumbnails"), + }, + PlaylistDetailed, + ) + } } diff --git a/src/schemas.ts b/src/schemas.ts index c8ecc72..5ee660a 100644 --- a/src/schemas.ts +++ b/src/schemas.ts @@ -107,6 +107,8 @@ export const ArtistFull = z.object({ topAlbums: z.array(AlbumDetailed), topSingles: z.array(AlbumDetailed), topVideos: z.array(VideoDetailed.omit({ duration: true })), + featuredOn: z.array(PlaylistDetailed), + similarArtists: z.array(ArtistDetailed), }) export type AlbumFull = z.infer