source: spip-zone/_plugins_/spipmotion/trunk/inc/spipmotion_ffmpeg_infos.php @ 103468

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

Utiliser ecrire_config même pour notre table des métas différente (spipmotion_metas)

File size: 13.3 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-2014 - Distribué sous licence GNU/GPL
9 *
10 */
11
12if (!defined('_ECRIRE_INC_VERSION')) {
13        return;
14}
15
16function inc_spipmotion_ffmpeg_infos_dist($forcer = false) {
17        $infos_codecs = ffmpeg_recuperer_infos_codecs($forcer);
18        return $infos_codecs;
19}
20
21/**
22 * Récupération des informations sur les codecs disponibles
23 */
24function ffmpeg_recuperer_infos_codecs($forcer) {
25        if ($forcer) {
26                include_spip('inc/config');
27                if (!is_dir(_DIR_CACHE.'spipmotion')) {
28                        sous_repertoire(_DIR_CACHE, 'spipmotion');
29                }
30                $chemin_fichier = _DIR_CACHE.'spipmotion/ffmpeg_codecs';
31
32                /**
33                 * On recharge les logiciels
34                 */
35                $verifier_binaires = charger_fonction('spipmotion_verifier_binaires', 'inc');
36                $verifier_binaires();
37                if ($GLOBALS['spipmotion_metas']['spipmotion_safe_mode'] == 'oui') {
38                        $spipmotion_sh = $GLOBALS['spipmotion_metas']['spipmotion_safe_mode_exec_dir'].'/spipmotion.sh';
39                } else {
40                        $spipmotion_sh = find_in_path('script_bash/spipmotion.sh');
41                }
42
43                /**
44                 * On crée un fichier contenant l'ensemble de la conf de ffmpeg
45                 */
46                supprimer_fichier($chemin_fichier);
47                spimotion_write($chemin_fichier, "==VERSION==\n");
48                exec($spipmotion_sh.' --info "-version" --log '.$chemin_fichier, $retour, $bool);
49                spimotion_write($chemin_fichier.'_formats', "\n==FORMATS==\n");
50                exec($spipmotion_sh.' --info "-formats" --log '.$chemin_fichier.'_formats', $retour, $bool);
51                spimotion_write($chemin_fichier.'_codecs', "\n==CODECS==\n");
52                exec($spipmotion_sh.' --info "-codecs" --log '.$chemin_fichier.'_codecs', $retour, $bool);
53                spimotion_write($chemin_fichier, "\n==BSFS==\n");
54                exec($spipmotion_sh.' --info "-bsfs" --log '.$chemin_fichier, $retour, $bool);
55                spimotion_write($chemin_fichier, "\n==FILTERS==\n");
56                exec($spipmotion_sh.' --info "-filters" --log '.$chemin_fichier, $retour, $bool);
57                spimotion_write($chemin_fichier, "\n==PIX_FMTS==\n");
58                exec($spipmotion_sh.' --info "-pix_fmts" --log '.$chemin_fichier, $retour, $bool);
59                spimotion_write($chemin_fichier, "\n==PROTOCOLS==\n");
60                exec($spipmotion_sh.' --info "-protocols" --log '.$chemin_fichier, $retour, $bool);
61                spimotion_write($chemin_fichier, "\n==FIN==");
62
63                if (lire_fichier($chemin_fichier, $contenu)) {
64                        $contenu = trim($contenu);
65                        $data = array();
66                        $look_ups = array(
67                                'version' => 'ffmpeg version',
68                                'configuration'=>'configuration:',
69                                'bitstream_filters'=>'==BSFS==',
70                                'avfilters' => 'Filters:',
71                                'pix_formats' => '==PIX_FMTS==',
72                                'abbreviations'=>'Frame size, frame rate abbreviations:',
73                                'protocols'=>'==PROTOCOLS==',
74                                'fin' => '==FIN=='
75                        );
76
77                        $pregs = array();
78                        $indexs = array();
79                        foreach ($look_ups as $key => $reg) {
80                                if (strpos($contenu, $reg) !== false) {
81                                        $index = array_push($pregs, $reg);
82                                        $indexs[$key] = $index;
83                                }
84                        }
85                        $result = preg_match('/'.implode('(.*)', $pregs).'/s', $contenu, $matches);
86
87                        /**
88                         * Récupération des informations de version
89                         */
90                        $data['spipmotion_compiler'] = array();
91                        $data['spipmotion_compiler']['versions'] = array();
92
93                        $version = trim($matches[$indexs['version']]);
94                        preg_match('/([a-zA-Z0-9\-]+[0-9\.]+).* with gcc (.*)/s', $version, $versions);
95                        $data['spipmotion_compiler']['ffmpeg_version'] = $versions[1];
96                        $data['spipmotion_compiler']['gcc'] = $versions[2];
97
98                        /**
99                         * Récupération des éléments de configuration
100                         */
101                        $configuration = trim($matches[$indexs['configuration']]);
102                        preg_match_all('/--[a-zA-Z0-9\-]+/', $configuration, $config_flags);
103                        ksort($config_flags[0]);
104                        $data['spipmotion_compiler']['configuration'] = $config_flags[0];
105
106                        // Replace old vhook support
107                        $data['spipmotion_compiler']['avfilter-support'] = (in_array('--enable-avfilter', $config_flags[0]) && !in_array('--disable-avfilter', $config_flags[0]) ? '1' : '0');
108
109                        /**
110                         * Récupération des formats disponibles
111                         * Pour chaque format reconnu on retourne un array avec
112                         */
113                        if (lire_fichier($chemin_fichier.'_formats', $contenu_formats)) {
114                                preg_match_all('/ (DE|D|E) (.*) {1,} (.*)/', $contenu_formats, $formats);
115                                $data['spipmotion_formats'] = array();
116                                for ($i=0, $a=count($formats[0]); $i<$a; $i++) {
117                                        $data['spipmotion_formats'][strtolower(trim($formats[2][$i]))] = array(
118                                                'encode'        => $formats[1][$i] == 'DE' || $formats[1][$i] == 'E',
119                                                'decode'        => $formats[1][$i] == 'DE' || $formats[1][$i] == 'D',
120                                                'fullname'      => $formats[3][$i]
121                                        );
122                                }
123                                ecrire_config('/spipmotion_metas/spipmotion_formats', serialize($data['spipmotion_formats']));
124                        }
125
126                        /**
127                         * Récupération des codecs disponibles
128                         */
129                        if (lire_fichier($chemin_fichier.'_codecs', $contenu_codecs)) {
130                                preg_match_all('/ (D| |\.)(E| |\.)(V|A|S|\.)(S| |\.|I)(D|L| |\.)(T|S| ) (.*) {1,} (.*)/', $contenu_codecs, $codecs);
131                                $data['spipmotion_codecs'] = array();
132                                $data['spipmotion_codecs_audio_decode'] = array();
133                                $data['spipmotion_codecs_video_decode'] = array();
134                                $data['spipmotion_codecs_audio_encode'] = array();
135                                $data['spipmotion_codecs_video_encode'] = array();
136                                for ($i=0, $a=count($codecs[0]); $i<$a; $i++) {
137                                        $data['spipmotion_codecs'][strtolower(trim($codecs[7][$i]))] = array(
138                                                'decode'        => $codecs[1][$i] == 'D',
139                                                'encode'        => $codecs[2][$i] == 'E',
140                                                'type'  => $codecs[3][$i],
141                                                'draw_horiz_band'       => $codecs[4][$i] == 'S',
142                                                'direct_rendering'      => $codecs[5][$i] == 'D',
143                                                'weird_frame_truncation' => $codecs[6][$i] == 'T',
144                                                'fullname' => $codecs[8][$i]
145                                        );
146                                        if (($codecs[1][$i] == 'D') && ($codecs[3][$i] == 'A')) {
147                                                $data['spipmotion_codecs_audio_decode'][] = trim($codecs[7][$i]);
148                                        }
149                                        if (($codecs[1][$i] == 'D') && ($codecs[3][$i] == 'V')) {
150                                                $data['spipmotion_codecs_video_decode'][] = trim($codecs[7][$i]);
151                                        }
152                                        if (($codecs[2][$i] == 'E') && ($codecs[3][$i] == 'A')) {
153                                                $data['spipmotion_codecs_audio_encode'][] = trim($codecs[7][$i]);
154                                        }
155                                        if (($codecs[2][$i] == 'E') && ($codecs[3][$i] == 'V')) {
156                                                $data['spipmotion_codecs_video_encode'][] = trim($codecs[7][$i]);
157                                        }
158                                }
159                                ecrire_config('/spipmotion_metas/spipmotion_codecs', serialize($data['spipmotion_codecs']));
160                                ecrire_config('/spipmotion_metas/spipmotion_codecs_audio_decode', serialize($data['spipmotion_codecs_audio_decode']));
161                                ecrire_config('/spipmotion_metas/spipmotion_codecs_video_decode', serialize($data['spipmotion_codecs_video_decode']));
162                                ecrire_config('/spipmotion_metas/spipmotion_codecs_audio_encode', serialize($data['spipmotion_codecs_audio_encode']));
163                                ecrire_config('/spipmotion_metas/spipmotion_codecs_video_encode', serialize($data['spipmotion_codecs_video_encode']));
164                        }
165
166                        /**
167                         * On récupère les filtres bitstream disponibles
168                         */
169                        $bitstream_filters = trim($matches[$indexs['bitstream_filters']]);
170                        $data['spipmotion_bitstream_filters'] = empty($bitstream_filters) ? array() : preg_split('/\n/', $bitstream_filters);
171                        ecrire_config('/spipmotion_metas/spipmotion_bitstream_filters', serialize($data['spipmotion_bitstream_filters']));
172
173                        /**
174                         * On récupère les protocoles disponibles
175                         */
176                        $protocols = trim($matches[$indexs['protocols']]);
177                        $data['spipmotion_protocols'] = empty($protocols) ? array() : preg_split('/\n/', str_replace(':', '', $protocols));
178                        ecrire_config('/ecrire_config/spipmotion_protocols', serialize($data['spipmotion_protocols']));
179
180                        /**
181                         * On récupère la liste des filtres avfilter
182                         */
183                        preg_match_all('/(.*) {1,} (.*)/', trim($matches[$indexs['avfilters']]), $filters);
184                        $data['spipmotion_avfilters'] = array();
185                        for ($i=0, $a=count($filters[0]); $i<$a; $i++) {
186                                $data['spipmotion_avfilters'][strtolower(trim($filters[1][$i]))] = array(
187                                        'nom'   => trim($filters[1][$i]),
188                                        'description'   => trim($filters[2][$i]) == '(null)' ? false : trim($filters[2][$i]),
189                                );
190                        }
191                        if (empty($data['spipmotion_avfilters'])) {
192                                $data['spipmotion_compiler']['avfilter-support'] = false;
193                        }
194
195                        ksort($data['spipmotion_avfilters']);
196                        ecrire_config('/spipmotion_metas/spipmotion_avfilters', serialize($data['spipmotion_avfilters']));
197                        ecrire_config('/spipmotion_metas/spipmotion_compiler', serialize($data['spipmotion_compiler']));
198
199                        /**
200                         * On regarde si spipmotion.sh est utilisable
201                         */
202                        $spipmotion_infos_sh = exec($spipmotion_sh.' --help', $retour_spipmotion_sh, $int_spipmotion_sh);
203                        if (!empty($retour_spipmotion_sh)) {
204                                $info = $retour_spipmotion_sh[1];
205                                preg_match('/SPIPmotion v([0-9a-z].*)/s', $info, $infos);
206                                $data['spipmotion_spipmotion_sh']['spipmotion_sh'] = true;
207                                $data['spipmotion_spipmotion_sh']['chemin'] = $spipmotion_sh;
208                                $data['spipmotion_spipmotion_sh']['version'] = $infos[1];
209                                ecrire_config('/spipmotion_metas/spipmotion_spipmotion_sh', serialize($data['spipmotion_spipmotion_sh']));
210                        }
211
212                        /**
213                         * On regarde si spipmotion_vignettes.sh est utilisable
214                         */
215                        if ($GLOBALS['spipmotion_metas']['spipmotion_safe_mode'] == 'oui') {
216                                $spipmotion_sh_vignettes = $GLOBALS['spipmotion_metas']['spipmotion_safe_mode_exec_dir'].'/spipmotion_vignette.sh';
217                        } else {
218                                $spipmotion_sh_vignettes = find_in_path('script_bash/spipmotion_vignette.sh');
219                        }
220
221                        $spipmotion_sh_vignettes_infos = exec($spipmotion_sh_vignettes.' --help', $retour_spipmotion_sh_vignettes, $int_spipmotion_sh_vignettes);
222                        if (!empty($retour_spipmotion_sh_vignettes)) {
223                                $info = $retour_spipmotion_sh_vignettes[2];
224                                preg_match('/SPIPmotion vignette v([0-9a-z].*)/s', $info, $infos);
225                                $data['spipmotion_spipmotion_sh_vignettes']['spipmotion_sh_vignettes'] = true;
226                                $data['spipmotion_spipmotion_sh_vignettes']['chemin'] = $spipmotion_sh_vignettes;
227                                $data['spipmotion_spipmotion_sh_vignettes']['version'] = $infos[1];
228                                ecrire_config('/spipmotion_metas/spipmotion_spipmotion_sh_vignettes', serialize($data['spipmotion_spipmotion_sh_vignettes']));
229                        } else {
230                                $data['spipmotion_spipmotion_sh_vignettes']['spipmotion_sh_vignettes'] = false;
231                                if (strlen($spipmotion_sh_vignettes)) {
232                                        $data['spipmotion_spipmotion_sh_vignettes']['chemin'] = $spipmotion_sh_vignettes;
233                                }
234                                ecrire_config('/spipmotion_metas/spipmotion_spipmotion_sh_vignettes', serialize($data['spipmotion_spipmotion_sh_vignettes']));
235                        }
236
237                        /**
238                         * On regarde si flvtool++ est installé
239                         * http://mirror.facebook.net/facebook/flvtool++/
240                         * Si oui on ajoute sa version dans les metas aussi
241                         */
242                        $flvtoolplus = exec('flvtool++', $retour_flvtoolplus, $int_flvtoolplus);
243                        if (!empty($retour_flvtoolplus)) {
244                                $info = $retour_flvtoolplus[0];
245                                preg_match('/flvtool\+\+ ([0-9a-z].*)/s', $info, $infos);
246                                $data['spipmotion_flvtoolplus']['flvtoolplus'] = true;
247                                $data['spipmotion_flvtoolplus']['version'] = $infos[1];
248                                ecrire_config('/spipmotion_metas/spipmotion_flvtoolplus', serialize($data['spipmotion_flvtoolplus']));
249                        } else {
250                                effacer_config('/spipmotion_metas/spipmotion_flvtoolplus');
251                        }
252
253                        /**
254                         * On regarde si ffprobe est installé
255                         * Si oui on dit juste qu'il est présent
256                         */
257                        $ffprobe = exec('ffprobe --version', $retour_ffprobe, $int_ffprobe);
258                        if ($int_mediainfo == 0) {
259                                $data['spipmotion_ffprobe']['ffprobe'] = true;
260                                $data['spipmotion_ffprobe']['version'] = 'present';
261                                ecrire_config('/spipmotion_metas/spipmotion_ffprobe', serialize($data['spipmotion_ffprobe']));
262                        } else {
263                                effacer_config('/spipmotion_metas/spipmotion_ffprobe');
264                        }
265
266                        /**
267                         * On regarde si mediainfo est installé
268                         * http://mediainfo.sourceforge.net/fr
269                         * Si oui on ajoute sa version dans les metas aussi
270                         */
271                        $mediainfo = exec('mediainfo --version', $retour_mediainfo, $int_mediainfo);
272                        if (!empty($retour_mediainfo)) {
273                                $info = $retour_mediainfo[1];
274                                preg_match('/MediaInfoLib - ([0-9a-z].*)/s', $info, $infos);
275                                $data['spipmotion_mediainfo']['mediainfo'] = true;
276                                $data['spipmotion_mediainfo']['version'] = $infos[1];
277                                ecrire_config('/spipmotion_metas/spipmotion_mediainfo', serialize($data['spipmotion_mediainfo']));
278                        } else {
279                                effacer_config('/spipmotion_metas/spipmotion_mediainfo');
280                        }
281
282                        $inc_meta = charger_fonction('meta', 'inc');
283                        $inc_meta('spipmotion_metas');
284                }
285        } else {
286                $data = array();
287                $data['spipmotion_spipmotion_sh'] = unserialize($GLOBALS['spipmotion_metas']['spipmotion_spipmotion_sh']);
288                $data['spipmotion_spipmotion_sh_vignettes'] = unserialize($GLOBALS['spipmotion_metas']['spipmotion_spipmotion_sh_vignettes']);
289                $data['spipmotion_compiler'] = unserialize($GLOBALS['spipmotion_metas']['spipmotion_compiler']);
290                $data['spipmotion_formats'] = unserialize($GLOBALS['spipmotion_metas']['spipmotion_formats']);
291                $data['spipmotion_codecs'] = unserialize($GLOBALS['spipmotion_metas']['spipmotion_codecs']);
292                $data['spipmotion_bitstream_filters'] = unserialize($GLOBALS['spipmotion_metas']['spipmotion_bitstream_filters']);
293                $data['spipmotion_protocols'] = unserialize($GLOBALS['spipmotion_metas']['spipmotion_protocols']);
294                $data['spipmotion_avfilters'] = unserialize($GLOBALS['spipmotion_metas']['spipmotion_avfilters']);
295                $data['spipmotion_flvtoolplus'] = unserialize($GLOBALS['spipmotion_metas']['spipmotion_flvtoolplus']);
296                $data['spipmotion_mediainfo'] = unserialize($GLOBALS['spipmotion_metas']['spipmotion_mediainfo']);
297                $data['spipmotion_ffprobe'] = unserialize($GLOBALS['spipmotion_metas']['spipmotion_ffprobe']);
298        }
299        return $data;
300}
301
302function spimotion_write($chemin_fichier, $what) {
303        $f = @fopen($chemin_fichier, 'ab');
304        if ($f) {
305                fputs($f, "$what\n");
306                fclose($f);
307        }
308}
Note: See TracBrowser for help on using the repository browser.