source: spip-zone/_plugins_/spipmotion/trunk/inc/spipmotion_encodage.php @ 67719

Last change on this file since 67719 was 67719, checked in by kent1@…, 7 years ago

Ne pas utiliser map_metadatas qui ne fonctionne pas avec FFMpeg 1.0 de la même manière et qui n'a que très peu d'intérêt pour l'instant

Améliorer la récupération d'infos qui ne marchaient pas avec FFMpeg 1.0

File size: 24.0 KB
Line 
1<?php
2/**
3 * SPIPmotion
4 * Gestion de l'encodage et des métadonnées de vidéos directement dans spip
5 *
6 * Auteurs :
7 * kent1 (http://www.kent1.info - kent1@arscenic.info)
8 * 2008-2012 - Distribué sous licence GNU/GPL
9 *
10 */
11
12if (!defined("_ECRIRE_INC_VERSION")) return;
13
14function inc_spipmotion_encodage_dist($id_document,$options = array()){
15        if(!is_array($GLOBALS['spipmotion_metas'])){
16                $inc_meta = charger_fonction('meta', 'inc');
17                $inc_meta('spipmotion_metas');
18        }
19        /**
20         * On vérifie s'il y a des ffmpeg en cours sur le serveur,
21         * s'il y en a 3 ou plus, on attend
22         */
23        $ps_ffmpeg = exec('ps -C ffmpeg',$retour,$retour_int);
24        if(($retour_int == 1) && (count($retour) >= 3)){
25                spip_log('Il y a a apparemment trop de processus de ffmpeg en cours, on attend donc','spipmotion');
26                $ret['success'] = true;
27                $ret['statut'] = 'non';
28                return $ret;
29        }
30       
31        $format = $options['format'];
32        $source = sql_fetsel('*','spip_documents','id_document='.intval($id_document));
33        /**
34         * On vérifie que l'on n'a pas déjà une version dans le format souhaité
35         * Si oui on la supprime avant de la réencoder
36         */
37         if($id_document = sql_getfetsel('document.id_document',
38                                                                        'spip_documents as document LEFT JOIN spip_documents_liens as lien ON document.id_document=lien.id_document',
39                                                                        'lien.id_objet='.intval($source['id_document']).' AND lien.objet='.sql_quote("document").' AND document.extension='.sql_quote($format).' AND document.mode='.sql_quote("conversion"))){
40                spip_log("Il faut supprimer $id_document",'spipmotion');
41                $v = sql_fetsel("id_document,id_vignette,fichier","spip_documents","id_document=".intval($id_document));
42               
43                include_spip('inc/documents');
44                /**
45                 * On ajoute l'id_document dans la liste des documents
46                 * à supprimer de la base
47                 * On supprime le fichier correspondant
48                 */
49                $liste[] = $v['id_document'];
50                if (($nb = sql_countsel('spip_documents','fichier='.sql_quote($v['fichier'])) == '1') && @file_exists($f = get_spip_doc($v['fichier']))) {
51                        supprimer_fichier($f);
52                }
53
54                /**
55                 * Si le document a une vignette :
56                 * - On ajoute l'id_document dans la liste à supprimer
57                 * - On supprime le fichier correspondant à la vignette
58                 */
59                if($v['id_vignette'] > 0){
60                        spip_log("on supprime sa vignette également","spipmotion");
61                        $liste[] = $v['id_vignette'];
62                        $fichier = sql_getfetsel('fichier','spip_documents','id_document='.$v['id_vignette']);
63                        if (($nb = sql_countsel('spip_documents','fichier='.sql_quote($fichier)) == '1') && @file_exists($f = get_spip_doc($fichier))) {
64                                supprimer_fichier($f);
65                        }
66                }
67
68                if(is_array($liste)){
69                        $in = sql_in('id_document', $liste);
70                        sql_delete("spip_documents", $in);
71                        sql_delete("spip_documents_liens", $in);
72                        sql_delete("spip_facd_conversions", "id_document=".intval($id_document).' AND statut != '.sql_quote('oui').' AND extension='.sql_quote($format).' AND id_facd_conversion!='.intval($options['id_facd_conversion']));
73                }
74        }
75        /**
76         * Puis on lance l'encodage
77         */
78        return encodage($source,$options);
79}
80
81/**
82 * Fonction de lancement de l'encodage
83 *
84 * @param array $source Les informations du fichier source
85 * @param int $doc_attente id_facd_conversion L'id de la file d'attente
86 */
87function encodage($source,$options){
88        $ret = array();
89        spip_log('On encode le document : '.$source['id_document'],'spipmotion');
90        /**
91         * Si le chemin vers le binaire FFMpeg n'existe pas,
92         * la configuration du plugin crée une meta spipmotion_casse
93         */
94        if($GLOBALS['meta']['spipmotion_casse'] == 'oui'){
95                $ret['success'] = false;
96                $ret['erreur'] = 'spipmotion_casse';
97                return ;
98        }
99       
100        include_spip('inc/config');
101        $spipmotion_compiler = @unserialize($GLOBALS['spipmotion_metas']['spipmotion_compiler']);
102        $ffmpeg_version = $spipmotion_compiler['ffmpeg_version'] ? $spipmotion_compiler['ffmpeg_version'] : '0.7';
103        $rep_dest = sous_repertoire(_DIR_VAR, 'cache-spipmotion');
104
105        $extension_attente = $options['format'];
106
107        $encodeur = lire_config("spipmotion/encodeur_$extension_attente",'');
108        $chemin_ffmpeg = (strlen(lire_config('spipmotion/chemin')) > 0) ? "--p ".lire_config('spipmotion/chemin') : '';
109        if($source['rotation'] == '90'){
110                $encodeur = 'ffmpeg';
111        }
112       
113        include_spip('inc/documents');
114        $chemin = get_spip_doc($source['fichier']);
115        spip_log("encodage de $chemin","spipmotion");
116
117        $fichier = basename($source['fichier']);
118
119        /**
120         * Génération des noms temporaires et finaux
121         * - Le nom du dossier temporaire (tmp/spipmotion)
122         * - Le nom du fichier final (nom_du_fichier-encoded.ext)
123         * - Le nom du fichier temporaire durant l'encodage
124         * - Le nom du fichier de log généré pour chaque fichier
125         */
126        $query = "$fichier-$extension_attente-".date('Y_m_d_H-i-s');
127        $dossier = sous_repertoire(_DIR_VAR, 'cache-spipmotion');
128        $fichier_final = substr($fichier,0,-(strlen($source['extension'])+1)).'-encoded.'.$extension_attente;
129        $fichier_temp = "$dossier$query.$extension_attente";
130        $fichier_log = "$dossier$query.log";
131       
132        /**
133         * Si on n'a pas l'info hasaudio c'est que la récupération d'infos n'a pas eu lieu
134         * On relance la récupération d'infos sur le document
135         * On refais une requête pour récupérer les nouvelles infos
136         */
137        if(!$source['hasaudio'] OR !$source['hasvideo']){
138                spip_log('on récup les infos pour vérif audio','spipmotion');
139                $recuperer_infos = charger_fonction('spipmotion_recuperer_infos','inc');
140                $recuperer_infos($source['id_document']);
141                $source = sql_fetsel('*','spip_documents','id_document ='.intval($source['id_document']));
142                if(!$source['hasaudio'] OR !$source['hasvideo']){
143                        spip_log('La source n a ni audio ni video','spipmotion');
144                        return false;
145                }
146        }
147
148        /**
149         * $texte est le contenu du fichier de preset que l'on passe à la commande
150         * Certaines valeurs ne fonctionnent pas (et doivent être passées à la commande directement)
151         * comme:
152         * s = la taille
153         * r = le nombre de frames par secondes
154         * ac = le nombre de channels audio (ne provoquent pas d'erreurs mais ne passent pas)
155         */
156        $texte = '';
157
158        /**
159         * Quelques définitions communes aux videos et sons
160         * Vérifications de certaines options afin qu'elles ne cassent pas les encodages
161         */
162
163        /**
164         * Correction des paramètres audio
165         * Uniquement s'il y a une piste audio
166         * -* codec à utiliser
167         * -* bitrate
168         * -* samplerate
169         * -* nombre de canaux
170         */
171        if($source['hasaudio'] == 'oui'){
172                $acodec = lire_config("spipmotion/acodec_$extension_attente") ? "--acodec ".lire_config("spipmotion/acodec_$extension_attente") :'';
173                if(($encodeur == "ffmpeg") && ($acodec == "--acodec vorbis")){
174                        $acodec = '--acodec libvorbis';
175                }
176                if(in_array(lire_config("spipmotion/acodec_$extension_attente",''),array('vorbis','libvorbis'))){
177                        $qualite = lire_config("spipmotion/qualite_audio_$extension_attente",'4');
178                        $audiobitrate_ffmpeg2theora = "--audioquality $qualite";
179                        $audiobitrate_ffmpeg = "--audioquality $qualite";
180                }else{
181                        if(intval($source['audiobitrate']) && (intval($source['audiobitrate']) < (lire_config("spipmotion/bitrate_audio_$extension_attente","64")*1000))){
182                                $audiobitrates = array('32000','64000','96000','128000','192000','256000');
183                                if(!in_array($source['audiobitrate'],$audiobitrates)){
184                                        $bitrate_final = min($audiobitrates);
185                                        foreach($audiobitrates as $bitrate){
186                                                if($source['audiobitrate'] >= $bitrate){
187                                                        $bitrate_final = $bitrate;
188                                                }
189                                        }
190                                        $abitrate = $bitrate_final;
191                                }else{
192                                        $abitrate = $source['audiobitrate'];
193                                }
194                                $abitrate = floor($abitrate/1000);
195                        }else{
196                                $abitrate = lire_config("spipmotion/bitrate_audio_$extension_attente","64");
197                        }
198                        $texte .= "ab=".$abitrate."000\n";
199                        $audiobitrate_ffmpeg = $audiobitrate_ffmpeg2theora = "--audiobitrate ".$abitrate;
200                }
201
202                /**
203                 * Vérification des samplerates
204                 */
205                if(intval($source['audiosamplerate']) && (intval($source['audiosamplerate']) < lire_config("spipmotion/frequence_audio_$extension_attente","22050"))){
206                        $audiosamplerates = array('4000','8000','11025','16000','22050','24000','32000','44100','48000');
207                        /**
208                         * libmp3lame ne gère pas tous les samplerates
209                         */
210                        if($acodec == '--acodec libmp3lame'){
211                                unset($audiosamplerates[0]);
212                                unset($audiosamplerates[1]);
213                                unset($audiosamplerates[3]);
214                                unset($audiosamplerates[5]);
215                                unset($audiosamplerates[6]);
216                                unset($audiosamplerates[8]);
217                        }
218                        if($acodec == '--acodec libfaac'){
219                                unset($audiosamplerates[0]);
220                                unset($audiosamplerates[1]);
221                                unset($audiosamplerates[2]);
222                                unset($audiosamplerates[3]);
223                        }
224                        /**
225                         * ffmpeg ne peut resampler
226                         * On force le codec audio à aac s'il était à libmp3lame
227                         */
228                        if(($source['audiochannels'] > 2) && ($encodeur != 'ffmpeg2theora')){
229                                $samplerate = $source['audiosamplerate'];
230                                if($acodec == '--acodec libmp3lame'){
231                                        $acodec = '--acodec libfaac';
232                                        $audiobitrate_ffmpeg = $audiobitrate_ffmpeg2theora = "--audiobitrate 128";
233                                }
234                        }else if(!in_array($source['audiosamplerate'],$audiosamplerates)){
235                                $audiosamplerate_final = min($audiosamplerates);
236                                foreach($audiosamplerates as $samplerate){
237                                        if($source['audiosamplerate'] >= $samplerate){
238                                                $audiosamplerate_final = $samplerate;
239                                        }
240                                }
241                                $samplerate = $audiosamplerate_final;
242                        }else{
243                                $samplerate = $source['audiosamplerate'];
244                        }
245                }else{
246                        if(($source['audiochannels'] > 2) && ($encodeur != 'ffmpeg2theora')){
247                                $samplerate = $source['audiosamplerate'];
248                                if($acodec == '--acodec libmp3lame'){
249                                        $acodec = '--acodec libfaac';
250                                        $audiobitrate_ffmpeg = $audiobitrate_ffmpeg2theora = "--audiobitrate 128";
251                                }
252                        }else{
253                                $samplerate = lire_config("spipmotion/frequence_audio_$extension_attente","22050");
254                        }
255                }
256                $audiofreq = "--audiofreq ".$samplerate;
257                $texte .= "ar=$samplerate\n";
258               
259                /**
260                 * On passe en stereo ce qui a plus de 2 canaux et ce qui a un canal et dont
261                 * le format choisi est vorbis (l'encodeur vorbis de ffmpeg ne gère pas le mono)
262                 */
263                if(in_array($extension_attente,array('ogg','ogv','oga'))
264                                && ($source['audiochannels'] < 2)
265                                && ($encodeur != 'ffmpeg2theora')){
266                        $audiochannels = 2;
267                }else{
268                        $audiochannels = $source['audiochannels'];
269                }
270
271                if(intval($audiochannels) >= 1){
272                        /**
273                         * Apparemment le mp3 n'aime pas trop le 5.1 channels des AC3 donc on downgrade en 2 channels en attendant
274                         */
275                        if($extension_attente == 'mp3'){
276                                $texte .= "ac=2\n";
277                                $audiochannels_ffmpeg = "--ac 2";
278                        }else{
279                                $texte .= "ac=$audiochannels\n";
280                                $audiochannels_ffmpeg = "--ac $audiochannels";
281                        }
282                }
283                $ss_audio = '';
284        }else{
285                $ss_audio = '-an';
286        }
287
288        if($GLOBALS['spipmotion_metas']['spipmotion_safe_mode'] == 'oui'){
289                $spipmotion_sh = $GLOBALS['spipmotion_metas']['spipmotion_safe_mode_exec_dir'].'/spipmotion.sh'; 
290        }else{
291                $spipmotion_sh = find_in_path('script_bash/spipmotion.sh');
292        }
293
294        /**
295         * Encodage
296         * Cas d'un fichier audio
297         */
298        if(in_array($source['extension'],lire_config('spipmotion/fichiers_audios_encodage',array()))){
299                /**
300                 * Encodage du son
301                 */
302                $encodage = $spipmotion_sh.' --e '.$chemin.' --s '.$fichier_temp.' '.$acodec.' '.$audiobitrate_ffmpeg.' '.$audiofreq.' '.$audiochannels_ffmpeg.' -f '.$chemin_ffmpeg.' --log '.$fichier_log;
303                spip_log("$encodage",'spipmotion');
304                $lancement_encodage = exec($encodage,$retour,$retour_int);
305                spip_log($retour_int,'spipmotion');
306                if($retour_int == 0){
307                        $ret['success'] = true;
308                }else if($retour_int >= 126){
309                        $ret['success'] = false;
310                        $ret['erreur'] = _T('spipmotion:erreur_script_spipmotion_non_executable');
311                        ecrire_fichier($fichier_log,$ret['erreur']);
312                }
313        }
314
315        /**
316         * Encodage
317         * Cas d'un fichier vidéo
318         *
319         * On corrige les paramètres video avant de lancer l'encodage
320         */
321        if(in_array($source['extension'],lire_config('spipmotion/fichiers_videos_encodage',array()))){
322                $format = lire_config("spipmotion/format_$extension_attente");
323               
324                $width = $source['largeur'];
325                $height = $source['hauteur'];
326                $width_finale = lire_config("spipmotion/width_$extension_attente",480);
327               
328                /**
329                 * Les ipod/iphones 3Gs et inférieur ne supportent pas de résolutions > à 640x480
330                 */
331                if($format == 'ipod' && ($width_finale > 640))
332                        $width_finale = 640;
333
334                /**
335                 * On n'agrandit jamais la taille
336                 * si la taille demandée est supérieure à la taille originale
337                 */
338                if($width < $width_finale){
339                        $width_finale = $width;
340                        $height_finale = $height;
341                }
342                else{
343                        /**
344                         * Calcul de la hauteur en fonction de la largeur souhaitée
345                         * et de la taille de la video originale
346                         */
347                        $height_finale = intval(round($source['hauteur']/($source['largeur']/$width_finale)));
348                }
349
350                /**
351                 * Pour certains codecs (libx264 notemment), width et height doivent être
352                 * divisibles par 2
353                 * On le fait pour tous les cas pour éviter toute erreur
354                 */
355                if(!is_int($width_finale/2)){
356                        $width_finale = $width_finale +1;
357                }
358                if(!is_int($height_finale/2)){
359                        $height_finale = $height_finale +1;
360                }
361
362                $video_size = "--size ".$width_finale."x".$height_finale;
363
364                /**
365                 * Définition du framerate d'encodage
366                 * - Si le framerate de la source est supérieur à celui de la configuration souhaité, on prend celui de la configuration
367                 * - Sinon on garde le même que la source
368                 */
369                $texte .= lire_config("spipmotion/vcodec_$extension_attente") ? "vcodec=".lire_config("spipmotion/vcodec_$extension_attente")."\n":'';
370                $vcodec .= lire_config("spipmotion/vcodec_$extension_attente") ? "--vcodec ".lire_config("spipmotion/vcodec_$extension_attente") :'';
371
372                $fps_conf = (intval(lire_config("spipmotion/fps_$extension_attente","30")) > 0) ? lire_config("spipmotion/fps_$extension_attente","30") : ((intval($source['framerate']) > 0) ? intval($source['framerate']) : 24);
373                if(intval($source['framerate']) && (intval($source['framerate']) < $fps_conf)){
374                        $fps_num = $source['framerate'];
375                }else{
376                        $fps_num = (intval($fps_conf) > 0) ? $fps_conf : $source['framerate'];
377                }
378                $fps = "--fps $fps_num";
379
380                /**
381                 * Définition des bitrates
382                 * On vérifie ceux de la source et on compare à ceux souhaités dans la conf
383                 * Si la source est inférieure, on utilise ceux de la source en utilisant l'option -sameq
384                 * ffmpeg2theora lui a besoin d'une estimation de bitrate
385                 */
386                if(intval($source['videobitrate']) && (intval($source['videobitrate']) < (lire_config("spipmotion/bitrate_$extension_attente","448"))*1000)){
387                        if(($encodeur == 'ffmpeg2theora') OR ($vcodec == '--vcodec libtheora')){
388                                $vbitrate = $source['videobitrate'];
389                        }else{
390                                $vbitrate = null;
391                                $infos_sup_normal .= ' -sameq ';
392                        }
393                        $bitrate = "--bitrate ".$source['videobitrate'];
394                }else{
395                        $vbitrate = lire_config("spipmotion/bitrate_$extension_attente","448");
396                        $bitrate = "--bitrate $vbitrate";
397                }
398
399                $texte .= intval($vbitrate) ? "vb=".$vbitrate."000\n" : "";
400                $bitrate = intval($vbitrate) ? "--bitrate ".$vbitrate : "";
401               
402                $configuration = array();
403                if(is_array($spipmotion_compiler['configuration'])){
404                        $configuration = $spipmotion_compiler['configuration'];
405                }
406                /**
407                 * Paramètres supplémentaires pour encoder en h264
408                 */
409                if($vcodec == '--vcodec libx264'){
410                        $preset_quality = lire_config("spipmotion/vpreset_$extension_attente",'slow');
411                        if(in_array('--enable-pthreads',$configuration)){
412                                $infos_sup_normal .= " -threads 0 ";
413                        }
414                        /**
415                         * Encodage pour Ipod/Iphone (<= 3G)
416                         */
417                        if($format == 'ipod'){
418                                if(version_compare($ffmpeg_version,'0.7.10','<')){
419                                        $infos_sup_normal .= ' -vpre baseline -vpre ipod640';
420                                }else{
421                                        $infos_sup_normal .= ' -profile baseline -vpre ipod640';       
422                                }
423                        }
424                        /**
425                         * Encodage pour PSP
426                         * http://rob.opendot.cl/index.php/useful-stuff/psp-video-guide/
427                         */
428                        else if($format == 'psp'){
429                                $infos_sup_normal .= ' -vpre main';
430                                $infos_sup_normal .= ' -level 21';
431                                $infos_sup_normal .= ' -refs 2';
432                        }
433                        $infos_sup_normal .= " -aspect $width_finale:$height_finale";
434                        //if($format)
435                        //      $infos_sup_normal .= ' -f '.$format;
436                }
437                if(($vcodec == "--vcodec libtheora") && ($encodeur != 'ffmpeg2theora')){
438                        if(in_array('--enable-pthreads',$configuration)){
439                                $infos_sup_normal .= " -threads 0 ";
440                        }
441                }
442                $fichier_texte = "$dossier$query.txt";
443
444                ecrire_fichier($fichier_texte,$texte);
445
446                /**
447                 * Encodage de la video
448                 * Si l'encodeur choisi est ffmpeg2theora et qu'il existe toujours, on l'utilise
449                 * sinon on utilise notre script pour ffmpeg
450                 */
451                $passes = lire_config("spipmotion/passes_$extension_attente",'1');
452                $pass_log_file = $dossier.$query.'-pass';
453               
454                $ffmpeg2theora = @unserialize($GLOBALS['spipmotion_metas']['spipmotion_ffmpeg2theora']);
455                if(($encodeur == 'ffmpeg2theora') && ($ffmpeg2theora['version'] > 0)){
456                        if($passes == 2)
457                                $deux_passes = '--two-pass';
458                        $encodage = $spipmotion_sh." --force true $video_size --e $chemin --videoquality ".lire_config('spipmotion/qualite_video_ffmpeg2theora_'.$extension_attente,7)." $fps $bitrate $audiofreq $audiobitrate_ffmpeg2theora $audiochannels_ffmpeg2theora --s $fichier_temp $deux_passes --log $fichier_log --encodeur ffmpeg2theora";
459                        spip_log($encodage,'spipmotion');
460                        $lancement_encodage = exec($encodage,$retour,$retour_int);
461                }else{
462                        if(($passes == "2") && ((($vcodec == '--vcodec libx264') && ($preset_quality != 'hq')) OR ($vcodec == '--vcodec flv') OR ($vcodec == '--vcodec libtheora') OR ($extension_attente == 'webm'))){
463                                spip_log('Premiere passe','spipmotion');
464                                if ($ffmpeg_version < '0.7'){
465                                        $preset_1 = $preset_quality ? '-vpre '.$preset_quality.'_firstpass' : '';
466                                }else{
467                                        $preset_1 = $preset_quality ? '-preset '.$preset_quality : '';
468                                }
469                                if($source['rotation'] == '90'){
470                                        $rotation = "-vf transpose=1";
471                                }
472                                $infos_sup_normal_1 = "--params_supp \"-an $preset_1 -passlogfile $pass_log_file $infos_sup_normal $rotation\"";
473                                $encodage_1 = $spipmotion_sh." --force true --pass 1 $video_size --e $chemin $vcodec $fps $bitrate $infos_sup_normal_1 --s $fichier_temp $chemin_ffmpeg --log $fichier_log";
474                                spip_log($encodage_1,'spipmotion');
475                                $lancement_encodage_1 = exec($encodage_1,$retour_1,$retour_int_1);
476                                spip_log($retour_1,'spipmotion');
477                                /**
478                                 * La première passe est ok
479                                 * On lance la seconde
480                                 */
481                                if($retour_int_1 == 0){
482                                        spip_log('Seconde passe','spipmotion');
483                                        if ($ffmpeg_version < '0.7'){
484                                                $infos_sup_normal = $preset_quality ? "-vpre $preset_quality $infos_sup_normal" : $infos_sup_normal;
485                                        }else{
486                                                $infos_sup_normal = $preset_quality ? "-preset $preset_quality $infos_sup_normal" : $infos_sup_normal;
487                                        }
488                                        $metadatas = "";
489                                        //$metadatas = "-map_metadata 0:0";
490                                        $metadatas_supp = '';
491                                        $metas_orig = @unserialize($source['metas']);
492                                       
493                                        $infos_sup_normal_2 = '--params_supp \'-passlogfile '.$pass_log_file.' '.$ss_audio.' '.$infos_sup_normal.' '.$rotation.' '.$metadatas.'\'';
494                                        $encodage = $spipmotion_sh." --force true --pass 2 $audiofreq $audiobitrate_ffmpeg $audiochannels_ffmpeg $video_size --e $chemin $acodec $vcodec $fps $bitrate $infos_sup_normal_2  --fpre $fichier_texte --s $fichier_temp $chemin_ffmpeg --log $fichier_log";
495                                        spip_log($encodage,'spipmotion');
496                                        $lancement_encodage = exec($encodage,$retour,$retour_int);
497                                        spip_log($retour,'spipmotion');
498                                }else{
499                                        spip_log('SPIPMOTION Erreur : Le retour de l encodage est revenu en erreur','spipmotion'._LOG_CRITICAL);
500                                        $retour_int = 1;
501                                }
502                        }else{
503                                spip_log('on encode en 1 passe','spipmotion');
504                                $infos_sup_normal = "$ss_audio ";
505                                if ($ffmpeg_version < '0.7'){
506                                        $infos_sup_normal .= $preset_quality ? "-vpre $preset_quality $infos_sup_normal":'';
507                                }else{
508                                        $infos_sup_normal .= $preset_quality ? "-preset $preset_quality $infos_sup_normal":'';
509                                }
510                                if($source['rotation'] == '90'){
511                                        $rotation = "-vf transpose=1";
512                                }
513                                //$infos_sup_normal .= " -map_metadata 0:0";
514                                if($infos_sup_normal){
515                                        $infos_sup_normal = "--params_supp \"$infos_sup_normal\"";
516                                }
517                                $encodage = $spipmotion_sh." --force true $audiofreq $video_size --e $chemin $acodec $vcodec $fps $audiobitrate_ffmpeg $audiochannels_ffmpeg $bitrate $infos_sup_normal --s $fichier_temp --fpre $fichier_texte $chemin_ffmpeg --log $fichier_log";
518                                spip_log($encodage,'spipmotion');
519                                $lancement_encodage = exec($encodage,$retour,$retour_int);
520                        }
521                }
522
523                if($retour_int == 0){
524                        $ret['success'] = true;
525                }else if($retour_int >= 126){
526                        $ret['success'] = false;
527                        $ret['erreur'] = _T('spipmotion:erreur_script_spipmotion_non_executable');
528                        ecrire_fichier($fichier_log,$ret['erreur']);
529                }
530        }
531
532        if($ret['success'] && file_exists(get_spip_doc($source['fichier']))){
533                /**
534                 * Ajout du nouveau document dans la base de donnée de SPIP
535                 * NB : la récupération des infos et du logo est faite automatiquement par
536                 * le pipeline post-edition appelé par l'ajout du document
537                 */
538                $mode = 'conversion';
539                spip_log('Ajout du document en base','spipmotion');
540                $ajouter_documents = charger_fonction('ajouter_documents', 'action');
541                $doc = array(array('tmp_name'=>$fichier_temp,'name'=>$fichier_final,'mode'=>$mode));
542
543                /**
544                 * Tentative de récupération d'un logo du document original
545                 * si pas déjà de vignette
546                 */
547                $id_vignette = sql_getfetsel('id_vignette','spip_documents','id_document = '.intval($x));
548                if((!$id_vignette OR ($id_vignette == 0)) && ($source['id_vignette'] > 0)){
549                        $vignette = sql_fetsel('fichier,extension','spip_documents','id_document='.intval($source['id_vignette']));
550                        $fichier_vignette = get_spip_doc($vignette['fichier']);
551                        $vignette = array(array('tmp_name'=>$fichier_vignette,'name'=>$fichier_vignette));
552                        $x2 = $ajouter_documents('new', $vignette, '', 0, 'vignette');
553                        $id_vignette = reset($x2);
554                        if (is_numeric($id_vignette)){
555                                $source['id_vignette'] = $id_vignette;
556                        }
557                }else{
558                        $source['id_vignette'] = $id_vignette;
559                }
560                /**
561                 * Champs que l'on souhaite réinjecter depuis l'original ni depuis un ancien encodage
562                 */
563                $champs_recup = array('titre' => '','descriptif' => '');
564                if(_DIR_PLUGIN_PODCAST)
565                        $champs_recup['podcast'] = 0;
566                        $champs_recup['explicit'] = 'non';
567                if(_DIR_PLUGIN_LICENCES)
568                        $champs_recup['id_licence'] = 0;
569                if(_DIR_PLUGIN_MEDIAS)
570                        $champs_recup['credits'] = '';
571                $champs_recup['id_vignette'] = '';
572                       
573                $modifs = array_intersect_key($source, $champs_recup);
574                foreach($modifs as $champs=>$val){
575                        set_request($champs,$val);
576                }
577
578                $x = $ajouter_documents('new',$doc, 'document', $source['id_document'], $mode);
579                $x = reset($x);
580                spip_log('le nouveau document est le '.$x,'facd');
581                if(intval($x) > 1){
582                        supprimer_fichier($fichier_temp);
583                        $ret['id_document'] = $x;
584                        $ret['success'] = true;
585                }else{
586                        spip_log('Il y a une erreur, le fichier n est pas copié','spipmotion');
587                        $ret['erreur'] = 'Il y a une erreur, le fichier n est pas copié';
588                        $ret['success'] = false;
589                }
590        }else if(!file_exists(get_spip_doc($source['fichier']))){
591                spip_log('Le document original a été supprimé entre temps','spipmotion');
592                supprimer_fichier($fichier_temp);
593                $ret['erreur'] = 'Le document original a été supprimé entre temps';
594                $ret['success'] = false;
595        }
596        /**
597         * Si l'encodage n'est pas ok ...
598         * On donne un statut "erreur" dans la file afin de ne pas la bloquer
599         */
600        else{
601                $infos_encodage['fin_encodage'] = time();
602                $infos_encodage['log'] = spip_file_get_contents($fichier_log);
603                $ret['infos'] = $infos_encodage;
604                $ret['erreur'] = 'Encodage en erreur';
605                $ret['success'] = false;
606        }
607
608        /**
609         * On supprime les différents fichiers temporaires qui auraient pu être créés
610         * si on a une réussite
611         */
612        if($ret['success']){
613                if(file_exists(_DIR_RACINE.$query.'-0.log')){
614                //      supprimer_fichier(_DIR_RACINE.$query.'-0.log');
615                }
616                if(file_exists($pass_log_file)){
617                //      supprimer_fichier($pass_log_file);
618                }
619                if(file_exists($pass_log_file.'.mbtree')){
620                        supprimer_fichier($pass_log_file.'.mbtree');
621                }
622                if(file_exists(_DIR_RACINE.$query.'.mbtree')){
623                        supprimer_fichier(_DIR_RACINE.$query.'.mbtree');
624                }
625                if(file_exists($fichier_temp)){
626                        supprimer_fichier($fichier_temp);
627                }
628                if(file_exists(_DIR_RACINE.$query.'-pass')){
629                        supprimer_fichier(_DIR_RACINE.$query.'-pass');
630                }
631        }
632        pipeline('post_spipmotion_encodage',
633                                array(
634                                        'args' => array(
635                                                'id_document' => $x,
636                                                'id_document_orig' => $source['id_document'],
637                                                'reussite' => $reussite
638                                        ),
639                                        'data' => ''
640                                )
641                        );
642
643        if ($notifications = charger_fonction('notifications', 'inc')) {
644                $notifications('spipmotion_encodage', intval($options['id_facd_conversion']),
645                        array(
646                                'id_document' => $x,
647                                'source' => $source,
648                                'fichier_log' => $fichier_log,
649                        )
650                );
651        }
652        return $ret;
653}
654?>
Note: See TracBrowser for help on using the repository browser.