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)}…"`;
    }
});