mirror of
https://github.com/imputnet/cobalt.git
synced 2025-12-17 13:38:52 +00:00
add support for ok videos & clean up
This commit is contained in:
56
src/modules/processing/services/ok.js
Normal file
56
src/modules/processing/services/ok.js
Normal file
@@ -0,0 +1,56 @@
|
||||
import { genericUserAgent, maxVideoDuration } from "../../config.js";
|
||||
import { cleanString } from "../../sub/utils.js";
|
||||
|
||||
const resolutions = {
|
||||
"ultra": "2160",
|
||||
"quad": "1440",
|
||||
"full": "1080",
|
||||
"hd": "720",
|
||||
"sd": "480",
|
||||
"low": "360",
|
||||
"lowest": "240",
|
||||
"mobile": "144"
|
||||
}
|
||||
|
||||
export default async function(o) {
|
||||
let quality = o.quality === "max" ? "2160" : o.quality;
|
||||
|
||||
let html = await fetch(`https://ok.ru/video/${o.id}`, {
|
||||
headers: { "user-agent": genericUserAgent }
|
||||
}).then((r) => { return r.text() }).catch(() => { return false });
|
||||
|
||||
if (!html) return { error: 'ErrorCouldntFetch' };
|
||||
if (!html.includes(`<div data-module="OKVideo" data-options="{`)) {
|
||||
return { error: 'ErrorEmptyDownload' };
|
||||
}
|
||||
|
||||
let videoData = html.split(`<div data-module="OKVideo" data-options="`)[1].split('" data-')[0].replaceAll(""", '"');
|
||||
videoData = JSON.parse(JSON.parse(videoData).flashvars.metadata);
|
||||
|
||||
if (videoData.provider !== "UPLOADED_ODKL") return { error: 'ErrorUnsupported' };
|
||||
if (videoData.movie.is_live) return { error: 'ErrorLiveVideo' };
|
||||
if (videoData.movie.duration > maxVideoDuration / 1000) return { error: ['ErrorLengthLimit', maxVideoDuration / 60000] };
|
||||
|
||||
let videos = videoData.videos.filter(v => !v.disallowed);
|
||||
let bestVideo = videos.find(v => resolutions[v.name] === quality) || videos[videos.length - 1];
|
||||
|
||||
let fileMetadata = {
|
||||
title: cleanString(videoData.movie.title.trim()),
|
||||
author: cleanString(videoData.author.name.trim()),
|
||||
}
|
||||
|
||||
if (bestVideo) return {
|
||||
urls: bestVideo.url,
|
||||
filenameAttributes: {
|
||||
service: "ok",
|
||||
id: o.id,
|
||||
title: fileMetadata.title,
|
||||
author: fileMetadata.author,
|
||||
resolution: `${resolutions[bestVideo.name]}p`,
|
||||
qualityLabel: `${resolutions[bestVideo.name]}p`,
|
||||
extension: "mp4"
|
||||
}
|
||||
}
|
||||
|
||||
return { error: 'ErrorEmptyDownload' }
|
||||
}
|
||||
@@ -12,7 +12,7 @@ export default async function(o) {
|
||||
|
||||
if (!html) return { error: 'ErrorCouldntFetch' };
|
||||
|
||||
// decode cyrillic from windows-1251 because vk still uses apis from prehistoring times
|
||||
// decode cyrillic from windows-1251 because vk still uses apis from prehistoric times
|
||||
let decoder = new TextDecoder('windows-1251');
|
||||
html = decoder.decode(html);
|
||||
|
||||
@@ -35,7 +35,7 @@ export default async function(o) {
|
||||
|
||||
let fileMetadata = {
|
||||
title: cleanString(js.player.params[0].md_title.trim()),
|
||||
artist: cleanString(js.player.params[0].md_author.trim()),
|
||||
author: cleanString(js.player.params[0].md_author.trim()),
|
||||
}
|
||||
|
||||
if (url) return {
|
||||
@@ -44,7 +44,7 @@ export default async function(o) {
|
||||
service: "vk",
|
||||
id: `${o.userId}_${o.videoId}`,
|
||||
title: fileMetadata.title,
|
||||
author: fileMetadata.artist,
|
||||
author: fileMetadata.author,
|
||||
resolution: `${quality}p`,
|
||||
qualityLabel: `${quality}p`,
|
||||
extension: "mp4"
|
||||
|
||||
Reference in New Issue
Block a user