Compare commits

...

2 Commits

Author SHA1 Message Date
tigeren d048cb3b82 fix(video-format-detector): temporarily redirect .ts files to local player
- Disabled .ts from TS_STREAM_FORMATS to prevent HLS resegmentation issues
- Added explicit handling to send .ts files to external local video players
- Enhanced user messaging explaining the temporary workaround
- Ensured seamless playback via existing external streaming API with range support
- Minimized code changes for easy reversal once HLS streaming is fixed
- Documented the temporary fix, user experience, and reverting steps
2025-10-04 15:51:04 +00:00
tigeren 048ed1b4e6 fix(video-format-detector): temporarily route .ts files to local player
- Add temporary fix to send .ts files to local player due to HLS resegmentation issues
- Disable .ts format in MPEG Transport Stream (TS_STREAM_FORMATS) for HLS streaming
- Log handling of .ts files in format detection for clarity
- Update local player format creation with specific warning message for .ts files
- Extend LIMITED_SUPPORT_FORMATS check to include .ts as a temporary measure
- Add TODO notes to revert changes once .ts HLS implementation is fixed
2025-10-04 15:17:19 +00:00
2 changed files with 100 additions and 6 deletions

76
TEMP_TS_FIX.md Normal file
View File

@ -0,0 +1,76 @@
# Temporary .ts File Fix
## Overview
This document describes a temporary fix implemented to handle problematic .ts file resegmentation by redirecting .ts files to external local video players instead of attempting HLS streaming.
## Problem
The .ts resegmentation implementation for HLS streaming was causing playback issues. Instead of complex troubleshooting, a simple temporary solution was needed to make .ts files playable immediately.
## Solution
Modified `src/lib/video-format-detector.ts` to treat .ts files like other non-mp4 files that require external local video players.
## Changes Made
### 1. Updated TS_STREAM_FORMATS Array
```typescript
// BEFORE
const TS_STREAM_FORMATS = [
'ts', // MPEG Transport Stream - optimal for HLS streaming
'm2ts', // Blu-ray Transport Stream
'mts' // AVCHD Transport Stream
];
// AFTER (temporary)
const TS_STREAM_FORMATS = [
// 'ts', // TEMPORARILY DISABLED - send to local player instead
'm2ts', // Blu-ray Transport Stream
'mts' // AVCHD Transport Stream
];
```
### 2. Added Explicit .ts File Handling
```typescript
// TEMPORARY FIX: Send .ts files to local player due to resegmentation issues
if (extension === 'ts') {
console.log('[FormatDetector] .ts file detected, sending to local player (temporary fix)');
return createLocalPlayerFormat(video, extension);
}
```
### 3. Enhanced User Messaging
Added specific warning message for .ts files:
```typescript
const warningMessage = isTsFile
? 'MPEG Transport Stream (.ts) files require a local video player for optimal playback. This is a temporary solution while we fix the streaming implementation.'
: 'This format requires a local video player';
```
## User Experience
- When users click on a .ts file, they will see the Local Player Launcher
- Clear messaging explains this is a temporary solution
- Users can copy the stream URL to VLC, IINA, PotPlayer, or other local players
- Files play perfectly through the external streaming API (`/api/external-stream/[id]`)
## Technical Benefits
- ✅ Immediate fix - .ts files are now playable
- ✅ Uses existing, well-tested external streaming API
- ✅ Proper HTTP range support for seeking
- ✅ No transcoding required
- ✅ Minimal code changes
- ✅ Easy to revert when HLS implementation is fixed
## Reverting This Fix
When the .ts resegmentation implementation is fixed:
1. Remove the explicit .ts handling in `detectVideoFormat()`
2. Add 'ts' back to the `TS_STREAM_FORMATS` array
3. Remove the temporary comments and warning messages
4. Test HLS streaming with .ts files
## Files Modified
- `/src/lib/video-format-detector.ts` - Main format detection logic
## API Endpoint Used
- `/api/external-stream/[id]` - Optimized for external players with range request support
This temporary fix provides immediate .ts file playability while maintaining the overall architecture for a permanent HLS-based solution later.

View File

