add support for SRT subtitles

This commit is contained in:
Anirudh Sevugan 2025-08-22 15:44:23 -05:00 committed by GitHub
parent 32645bb3cf
commit 2176853993
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -65,28 +65,64 @@ document.addEventListener('DOMContentLoaded', () => {
} }
}); });
// Function to add subtitles dynamically (e.g., after URL input) async function addSubtitles(url) {
function addSubtitles(url) { // Remove existing tracks
// Remove any existing subtitle tracks
const existingTracks = mediaPlayer.getElementsByTagName('track'); const existingTracks = mediaPlayer.getElementsByTagName('track');
for (let track of existingTracks) { for (let track of existingTracks) track.remove();
track.remove();
// Fetch subtitle content
let text = '';
try {
const res = await fetch(url);
text = await res.text();
} catch (err) {
console.error('Failed to fetch subtitles:', err);
return;
} }
// Create a new track for subtitles // Detect format
const firstLine = text.split(/\r?\n/)[0].trim();
const format = firstLine.startsWith('WEBVTT') || url.toLowerCase().endsWith('.vtt') ? 'vtt' : 'srt';
// Convert SRT → VTT if needed
if (format === 'srt') {
text = 'WEBVTT\n\n' + text
.replace(/\r+/g, '')
.replace(/^\s+|\s+$/g, '')
.split('\n')
.map(line => line.replace(/(\d+):(\d+):(\d+),(\d+)/g, '$1:$2:$3.$4'))
.join('\n');
}
// Create Blob URL
const blob = new Blob([text], { type: 'text/vtt' });
const blobUrl = URL.createObjectURL(blob);
// Create and append track
const track = document.createElement('track'); const track = document.createElement('track');
track.kind = 'subtitles'; track.kind = 'subtitles';
track.label = 'English'; track.label = 'English';
track.srclang = 'en'; track.srclang = 'en';
track.src = url; track.src = blobUrl;
track.default = true;
// Append the new track
mediaPlayer.appendChild(track); mediaPlayer.appendChild(track);
// Optionally, enable subtitles by default // Force enable immediately
track.track.mode = 'showing'; // Enable subtitles by default setTimeout(() => {
for (let t of mediaPlayer.textTracks) t.mode = 'disabled';
track.track.mode = 'showing';
}, 50); // slight delay ensures the browser registers it
} }
/*// Handle submit subtitle URL
function clearSubtitles() {
const tracks = mediaPlayer.getElementsByTagName('track');
for (let i = tracks.length - 1; i >= 0; i--) {
tracks[i].remove();
}
}*/
// Handle submit subtitle URL // Handle submit subtitle URL
function clearSubtitles() { function clearSubtitles() {
const tracks = mediaPlayer.getElementsByTagName('track'); const tracks = mediaPlayer.getElementsByTagName('track');