@@ -1574,7 +1574,7 @@ class Chaimu {
1574
1574
defaultDuration : 343 ,
1575
1575
minChunkSize : 5295308 ,
1576
1576
loggerLevel : 1 ,
1577
- version : "2.1.8 " ,
1577
+ version : "2.1.7 " ,
1578
1578
} ) ;
1579
1579
1580
1580
; // ./node_modules/@vot .js/shared/dist/types/logger.js
@@ -3844,12 +3844,15 @@ async function GM_fetch(url, opts = {}) {
3844
3844
timeout,
3845
3845
headers : fetchOptions . headers || { } ,
3846
3846
onload : ( resp ) => {
3847
- const headers = Object . fromEntries (
3848
- resp . responseHeaders . split ( / \r ? \n / ) . flatMap ( ( line ) => {
3849
- const match = / ^ ( [ \w - ] + ) : ( .+ ) $ / . exec ( line ) ;
3850
- return match ? [ [ match [ 1 ] , match [ 2 ] ] ] : [ ] ;
3851
- } ) ,
3852
- ) ;
3847
+ const headers = resp . responseHeaders
3848
+ . split ( / \r ? \n / )
3849
+ . reduce ( ( acc , line ) => {
3850
+ const [ , key , value ] = line . match ( / ^ ( [ \w - ] + ) : ( .+ ) $ / ) || [ ] ;
3851
+ if ( key ) {
3852
+ acc [ key ] = value ;
3853
+ }
3854
+ return acc ;
3855
+ } , { } ) ;
3853
3856
3854
3857
const response = new Response ( resp . response , {
3855
3858
status : resp . status ,
@@ -5452,7 +5455,8 @@ class PatreonHelper extends BaseHelper {
5452
5455
class RedditHelper extends BaseHelper {
5453
5456
API_ORIGIN = "https://www.reddit.com" ;
5454
5457
async getContentUrl ( videoId ) {
5455
- if ( this . service ?. additionalData !== "old" ) {
5458
+ if ( ! this . service . additionalData ||
5459
+ this . service . additionalData !== "old" ) {
5456
5460
return document . querySelector ( "shreddit-player-2" ) ?. src ;
5457
5461
}
5458
5462
const playerEl = document . querySelector ( "[data-hls-url]" ) ;
@@ -5854,8 +5858,8 @@ class CoursehunterLikeHelper extends BaseHelper {
5854
5858
if ( courseId !== undefined ) {
5855
5859
return String ( courseId ) ;
5856
5860
}
5857
- return document . querySelector ( 'input[name="course_id"]' )
5858
- ? .value ;
5861
+ const inputEl = document . querySelector ( 'input[name="course_id"]' ) ;
5862
+ return inputEl ? inputEl . value : undefined ;
5859
5863
}
5860
5864
async getLessonsData ( courseId ) {
5861
5865
const lessons = window . lessons ;
@@ -6073,69 +6077,46 @@ class SapHelper extends BaseHelper {
6073
6077
}
6074
6078
}
6075
6079
6076
- ; // ./node_modules/@vot .js/ext/dist/helpers/videojs .js
6080
+ ; // ./node_modules/@vot .js/ext/dist/helpers/linkedin .js
6077
6081
6078
6082
6079
6083
6080
- class VideoJSHelper extends BaseHelper {
6081
- SUBTITLE_SOURCE = "videojs" ;
6082
- SUBTITLE_FORMAT = "vtt" ;
6084
+ class LinkedinHelper extends BaseHelper {
6083
6085
static getPlayer ( ) {
6084
- return document . querySelector ( ".video-js" )
6085
- ?. player ;
6086
+ const videoEl = document . querySelector ( ".video-js" ) ;
6087
+ if ( ! videoEl ) {
6088
+ return undefined ;
6089
+ }
6090
+ return videoEl . player ;
6086
6091
}
6087
- getVideoDataByPlayer ( videoId ) {
6092
+ async getVideoData ( videoId ) {
6088
6093
try {
6089
- const player = VideoJSHelper . getPlayer ( ) ;
6094
+ const player = LinkedinHelper . getPlayer ( ) ;
6090
6095
if ( ! player ) {
6091
6096
throw new Error ( `Video player doesn't have player option, videoId ${ videoId } ` ) ;
6092
6097
}
6093
- const duration = player . duration ( ) ;
6094
- const sources = Array . isArray ( player . currentSources )
6095
- ? player . currentSources
6096
- : player . getCache ( ) ?. sources ;
6097
- const { tracks_ : tracks } = player . textTracks ( ) ;
6098
- const videoUrl = sources . find ( ( source ) => source . type === "video/mp4" || source . type === "video/webm" ) ;
6098
+ const { cache_ : { sources, duration } , textTracks_ : { tracks_ } , } = player ;
6099
+ const videoUrl = sources . find ( ( source ) => source . type === "video/mp4" ) ;
6099
6100
if ( ! videoUrl ) {
6100
6101
throw new Error ( `Failed to find video url for videoID ${ videoId } ` ) ;
6101
6102
}
6102
- const subtitles = tracks
6103
- . filter ( ( track ) => track . src )
6104
- . map ( ( track ) => ( {
6103
+ const url = new URL ( videoUrl . src ) ;
6104
+ const subtitles = tracks_ . map ( ( track ) => ( {
6105
6105
language : normalizeLang ( track . language ) ,
6106
- source : this . SUBTITLE_SOURCE ,
6107
- format : this . SUBTITLE_FORMAT ,
6106
+ source : "linkedin" ,
6107
+ format : "vtt" ,
6108
6108
url : track . src ,
6109
6109
} ) ) ;
6110
6110
return {
6111
- url : videoUrl . src ,
6111
+ url : proxyMedia ( url ) ,
6112
6112
duration,
6113
6113
subtitles,
6114
6114
} ;
6115
6115
}
6116
6116
catch ( err ) {
6117
- Logger . error ( "Failed to get videojs video data" , err . message ) ;
6118
- return undefined ;
6119
- }
6120
- }
6121
- }
6122
-
6123
- ; // ./node_modules/@vot .js/ext/dist/helpers/linkedin.js
6124
-
6125
-
6126
- class LinkedinHelper extends VideoJSHelper {
6127
- SUBTITLE_SOURCE = "linkedin" ;
6128
- async getVideoData ( videoId ) {
6129
- const data = this . getVideoDataByPlayer ( videoId ) ;
6130
- if ( ! data ) {
6117
+ Logger . error ( "Failed to get linkedin video data" , err . message ) ;
6131
6118
return undefined ;
6132
6119
}
6133
- const { url, duration, subtitles } = data ;
6134
- return {
6135
- url : proxyMedia ( new URL ( url ) ) ,
6136
- duration,
6137
- subtitles,
6138
- } ;
6139
6120
}
6140
6121
async getVideoId ( url ) {
6141
6122
return / \/ l e a r n i n g \/ ( ( [ ^ / ] + ) \/ ( [ ^ / ] + ) ) / . exec ( url . pathname ) ?. [ 1 ] ;
@@ -6553,12 +6534,23 @@ class VKHelper extends BaseHelper {
6553
6534
return undefined ;
6554
6535
}
6555
6536
const videoView = Videoview ;
6556
- return videoView ?. getPlayerObject ?. call ( undefined ) ;
6537
+ return videoView . getPlayerObject
6538
+ ? videoView . getPlayerObject . call ( undefined )
6539
+ : undefined ;
6540
+ }
6541
+ getDefault ( videoId ) {
6542
+ if ( ! this . service ) {
6543
+ return undefined ;
6544
+ }
6545
+ return {
6546
+ url : this . service . url + videoId ,
6547
+ duration : undefined ,
6548
+ } ;
6557
6549
}
6558
6550
async getVideoData ( videoId ) {
6559
6551
const player = VKHelper . getPlayer ( ) ;
6560
6552
if ( ! player ) {
6561
- return this . returnBaseData ( videoId ) ;
6553
+ return this . getDefault ( videoId ) ;
6562
6554
}
6563
6555
try {
6564
6556
const { description : descriptionHTML , duration, md_title : title , } = player . vars ;
@@ -6588,7 +6580,7 @@ class VKHelper extends BaseHelper {
6588
6580
}
6589
6581
catch ( err ) {
6590
6582
Logger . error ( `Failed to get VK video data, because: ${ err . message } ` ) ;
6591
- return this . returnBaseData ( videoId ) ;
6583
+ return this . getDefault ( videoId ) ;
6592
6584
}
6593
6585
}
6594
6586
async getVideoId ( url ) {
@@ -7179,9 +7171,8 @@ class UdemyHelper extends BaseHelper {
7179
7171
7180
7172
7181
7173
7182
- class CourseraHelper extends VideoJSHelper {
7174
+ class CourseraHelper extends BaseHelper {
7183
7175
API_ORIGIN = "https://www.coursera.org/api" ;
7184
- SUBTITLE_SOURCE = "coursera" ;
7185
7176
async getCourseData ( courseId ) {
7186
7177
try {
7187
7178
const response = await this . fetch ( `${ this . API_ORIGIN } /onDemandCourses.v1/${ courseId } ` ) ;
@@ -7193,75 +7184,74 @@ class CourseraHelper extends VideoJSHelper {
7193
7184
return undefined ;
7194
7185
}
7195
7186
}
7196
- static getPlayer ( ) {
7197
- return super . getPlayer ( ) ;
7187
+ getPlayer ( ) {
7188
+ return document . querySelector ( ".vjs-v8" ) ;
7189
+ }
7190
+ getPlayerData ( ) {
7191
+ return this . getPlayer ( ) ?. player ;
7192
+ }
7193
+ findVideoUrl ( sources ) {
7194
+ return sources ?. find ( ( src ) => src . type === "video/mp4" ) ?. src ;
7195
+ }
7196
+ findSubtitleUrl ( captions , detectedLanguage ) {
7197
+ let subtitle = captions ?. find ( ( caption ) => normalizeLang ( caption . srclang ) === detectedLanguage ) ;
7198
+ if ( ! subtitle ) {
7199
+ subtitle =
7200
+ captions ?. find ( ( caption ) => normalizeLang ( caption . srclang ) === "en" ) ||
7201
+ captions ?. [ 0 ] ;
7202
+ }
7203
+ return subtitle ?. src ;
7198
7204
}
7199
7205
async getVideoData ( videoId ) {
7200
- const data = this . getVideoDataByPlayer ( videoId ) ;
7201
- if ( ! data ) {
7206
+ const playerData = this . getPlayerData ( ) ;
7207
+ if ( ! playerData ) {
7208
+ Logger . error ( "Failed to find player data" ) ;
7202
7209
return undefined ;
7203
7210
}
7204
- const { options_ : options } = CourseraHelper . getPlayer ( ) ?? { } ;
7205
- if ( ! data . subtitles ?. length && options ) {
7206
- data . subtitles = options . tracks . map ( ( track ) => ( {
7207
- url : track . src ,
7208
- language : normalizeLang ( track . srclang ) ,
7209
- source : this . SUBTITLE_SOURCE ,
7210
- format : this . SUBTITLE_FORMAT ,
7211
- } ) ) ;
7212
- }
7213
- const courseId = options ?. courseId ;
7214
- if ( ! courseId ) {
7215
- return data ;
7211
+ const { cache_ : { duration } , options_ : { courseId, tracks, sources } , } = playerData ;
7212
+ const videoUrl = this . findVideoUrl ( sources ) ;
7213
+ if ( ! videoUrl ) {
7214
+ Logger . error ( "Failed to find .mp4 video file in sources" , sources ) ;
7215
+ return undefined ;
7216
7216
}
7217
7217
let courseLang = "en" ;
7218
7218
const courseData = await this . getCourseData ( courseId ) ;
7219
7219
if ( courseData ) {
7220
7220
const { primaryLanguageCodes : [ primaryLangauge ] , } = courseData ;
7221
- courseLang = primaryLangauge
7222
- ? normalizeLang ( primaryLangauge )
7223
- : "en" ;
7221
+ courseLang = primaryLangauge ? normalizeLang ( primaryLangauge ) : "en" ;
7224
7222
}
7225
7223
if ( ! availableLangs . includes ( courseLang ) ) {
7226
7224
courseLang = "en" ;
7227
7225
}
7228
- const subtitleItem = data . subtitles . find ( ( subtitle ) => subtitle . language === courseLang ) ??
7229
- data . subtitles ?. [ 0 ] ;
7230
- const subtitleUrl = subtitleItem ?. url ;
7226
+ const subtitleUrl = this . findSubtitleUrl ( tracks , courseLang ) ;
7231
7227
if ( ! subtitleUrl ) {
7232
- Logger . warn ( "Failed to find any subtitle file" ) ;
7233
- }
7234
- const { url, duration } = data ;
7235
- const translationHelp = subtitleUrl
7236
- ? [
7237
- {
7238
- target : "subtitles_file_url" ,
7239
- targetUrl : subtitleUrl ,
7240
- } ,
7241
- {
7242
- target : "video_file_url" ,
7243
- targetUrl : url ,
7244
- } ,
7245
- ]
7246
- : null ;
7228
+ Logger . warn ( "Failed to find subtitle file in tracks" , tracks ) ;
7229
+ }
7247
7230
return {
7248
7231
...( subtitleUrl
7249
7232
? {
7250
7233
url : this . service ?. url + videoId ,
7251
- translationHelp,
7234
+ translationHelp : [
7235
+ {
7236
+ target : "subtitles_file_url" ,
7237
+ targetUrl : subtitleUrl ,
7238
+ } ,
7239
+ {
7240
+ target : "video_file_url" ,
7241
+ targetUrl : videoUrl ,
7242
+ } ,
7243
+ ] ,
7252
7244
}
7253
7245
: {
7254
- url,
7255
- translationHelp,
7246
+ url : videoUrl ,
7247
+ translationHelp : null ,
7256
7248
} ) ,
7257
7249
detectedLanguage : courseLang ,
7258
7250
duration,
7259
7251
} ;
7260
7252
}
7261
7253
async getVideoId ( url ) {
7262
- const matched = / l e a r n \/ ( [ ^ / ] + ) \/ l e c t u r e \/ ( [ ^ / ] + ) / . exec ( url . pathname ) ??
7263
- / l e c t u r e \/ ( [ ^ / ] + ) \/ ( [ ^ / ] + ) / . exec ( url . pathname ) ;
7264
- return matched ?. [ 0 ] ;
7254
+ return / l e a r n \/ ( [ ^ / ] + ) \/ l e c t u r e \/ ( [ ^ / ] + ) / . exec ( url . pathname ) ?. [ 0 ] ;
7265
7255
}
7266
7256
}
7267
7257
@@ -7278,18 +7268,18 @@ class CloudflareStreamHelper extends BaseHelper {
7278
7268
7279
7269
7280
7270
class DouyinHelper extends BaseHelper {
7281
- static getPlayer ( ) {
7271
+ getPlayer ( ) {
7282
7272
if ( typeof player === "undefined" ) {
7283
7273
return undefined ;
7284
7274
}
7285
7275
return player ;
7286
7276
}
7287
7277
async getVideoData ( videoId ) {
7288
- const xgPlayer = DouyinHelper . getPlayer ( ) ;
7278
+ const xgPlayer = this . getPlayer ( ) ;
7289
7279
if ( ! xgPlayer ) {
7290
7280
return undefined ;
7291
7281
}
7292
- const { config : { url : sources , duration, lang, isLive : isStream } , } = xgPlayer ;
7282
+ const { url : sources , duration, lang, isLive : isStream } = xgPlayer . config ;
7293
7283
if ( ! sources ) {
7294
7284
return undefined ;
7295
7285
}
@@ -7311,7 +7301,11 @@ class DouyinHelper extends BaseHelper {
7311
7301
if ( pathId ) {
7312
7302
return pathId ;
7313
7303
}
7314
- return DouyinHelper . getPlayer ( ) ?. config . vid ;
7304
+ const xgPlayer = this . getPlayer ( ) ;
7305
+ if ( ! xgPlayer ) {
7306
+ return undefined ;
7307
+ }
7308
+ return xgPlayer . config . vid ;
7315
7309
}
7316
7310
}
7317
7311
@@ -7365,7 +7359,16 @@ class LoomHelper extends BaseHelper {
7365
7359
return undefined ;
7366
7360
}
7367
7361
const release = SENTRY_RELEASE ;
7368
- return release . id ;
7362
+ return release ?. id ;
7363
+ }
7364
+ getDefault ( videoId ) {
7365
+ if ( ! this . service ) {
7366
+ return undefined ;
7367
+ }
7368
+ return {
7369
+ url : this . service . url + videoId ,
7370
+ duration : undefined ,
7371
+ } ;
7369
7372
}
7370
7373
async getVideoData ( videoId ) {
7371
7374
try {
@@ -7407,7 +7410,7 @@ class LoomHelper extends BaseHelper {
7407
7410
}
7408
7411
catch ( err ) {
7409
7412
Logger . error ( `Failed to get Loom video data, because: ${ err . message } ` ) ;
7410
- return this . returnBaseData ( videoId ) ;
7413
+ return this . getDefault ( videoId ) ;
7411
7414
}
7412
7415
}
7413
7416
async getVideoId ( url ) {
@@ -7774,7 +7777,6 @@ async function getVideoData(service, opts = {}) {
7774
7777
7775
7778
7776
7779
7777
-
7778
7780
; // ./node_modules/@vot .js/ext/dist/index.js
7779
7781
7780
7782
@@ -9618,7 +9620,7 @@ class VideoObserver {
9618
9620
} ;
9619
9621
9620
9622
handleVideoRemoved = ( video ) => {
9621
- if ( ! document . contains ( video ) ) {
9623
+ if ( ! video . isConnected ) {
9622
9624
this . videoCache . delete ( video ) ;
9623
9625
this . onVideoRemoved . dispatch ( video ) ;
9624
9626
}
0 commit comments