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

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

Supprimer les fichiers temporaires également

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