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