Skip to content

Commit

Permalink
feat: added support rt news
Browse files Browse the repository at this point in the history
  • Loading branch information
ilyhalight committed Jan 7, 2025
1 parent fe54e5c commit 7f996fb
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 0 deletions.
1 change: 1 addition & 0 deletions packages/core/src/types/service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ export enum VideoService {
dzen = "dzen",
cloudflarestream = "cloudflarestream",
loom = "loom",
rtnews = "rtnews",
}

export type ServiceConf<T = VideoService> = {
Expand Down
3 changes: 3 additions & 0 deletions packages/ext/src/helpers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ import CloudflareStreamHelper from "./cloudflarestream";
import DouyinHelper from "./douyin";
import LoomHelper from "./loom";
import ArtstationHelper from "./artstation";
import RtNewsHelper from "./rtnews";

export * as MailRuHelper from "./mailru";
export * as WeverseHelper from "./weverse";
Expand Down Expand Up @@ -102,6 +103,7 @@ export * as CloudflareStreamHelper from "./cloudflarestream";
export * as DouyinHelper from "./douyin";
export * as LoomHelper from "./loom";
export * as ArtstationHelper from "./artstation";
export * as RtNewsHelper from "./rtnews";

export const availableHelpers = {
[CoreVideoService.mailru]: MailRuHelper,
Expand Down Expand Up @@ -154,6 +156,7 @@ export const availableHelpers = {
[CoreVideoService.dzen]: DzenHelper,
[CoreVideoService.cloudflarestream]: CloudflareStreamHelper,
[CoreVideoService.loom]: LoomHelper,
[CoreVideoService.rtnews]: RtNewsHelper,
[ExtVideoService.udemy]: UdemyHelper,
[ExtVideoService.coursera]: CourseraHelper,
[ExtVideoService.douyin]: DouyinHelper,
Expand Down
34 changes: 34 additions & 0 deletions packages/ext/src/helpers/rtnews.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { BaseHelper } from "./base";
import { MinimalVideoData } from "../types/client";

import { proxyMedia } from "@vot.js/shared/utils/utils";

export default class RtNewsHelper extends BaseHelper {
// eslint-disable-next-line @typescript-eslint/require-await
async getVideoData(videoId: string): Promise<MinimalVideoData | undefined> {
const videoEl = document.querySelector(".jw-video, .media__video_noscript");
if (!videoEl) {
return undefined;
}

let videoSrc = videoEl.getAttribute("src");
if (!videoSrc) {
return undefined;
}

// yandex has case sensitive check of video format
if (videoSrc.endsWith(".MP4")) {
videoSrc = proxyMedia(videoSrc);
}

return {
videoId,
url: videoSrc,
};
}

// eslint-disable-next-line @typescript-eslint/require-await
async getVideoId(url: URL) {
return url.pathname.slice(1);
}
}
3 changes: 3 additions & 0 deletions packages/node/src/helpers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ import YoutubeHelper from "./youtube";
import DzenHelper from "./dzen";
import CloudflareStreamHelper from "./cloudflarestream";
import LoomHelper from "./loom";
import RtNewsHelper from "./rtnews";

export * as MailRuHelper from "./mailru";
export * as WeverseHelper from "./weverse";
Expand Down Expand Up @@ -94,6 +95,7 @@ export * as YoutubeHelper from "./youtube";
export * as DzenHelper from "./dzen";
export * as CloudflareStreamHelper from "./cloudflarestream";
export * as LoomHelper from "./loom";
export * as RtNewsHelper from "./rtnews";

export const availableHelpers = {
[CoreVideoService.mailru]: MailRuHelper,
Expand Down Expand Up @@ -146,6 +148,7 @@ export const availableHelpers = {
[CoreVideoService.dzen]: DzenHelper,
[CoreVideoService.cloudflarestream]: CloudflareStreamHelper,
[CoreVideoService.loom]: LoomHelper,
[CoreVideoService.rtnews]: RtNewsHelper,
};

export type AvailableVideoHelpers = typeof availableHelpers;
Expand Down
49 changes: 49 additions & 0 deletions packages/node/src/helpers/rtnews.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { parseFromString } from "dom-parser";

import { BaseHelper } from "./base";
import { MinimalVideoData } from "../types/client";

import Logger from "@vot.js/shared/utils/logger";
import { proxyMedia } from "@vot.js/shared/utils/utils";

export default class RtNewsHelper extends BaseHelper {
async getVideoData(videoId: string): Promise<MinimalVideoData | undefined> {
try {
const res = await this.fetch(this.service?.url + videoId);
const content = await res.text();

const doc = parseFromString(content.replace(/<!DOCTYPE html>/i, ""));
const videoEl = doc.getElementsByClassName("media__video_noscript")?.[0];
if (!videoEl) {
return undefined;
}

let videoSrc = videoEl.getAttribute("src");
if (!videoSrc) {
return undefined;
}

// yandex has case sensitive check of video format
if (videoSrc.endsWith(".MP4")) {
videoSrc = proxyMedia(videoSrc);
}

return {
videoId,
url: videoSrc,
};
} catch (err) {
Logger.error(
`Failed to get rt news video data by video ID: ${videoId}, because: ${
(err as Error).message
}`,
);
return undefined;
}
}

// eslint-disable-next-line @typescript-eslint/require-await
async getVideoId(url: URL) {
return url.pathname.slice(1);
}
}

0 comments on commit 7f996fb

Please sign in to comment.