diff --git a/src/routes/ts-proxy.ts b/src/routes/ts-proxy.ts index 1715628..07f2bab 100644 --- a/src/routes/ts-proxy.ts +++ b/src/routes/ts-proxy.ts @@ -1,7 +1,7 @@ import { setResponseHeaders } from 'h3'; +import { getCachedSegment } from './m3u8-proxy'; export default defineEventHandler(async (event) => { - // Handle CORS preflight requests if (isPreflightRequest(event)) return handleCors(event, {}); const url = getQuery(event).url as string; @@ -25,10 +25,23 @@ export default defineEventHandler(async (event) => { } try { + const cachedSegment = getCachedSegment(url); + + if (cachedSegment) { + setResponseHeaders(event, { + 'Content-Type': cachedSegment.headers['content-type'] || 'video/mp2t', + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Headers': '*', + 'Access-Control-Allow-Methods': '*', + 'Cache-Control': 'public, max-age=3600' + }); + + return cachedSegment.data; + } + const response = await globalThis.fetch(url, { method: 'GET', headers: { - // Default User-Agent (from src/utils/headers.ts) 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0', ...(headers as HeadersInit), } @@ -38,16 +51,14 @@ export default defineEventHandler(async (event) => { throw new Error(`Failed to fetch TS file: ${response.status} ${response.statusText}`); } - // Set appropriate headers for each video segment setResponseHeaders(event, { 'Content-Type': 'video/mp2t', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': '*', 'Access-Control-Allow-Methods': '*', - 'Cache-Control': 'public, max-age=3600' // Allow caching of TS segments + 'Cache-Control': 'public, max-age=3600' }); - // Return the binary data directly return new Uint8Array(await response.arrayBuffer()); } catch (error: any) { console.error('Error proxying TS file:', error); @@ -56,4 +67,4 @@ export default defineEventHandler(async (event) => { statusMessage: error.message || 'Error proxying TS file' })); } -}); \ No newline at end of file +});