File indexing completed on 2024-12-22 05:33:13

0001 <?php
0002 /////////////////////////////////////////////////////////////////
0003 /// getID3() by James Heinrich <info@getid3.org>               //
0004 //  available at http://getid3.sourceforge.net                 //
0005 //            or http://www.getid3.org                         //
0006 //          also https://github.com/JamesHeinrich/getID3       //
0007 /////////////////////////////////////////////////////////////////
0008 // See readme.txt for more details                             //
0009 /////////////////////////////////////////////////////////////////
0010 //                                                             //
0011 // module.graphic.svg.php                                      //
0012 // module for analyzing SVG Image files                        //
0013 // dependencies: NONE                                          //
0014 //                                                            ///
0015 /////////////////////////////////////////////////////////////////
0016 
0017 
0018 class getid3_svg extends getid3_handler
0019 {
0020 
0021 
0022   public function Analyze() {
0023     $info = &$this->getid3->info;
0024 
0025     $this->fseek($info['avdataoffset']);
0026 
0027     $SVGheader = $this->fread(4096);
0028     if (preg_match('#\<\?xml([^\>]+)\?\>#i', $SVGheader, $matches)) {
0029       $info['svg']['xml']['raw'] = $matches;
0030     }
0031     if (preg_match('#\<\!DOCTYPE([^\>]+)\>#i', $SVGheader, $matches)) {
0032       $info['svg']['doctype']['raw'] = $matches;
0033     }
0034     if (preg_match('#\<svg([^\>]+)\>#i', $SVGheader, $matches)) {
0035       $info['svg']['svg']['raw'] = $matches;
0036     }
0037     if (isset($info['svg']['svg']['raw'])) {
0038 
0039       $sections_to_fix = array('xml', 'doctype', 'svg');
0040       foreach ($sections_to_fix as $section_to_fix) {
0041         if (!isset($info['svg'][$section_to_fix])) {
0042           continue;
0043         }
0044         $section_data = array();
0045         while (preg_match('/ "([^"]+)"/', $info['svg'][$section_to_fix]['raw'][1], $matches)) {
0046           $section_data[] = $matches[1];
0047           $info['svg'][$section_to_fix]['raw'][1] = str_replace($matches[0], '', $info['svg'][$section_to_fix]['raw'][1]);
0048         }
0049         while (preg_match('/([^\s]+)="([^"]+)"/', $info['svg'][$section_to_fix]['raw'][1], $matches)) {
0050           $section_data[] = $matches[0];
0051           $info['svg'][$section_to_fix]['raw'][1] = str_replace($matches[0], '', $info['svg'][$section_to_fix]['raw'][1]);
0052         }
0053         $section_data = array_merge($section_data, preg_split('/[\s,]+/', $info['svg'][$section_to_fix]['raw'][1]));
0054         foreach ($section_data as $keyvaluepair) {
0055           $keyvaluepair = trim($keyvaluepair);
0056           if ($keyvaluepair) {
0057             $keyvalueexploded = explode('=', $keyvaluepair);
0058             $key   = (isset($keyvalueexploded[0]) ? $keyvalueexploded[0] : '');
0059             $value = (isset($keyvalueexploded[1]) ? $keyvalueexploded[1] : '');
0060             $info['svg'][$section_to_fix]['sections'][$key] = trim($value, '"');
0061           }
0062         }
0063       }
0064 
0065       $info['fileformat']                  = 'svg';
0066       $info['video']['dataformat']         = 'svg';
0067       $info['video']['lossless']           = true;
0068       //$info['video']['bits_per_sample']    = 24;
0069       $info['video']['pixel_aspect_ratio'] = (float) 1;
0070 
0071       if (!empty($info['svg']['svg']['sections']['width'])) {
0072         $info['svg']['width']  = intval($info['svg']['svg']['sections']['width']);
0073       }
0074       if (!empty($info['svg']['svg']['sections']['height'])) {
0075         $info['svg']['height'] = intval($info['svg']['svg']['sections']['height']);
0076       }
0077       if (!empty($info['svg']['svg']['sections']['version'])) {
0078         $info['svg']['version'] = $info['svg']['svg']['sections']['version'];
0079       }
0080       if (!isset($info['svg']['version']) && isset($info['svg']['doctype']['sections'])) {
0081         foreach ($info['svg']['doctype']['sections'] as $key => $value) {
0082           if (preg_match('#//W3C//DTD SVG ([0-9\.]+)//#i', $key, $matches)) {
0083             $info['svg']['version'] = $matches[1];
0084             break;
0085           }
0086         }
0087       }
0088 
0089       if (!empty($info['svg']['width'])) {
0090         $info['video']['resolution_x'] = $info['svg']['width'];
0091       }
0092       if (!empty($info['svg']['height'])) {
0093         $info['video']['resolution_y'] = $info['svg']['height'];
0094       }
0095 
0096       return true;
0097     }
0098     $info['error'][] = 'Did not find expected <svg> tag';
0099     return false;
0100   }
0101 
0102 }