File size: 2,870 Bytes
7c2ea61
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import express from 'express';
import { YoutubeTranscript } from 'youtube-transcript';
import path from 'path';
import { fileURLToPath } from 'url';

// Configuration pour __dirname avec ES Modules
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

const app = express();
// Hugging Face Spaces utilise le port 7860 par défaut
const port = process.env.PORT || 7860;

// Servir les fichiers statiques du dossier 'public'
app.use(express.static(path.join(__dirname, 'public')));

app.get('/get-transcript', async (req, res) => {
	const videoUrl = req.query.url;
	if (!videoUrl) {
		return res.status(400).json({ error: 'URL de la vidéo manquante' });
	}

	try {
		// Essayer d'extraire l'ID de différentes formes d'URL YouTube
		let videoId = '';
		if (videoUrl.includes('v=')) {
			videoId = videoUrl.split('v=')[1].split('&')[0];
		} else if (videoUrl.includes('youtu.be/')) {
			videoId = videoUrl.split('youtu.be/')[1].split('?')[0];
		} else {
			// On pourrait ajouter d'autres formats d'URL ici (shorts, etc.)
			// Pour l'instant, on assume que c'est un ID direct si ce n'est pas une URL connue
			videoId = videoUrl;
		}

		if (!videoId) {
			return res.status(400).json({ error: "Impossible d'extraire l'ID de la vidéo depuis l'URL." });
		}

		console.log(`Fetching transcript for video ID: ${videoId}`);
		const transcript = await YoutubeTranscript.fetchTranscript(videoId);

		if (!transcript || transcript.length === 0) {
			return res.status(404).json({ error: 'Transcription non trouvée ou vide pour cette vidéo.' });
		}

		// Concaténer les textes de la transcription
		const fullText = transcript.map(item => item.text).join(' ');
		res.json({ transcript: fullText });

	} catch (error) {
		console.error('Erreur lors de la récupération de la transcription:', error);
		if (error.message && error.message.includes('Could not find transcripts')) {
			return res.status(404).json({ error: "Aucune transcription disponible pour cette vidéo (elles sont peut-être désactivées ou n'existent pas en auto-généré)." });
		}
		if (error.message && error.message.includes('is not a valid video ID')) {
			return res.status(400).json({ error: `L'ID vidéo extrait ('${error.message.split("'")[1]}') n'est pas valide. Vérifiez l'URL.` });
		}
		res.status(500).json({ error: 'Erreur interne du serveur lors de la récupération de la transcription.' });
	}
});

// Route pour vérifier l'état du serveur (utile pour Hugging Face)
app.get('/health', (req, res) => {
	res.status(200).json({ status: 'ok' });
});

// Route par défaut
app.get('/', (req, res) => {
	res.sendFile(path.join(__dirname, 'public', 'index.html'));
});

app.listen(port, '0.0.0.0', () => {
	console.log(`Serveur démarré sur http://0.0.0.0:${port}`);
});