mirror of
https://github.com/ngthanhvu/kr-phim.git
synced 2026-08-10 14:07:47 +00:00
feat: implement caching for .ts files in HLS proxy middleware
This commit is contained in:
@@ -1,3 +1,28 @@
|
||||
import { createHash } from 'crypto'
|
||||
import { useRedis } from '../utils/redis'
|
||||
|
||||
const CACHE_TTL = 86400 // 1 ngày cho .ts files
|
||||
const CACHE_PREFIX = 'hls:'
|
||||
|
||||
async function getCachedFile(redis: any, url: string): Promise<Buffer | null> {
|
||||
const key = CACHE_PREFIX + createHash('md5').update(url).digest('hex')
|
||||
try {
|
||||
const cached = await redis.getBuffer(key)
|
||||
return cached || null
|
||||
} catch {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
async function setCachedFile(redis: any, url: string, data: Buffer): Promise<void> {
|
||||
const key = CACHE_PREFIX + createHash('md5').update(url).digest('hex')
|
||||
try {
|
||||
await redis.set(key, data, 'EX', CACHE_TTL)
|
||||
} catch {
|
||||
// Ignore cache write errors
|
||||
}
|
||||
}
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
const path = event.path || event.node?.req?.url || ''
|
||||
|
||||
@@ -25,6 +50,22 @@ export default defineEventHandler(async (event) => {
|
||||
}
|
||||
|
||||
try {
|
||||
const isTsFile = url.includes('.ts')
|
||||
const redis = useRedis()
|
||||
|
||||
// Check cache for .ts files
|
||||
if (isTsFile) {
|
||||
const cached = await getCachedFile(redis, url)
|
||||
if (cached) {
|
||||
setHeader(event, 'access-control-allow-origin', '*')
|
||||
setHeader(event, 'cache-control', 'public, max-age=31536000, immutable')
|
||||
setHeader(event, 'content-type', 'video/mp2t')
|
||||
setHeader(event, 'content-length', cached.length.toString())
|
||||
setHeader(event, 'x-cache', 'HIT')
|
||||
return cached
|
||||
}
|
||||
}
|
||||
|
||||
const response = await fetch(url, {
|
||||
headers: {
|
||||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
|
||||
@@ -43,7 +84,6 @@ export default defineEventHandler(async (event) => {
|
||||
|
||||
setHeader(event, 'access-control-allow-origin', '*')
|
||||
setHeader(event, 'access-control-allow-methods', 'GET, OPTIONS')
|
||||
setHeader(event, 'cache-control', 'public, max-age=3600')
|
||||
|
||||
if (isM3u8) {
|
||||
let body = await response.text()
|
||||
@@ -64,13 +104,26 @@ export default defineEventHandler(async (event) => {
|
||||
})
|
||||
|
||||
setHeader(event, 'content-type', 'application/vnd.apple.mpegurl')
|
||||
setHeader(event, 'cache-control', 'public, max-age=300')
|
||||
setHeader(event, 'x-cache', 'MISS')
|
||||
return body
|
||||
} else if (isTsFile) {
|
||||
// Cache .ts files in Redis
|
||||
const buffer = Buffer.from(await response.arrayBuffer())
|
||||
await setCachedFile(redis, url, buffer)
|
||||
|
||||
setHeader(event, 'content-type', 'video/mp2t')
|
||||
setHeader(event, 'cache-control', 'public, max-age=31536000, immutable')
|
||||
setHeader(event, 'content-length', buffer.length.toString())
|
||||
setHeader(event, 'x-cache', 'MISS')
|
||||
return buffer
|
||||
} else {
|
||||
setHeader(event, 'content-type', contentType)
|
||||
const contentLength = response.headers.get('content-length')
|
||||
if (contentLength) {
|
||||
setHeader(event, 'content-length', contentLength)
|
||||
}
|
||||
setHeader(event, 'cache-control', 'public, max-age=3600')
|
||||
return response.body
|
||||
}
|
||||
} catch (error: any) {
|
||||
|
||||
Reference in New Issue
Block a user