feat: Configure HLS player for faster startup with prefetch and buffer settings, and remove the history downloader.

This commit is contained in:
kuekhaoyang
2025-12-06 14:07:20 +08:00
parent 3bc2f78065
commit 1a2937d303
3 changed files with 5 additions and 67 deletions
+1 -2
View File
@@ -4,7 +4,7 @@ import "./globals.css";
import { ThemeProvider } from "@/components/ThemeProvider";
import { Analytics } from "@vercel/analytics/react";
import { ServiceWorkerRegister } from "@/components/ServiceWorkerRegister";
import { HistoryDownloader } from "@/lib/hooks/useHistoryDownloader";
const geistSans = Geist({
variable: "--font-geist-sans",
@@ -39,7 +39,6 @@ export default function RootLayout({
{children}
<Analytics />
<ServiceWorkerRegister />
<HistoryDownloader />
</ThemeProvider>
{/* ARIA Live Region for Screen Reader Announcements */}
+4
View File
@@ -45,6 +45,10 @@ export function useHlsPlayer({
hls = new Hls({
enableWorker: true,
lowLatencyMode: true,
startFragPrefetch: true, // Fetch first segment immediately while parsing manifest
// Reduce buffering requirement for startup
maxBufferLength: 30,
backBufferLength: 30,
});
hlsRef.current = hls;
-65
View File
@@ -1,65 +0,0 @@
/**
* History Downloader Hook
* Downloads all segments for videos in watch history
*/
'use client';
import { useEffect, useRef } from 'react';
import { usePathname } from 'next/navigation';
import { useHistoryStore } from '@/lib/store/history-store';
import { parseHLSManifest } from '@/lib/utils/hlsManifestParser';
import { downloadSegmentQueue } from '@/lib/utils/segmentDownloader';
function useHistoryDownloader() {
const viewingHistory = useHistoryStore((state) => state.viewingHistory);
const processedUrlsRef = useRef<Set<string>>(new Set());
const pathname = usePathname();
useEffect(() => {
// Don't download history while watching a video
if (pathname?.startsWith('/player')) return;
if (viewingHistory.length === 0) return;
const downloadHistoryVideos = async () => {
for (const item of viewingHistory) {
const { url } = item;
// Skip if already processed
if (processedUrlsRef.current.has(url)) continue;
// Skip if not m3u8
if (!url.endsWith('.m3u8')) continue;
// Queue background download
processedUrlsRef.current.add(url);
try {
const segments = await parseHLSManifest(url);
const controller = new AbortController();
// Download all segments (not just from playback position)
downloadSegmentQueue({
segments,
startIndex: 0,
signal: controller.signal,
videoUrl: url, // Track metadata for this video
onProgress: (current, total) => {
// console.log removed as per instruction
}
});
} catch (error) {
console.error(`[HistoryDownloader] Failed to download ${item.title}:`, error);
}
}
};
downloadHistoryVideos();
}, [viewingHistory]);
}
export function HistoryDownloader() {
useHistoryDownloader();
return null;
}