source: spip-zone/_plugins_/spipmotion/branches/v1/inc/encodage.php @ 77624

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

Des broutilles

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