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

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

On n'utilise plus du tout id_orig maintenant mais des documents attachés au document original

On évite de dupliquer du code dans les ajouts en file

Refaire marcher correctement les encodages et les logos

Améliorer les ajouts dans l'espace privé en n'utilisant que des squelettes

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