From c6310228fee1ed01f93a0e4e0482d09a967ef1be Mon Sep 17 00:00:00 2001 From: Luan Date: Tue, 31 Dec 2024 06:05:49 -0300 Subject: [PATCH] feat(Parser): Add `AvatarStackView` --- src/parser/classes/AvatarStackView.ts | 26 +++++++++++++++++++++++ src/parser/classes/ContentMetadataView.ts | 10 ++++++--- src/parser/nodes.ts | 1 + 3 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 src/parser/classes/AvatarStackView.ts diff --git a/src/parser/classes/AvatarStackView.ts b/src/parser/classes/AvatarStackView.ts new file mode 100644 index 00000000..333a9e7c --- /dev/null +++ b/src/parser/classes/AvatarStackView.ts @@ -0,0 +1,26 @@ +import { type ObservedArray, YTNode } from '../helpers.js'; +import type { RawNode } from '../types/index.js'; +import { Parser } from '../index.js'; + +import Text from './misc/Text.js'; +import AvatarView from './AvatarView.js'; +import RendererContext from './misc/RendererContext.js'; + +export default class AvatarStackView extends YTNode { + static type = 'AvatarStackView'; + + public avatars: ObservedArray; + public text?: Text; + public renderer_context?: RendererContext; + + constructor(data: RawNode) { + super(); + this.avatars = Parser.parseArray(data.avatars, AvatarView); + + if (Reflect.has(data, 'text')) + this.text = Text.fromAttributed(data.text); + + if (Reflect.has(data, 'rendererContext')) + this.renderer_context = new RendererContext(data.rendererContext); + } +} \ No newline at end of file diff --git a/src/parser/classes/ContentMetadataView.ts b/src/parser/classes/ContentMetadataView.ts index 78dea9ca..c475eb4d 100644 --- a/src/parser/classes/ContentMetadataView.ts +++ b/src/parser/classes/ContentMetadataView.ts @@ -1,24 +1,28 @@ import { YTNode } from '../helpers.js'; import type { RawNode } from '../index.js'; import { Text } from '../misc.js'; +import { Parser } from '../index.js'; +import AvatarStackView from './AvatarStackView.js'; export type MetadataRow = { metadata_parts?: { text: Text; + avatar_stack: AvatarStackView | null; }[]; }; export default class ContentMetadataView extends YTNode { static type = 'ContentMetadataView'; - metadata_rows: MetadataRow[]; - delimiter: string; + public metadata_rows: MetadataRow[]; + public delimiter: string; constructor(data: RawNode) { super(); this.metadata_rows = data.metadataRows.map((row: RawNode) => ({ metadata_parts: row.metadataParts?.map((part: RawNode) => ({ - text: Text.fromAttributed(part.text || {}) + text: Text.fromAttributed(part.text || {}), + avatar_stack: Parser.parseItem(part.avatarStack, AvatarStackView) })) })); this.delimiter = data.delimiter; diff --git a/src/parser/nodes.ts b/src/parser/nodes.ts index 1e54749d..cdbed105 100644 --- a/src/parser/nodes.ts +++ b/src/parser/nodes.ts @@ -24,6 +24,7 @@ export { default as AlertWithButton } from './classes/AlertWithButton.js'; export { default as AttributionView } from './classes/AttributionView.js'; export { default as AudioOnlyPlayability } from './classes/AudioOnlyPlayability.js'; export { default as AutomixPreviewVideo } from './classes/AutomixPreviewVideo.js'; +export { default as AvatarStackView } from './classes/AvatarStackView.js'; export { default as AvatarView } from './classes/AvatarView.js'; export { default as BackgroundPromo } from './classes/BackgroundPromo.js'; export { default as BackstageImage } from './classes/BackstageImage.js';