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

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

mmmh ... encore un bug qui provoquait un encodage en boucle

File size: 11.5 KB
Line 
1<?php
2/**
3 * SPIPmotion
4 * Gestion de l'encodage et des métadonnées de vidéos directement dans spip
5 *
6 * Auteurs :
7 * Quentin Drouet (kent1)
8 * 2008-2010 - Distribué sous licence GNU/GPL
9 *
10 */
11
12/**
13 * Insertion dans le pipeline editer_contenu_objet
14 *
15 * Affiche les boutons supplémentaires de :
16 * - récupération de logo dans le cas d'une vidéo
17 * - récupération d'informations spécifiques dans le cas d'une video
18 * (Dans le cas d'un son, c'est le plugin getID3 qui s'en charge)
19 * - bouton de demande d'encodage / de réencodage du son ou de la vidéo
20 *
21 * @param array $flux Le contexte du pipeline
22 * @return $flux Le contexte du pipeline complété
23 */
24function spipmotion_editer_contenu_objet($flux){
25        $type_form = $flux['args']['type'];
26        $id_document = $flux['args']['id'];
27        if(is_array($flux['args']) && (in_array($type_form,array('illustrer_document','case_document','document')))){
28                $document = sql_fetsel("docs.id_document, docs.id_orig, docs.extension,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=".sql_quote($id_document));
29                $extension = $document['extension'];
30                $type = $document['objet'];
31                $id = $document['id_objet'];
32                if(in_array($type_form,array('case_document','document'))){
33                        if($document['distant'] !== 'oui'){
34                                $ajouts = '';
35                                if(($GLOBALS['meta']['spipmotion_casse'] != 'oui') && in_array($extension,lire_config('spipmotion/fichiers_videos',array()))){
36                                        if($document['id_orig'] > 0){
37                                                $ajouts .= '<p>'._T('spipmotion:version_encodee_de',array('id_orig'=>$document['id_orig'])).'</p>';
38                                        }
39                                        if(extension_loaded('ffmpeg')){
40                                                $infos_videos = charger_fonction('spipmotion_infos_videos', 'inc');
41                                                $ajouts .= $infos_videos($id,$id_document,$type);
42                                        }
43                                }
44                                if(($GLOBALS['meta']['spipmotion_casse'] != 'oui') && in_array($extension,lire_config('spipmotion/fichiers_audios',array()))){
45                                        if($document['id_orig'] > 0){
46                                                $flux['data'] .= '<p>'._T('spipmotion:version_encodee_de',array('id_orig'=>$document['id_orig'])).'</p>';
47                                        }
48                                        else{
49                                                $infos_audios = charger_fonction('spipmotion_infos_audios', 'inc');
50                                                $ajouts .= $infos_audios($id,$id_document,$type);
51                                        }
52                                }
53                                if($type_form == 'case_document'){
54                                        $flux['data'] .= $ajouts;
55                                }else{
56                                        if(preg_match(",<li [^>]*class=[\"']editer_infos.*>(.*)<\/li>,Uims",$flux['data'],$regs)){
57                                                $infos_doc = recuperer_fond('prive/prive_infos_video', $contexte=array('id_document'=>$id_document));
58                                                $flux['data'] = preg_replace(",($regs[1]),Uims","\\1".$infos_doc,$flux['data']);
59                                        }
60                                }
61                        }
62                }
63                else if(in_array($type_form,array('illustrer_document'))){
64                        if(($GLOBALS['meta']['spipmotion_casse'] != 'oui') && in_array($extension,lire_config('spipmotion/fichiers_videos',array()))){
65                                if(preg_match(",<div [^>]*id=[\"'](formulaire_illustrer_document.*)[\"'].*>(.*)<\/div>,Uims",$flux['data'],$regs)){
66                                        $redirect = ancre_url(self(),$regs[1]);
67                                        $url_action = generer_action_auteur('spipmotion_logo', "$id/$type/$id_document", $redirect);
68                                        $texte = _T('spipmotion:lien_recuperer_logo_fichier');
69                                        $recuperer_vignette = " | <a href='$url_action'>$texte</a>";
70                                        $flux['data'] = preg_replace(",(<div [^>]*class=[\"']sourceup.*>(.*)<\/div>),Uims","\\2".$recuperer_vignette,$flux['data']);
71                                }
72                        }
73                }
74        }
75        return $flux;
76}
77
78/**
79 * Insertion dans le pipeline document_desc_actions (Mediathèque)
80 * On ajoute un lien pour récupérer le logo et relancer les encodages
81 *
82 * @param array $flux Le contexte du pipeline
83 * @return $flux Le contexte du pipeline complété
84 */
85function spipmotion_document_desc_actions($flux){
86        $id_document = $flux['args']['id_document'];
87        $infos_doc = sql_fetsel('*','spip_documents','id_document='.intval($id_document));
88        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()))))){
89                include_spip('inc/documents');
90                if(file_exists(get_spip_doc($infos_doc['fichier']))){
91                        $redirect = ancre_url(self(),"doc".$id_document);
92                        if($video){
93                                $url_action_logo = generer_action_auteur('spipmotion_logo', "0/article/$id_document", $redirect);
94                                $texte_logo = _T('spipmotion:recuperer_logo');
95                                $flux['data'] .= " | <a href='$url_action_logo'>$texte_logo</a>";
96                                if(extension_loaded('ffmpeg')){
97                                        $texte2 = _T('spipmotion:recuperer_infos');
98                                        $action2 = generer_action_auteur('spipmotion_infos', "0/article/$id_document", $redirect);
99                                        $flux['data'] .= " | <a href='$action2'>$texte2</a>";
100                                }
101                        }
102
103                        $sorties_audio = lire_config('spipmotion/fichiers_audios_sortie',array());
104                        $sorties_audio = array_diff($sorties_audio,array($infos_doc['extension']));
105                        if(
106                                ($infos_doc['id_orig'] == 0)
107                                && in_array($infos_doc['extension'],lire_config('spipmotion/fichiers_videos_encodage',array()))){
108                                $statut_encodage = sql_getfetsel('encode','spip_spipmotion_attentes','id_document='.intval($id_document).' AND encode IN ("en_cours","non")');
109                                if($statut_encodage == 'en_cours'){
110                                        $action3 = '';
111                                        $texte3 = _T('spipmotion:document_en_cours_encodage');
112                                }elseif ($statut_encodage == 'non'){
113                                        $action3 = '';
114                                        $texte3 = _T('spipmotion:document_dans_file_attente');
115                                }else{
116                                        $texte3 = _T('spipmotion:encoder_video');
117                                        $action3 = generer_action_auteur('spipmotion_ajouter_file_encodage', "0/article/$id_document", $redirect);
118                                }
119                        }else if(
120                                ($infos_doc['id_orig'] == 0)
121                                && in_array($infos_doc['extension'],lire_config('spipmotion/fichiers_audios_encodage',array()))
122                                && (count($sorties_audio)>0)
123                        ){
124                                $statut_encodage = sql_getfetsel('encode','spip_spipmotion_attentes','id_document='.intval($id_document).' AND encode IN ("en_cours","non")');
125                                if($statut_encodage == 'en_cours'){
126                                        $action3 = false;
127                                        $texte3 = _T('spipmotion:document_dans_file_attente');
128                                }elseif ($statut_encodage == 'non'){
129                                        $action3 = false;
130                                        $texte3 = _T('spipmotion:document_dans_file_attente');
131                                }else{
132                                        $texte3 = _T('spipmotion:encoder_son');
133                                        $action3 = generer_action_auteur('spipmotion_ajouter_file_encodage', "0/article/$id_document", $redirect);
134                                }
135                        }
136                        if($action3)
137                                $flux['data'] .= " | <a href='$action3'>$texte3</a>";
138                        else if($texte3)
139                                $flux['data'] .= " | $texte3";
140                }else{
141                        $texte = _T('spipmotion:erreur_document_plus_disponible');
142                        $flux['data'] .= " | $texte";
143                }
144        }
145        return $flux;
146}
147/**
148 * Pipeline Cron de SPIPmotion (SPIP)
149 *
150 * Vérifie la présence à intervalle régulier de fichiers à encoder
151 * dans la file d'attente
152 *
153 * @return L'array des taches complété
154 * @param array $taches_generales Un array des tâches du cron de SPIP
155 */
156function spipmotion_taches_generales_cron($taches_generales){
157        $taches_generales['spipmotion_file'] = 3*60;
158        $taches_generales['spipmotion_taches_generales'] = 24*60*60;
159        return $taches_generales;
160}
161
162/**
163 * Insertion dans le pipeline post-edition
164 *
165 * Intervient à chaque modification d'un objet de SPIP
166 * notamment lors de l'ajout d'un document
167 *
168 * @return $flux Le contexte de pipeline complété
169 * @param array $flux Le contexte du pipeline
170 */
171function spipmotion_post_edition($flux){
172        if(in_array($flux['args']['operation'], array('ajouter_document','document_copier_local'))){
173                $id_document = $flux['args']['id_objet'];
174
175                /**
176                 * Il n'est pas nécessaire de récupérer la vignette d'une vignette
177                 * ni ses infos.
178                 */
179                $infos_doc = sql_fetsel('fichier,mode,distant','spip_documents','id_document='.intval($id_document));
180                $mode = $infos_doc['mode'];
181                $fichier = $infos_doc['fichier'];
182
183                if(($mode != 'vignette') && ($infos_doc['distant'] == 'non')){
184                        $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));
185                        $extension = $document['extension'];
186
187                        /**
188                         * Si nous sommes dans un format vidéo que SPIPmotion peut traiter,
189                         * on lui applique certains traitements
190                         * Les fichiers sonores sont gérés par le plugin getID3 pour cela
191                         */
192
193                        if(($GLOBALS['meta']['spipmotion_casse'] != 'oui') && in_array($extension,lire_config('spipmotion/fichiers_videos',array()))){
194                                /**
195                                 * Récupération des informations de la vidéo
196                                 */
197                                $recuperer_infos = charger_fonction('spipmotion_recuperer_infos','inc');
198                                $infos = $recuperer_infos($id_document);
199
200                                /**
201                                 * Récupération d'un logo de la vidéo
202                                 */
203                                $recuperer_logo = charger_fonction("spipmotion_recuperer_logo","inc");
204                                $logo = $recuperer_logo($id_document);
205
206                                $invalider = true;
207                        }
208
209                        /**
210                         * On l'ajoute dans la file d'attente d'encodage si nécessaire
211                         */
212                        $fichier = basename(get_spip_doc($document['fichier']));
213                        $racine = preg_replace('/-encoded-(\d+)/','',substr($fichier,0,-(strlen($document['extension'])+1)));
214                        $racine = preg_replace('/-encoded/','',substr($fichier,0,-(strlen($document['extension'])+1)));
215                        $id_doc = sql_getfetsel('id_document','spip_documents',"fichier LIKE '%$racine%' AND id_document != $id_document AND id_orig=0");
216                        if(($GLOBALS['meta']['spipmotion_casse'] != 'oui') && !preg_match('/-encoded/',$document['fichier']) OR !$id_doc){
217                                include_spip('action/spipmotion_ajouter_file_encodage');
218                                spipmotion_genere_file($id_document,$document['objet'],$document['id_objet']);
219                        }
220
221                        /**
222                         * On invalide le cache de cet élément si nécessaire
223                         */
224                        if($invalider){
225                                include_spip('inc/invalideur');
226                                suivre_invalideur("id='id_$type/$id'");
227                        }
228                }
229        }
230        return $flux;
231}
232
233function spipmotion_insert_head_css($flux){
234        $flux .= '
235<link rel="stylesheet" href="'.direction_css(find_in_path('spipmotion.css', 'css/', false)).'" type="text/css" media="all" />
236';
237        return $flux;
238}
239
240function spipmotion_header_prive($flux){
241        $flux .= '
242<link rel="stylesheet" href="'.direction_css(find_in_path('spipmotion.css', 'css/', false)).'" type="text/css" media="all" />
243';
244        return $flux;
245}
246
247function spipmotion_jquery_plugins($array){
248        if(!in_array(_DIR_LIB_FLOT.'/jquery.flot.js',$array)){
249                $array[] = _DIR_LIB_FLOT.'/jquery.flot.js';
250        }
251        $array[] = 'javascript/spipmotion_flot_extras.js';
252        return $array;
253}
254
255function spipmotion_post_spipmotion_encodage($flux){
256        if($flux['args']['reussite'] == 'oui'){
257                $origine = sql_fetsel('extension,fichier','spip_documents','id_document='.intval($flux['args']['id_document_orig']));
258                if(in_array($origine['extension'],array('mp3','flac','ogg','oga'))){
259                        $extension_nouveau = sql_getfetsel('extension','spip_documents','id_document='.intval($flux['args']['id_document']));
260                        if(in_array($extension_nouveau,lire_config('getid3_write',array()))){
261                                include_spip('inc/documents');
262                                $recuperer_id3 = charger_fonction('recuperer_id3','inc');
263                                $infos_write = array(
264                                        'title' => 0,
265                                        'artist' => 0,
266                                        'year' => 0,
267                                        'date'=>0,
268                                        'album' => 0,
269                                        'genre' => 0,
270                                        'comment' => 0,
271                                        'tracknumber' => 0
272                                );
273                                $infos_origine = $recuperer_id3(get_spip_doc($origine['fichier']));
274                               
275                                $images = array();
276                                foreach($infos_origine as $info_origine => $info){
277                                        if(preg_match('/cover/',$info_origine)){
278                                                $images[] = $info;
279                                        }
280                                }
281                                $infos_encode = array_intersect_key($infos_origine,$infos_write);
282                                $ecrire_infos = charger_fonction('getid3_ecrire_infos','inc');
283                                $ecrire_infos($flux['args']['id_document'],$infos_encode,$images);
284                        }
285                }
286        }
287       
288        $encodage_direct = charger_fonction('spipmotion_encodage_direct','inc');
289        $encodage_direct();
290       
291        return $flux;
292}
293?>
Note: See TracBrowser for help on using the repository browser.