diff --git a/src/parser/classes/MusicResponsiveListItem.ts b/src/parser/classes/MusicResponsiveListItem.ts index d2fbcf55..b28c3e88 100644 --- a/src/parser/classes/MusicResponsiveListItem.ts +++ b/src/parser/classes/MusicResponsiveListItem.ts @@ -86,11 +86,14 @@ class MusicResponsiveListItem extends YTNode { this.#parsePlaylist(); break; case 'MUSIC_PAGE_TYPE_ARTIST': - case 'MUSIC_PAGE_TYPE_LIBRARY_ARTIST': case 'MUSIC_PAGE_TYPE_USER_CHANNEL': this.item_type = 'artist'; this.#parseArtist(); break; + case 'MUSIC_PAGE_TYPE_LIBRARY_ARTIST': + this.item_type = 'library_artist'; + this.#parseLibraryArtist(); + break; default: if (this.#flex_columns[1]) { this.#parseVideoOrSong(); @@ -191,7 +194,12 @@ class MusicResponsiveListItem extends YTNode { this.name = this.#flex_columns[0].key('title').instanceof(Text).toString(); this.subtitle = this.#flex_columns[1].key('title').instanceof(Text); this.subscribers = this.subtitle.runs?.find((run) => (/^(\d*\.)?\d+[M|K]? subscribers?$/i).test(run.text))?.text || ''; - this.song_count = this.subtitle.runs?.find((run) => (/^\d+(,\d+)? songs?$/i).test(run.text))?.text || ''; + } + + #parseLibraryArtist() { + this.name = this.#flex_columns[0].key('title').instanceof(Text).toString(); + this.subtitle = this.#flex_columns[1].key('title').instanceof(Text); + this.song_count = this.subtitle?.runs?.find((run) => (/^\d+(,\d+)? songs?$/i).test(run.text))?.text || ''; } #parseAlbum() { diff --git a/src/parser/classes/MusicShelf.ts b/src/parser/classes/MusicShelf.ts index 5e9bc8ae..9a423d9b 100644 --- a/src/parser/classes/MusicShelf.ts +++ b/src/parser/classes/MusicShelf.ts @@ -4,6 +4,7 @@ import NavigationEndpoint from './NavigationEndpoint'; import MusicResponsiveListItem from './MusicResponsiveListItem'; import { YTNode } from '../helpers'; +import Button from './Button'; class MusicShelf extends YTNode { static type = 'MusicShelf'; @@ -13,6 +14,7 @@ class MusicShelf extends YTNode { endpoint: NavigationEndpoint | null; continuation: string | null; bottom_text: Text | null; + bottom_button?: Button | null; subheaders?: Array; constructor(data: any) { @@ -25,6 +27,7 @@ class MusicShelf extends YTNode { data.continuations?.[0].nextContinuationData?.continuation || data.continuations?.[0].reloadContinuationData?.continuation || null; this.bottom_text = Reflect.has(data, 'bottomText') ? new Text(data.bottomText) : null; + this.bottom_button = Parser.parseItem(data.bottomButton, Button); if (data.subheaders) { this.subheaders = Parser.parseArray(data.subheaders); } diff --git a/src/parser/ytmusic/Library.ts b/src/parser/ytmusic/Library.ts index 473695b3..bc29df8d 100644 --- a/src/parser/ytmusic/Library.ts +++ b/src/parser/ytmusic/Library.ts @@ -103,7 +103,7 @@ class Library { * Retrieves the library's artists */ async getArtists(args?: { sort_by?: SortBy }) { - const data = await this.#fetchAndParseTabContents(this.#getBrowseId('artists'), (item) => item.item_type === 'artist'); + const data = await this.#fetchAndParseTabContents(this.#getBrowseId('artists'), (item) => item.item_type === 'library_artist'); const sort_by = args?.sort_by || null; return sort_by ? this.#applySortBy(data, sort_by) : data; }