source: spip-zone/_plugins_/spipmotion/trunk/inc/spipmotion_recuperer_logo.php @ 67940

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

On ajoute un champs en base : aspect_ratio qui est le ratio d'affichage de la vidéo, des fois les vidéos annoncent une largeur et hauteur dont le ratio est différent du ratio souhaité à l'affichage (encodage pour les TV apparemment).

On prend compte de ce ratio dans l'encodage

On récupère une vignette de la vidéo qui correspond à ce ratio également

Version 1.2.1

File size: 7.9 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 * Fonction de récupération de vignette depuis un document video
16 * On utilise un script bash pour cela spipmotion_vignette.sh
17 *
18 * @param int $id_document
19 *              L'id numérique du document
20 * @param int $frame
21 *              La frame à capturer
22 * @param array $infos
23 *              Un array de description du document
24 * @param bool $only_return
25 *              Si true, on ne modifie pas le document, on retourne uniquement la nouvelle id_vignette
26 * @return int|false $id_vignette
27 *              L'identifiant de la nouvelle vignette si elle existe ou false
28 */
29function inc_spipmotion_recuperer_logo($id_document,$seconde=1,$fichier=false,$infos=false,$only_return=false){
30        spip_log("SPIPMOTION : recuperation d un logo du document $id_document","spipmotion");
31        $id_vignette = false;
32        /**
33         * Pas d'id_document, on retourne false
34         */
35        if(!intval($id_document) && (!$fichier OR !file_exists($fichier))){
36                spip_log('SPIPMOTION Erreur : pas de bon id_document fourni pour la génération de vignette','spipmotion'._LOG_CRITIQUE);
37                return false;
38        }
39        /**
40         * Le script de génération de vignette n'est pas là, on retourne false
41         */
42        if($GLOBALS['meta']['spipmotion_spipmotion_vignette_sh_casse'] == 'oui'){
43                spip_log('SPIPMOTION Erreur : le script de génération de vignette n\'est pas disponible','spipmotion'._LOG_CRITIQUE);
44                return false;
45        }
46        include_spip('inc/documents');
47        include_spip('inc/filtres_images_mini');
48        include_spip('action/editer_document');
49        $ajouter_documents = charger_fonction('ajouter_documents', 'action');
50       
51        $retour = 0;
52       
53        if(intval($id_document)){
54                include_spip('inc/autoriser');
55                if(!autoriser('modifier','document',$id_document)){
56                        spip_log('SPIPMOTION Erreur : tentative de récupération de logo sans autorisation de modification du document','spipmotion'._LOG_CRITIQUE);
57                        return false;
58                }
59                $document = sql_fetsel("*", "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));
60                $vignette_existante = sql_getfetsel('id_document','spip_documents','id_document='.intval($document['id_vignette']));
61                if(!$vignette_existante)
62                        $vignette_existante = 'new';
63                $chemin_court = $document['fichier'];
64                $chemin = get_spip_doc($chemin_court);
65                $string_temp = "$id-$type-$id_document";
66        }
67        else if($fichier && is_array($infos) && $only_return){
68                $chemin = $fichier;
69                $document = $infos;
70                $string_temp = "$fichier-".date("Y-m-dHis");
71        }else{
72                spip_log('Mauvais arguments pour récupérer la vignette','spipmotion');
73                return false;
74        }
75        if(!$document['duree'] OR $document['duree'] == ''){
76                spip_log('Erreur : le document n a pas de durée','spipmotion');
77                return false;
78        }
79
80        if($document['hasvideo'] == 'oui'){
81                $vignette = false;
82                if($GLOBALS['spipmotion_metas']['spipmotion_safe_mode'] == 'oui'){
83                        $spipmotion_sh = $GLOBALS['spipmotion_metas']['spipmotion_safe_mode_exec_dir'].'/spipmotion_vignette.sh'; 
84                }else{
85                        $spipmotion_sh = find_in_path('script_bash/spipmotion_vignette.sh');
86                }
87               
88                $query = md5($string_temp);
89                $dossier_temp = _DIR_VAR;
90                $fichier_temp = "$dossier_temp$query.jpg";
91                while(!$vignette && ($seconde <= intval($document['duree']))){
92                        $params_supp = '';
93                        /**
94                         * Forcer la vignette comme le display aspect ratio
95                         */
96                        if(is_numeric($document['aspect_ratio'])){
97                                $params_supp = " --params_supp \"-aspect ".$document['aspect_ratio']."\"";
98                                $document['hauteur'] = intval($document['largeur'] / $document['aspect_ratio']);
99                        }
100                        $cmd_vignette = $spipmotion_sh.' --e '.$chemin.' --size '.$document['largeur'].'x'.$document['hauteur'].' --s '.$fichier_temp.' --ss '.$seconde." $params_supp";
101                        $lancement_vignette = exec($cmd_vignette,$retour_vignette,$retour_int);
102                        /**
103                         * Le retour du script n'est pas bon, il est certainement non exécutable
104                         */
105                        if($retour_int >= 126){
106                                $erreur = _T('spipmotion:erreur_script_spipmotion_non_executable');
107                                spip_log("SPIPMOTION Erreur : $erreur",'spipmotion'._LOG_CRITIQUE);
108                                return false;
109                        }
110                        if($retour_int == 0){
111                                $vignette = true;
112                                /**
113                                 * Le fichier temporaire n'existe pas, il y a un pb quelque part
114                                 */
115                                if(!file_exists($fichier_temp) OR (filesize($fichier_temp) == 0)){
116                                        spip_log("SPIPMOTION Erreur : le fichier $fichier_temp n'existe pas",'spipmotion'._LOG_CRITIQUE);
117                                        return false;
118                                }else{
119                                        $img_finale = $fichier_temp;
120                                        $mode = 'vignette';
121                                        /**
122                                         * On teste si on a le plugin de fonctions supplémentaires d'images
123                                         * pour le filtre image_monochrome
124                                         */
125                                        if(defined('_DIR_PLUGIN_FONCTIONS_IMAGES')){
126                                                include_spip('fonctions_images_fonctions');
127                                                /**
128                                                 * Si on se retrouve avec 10 images monochromes d'affilée,
129                                                 * on tente de récupérer la vignette du document original
130                                                 */
131                                                if($retour>10){
132                                                        if($document['mode'] != 'conversion'){
133                                                                $original = sql_fetsel('id_document,id_vignette','spip_documents','id_document='.intval($document['id_document']));
134                                                        }
135                                                        else{
136                                                                $id_original = sql_getfetsel('doc.id_document','spip_documents as doc LEFT JOIN spip_documents_liens as lien ON doc.id_document=lien.id_document','lien.objet="document" AND lien.id_document='.intval($id_document));
137                                                                $original = sql_fetsel('id_document,id_vignette','spip_documents','id_document='.intval($id_original));
138                                                        }
139                                                        if(intval($original['id_vignette']) > 0){
140                                                                $vignette = sql_getfetsel('fichier','spip_documents','id_document='.intval($original['id_vignette']));
141                                                                $vignette = get_spip_doc($vignette);
142                                                                $x = $ajouter_documents($vignette_existante,
143                                                                                                array(array('tmp_name'=>$img_finale,'name'=> $img_finale)),
144                                                                                        '', 0, 'vignette');
145                                                                $id_vignette = reset($x);
146                                                                if(intval($id_vignette)){
147                                                                        $vignette = true;
148                                                                        if(!$only_return && ($document['id_vignette'] != $id_vignette))
149                                                                                document_modifier($id_document, array('id_vignette'=>$id_vignette));
150                                                                }
151                                                            return $id_vignette;
152                                                        }
153                                                        return false;
154                                                }
155                                                /**
156                                                 * Ici on teste si la vignette récupérée est monochrome,
157                                                 * si elle l'est :
158                                                 * - On supprime l'image temporaire
159                                                 * - On augmente le nombre de seconde de 3, on essaiera donc
160                                                 * de récupérer une vignette 3 secondes plus tard
161                                                 * - On remet $vignette à false
162                                                 * - On incrémente le nombre de $retour
163                                                 */
164                                                else if(!filtrer('image_monochrome',$fichier_temp)){
165                                                        spip_unlink($img_finale);
166                                                        $seconde = $seconde+3;
167                                                        $vignette = false;
168                                                        $retour++;
169                                                }
170                                                else if(file_exists($img_finale)){
171                                                        $x = $ajouter_documents($vignette_existante,
172                                                                                                        array(array('tmp_name'=>$img_finale,'name'=> $img_finale)),
173                                                                                                '', 0, 'vignette');
174                                                        $x = reset($x);
175                                                        if(intval($x)){
176                                                                $vignette = true;
177                                                                $id_vignette = $x;
178                                                                if(!$only_return && ($document['id_vignette'] != $x))
179                                                                        document_modifier($id_document, array('id_vignette'=>$x));
180                                                        }
181                                                        spip_unlink($img_finale);
182                                                }else{
183                                                        return false;
184                                                }
185                                        }
186                                        /**
187                                         * On n'a pas le plugin de fonctions d'images supplémentaires
188                                         * On insère comme vignette ce qu'on a
189                                         */
190                                        else{
191                                                if(file_exists($img_finale)){
192                                                        $x = $ajouter_documents($vignette_existante,
193                                                                                                array(array('tmp_name'=>$img_finale,'name'=> $img_finale)),
194                                                                                        '', 0, 'vignette');
195                                                        $x = reset($x);
196                                                        if(intval($x)){
197                                                                $vignette = true;
198                                                                $id_vignette = $x;
199                                                                if(!$only_return && ($document['id_vignette'] != $x))
200                                                                        document_modifier($id_document, array('id_vignette'=>$x));
201                                                        }
202                                                        spip_unlink($img_finale);
203                                                }
204                                        }
205                                }
206                        }else{
207                                return false;   
208                        }
209                }
210        }else{
211                spip_log('Erreur : ce document n a pas de piste video','spipmotion');
212        }
213        return $id_vignette;
214}
215?>
Note: See TracBrowser for help on using the repository browser.