Spaces:
Sleeping
Sleeping
Upload 7 files
Browse files- public/index.html +4 -0
- public/script.js +9 -5
- public/style.css +9 -0
- server.js +11 -1
public/index.html
CHANGED
|
@@ -15,6 +15,10 @@
|
|
| 15 |
Cette application utilise un algorithme JavaScript exécuté dans votre navigateur
|
| 16 |
pour résumer le contenu textuel (transcription) d'une vidéo YouTube.
|
| 17 |
</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
| 18 |
|
| 19 |
<label for="youtube-url">URL de la vidéo YouTube :</label>
|
| 20 |
<input type="text" id="youtube-url" placeholder="Ex: https://www.youtube.com/watch?v=dQw4w9WgXcQ">
|
|
|
|
| 15 |
Cette application utilise un algorithme JavaScript exécuté dans votre navigateur
|
| 16 |
pour résumer le contenu textuel (transcription) d'une vidéo YouTube.
|
| 17 |
</p>
|
| 18 |
+
|
| 19 |
+
<div class="info-box">
|
| 20 |
+
<p><strong>Important :</strong> Cette application fonctionne uniquement avec les vidéos YouTube qui ont des sous-titres/transcriptions disponibles (activés par le créateur ou générés automatiquement).</p>
|
| 21 |
+
</div>
|
| 22 |
|
| 23 |
<label for="youtube-url">URL de la vidéo YouTube :</label>
|
| 24 |
<input type="text" id="youtube-url" placeholder="Ex: https://www.youtube.com/watch?v=dQw4w9WgXcQ">
|
public/script.js
CHANGED
|
@@ -108,10 +108,14 @@ document.addEventListener('DOMContentLoaded', () => {
|
|
| 108 |
const data = await response.json();
|
| 109 |
|
| 110 |
if (!response.ok) {
|
| 111 |
-
// Afficher l'erreur détaillée si disponible
|
| 112 |
-
|
| 113 |
-
|
| 114 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 115 |
throw new Error(errorMessage);
|
| 116 |
}
|
| 117 |
|
|
@@ -145,7 +149,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
|
| 145 |
}
|
| 146 |
|
| 147 |
function showError(message) {
|
| 148 |
-
errorDiv.
|
| 149 |
errorDiv.style.display = 'block';
|
| 150 |
}
|
| 151 |
|
|
|
|
| 108 |
const data = await response.json();
|
| 109 |
|
| 110 |
if (!response.ok) {
|
| 111 |
+
// Afficher l'erreur détaillée si disponible avec la solution si fournie
|
| 112 |
+
let errorMessage = data.error || `Erreur HTTP: ${response.status}`;
|
| 113 |
+
if (data.details) {
|
| 114 |
+
errorMessage += ` Détails: ${data.details}`;
|
| 115 |
+
}
|
| 116 |
+
if (data.solution) {
|
| 117 |
+
errorMessage += `\n💡 Solution: ${data.solution}`;
|
| 118 |
+
}
|
| 119 |
throw new Error(errorMessage);
|
| 120 |
}
|
| 121 |
|
|
|
|
| 149 |
}
|
| 150 |
|
| 151 |
function showError(message) {
|
| 152 |
+
errorDiv.innerHTML = message.replace(/\n/g, '<br>');
|
| 153 |
errorDiv.style.display = 'block';
|
| 154 |
}
|
| 155 |
|
public/style.css
CHANGED
|
@@ -71,6 +71,15 @@ button:hover {
|
|
| 71 |
border-radius: 4px;
|
| 72 |
}
|
| 73 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 74 |
#loading {
|
| 75 |
text-align: center;
|
| 76 |
padding: 10px;
|
|
|
|
| 71 |
border-radius: 4px;
|
| 72 |
}
|
| 73 |
|
| 74 |
+
.info-box {
|
| 75 |
+
background-color: #e6f7ff;
|
| 76 |
+
border: 1px solid #91d5ff;
|
| 77 |
+
color: #1890ff;
|
| 78 |
+
padding: 10px;
|
| 79 |
+
margin: 15px 0;
|
| 80 |
+
border-radius: 4px;
|
| 81 |
+
}
|
| 82 |
+
|
| 83 |
#loading {
|
| 84 |
text-align: center;
|
| 85 |
padding: 10px;
|
server.js
CHANGED
|
@@ -66,6 +66,7 @@ app.get('/get-transcript', async (req, res) => {
|
|
| 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 |
}
|
|
@@ -76,7 +77,16 @@ app.get('/get-transcript', async (req, res) => {
|
|
| 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 |
-
//
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 80 |
res.status(500).json({
|
| 81 |
error: 'Erreur interne du serveur lors de la récupération de la transcription.',
|
| 82 |
details: error.message
|
|
|
|
| 66 |
name: error.name
|
| 67 |
});
|
| 68 |
|
| 69 |
+
// Gestion des cas d'erreur spécifiques
|
| 70 |
if (error.message && error.message.includes('Could not find transcripts')) {
|
| 71 |
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é)." });
|
| 72 |
}
|
|
|
|
| 77 |
return res.status(504).json({ error: 'Délai d\'attente dépassé lors de la récupération de la transcription. Veuillez réessayer.' });
|
| 78 |
}
|
| 79 |
|
| 80 |
+
// Nouvelle gestion spécifique pour les transcriptions désactivées
|
| 81 |
+
if (error.message && error.message.includes('Transcript is disabled')) {
|
| 82 |
+
const videoId = error.message.match(/\(([^)]+)\)/)?.[1] || "cette vidéo";
|
| 83 |
+
return res.status(404).json({
|
| 84 |
+
error: `Les sous-titres/transcriptions sont désactivés sur cette vidéo (ID: ${videoId}).`,
|
| 85 |
+
solution: "Essayez une autre vidéo qui possède des sous-titres activés."
|
| 86 |
+
});
|
| 87 |
+
}
|
| 88 |
+
|
| 89 |
+
// Message d'erreur plus détaillé pour les autres cas
|
| 90 |
res.status(500).json({
|
| 91 |
error: 'Erreur interne du serveur lors de la récupération de la transcription.',
|
| 92 |
details: error.message
|