refactor: Update some nodes to use AccessibilityData.ts

This commit is contained in:
Luan
2025-04-05 05:44:11 -03:00
parent a95f52a477
commit df6b0cccc4
9 changed files with 148 additions and 67 deletions

View File

@@ -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'))

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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<YTNode>;
public flexible_items: ObservedArray<MenuFlexibleItem>;
public top_level_buttons: ObservedArray<ToggleButton | LikeButton | Button |ButtonView | SegmentedLikeDislikeButtonView | FlexibleActionsView>;
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() {

View File

@@ -1,5 +1,9 @@
import type { RawNode } from '../../types/index.js';
export interface AccessibilitySupportedDatas {
accessibility_data: AccessibilityData;
}
export interface AccessibilityId {
accessibility_id_type?:
| 'UNKNOWN'

View File

@@ -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;
}
}