Spaces:
Running
Running
File size: 5,838 Bytes
d03bb4e 2c66926 d03bb4e 2c66926 d03bb4e 2c66926 d03bb4e 2c66926 d03bb4e 2c66926 d03bb4e 2c66926 d03bb4e 2c66926 d03bb4e 2c66926 d03bb4e 2c66926 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 | // ShortForge AI – App logic
class ShortForgeApp {
constructor() {
this.currentTemplate = 'narration';
this.generated = false;
this.voices = {
'fr-lea': { name: 'Lea', lang: 'fr-FR', gender: 'female' },
'fr-remy': { name: 'Rémy', lang: 'fr-FR', gender: 'male' },
'en-bella': { name: 'Bella', lang: 'en-US', gender: 'female' },
'en-mat': { name: 'Mat', lang: 'en-US', gender: 'male' }
};
this.init();
}
init() {
this.bindEvents();
this.updateTemplateButtons();
}
bindEvents() {
// Template buttons
document.querySelectorAll('.template-btn').forEach(btn => {
btn.addEventListener('click', e => {
document.querySelectorAll('.template-btn').forEach(b => b.classList.remove('active'));
e.target.classList.add('active');
this.currentTemplate = e.target.dataset.template;
this.updateTemplatePreview();
});
});
// Generate
document.getElementById('voiceSelect').addEventListener('change', () => this.updateVoicePreview());
document.getElementById('generateBtn').addEventListener('click', () => this.generate());
// Download
document.getElementById('downloadBtn').addEventListener('click', () => this.download());
// File upload
document.getElementById('loadTxt').addEventListener('click', () => this.loadTxt());
document.getElementById('loadReddit').addEventListener('click', () => this.loadReddit());
}
updateTemplateButtons() {
document.querySelectorAll('.template-btn').forEach(btn => {
btn.classList.toggle('active', btn.dataset.template === this.currentTemplate);
});
}
updateTemplatePreview() {
const templates = {
narration: 'Narration douce avec transitions lentes.',
reddit: 'Reddit story rythmé pour maximiser le retention.',
educatif: 'Format éducatif avec captions synchronisés.',
top5: 'Top 5 dynamique avec effets punchy.'
};
const desc = templates[this.currentTemplate];
const preview = document.createElement('div');
preview.className = 'mt-2 text-xs text-gray-400';
preview.textContent = desc;
const existing = document.querySelector('#templateDesc');
if (existing) existing.remove();
preview.id = 'templateDesc';
document.querySelector('.template-btn.active').parentElement.appendChild(preview);
}
updateVoicePreview() {
const select = document.getElementById('voiceSelect');
const voiceId = select.value;
const voice = this.voices[voiceId];
const preview = document.createElement('div');
preview.className = 'mt-2 text-xs text-gray-400';
preview.textContent = `${voice.name} – ${voice.lang} (${voice.gender})`;
const existing = document.querySelector('#voiceDesc');
if (existing) existing.remove();
preview.id = 'voiceDesc';
select.parentElement.appendChild(preview);
}
async loadTxt() {
const input = document.createElement('input');
input.type = 'file';
input.accept = '.txt';
input.onchange = e => {
const file = e.target.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = evt => {
document.getElementById('scriptInput').value = evt.target.result;
};
reader.readAsText(file);
};
input.click();
}
loadReddit() {
const url = prompt('Collez l’URL Reddit du post :');
if (!url) return;
// Mock fetch
document.getElementById('scriptInput').value = 'Mock Reddit story récupéré !';
}
async generate() {
const script = document.getElementById('scriptInput').value.trim();
if (!script) return alert('Veuillez entrer un script.');
const btn = document.getElementById('generateBtn');
const original = btn.innerHTML;
btn.disabled = true;
btn.innerHTML = '<i data-feather="loader" class="inline w-5 h-5 mr-2 animate-spin"></i>Génération…';
feather.replace();
// Simulate API
await new Promise(r => setTimeout(r, 3000));
// Fake video
const video = document.getElementById('previewVideo');
video.src = 'https://sample-videos.com/shorts/9-16/mp4/20.mp4';
document.getElementById('previewPlayer').classList.remove('hidden');
document.getElementById('previewPlaceholder').classList.add('hidden');
document.getElementById('downloadBtn').classList.remove('hidden');
// Save to localStorage
const history = JSON.parse(localStorage.getItem('sf-history') || '[]');
history.unshift({ script, template: this.currentTemplate, timestamp: Date.now() });
localStorage.setItem('sf-history', JSON.stringify(history.slice(0, 10)));
this.generated = true;
btn.disabled = false;
btn.innerHTML = original;
feather.replace();
}
download() {
if (!this.generated) return;
const link = document.createElement('a');
link.href = 'https://sample-videos.com/shorts/9-16/mp4/20.mp4';
link.download = 'shortforge-video.mp4';
link.click();
}
}
document.addEventListener('DOMContentLoaded', () => {
new ShortForgeApp();
});
// History quick-load
window.addEventListener('load', () => {
const history = JSON.parse(localStorage.getItem('sf-history') || '[]');
if (history.length > 0) {
const last = history[0];
document.getElementById('scriptInput').placeholder = `Dernier script: "${last.script.substring(0, 50)}…"`;
}
});
|