Browse Source

correction bogues génération aperçu sonore

Rajah 10 months ago
parent
commit
095ebf02d4

BIN
html/WEB-INF/lib/javamod.jar


BIN
html/WEB-INF/lib/jogg-0.0.7.jar


+ 57 - 22
src/fr/triplea/vote/servlet/Production.java

@@ -33,6 +33,7 @@ import org.bouncycastle.util.encoders.Base64;
 import org.imgscalr.Scalr;
 import org.imgscalr.Scalr.Method;
 import org.jsoup.Jsoup;
+import org.tritonus.share.sampled.file.AudioOutputStream;
 
 import com.sun.media.jai.codec.ByteArraySeekableStream;
 import com.sun.media.jai.codec.ImageCodec;
@@ -458,7 +459,7 @@ public final class Production extends HttpServlet
 				bean.setChamp(14, "", Fiche.OBJ_CODE_HTML, "", "<span class=\"petit_texte\">Au format ZIP ou autre facilement décompactable.<br/>Au format du fichier image ou vidéo ou musique lui-même, s'il n'est pas accompagné d'un fichier .nfo.</span>", 1, 0);
 
 				bean.setChamp(15, "Aperçu", Fiche.OBJ_UPLOAD, "bsnapshot_prod", "", 64, 256); 
-				bean.setChamp(16, "", Fiche.OBJ_CODE_HTML, "", "<span class=\"petit_texte\">- Image au format JPG, PNG ou GIF.<br/>- Extrait sonore au format MP3, OGG ou WAV<br/>L'aperçu sonore ou en image ne sera proposé qu'au vote, après la présentation. Il peut aider l'électeur à se rappeler de la production.</span>", 1, 0);
+				bean.setChamp(16, "", Fiche.OBJ_CODE_HTML, "", "<span class=\"petit_texte\">- Image au format JPG, PNG ou GIF.<br/>- Extrait sonore au format MP3 ou WAV<br/>L'aperçu sonore ou en image ne sera proposé qu'au vote, après la présentation. Il peut aider l'électeur à se rappeler de la production.</span>", 1, 0);
 
 				bean.setChamp(17, "Commentaire public", Fiche.OBJ_TEXTAREA, "ccommentaire_prod", ligne.getString("CCOMMENTAIRE_PROD"), 64, 10);
 				bean.setChamp(18, "", Fiche.OBJ_CODE_HTML, "", "<span class=\"petit_texte\">Le commentaire sera affiché au moment de la présentation, avec titre, auteur, groupe et machine.<br/>Si musique, indiquer son genre voire une bonne description pour se la remémorer.</span>", 1, 0);
@@ -517,7 +518,7 @@ public final class Production extends HttpServlet
 				bean.setChamp(10, "", Fiche.OBJ_CODE_HTML, "", "<span class=\"petit_texte\">Au format ZIP ou autre facilement décompactable.<br/>Au format du fichier image ou vidéo ou musique lui-même, s'il n'est pas accompagné d'un fichier .nfo.</span>", 1, 0);
 
 				bean.setChamp(11, "Aperçu", Fiche.OBJ_UPLOAD, "bsnapshot_prod", "", 64, 256); 
-				bean.setChamp(12, "", Fiche.OBJ_CODE_HTML, "", "<span class=\"petit_texte\">- Image au format JPG, PNG ou GIF.<br/>- Extrait sonore au format MP3, OGG ou WAV<br/>L'aperçu sonore ou en image ne sera proposé qu'au vote, après la présentation. Il peut aider l'électeur à se rappeler de la production.</span>", 1, 0);
+				bean.setChamp(12, "", Fiche.OBJ_CODE_HTML, "", "<span class=\"petit_texte\">- Image au format JPG, PNG ou GIF.<br/>- Extrait sonore au format MP3 ou WAV<br/>L'aperçu sonore ou en image ne sera proposé qu'au vote, après la présentation. Il peut aider l'électeur à se rappeler de la production.</span>", 1, 0);
 
 				bean.setChamp(13, "Commentaire public", Fiche.OBJ_TEXTAREA, "ccommentaire_prod", "", 64, 10);
 				bean.setChamp(14, "", Fiche.OBJ_CODE_HTML, "", "<span class=\"petit_texte\">Le commentaire sera affiché au moment de la présentation, avec titre, auteur, groupe et machine.<br/>Si musique, indiquer son genre voire une bonne description pour se la remémorer.</span>", 1, 0);
@@ -846,7 +847,7 @@ public final class Production extends HttpServlet
 			
 			if (apercu.getTaille() > 0) 
 			{
-				apercu = PROD_getApercu(numeroParticipant, apercu, extraction);
+				apercu = PROD_getApercu(numeroParticipant, apercu, extraction, tailleLimite);
 			}
 
 			// fichier > 4 Mo, stockage hors base, avec 'external.' et numéro de participant en préfixe du nom de fichier
