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

Last change on this file since 107194 was 103472, checked in by kent1@…, 4 years ago

PSR SPIP

File size: 10.6 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 * Auteur :
7 * kent1 (http://www.kent1.info - kent1@arscenic.info)
8 * 2008-2013 - Distribué sous licence GNU/GPL
9 *
10 * @package SPIP\SPIPmotion\Pipelines
11 */
12
13if (!defined('_ECRIRE_INC_VERSION')) {
14        return;
15}
16
17/**
18 * Insertion dans le pipeline document_desc_actions (medias)
19 *
20 * Affiche les boutons supplémentaires de :
21 * - récupération de logo dans le cas d'une vidéo
22 * - récupération d'informations spécifiques dans le cas d'une video
23 * (Dans le cas d'un son, c'est le plugin getID3 qui s'en charge si présent)
24 * - bouton de demande d'encodage / de réencodage du son ou de la vidéo
25 *
26 * On utilise le même inclure que GetID3 que l'on surcharge, donc on ne l'inclue à
27 * nouveau que si GetID3 n'est pas là
28 *
29 * @param array $flux
30 *              Le contexte du pipeline
31 * @return $flux
32 *              Le contexte du pipeline complété
33 */
34function spipmotion_document_desc_actions($flux) {
35        if (!defined('_DIR_PLUGIN_GETID3')) {
36                $flux['data'] .= recuperer_fond('prive/squelettes/inclure/metadatas_document_desc_action', $flux['args']);
37        }
38        return $flux;
39}
40
41/**
42 * Pipeline taches_generales_cron de SPIPmotion (SPIP)
43 *
44 * Vérifie la présence à intervalle régulier de fichiers à encoder
45 * dans la file d'attente
46 *
47 * @param array $taches_generales
48 *              Un array des tâches du cron de SPIP
49 * @return array $taches_generales
50 *              L'array des taches complété
51 */
52function spipmotion_taches_generales_cron($taches_generales) {
53        $taches_generales['spipmotion_taches_generales'] = 24*60*60;
54        return $taches_generales;
55}
56
57/**
58 * Insertion dans le pipeline post-edition
59 *
60 * Intervient à chaque modification d'un objet de SPIP
61 * notamment lors de l'ajout d'un document
62 *
63 * Lors de l'ajout d'un document, si c'est un ogg, on vérifie bien que le document n'est qu'un fichier audio,
64 * si c'est une vidéo, on le renome en .ogv et on update la base de donnée
65 *
66 * Lors de la suppression de document, supprime les versions encodées créées par spipmotion s'il y a lieu
67 *
68 * @param array $flux
69 *              Le contexte du pipeline
70 * @return array $flux
71 *              Le contexte de pipeline complété
72 */
73function spipmotion_post_edition($flux) {
74        if (isset($flux['args']['operation'])
75                and in_array($flux['args']['operation'], array('ajouter_document','document_copier_local'))) {
76                $id_document = isset($flux['args']['id_objet']) ? intval($flux['args']['id_objet']) : 0;
77
78                /**
79                 * Si les metadatas/* on renvoyé un id_gis_meta, on l'associe au document
80                 * Si on reçoit un id_gis_meta dans l'environnement,
81                 * c'est que cela vient d'une récupération de metas après upload de document
82                 * dans spipmotion par exemple
83                 */
84                if (defined('_DIR_PLUGIN_GIS') and intval(_request('id_gis_meta'))) {
85                        lier_gis(intval(_request('id_gis_meta')), 'document', $id_document);
86                }
87
88                /**
89                 * Si on ajoute le document et que :
90                 * -* son extension est ogg
91                 * -* il a une piste vidéo
92                 *
93                 * On le renomme en ogv et on update son media en video
94                 *
95                 * On refait la requête pour les infos du document
96                 *
97                 * Correction du ticket http://www.mediaspip.net/ticket/les-conteneurs-sons-et-videos-n
98                 */
99                $infos_doc = sql_fetsel(
100                        'extension,hasvideo,fichier,mode,distant',
101                        'spip_documents',
102                        'id_document='.intval($id_document)
103                );
104                if (($flux['args']['operation'] == 'ajouter_document')
105                        && ($infos_doc['extension'] == 'ogg')
106                        && ($infos_doc['hasvideo'] == 'oui')
107                ) {
108                        include_spip('inc/documents');
109                        $rep_ogv = creer_repertoire_documents('ogv');
110
111                        $new_file = str_replace('.ogg', '.ogv', basename($infos_doc['fichier']));
112                        $renomme = rename(get_spip_doc($infos_doc['fichier']), $rep_ogv. $new_file);
113                        if ($renomme) {
114                                $recuperer_logo = charger_fonction('spipmotion_recuperer_logo', 'inc');
115                                $id_vignette = $recuperer_logo($id_document, 1, $file, $metas, true);
116                                sql_updateq(
117                                        'spip_documents',
118                                        array(
119                                                'id_vignette' => $id_vignette,
120                                                'media' => 'video',
121                                                'extension' => 'ogv',
122                                                'fichier' => set_spip_doc($rep_ogv.$new_file)
123                                        ),
124                                        'id_document ='.intval($id_document)
125                                );
126                                $infos_doc = sql_fetsel(
127                                        'extension,hasvideo,fichier,mode,distant',
128                                        'spip_documents',
129                                        'id_document='.intval($id_document)
130                                );
131                        }
132                }
133                /**
134                 * Il n'est pas nécessaire de récupérer la vignette d'une vignette ni d'un document distant
135                 * ni ses infos.
136                 */
137                if (($infos_doc['mode'] != 'vignette') and ($infos_doc['distant'] == 'non')) {
138                        if (!function_exists('lire_config')) {
139                                include_spip('inc/config');
140                        }
141                        /**
142                         * Si nous sommes dans un format vidéo que SPIPmotion peut traiter,
143                         * on lui applique certains traitements :
144                         * -* récupération d'une vignette
145                         * La récupération des infos est faite directement via metadata/video et metadata/audio
146                         * lors de l'insertion
147                         */
148                        if (($GLOBALS['meta']['spipmotion_casse'] != 'oui')
149                                and ($infos_doc['mode'] != 'conversion')
150                                and (lire_config('spipmotion/encodage_auto', 'off') == 'on')
151                                and (in_array($infos_doc['extension'], lire_config('spipmotion/fichiers_videos', array()))
152                                        or in_array($infos_doc['extension'], lire_config('spipmotion/fichiers_audios', array())))) {
153                                /**
154                                 * On l'ajoute dans la file d'attente d'encodage si nécessaire
155                                 * Si et seulement si on a l'option d'activée dans la conf
156                                 */
157                                include_spip('action/spipmotion_ajouter_file_encodage');
158                                spipmotion_genere_file($id_document);
159                                /**
160                                 * On lance une conversion directe en tache de fond
161                                 */
162                                $conversion_directe = charger_fonction('facd_convertir_direct', 'inc');
163                                $conversion_directe();
164                                $invalider = true;
165                        }
166                        /**
167                         * On invalide le cache de cet élément si nécessaire
168                         */
169                        if ($invalider) {
170                                include_spip('inc/invalideur');
171                                suivre_invalideur("id='id_document/$id_document'");
172                        }
173                }
174        }
175        if (isset($flux['args']['operation']) and ($flux['args']['operation'] == 'supprimer_document')) {
176                include_spip('action/spipmotion_remove_version');
177                spipmotion_supprimer_versions($flux['args']['id_objet']);
178        }
179        return $flux;
180}
181
182/**
183 * Insertion dans le pipeline jqueryui_plugin (plugin jQuery UI)
184 *
185 * On ajoute le chargement des js pour les tabs (utilisés dans la conf)
186 * uniquement dans l'espace privé
187 *
188 * @param array $plugins
189 *              Un tableau des scripts déjà demandé au chargement
190 * @retune array $plugins
191 *              Le tableau complété avec les scripts que l'on souhaite
192 */
193function spipmotion_jqueryui_plugins($plugins) {
194        if (test_espace_prive()) {
195                $plugins[] = 'jquery.ui.tabs';
196        }
197        return $plugins;
198}
199
200function spipmotion_post_spipmotion_encodage($flux) {
201        if ($flux['args']['reussite'] == 'oui') {
202                $origine = sql_fetsel('extension,fichier', 'spip_documents', 'id_document='.intval($flux['args']['id_document_orig']));
203                if (in_array($origine['extension'], array('mp3','flac','ogg','oga'))) {
204                        $extension_nouveau = sql_getfetsel('extension', 'spip_documents', 'id_document='.intval($flux['args']['id_document']));
205                        if (in_array($extension_nouveau, lire_config('getid3_write', array()))) {
206                                include_spip('inc/documents');
207                                $recuperer_id3 = charger_fonction('recuperer_id3', 'inc');
208                                $infos_write = array(
209                                        'title' => 0,
210                                        'artist' => 0,
211                                        'year' => 0,
212                                        'date'=>0,
213                                        'album' => 0,
214                                        'genre' => 0,
215                                        'comment' => 0,
216                                        'tracknumber' => 0
217                                );
218                                $infos_origine = $recuperer_id3(get_spip_doc($origine['fichier']));
219
220                                if ($extension_nouveau == 'mp3') {
221                                        $images = array();
222                                        foreach ($infos_origine as $info_origine => $info) {
223                                                if (preg_match('/cover/', $info_origine)) {
224                                                        $images[] = $info;
225                                                }
226                                        }
227                                }
228                                $infos_encode = array_intersect_key($infos_origine, $infos_write);
229                                $ecrire_infos = charger_fonction('getid3_ecrire_infos', 'inc');
230                                $ecrire_infos($flux['args']['id_document'], $infos_encode, $images);
231                        }
232                }
233        }
234        return $flux;
235}
236
237/**
238 * Insertion dans le pipeline formulaire_verifier (SPIP)
239 *
240 * Vérification de certaines valeurs de la configuration
241 *
242 * @param array $flux
243 *              Le contexte du pipeline
244 * @return array $flux
245 *              Le contexte du pipeline modifié
246 */
247function spipmotion_formulaire_verifier($flux) {
248        if ($flux['args']['form'] == 'configurer_spipmotion') {
249                foreach ($_POST as $key => $val) {
250                        if (preg_match('/(bitrate|height|width|frequence_audio|fps|passes|qualite_video|qualite_audio).*/', $key) && $val) {
251                                if (!ctype_digit($val)) {
252                                        $flux['data'][$key] = _T('spipmotion:erreur_valeur_int');
253                                } elseif (preg_match('/(height|width).*/', $key) && ($val < 100)) {
254                                        $flux['data'][$key] = _T('spipmotion:erreur_valeur_int_superieur', array('val'=> 100));
255                                }
256                        }
257                }
258                if (count($erreur) > 0) {
259                        $flux['data']['message_erreur'] = _T('spipmotion:erreur_formulaire_configuration');
260                }
261        }
262        return $flux;
263}
264
265/**
266 * Insertion dans le pipeline formulaire_traiter (SPIP)
267 *
268 * Traitement spécifique à la validation du formulaire de configuration
269 *
270 * @param array $flux
271 *              Le contexte du pipeline
272 * @return array $flux
273 *              Le contexte du pipeline modifié
274 */
275function spipmotion_formulaire_traiter($flux) {
276        if ($flux['args']['form'] == 'configurer_spipmotion') {
277                $valeurs = $_POST;
278
279                $verifier_binaires = charger_fonction('spipmotion_verifier_binaires', 'inc');
280                $erreurs = $verifier_binaires($valeurs);
281
282                /**
283                 * On récupère les informations du nouveau ffmpeg
284                 */
285                if (!in_array('ffmpeg', $erreurs)) {
286                        $ffmpeg_infos = charger_fonction('spipmotion_ffmpeg_infos', 'inc');
287                        $ffmpeg_infos(true);
288                }
289
290                if (count($erreurs) > 0) {
291                        include_spip('inc/invalideur');
292                        suivre_invalideur('1');
293                }
294        }
295        return $flux;
296}
297
298/**
299 * Insertion dans le pipeline recuperer_fond (SPIP)
300 *
301 * On affiche les informations du document
302 *
303 * @param array $flux
304 *              Le contexte du pipeline
305 * @return array $flux
306 *              Le contexte du pipeline modifié
307 */
308function spipmotion_recuperer_fond($flux) {
309        if (!defined('_DIR_PLUGIN_GETID3') and $flux['args']['fond']=='modeles/document_desc') {
310                if (isset($flux['args']['contexte']['id_document']) and ($flux['args']['contexte']['id_document'] > 0)) {
311                        $media = sql_getfetsel('media', 'spip_documents', 'id_document='.intval($flux['args']['contexte']['id_document']));
312                        if (in_array($media, array('video','audio'))) {
313                                $flux['data']['texte'] .= recuperer_fond('prive/squelettes/inclure/prive_infos_media', $flux['args']['contexte']);
314                        }
315                }
316        }
317        if ($flux['args']['fond']=='prive/squelettes/contenu/facd') {
318                $flux['data']['texte'] .= recuperer_fond('prive/squelettes/inclure/file_stats', $flux['args']['contexte']);
319        }
320        if ($flux['args']['fond']=='prive/squelettes/navigation/facd') {
321                $flux['data']['texte'] .= recuperer_fond('prive/squelettes/navigation/spipmotion_file', $flux['args']['contexte']);
322        }
323        return $flux;
324}
Note: See TracBrowser for help on using the repository browser.