2024-05-16 16:57:48 +02:00
|
|
|
import { env } from "../../config.js";
|
2023-10-12 19:14:54 +02:00
|
|
|
import { cleanString } from '../../sub/utils.js';
|
2023-02-26 17:49:25 +01:00
|
|
|
|
2024-06-23 19:02:57 +02:00
|
|
|
import HLS from "hls-parser";
|
|
|
|
|
2023-02-26 17:49:25 +01:00
|
|
|
const resolutionMatch = {
|
2024-06-23 19:22:58 +02:00
|
|
|
"3840": 2160,
|
|
|
|
"2732": 1440,
|
|
|
|
"2560": 1440,
|
|
|
|
"2048": 1080,
|
|
|
|
"1920": 1080,
|
|
|
|
"1366": 720,
|
|
|
|
"1280": 720,
|
|
|
|
"960": 480,
|
|
|
|
"640": 360,
|
|
|
|
"426": 240
|
2023-03-15 17:18:31 +01:00
|
|
|
}
|
|
|
|
|
2023-02-12 08:40:49 +01:00
|
|
|
export default async function(obj) {
|
2024-06-23 19:22:58 +02:00
|
|
|
let quality = obj.quality === "max" ? 9000 : Number(obj.quality);
|
|
|
|
if (quality < 240) quality = 240;
|
|
|
|
if (!quality || obj.isAudioOnly) quality = 9000;
|
2023-03-15 17:18:31 +01:00
|
|
|
|
2024-03-05 00:26:14 +01:00
|
|
|
const url = new URL(`https://player.vimeo.com/video/${obj.id}/config`);
|
|
|
|
if (obj.password) {
|
|
|
|
url.searchParams.set('h', obj.password);
|
|
|
|
}
|
|
|
|
|
2024-06-23 19:02:57 +02:00
|
|
|
const api = await fetch(url)
|
2024-03-05 00:26:14 +01:00
|
|
|
.then(r => r.json())
|
|
|
|
.catch(() => {});
|
2023-02-12 08:40:49 +01:00
|
|
|
if (!api) return { error: 'ErrorCouldntFetch' };
|
|
|
|
|
2024-06-23 19:02:57 +02:00
|
|
|
const fileMetadata = {
|
2023-10-15 10:39:17 +02:00
|
|
|
title: cleanString(api.video.title.trim()),
|
|
|
|
artist: cleanString(api.video.owner.name.trim()),
|
2023-10-12 19:14:54 +02:00
|
|
|
}
|
|
|
|
|
2024-05-16 17:28:42 +02:00
|
|
|
if (api.video.duration > env.durationLimit)
|
|
|
|
return { error: ['ErrorLengthLimit', env.durationLimit / 60] };
|
2023-02-12 08:40:49 +01:00
|
|
|
|
2024-06-23 19:02:57 +02:00
|
|
|
const urlMasterHLS = api.request.files.hls.cdns.akfire_interconnect_quic.url;
|
|
|
|
|
|
|
|
const masterHLS = await fetch(urlMasterHLS)
|
|
|
|
.then(r => r.text())
|
|
|
|
.catch(() => {});
|
2023-02-12 08:40:49 +01:00
|
|
|
|
2024-06-23 19:02:57 +02:00
|
|
|
if (!masterHLS) return { error: 'ErrorCouldntFetch' };
|
2023-02-12 08:40:49 +01:00
|
|
|
|
2024-06-23 19:02:57 +02:00
|
|
|
const variants = HLS.parse(masterHLS).variants.sort(
|
|
|
|
(a, b) => Number(b.bandwidth) - Number(a.bandwidth)
|
|
|
|
);
|
|
|
|
if (!variants) return { error: 'ErrorEmptyDownload' };
|
2024-05-16 17:28:42 +02:00
|
|
|
|
2024-06-23 19:02:57 +02:00
|
|
|
let bestQuality;
|
2024-06-23 19:22:58 +02:00
|
|
|
if (quality < resolutionMatch[variants[0].resolution.width]) {
|
2024-06-23 19:02:57 +02:00
|
|
|
bestQuality = variants.find(v =>
|
2024-06-23 19:22:58 +02:00
|
|
|
(quality === resolutionMatch[v.resolution.width])
|
2024-06-23 19:02:57 +02:00
|
|
|
);
|
2023-03-15 17:18:31 +01:00
|
|
|
}
|
2024-06-23 19:02:57 +02:00
|
|
|
if (!bestQuality) bestQuality = variants[0];
|
2023-12-02 16:52:38 +01:00
|
|
|
|
2024-06-23 19:02:57 +02:00
|
|
|
const expandLink = (url) => {
|
|
|
|
return new URL(url, urlMasterHLS).toString();
|
|
|
|
};
|
|
|
|
|
|
|
|
let urls = expandLink(bestQuality.uri);
|
|
|
|
|
|
|
|
const audioPath = bestQuality?.audio[0]?.uri;
|
|
|
|
if (audioPath) {
|
|
|
|
urls = [
|
|
|
|
urls,
|
|
|
|
expandLink(audioPath)
|
|
|
|
]
|
2024-06-23 19:22:58 +02:00
|
|
|
} else if (obj.isAudioOnly) {
|
|
|
|
return { error: 'ErrorEmptyDownload' };
|
2024-06-23 19:02:57 +02:00
|
|
|
}
|
2023-12-02 16:52:38 +01:00
|
|
|
|
|
|
|
return {
|
2024-06-23 19:02:57 +02:00
|
|
|
urls,
|
2023-12-02 16:52:38 +01:00
|
|
|
isM3U8: true,
|
|
|
|
fileMetadata: fileMetadata,
|
|
|
|
filenameAttributes: {
|
|
|
|
service: "vimeo",
|
|
|
|
id: obj.id,
|
|
|
|
title: fileMetadata.title,
|
|
|
|
author: fileMetadata.artist,
|
2024-06-23 19:02:57 +02:00
|
|
|
resolution: `${bestQuality.resolution.width}x${bestQuality.resolution.height}`,
|
|
|
|
qualityLabel: `${resolutionMatch[bestQuality.resolution.width]}p`,
|
2023-12-02 16:52:38 +01:00
|
|
|
extension: "mp4"
|
2023-03-15 17:18:31 +01:00
|
|
|
}
|
2023-02-12 08:40:49 +01:00
|
|
|
}
|
|
|
|
}
|