mirror of
https://github.com/PR0M3TH3AN/bitvid.git
synced 2026-10-27 16:02:26 +00:00
81 lines
2.7 KiB
JavaScript
81 lines
2.7 KiB
JavaScript
import { ALLOW_NSFW_CONTENT } from "../config.js";
|
|
|
|
export function buildVideoSearchFilterMatcher(filters = {}, options = {}) {
|
|
const allowNsfw = options.allowNsfw ?? ALLOW_NSFW_CONTENT;
|
|
const authorSet = new Set(
|
|
Array.isArray(filters?.authorPubkeys)
|
|
? filters.authorPubkeys.map((author) => author.toLowerCase())
|
|
: [],
|
|
);
|
|
const tagSet = new Set(
|
|
Array.isArray(filters?.tags) ? filters.tags.map((tag) => tag.toLowerCase()) : [],
|
|
);
|
|
const afterDate = Number.isFinite(filters?.dateRange?.after)
|
|
? filters.dateRange.after
|
|
: null;
|
|
const beforeDate = Number.isFinite(filters?.dateRange?.before)
|
|
? filters.dateRange.before
|
|
: null;
|
|
const minDuration = Number.isFinite(filters?.duration?.minSeconds)
|
|
? filters.duration.minSeconds
|
|
: null;
|
|
const maxDuration = Number.isFinite(filters?.duration?.maxSeconds)
|
|
? filters.duration.maxSeconds
|
|
: null;
|
|
const hasMagnet = filters?.hasMagnet === true;
|
|
const hasUrl = filters?.hasUrl === true;
|
|
const nsfwFilter = typeof filters?.nsfw === "string" ? filters.nsfw : "any";
|
|
|
|
return (video) => {
|
|
if (!video) return false;
|
|
|
|
if (authorSet.size > 0) {
|
|
const pubkey = typeof video.pubkey === "string" ? video.pubkey.toLowerCase() : "";
|
|
if (!pubkey || !authorSet.has(pubkey)) return false;
|
|
}
|
|
|
|
if (tagSet.size > 0) {
|
|
const tags = Array.isArray(video.tags) ? video.tags : [];
|
|
const hasTag = tags.some((tag) => {
|
|
if (Array.isArray(tag)) {
|
|
return tag[0] === "t" && tagSet.has(String(tag[1] || "").toLowerCase());
|
|
}
|
|
return tagSet.has(String(tag || "").toLowerCase());
|
|
});
|
|
if (!hasTag) return false;
|
|
}
|
|
|
|
if (Number.isFinite(afterDate) && (!Number.isFinite(video.created_at) || video.created_at < afterDate)) {
|
|
return false;
|
|
}
|
|
if (Number.isFinite(beforeDate) && (!Number.isFinite(video.created_at) || video.created_at > beforeDate)) {
|
|
return false;
|
|
}
|
|
|
|
if (hasMagnet && !video.magnet) return false;
|
|
if (hasUrl && !video.url) return false;
|
|
|
|
if (Number.isFinite(minDuration) || Number.isFinite(maxDuration)) {
|
|
const duration = Number(video.nip71?.duration);
|
|
if (!Number.isFinite(duration)) return false;
|
|
if (Number.isFinite(minDuration) && duration < minDuration) return false;
|
|
if (Number.isFinite(maxDuration) && duration > maxDuration) return false;
|
|
}
|
|
|
|
if (allowNsfw !== true && video.isNsfw === true) {
|
|
return false;
|
|
}
|
|
|
|
if (allowNsfw === true) {
|
|
if ((nsfwFilter === "true" || nsfwFilter === "only") && video.isNsfw !== true) {
|
|
return false;
|
|
}
|
|
if (nsfwFilter === "false" && video.isNsfw === true) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
};
|
|
}
|