diff --git a/lib/Actions.js b/lib/Actions.js index 4cf90371..b8e74094 100644 --- a/lib/Actions.js +++ b/lib/Actions.js @@ -237,7 +237,7 @@ async function notifications(session, action_type, args = {}) { case 'modify_channel_preference': const pref_types = { PERSONALIZED: 1, ALL: 2, NONE: 3 }; data.context = session.context; - data.params = Utils.encodeNotificationPref(args.channel_id, pref_types[args.pref.toUpperCase()]); + data.params = Proto.encodeNotificationPref(args.channel_id, pref_types[args.pref.toUpperCase()]); break; case 'get_notification_menu': data.context = session.context; @@ -376,12 +376,12 @@ async function getContinuation(session, args = {}) { * @returns {Promise.<{ success: boolean; status_code: number; data: object; message?: string }>} */ async function getYTSearchSuggestions(session, query) { - const response = await Axios.get(`${Constants.URLS.YT_SUGGESTIONS}search?client=firefox&ds=yt&q=${query}`, + const response = await Axios.get(`${Constants.URLS.YT_SUGGESTIONS}search?client=firefox&ds=yt&q=${encodeURIComponent(query)}`, Constants.DEFAULT_HEADERS(session)).catch((error) => error); if (response instanceof Error) return { success: false, - status_code: response.response.status, + status_code: response.status, message: response.message }; diff --git a/lib/Innertube.js b/lib/Innertube.js index 9b650517..f18e573c 100644 --- a/lib/Innertube.js +++ b/lib/Innertube.js @@ -358,11 +358,12 @@ class Innertube { * Gets search suggestions. * * @param {string} input - The search query. - * @param {string} [client='YOUTUBE'] - Client used to retrieve search suggestions, can be: `YOUTUBE` or `YTMUSIC`. + * @param {object} [options] - Search options. + * @param {string} [options.client='YOUTUBE'] - Client used to retrieve search suggestions, can be: `YOUTUBE` or `YTMUSIC`. * @returns {Promise.<[{ text: string; bold_text: string }]>} */ - async getSearchSuggestions(input, { client = 'YOUTUBE' }) { - if (client == 'YOUTUBE') { + async getSearchSuggestions(input, options = { client: 'YOUTUBE' }) { + if (options.client == 'YOUTUBE') { const response = await Actions.getYTSearchSuggestions(this, input); if (!response.success) throw new Error('Could not get search suggestions'); @@ -372,7 +373,7 @@ class Innertube { bold_text: response.data[0].trim() }; }); - } else if (client == 'YTMUSIC') { + } else if (options.client == 'YTMUSIC') { const response = await Actions.music(this, 'get_search_suggestions', { input }); if (!response.success) throw new Error('Could not get search suggestions'); if (!response.data.contents) return []; @@ -409,17 +410,6 @@ class Innertube { data.continuation = continuation.data; const details = new Parser(this, data, { client: 'YOUTUBE', data_type: 'VIDEO_INFO' }).parse(); - - if (details.metadata.is_live_content) { - const data_continuation = await Actions.getContinuation(this, { video_id }); - if (data_continuation.data.contents.twoColumnWatchNextResults.conversationBar) { - details.getLivechat = () => new Livechat(this, data_continuation.data.contents.twoColumnWatchNextResults.conversationBar.liveChatRenderer.continuations[0].reloadContinuationData.continuation, details.metadata.channel_id, video_id); - } else { - details.getLivechat = () => { }; - } - } else { - details.getLivechat = () => { }; - } // Functions details.like = () => Actions.engage(this, 'like/like', { video_id }); @@ -429,6 +419,7 @@ class Innertube { details.unsubscribe = () => Actions.engage(this, 'subscription/unsubscribe', { channel_id: details.metadata.channel_id }); details.comment = (text) => Actions.engage(this, 'comment/create_comment', { video_id, text }); details.getComments = () => this.getComments(video_id); + details.getLivechat = () => new Livechat(this, continuation.data.contents?.twoColumnWatchNextResults?.conversationBar?.liveChatRenderer?.continuations?.find((continuation) => continuation.reloadContinuationData).reloadContinuationData.continuation, details.metadata.channel_id, video_id); details.changeNotificationPreferences = (type) => Actions.notifications(this, 'modify_channel_preference', { channel_id: details.metadata.channel_id, pref: type || 'NONE' }); return details; diff --git a/lib/Livechat.js b/lib/Livechat.js index b8e7cc80..e4063f67 100644 --- a/lib/Livechat.js +++ b/lib/Livechat.js @@ -6,6 +6,10 @@ const EventEmitter = require('events'); class Livechat extends EventEmitter { constructor(session, token, channel_id, video_id) { super(session); + + if (!token) + throw new Error('Could not retrieve livechat data'); + this.ctoken = token; this.session = session; this.video_id = video_id; @@ -16,7 +20,7 @@ class Livechat extends EventEmitter { this.poll_intervals_ms = 1000; this.running = true; - + this.#poll(); }