diff --git a/src/core/TabbedFeed.ts b/src/core/TabbedFeed.ts index 80a59fff..78cf6294 100644 --- a/src/core/TabbedFeed.ts +++ b/src/core/TabbedFeed.ts @@ -47,6 +47,10 @@ class TabbedFeed extends Feed { return new TabbedFeed(this.#actions, response.data, false); } + hasTabWithURL(url: string): boolean { + return this.#tabs.some((tab) => tab.endpoint.metadata.url?.split('/').pop() === url); + } + get title(): string | undefined { return this.page.contents_memo.getType(Tab)?.find((tab) => tab.selected)?.title.toString(); } diff --git a/src/parser/youtube/Channel.ts b/src/parser/youtube/Channel.ts index 7d1b3ab5..9057b0bd 100644 --- a/src/parser/youtube/Channel.ts +++ b/src/parser/youtube/Channel.ts @@ -196,6 +196,26 @@ export default class Channel extends TabbedFeed { return new Channel(this.actions, page, true); } + get has_videos(): boolean { + return this.hasTabWithURL('videos'); + } + + get has_shorts(): boolean { + return this.hasTabWithURL('shorts'); + } + + get has_live_streams(): boolean { + return this.hasTabWithURL('streams'); + } + + get has_playlists(): boolean { + return this.hasTabWithURL('playlists'); + } + + get has_community(): boolean { + return this.hasTabWithURL('community'); + } + /** * Retrives list continuation. */ diff --git a/test/constants.ts b/test/constants.ts index 4e138b62..c7706265 100644 --- a/test/constants.ts +++ b/test/constants.ts @@ -37,5 +37,9 @@ export const CHANNELS = [ { ID: 'UCpbpfcZfo-hoDAx2m1blFhg', NAME: 'Learning Blocks' + }, + { + ID: 'UCt-oJR5teQIjOAxCmIQvcgA', + NAME: "They're Just Movies" } ]; \ No newline at end of file diff --git a/test/main.test.ts b/test/main.test.ts index bc1d41e5..b25e8edf 100644 --- a/test/main.test.ts +++ b/test/main.test.ts @@ -163,6 +163,15 @@ describe('YouTube.js Tests', () => { expect(filtered_list.videos.length).toBeGreaterThan(0); }); + it('should detect missing channel tabs', async () => { + const channel = await yt.getChannel(CHANNELS[2].ID); + expect(channel.has_videos).toBe(true); + expect(channel.has_shorts).toBe(false); + expect(channel.has_live_streams).toBe(false); + expect(channel.has_playlists).toBe(true); + expect(channel.has_community).toBe(true); + }) + it('should retrieve home feed', async () => { const homefeed = await yt.getHomeFeed(); expect(homefeed.header).toBeDefined();