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

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

utiliser spip_version_compare ici

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