mirror of
https://github.com/ajayyy/SponsorBlockServer.git
synced 2025-12-26 17:38:28 +03:00
40 lines
1.7 KiB
TypeScript
40 lines
1.7 KiB
TypeScript
import { hashPrefixTester } from "../utils/hashPrefixTester";
|
|
import { getSegmentsByHash } from "./getSkipSegments";
|
|
import { Request, Response } from "express";
|
|
import { VideoIDHash } from "../types/segments.model";
|
|
import { Logger } from "../utils/logger";
|
|
import { parseSkipSegments } from "../utils/parseSkipSegments";
|
|
import { getEtag } from "../middleware/etag";
|
|
|
|
export async function getSkipSegmentsByHash(req: Request, res: Response): Promise<Response> {
|
|
let hashPrefix = req.params.prefix as VideoIDHash;
|
|
if (!req.params.prefix || !hashPrefixTester(req.params.prefix)) {
|
|
return res.status(400).send("Hash prefix does not match format requirements."); // Exit early on faulty prefix
|
|
}
|
|
hashPrefix = hashPrefix.toLowerCase() as VideoIDHash;
|
|
|
|
const parseResult = parseSkipSegments(req);
|
|
if (parseResult.errors.length > 0) {
|
|
return res.status(400).send(parseResult.errors);
|
|
}
|
|
const { categories, actionTypes, requiredSegments, service } = parseResult;
|
|
|
|
// Get all video id's that match hash prefix
|
|
const segments = await getSegmentsByHash(req, hashPrefix, categories, actionTypes, requiredSegments, service);
|
|
|
|
try {
|
|
await getEtag("skipSegmentsHash", hashPrefix, service)
|
|
.then(etag => res.set("ETag", etag))
|
|
.catch(/* istanbul ignore next */ () => null);
|
|
const output = Object.entries(segments).map(([videoID, data]) => ({
|
|
videoID,
|
|
segments: data.segments,
|
|
}));
|
|
return res.status(output.length === 0 ? 404 : 200).json(output);
|
|
} catch (e) /* istanbul ignore next */ {
|
|
Logger.error(`skip segments by hash error: ${e}`);
|
|
|
|
return res.status(500).send("Internal server error");
|
|
}
|
|
}
|