Spaces:
Running
Running
Upload 7 files
Browse files- Dockerfile +11 -4
- public/script.js +6 -2
- server.js +27 -3
Dockerfile
CHANGED
@@ -2,11 +2,18 @@ FROM node:18-slim
|
|
2 |
|
3 |
WORKDIR /app
|
4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
# Copy package files
|
6 |
COPY package.json ./
|
7 |
|
8 |
-
# Install dependencies
|
9 |
-
RUN npm install
|
10 |
|
11 |
# Copy application files
|
12 |
COPY server.js ./
|
@@ -15,5 +22,5 @@ COPY public ./public
|
|
15 |
# Expose the port
|
16 |
EXPOSE 7860
|
17 |
|
18 |
-
# Start the server
|
19 |
-
CMD ["node", "server.js"]
|
|
|
2 |
|
3 |
WORKDIR /app
|
4 |
|
5 |
+
# Installation des dépendances système nécessaires
|
6 |
+
RUN apt-get update && apt-get install -y \
|
7 |
+
python3 \
|
8 |
+
python3-pip \
|
9 |
+
build-essential \
|
10 |
+
&& rm -rf /var/lib/apt/lists/*
|
11 |
+
|
12 |
# Copy package files
|
13 |
COPY package.json ./
|
14 |
|
15 |
+
# Install dependencies with increased network timeout
|
16 |
+
RUN npm install --network-timeout=100000
|
17 |
|
18 |
# Copy application files
|
19 |
COPY server.js ./
|
|
|
22 |
# Expose the port
|
23 |
EXPOSE 7860
|
24 |
|
25 |
+
# Start the server with increased debugging
|
26 |
+
CMD ["node", "--trace-warnings", "server.js"]
|
public/script.js
CHANGED
@@ -108,7 +108,11 @@ document.addEventListener('DOMContentLoaded', () => {
|
|
108 |
const data = await response.json();
|
109 |
|
110 |
if (!response.ok) {
|
111 |
-
|
|
|
|
|
|
|
|
|
112 |
}
|
113 |
|
114 |
const fullTranscript = data.transcript;
|
@@ -127,7 +131,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
|
127 |
summaryOutput.textContent = summary;
|
128 |
|
129 |
} catch (err) {
|
130 |
-
console.error("Erreur dans le processus :", err);
|
131 |
showError(`Erreur: ${err.message}`);
|
132 |
transcriptOutput.innerHTML = "<p>Échec de la récupération.</p>";
|
133 |
summaryOutput.innerHTML = "<p>Échec du résumé.</p>";
|
|
|
108 |
const data = await response.json();
|
109 |
|
110 |
if (!response.ok) {
|
111 |
+
// Afficher l'erreur détaillée si disponible
|
112 |
+
const errorMessage = data.details
|
113 |
+
? `${data.error} Détails: ${data.details}`
|
114 |
+
: data.error || `Erreur HTTP: ${response.status}`;
|
115 |
+
throw new Error(errorMessage);
|
116 |
}
|
117 |
|
118 |
const fullTranscript = data.transcript;
|
|
|
131 |
summaryOutput.textContent = summary;
|
132 |
|
133 |
} catch (err) {
|
134 |
+
console.error("Erreur détaillée dans le processus :", err);
|
135 |
showError(`Erreur: ${err.message}`);
|
136 |
transcriptOutput.innerHTML = "<p>Échec de la récupération.</p>";
|
137 |
summaryOutput.innerHTML = "<p>Échec du résumé.</p>";
|
server.js
CHANGED
@@ -38,7 +38,17 @@ app.get('/get-transcript', async (req, res) => {
|
|
38 |
}
|
39 |
|
40 |
console.log(`Fetching transcript for video ID: ${videoId}`);
|
41 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
|
43 |
if (!transcript || transcript.length === 0) {
|
44 |
return res.status(404).json({ error: 'Transcription non trouvée ou vide pour cette vidéo.' });
|
@@ -49,14 +59,28 @@ app.get('/get-transcript', async (req, res) => {
|
|
49 |
res.json({ transcript: fullText });
|
50 |
|
51 |
} catch (error) {
|
52 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
53 |
if (error.message && error.message.includes('Could not find transcripts')) {
|
54 |
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é)." });
|
55 |
}
|
56 |
if (error.message && error.message.includes('is not a valid video ID')) {
|
57 |
return res.status(400).json({ error: `L'ID vidéo extrait ('${error.message.split("'")[1]}') n'est pas valide. Vérifiez l'URL.` });
|
58 |
}
|
59 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
60 |
}
|
61 |
});
|
62 |
|
|
|
38 |
}
|
39 |
|
40 |
console.log(`Fetching transcript for video ID: ${videoId}`);
|
41 |
+
|
42 |
+
// Ajout d'un timeout pour éviter que la requête reste bloquée trop longtemps
|
43 |
+
const timeoutPromise = new Promise((_, reject) =>
|
44 |
+
setTimeout(() => reject(new Error('Timeout dépassé lors de la récupération de la transcription')), 15000)
|
45 |
+
);
|
46 |
+
|
47 |
+
// Utilisation de Promise.race pour implémenter un timeout
|
48 |
+
const transcript = await Promise.race([
|
49 |
+
YoutubeTranscript.fetchTranscript(videoId),
|
50 |
+
timeoutPromise
|
51 |
+
]);
|
52 |
|
53 |
if (!transcript || transcript.length === 0) {
|
54 |
return res.status(404).json({ error: 'Transcription non trouvée ou vide pour cette vidéo.' });
|
|
|
59 |
res.json({ transcript: fullText });
|
60 |
|
61 |
} catch (error) {
|
62 |
+
// Log détaillé de l'erreur pour le débogage
|
63 |
+
console.error('Erreur détaillée lors de la récupération de la transcription:', {
|
64 |
+
message: error.message,
|
65 |
+
stack: error.stack,
|
66 |
+
name: error.name
|
67 |
+
});
|
68 |
+
|
69 |
if (error.message && error.message.includes('Could not find transcripts')) {
|
70 |
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é)." });
|
71 |
}
|
72 |
if (error.message && error.message.includes('is not a valid video ID')) {
|
73 |
return res.status(400).json({ error: `L'ID vidéo extrait ('${error.message.split("'")[1]}') n'est pas valide. Vérifiez l'URL.` });
|
74 |
}
|
75 |
+
if (error.message && error.message.includes('Timeout dépassé')) {
|
76 |
+
return res.status(504).json({ error: 'Délai d\'attente dépassé lors de la récupération de la transcription. Veuillez réessayer.' });
|
77 |
+
}
|
78 |
+
|
79 |
+
// Message d'erreur plus détaillé
|
80 |
+
res.status(500).json({
|
81 |
+
error: 'Erreur interne du serveur lors de la récupération de la transcription.',
|
82 |
+
details: error.message
|
83 |
+
});
|
84 |
}
|
85 |
});
|
86 |
|