From df6b0cccc43cc5518c2883b57db4cbb2efecd0b5 Mon Sep 17 00:00:00 2001 From: Luan Date: Sat, 5 Apr 2025 05:44:11 -0300 Subject: [PATCH] refactor: Update some nodes to use `AccessibilityData.ts` --- src/parser/classes/Button.ts | 35 +++++++------ .../classes/ChannelThumbnailWithLink.ts | 19 +++++-- src/parser/classes/MusicInlineBadge.ts | 17 +++++-- src/parser/classes/MusicPlayButton.ts | 35 +++++++++---- src/parser/classes/ReelItem.ts | 25 +++++++--- src/parser/classes/SortFilterSubMenu.ts | 49 +++++++++++-------- src/parser/classes/menus/Menu.ts | 14 ++++-- src/parser/classes/misc/AccessibilityData.ts | 4 ++ src/parser/classes/mweb/PivotBarItem.ts | 17 +++++-- 9 files changed, 148 insertions(+), 67 deletions(-) diff --git a/src/parser/classes/Button.ts b/src/parser/classes/Button.ts index 2bc9f081..8317adf9 100644 --- a/src/parser/classes/Button.ts +++ b/src/parser/classes/Button.ts @@ -2,20 +2,22 @@ import Text from './misc/Text.js'; import NavigationEndpoint from './NavigationEndpoint.js'; import { YTNode } from '../helpers.js'; import type { RawNode } from '../index.js'; +import AccessibilityData, { type AccessibilitySupportedDatas } from './misc/AccessibilityData.js'; export default class Button extends YTNode { static type = 'Button'; - text?: string; - label?: string; - tooltip?: string; - style?: string; - size?: string; - icon_type?: string; - is_disabled?: boolean; - target_id?: string; - endpoint: NavigationEndpoint; - + public text?: string; + public label?: string; + public tooltip?: string; + public style?: string; + public size?: string; + public icon_type?: string; + public is_disabled?: boolean; + public target_id?: string; + public endpoint: NavigationEndpoint; + public accessibility?: AccessibilitySupportedDatas; + constructor(data: RawNode) { super(); if (Reflect.has(data, 'text')) @@ -23,12 +25,13 @@ export default class Button extends YTNode { if (Reflect.has(data, 'accessibility') && Reflect.has(data.accessibility, 'label')) { this.label = data.accessibility.label; - } else if ( - Reflect.has(data, 'accessibilityData') && - Reflect.has(data.accessibilityData, 'accessibilityData') && - Reflect.has(data.accessibilityData.accessibilityData, 'label') - ) { - this.label = data.accessibilityData.accessibilityData.label; + } + + if ('accessibilityData' in data + && 'accessibilityData' in data.accessibilityData) { + this.accessibility = { + accessibility_data: new AccessibilityData(data.accessibilityData.accessibilityData) + }; } if (Reflect.has(data, 'tooltip')) diff --git a/src/parser/classes/ChannelThumbnailWithLink.ts b/src/parser/classes/ChannelThumbnailWithLink.ts index ca879ac4..25dda5da 100644 --- a/src/parser/classes/ChannelThumbnailWithLink.ts +++ b/src/parser/classes/ChannelThumbnailWithLink.ts @@ -2,18 +2,29 @@ import Thumbnail from './misc/Thumbnail.js'; import NavigationEndpoint from './NavigationEndpoint.js'; import { YTNode } from '../helpers.js'; import type { RawNode } from '../index.js'; +import AccessibilityData, { type AccessibilitySupportedDatas } from './misc/AccessibilityData.js'; export default class ChannelThumbnailWithLink extends YTNode { static type = 'ChannelThumbnailWithLink'; - thumbnails: Thumbnail[]; - endpoint: NavigationEndpoint; - label?: string; + public thumbnails: Thumbnail[]; + public endpoint: NavigationEndpoint; + public accessibility?: AccessibilitySupportedDatas; constructor(data: RawNode) { super(); this.thumbnails = Thumbnail.fromResponse(data.thumbnail); this.endpoint = new NavigationEndpoint(data.navigationEndpoint); - this.label = data.accessibility?.accessibilityData?.label; + + if ('accessibility' in data + && 'accessibilityData' in data.accessibility) { + this.accessibility = { + accessibility_data: new AccessibilityData(data.accessibility.accessibilityData) + }; + } + } + + get label(): string | undefined { + return this.accessibility?.accessibility_data?.label; } } \ No newline at end of file diff --git a/src/parser/classes/MusicInlineBadge.ts b/src/parser/classes/MusicInlineBadge.ts index 9b53e0f0..7a8003dd 100644 --- a/src/parser/classes/MusicInlineBadge.ts +++ b/src/parser/classes/MusicInlineBadge.ts @@ -1,15 +1,26 @@ import { YTNode } from '../helpers.js'; import type { RawNode } from '../index.js'; +import AccessibilityData, { type AccessibilitySupportedDatas } from './misc/AccessibilityData.js'; export default class MusicInlineBadge extends YTNode { static type = 'MusicInlineBadge'; - icon_type: string; - label: string; + public icon_type: string; + public accessibility?: AccessibilitySupportedDatas; constructor(data: RawNode) { super(); this.icon_type = data.icon.iconType; - this.label = data.accessibilityData.accessibilityData.label; + + if ('accessibilityData' in data + && 'accessibilityData' in data.accessibilityData) { + this.accessibility = { + accessibility_data: new AccessibilityData(data.accessibilityData.accessibilityData) + }; + } + } + + get label(): string | undefined { + return this.accessibility?.accessibility_data?.label; } } \ No newline at end of file diff --git a/src/parser/classes/MusicPlayButton.ts b/src/parser/classes/MusicPlayButton.ts index c2caaef3..1273fc35 100644 --- a/src/parser/classes/MusicPlayButton.ts +++ b/src/parser/classes/MusicPlayButton.ts @@ -1,16 +1,17 @@ import NavigationEndpoint from './NavigationEndpoint.js'; import { YTNode } from '../helpers.js'; import type { RawNode } from '../index.js'; +import AccessibilityData, { type AccessibilitySupportedDatas } from './misc/AccessibilityData.js'; export default class MusicPlayButton extends YTNode { static type = 'MusicPlayButton'; - endpoint: NavigationEndpoint; - play_icon_type: string; - pause_icon_type: string; - play_label?: string; - pause_label?: string; - icon_color: string; + public endpoint: NavigationEndpoint; + public play_icon_type: string; + public pause_icon_type: string; + public icon_color: string; + public accessibility_play_data?: AccessibilitySupportedDatas; + public accessibility_pause_data?: AccessibilitySupportedDatas; constructor(data: RawNode) { super(); @@ -18,14 +19,28 @@ export default class MusicPlayButton extends YTNode { this.play_icon_type = data.playIcon.iconType; this.pause_icon_type = data.pauseIcon.iconType; - if (Reflect.has(data, 'accessibilityPlayData')) { - this.play_label = data.accessibilityPlayData.accessibilityData?.label; + if ('accessibilityPlayData' in data + && 'accessibilityData' in data.accessibilityPlayData) { + this.accessibility_play_data = { + accessibility_data: new AccessibilityData(data.accessibilityPlayData.accessibilityData) + }; } - if (Reflect.has(data, 'accessibilityPauseData')) { - this.pause_label = data.accessibilityPauseData.accessibilityData?.label; + if ('accessibilityPauseData' in data + && 'accessibilityData' in data.accessibilityPauseData) { + this.accessibility_pause_data = { + accessibility_data: new AccessibilityData(data.accessibilityPauseData.accessibilityData) + }; } this.icon_color = data.iconColor; } + + get play_label(): string | undefined { + return this.accessibility_play_data?.accessibility_data?.label; + } + + get pause_label(): string | undefined { + return this.accessibility_pause_data?.accessibility_data?.label; + } } \ No newline at end of file diff --git a/src/parser/classes/ReelItem.ts b/src/parser/classes/ReelItem.ts index 5e73723f..869da104 100644 --- a/src/parser/classes/ReelItem.ts +++ b/src/parser/classes/ReelItem.ts @@ -3,16 +3,17 @@ import type { RawNode } from '../index.js'; import NavigationEndpoint from './NavigationEndpoint.js'; import Text from './misc/Text.js'; import Thumbnail from './misc/Thumbnail.js'; +import AccessibilityData, { type AccessibilitySupportedDatas } from './misc/AccessibilityData.js'; export default class ReelItem extends YTNode { static type = 'ReelItem'; - id: string; - title: Text; - thumbnails: Thumbnail[]; - views: Text; - endpoint: NavigationEndpoint; - accessibility_label?: string; + public id: string; + public title: Text; + public thumbnails: Thumbnail[]; + public views: Text; + public endpoint: NavigationEndpoint; + public accessibility?: AccessibilitySupportedDatas; constructor(data: RawNode) { super(); @@ -21,6 +22,16 @@ export default class ReelItem extends YTNode { this.thumbnails = Thumbnail.fromResponse(data.thumbnail); this.views = new Text(data.viewCountText); this.endpoint = new NavigationEndpoint(data.navigationEndpoint); - this.accessibility_label = data.accessibility.accessibilityData.label; + + if ('accessibility' in data + && 'accessibilityData' in data.accessibility) { + this.accessibility = { + accessibility_data: new AccessibilityData(data.accessibility.accessibilityData) + }; + } + } + + get label() { + return this.accessibility?.accessibility_data?.label; } } \ No newline at end of file diff --git a/src/parser/classes/SortFilterSubMenu.ts b/src/parser/classes/SortFilterSubMenu.ts index 06a70c59..d121fead 100644 --- a/src/parser/classes/SortFilterSubMenu.ts +++ b/src/parser/classes/SortFilterSubMenu.ts @@ -1,42 +1,40 @@ import { YTNode } from '../helpers.js'; import type { RawNode } from '../index.js'; import NavigationEndpoint from './NavigationEndpoint.js'; +import AccessibilityData, { type AccessibilitySupportedDatas } from './misc/AccessibilityData.js'; + +export interface SubMenuItem { + title: string; + selected: boolean; + continuation: string; + endpoint: NavigationEndpoint; + subtitle: string | null; +} export default class SortFilterSubMenu extends YTNode { static type = 'SortFilterSubMenu'; - title?: string; - icon_type?: string; - label?: string; - tooltip?: string; - - sub_menu_items?: { - title: string; - selected: boolean; - continuation: string; - endpoint: NavigationEndpoint; - subtitle: string | null; - }[]; + public title?: string; + public icon_type?: string; + public tooltip?: string; + public sub_menu_items?: SubMenuItem[]; + public accessibility?: AccessibilitySupportedDatas; constructor(data: RawNode) { super(); - if (Reflect.has(data, 'title')) { + if ('title' in data) { this.title = data.title; } - if (Reflect.has(data, 'icon')) { + if ('icon' in data) { this.icon_type = data.icon.iconType; } - if (Reflect.has(data, 'accessibility')) { - this.label = data.accessibility.accessibilityData.label; - } - - if (Reflect.has(data, 'tooltip')) { + if ('tooltip' in data) { this.tooltip = data.tooltip; } - if (Reflect.has(data, 'subMenuItems')) { + if ('subMenuItems' in data) { this.sub_menu_items = data.subMenuItems.map((item: RawNode) => ({ title: item.title, selected: item.selected, @@ -45,5 +43,16 @@ export default class SortFilterSubMenu extends YTNode { subtitle: item.subtitle || null })); } + + if ('accessibility' in data + && 'accessibilityData' in data.accessibility) { + this.accessibility = { + accessibility_data: new AccessibilityData(data.accessibility.accessibilityData) + }; + } + } + + get label(): string | undefined { + return this.accessibility?.accessibility_data?.label; } } \ No newline at end of file diff --git a/src/parser/classes/menus/Menu.ts b/src/parser/classes/menus/Menu.ts index f0c2e75f..53d4fdc2 100644 --- a/src/parser/classes/menus/Menu.ts +++ b/src/parser/classes/menus/Menu.ts @@ -9,6 +9,7 @@ import MenuFlexibleItem from './MenuFlexibleItem.js'; import LikeButton from '../LikeButton.js'; import ToggleButton from '../ToggleButton.js'; import FlexibleActionsView from '../FlexibleActionsView.js'; +import AccessibilityData, { type AccessibilitySupportedDatas } from '../misc/AccessibilityData.js'; export default class Menu extends YTNode { static type = 'Menu'; @@ -16,7 +17,7 @@ export default class Menu extends YTNode { public items: ObservedArray; public flexible_items: ObservedArray; public top_level_buttons: ObservedArray; - public label?: string; + public accessibility?: AccessibilitySupportedDatas; constructor(data: RawNode) { super(); @@ -24,10 +25,17 @@ export default class Menu extends YTNode { this.flexible_items = Parser.parseArray(data.flexibleItems, MenuFlexibleItem); this.top_level_buttons = Parser.parseArray(data.topLevelButtons, [ ToggleButton, LikeButton, Button, ButtonView, SegmentedLikeDislikeButtonView, FlexibleActionsView ]); - if (Reflect.has(data, 'accessibility') && Reflect.has(data.accessibility, 'accessibilityData')) { - this.label = data.accessibility.accessibilityData.label; + if ('accessibility' in data + && 'accessibilityData' in data.accessibility) { + this.accessibility = { + accessibility_data: new AccessibilityData(data.accessibility.accessibilityData) + }; } } + + get label(): string | undefined { + return this.accessibility?.accessibility_data?.label; + } // XXX: alias for consistency get contents() { diff --git a/src/parser/classes/misc/AccessibilityData.ts b/src/parser/classes/misc/AccessibilityData.ts index bb5608d2..496ba51c 100644 --- a/src/parser/classes/misc/AccessibilityData.ts +++ b/src/parser/classes/misc/AccessibilityData.ts @@ -1,5 +1,9 @@ import type { RawNode } from '../../types/index.js'; +export interface AccessibilitySupportedDatas { + accessibility_data: AccessibilityData; +} + export interface AccessibilityId { accessibility_id_type?: | 'UNKNOWN' diff --git a/src/parser/classes/mweb/PivotBarItem.ts b/src/parser/classes/mweb/PivotBarItem.ts index dda664db..5083da94 100644 --- a/src/parser/classes/mweb/PivotBarItem.ts +++ b/src/parser/classes/mweb/PivotBarItem.ts @@ -1,7 +1,7 @@ import { YTNode } from '../../helpers.js'; import { type RawNode } from '../../index.js'; -import Text from '../misc/Text.js'; import NavigationEndpoint from '../NavigationEndpoint.js'; +import AccessibilityData, { type AccessibilitySupportedDatas } from '../misc/AccessibilityData.js'; export default class PivotBarItem extends YTNode { static type = 'PivotBarItem'; @@ -11,6 +11,7 @@ export default class PivotBarItem extends YTNode { public title: Text; public accessibility_label?: string; public icon_type?: string; + public accessibility?: AccessibilitySupportedDatas; constructor(data: RawNode) { super(); @@ -18,10 +19,18 @@ export default class PivotBarItem extends YTNode { this.endpoint = new NavigationEndpoint(data.navigationEndpoint); this.title = new Text(data.title); - if (Reflect.has(data, 'accessibility') && Reflect.has(data.accessibility, 'accessibilityData')) - this.accessibility_label = data.accessibility.accessibilityData.label; - + if ('accessibility' in data + && 'accessibilityData' in data.accessibility) { + this.accessibility = { + accessibility_data: new AccessibilityData(data.accessibility.accessibilityData) + }; + } + if (Reflect.has(data, 'icon') && Reflect.has(data.icon, 'iconType')) this.icon_type = data.icon.iconType; } + + get label() { + return this.accessibility?.accessibility_data?.label; + } } \ No newline at end of file