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

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

On ajoute un champs en base : aspect_ratio qui est le ratio d'affichage de la vidéo, des fois les vidéos annoncent une largeur et hauteur dont le ratio est différent du ratio souhaité à l'affichage (encodage pour les TV apparemment).

On prend compte de ce ratio dans l'encodage

On récupère une vignette de la vidéo qui correspond à ce ratio également

Version 1.2.1

File size: 24.1 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($height/($width/$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                       
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               
443                $aspect = $source['aspect_ratio'] ? $source['aspect_ratio']: "$width_finale:$height_finale";
444                $infos_sup_normal .= " -aspect $aspect";
445                       
446                $fichier_texte = "$dossier$query.txt";
447
448                ecrire_fichier($fichier_texte,$texte);
449
450                /**
451                 * Encodage de la video
452                 * Si l'encodeur choisi est ffmpeg2theora et qu'il existe toujours, on l'utilise
453                 * sinon on utilise notre script pour ffmpeg
454                 */
455                $passes = lire_config("spipmotion/passes_$extension_attente",'1');
456                $pass_log_file = $dossier.$query.'-pass';
457               
458                $ffmpeg2theora = @unserialize($GLOBALS['spipmotion_metas']['spipmotion_ffmpeg2theora']);
459                if(($encodeur == 'ffmpeg2theora') && ($ffmpeg2theora['version'] > 0)){
460                        if($passes == 2)
461                                $deux_passes = '--two-pass';
462                        $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";
463                        spip_log($encodage,'spipmotion');
464                        $lancement_encodage = exec($encodage,$retour,$retour_int);
465                }else{
466                        if(($passes == "2") && ((($vcodec == '--vcodec libx264') && ($preset_quality != 'hq')) OR ($vcodec == '--vcodec flv') OR ($vcodec == '--vcodec libtheora') OR ($extension_attente == 'webm'))){
467                                spip_log('Premiere passe','spipmotion');
468                                if ($ffmpeg_version < '0.7'){
469                                        $preset_1 = $preset_quality ? '-vpre '.$preset_quality.'_firstpass' : '';
470                                }else{
471                                        $preset_1 = $preset_quality ? '-preset '.$preset_quality : '';
472                                }
473                                if($source['rotation'] == '90'){
474                                        $rotation = "-vf transpose=1";
475                                }
476                                $infos_sup_normal_1 = "--params_supp \"-an $preset_1 -passlogfile $pass_log_file $infos_sup_normal $rotation\"";
477                                $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";
478                                spip_log($encodage_1,'spipmotion');
479                                $lancement_encodage_1 = exec($encodage_1,$retour_1,$retour_int_1);
480                                spip_log($retour_1,'spipmotion');
481                                /**
482                                 * La première passe est ok
483                                 * On lance la seconde
484                                 */
485                                if($retour_int_1 == 0){
486                                        spip_log('Seconde passe','spipmotion');
487                                        if ($ffmpeg_version < '0.7'){
488                                                $infos_sup_normal = $preset_quality ? "-vpre $preset_quality $infos_sup_normal" : $infos_sup_normal;
489                                        }else{
490                                                $infos_sup_normal = $preset_quality ? "-preset $preset_quality $infos_sup_normal" : $infos_sup_normal;
491                                        }
492                                        $metadatas = "";
493                                        //$metadatas = "-map_metadata 0:0";
494                                        $metadatas_supp = '';
495                                        $metas_orig = @unserialize($source['metas']);
496                                       
497                                        $infos_sup_normal_2 = '--params_supp \'-passlogfile '.$pass_log_file.' '.$ss_audio.' '.$infos_sup_normal.' '.$rotation.' '.$metadatas.'\'';
498                                        $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";
499                                        spip_log($encodage,'spipmotion');
500                                        $lancement_encodage = exec($encodage,$retour,$retour_int);
501                                        spip_log($retour,'spipmotion');
502                                }else{
503                                        spip_log('SPIPMOTION Erreur : Le retour de l encodage est revenu en erreur','spipmotion'._LOG_CRITICAL);
504                                        $retour_int = 1;
505                                }
506                        }else{
507                                spip_log('on encode en 1 passe','spipmotion');
508                                $infos_sup_normal = "$ss_audio ";
509                                if ($ffmpeg_version < '0.7'){
510                                        $infos_sup_normal .= $preset_quality ? "-vpre $preset_quality $infos_sup_normal":'';
511                                }else{
512                                        $infos_sup_normal .= $preset_quality ? "-preset $preset_quality $infos_sup_normal":'';
513                                }
514                                if($source['rotation'] == '90'){
515                                        $rotation = "-vf transpose=1";
516                                }
517                                //$infos_sup_normal .= " -map_metadata 0:0";
518                                if($infos_sup_normal){
519                                        $infos_sup_normal = "--params_supp \"$infos_sup_normal\"";
520                                }
521                                $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";
522                                spip_log($encodage,'spipmotion');
523                                $lancement_encodage = exec($encodage,$retour,$retour_int);
524                        }
525                }
526
527                if($retour_int == 0){
528                        $ret['success'] = true;
529                }else if($retour_int >= 126){
530                        $ret['success'] = false;
531                        $ret['erreur'] = _T('spipmotion:erreur_script_spipmotion_non_executable');
532                        ecrire_fichier($fichier_log,$ret['erreur']);
533                }
534        }
535
536        if($ret['success'] && file_exists(get_spip_doc($source['fichier']))){
537                /**
538                 * Ajout du nouveau document dans la base de donnée de SPIP
539                 * NB : la récupération des infos et du logo est faite automatiquement par
540                 * le pipeline post-edition appelé par l'ajout du document
541                 */
542                $mode = 'conversion';
543                spip_log('Ajout du document en base','spipmotion');
544                $ajouter_documents = charger_fonction('ajouter_documents', 'action');
545                $doc = array(array('tmp_name'=>$fichier_temp,'name'=>$fichier_final,'mode'=>$mode));
546
547                /**
548                 * Tentative de récupération d'un logo du document original
549                 * si pas déjà de vignette
550                 */
551                $id_vignette = sql_getfetsel('id_vignette','spip_documents','id_document = '.intval($x));
552                if((!$id_vignette OR ($id_vignette == 0)) && ($source['id_vignette'] > 0)){
553                        $vignette = sql_fetsel('fichier,extension','spip_documents','id_document='.intval($source['id_vignette']));
554                        $fichier_vignette = get_spip_doc($vignette['fichier']);
555                        $vignette = array(array('tmp_name'=>$fichier_vignette,'name'=>$fichier_vignette));
556                        $x2 = $ajouter_documents('new', $vignette, '', 0, 'vignette');
557                        $id_vignette = reset($x2);
558                        if (is_numeric($id_vignette)){
559                                $source['id_vignette'] = $id_vignette;
560                        }
561                }else{
562                        $source['id_vignette'] = $id_vignette;
563                }
564                /**
565                 * Champs que l'on souhaite réinjecter depuis l'original ni depuis un ancien encodage
566                 */
567                $champs_recup = array('titre' => '','descriptif' => '');
568                if(_DIR_PLUGIN_PODCAST)
569                        $champs_recup['podcast'] = 0;
570                        $champs_recup['explicit'] = 'non';
571                if(_DIR_PLUGIN_LICENCES)
572                        $champs_recup['id_licence'] = 0;
573                if(_DIR_PLUGIN_MEDIAS)
574                        $champs_recup['credits'] = '';
575                $champs_recup['id_vignette'] = '';
576                       
577                $modifs = array_intersect_key($source, $champs_recup);
578                foreach($modifs as $champs=>$val){
579                        set_request($champs,$val);
580                }
581
582                $x = $ajouter_documents('new',$doc, 'document', $source['id_document'], $mode);
583                $x = reset($x);
584                spip_log('le nouveau document est le '.$x,'facd');
585                if(intval($x) > 1){
586                        supprimer_fichier($fichier_temp);
587                        $ret['id_document'] = $x;
588                        $ret['success'] = true;
589                }else{
590                        spip_log('Il y a une erreur, le fichier n est pas copié','spipmotion');
591                        $ret['erreur'] = 'Il y a une erreur, le fichier n est pas copié';
592                        $ret['success'] = false;
593                }
594        }else if(!file_exists(get_spip_doc($source['fichier']))){
595                spip_log('Le document original a été supprimé entre temps','spipmotion');
596                supprimer_fichier($fichier_temp);
597                $ret['erreur'] = 'Le document original a été supprimé entre temps';
598                $ret['success'] = false;
599        }
600        /**
601         * Si l'encodage n'est pas ok ...
602         * On donne un statut "erreur" dans la file afin de ne pas la bloquer
603         */
604        else{
605                $infos_encodage['fin_encodage'] = time();
606                $infos_encodage['log'] = spip_file_get_contents($fichier_log);
607                $ret['infos'] = $infos_encodage;
608                $ret['erreur'] = 'Encodage en erreur';
609                $ret['success'] = false;
610        }
611
612        /**
613         * On supprime les différents fichiers temporaires qui auraient pu être créés
614         * si on a une réussite
615         */
616        if($ret['success']){
617                if(file_exists(_DIR_RACINE.$query.'-0.log')){
618                //      supprimer_fichier(_DIR_RACINE.$query.'-0.log');
619                }
620                if(file_exists($pass_log_file)){
621                //      supprimer_fichier($pass_log_file);
622                }
623                if(file_exists($pass_log_file.'.mbtree')){
624                        supprimer_fichier($pass_log_file.'.mbtree');
625                }
626                if(file_exists(_DIR_RACINE.$query.'.mbtree')){
627                        supprimer_fichier(_DIR_RACINE.$query.'.mbtree');
628                }
629                if(file_exists($fichier_temp)){
630                        supprimer_fichier($fichier_temp);
631                }
632                if(file_exists(_DIR_RACINE.$query.'-pass')){
633                        supprimer_fichier(_DIR_RACINE.$query.'-pass');
634                }
635        }
636        pipeline('post_spipmotion_encodage',
637                                array(
638                                        'args' => array(
639                                                'id_document' => $x,
640                                                'id_document_orig' => $source['id_document'],
641                                                'reussite' => $reussite
642                                        ),
643                                        'data' => ''
644                                )
645                        );
646
647        if ($notifications = charger_fonction('notifications', 'inc')) {
648                $notifications('spipmotion_encodage', intval($options['id_facd_conversion']),
649                        array(
650                                'id_document' => $x,
651                                'source' => $source,
652                                'fichier_log' => $fichier_log,
653                        )
654                );
655        }
656        return $ret;
657}
658?>
Note: See TracBrowser for help on using the repository browser.