1
1
import axios from "axios" ;
2
+ import { Logger } from "./logger" ;
2
3
import { innerTubeVideoDetails } from "../types/innerTubeApi.model" ;
4
+ import DiskCache from "./diskCache" ;
3
5
4
- export async function getPlayerData ( videoID : string ) : Promise < innerTubeVideoDetails > {
6
+ async function getFromITube ( videoID : string ) : Promise < innerTubeVideoDetails > {
5
7
// start subrequest
6
8
const url = "https://www.youtube.com/youtubei/v1/player" ;
7
9
const data = {
@@ -21,4 +23,36 @@ export async function getPlayerData(videoID: string): Promise<innerTubeVideoDeta
21
23
} else {
22
24
return Promise . reject ( result . status ) ;
23
25
}
26
+ }
27
+
28
+ export async function getPlayerData ( videoID : string , ignoreCache = false ) : Promise < innerTubeVideoDetails > {
29
+ if ( ! videoID || videoID . length !== 11 || videoID . includes ( "." ) ) {
30
+ return Promise . reject ( "Invalid video ID" ) ;
31
+ }
32
+
33
+ const cacheKey = `yt.itube.video.${ videoID } ` ;
34
+ if ( ! ignoreCache ) { // try fetching from cache
35
+ try {
36
+ const data = await DiskCache . get ( cacheKey ) ;
37
+ if ( data ) {
38
+ Logger . debug ( `InnerTube API: cache used for video information: ${ videoID } ` ) ;
39
+ return data as innerTubeVideoDetails ;
40
+ }
41
+ } catch ( err ) {
42
+ return Promise . reject ( err ) ;
43
+ }
44
+ }
45
+ try {
46
+ const data = await getFromITube ( videoID )
47
+ . catch ( err => {
48
+ Logger . warn ( `InnerTube API Error for ${ videoID } : ${ err } ` ) ;
49
+ return Promise . reject ( err ) ;
50
+ } ) ;
51
+ DiskCache . set ( cacheKey , data )
52
+ . then ( ( ) => Logger . debug ( `InnerTube API: video information cache set for: ${ videoID } ` ) )
53
+ . catch ( ( err : any ) => Logger . warn ( err ) ) ;
54
+ return data ;
55
+ } catch ( err ) {
56
+ return Promise . reject ( err ) ;
57
+ }
24
58
}
0 commit comments