@ -1,6 +1,10 @@
/** /**
* Video format detection and support level classification * Video format detection and support level classification
* Determines the optimal playback method for different video formats * Determines the optimal playback method for different video formats
*
* TEMPORARY FIX: .ts files are currently sent to local player instead of HLS
* due to resegmentation issues. This needs to be reverted once the HLS
* implementation for .ts files is fixed.
*/ */
export interface VideoFormat { export interface VideoFormat {
@ -56,9 +60,10 @@ const HLS_COMPATIBLE_FORMATS = [
'mts' 'mts'
]; ];
// MPEG Transport Stream formats - can be served via HLS or converted // MPEG Transport Stream formats - TEMPORARY: treat as local player required
// TODO: Fix the .ts resegmentation implementation for HLS streaming
const TS_STREAM_FORMATS = [ const TS_STREAM_FORMATS = [
'ts', // MPEG Transport Stream - optimal for HLS streaming // 'ts', // TEMPORARILY DISABLED - send to local player instead
'm2ts', // Blu-ray Transport Stream 'm2ts', // Blu-ray Transport Stream
'mts' // AVCHD Transport Stream 'mts' // AVCHD Transport Stream
]; ];
@ -104,6 +109,12 @@ export function detectVideoFormat(video: VideoFile): VideoFormat {
return createDirectFormat(video, extension); return createDirectFormat(video, extension);
} }
// TEMPORARY FIX: Send .ts files to local player due to resegmentation issues
if (extension === 'ts') {
console.log('[FormatDetector] .ts file detected, sending to local player (temporary fix)');
return createLocalPlayerFormat(video, extension);
}
// Tier 1.5: MPEG Transport Stream files (optimal for HLS) // Tier 1.5: MPEG Transport Stream files (optimal for HLS)
if (TS_STREAM_FORMATS.includes(extension)) { if (TS_STREAM_FORMATS.includes(extension)) {
console.log('[FormatDetector] TS format detected, using HLS streaming:', extension); console.log('[FormatDetector] TS format detected, using HLS streaming:', extension);
@ -122,9 +133,9 @@ export function detectVideoFormat(video: VideoFile): VideoFormat {
// No more fallback to transcoding system // No more fallback to transcoding system
console.log('[FormatDetector] Using local player for format:', extension); console.log('[FormatDetector] Using local player for format:', extension);
// Check if this is a format from LIMITED_SUPPORT_FORMATS // Check if this is a format from LIMITED_SUPPORT_FORMATS or .ts (temporary)
if (LIMITED_SUPPORT_FORMATS.includes(extension)) { if (LIMITED_SUPPORT_FORMATS.includes(extension) || extension === 'ts') {
console.log('[FormatDetector] Format in LIMITED_SUPPORT_FORMATS, forcing local player'); console.log('[FormatDetector] Format in LIMITED_SUPPORT_FORMATS or .ts (temporary), forcing local player');
} }
return createLocalPlayerFormat(video, extension); return createLocalPlayerFormat(video, extension);
@ -253,6 +264,7 @@ function createTSDirectFormat(video: VideoFile, extension: string): VideoFormat
/** /**
* Create local player format configuration (replaces transcoding fallback) * Create local player format configuration (replaces transcoding fallback)
* Enhanced for .ts files to provide better user guidance
*/ */
function createLocalPlayerFormat(video: VideoFile, extension: string): VideoFormat { function createLocalPlayerFormat(video: VideoFile, extension: string): VideoFormat {
const contentType = getMimeType(extension); const contentType = getMimeType(extension);
@ -260,12 +272,18 @@ function createLocalPlayerFormat(video: VideoFile, extension: string): VideoForm
// Use the optimized external streaming endpoint // Use the optimized external streaming endpoint
const baseUrl = `/api/external-stream/${video.id}`; const baseUrl = `/api/external-stream/${video.id}`;
// Special handling for .ts files (temporary fix)
const isTsFile = extension === 'ts';
const warningMessage = isTsFile
? 'MPEG Transport Stream (.ts) files require a local video player for optimal playback. This is a temporary solution while we fix the streaming implementation.'
: 'This format requires a local video player';
return { return {
type: 'local-player', type: 'local-player',
supportLevel: 'local-player-required', supportLevel: 'local-player-required',
url: baseUrl, // Optimized endpoint for external players url: baseUrl, // Optimized endpoint for external players
action: 'launch-local-player', action: 'launch-local-player',
warning: 'This format requires a local video player', warning: warningMessage,
recommendedPlayers: getRecommendedPlayersForFormat(extension), recommendedPlayers: getRecommendedPlayersForFormat(extension),
streamInfo: { streamInfo: {
contentType, contentType,