From a9cad49333aa85c98bbb96e5f2d5b57d9beeb0c7 Mon Sep 17 00:00:00 2001 From: LuanRT Date: Thu, 13 Apr 2023 05:37:49 -0300 Subject: [PATCH] feat(ytmusic): add taste builder nodes (#383) Adds MusicTastebuilderShelf and MusicTastebuilderShelfThumbnail. These usually appear on new accounts. --- src/parser/classes/MusicTastebuilderShelf.ts | 26 +++++++++++++++++++ .../MusicTastebuilderShelfThumbnail.ts | 14 ++++++++++ src/parser/nodes.ts | 2 ++ src/parser/ytmusic/HomeFeed.ts | 9 ++++--- 4 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 src/parser/classes/MusicTastebuilderShelf.ts create mode 100644 src/parser/classes/MusicTastebuilderShelfThumbnail.ts diff --git a/src/parser/classes/MusicTastebuilderShelf.ts b/src/parser/classes/MusicTastebuilderShelf.ts new file mode 100644 index 00000000..741ee9d3 --- /dev/null +++ b/src/parser/classes/MusicTastebuilderShelf.ts @@ -0,0 +1,26 @@ +import Parser from '../index.js'; +import Button from './Button.js'; +import Text from './misc/Text.js'; +import MusicTastebuilderShelfThumbnail from './MusicTastebuilderShelfThumbnail.js'; + +import { YTNode } from '../helpers.js'; +import type { RawNode } from '../index.js'; + +export default class MusicTasteBuilderShelf extends YTNode { + static type = 'MusicTasteBuilderShelf'; + + thumbnail: MusicTastebuilderShelfThumbnail | null; + primary_text: Text; + secondary_text: Text; + action_button: Button | null; + is_visible: boolean; + + constructor(data: RawNode) { + super(); + this.thumbnail = Parser.parseItem(data.thumbnail, MusicTastebuilderShelfThumbnail); + this.primary_text = new Text(data.primaryText); + this.secondary_text = new Text(data.secondaryText); + this.action_button = Parser.parseItem(data.actionButton, Button); + this.is_visible = data.isVisible; + } +} \ No newline at end of file diff --git a/src/parser/classes/MusicTastebuilderShelfThumbnail.ts b/src/parser/classes/MusicTastebuilderShelfThumbnail.ts new file mode 100644 index 00000000..14403fee --- /dev/null +++ b/src/parser/classes/MusicTastebuilderShelfThumbnail.ts @@ -0,0 +1,14 @@ +import { YTNode } from '../helpers.js'; +import { Thumbnail } from '../misc.js'; +import type { RawNode } from '../index.js'; + +export default class MusicTastebuilderShelfThumbnail extends YTNode { + static type = 'MusicTastebuilderShelfThumbnail'; + + thumbnail: Thumbnail[]; + + constructor(data: RawNode) { + super(); + this.thumbnail = Thumbnail.fromResponse(data.thumbnail); + } +} \ No newline at end of file diff --git a/src/parser/nodes.ts b/src/parser/nodes.ts index eae6286a..b9b56146 100644 --- a/src/parser/nodes.ts +++ b/src/parser/nodes.ts @@ -219,6 +219,8 @@ export { default as MusicResponsiveListItemFlexColumn } from './classes/MusicRes export { default as MusicShelf } from './classes/MusicShelf.js'; export { default as MusicSideAlignedItem } from './classes/MusicSideAlignedItem.js'; export { default as MusicSortFilterButton } from './classes/MusicSortFilterButton.js'; +export { default as MusicTastebuilderShelf } from './classes/MusicTastebuilderShelf.js'; +export { default as MusicTastebuilderShelfThumbnail } from './classes/MusicTastebuilderShelfThumbnail.js'; export { default as MusicThumbnail } from './classes/MusicThumbnail.js'; export { default as MusicTwoRowItem } from './classes/MusicTwoRowItem.js'; export { default as MusicVisualHeader } from './classes/MusicVisualHeader.js'; diff --git a/src/parser/ytmusic/HomeFeed.ts b/src/parser/ytmusic/HomeFeed.ts index 60a224b5..6d7ad827 100644 --- a/src/parser/ytmusic/HomeFeed.ts +++ b/src/parser/ytmusic/HomeFeed.ts @@ -1,20 +1,21 @@ -import { InnertubeError } from '../../utils/Utils.js'; +import Parser, { SectionListContinuation } from '../index.js'; import MusicCarouselShelf from '../classes/MusicCarouselShelf.js'; import SectionList from '../classes/SectionList.js'; import SingleColumnBrowseResults from '../classes/SingleColumnBrowseResults.js'; -import Parser, { SectionListContinuation } from '../index.js'; +import MusicTastebuilderShelf from '../classes/MusicTastebuilderShelf.js'; import type Actions from '../../core/Actions.js'; import type { ApiResponse } from '../../core/Actions.js'; import type { ObservedArray } from '../helpers.js'; import type { IBrowseResponse } from '../types/ParsedResponse.js'; +import { InnertubeError } from '../../utils/Utils.js'; class HomeFeed { #page: IBrowseResponse; #actions: Actions; #continuation?: string; - sections?: ObservedArray; + sections?: ObservedArray; constructor(response: ApiResponse, actions: Actions) { this.#actions = actions; @@ -36,7 +37,7 @@ class HomeFeed { } this.#continuation = tab.content?.as(SectionList).continuation; - this.sections = tab.content?.as(SectionList).contents.as(MusicCarouselShelf); + this.sections = tab.content?.as(SectionList).contents.as(MusicCarouselShelf, MusicTastebuilderShelf); } /**