source: spip-zone/_plugins_/spipmotion/trunk/inc/encodage.php @ 62615

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

Premier passage à SPIP 3 + update des entêtes de fichiers PHP

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