mirror of
https://github.com/KuekHaoYang/KVideo.git
synced 2026-08-15 08:43:44 +08:00
feat: Configure HLS player for faster startup with prefetch and buffer settings, and remove the history downloader.
This commit is contained in:
+1
-2
@@ -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 */}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user