@@ -867,6 +868,9 @@ public final class Production extends HttpServlet
 
 		param.setString("par_cnomarchive_prod", archive.getNom());
 		param.setBlob("par_barchive_prod", archive.getDonnees());
+		
+		boolean sansApercu = (apercu.hasDonnees() == false);
+		
 		param.setInt("par_isnapshot_prod", apercu.getMime().startsWith("audio/") ? 1 : 0);
 		param.setBlob("par_bsnapshot_prod", apercu.getDonnees());
 
@@ -919,11 +923,11 @@ public final class Production extends HttpServlet
 		{
 		case 'a':
 			bean.setTitre("Ajout");
-			bean.setMessage("La production a été enregistrée." + (fichierVide ? "\n\nAttention, votre fichier est enregistré à vide. Merci de venir l'apporter à la régie, sur clef usb." : ""));
+			bean.setMessage("La production a été enregistrée." + (fichierVide ? "\n\nAttention, votre fichier est enregistré à vide. Merci de venir l'apporter à la régie, sur clef usb." : "") + (sansApercu ? "\n\nAttention, l'aperçu n'a pu être traité/généré, merci de le rajouter explicitement (si son, au format wav)." : ""));
 			break;
 		case 'm':
 			bean.setTitre("Modification");
-			bean.setMessage("La production a été actualisée." + (fichierVide ? "\n\nAttention, votre fichier est enregistré à vide. Merci de venir l'apporter à la régie, sur clef usb." : ""));
+			bean.setMessage("La production a été actualisée." + (fichierVide ? "\n\nAttention, votre fichier est enregistré à vide. Merci de venir l'apporter à la régie, sur clef usb." : "") + (sansApercu ? "\n\nAttention, l'aperçu n'a pu être traité/généré, merci de le rajouter explicitement (si son, au format wav)." : ""));
 			break;
 		case 's':
 			bean.setTitre("Suppression");
@@ -947,7 +951,7 @@ public final class Production extends HttpServlet
 	}
 
 	/** génération de l'aperçu : image (toujours traitée pour une taille normalisée) ou échantillone sonore (coupure pour extrait si copie depuis l'archive principale) */
-	private synchronized MemoireFichier PROD_getApercu(int numeroParticipant, MemoireFichier mf, boolean extrait)
+	private synchronized MemoireFichier PROD_getApercu(int numeroParticipant, MemoireFichier mf, boolean extrait, int limite)
 	{
 		String mime = mf.getMime();
 
@@ -1012,21 +1016,24 @@ public final class Production extends HttpServlet
 			    
 					AudioFormat src_format = src_ais.getFormat();
 					
-					AudioFormat dst_format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, src_format.getSampleRate(), 16, src_format.getChannels(), src_format.getChannels() * 2, src_format.getSampleRate(), false);
+					AudioFormat dst_format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, src_format.getSampleRate(), 16, src_format.getChannels(), src_format.getChannels() * 2, src_format.getFrameRate(), false);
 
 			    AudioInputStream dst_ais = AudioSystem.getAudioInputStream(dst_format, src_ais);
 
-					AudioSystem.write(dst_ais, Type.WAVE, tmp);
+			    if (AudioSystem.isConversionSupported(dst_format, src_format))
+			    {
+						AudioSystem.write(dst_ais, Type.WAVE, tmp);
 
-					src_ais.close(); dst_ais.close(); 
+						src_ais.close(); dst_ais.close(); 
 
-					if (tmp.exists()) 
-					{
-						mf = new MemoireFichier("", "audio/wav", IOUtils.toByteArray(new FileInputStream(tmp.getAbsolutePath())));
-						mime = "audio/wav";
-						
-						tmp.delete();
-					}
+						if (tmp.exists()) 
+						{
+							mf = new MemoireFichier("", "audio/wav", IOUtils.toByteArray(new FileInputStream(tmp.getAbsolutePath())));
+							mime = "audio/wav";
+							
+							tmp.delete();
+						}
+			    }
 				}
 			
 				if (mime.equals("audio/wav") && extrait)
@@ -1042,7 +1049,7 @@ public final class Production extends HttpServlet
 			    AudioFormat src_format = src_ais.getFormat();
 
 			    src_ais.skip(debut * (src_format.getFrameSize() * (int)src_format.getFrameRate()));
-				
+							    
 					AudioInputStream dst_ais = new AudioInputStream(src_ais, src_format, longueur * (int)src_format.getFrameRate());
 			      
 		      AudioSystem.write(dst_ais, Type.WAVE, tmp);
@@ -1056,10 +1063,34 @@ public final class Production extends HttpServlet
 						
 						tmp.delete();
 					}
