Skip to content

Commit 709f781

Browse files
committed
Merge branch 'SashaXser-dev' into dev
2 parents 2b696f7 + 4d6ba08 commit 709f781

File tree

4 files changed

+138
-133
lines changed

4 files changed

+138
-133
lines changed

dist/vot-min.user.js

+20-20
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/vot.user.js

+108-106
Original file line numberDiff line numberDiff line change
@@ -1574,7 +1574,7 @@ class Chaimu {
15741574
defaultDuration: 343,
15751575
minChunkSize: 5295308,
15761576
loggerLevel: 1,
1577-
version: "2.1.8",
1577+
version: "2.1.7",
15781578
});
15791579

15801580
;// ./node_modules/@vot.js/shared/dist/types/logger.js
@@ -3844,12 +3844,15 @@ async function GM_fetch(url, opts = {}) {
38443844
timeout,
38453845
headers: fetchOptions.headers || {},
38463846
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+
}, {});
38533856

38543857
const response = new Response(resp.response, {
38553858
status: resp.status,
@@ -5452,7 +5455,8 @@ class PatreonHelper extends BaseHelper {
54525455
class RedditHelper extends BaseHelper {
54535456
API_ORIGIN = "https://www.reddit.com";
54545457
async getContentUrl(videoId) {
5455-
if (this.service?.additionalData !== "old") {
5458+
if (!this.service.additionalData ||
5459+
this.service.additionalData !== "old") {
54565460
return document.querySelector("shreddit-player-2")?.src;
54575461
}
54585462
const playerEl = document.querySelector("[data-hls-url]");
@@ -5854,8 +5858,8 @@ class CoursehunterLikeHelper extends BaseHelper {
58545858
if (courseId !== undefined) {
58555859
return String(courseId);
58565860
}
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;
58595863
}
58605864
async getLessonsData(courseId) {
58615865
const lessons = window.lessons;
@@ -6073,69 +6077,46 @@ class SapHelper extends BaseHelper {
60736077
}
60746078
}
60756079

6076-
;// ./node_modules/@vot.js/ext/dist/helpers/videojs.js
6080+
;// ./node_modules/@vot.js/ext/dist/helpers/linkedin.js
60776081

60786082

60796083

6080-
class VideoJSHelper extends BaseHelper {
6081-
SUBTITLE_SOURCE = "videojs";
6082-
SUBTITLE_FORMAT = "vtt";
6084+
class LinkedinHelper extends BaseHelper {
60836085
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;
60866091
}
6087-
getVideoDataByPlayer(videoId) {
6092+
async getVideoData(videoId) {
60886093
try {
6089-
const player = VideoJSHelper.getPlayer();
6094+
const player = LinkedinHelper.getPlayer();
60906095
if (!player) {
60916096
throw new Error(`Video player doesn't have player option, videoId ${videoId}`);
60926097
}
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");
60996100
if (!videoUrl) {
61006101
throw new Error(`Failed to find video url for videoID ${videoId}`);
61016102
}
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) => ({
61056105
language: normalizeLang(track.language),
6106-
source: this.SUBTITLE_SOURCE,
6107-
format: this.SUBTITLE_FORMAT,
6106+
source: "linkedin",
6107+
format: "vtt",
61086108
url: track.src,
61096109
}));
61106110
return {
6111-
url: videoUrl.src,
6111+
url: proxyMedia(url),
61126112
duration,
61136113
subtitles,
61146114
};
61156115
}
61166116
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);
61316118
return undefined;
61326119
}
6133-
const { url, duration, subtitles } = data;
6134-
return {
6135-
url: proxyMedia(new URL(url)),
6136-
duration,
6137-
subtitles,
6138-
};
61396120
}
61406121
async getVideoId(url) {
61416122
return /\/learning\/(([^/]+)\/([^/]+))/.exec(url.pathname)?.[1];
@@ -6553,12 +6534,23 @@ class VKHelper extends BaseHelper {
65536534
return undefined;
65546535
}
65556536
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+
};
65576549
}
65586550
async getVideoData(videoId) {
65596551
const player = VKHelper.getPlayer();
65606552
if (!player) {
6561-
return this.returnBaseData(videoId);
6553+
return this.getDefault(videoId);
65626554
}
65636555
try {
65646556
const { description: descriptionHTML, duration, md_title: title, } = player.vars;
@@ -6588,7 +6580,7 @@ class VKHelper extends BaseHelper {
65886580
}
65896581
catch (err) {
65906582
Logger.error(`Failed to get VK video data, because: ${err.message}`);
6591-
return this.returnBaseData(videoId);
6583+
return this.getDefault(videoId);
65926584
}
65936585
}
65946586
async getVideoId(url) {
@@ -7179,9 +7171,8 @@ class UdemyHelper extends BaseHelper {
71797171

71807172

71817173

7182-
class CourseraHelper extends VideoJSHelper {
7174+
class CourseraHelper extends BaseHelper {
71837175
API_ORIGIN = "https://www.coursera.org/api";
7184-
SUBTITLE_SOURCE = "coursera";
71857176
async getCourseData(courseId) {
71867177
try {
71877178
const response = await this.fetch(`${this.API_ORIGIN}/onDemandCourses.v1/${courseId}`);
@@ -7193,75 +7184,74 @@ class CourseraHelper extends VideoJSHelper {
71937184
return undefined;
71947185
}
71957186
}
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;
71987204
}
71997205
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");
72027209
return undefined;
72037210
}
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;
72167216
}
72177217
let courseLang = "en";
72187218
const courseData = await this.getCourseData(courseId);
72197219
if (courseData) {
72207220
const { primaryLanguageCodes: [primaryLangauge], } = courseData;
7221-
courseLang = primaryLangauge
7222-
? normalizeLang(primaryLangauge)
7223-
: "en";
7221+
courseLang = primaryLangauge ? normalizeLang(primaryLangauge) : "en";
72247222
}
72257223
if (!availableLangs.includes(courseLang)) {
72267224
courseLang = "en";
72277225
}
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);
72317227
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+
}
72477230
return {
72487231
...(subtitleUrl
72497232
? {
72507233
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+
],
72527244
}
72537245
: {
7254-
url,
7255-
translationHelp,
7246+
url: videoUrl,
7247+
translationHelp: null,
72567248
}),
72577249
detectedLanguage: courseLang,
72587250
duration,
72597251
};
72607252
}
72617253
async getVideoId(url) {
7262-
const matched = /learn\/([^/]+)\/lecture\/([^/]+)/.exec(url.pathname) ??
7263-
/lecture\/([^/]+)\/([^/]+)/.exec(url.pathname);
7264-
return matched?.[0];
7254+
return /learn\/([^/]+)\/lecture\/([^/]+)/.exec(url.pathname)?.[0];
72657255
}
72667256
}
72677257

@@ -7278,18 +7268,18 @@ class CloudflareStreamHelper extends BaseHelper {
72787268

72797269

72807270
class DouyinHelper extends BaseHelper {
7281-
static getPlayer() {
7271+
getPlayer() {
72827272
if (typeof player === "undefined") {
72837273
return undefined;
72847274
}
72857275
return player;
72867276
}
72877277
async getVideoData(videoId) {
7288-
const xgPlayer = DouyinHelper.getPlayer();
7278+
const xgPlayer = this.getPlayer();
72897279
if (!xgPlayer) {
72907280
return undefined;
72917281
}
7292-
const { config: { url: sources, duration, lang, isLive: isStream }, } = xgPlayer;
7282+
const { url: sources, duration, lang, isLive: isStream } = xgPlayer.config;
72937283
if (!sources) {
72947284
return undefined;
72957285
}
@@ -7311,7 +7301,11 @@ class DouyinHelper extends BaseHelper {
73117301
if (pathId) {
73127302
return pathId;
73137303
}
7314-
return DouyinHelper.getPlayer()?.config.vid;
7304+
const xgPlayer = this.getPlayer();
7305+
if (!xgPlayer) {
7306+
return undefined;
7307+
}
7308+
return xgPlayer.config.vid;
73157309
}
73167310
}
73177311

@@ -7365,7 +7359,16 @@ class LoomHelper extends BaseHelper {
73657359
return undefined;
73667360
}
73677361
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+
};
73697372
}
73707373
async getVideoData(videoId) {
73717374
try {
@@ -7407,7 +7410,7 @@ class LoomHelper extends BaseHelper {
74077410
}
74087411
catch (err) {
74097412
Logger.error(`Failed to get Loom video data, because: ${err.message}`);
7410-
return this.returnBaseData(videoId);
7413+
return this.getDefault(videoId);
74117414
}
74127415
}
74137416
async getVideoId(url) {
@@ -7774,7 +7777,6 @@ async function getVideoData(service, opts = {}) {
77747777

77757778

77767779

7777-
77787780
;// ./node_modules/@vot.js/ext/dist/index.js
77797781

77807782

@@ -9618,7 +9620,7 @@ class VideoObserver {
96189620
};
96199621

96209622
handleVideoRemoved = (video) => {
9621-
if (!document.contains(video)) {
9623+
if (!video.isConnected) {
96229624
this.videoCache.delete(video);
96239625
this.onVideoRemoved.dispatch(video);
96249626
}

src/utils/VideoObserver.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ export class VideoObserver {
163163
};
164164

165165
handleVideoRemoved = (video) => {
166-
if (!document.contains(video)) {
166+
if (!video.isConnected) {
167167
this.videoCache.delete(video);
168168
this.onVideoRemoved.dispatch(video);
169169
}

0 commit comments

Comments
 (0)