diff --git a/README.md b/README.md index 634ffc07..5d7a5885 100644 --- a/README.md +++ b/README.md @@ -542,6 +542,8 @@ Retrieves contents for a given channel. - `#getVideos()` - `#getShorts()` - `#getLiveStreams()` +- `#getReleases()` +- `#getPodcasts()` - `#getPlaylists()` - `#getHome()` - `#getCommunity()` diff --git a/src/parser/classes/Playlist.ts b/src/parser/classes/Playlist.ts index d29fe1b7..1a4c23d2 100644 --- a/src/parser/classes/Playlist.ts +++ b/src/parser/classes/Playlist.ts @@ -1,6 +1,7 @@ import { YTNode, type ObservedArray } from '../helpers.js'; import Parser, { type RawNode } from '../index.js'; import NavigationEndpoint from './NavigationEndpoint.js'; +import PlaylistCustomThumbnail from './PlaylistCustomThumbnail.js'; import PlaylistVideoThumbnail from './PlaylistVideoThumbnail.js'; import Author from './misc/Author.js'; import Text from './misc/Text.js'; @@ -13,7 +14,7 @@ export default class Playlist extends YTNode { title: Text; author: Text | Author; thumbnails: Thumbnail[]; - thumbnail_renderer?: PlaylistVideoThumbnail; + thumbnail_renderer?: PlaylistVideoThumbnail | PlaylistCustomThumbnail; video_count: Text; video_count_short: Text; first_videos: ObservedArray; @@ -44,7 +45,7 @@ export default class Playlist extends YTNode { this.thumbnail_overlays = Parser.parseArray(data.thumbnailOverlays); if (Reflect.has(data, 'thumbnailRenderer')) { - this.thumbnail_renderer = Parser.parseItem(data.thumbnailRenderer, PlaylistVideoThumbnail) || undefined; + this.thumbnail_renderer = Parser.parseItem(data.thumbnailRenderer, [ PlaylistVideoThumbnail, PlaylistCustomThumbnail ]) || undefined; } if (Reflect.has(data, 'viewPlaylistText')) { diff --git a/src/parser/youtube/Channel.ts b/src/parser/youtube/Channel.ts index b4930250..1152ce6f 100644 --- a/src/parser/youtube/Channel.ts +++ b/src/parser/youtube/Channel.ts @@ -163,6 +163,16 @@ export default class Channel extends TabbedFeed { return new Channel(this.actions, tab.page, true); } + async getReleases(): Promise { + const tab = await this.getTabByURL('releases'); + return new Channel(this.actions, tab.page, true); + } + + async getPodcasts(): Promise { + const tab = await this.getTabByURL('podcasts'); + return new Channel(this.actions, tab.page, true); + } + async getPlaylists(): Promise { const tab = await this.getTabByURL('playlists'); return new Channel(this.actions, tab.page, true); @@ -217,6 +227,14 @@ export default class Channel extends TabbedFeed { return this.hasTabWithURL('streams'); } + get has_releases(): boolean { + return this.hasTabWithURL('releases'); + } + + get has_podcasts(): boolean { + return this.hasTabWithURL('podcasts'); + } + get has_playlists(): boolean { return this.hasTabWithURL('playlists'); }