From 7ec6d6dd211d07994d9409931d57634cb02ced14 Mon Sep 17 00:00:00 2001 From: LuanRT Date: Thu, 23 Jun 2022 03:46:53 -0300 Subject: [PATCH] feat: add YouTube livechat renderers Next up: refactor old livechat parser --- lib/parser/contents/classes/LiveChat.js | 25 +++++++++++++++++++ lib/parser/contents/classes/LiveChatHeader.js | 15 +++++++++++ .../contents/classes/SortFilterSubMenu.js | 20 +++++++++++++++ lib/parser/youtube/VideoInfo.js | 9 +++++-- 4 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 lib/parser/contents/classes/LiveChat.js create mode 100644 lib/parser/contents/classes/LiveChatHeader.js create mode 100644 lib/parser/contents/classes/SortFilterSubMenu.js diff --git a/lib/parser/contents/classes/LiveChat.js b/lib/parser/contents/classes/LiveChat.js new file mode 100644 index 00000000..7d51ef40 --- /dev/null +++ b/lib/parser/contents/classes/LiveChat.js @@ -0,0 +1,25 @@ +'use strict'; + +const Parser = require('..'); +const Text = require('./Text'); + +class LiveChat { + type = 'LiveChat'; + + constructor(data) { + this.header = Parser.parse(data.header); + + this.initial_display_state = data.initialDisplayState; + this.continuation = data.continuations[0]?.reloadContinuationData?.continuation; + + this.client_messages = { + reconnect_message: new Text(data.clientMessages.reconnectMessage), + unable_to_reconnect_message: new Text(data.clientMessages.unableToReconnectMessage), + fatal_error: new Text(data.clientMessages.fatalError), + reconnected_message: new Text(data.clientMessages.reconnectedMessage), + generic_error: new Text(data.clientMessages.genericError) + }; + } +} + +module.exports = LiveChat; \ No newline at end of file diff --git a/lib/parser/contents/classes/LiveChatHeader.js b/lib/parser/contents/classes/LiveChatHeader.js new file mode 100644 index 00000000..8060705f --- /dev/null +++ b/lib/parser/contents/classes/LiveChatHeader.js @@ -0,0 +1,15 @@ +'use strict'; + +const Parser = require('..'); + +class LiveChatHeader { + type = 'LiveChatHeader'; + + constructor(data) { + this.overflow_menu = Parser.parse(data.overflowMenu); + this.collapse_button = Parser.parse(data.collapseButton); + this.view_selector = Parser.parse(data.viewSelector); + } +} + +module.exports = LiveChatHeader; \ No newline at end of file diff --git a/lib/parser/contents/classes/SortFilterSubMenu.js b/lib/parser/contents/classes/SortFilterSubMenu.js new file mode 100644 index 00000000..e22a9c1d --- /dev/null +++ b/lib/parser/contents/classes/SortFilterSubMenu.js @@ -0,0 +1,20 @@ +'use strict'; + +const { observe } = require('../../../utils/Utils'); + +class SortFilterSubMenu { + type = 'SortFilterSubMenu'; + + constructor(data) { + this.sub_menu_items = observe(data.subMenuItems.map((item) => ({ + title: item.title, + selected: item.selected, + continuation: item.continuation?.reloadContinuationData.continuation, + subtitle: item.subtitle + }))); + + this.label = data.accessibility.accessibilityData.label; + } +} + +module.exports = SortFilterSubMenu; \ No newline at end of file diff --git a/lib/parser/youtube/VideoInfo.js b/lib/parser/youtube/VideoInfo.js index de183c8f..63e000f2 100644 --- a/lib/parser/youtube/VideoInfo.js +++ b/lib/parser/youtube/VideoInfo.js @@ -34,7 +34,7 @@ class VideoInfo { if (info.playability_status.status === 'ERROR') throw new InnertubeError('This video is unavailable', info.playability_status); - + /** * @type {import('../contents/classes/VideoDetails')} */ @@ -122,7 +122,12 @@ class VideoInfo { /** * @type {import('../contents/classes/CommentsEntryPointHeader')} */ - this.comments_entry_point_header = comments_entry_point?.contents.get({ type: 'CommentsEntryPointHeader' }) || {}; + this.comments_entry_point_header = comments_entry_point?.contents.get({ type: 'CommentsEntryPointHeader' }) || null; + + /** + * @type {import('../contents/classes/LiveChat')} + */ + this.livechat = next.contents_memo.get('LiveChat')?.[0] || null; } }