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

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

On vire l'encodage pour PSP

-vpre ne fonctionne plus sur les versions récentes de ffmpeg

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 * 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 -preset slow';
412                                        }
413                                }
414                        }
415                        $infos_sup_normal .= " -aspect $width_finale:$height_finale";
416                        if($format)
417                                $infos_sup_normal .= ' -f '.$format;
418                }
419
420                $fichier_texte = "$dossier$query.txt";
421
422                ecrire_fichier($fichier_texte,$texte);
423
424                /**
425                 * Encodage de la video
426                 * Si l'encodeur choisi est ffmpeg2theora et qu'il existe toujours, on l'utilise
427                 * sinon on utilise notre script pour ffmpeg
428                 */
429                $passes = lire_config("spipmotion/passes_$extension_attente",'1');
430                $pass_log_file = $dossier.$query.'-pass';
431               
432                $ffmpeg2theora = @unserialize($GLOBALS['spipmotion_metas']['spipmotion_ffmpeg2theora']);
433                if(($encodeur == 'ffmpeg2theora') && ($ffmpeg2theora['version'] > 0)){
434                        if($passes == 2)
435                                $deux_passes = '--two-pass';
436                        $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";
437                        spip_log($encodage,'spipmotion');
438                        $lancement_encodage = exec($encodage,$retour,$retour_int);
439                }else{
440                        if(($vcodec == '--vcodec libtheora'))
441                                $passes = 1;
442                        if(($passes == "2") && ((($vcodec == '--vcodec libx264') && ($preset_quality != 'hq')) OR ($vcodec == '--vcodec flv') OR ($vcodec == '--vcodec libtheora') OR ($extension_attente == 'webm'))){
443                                spip_log('Premiere passe','spipmotion');
444                                if ($ffmpeg_version < '0.7'){
445                                        $preset_1 = $preset_quality ? '-vpre '.$preset_quality.'_firstpass' : '';
446                                }else{
447                                        $preset_1 = $preset_quality ? '-preset '.$preset_quality : '';
448                                }
449                                if($source['rotation'] == '90'){
450                                        $rotation = "-vf transpose=1";
451                                }
452                                $infos_sup_normal_1 = "--params_supp \"-an $preset_1 -passlogfile $pass_log_file $infos_sup_normal $rotation\"";
453                                $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";
454                                spip_log($encodage_1,'spipmotion');
455                                $lancement_encodage_1 = exec($encodage_1,$retour_1,$retour_int_1);
456                                /**
457                                 * La première passe est ok
458                                 * On lance la seconde
459                                 */
460                                if($retour_int_1 == 0){
461                                        spip_log('Seconde passe','spipmotion');
462                                        if ($ffmpeg_version < '0.7'){
463                                                $infos_sup_normal = $preset_quality ? "-vpre $preset_quality $infos_sup_normal" : $infos_sup_normal;
464                                        }else{
465                                                $infos_sup_normal = $preset_quality ? "-preset $preset_quality $infos_sup_normal" : $infos_sup_normal;
466                                        }
467                                        $metadatas_supp = '';
468                                        $metas_orig = @unserialize($source['metas']);
469
470                                        $infos_sup_normal_2 = '--params_supp \'-passlogfile '.$pass_log_file.' '.$infos_sup_normal.' '.$rotation.' '.$metadatas.'\'';
471                                        $fichier_log = "$fichier_log-pass2.log";
472                                        $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";
473                                        spip_log($encodage,'spipmotion');
474                                        $lancement_encodage = exec($encodage,$retour,$retour_int);
475                                }else{
476                                        $retour_int = 1;
477                                }
478                        }else{
479                                spip_log('on encode en 1 passe','spipmotion');
480                                if ($ffmpeg_version < '0.7'){
481                                        $infos_sup_normal = $preset_quality ? "-vpre $preset_quality $infos_sup_normal":'';
482                                }else{
483                                        $infos_sup_normal = $preset_quality ? "-preset $preset_quality $infos_sup_normal":'';
484                                }
485                                if($source['rotation'] == '90'){
486                                        $rotation = "-vf transpose=1";
487                                }
488                                if($infos_sup_normal){
489                                        $infos_sup_normal = "--params_supp \"$infos_sup_normal\"";
490                                }
491                                $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";
492                                spip_log($encodage,'spipmotion');
493                                $lancement_encodage = exec($encodage,$retour,$retour_int);
494                        }
495                }
496
497                if($retour_int == 0){
498                        $encodage_ok = true;
499                }else if($retour_int >= 126){
500                        $erreur = _T('spipmotion:erreur_script_spipmotion_non_executable');
501                        ecrire_fichier($fichier_log,$erreur);
502                }
503        }
504
505        if($encodage_ok && file_exists(get_spip_doc($source['fichier']))){
506                /**
507                 * Ajout du nouveau document dans la base de donnée de SPIP
508                 * NB : la récupération des infos et du logo est faite automatiquement par
509                 * le pipeline post-edition appelé par l'ajout du document
510                 */
511                $mode = 'document';
512                spip_log('Ajout du document en base','spipmotion');
513                $ajouter_documents = charger_fonction('ajouter_documents', 'inc');
514                $x = $ajouter_documents($fichier_temp, $fichier_final, $type_doc, $id_objet, $mode, '', $actif,'','','');
515                spip_log('le nouveau document est le '.$x,'spipmotion');
516                if(intval($x) > 1){
517                        supprimer_fichier($fichier_temp);
518
519                        /**
520                         * Modification de la file d'attente
521                         * - On marque le document comme correctement encodé
522                         * - On ajoute la date de fin d'encodage
523                         */
524                       
525                        $infos_encodage['fin_encodage'] = time();
526                        spip_log('Insertion du temps final d encodage : '.$infos_encodage['fin_encodage'],'spipmotion');
527                        sql_updateq("spip_spipmotion_attentes",array('encode'=>'oui','infos' => serialize($infos_encodage)),"id_spipmotion_attente=".intval($doc_attente));
528
529                        /**
530                         * Tentative de récupération d'un logo du document original
531                         */
532                        if((sql_getfetsel('id_vignette','spip_documents','id_document = '.intval($x)) == 0) && ($source['id_vignette'] > 0)){
533                                $vignette = sql_fetsel('fichier,extension','spip_documents','id_document='.intval($source['id_vignette']));
534                                $fichier_vignette = get_spip_doc($vignette['fichier']);
535                                $string_tmp = basename(get_spip_doc($vignette['fichier'])).'-'.mktime();
536                                $nom_vignette = md5($string_tmp).'.'.$vignette['extension'];
537                                $x2 = $ajouter_documents($fichier_vignette, $nom_vignette, '', '', 'vignette', $x, $actif,'','','');
538                        }
539                        /**
540                         * Champs que l'on souhaite réinjecter depuis l'original ni depuis un ancien encodage
541                         */
542                        $champs_recup = array('titre' => '0','descriptif' => '0');
543                        if(_DIR_PLUGIN_PODCAST)
544                                $champs_recup['podcast'] = 0;
545                                $champs_recup['explicit'] = 'non';
546                        if(_DIR_PLUGIN_LICENCES)
547                                $champs_recup['id_licence'] = 0;
548                        if(_DIR_PLUGIN_MEDIAS)
549                                $champs_recup['credits'] = '';
550
551                        $modifs = array_intersect_key($source, $champs_recup);
552
553                        /**
554                         * On ajoute l'id dur document original id_orig
555                         */
556                        $modifs['id_orig'] = $attente['id_document'];
557
558                        include_spip('inc/modifier');
559                        revision_document($x, $modifs);
560
561                        $reussite = 'oui';
562                }else{
563                        sql_updateq("spip_spipmotion_attentes",array('encode'=>'non'),"id_spipmotion_attente=".intval($doc_attente));
564                        spip_log('Il y a une erreur, le fichier n est pas copié','spipmotion');
565                        $reussite = 'non';
566                }
567        }else if(!file_exists(get_spip_doc($source['fichier']))){
568                spip_log('Le document original a été supprimé entre temps','spipmotion');
569                supprimer_fichier($fichier_temp);
570                $reussite = 'non';
571                sql_delete("spip_spipmotion_attentes","id_spipmotion_attente=".intval($doc_attente));
572        }
573        /**
574         * Si l'encodage n'est pas ok ...
575         * On donne un statut "erreur" dans la file afin de ne pas la bloquer
576         */
577        else{
578                $infos_encodage['fin_encodage'] = time();
579                $infos_encodage['log'] = spip_file_get_contents($fichier_log);
580                $reussite = 'non';
581                sql_updateq("spip_spipmotion_attentes",array('encode'=>'erreur','infos' => serialize($infos_encodage)),"id_spipmotion_attente=".intval($doc_attente));
582        }
583
584        if(file_exists(_DIR_RACINE.$query.'-0.log')){
585                supprimer_fichier(_DIR_RACINE.$query.'-0.log');
586        }
587        if(file_exists($pass_log_file)){
588                supprimer_fichier($pass_log_file);
589        }
590        if(file_exists($pass_log_file.'.mbtree')){
591                supprimer_fichier($pass_log_file.'.mbtree');
592        }
593        if(file_exists(_DIR_RACINE.$query.'.mbtree')){
594                supprimer_fichier(_DIR_RACINE.$query.'.mbtree');
595        }
596        if(file_exists($fichier_temp)){
597                supprimer_fichier($fichier_temp);
598        }
599        if(file_exists(_DIR_RACINE.$query.'-pass')){
600                supprimer_fichier(_DIR_RACINE.$query.'-pass');
601        }
602        pipeline('post_spipmotion_encodage',
603                                array(
604                                        'args' => array(
605                                                'id_document' => $x,
606                                                'id_document_orig' => $attente['id_document'],
607                                                'reussite' => $reussite
608                                        ),
609                                        'data' => ''
610                                )
611                        );
612        /**
613         * Invalidation du cache
614         */
615        include_spip('inc/invalideur');
616        suivre_invalideur("0",true);
617
618        if ($notifications = charger_fonction('notifications', 'inc')) {
619                $notifications('spipmotion_encodage', intval($doc_attente),
620                        array(
621                                'id_document' => $x,
622                                'source' => $source,
623                                'fichier_log' => $fichier_log,
624                        )
625                );
626        }
627        return $x;
628}
629?>
Note: See TracBrowser for help on using the repository browser.