+					// TODO : diminuer taille échantillon via baisse qualité 
+					/*
+					src_ais = AudioSystem.getAudioInputStream(new ByteArrayInputStream(mf.getDonnees()));
+
+					AudioFormat dst_format = new AudioFormat((float) 8000.0, (int) 8, (int) 1, true, false);
+							
+					dst_ais = new AudioInputStream(src_ais, dst_format, longueur * (int)src_format.getFrameRate());
+
+		      AudioSystem.write(dst_ais, Type.WAVE, tmp);
+
+					src_ais.close(); dst_ais.close(); 
+
+					if (tmp.exists()) 
+					{
+						mf = new MemoireFichier("", "audio/wav", IOUtils.toByteArray(new FileInputStream(tmp.getAbsolutePath())));
+						mime = "audio/wav";
+						
+						tmp.delete();
+					}
+					*/
 				}
+				
+				if (!(mime.equals("audio/wav"))) { debug.affiche(numeroParticipant, "Erreur dans de la conversion de l'aperçu sonore. " + mime + " " + mf.getNom()); mf = new MemoireFichier(null, null, null); }
+			
+				if (mf.getTaille() > (limite * 1048576)) { debug.affiche(numeroParticipant, "Taille trop importante de l'aperçu sonore. " + mime + " " + mf.getNom()); mf = new MemoireFichier(null, null, null); }
 			}
 		}
-		catch (Exception e) { debug.affiche(numeroParticipant, "Erreur dans de la conversion de l'aperçu " + e.toString()); }
+		catch (Exception e) { debug.affiche(numeroParticipant, "Erreur dans de la conversion de l'aperçu. " + mime + " " + mf.getNom() + " " + e.toString()); mf = new MemoireFichier(null, null, null); }
 
 		//debug.affiche(numeroParticipant,"après: " + mf.getTaille()); 
 
@@ -1178,9 +1209,12 @@ public final class Production extends HttpServlet
 
 		if (type.trim().length() == 0) { type = "AUTRE"; }
 
+		SqlINI ini1 = new SqlINI(pool, "Productions", "TAILLE_LIMITE_STOCKAGE_BASE", "4"); ini1.lecture();
+		int tailleLimite = Math.max(1, Math.min(ini1.getInt(), 4)); // en Mo
+
 		if (apercu.getTaille() > 0) 
 		{
-			apercu = PROD_getApercu(numeroParticipant, apercu, false);
+			apercu = PROD_getApercu(numeroParticipant, apercu, false, tailleLimite);
 		}
 
 	  SqlPARAM param = new SqlPARAM();
@@ -1201,10 +1235,8 @@ public final class Production extends HttpServlet
 		param.setString("par_cauteur_prod", auteur);
 		param.setString("par_cgroup_prod", groupe);
 		param.setString("par_cplateforme_prod", plateforme);
-		param.setInt("par_isnapshot_prod", apercu.getMime().startsWith("audio/") ? 1 : 0);
-		param.setBlob("par_bsnapshot_prod", apercu.getDonnees());
 		param.setString("par_ccommentaire_prod", commentaire);
-
+		
 		SqlORDER ordre = new SqlORDER(pool, numeroParticipant);
 
 		abandon = ordre.execute("UPDATE VOTE.PRODUCTIONS SET DMOD_PROD = CURRENT_TIMESTAMP, CTYPE_PROD = :par_ctype_prod, CTITRE_PROD = :par_ctitre_prod, CAUTEUR_PROD = :par_cauteur_prod, CGROUP_PROD = :par_cgroup_prod, CPLATEFORME_PROD = :par_cplateforme_prod, CCOMMENTAIRE_PROD = :par_ccommentaire_prod WHERE INO_PROD = :par_ino_prod ", param, debug);
@@ -1213,6 +1245,9 @@ public final class Production extends HttpServlet
 
 		if (apercu.getTaille() > 0) 
 		{ 
+			param.setInt("par_isnapshot_prod", apercu.getMime().startsWith("audio/") ? 1 : 0);
+			param.setBlob("par_bsnapshot_prod", apercu.getDonnees());
+
 			abandon = ordre.execute("UPDATE VOTE.PRODUCTIONS SET ISNAPSHOT_PROD = :par_isnapshot_prod, BSNAPSHOT_PROD = :par_bsnapshot_prod WHERE INO_PROD = :par_ino_prod ", param, debug);
 
 			if (abandon != 0) { afficheErreur(request, response, numeroParticipant, contexte.trim(), commun.MSG_get(46)); return; }

File diff suppressed because it is too large
+ 1 - 1
src/fr/triplea/vote/sql/SqlPARAM.java


File diff suppressed because it is too large
+ 1 - 1
src/fr/triplea/vote/util/MemoireFichier.java