koala2 / static /js /editor.js
arcanus's picture
Create editor.js
cfd31a2 verified
raw
history blame
11.5 kB
document.addEventListener('DOMContentLoaded', function() {
const loader = document.getElementById('loader');
// Debug URL parameters
const urlParams = new URLSearchParams(window.location.search);
console.log("URL parameters:", Object.fromEntries(urlParams));
const folderId = urlParams.get('folder_id');
if (folderId) {
//console.log("Folder ID:", folderId);
//console.log("Expected video path:", `/static/uploads/${folderId}/video.mp4`);
//console.log("Expected subtitle path:", `/static/uploads/${folderId}/titulky.srt`);
}
const player = videojs('video-player', {
controls: true,
fluid: true,
autoplay: false,
preload: 'auto',
playbackRates: [0.5, 1, 1.5, 2],
html5: {
vhs: {
enableLowInitialPlaylist: true
}
}
});
console.log("Video.js player initialized");
player.ready(() => {
console.log("Video.js player is ready");
// Funkce pro kontrolu a načítání titulků
function checkAndLoadSubtitles() {
//console.log("Hledám titulky v elementu 'initial-subtitles' v HTML...");
const initialSubtitles = document.getElementById('initial-subtitles');
if (initialSubtitles) {
console.log("Nalezen element s titulky v HTML šabloně");
const content = initialSubtitles.textContent;
console.log("Obsah titulků:", content ? `Nalezen (délka: ${content.length} znaků)` : "Prázdný");
if (content && content.trim()) {
console.log("Načítám nalezené titulky do editoru");
try {
SubtitleManager.loadSubtitles(content.trim());
console.log("Titulky úspěšně načteny do editoru");
// Skryj loader, pokud video a titulky jsou připravené
if (loader) {
loader.classList.add('loader-hidden');
}
// Zastav interval, protože titulky byly úspěšně načteny
clearInterval(subtitleCheckInterval);
} catch (error) {
console.error("Chyba při načítání titulků:", error);
}
} else {
console.warn("Element s titulky byl nalezen, ale je prázdný");
}
} else {
//console.log("Titulky nebyly nalezeny v HTML elementu 'initial-subtitles'. Cesta v šabloně: {{ subtitle_content | safe }}");
}
}
// Opakovaná kontrola titulků každých 2 sekundy
const subtitleCheckInterval = setInterval(checkAndLoadSubtitles, 2000);
// Kontrola i při načtení videa
checkAndLoadSubtitles();
// Inicializace Timeline Manageru
TimelineManager.init(player);
// Skrytí loaderu, pokud je video načteno a titulky jsou přítomné
const videoSource = player.currentSrc();
if (loader && videoSource) {
console.log("Loader hidden as video source is loaded");
}
});
const videoUpload = document.getElementById('video-upload');
const subtitleUpload = document.getElementById('subtitle-upload');
const exportVttBtn = document.getElementById('export-vtt');
const exportSrtBtn = document.getElementById('export-srt');
videoUpload.addEventListener('change', function(e) {
const file = e.target.files[0];
if (file) {
const formData = new FormData();
formData.append('video', file);
fetch('/upload_video', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
if (data.success) {
player.src({
type: 'video/mp4',
src: data.filepath
});
player.load();
}
})
.catch(error => console.error('Error:', error));
}
});
subtitleUpload.addEventListener('change', function(e) {
const file = e.target.files[0];
if (file) {
const formData = new FormData();
formData.append('subtitle', file);
fetch('/upload_subtitle', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
if (data.success) {
SubtitleManager.loadSubtitles(data.content);
TimelineManager.render();
}
})
.catch(error => console.error('Error:', error));
}
});
exportVttBtn.addEventListener('click', function() {
const vtt = SubtitleManager.exportVTT();
downloadFile(vtt, 'subtitles.vtt', 'text/vtt');
});
exportSrtBtn.addEventListener('click', function() {
const srt = SubtitleManager.exportSRT();
downloadFile(srt, 'subtitles.srt', 'text/plain');
});
document.getElementById('generate-subtitles').addEventListener('click', function() {
const videoFile = videoUpload.files[0];
if (!videoFile) {
alert('Please upload a video file first');
return;
}
const formData = new FormData();
formData.append('video', videoFile);
this.disabled = true;
this.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Generating...';
fetch('/generate_subtitles', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
if (data.success) {
SubtitleManager.subtitles = [];
data.subtitles.forEach(subtitle => {
SubtitleManager.addSubtitle(subtitle.start, subtitle.end, subtitle.text);
});
TimelineManager.render();
} else {
alert('Error generating subtitles: ' + data.error);
}
})
.catch(error => {
console.error('Error:', error);
alert('Error generating subtitles');
})
.finally(() => {
this.disabled = false;
this.innerHTML = '<i class="fas fa-magic"></i> Generate Subtitles';
});
});
function downloadFile(content, filename, type) {
const blob = new Blob([content], { type: type });
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = filename;
a.click();
window.URL.revokeObjectURL(url);
}
// Add subtitle button functionality
document.getElementById('add-subtitle').addEventListener('click', function() {
const currentTime = player.currentTime();
SubtitleManager.addSubtitle(currentTime, currentTime + 2, 'New subtitle');
TimelineManager.render();
});
// Save subtitle button functionality
document.getElementById('saveSubtitle').addEventListener('click', function() {
SubtitleManager.updateParentEditor();
});
// Export translation button functionality
document.getElementById('exportTranslation').addEventListener('click', function() {
const srt = SubtitleManager.exportSRT();
// Aktualizace session storage
window.parent.sessionStorage.setItem('subtitles', srt);
console.log('Exportovaný překlad (SRT formát):');
console.log('----------------------------------------');
console.log(srt);
console.log('----------------------------------------');
console.log('Session storage "subtitles" byl aktualizován');
console.log("Všechny session:");
for (let i = 0; i < sessionStorage.length; i++) {
const key = sessionStorage.key(i);
const value = sessionStorage.getItem(key);
console.log(`${key}: ${value}`);
}
// Odeslání zprávy o změně titulků do rodičovské stránky
window.parent.postMessage({
type: 'subtitlesChanged',
data: srt
}, '*');
// Notifikace uživateli
if (window.parent.showToast) {
window.parent.showToast('Překlad byl úspěšně aktualizován', false);
}
});
// Funkce pro odeslání zprávy o změně titulků do rodičovské stránky
function notifySubtitlesChange(subtitlesContent) {
window.parent.postMessage({
type: 'subtitlesChanged',
data: subtitlesContent
}, '*');
}
// Handler pro tlačítko vytvoření dabingu
document.getElementById('createDubbing').addEventListener('click', async function() {
try {
// Získat titulky ze session storage
const subtitles = SubtitleManager.getSubtitles();
if (!subtitles || subtitles.length === 0) {
alert('Nejprve musíte upravit titulky!');
return;
}
// Převést titulky na JSON ve správném formátu pro backend
const formattedSubtitles = subtitles.map((sub, index) => ({
id: index + 1,
start: sub.start,
end: sub.end,
text: sub.text,
translation: sub.text // Text je už přeložený
}));
const subtitlesJson = JSON.stringify(formattedSubtitles);
// Získat formulář z hlavní stránky
const mainForm = window.parent.document.getElementById('translateForm');
const formData = new FormData(mainForm);
// Přidat titulky jako JSON
formData.append('edited_subtitles', subtitlesJson);
// Přidat cestu k videu ze session
const videoPath = sessionStorage.getItem('video_path');
if (videoPath) {
formData.append('downloaded_video_path', videoPath);
}
// Odeslat požadavek na vytvoření dabingu
const response = await fetch('/translate', {
method: 'POST',
body: formData
});
const result = await response.json();
if (result.success) {
// Přehrát výsledné video
if (result.video) {
const videoPlayer = document.getElementById('video-player');
if (videoPlayer) {
videoPlayer.src = result.video;
videoPlayer.load();
}
}
alert('Dabing byl úspěšně vytvořen!');
} else {
alert('Chyba při vytváření dabingu: ' + result.error);
}
} catch (error) {
console.error('Error:', error);
alert('Chyba při vytváření dabingu: ' + error.message);
}
});
// Update timeline when video metadata is loaded
player.on('loadedmetadata', function() {
console.log("Video metadata loaded, duration:", player.duration());
TimelineManager.render();
});
});