@@ -83,7 +83,7 @@ class Innertube {
83
83
84
84
this . #initMethods( ) ;
85
85
} else {
86
- throw new Error ( 'Could not retrieve Innertube session due to unknown reasons ' ) ;
86
+ throw new Error ( 'No InnerTubeContext shell provided in ytconfig. ' ) ;
87
87
}
88
88
} catch ( err ) {
89
89
this . #retry_count += 1 ;
@@ -433,7 +433,95 @@ class Innertube {
433
433
434
434
return details ;
435
435
}
436
-
436
+
437
+ /**
438
+ * Gets info about a given channel. (WIP)
439
+ *
440
+ * @param {string } id - The id of the channel.
441
+ * @return {Promise.<{ title: string; description: string; metadata: object; content: object }> }
442
+ */
443
+ async getChannel ( id ) {
444
+ const response = await Actions . browse ( this , 'channel' , { browse_id : id } ) ;
445
+ if ( ! response . success ) throw new Error ( 'Could not retrieve channel info.' ) ;
446
+
447
+ const tabs = response . data . contents . twoColumnBrowseResultsRenderer . tabs ;
448
+ const metadata = response . data . metadata ;
449
+
450
+ const home_tab = tabs . find ( ( tab ) => tab . tabRenderer . title == 'Home' ) ;
451
+ const home_contents = home_tab . tabRenderer . content . sectionListRenderer . contents ;
452
+ const home_shelves = [ ] ;
453
+
454
+ home_contents . forEach ( ( content ) => {
455
+ if ( ! content . itemSectionRenderer ) return ;
456
+
457
+ const contents = content . itemSectionRenderer . contents [ 0 ] ;
458
+
459
+ const list = contents ?. shelfRenderer ?. content . horizontalListRenderer ;
460
+ if ( ! list ) return ; // For now we'll support only videos & playlists; TODO: Handle featured channels
461
+
462
+ const shelf = {
463
+ title : contents . shelfRenderer . title . runs [ 0 ] . text ,
464
+ content : [ ]
465
+ } ;
466
+
467
+ shelf . content = list . items . map ( ( item ) => {
468
+ const renderer = item . gridVideoRenderer || item . gridPlaylistRenderer ;
469
+ if ( renderer . videoId ) {
470
+ return {
471
+ id : renderer ?. videoId ,
472
+ title : renderer ?. title ?. simpleText ,
473
+ metadata : {
474
+ view_count : renderer ?. viewCountText ?. simpleText || 'N/A' ,
475
+ short_view_count_text : {
476
+ simple_text : renderer ?. shortViewCountText ?. simpleText || 'N/A' ,
477
+ accessibility_label : renderer ?. shortViewCountText ?. accessibility ?. accessibilityData ?. label || 'N/A' ,
478
+ } ,
479
+ thumbnail : renderer ?. thumbnail ?. thumbnails ?. slice ( - 1 ) [ 0 ] || { } ,
480
+ moving_thumbnail : renderer ?. richThumbnail ?. movingThumbnailRenderer ?. movingThumbnailDetails ?. thumbnails [ 0 ] || { } ,
481
+ published : renderer ?. publishedTimeText ?. simpleText || 'N/A' ,
482
+ badges : renderer ?. badges ?. map ( ( badge ) => badge . metadataBadgeRenderer . label ) || [ ] ,
483
+ owner_badges : renderer ?. ownerBadges ?. map ( ( badge ) => badge . metadataBadgeRenderer . tooltip ) || [ ]
484
+ }
485
+ }
486
+ } else {
487
+ return {
488
+ id : renderer ?. playlistId ,
489
+ title : renderer ?. title ?. runs ?. map ( ( run ) => run . text ) . join ( '' ) ,
490
+ metadata : {
491
+ thumbnail : renderer ?. thumbnail ?. thumbnails ?. slice ( - 1 ) [ 0 ] || { } ,
492
+ video_count : renderer ?. videoCountShortText ?. simpleText || 'N/A' ,
493
+ }
494
+ }
495
+ }
496
+ } ) ;
497
+ home_shelves . push ( shelf ) ;
498
+ } ) ;
499
+
500
+ return {
501
+ title : metadata . channelMetadataRenderer . title ,
502
+ description : metadata . channelMetadataRenderer . description ,
503
+ metadata : {
504
+ url : metadata . channelMetadataRenderer ?. channelUrl ,
505
+ rss_urls : metadata . channelMetadataRenderer ?. rssUrl ,
506
+ vanity_channel_url : metadata . channelMetadataRenderer ?. vanityChannelUrl ,
507
+ external_id : metadata . channelMetadataRenderer ?. externalId ,
508
+ is_family_safe : metadata . channelMetadataRenderer ?. isFamilySafe ,
509
+ keywords : metadata . channelMetadataRenderer ?. keywords
510
+ } ,
511
+ content : {
512
+ // Home page of the channel, always available in the first request.
513
+ home_page : home_shelves ,
514
+
515
+ // Functions— these will need additional requests and will possibly use the parser.
516
+ getVideos : ( ) => { } ,
517
+ getPlaylists : ( ) => { } ,
518
+ getCommunity : ( ) => { } ,
519
+ getChannels : ( ) => { } ,
520
+ getAbout : ( ) => { }
521
+ }
522
+ }
523
+ }
524
+
437
525
/**
438
526
* Retrieves the lyrics for a given song if available.
439
527
*
0 commit comments