source: spip-zone/_plugins_/spipmotion/trunk/inc/spipmotion_mediainfo.php @ 67735

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

Si on break pas, on aura toujours jpg de defaut...

Et booz qui veut qu'on #CONTINUE

File size: 7.8 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 * Récupération des métadonnées via MediaInfo
16 *
17 * @param string $chemin : le chemin du fichier à analyser
18 * @return array $infos : un tableau des informations récupérées
19 */
20function inc_spipmotion_mediainfo_dist($chemin){
21        include_spip('inc/filtres');
22        $infos = array();
23        if(file_exists($chemin)){
24                ob_start();
25                passthru(escapeshellcmd("mediainfo -f --Output=XML $chemin"));
26                $metadatas=ob_get_contents();
27                ob_end_clean();
28                include_spip('inc/xml');
29                $arbre = spip_xml_parse($metadatas);
30                spip_xml_match_nodes(",^track type,",$arbre, $tracks);
31                foreach($tracks as $track => $info){
32                        $metas[$track] = $info;
33                        if($track == 'track type="General"'){
34                                $infos['titre'] = $info[0]['Title'][0] ? $info[0]['Title'][0] : ($info[0]['Movie_name'][0] ? $info[0]['Movie_name'][0] : $info[0]['Track_name '][0]);
35                                $infos['descriptif'] = $info[0]['Description'][0] ? $info[0]['Description'][0] : $info[0]['desc'][0];
36                                if($infos['descriptif'] == ''){
37                                        if(isset($info[0]['Performer'][0]))
38                                                $infos['descriptif'] .= utf8_encode($info[0]['Performer'][0])."\n";
39                                        if(isset($info[0]['Album'][0]))
40                                                $infos['descriptif'] .= utf8_encode($info[0]['Album'][0])."\n";
41                                        if(isset($info[0]['Recorded_date'][0]))
42                                                $infos['descriptif'] .= utf8_encode($info[0]['Recorded_date'][0])."\n";
43                                        if(isset($info[0]['Genre'][0]))
44                                                $infos['descriptif'] .= utf8_encode($info[0]['Genre'][0])."\n";
45                                        if(isset($info[0]['Track_name_Position'][0]))
46                                                $infos['descriptif'] .= $info[0]['Track_name_Position'][0].($info[0]['Track_name_Total'][0] ? '/'.$info[0]['Track_name_Total'][0]:'')."\n";
47                                        if(isset($info[0]['Performer_Url'][0]))
48                                                $infos['descriptif'] .= "\n".utf8_encode($info[0]['Performer_Url'][0])."\n";
49                                }
50                                $infos['credits'] .= $info[0]['Performer'][0]? $info[0]['Performer'][0].($info[0]['Copyright'][0] ? ' - '.$info[0]['Copyright'][0] : '') : $info[0]['Copyright'][0] ;
51                                $infos['duree'] = $info[0]['Duration'][0] / 1000;
52                                if(!$infos['duree'])
53                                        $infos['duree'] = isset($info[0]['duration'][0]) ? (($info[0]['duration'][0] > 1000) ? ($info[0]['duration'][0]/1000) :$info[0]['duration'][0]) : '';
54                                $infos['bitrate'] = $info[0]['Overall_bit_rate'][0];
55                                $infos['encodeur'] = $info[0]['Writing_library'][0];
56                                if(!$infos['encodeur'])
57                                        $infos['encodeur'] = $info[0]['Writing_application'][0];
58                                /**
59                                 * Récupération de la cover
60                                 */
61                                if($info[0]['Cover_Data'][0]){
62                                        $mime = array_shift(explode(' ',$info[0]['Cover_MIME'][0]));
63                                        switch ($mime) {
64                                                case 'image/jpg':
65                                                        $ext = 'jpg';
66                                                        break;
67                                                case 'image/png':
68                                                        $ext = 'png';
69                                                        break;
70                                                case 'image/gif':
71                                                        $ext = 'gif';
72                                                        break;
73                                                default:
74                                                        $ext = 'jpg';
75                                        }
76                                        $tmp_file = 'spipmotion-'.str_replace('.','_',str_replace(':','_',str_replace(' ','_',$infos['titre']))).'.'.$ext;
77                            $dest = sous_repertoire(_DIR_VAR, 'cache-spipmotion_logo');
78                                        $dest = $dest.$tmp_file;
79                                        if ($ok = ecrire_fichier($dest, base64_decode(array_shift(explode(' / ',$info[0]['Cover_Data'][0]))))){
80                                                include_spip('inc/joindre_document');
81                                                $ajouter_documents = charger_fonction('ajouter_documents', 'action');
82                       
83                                                list($extension,$arg) = fixer_extension_document($dest);
84                                                $cover_ajout = array(array('tmp_name'=>$dest,'name'=> basename($dest)));
85                                                $ajoute = $ajouter_documents('new',$cover_ajout,'',0,'vignette');
86                       
87                                                if (is_numeric(reset($ajoute))
88                                                  AND $id_vignette = reset($ajoute)){
89                                                        $infos['id_vignette'] = $id_vignette;
90                                                }
91                                        }
92                                       
93                                        /**
94                                         * On tente de trouver une date correcte?
95                                         *
96                                         * Soit dans :
97                                         * -* Original_Released_date
98                                         * -* Recorded_date
99                                         * -* Encoded_date
100                                         */
101                                        foreach(array($info[0]['Original_Released_date'][0],$info[0]['Encoded_date'][0]) as $date){
102                                                $date = trim(str_replace('UTC','',$date));
103                                                if(preg_match('#^[0-9]{4}-[0-9]{1,2}- [0-9]{1}$#',$date)){
104                                                        $date = preg_replace("#\.|/| #i",'0',$date,1);
105                                                }
106                                                $date = preg_replace("#\.|/| #i",'-',$date);
107                                                if(preg_match('#^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}$#',$date)){
108                                                        list($annee,$mois,$jour) = explode('-',$date);
109                                                        if (checkdate($mois, $jour, $annee)){
110                                                                // normaliser
111                                                                if ($date = recup_date($date)){
112                                                                        if ($date = mktime($date[3], $date[4], 0, (int)$date[1], (int)$date[2], (int)$date[0])) {
113                                                                                $date = date("Y-m-d H:i:s", $date);
114                                                                                $date = vider_date($date); // enlever les valeurs considerees comme nulles (1 1 1970, etc...)
115                                                                                if ($date) {
116                                                                                        $infos['date'] = $date;
117                                                                                        break;
118                                                                                }
119                                                                        }
120                                                                }
121                                                        }
122                                                }
123                                        }
124                                       
125                                        /**
126                                         * Si on a du contenu dans les messages de copyright,
127                                         * on essaie de trouver la licence, si on a le plugin Licence
128                                         *
129                                         * Pour l'instant uniquement valable sur les CC
130                                         */
131                                        if(defined('_DIR_PLUGIN_LICENCE') && ((strlen($infos['descriptif']) > 0) OR strlen($infos['credits']) > 0)){
132                                                include_spip('licence_fonctions');
133                                                if(function_exists('licence_recuperer_texte')){
134                                                        foreach(array($infos['descriptif'],$infos['credits']) as $contenu){
135                                                                $infos['id_licence'] = licence_recuperer_texte($contenu);
136                                                                if(intval($infos['id_licence']))
137                                                                        break;
138                                                        }
139                                                }
140                                        }
141                                }
142                        }
143                        if($track == 'track type="Video"'){
144                                if(!$infos['titre'])
145                                        $infos['titre'] = $info[0]['Title'][0] ? $info[0]['Title'][0] : '';
146                                $infos['videobitrate'] = $info[0]['Bit_rate'][0] ? $info[0]['Bit_rate'][0] : ($info[0]['Nominal_bit_rate'][0] ? $info[0]['Nominal_bit_rate'][0] : '');
147                                $infos['hauteur'] = $info[0]['Height'][0];
148                                $infos['largeur'] = $info[0]['Width'][0];
149                                $infos['videocodec'] = $info[0]['Format'][0];
150                                $infos['videocodecid'] = $info[0]['Codec_ID'][0] ? $info[0]['Codec_ID'][0] : strtolower($info[0]['Format'][0]);
151                                if($infos['videocodecid'] == 'avc1'){
152                                        if(isset($info[0]['Format_profile'][0])){
153                                                if(preg_match('/^Baseline.*/',$info[0]['Format_profile'][0]))
154                                                        $infos['videocodecid'] = 'avc1.42E01E';
155                                                if(preg_match('/^Main.*/',$info[0]['Format_profile'][0]))
156                                                        $infos['videocodecid'] = 'avc1.4D401E';
157                                                if(preg_match('/^High.*/',$info[0]['Format_profile'][0]))
158                                                        $infos['videocodecid'] = 'avc1.64001E';
159                                        }
160                                }else if($infos['videocodec'] == 'Sorenson Spark'){
161                                        $infos['videocodecid'] = 'h263';
162                                }
163                                $infos['framerate'] = $info[0]['Frame_rate'][0];
164                                $infos['framecount'] = $info[0]['Frame_count'][0];
165                                $infos['rotation'] = intval($info[0]['Rotation'][0]);
166                                $infos['hasvideo'] = 'oui';
167                        }
168                        if($track == 'track type="Audio"'){
169                                $infos['hasaudio'] = 'oui';
170                                $infos['audiobitrate'] = $info[0]['Bit_rate'][0];
171                                $infos['audiochannels'] = $info[0]['Channel_s_'][0];
172                                $infos['audiochannels'] = $info[0]['Channel_s_'][0];
173                                $infos['audiosamplerate'] = $info[0]['Sampling_rate'][0];
174                                $infos['audiocodec'] = $info[0]['Codec'][0];
175                                $infos['audiobitratemode'] = strtolower($info[0]['Bit_rate_mode'][0]);
176                                if($infos['audiocodec'] == 'AAC LC'){
177                                        $infos['audiocodecid'] = 'mp4a.40.2';
178                                }else if($infos['audiocodec'] == 'MPA1L3'){
179                                        $infos['audiocodecid'] = 'mp3a';
180                                }else{
181                                        $infos['audiocodecid'] = $info[0]['Codec_ID'][0] ? $info[0]['Codec_ID'][0] : strtolower($info[0]['Codec'][0]);
182                                }
183                                if(!$infos['audiobitrate'] && !$infos['audiochannels'] && !$infos['audiocodec'] && !$infos['audiobitratemode']){
184                                        unset($infos['hasaudio']);
185                                }
186                        }
187                }
188        }
189        if(!$infos['hasaudio']){
190                $infos['hasaudio'] = 'non';
191        }
192        if(!$infos['hasvideo']){
193                $infos['hasvideo'] = 'non';
194        }
195
196        $metas['Retrieved infos in database'] = $infos;
197        $infos['metadatas'] = serialize($metas);
198        return $infos;
199}
200?>
Note: See TracBrowser for help on using the repository browser.