@@ -6,7 +6,9 @@ import { env } from "../../config.js";
6
6
import { cleanString } from "../../sub/utils.js" ;
7
7
import { getCookie , updateCookieValues } from "../cookie/manager.js" ;
8
8
9
- const ytBase = Innertube . create ( ) . catch ( e => e ) ;
9
+ const PLAYER_REFRESH_PERIOD = 1000 * 60 * 15 ; // ms
10
+
11
+ let innertube , lastRefreshedAt ;
10
12
11
13
const codecMatch = {
12
14
h264 : {
@@ -48,11 +50,12 @@ const transformSessionData = (cookie) => {
48
50
}
49
51
50
52
const cloneInnertube = async ( customFetch ) => {
51
- const innertube = await ytBase ;
52
- if ( innertube instanceof Error ) {
53
- if ( innertube ?. message ?. endsWith ( "decipher algorithm" ) ) {
54
- return { error : "ErrorYoutubeDecipher" }
55
- } else throw innertube ;
53
+ const shouldRefreshPlayer = lastRefreshedAt + PLAYER_REFRESH_PERIOD < new Date ( ) ;
54
+ if ( ! innertube || shouldRefreshPlayer ) {
55
+ innertube = await Innertube . create ( {
56
+ fetch : customFetch
57
+ } ) ;
58
+ lastRefreshedAt = + new Date ( ) ;
56
59
}
57
60
58
61
const session = new Session (
@@ -97,13 +100,19 @@ const cloneInnertube = async (customFetch) => {
97
100
}
98
101
99
102
export default async function ( o ) {
100
- const yt = await cloneInnertube (
101
- ( input , init ) => fetch ( input , {
102
- ...init ,
103
- dispatcher : o . dispatcher
104
- } )
105
- ) ;
106
- if ( yt . error ) return yt ;
103
+ let yt ;
104
+ try {
105
+ yt = await cloneInnertube (
106
+ ( input , init ) => fetch ( input , {
107
+ ...init ,
108
+ dispatcher : o . dispatcher
109
+ } )
110
+ ) ;
111
+ } catch ( e ) {
112
+ if ( e . message ?. endsWith ( "decipher algorithm" ) ) {
113
+ return { error : "ErrorYoutubeDecipher" }
114
+ } else throw e ;
115
+ }
107
116
108
117
const quality = o . quality === "max" ? "9000" : o . quality ;
109
118
0 commit comments