source: spip-zone/_plugins_/spipmotion/trunk/spipmotion_pipelines.php @ 62702

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

On affiche les boutons supplémentaires que si l'utilisateur a le droit de modifier le document.

On remet en place la génération de vignettes

File size: 13.0 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
14/**
15 * Insertion dans le pipeline document_desc_actions (Mediathèque)
16 *
17 * Affiche les boutons supplémentaires de :
18 * - récupération de logo dans le cas d'une vidéo
19 * - récupération d'informations spécifiques dans le cas d'une video
20 * (Dans le cas d'un son, c'est le plugin getID3 qui s'en charge)
21 * - bouton de demande d'encodage / de réencodage du son ou de la vidéo
22 *
23 * @param array $flux Le contexte du pipeline
24 * @return $flux Le contexte du pipeline complété
25 */
26function spipmotion_document_desc_actions($flux){
27        $id_document = $flux['args']['id_document'];
28        $infos_doc = sql_fetsel('*','spip_documents','id_document='.intval($id_document));
29        include_spip('inc/config');
30        if(($GLOBALS['meta']['spipmotion_casse'] != 'oui') && (($video = in_array($infos_doc['extension'],lire_config('spipmotion/fichiers_videos',array()))) OR ($son = in_array($infos_doc['extension'],lire_config('spipmotion/fichiers_audios',array()))))){
31                include_spip('inc/documents');
32                if(file_exists(get_spip_doc($infos_doc['fichier']))){
33                        include_spip('inc/autoriser');
34                        if(autoriser('modifier','document',$id_document)){
35                                $redirect = ancre_url(self(),"doc".$id_document);
36                                if($video){
37                                        $url_action_logo = generer_action_auteur('spipmotion_logo', "0/article/$id_document", $redirect);
38                                        $texte_logo = _T('spipmotion:recuperer_logo');
39                                        $flux['data'] .= " | <a href='$url_action_logo'>$texte_logo</a>";
40                                        if(extension_loaded('ffmpeg')){
41                                                $texte2 = _T('spipmotion:recuperer_infos');
42                                                $action2 = generer_action_auteur('spipmotion_infos', "0/article/$id_document", $redirect);
43                                                $flux['data'] .= " | <a href='$action2'>$texte2</a>";
44                                        }
45                                }
46       
47                                $sorties_audio = lire_config('spipmotion/fichiers_audios_sortie',array());
48                                $sorties_audio = array_diff($sorties_audio,array($infos_doc['extension']));
49                                if(
50                                        ($infos_doc['mode'] != 'conversion')
51                                        && in_array($infos_doc['extension'],lire_config('spipmotion/fichiers_videos_encodage',array()))){
52                                        $statut_encodage = sql_getfetsel('encode','spip_spipmotion_attentes','id_document='.intval($id_document).' AND encode IN ("en_cours","non")');
53                                        if($statut_encodage == 'en_cours'){
54                                                $action3 = '';
55                                                $texte3 = _T('spipmotion:info_document_encodage_en_cours');
56                                        }elseif ($statut_encodage == 'non'){
57                                                $action3 = '';
58                                                $texte3 = _T('spipmotion:document_dans_file_attente');
59                                        }else{
60                                                $texte3 = _T('spipmotion:encoder_video');
61                                                $action3 = generer_action_auteur('spipmotion_ajouter_file_encodage', "0/article/$id_document", $redirect);
62                                        }
63                                }else if(
64                                        ($infos_doc['mode'] != 'conversion')
65                                        && in_array($infos_doc['extension'],lire_config('spipmotion/fichiers_audios_encodage',array()))
66                                        && (count($sorties_audio)>0)
67                                ){
68                                        $statut_encodage = sql_getfetsel('encode','spip_spipmotion_attentes','id_document='.intval($id_document).' AND encode IN ("en_cours","non")');
69                                        if($statut_encodage == 'en_cours'){
70                                                $action3 = false;
71                                                $texte3 = _T('spipmotion:document_dans_file_attente');
72                                        }elseif ($statut_encodage == 'non'){
73                                                $action3 = false;
74                                                $texte3 = _T('spipmotion:document_dans_file_attente');
75                                        }else{
76                                                $texte3 = _T('spipmotion:encoder_son');
77                                                $action3 = generer_action_auteur('spipmotion_ajouter_file_encodage', "0/article/$id_document", $redirect);
78                                        }
79                                }
80                                if($action3)
81                                        $flux['data'] .= " | <a href='$action3'>$texte3</a>";
82                                else if($texte3)
83                                        $flux['data'] .= " | $texte3";
84                        }
85                }else{
86                        $texte = _T('spipmotion:erreur_document_plus_disponible');
87                        $flux['data'] .= " | $texte";
88                }
89        }
90        return $flux;
91}
92
93/**
94 * Pipeline Cron de SPIPmotion (SPIP)
95 *
96 * Vérifie la présence à intervalle régulier de fichiers à encoder
97 * dans la file d'attente
98 *
99 * @return L'array des taches complété
100 * @param array $taches_generales Un array des tâches du cron de SPIP
101 */
102function spipmotion_taches_generales_cron($taches_generales){
103        $taches_generales['spipmotion_file'] = 3*60;
104        $taches_generales['spipmotion_taches_generales'] = 24*60*60;
105        return $taches_generales;
106}
107
108/**
109 * Insertion dans le pipeline post-edition
110 *
111 * Intervient à chaque modification d'un objet de SPIP
112 * notamment lors de l'ajout d'un document
113 *
114 * @return $flux Le contexte de pipeline complété
115 * @param array $flux Le contexte du pipeline
116 */
117function spipmotion_post_edition($flux){
118        if(in_array($flux['args']['operation'], array('ajouter_document','document_copier_local'))){
119                include_spip('inc/config');
120                $id_document = $flux['args']['id_objet'];
121
122                /**
123                 * Il n'est pas nécessaire de récupérer la vignette d'une vignette
124                 * ni ses infos.
125                 */
126                $infos_doc = sql_fetsel('fichier,mode,distant','spip_documents','id_document='.intval($id_document));
127                $mode = $infos_doc['mode'];
128                $fichier = $infos_doc['fichier'];
129
130                if(($mode != 'vignette') && ($infos_doc['distant'] == 'non')){
131                        $document = sql_fetsel("docs.id_document, docs.extension,docs.fichier,docs.id_orig,docs.mode,docs.distant, L.vu, L.objet, L.id_objet", "spip_documents AS docs INNER JOIN spip_documents_liens AS L ON L.id_document=docs.id_document","L.id_document=".intval($id_document));
132                        $extension = $document['extension'];
133
134                        /**
135                         * Si nous sommes dans un format vidéo que SPIPmotion peut traiter,
136                         * on lui applique certains traitements
137                         * Les fichiers sonores sont gérés par le plugin getID3 pour cela
138                         */
139
140                        if(($GLOBALS['meta']['spipmotion_casse'] != 'oui') && in_array($extension,lire_config('spipmotion/fichiers_videos',array()))){
141                                /**
142                                 * Récupération des informations de la vidéo
143                                 */
144                                $recuperer_infos = charger_fonction('spipmotion_recuperer_infos','inc');
145                                $infos = $recuperer_infos($id_document);
146
147                                /**
148                                 * Récupération d'un logo de la vidéo
149                                 */
150                                $recuperer_logo = charger_fonction("spipmotion_recuperer_logo","inc");
151                                $logo = $recuperer_logo($id_document);
152
153                                $invalider = true;
154                        }
155                        /**
156                         * On l'ajoute dans la file d'attente d'encodage si nécessaire
157                         * Si et seulement si on a l'option d'activée dans la conf
158                         */
159                        if(lire_config('spipmotion/encodage_auto') == 'on'){
160                                $fichier = basename(get_spip_doc($document['fichier']));
161                                $racine = preg_replace('/-encoded-(\d)/','',substr($fichier,0,-(strlen($document['extension'])+1)));
162                                $racine = preg_replace('/-encoded-(\d+)/','',$racine);
163                                $racine = preg_replace('/-encoded/','',$racine);
164                                $id_doc = sql_getfetsel('id_document','spip_documents',"fichier LIKE '%$racine%' AND id_document != $id_document AND id_orig=0");
165                                if(($GLOBALS['meta']['spipmotion_casse'] != 'oui') && !preg_match('/-encoded/',$document['fichier']) OR !$id_doc){
166                                        include_spip('action/spipmotion_ajouter_file_encodage');
167                                        spipmotion_genere_file($id_document,$document['objet'],$document['id_objet']);
168                                        $encodage_direct = charger_fonction('spipmotion_encodage_direct','inc');
169                                        $encodage_direct();
170                                }
171                        }
172                        /**
173                         * On invalide le cache de cet élément si nécessaire
174                         */
175                        if($invalider){
176                                include_spip('inc/invalideur');
177                                suivre_invalideur("id='id_$type/$id'");
178                        }
179                }
180        }else if($flux['args']['operation'] == 'supprimer_documents'){
181                sql_delete('spip_spipmotion_attentes','id_document = '.$flux['args']['id_objet'].' AND encode!='.sql_quote('oui'));
182        }
183        return $flux;
184}
185
186/**
187 * Insertion dans le pipeline insert_head_css (SPIP)
188 * On ajoute la css de spipmotion dans le public
189 *
190 * @param string $flux
191 *              Le contenu du head
192 * @return string $flux
193 *              Le head modifié
194 */
195function spipmotion_insert_head_css($flux){
196        $flux .= '
197<link rel="stylesheet" href="'.direction_css(find_in_path('spipmotion.css', 'css/', false)).'" type="text/css" media="all" />
198';
199        return $flux;
200}
201
202/**
203 * Insertion dans le pipeline header_prive (SPIP)
204 * On ajoute la css de spipmotion dans le privé
205 *
206 * @param string $flux
207 *              Le contenu du head
208 * @return string $flux
209 *              Le head modifié
210 */
211function spipmotion_header_prive($flux){
212        $flux .= '
213<link rel="stylesheet" href="'.direction_css(find_in_path('spipmotion.css', 'css/', false)).'" type="text/css" media="all" />
214';
215        return $flux;
216}
217
218/**
219 * Insertion dans le pipeline jquery_plugins (SPIP)
220 * On ajoute deux javascript dans le head
221 *
222 * @param array $plugins
223 *              L'array des js insérés
224 * @return array $plugins
225 *              L'array des js insérés modifié
226 */
227function spipmotion_jquery_plugins($plugins){
228        if(!in_array(_DIR_LIB_FLOT.'/jquery.flot.js',$plugins)){
229                $plugins[] = _DIR_LIB_FLOT.'/jquery.flot.js';
230        }
231        $plugins[] = 'javascript/spipmotion_flot_extras.js';
232        return $plugins;
233}
234
235/**
236 * Insertion dans le pipeline jqueryui_plugin (plugin jQuery UI)
237 *
238 * On ajoute le chargement des js pour les tabs (utilisés dans la conf)
239 *
240 * @param array $plugins
241 *              Un tableau des scripts déjà demandé au chargement
242 * @retune array $plugins
243 *              Le tableau complété avec les scripts que l'on souhaite
244 */
245function spipmotion_jqueryui_plugins($plugins){
246        $plugins[] = "jquery.ui.tabs";
247        return $plugins;
248}
249
250function spipmotion_post_spipmotion_encodage($flux){
251        if($flux['args']['reussite'] == 'oui'){
252                $origine = sql_fetsel('extension,fichier','spip_documents','id_document='.intval($flux['args']['id_document_orig']));
253                if(in_array($origine['extension'],array('mp3','flac','ogg','oga'))){
254                        $extension_nouveau = sql_getfetsel('extension','spip_documents','id_document='.intval($flux['args']['id_document']));
255                        if(in_array($extension_nouveau,lire_config('getid3_write',array()))){
256                                include_spip('inc/documents');
257                                $recuperer_id3 = charger_fonction('recuperer_id3','inc');
258                                $infos_write = array(
259                                        'title' => 0,
260                                        'artist' => 0,
261                                        'year' => 0,
262                                        'date'=>0,
263                                        'album' => 0,
264                                        'genre' => 0,
265                                        'comment' => 0,
266                                        'tracknumber' => 0
267                                );
268                                $infos_origine = $recuperer_id3(get_spip_doc($origine['fichier']));
269                               
270                                if($extension_nouveau == 'mp3'){
271                                        $images = array();
272                                        foreach($infos_origine as $info_origine => $info){
273                                                if(preg_match('/cover/',$info_origine)){
274                                                        $images[] = $info;
275                                                }
276                                        }
277                                }
278                                $infos_encode = array_intersect_key($infos_origine,$infos_write);
279                                $ecrire_infos = charger_fonction('getid3_ecrire_infos','inc');
280                                $ecrire_infos($flux['args']['id_document'],$infos_encode,$images);
281                        }
282                }
283        }
284       
285        $encodage_direct = charger_fonction('spipmotion_encodage_direct','inc');
286        $encodage_direct();
287       
288        return $flux;
289}
290
291/**
292 * Insertion dans le pipeline formulaire_verifier (SPIP)
293 *
294 * Vérification de certaines valeurs de la configuration
295 *
296 * @param array $flux
297 *              Le contexte du pipeline
298 * @return array $flux
299 *              Le contexte du pipeline modifié
300 */
301function spipmotion_formulaire_verifier($flux){
302        if($flux['args']['form'] == 'configurer_spipmotion'){
303                foreach($_POST as $key => $val){
304                        if(preg_match('/(bitrate|height|width|frequence_audio|fps|passes|qualite_video|qualite_audio).*/',$key) && $val){
305                                if(!ctype_digit($val)){
306                                        $flux['data'][$key] = _T('spipmotion:erreur_valeur_int');
307                                }else if(preg_match('/(height|width).*/',$key) && ($val < 100)){
308                                        $flux['data'][$key] = _T('spipmotion:erreur_valeur_int_superieur',array('val'=> 100));
309                                }
310                        }
311                }
312                if(count($erreur) > 0)
313                        $flux['data']['message_erreur'] = _T('spipmotion:erreur_formulaire_configuration');
314        }
315        return $flux;
316}
317
318/**
319 * Insertion dans le pipeline formulaire_traiter (SPIP)
320 *
321 * Traitement spécifique à la validation du formulaire de configuration
322 *
323 * @param array $flux
324 *              Le contexte du pipeline
325 * @return array $flux
326 *              Le contexte du pipeline modifié
327 */
328function spipmotion_formulaire_traiter($flux){
329        if($flux['args']['form'] == 'configurer_spipmotion'){
330                $valeurs = $_POST;
331       
332                $verifier_binaires = charger_fonction('spipmotion_verifier_binaires','inc');
333                $erreurs = $verifier_binaires($valeurs);
334               
335                if(!in_array('ffmpeg',$erreurs)){
336                        /**
337                         * On récupère les informations du nouveau ffmpeg
338                         */
339                        $ffmpeg_infos = charger_fonction('ffmpeg_infos','inc');
340                        $ffmpeg_infos(true);
341                }
342       
343                if(count($erreurs) > 0){
344                        include_spip('inc/invalideur');
345                        suivre_invalideur('1');
346       
347                        /**
348                         * On force le rechargement de la page car on a récupéré de nouvelles infos sur ffmpeg
349                         */
350                        $flux['data']['redirect'] = self();
351                }
352        }
353        return $flux;
354}
355
356
357/**
358 * Insertion dans le pipeline recuperer_fond (SPIP)
359 *
360 * On affiche les informations du document
361 *
362 * @param array $flux
363 *              Le contexte du pipeline
364 * @return array $flux
365 *              Le contexte du pipeline modifié
366 */
367function spipmotion_recuperer_fond($flux){
368        if ($flux['args']['fond']=='modeles/document_desc'){
369                if(isset($flux['args']['contexte']['id_document']) && ($flux['args']['contexte']['id_document'] > 0)){
370                        $extension = sql_getfetsel("extension", "spip_documents","id_document=".intval($flux['args']['contexte']['id_document']));
371                        if(in_array($extension,lire_config('spipmotion/fichiers_videos',array()))){
372                                $flux['data']['texte'] .= recuperer_fond('prive/squelettes/inclure/prive_infos_video', $flux['args']['contexte']);
373                        }
374                }
375        }
376        return $flux;
377}
378?>
Note: See TracBrowser for help on using the repository browser.