youtubei 0.0.1-rc.8 → 1.0.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +50 -53
- package/dist/cjs/classes/Base/Base.js +10 -0
- package/dist/cjs/classes/Base/index.js +13 -0
- package/dist/cjs/classes/BaseChannel/BaseChannel.js +31 -0
- package/dist/cjs/classes/BaseChannel/BaseChannelParser.js +24 -0
- package/dist/cjs/classes/BaseChannel/ChannelPlaylists.js +57 -0
- package/dist/cjs/classes/BaseChannel/ChannelVideos.js +57 -0
- package/dist/cjs/classes/BaseChannel/index.js +16 -0
- package/dist/cjs/classes/BaseVideo/BaseVideo.js +34 -0
- package/dist/cjs/classes/BaseVideo/BaseVideoParser.js +82 -0
- package/dist/cjs/classes/BaseVideo/VideoRelated.js +39 -0
- package/dist/cjs/classes/BaseVideo/index.js +15 -0
- package/dist/cjs/classes/Channel/Channel.js +24 -0
- package/dist/cjs/classes/Channel/ChannelParser.js +55 -0
- package/dist/cjs/classes/Channel/index.js +14 -0
- package/dist/cjs/classes/Chat/Chat.js +23 -0
- package/dist/cjs/classes/Chat/ChatParser.js +21 -0
- package/dist/cjs/classes/Chat/index.js +14 -0
- package/dist/cjs/classes/Client/Client.js +101 -0
- package/dist/cjs/classes/Client/HTTP.js +59 -0
- package/dist/cjs/classes/Client/index.js +13 -0
- package/dist/cjs/classes/Comment/Comment.js +29 -0
- package/dist/cjs/classes/Comment/CommentParser.js +43 -0
- package/dist/cjs/classes/Comment/CommentReplies.js +36 -0
- package/dist/cjs/classes/Comment/index.js +15 -0
- package/dist/cjs/classes/Continuable/Continuable.js +43 -0
- package/dist/cjs/classes/Continuable/index.js +13 -0
- package/dist/cjs/classes/LiveVideo/LiveVideo.js +84 -0
- package/dist/cjs/classes/LiveVideo/LiveVideoParser.js +29 -0
- package/dist/cjs/classes/LiveVideo/index.js +14 -0
- package/dist/cjs/classes/MixPlaylist/MixPlaylist.js +25 -0
- package/dist/cjs/classes/MixPlaylist/MixPlaylistParser.js +27 -0
- package/dist/cjs/classes/MixPlaylist/index.js +14 -0
- package/dist/cjs/classes/Playlist/Playlist.js +25 -0
- package/dist/cjs/classes/Playlist/PlaylistParser.js +83 -0
- package/dist/cjs/classes/Playlist/PlaylistVideos.js +50 -0
- package/dist/cjs/classes/Playlist/index.js +15 -0
- package/dist/cjs/classes/PlaylistCompact/PlaylistCompact.js +45 -0
- package/dist/cjs/classes/PlaylistCompact/PlaylistCompactParser.js +28 -0
- package/dist/cjs/classes/PlaylistCompact/index.js +14 -0
- package/dist/cjs/classes/Reply/Reply.js +23 -0
- package/dist/cjs/classes/Reply/ReplyParser.js +26 -0
- package/dist/cjs/classes/Reply/index.js +14 -0
- package/dist/cjs/classes/SearchResult/SearchResult.js +85 -0
- package/dist/cjs/classes/SearchResult/SearchResultParser.js +40 -0
- package/dist/cjs/classes/SearchResult/index.js +14 -0
- package/dist/cjs/classes/SearchResult/proto/SearchProto.js +2 -0
- package/dist/cjs/classes/SearchResult/proto/index.js +57 -0
- package/dist/{classes → cjs/classes/Thumbnails}/Thumbnails.js +67 -50
- package/dist/cjs/classes/Thumbnails/index.js +13 -0
- package/dist/cjs/classes/Video/Video.js +26 -0
- package/dist/cjs/classes/Video/VideoComments.js +53 -0
- package/dist/cjs/classes/Video/VideoParser.js +29 -0
- package/dist/cjs/classes/Video/index.js +15 -0
- package/dist/cjs/classes/VideoCompact/VideoCompact.js +49 -0
- package/dist/cjs/classes/VideoCompact/VideoCompactParser.js +36 -0
- package/dist/cjs/classes/VideoCompact/index.js +14 -0
- package/dist/cjs/classes/index.js +29 -0
- package/dist/{common → cjs/common}/decorators.js +14 -15
- package/dist/cjs/common/helper.js +45 -0
- package/dist/{common → cjs/common}/index.js +16 -23
- package/dist/{common → cjs/common}/mixins.js +14 -12
- package/dist/{common → cjs/common}/types.js +2 -2
- package/dist/{constants.js → cjs/constants.js} +10 -10
- package/dist/{index.js → cjs/index.js} +13 -13
- package/dist/esm/classes/Base/Base.js +8 -0
- package/dist/esm/classes/Base/index.js +1 -0
- package/dist/esm/classes/BaseChannel/BaseChannel.js +48 -0
- package/dist/esm/classes/BaseChannel/BaseChannelParser.js +24 -0
- package/dist/esm/classes/BaseChannel/ChannelPlaylists.js +109 -0
- package/dist/esm/classes/BaseChannel/ChannelVideos.js +109 -0
- package/dist/esm/classes/BaseChannel/index.js +4 -0
- package/dist/esm/classes/BaseVideo/BaseVideo.js +51 -0
- package/dist/esm/classes/BaseVideo/BaseVideoParser.js +93 -0
- package/dist/esm/classes/BaseVideo/VideoRelated.js +87 -0
- package/dist/esm/classes/BaseVideo/index.js +3 -0
- package/dist/esm/classes/Channel/Channel.js +37 -0
- package/dist/esm/classes/Channel/ChannelParser.js +77 -0
- package/dist/esm/classes/Channel/index.js +2 -0
- package/dist/esm/classes/Chat/Chat.js +36 -0
- package/dist/esm/classes/Chat/ChatParser.js +21 -0
- package/dist/esm/classes/Chat/index.js +2 -0
- package/dist/esm/classes/Client/Client.js +176 -0
- package/dist/esm/classes/Client/HTTP.js +112 -0
- package/dist/esm/classes/Client/index.js +1 -0
- package/dist/esm/classes/Comment/Comment.js +46 -0
- package/dist/esm/classes/Comment/CommentParser.js +45 -0
- package/dist/esm/classes/Comment/CommentReplies.js +84 -0
- package/dist/esm/classes/Comment/index.js +3 -0
- package/dist/esm/classes/Continuable/Continuable.js +125 -0
- package/dist/esm/classes/Continuable/index.js +1 -0
- package/dist/esm/classes/LiveVideo/LiveVideo.js +160 -0
- package/dist/esm/classes/LiveVideo/LiveVideoParser.js +29 -0
- package/dist/esm/classes/LiveVideo/index.js +2 -0
- package/dist/esm/classes/MixPlaylist/MixPlaylist.js +38 -0
- package/dist/esm/classes/MixPlaylist/MixPlaylistParser.js +49 -0
- package/dist/esm/classes/MixPlaylist/index.js +2 -0
- package/dist/esm/classes/Playlist/Playlist.js +38 -0
- package/dist/esm/classes/Playlist/PlaylistParser.js +105 -0
- package/dist/esm/classes/Playlist/PlaylistVideos.js +98 -0
- package/dist/esm/classes/Playlist/index.js +3 -0
- package/dist/esm/classes/PlaylistCompact/PlaylistCompact.js +90 -0
- package/dist/esm/classes/PlaylistCompact/PlaylistCompactParser.js +28 -0
- package/dist/esm/classes/PlaylistCompact/index.js +2 -0
- package/dist/esm/classes/Reply/Reply.js +36 -0
- package/dist/esm/classes/Reply/ReplyParser.js +26 -0
- package/dist/esm/classes/Reply/index.js +2 -0
- package/dist/esm/classes/SearchResult/SearchResult.js +161 -0
- package/dist/esm/classes/SearchResult/SearchResultParser.js +62 -0
- package/dist/esm/classes/SearchResult/index.js +2 -0
- package/dist/esm/classes/SearchResult/proto/SearchProto.js +1 -0
- package/dist/esm/classes/SearchResult/proto/index.js +39 -0
- package/dist/esm/classes/Thumbnails/Thumbnails.js +109 -0
- package/dist/esm/classes/Thumbnails/index.js +1 -0
- package/dist/esm/classes/Video/Video.js +39 -0
- package/dist/esm/classes/Video/VideoComments.js +101 -0
- package/dist/esm/classes/Video/VideoParser.js +31 -0
- package/dist/esm/classes/Video/index.js +3 -0
- package/dist/esm/classes/VideoCompact/VideoCompact.js +98 -0
- package/dist/esm/classes/VideoCompact/VideoCompactParser.js +36 -0
- package/dist/esm/classes/VideoCompact/index.js +2 -0
- package/dist/esm/classes/index.js +17 -0
- package/dist/esm/common/decorators.js +30 -0
- package/dist/esm/common/helper.js +61 -0
- package/dist/esm/common/index.js +4 -0
- package/dist/esm/common/mixins.js +10 -0
- package/dist/esm/common/types.js +1 -0
- package/dist/esm/constants.js +7 -0
- package/dist/esm/index.js +1 -0
- package/dist/typings/classes/Base/Base.d.ts +11 -0
- package/dist/typings/classes/Base/index.d.ts +1 -0
- package/dist/typings/classes/BaseChannel/BaseChannel.d.ts +43 -0
- package/dist/typings/classes/BaseChannel/BaseChannelParser.d.ts +7 -0
- package/dist/typings/classes/BaseChannel/ChannelPlaylists.d.ts +30 -0
- package/dist/typings/classes/BaseChannel/ChannelVideos.d.ts +30 -0
- package/dist/typings/classes/BaseChannel/index.d.ts +4 -0
- package/dist/typings/classes/BaseVideo/BaseVideo.d.ts +59 -0
- package/dist/typings/classes/BaseVideo/BaseVideoParser.d.ts +14 -0
- package/dist/typings/classes/BaseVideo/VideoRelated.d.ts +21 -0
- package/dist/typings/classes/BaseVideo/index.d.ts +3 -0
- package/dist/typings/classes/Channel/Channel.d.ts +33 -0
- package/dist/typings/classes/Channel/ChannelParser.d.ts +6 -0
- package/dist/typings/classes/Channel/index.d.ts +2 -0
- package/dist/typings/classes/Chat/Chat.d.ts +33 -0
- package/dist/typings/classes/Chat/ChatParser.d.ts +5 -0
- package/dist/typings/classes/Chat/index.d.ts +2 -0
- package/dist/typings/classes/Client/Client.d.ts +41 -0
- package/dist/typings/classes/Client/HTTP.d.ts +21 -0
- package/dist/typings/classes/Client/index.d.ts +1 -0
- package/dist/typings/classes/Comment/Comment.d.ts +51 -0
- package/dist/typings/classes/Comment/CommentParser.d.ts +8 -0
- package/dist/typings/classes/Comment/CommentReplies.d.ts +17 -0
- package/dist/typings/classes/Comment/index.d.ts +3 -0
- package/dist/typings/classes/Continuable/Continuable.d.ts +24 -0
- package/dist/typings/classes/Continuable/index.d.ts +1 -0
- package/dist/typings/classes/LiveVideo/LiveVideo.d.ts +46 -0
- package/dist/typings/classes/LiveVideo/LiveVideoParser.d.ts +10 -0
- package/dist/typings/classes/LiveVideo/index.d.ts +2 -0
- package/dist/typings/classes/MixPlaylist/MixPlaylist.d.ts +29 -0
- package/dist/typings/classes/MixPlaylist/MixPlaylistParser.d.ts +6 -0
- package/dist/typings/classes/MixPlaylist/index.d.ts +2 -0
- package/dist/typings/classes/Playlist/Playlist.d.ts +39 -0
- package/dist/typings/classes/Playlist/PlaylistParser.d.ts +16 -0
- package/dist/typings/classes/Playlist/PlaylistVideos.d.ts +31 -0
- package/dist/typings/classes/Playlist/index.d.ts +3 -0
- package/dist/typings/classes/PlaylistCompact/PlaylistCompact.d.ts +43 -0
- package/dist/typings/classes/PlaylistCompact/PlaylistCompactParser.d.ts +5 -0
- package/dist/typings/classes/PlaylistCompact/index.d.ts +2 -0
- package/dist/typings/classes/Reply/Reply.d.ts +43 -0
- package/dist/typings/classes/Reply/ReplyParser.d.ts +5 -0
- package/dist/typings/classes/Reply/index.d.ts +2 -0
- package/dist/typings/classes/SearchResult/SearchResult.d.ts +53 -0
- package/dist/typings/classes/SearchResult/SearchResultParser.d.ts +13 -0
- package/dist/typings/classes/SearchResult/index.d.ts +2 -0
- package/dist/typings/classes/SearchResult/proto/SearchProto.d.ts +13 -0
- package/dist/typings/classes/SearchResult/proto/index.d.ts +24 -0
- package/dist/typings/classes/Thumbnails/Thumbnails.d.ts +41 -0
- package/dist/typings/classes/Thumbnails/index.d.ts +1 -0
- package/dist/typings/classes/Video/Video.d.ts +24 -0
- package/dist/typings/classes/Video/VideoComments.d.ts +34 -0
- package/dist/typings/classes/Video/VideoParser.d.ts +8 -0
- package/dist/typings/classes/Video/index.d.ts +3 -0
- package/dist/typings/classes/VideoCompact/VideoCompact.d.ts +57 -0
- package/dist/typings/classes/VideoCompact/VideoCompactParser.d.ts +5 -0
- package/dist/typings/classes/VideoCompact/index.d.ts +2 -0
- package/dist/typings/classes/index.d.ts +17 -0
- package/dist/{common → typings/common}/decorators.d.ts +5 -7
- package/dist/typings/common/helper.d.ts +5 -0
- package/dist/typings/common/index.d.ts +4 -0
- package/dist/typings/common/mixins.d.ts +1 -0
- package/dist/{common → typings/common}/types.d.ts +1 -2
- package/dist/{constants.d.ts → typings/constants.d.ts} +7 -7
- package/dist/{index.d.ts → typings/index.d.ts} +1 -1
- package/package.json +68 -53
- package/CHANGELOG.md +0 -6
- package/dist/classes/Base.d.ts +0 -8
- package/dist/classes/Base.js +0 -10
- package/dist/classes/Channel.d.ts +0 -63
- package/dist/classes/Channel.js +0 -115
- package/dist/classes/Chat.d.ts +0 -35
- package/dist/classes/Chat.js +0 -34
- package/dist/classes/Client.d.ts +0 -17
- package/dist/classes/Client.js +0 -59
- package/dist/classes/Comment.d.ts +0 -51
- package/dist/classes/Comment.js +0 -47
- package/dist/classes/LiveVideo.d.ts +0 -20
- package/dist/classes/LiveVideo.js +0 -59
- package/dist/classes/Playlist.d.ts +0 -66
- package/dist/classes/Playlist.js +0 -133
- package/dist/classes/PlaylistCompact.d.ts +0 -35
- package/dist/classes/PlaylistCompact.js +0 -47
- package/dist/classes/SearchResult.d.ts +0 -51
- package/dist/classes/SearchResult.js +0 -121
- package/dist/classes/Thumbnails.d.ts +0 -26
- package/dist/classes/Video.d.ts +0 -90
- package/dist/classes/Video.js +0 -153
- package/dist/classes/VideoCompact.d.ts +0 -46
- package/dist/classes/VideoCompact.js +0 -53
- package/dist/classes/index.d.ts +0 -12
- package/dist/classes/index.js +0 -30
- package/dist/common/helper.d.ts +0 -4
- package/dist/common/helper.js +0 -39
- package/dist/common/http.d.ts +0 -33
- package/dist/common/http.js +0 -105
- package/dist/common/index.d.ts +0 -5
- package/dist/common/mixins.d.ts +0 -2
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Comment } from "../Comment";
|
|
2
|
+
import { Continuable, ContinuableConstructorParams, FetchResult } from "../Continuable";
|
|
3
|
+
import { Video } from "./Video";
|
|
4
|
+
declare type ConstructorParams = ContinuableConstructorParams & {
|
|
5
|
+
video: Video;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* {@link Continuable} of videos inside a {@link Video}
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```js
|
|
12
|
+
* const video = await youtube.getVideo(VIDEO_ID);
|
|
13
|
+
* await video.comments.next();
|
|
14
|
+
* console.log(video.comments) // first 20 comments
|
|
15
|
+
*
|
|
16
|
+
* let newComments = await video.comments.next();
|
|
17
|
+
* console.log(newComments) // 20 loaded comments
|
|
18
|
+
* console.log(video.comments) // first 40 comments
|
|
19
|
+
*
|
|
20
|
+
* await video.comments.next(0); // load the rest of the comments in the video
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* @param count How many times to load the next comments. Set 0 to load all comments (might take a while on a video with many comments!)
|
|
24
|
+
*
|
|
25
|
+
* @returns Loaded comments
|
|
26
|
+
*/
|
|
27
|
+
export declare class VideoComments extends Continuable<Comment> {
|
|
28
|
+
/** The playlist this videos belongs to */
|
|
29
|
+
video: Video;
|
|
30
|
+
/** @hidden */
|
|
31
|
+
constructor({ client, video }: ConstructorParams);
|
|
32
|
+
protected fetch(): Promise<FetchResult<Comment>>;
|
|
33
|
+
}
|
|
34
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { YoutubeRawData } from "../../common";
|
|
2
|
+
import { Comment } from "../Comment";
|
|
3
|
+
import { Video } from "./Video";
|
|
4
|
+
export declare class VideoParser {
|
|
5
|
+
static loadVideo(target: Video, data: YoutubeRawData): Video;
|
|
6
|
+
static parseComments(data: YoutubeRawData, video: Video): Comment[];
|
|
7
|
+
static parseCommentContinuation(data: YoutubeRawData): string | undefined;
|
|
8
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { YoutubeRawData } from "../../common";
|
|
2
|
+
import { Base, BaseProperties } from "../Base";
|
|
3
|
+
import { BaseChannel } from "../BaseChannel";
|
|
4
|
+
import { LiveVideo } from "../LiveVideo";
|
|
5
|
+
import { Thumbnails } from "../Thumbnails";
|
|
6
|
+
import { Video } from "../Video";
|
|
7
|
+
/** @hidden */
|
|
8
|
+
interface VideoCompactProperties extends BaseProperties {
|
|
9
|
+
id?: string;
|
|
10
|
+
title?: string;
|
|
11
|
+
thumbnails?: Thumbnails;
|
|
12
|
+
duration?: number | null;
|
|
13
|
+
isLive?: boolean;
|
|
14
|
+
channel?: BaseChannel;
|
|
15
|
+
uploadDate?: string;
|
|
16
|
+
viewCount?: number | null;
|
|
17
|
+
}
|
|
18
|
+
/** Represent a compact video (e.g. from search result, playlist's videos, channel's videos) */
|
|
19
|
+
export declare class VideoCompact extends Base implements VideoCompactProperties {
|
|
20
|
+
id: string;
|
|
21
|
+
/** The title of the video */
|
|
22
|
+
title: string;
|
|
23
|
+
/** Thumbnails of the video with different sizes */
|
|
24
|
+
thumbnails: Thumbnails;
|
|
25
|
+
/** Description of the video (not a full description, rather a preview / snippet) */
|
|
26
|
+
description: string;
|
|
27
|
+
/** The duration of this video in second, null if the video is live */
|
|
28
|
+
duration: number | null;
|
|
29
|
+
/** Whether this video is a live now or not */
|
|
30
|
+
isLive: boolean;
|
|
31
|
+
/** The channel who uploads this video */
|
|
32
|
+
channel?: BaseChannel;
|
|
33
|
+
/** The date this video is uploaded at */
|
|
34
|
+
uploadDate?: string;
|
|
35
|
+
/** How many view does this video have, null if the view count is hidden */
|
|
36
|
+
viewCount?: number | null;
|
|
37
|
+
/** @hidden */
|
|
38
|
+
constructor(attr: VideoCompactProperties);
|
|
39
|
+
/** Whether this video is private / deleted or not, only useful in playlist's videos */
|
|
40
|
+
get isPrivateOrDeleted(): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Load this instance with raw data from Youtube
|
|
43
|
+
*
|
|
44
|
+
* @hidden
|
|
45
|
+
*/
|
|
46
|
+
load(data: YoutubeRawData): VideoCompact;
|
|
47
|
+
/**
|
|
48
|
+
* Get {@link Video} object based on current video id
|
|
49
|
+
*
|
|
50
|
+
* Equivalent to
|
|
51
|
+
* ```js
|
|
52
|
+
* client.getVideo(videoCompact.id);
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
getVideo<T extends Video | LiveVideo>(): Promise<T>;
|
|
56
|
+
}
|
|
57
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export * from "./Base";
|
|
2
|
+
export * from "./BaseChannel";
|
|
3
|
+
export * from "./BaseVideo";
|
|
4
|
+
export * from "./Channel";
|
|
5
|
+
export * from "./Chat";
|
|
6
|
+
export * from "./Client";
|
|
7
|
+
export * from "./Comment";
|
|
8
|
+
export * from "./Continuable";
|
|
9
|
+
export * from "./LiveVideo";
|
|
10
|
+
export * from "./MixPlaylist";
|
|
11
|
+
export * from "./Playlist";
|
|
12
|
+
export * from "./PlaylistCompact";
|
|
13
|
+
export * from "./Reply";
|
|
14
|
+
export * from "./SearchResult";
|
|
15
|
+
export * from "./Thumbnails";
|
|
16
|
+
export * from "./Video";
|
|
17
|
+
export * from "./VideoCompact";
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export declare function extendsBuiltIn(): (target: Constructor<any>) => any;
|
|
7
|
-
export {};
|
|
1
|
+
interface Constructor<T> {
|
|
2
|
+
new (...args: any[]): T;
|
|
3
|
+
}
|
|
4
|
+
export declare function extendsBuiltIn(): (target: Constructor<any>) => any;
|
|
5
|
+
export {};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { YoutubeRawData } from "./types";
|
|
2
|
+
export declare const getDuration: (s: string) => number;
|
|
3
|
+
export declare const stripToInt: (string: string) => number | null;
|
|
4
|
+
export declare const getContinuationFromItems: (items: YoutubeRawData, accessors?: string[]) => string | undefined;
|
|
5
|
+
export declare const mapFilter: (items: YoutubeRawData, key: string) => YoutubeRawData;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const applyMixins: (derivedCtor: any, baseCtors: any[]) => void;
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export declare type YoutubeRawData = Record<string, any>;
|
|
1
|
+
export declare type YoutubeRawData = Record<string, any>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export declare const INNERTUBE_CLIENT_VERSION = "2.20201209.01.00";
|
|
2
|
-
export declare const INNERTUBE_API_KEY = "AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8";
|
|
3
|
-
export declare const BASE_URL = "www.youtube.com";
|
|
4
|
-
export declare const I_END_POINT = "/youtubei/v1";
|
|
5
|
-
export declare const LIVE_CHAT_END_POINT: string;
|
|
6
|
-
export declare const WATCH_END_POINT = "/watch";
|
|
7
|
-
export declare const COMMENT_END_POINT = "/comment_service_ajax";
|
|
1
|
+
export declare const INNERTUBE_CLIENT_VERSION = "2.20201209.01.00";
|
|
2
|
+
export declare const INNERTUBE_API_KEY = "AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8";
|
|
3
|
+
export declare const BASE_URL = "www.youtube.com";
|
|
4
|
+
export declare const I_END_POINT = "/youtubei/v1";
|
|
5
|
+
export declare const LIVE_CHAT_END_POINT: string;
|
|
6
|
+
export declare const WATCH_END_POINT = "/watch";
|
|
7
|
+
export declare const COMMENT_END_POINT = "/comment_service_ajax";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from "./classes";
|
|
1
|
+
export * from "./classes";
|
package/package.json
CHANGED
|
@@ -1,53 +1,68 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "youtubei",
|
|
3
|
-
"version": "0.0
|
|
4
|
-
"description": "Simple package to get information from youtube such as videos, playlists, channels, video information & comments, related videos, up next video, and more!",
|
|
5
|
-
"main": "dist/index.js",
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
"devDependencies": {
|
|
12
|
-
"@
|
|
13
|
-
"@types/node": "
|
|
14
|
-
"@
|
|
15
|
-
"@typescript-eslint/
|
|
16
|
-
"eslint": "
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
"
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
"
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "youtubei",
|
|
3
|
+
"version": "1.0.0-rc.2",
|
|
4
|
+
"description": "Simple package to get information from youtube such as videos, playlists, channels, video information & comments, related videos, up next video, and more!",
|
|
5
|
+
"main": "dist/cjs/index.js",
|
|
6
|
+
"module": "dist/esm/index.js",
|
|
7
|
+
"types": "dist/typings/index.d.ts",
|
|
8
|
+
"directories": {
|
|
9
|
+
"test": "test"
|
|
10
|
+
},
|
|
11
|
+
"devDependencies": {
|
|
12
|
+
"@trivago/prettier-plugin-sort-imports": "3.2.0",
|
|
13
|
+
"@types/node": "14.14.12",
|
|
14
|
+
"@types/node-fetch": "2.6.2",
|
|
15
|
+
"@typescript-eslint/eslint-plugin": "4.9.1",
|
|
16
|
+
"@typescript-eslint/parser": "4.9.1",
|
|
17
|
+
"c8": "7.11.3",
|
|
18
|
+
"eslint": "7.15.0",
|
|
19
|
+
"eslint-plugin-prettier": "3.2.0",
|
|
20
|
+
"jest-extended": "0.11.5",
|
|
21
|
+
"prettier": "2.2.1",
|
|
22
|
+
"rimraf": "3.0.2",
|
|
23
|
+
"typescript": "4.1.2",
|
|
24
|
+
"vite": "2.9.14",
|
|
25
|
+
"vitest": "0.18.0"
|
|
26
|
+
},
|
|
27
|
+
"scripts": {
|
|
28
|
+
"dev": "tsc -w --noEmit",
|
|
29
|
+
"test": "vitest",
|
|
30
|
+
"test:coverage": "vitest run --coverage",
|
|
31
|
+
"build": "pnpm clean && pnpm build:cjs && pnpm build:esm && pnpm build:types",
|
|
32
|
+
"build:cjs": "tsc -p ./typescript/tsconfig.cjs.json",
|
|
33
|
+
"build:esm": "tsc -p ./typescript/tsconfig.esm.json",
|
|
34
|
+
"build:types": "tsc -p ./typescript/tsconfig.types.json",
|
|
35
|
+
"clean": "rimraf ./dist",
|
|
36
|
+
"lint:check": "eslint src && prettier -c src tests",
|
|
37
|
+
"lint:fix": "eslint --fix && prettier --write src tests"
|
|
38
|
+
},
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "git+https://github.com/SuspiciousLookingOwl/youtubei.git"
|
|
42
|
+
},
|
|
43
|
+
"keywords": [
|
|
44
|
+
"youtube",
|
|
45
|
+
"yt",
|
|
46
|
+
"search",
|
|
47
|
+
"video",
|
|
48
|
+
"videos",
|
|
49
|
+
"playlist",
|
|
50
|
+
"channel",
|
|
51
|
+
"related",
|
|
52
|
+
"comment",
|
|
53
|
+
"comments",
|
|
54
|
+
"live",
|
|
55
|
+
"chat",
|
|
56
|
+
"live chat"
|
|
57
|
+
],
|
|
58
|
+
"author": "Vincent Jonathan",
|
|
59
|
+
"license": "MIT",
|
|
60
|
+
"bugs": {
|
|
61
|
+
"url": "https://github.com/SuspiciousLookingOwl/youtubei/issues"
|
|
62
|
+
},
|
|
63
|
+
"homepage": "https://suspiciouslookingowl.github.io/youtubei",
|
|
64
|
+
"dependencies": {
|
|
65
|
+
"node-fetch": "2.6.7",
|
|
66
|
+
"protocol-buffers": "5.0.0"
|
|
67
|
+
}
|
|
68
|
+
}
|
package/CHANGELOG.md
DELETED
package/dist/classes/Base.d.ts
DELETED
package/dist/classes/Base.js
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { YoutubeRawData } from "../common";
|
|
2
|
-
import { Base, PlaylistCompact, Thumbnails, VideoCompact } from ".";
|
|
3
|
-
/** @hidden */
|
|
4
|
-
interface ChannelAttributes {
|
|
5
|
-
id: string;
|
|
6
|
-
name: string;
|
|
7
|
-
url: string;
|
|
8
|
-
thumbnails: Thumbnails;
|
|
9
|
-
videoCount?: number;
|
|
10
|
-
}
|
|
11
|
-
/** Represents a Youtube Channel */
|
|
12
|
-
export default class Channel extends Base implements ChannelAttributes {
|
|
13
|
-
/** The channel's ID */
|
|
14
|
-
id: string;
|
|
15
|
-
/** The channel's name */
|
|
16
|
-
name: string;
|
|
17
|
-
/** The URL to the channel page */
|
|
18
|
-
url: string;
|
|
19
|
-
/** Thumbnails of the Channel with different sizes */
|
|
20
|
-
thumbnails: Thumbnails;
|
|
21
|
-
/** How many video does this channel have */
|
|
22
|
-
videoCount?: number;
|
|
23
|
-
/** Loaded videos on the channel, fetched from `channel.nextVideos()` */
|
|
24
|
-
videos: VideoCompact[];
|
|
25
|
-
/** Loaded playlists on the channel, fetched from `channel.nextPlaylists()` */
|
|
26
|
-
playlists: PlaylistCompact[];
|
|
27
|
-
private _videoContinuation?;
|
|
28
|
-
private _playlistContinuation?;
|
|
29
|
-
/** @hidden */
|
|
30
|
-
constructor(channel?: Partial<ChannelAttributes>);
|
|
31
|
-
/**
|
|
32
|
-
* Load next 30 videos made by the channel
|
|
33
|
-
*
|
|
34
|
-
* @return New fetched videos
|
|
35
|
-
*/
|
|
36
|
-
nextVideos(count?: number): Promise<VideoCompact[]>;
|
|
37
|
-
/**
|
|
38
|
-
* Load next 30 playlists made by the channel
|
|
39
|
-
*
|
|
40
|
-
* @return New fetched playlists
|
|
41
|
-
*/
|
|
42
|
-
nextPlaylists(count?: number): Promise<PlaylistCompact[]>;
|
|
43
|
-
/**
|
|
44
|
-
* Load instance attributes from youtube raw data
|
|
45
|
-
*
|
|
46
|
-
* @param youtubeRawData raw object from youtubei
|
|
47
|
-
* @hidden
|
|
48
|
-
*/
|
|
49
|
-
load(youtubeRawData: YoutubeRawData): Channel;
|
|
50
|
-
/**
|
|
51
|
-
* Get tab data from youtube
|
|
52
|
-
*/
|
|
53
|
-
private getTabData;
|
|
54
|
-
/**
|
|
55
|
-
* Parse tab data from request, tab name is ignored if it's a continuation data
|
|
56
|
-
*/
|
|
57
|
-
private static parseTabData;
|
|
58
|
-
/**
|
|
59
|
-
* Get continuation token from items (if exists)
|
|
60
|
-
*/
|
|
61
|
-
private static getContinuationFromItems;
|
|
62
|
-
}
|
|
63
|
-
export {};
|
package/dist/classes/Channel.js
DELETED
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
const common_1 = require("../common");
|
|
13
|
-
const _1 = require(".");
|
|
14
|
-
const constants_1 = require("../constants");
|
|
15
|
-
/** Represents a Youtube Channel */
|
|
16
|
-
class Channel extends _1.Base {
|
|
17
|
-
/** @hidden */
|
|
18
|
-
constructor(channel = {}) {
|
|
19
|
-
super();
|
|
20
|
-
this._videoContinuation = null;
|
|
21
|
-
this._playlistContinuation = null;
|
|
22
|
-
Object.assign(this, channel);
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Load next 30 videos made by the channel
|
|
26
|
-
*
|
|
27
|
-
* @return New fetched videos
|
|
28
|
-
*/
|
|
29
|
-
nextVideos(count = 1) {
|
|
30
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
31
|
-
const newVideos = [];
|
|
32
|
-
for (let i = 0; i < count || count == 0; i++) {
|
|
33
|
-
if (this._videoContinuation === undefined)
|
|
34
|
-
break;
|
|
35
|
-
const items = yield this.getTabData("videos");
|
|
36
|
-
this._videoContinuation = Channel.getContinuationFromItems(items);
|
|
37
|
-
newVideos.push(...items
|
|
38
|
-
.filter((i) => i.gridVideoRenderer)
|
|
39
|
-
.map((i) => new _1.VideoCompact().load(i.gridVideoRenderer)));
|
|
40
|
-
}
|
|
41
|
-
this.videos.push(...newVideos);
|
|
42
|
-
return newVideos;
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Load next 30 playlists made by the channel
|
|
47
|
-
*
|
|
48
|
-
* @return New fetched playlists
|
|
49
|
-
*/
|
|
50
|
-
nextPlaylists(count = 1) {
|
|
51
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
52
|
-
const newPlaylists = [];
|
|
53
|
-
for (let i = 0; i < count || count == 0; i++) {
|
|
54
|
-
if (this._playlistContinuation === undefined)
|
|
55
|
-
break;
|
|
56
|
-
const items = yield this.getTabData("playlists");
|
|
57
|
-
this._playlistContinuation = Channel.getContinuationFromItems(items);
|
|
58
|
-
newPlaylists.push(...items
|
|
59
|
-
.filter((i) => i.gridPlaylistRenderer)
|
|
60
|
-
.map((i) => new _1.PlaylistCompact().load(i.gridPlaylistRenderer)));
|
|
61
|
-
}
|
|
62
|
-
this.playlists.push(...newPlaylists);
|
|
63
|
-
return newPlaylists;
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Load instance attributes from youtube raw data
|
|
68
|
-
*
|
|
69
|
-
* @param youtubeRawData raw object from youtubei
|
|
70
|
-
* @hidden
|
|
71
|
-
*/
|
|
72
|
-
load(youtubeRawData) {
|
|
73
|
-
var _a;
|
|
74
|
-
const { channelId, title, thumbnail, videoCountText, navigationEndpoint } = youtubeRawData;
|
|
75
|
-
const { browseId, canonicalBaseUrl } = navigationEndpoint.browseEndpoint;
|
|
76
|
-
this.id = channelId;
|
|
77
|
-
this.name = title.simpleText;
|
|
78
|
-
this.thumbnails = new _1.Thumbnails().load(thumbnail.thumbnails);
|
|
79
|
-
this.url = "https://www.youtube.com" + (canonicalBaseUrl || `/channel/${browseId}`);
|
|
80
|
-
this.videoCount = (_a = +(videoCountText === null || videoCountText === void 0 ? void 0 : videoCountText.runs[0].text.replace(/[^0-9]/g, ""))) !== null && _a !== void 0 ? _a : 0;
|
|
81
|
-
this.videos = [];
|
|
82
|
-
this.playlists = [];
|
|
83
|
-
return this;
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Get tab data from youtube
|
|
87
|
-
*/
|
|
88
|
-
getTabData(name) {
|
|
89
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
90
|
-
const params = name === "videos" ? "EgZ2aWRlb3M%3D" : "EglwbGF5bGlzdHMgAQ%3D%3D";
|
|
91
|
-
const continuation = name === "videos" ? this._videoContinuation : this._playlistContinuation;
|
|
92
|
-
const response = yield common_1.http.post(`${constants_1.I_END_POINT}/browse`, {
|
|
93
|
-
data: { browseId: this.id, params, continuation },
|
|
94
|
-
});
|
|
95
|
-
return Channel.parseTabData(name, response.data);
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Parse tab data from request, tab name is ignored if it's a continuation data
|
|
100
|
-
*/
|
|
101
|
-
static parseTabData(name, data) {
|
|
102
|
-
var _a;
|
|
103
|
-
const index = name === "videos" ? 1 : 2;
|
|
104
|
-
return (((_a = data.contents) === null || _a === void 0 ? void 0 : _a.twoColumnBrowseResultsRenderer.tabs[index].tabRenderer.content.sectionListRenderer.contents[0].itemSectionRenderer.contents[0].gridRenderer.items) ||
|
|
105
|
-
data.onResponseReceivedActions[0].appendContinuationItemsAction.continuationItems);
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Get continuation token from items (if exists)
|
|
109
|
-
*/
|
|
110
|
-
static getContinuationFromItems(items) {
|
|
111
|
-
var _a;
|
|
112
|
-
return (_a = items[items.length - 1].continuationItemRenderer) === null || _a === void 0 ? void 0 : _a.continuationEndpoint.continuationCommand.token;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
exports.default = Channel;
|
package/dist/classes/Chat.d.ts
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { Base, Channel, Video } from ".";
|
|
2
|
-
import { YoutubeRawData } from "../common";
|
|
3
|
-
/** @hidden */
|
|
4
|
-
interface ChatAttributes {
|
|
5
|
-
id: string;
|
|
6
|
-
video: Video;
|
|
7
|
-
author: Channel;
|
|
8
|
-
message: string;
|
|
9
|
-
timestamp: number;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Represents a Comment / Reply
|
|
13
|
-
*/
|
|
14
|
-
export default class Chat extends Base implements ChatAttributes {
|
|
15
|
-
/** The comment's ID */
|
|
16
|
-
id: string;
|
|
17
|
-
/** The video this chat belongs to */
|
|
18
|
-
video: Video;
|
|
19
|
-
/** The comment's author */
|
|
20
|
-
author: Channel;
|
|
21
|
-
/** The message of this chat */
|
|
22
|
-
message: string;
|
|
23
|
-
/** Timestamp in usec / microsecond */
|
|
24
|
-
timestamp: number;
|
|
25
|
-
/** @hidden */
|
|
26
|
-
constructor(chat?: Partial<ChatAttributes>);
|
|
27
|
-
/**
|
|
28
|
-
* Load instance attributes from youtube raw data
|
|
29
|
-
*
|
|
30
|
-
* @param youtubeRawData raw object from youtubei
|
|
31
|
-
* @hidden
|
|
32
|
-
*/
|
|
33
|
-
load(data: YoutubeRawData): Chat;
|
|
34
|
-
}
|
|
35
|
-
export {};
|
package/dist/classes/Chat.js
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const _1 = require(".");
|
|
4
|
-
/**
|
|
5
|
-
* Represents a Comment / Reply
|
|
6
|
-
*/
|
|
7
|
-
class Chat extends _1.Base {
|
|
8
|
-
/** @hidden */
|
|
9
|
-
constructor(chat = {}) {
|
|
10
|
-
super();
|
|
11
|
-
Object.assign(this, chat);
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Load instance attributes from youtube raw data
|
|
15
|
-
*
|
|
16
|
-
* @param youtubeRawData raw object from youtubei
|
|
17
|
-
* @hidden
|
|
18
|
-
*/
|
|
19
|
-
load(data) {
|
|
20
|
-
const { id, message, authorName, authorPhoto, timestampUsec, authorExternalChannelId, } = data;
|
|
21
|
-
// Basic information
|
|
22
|
-
this.id = id;
|
|
23
|
-
this.message = message.runs.map((r) => r.text).join("");
|
|
24
|
-
this.author = new _1.Channel({
|
|
25
|
-
id: authorExternalChannelId,
|
|
26
|
-
name: authorName.simpleText,
|
|
27
|
-
thumbnails: authorPhoto.thumbnails,
|
|
28
|
-
url: `https://www.youtube.com/channel/${authorExternalChannelId}`,
|
|
29
|
-
});
|
|
30
|
-
this.timestamp = timestampUsec;
|
|
31
|
-
return this;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
exports.default = Chat;
|
package/dist/classes/Client.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { Playlist, Video, SearchResult, LiveVideo } from ".";
|
|
2
|
-
import { SearchResultType } from "./SearchResult";
|
|
3
|
-
export declare type SearchType = "video" | "channel" | "playlist" | "all";
|
|
4
|
-
export declare type SearchOptions = {
|
|
5
|
-
type: SearchType;
|
|
6
|
-
};
|
|
7
|
-
/** Youtube Client */
|
|
8
|
-
export default class Client {
|
|
9
|
-
/** Searches for videos / playlists / channels */
|
|
10
|
-
search<T extends SearchOptions>(query: string, searchOptions?: Partial<T>): Promise<SearchResult<T>>;
|
|
11
|
-
/** Search for videos / playlists / channels and returns the first result */
|
|
12
|
-
findOne<T extends SearchOptions>(query: string, searchOptions?: Partial<T>): Promise<SearchResultType<T> | undefined>;
|
|
13
|
-
/** Get playlist information and its videos by playlist id or URL */
|
|
14
|
-
getPlaylist(playlistIdOrUrl: string): Promise<Playlist | undefined>;
|
|
15
|
-
/** Get video information by video id or URL */
|
|
16
|
-
getVideo(videoIdOrUrl: string): Promise<Video | LiveVideo | undefined>;
|
|
17
|
-
}
|