64 lines
2.4 KiB
JavaScript
64 lines
2.4 KiB
JavaScript
import * as repository from '../lib/repository.js';
|
||
|
||
const METAHUB_URL = 'https://images.metahub.space'
|
||
export const BadTokenError = { code: 'BAD_TOKEN' }
|
||
export const AccessDeniedError = { code: 'ACCESS_DENIED' }
|
||
|
||
export function chunkArray(arr, size) {
|
||
return arr.length > size
|
||
? [arr.slice(0, size), ...chunkArray(arr.slice(size), size)]
|
||
: [arr];
|
||
}
|
||
|
||
export function streamFilename(stream) {
|
||
const titleParts = stream.title.replace(/\n👤.*/s, '').split('\n');
|
||
const filename = titleParts.pop().split('/').pop();
|
||
return encodeURIComponent(filename)
|
||
}
|
||
|
||
export async function enrichMeta(itemMeta) {
|
||
const infoHashes = [...new Set([itemMeta.infoHash]
|
||
.concat(itemMeta.videos.map(video => video.infoHash))
|
||
.filter(infoHash => infoHash))];
|
||
const files = infoHashes.length ? await repository.getFiles(infoHashes).catch(() => []) : [];
|
||
const commonImdbId = itemMeta.infoHash && mostCommonValue(files.map(file => file.imdbId));
|
||
if (files.length) {
|
||
return {
|
||
...itemMeta,
|
||
logo: commonImdbId && `${METAHUB_URL}/logo/medium/${commonImdbId}/img`,
|
||
poster: commonImdbId && `${METAHUB_URL}/poster/medium/${commonImdbId}/img`,
|
||
background: commonImdbId && `${METAHUB_URL}/background/medium/${commonImdbId}/img`,
|
||
videos: itemMeta.videos.map(video => {
|
||
const file = files.find(file => sameFilename(video.title, file.title));
|
||
if (file?.imdbId) {
|
||
if (file.imdbSeason && file.imdbEpisode) {
|
||
video.id = `${file.imdbId}:${file.imdbSeason}:${file.imdbEpisode}`;
|
||
video.season = file.imdbSeason;
|
||
video.episode = file.imdbEpisode;
|
||
video.thumbnail = `https://episodes.metahub.space/${file.imdbId}/${video.season}/${video.episode}/w780.jpg`
|
||
} else {
|
||
video.id = file.imdbId;
|
||
video.thumbnail = `${METAHUB_URL}/background/small/${file.imdbId}/img`;
|
||
}
|
||
}
|
||
return video;
|
||
})
|
||
}
|
||
}
|
||
return itemMeta
|
||
}
|
||
|
||
export function sameFilename(filename, expectedFilename) {
|
||
const offset = filename.length - expectedFilename.length;
|
||
for (let i = 0; i < expectedFilename.length; i++) {
|
||
if (filename[offset + i] !== expectedFilename[i] && expectedFilename[i] !== '<27>') {
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
function mostCommonValue(array) {
|
||
return array.sort((a, b) => array.filter(v => v === a).length - array.filter(v => v === b).length).pop();
|
||
}
|