diff --git a/src/router/video.ts b/src/router/video.ts index 3479375..33e239e 100644 --- a/src/router/video.ts +++ b/src/router/video.ts @@ -8,6 +8,34 @@ import redis from '@/utils/redis'; const app = new Elysia() +DOMPurify.addHook('afterSanitizeAttributes', function (node) { + if (node.tagName === 'A') { + const disallowedPatterns: RegExp[] = [ + /\/playlist/i, + /\/hashtag\//i, + /\/live\//i, + /\/user\//i, + /\/shorts\//i, + /\/c\//i, + /\/@[^\/]/i + ]; + const href = node.getAttribute('href') || ''; + + const shouldConvertToSpan = disallowedPatterns.some(pattern => + pattern.test(href) + ); + + if (shouldConvertToSpan) { + const span = node.ownerDocument.createElement('span'); + span.innerHTML = node.innerHTML; + if (node.className) span.className = node.className; + node.parentNode?.replaceChild(span, node); + } else { + node.setAttribute('rel', 'nofollow noopener noreferrer'); + } + } +}) + interface processedVideo { id: string; title: string; @@ -74,34 +102,6 @@ app.get('/watch', async ({ query: { v }, set, redirect, error }) => { .executeTakeFirst() : null - DOMPurify.addHook('afterSanitizeAttributes', function (node) { - if (node.tagName === 'A') { - const disallowedPatterns: RegExp[] = [ - /\/playlist/i, - /\/hashtag\//i, - /\/live\//i, - /\/user\//i, - /\/shorts\//i, - /\/c\//i, - /\/@[^\/]/i - ]; - const href = node.getAttribute('href') || ''; - - const shouldConvertToSpan = disallowedPatterns.some(pattern => - pattern.test(href) - ); - - if (shouldConvertToSpan) { - const span = node.ownerDocument.createElement('span'); - span.innerHTML = node.innerHTML; - if (node.className) span.className = node.className; - node.parentNode?.replaceChild(span, node); - } else { - node.setAttribute('rel', 'nofollow noopener noreferrer'); - } - } - }) - const html = await m(eta.render('./watch', { transparency, file,