Changeset 96419 in spip-zone for _plugins_/getID3


Ignore:
Timestamp:
Apr 3, 2016, 5:50:10 PM (3 years ago)
Author:
kent1@…
Message:

La librairie en version 1.9.2

v1.9.12

Add support for Direct Stream Digital (DSD) / DSD Storage Facility (DSF) file format
Add detection (not parsing) of WebP image format
bugfix #1910: Quicktime embedded images

v1.9.11

#64 - update constructor syntax for PHP 7
#62 - infinite loop in large PNG files
#61 - ID3v2 remove BOM from frame descriptions
#60 - missing "break" in module.audio-video.quicktime.php
#59 - .gitignore comments
#58 - inconsistency in relation to module.tag.id3v2.php
#57 - comparing instead of assign
#56 - unsupported MIME type "audio/x-wave"
#55 - readme.md variable reference
#54 - QuickTime? false 1000fps
#53 - Quicktime / ID3v2 multiple genres
#52 - sys_get_temp_dir in GetDataImageSize?
demo.joinmp3.php enhancements
m4b (audiobook) chapters not parsed correctly
sqlite3 caching not working
bugfix #1903 - Quicktime meta atom not parsed

Location:
_plugins_/getID3/trunk
Files:
1 added
19 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/getID3/trunk/getid3/extension.cache.dbm.php

    r92618 r96419  
    7575
    7676        // public: constructor - see top of this file for cache type and cache_options
    77         public function getID3_cached_dbm($cache_type, $dbm_filename, $lock_filename) {
     77        public function __construct($cache_type, $dbm_filename, $lock_filename) {
    7878
    7979                // Check for dba extension
  • _plugins_/getID3/trunk/getid3/extension.cache.mysql.php

    r92618 r96419  
    8181
    8282        // public: constructor - see top of this file for cache type and cache_options
    83         public function getID3_cached_mysql($host, $database, $username, $password, $table='getid3_cache') {
     83        public function __construct($host, $database, $username, $password, $table='getid3_cache') {
    8484
    8585                // Check for mysql support
  • _plugins_/getID3/trunk/getid3/extension.cache.sqlite3.php

    r92618 r96419  
    166166                // items to track for caching
    167167                $filetime = filemtime($filename);
    168                 $filesize = filesize($filename);
     168                $filesize_real = filesize($filename);
    169169                // this will be saved for a quick directory lookup of analized files
    170170                // ... why do 50 seperate sql quries when you can do 1 for the same result
     
    174174                $sql = $this->get_id3_data;
    175175                $stmt = $db->prepare($sql);
    176                 $stmt->bindValue(':filename', $filename, SQLITE3_TEXT);
    177                 $stmt->bindValue(':filesize', $filesize, SQLITE3_INTEGER);
    178                 $stmt->bindValue(':filetime', $filetime, SQLITE3_INTEGER);
     176                $stmt->bindValue(':filename', $filename,      SQLITE3_TEXT);
     177                $stmt->bindValue(':filesize', $filesize_real, SQLITE3_INTEGER);
     178                $stmt->bindValue(':filetime', $filetime,      SQLITE3_INTEGER);
    179179                $res = $stmt->execute();
    180180                list($result) = $res->fetchArray();
     
    183183                }
    184184                // if it hasn't been analyzed before, then do it now
    185                 $analysis = parent::analyze($filename, $filesize=null, $original_filename='');
     185                $analysis = parent::analyze($filename, $filesize, $original_filename);
    186186                // Save result
    187187                $sql = $this->cache_file;
    188188                $stmt = $db->prepare($sql);
    189                 $stmt->bindValue(':filename', $filename, SQLITE3_TEXT);
    190                 $stmt->bindValue(':dirname', $dirname, SQLITE3_TEXT);
    191                 $stmt->bindValue(':filesize', $filesize, SQLITE3_INTEGER);
    192                 $stmt->bindValue(':filetime', $filetime, SQLITE3_INTEGER);
    193                 $stmt->bindValue(':atime', time(), SQLITE3_INTEGER);
    194                 $stmt->bindValue(':val', base64_encode(serialize($analysis)), SQLITE3_TEXT);
     189                $stmt->bindValue(':filename', $filename,                           SQLITE3_TEXT);
     190                $stmt->bindValue(':dirname',  $dirname,                            SQLITE3_TEXT);
     191                $stmt->bindValue(':filesize', $filesize_real,                      SQLITE3_INTEGER);
     192                $stmt->bindValue(':filetime', $filetime,                           SQLITE3_INTEGER);
     193                $stmt->bindValue(':atime',    time(),                              SQLITE3_INTEGER);
     194                $stmt->bindValue(':val',      base64_encode(serialize($analysis)), SQLITE3_TEXT);
    195195                $res = $stmt->execute();
    196196                return $analysis;
  • _plugins_/getID3/trunk/getid3/getid3.lib.php

    r92618 r96419  
    11681168                static $tempdir = '';
    11691169                if (empty($tempdir)) {
     1170                        if (function_exists('sys_get_temp_dir')) {
     1171                                $tempdir = sys_get_temp_dir(); // https://github.com/JamesHeinrich/getID3/issues/52
     1172                        }
     1173
    11701174                        // yes this is ugly, feel free to suggest a better way
    1171                         require_once(dirname(__FILE__).'/getid3.php');
    1172                         $getid3_temp = new getID3();
    1173                         $tempdir = $getid3_temp->tempdir;
    1174                         unset($getid3_temp);
     1175                        if (include_once(dirname(__FILE__).'/getid3.php')) {
     1176                                if ($getid3_temp = new getID3()) {
     1177                                        if ($getid3_temp_tempdir = $getid3_temp->tempdir) {
     1178                                                $tempdir = $getid3_temp_tempdir;
     1179                                        }
     1180                                        unset($getid3_temp, $getid3_temp_tempdir);
     1181                                }
     1182                        }
    11751183                }
    11761184                $GetDataImageSize = false;
  • _plugins_/getID3/trunk/getid3/getid3.php

    r92618 r96419  
    110110        protected $startup_warning = '';
    111111
    112         const VERSION           = '1.9.10-20150914';
     112        const VERSION           = '1.9.12-201602240818';
    113113        const FREAD_BUFFER_SIZE = 32768;
    114114
     
    635635                                                ),
    636636
     637                                // DSF  - audio       - Direct Stream Digital (DSD) Storage Facility files (DSF) - https://en.wikipedia.org/wiki/Direct_Stream_Digital
     638                                'dsf'  => array(
     639                                                        'pattern'   => '^DSD ',  // including trailing space: 44 53 44 20
     640                                                        'group'     => 'audio',
     641                                                        'module'    => 'dsf',
     642                                                        'mime_type' => 'audio/dsd',
     643                                                ),
     644
    637645                                // DSS  - audio       - Digital Speech Standard
    638646                                'dss'  => array(
     
    877885                                                        'group'     => 'audio-video',
    878886                                                        'module'    => 'riff',
    879                                                         'mime_type' => 'audio/x-wave',
     887                                                        'mime_type' => 'audio/x-wav',
    880888                                                        'fail_ape'  => 'WARNING',
    881889                                                ),
  • _plugins_/getID3/trunk/getid3/module.audio-video.quicktime.php

    r92618 r96419  
    8080                        $info['avdataend'] = $info['avdataend_tmp'];
    8181                        unset($info['avdataend_tmp']);
     82                }
     83
     84                if (!empty($info['quicktime']['comments']['chapters']) && is_array($info['quicktime']['comments']['chapters']) && (count($info['quicktime']['comments']['chapters']) > 0)) {
     85                        $durations = $this->quicktime_time_to_sample_table($info);
     86                        for ($i = 0; $i < count($info['quicktime']['comments']['chapters']); $i++) {
     87                                $bookmark = array();
     88                                $bookmark['title'] = $info['quicktime']['comments']['chapters'][$i];
     89                                if (isset($durations[$i])) {
     90                                        $bookmark['duration_sample'] = $durations[$i]['sample_duration'];
     91                                        if ($i > 0) {
     92                                                $bookmark['start_sample'] = $info['quicktime']['bookmarks'][($i - 1)]['start_sample'] + $info['quicktime']['bookmarks'][($i - 1)]['duration_sample'];
     93                                        } else {
     94                                                $bookmark['start_sample'] = 0;
     95                                        }
     96                                        if ($time_scale = $this->quicktime_bookmark_time_scale($info)) {
     97                                                $bookmark['duration_seconds'] = $bookmark['duration_sample'] / $time_scale;
     98                                                $bookmark['start_seconds']    = $bookmark['start_sample']    / $time_scale;
     99                                        }
     100                                }
     101                                $info['quicktime']['bookmarks'][] = $bookmark;
     102                        }
     103                }
     104
     105                if (isset($info['quicktime']['temp_meta_key_names'])) {
     106                        unset($info['quicktime']['temp_meta_key_names']);
     107                }
     108
     109                if (!empty($info['quicktime']['comments']['location.ISO6709'])) {
     110                        // https://en.wikipedia.org/wiki/ISO_6709
     111                        foreach ($info['quicktime']['comments']['location.ISO6709'] as $ISO6709string) {
     112                                $latitude  = false;
     113                                $longitude = false;
     114                                $altitude  = false;
     115                                if (preg_match('#^([\\+\\-])([0-9]{2}|[0-9]{4}|[0-9]{6})(\\.[0-9]+)?([\\+\\-])([0-9]{3}|[0-9]{5}|[0-9]{7})(\\.[0-9]+)?(([\\+\\-])([0-9]{3}|[0-9]{5}|[0-9]{7})(\\.[0-9]+)?)?/$#', $ISO6709string, $matches)) {
     116                                        @list($dummy, $lat_sign, $lat_deg, $lat_deg_dec, $lon_sign, $lon_deg, $lon_deg_dec, $dummy, $alt_sign, $alt_deg, $alt_deg_dec) = $matches;
     117
     118                                        if (strlen($lat_deg) == 2) {        // [+-]DD.D
     119                                                $latitude = floatval(ltrim($lat_deg, '0').$lat_deg_dec);
     120                                        } elseif (strlen($lat_deg) == 4) {  // [+-]DDMM.M
     121                                                $latitude = floatval(ltrim(substr($lat_deg, 0, 2), '0')) + floatval(ltrim(substr($lat_deg, 2, 2), '0').$lat_deg_dec / 60);
     122                                        } elseif (strlen($lat_deg) == 6) {  // [+-]DDMMSS.S
     123                                                $latitude = floatval(ltrim(substr($lat_deg, 0, 2), '0')) + floatval(ltrim(substr($lat_deg, 2, 2), '0') / 60) + floatval(ltrim(substr($lat_deg, 4, 2), '0').$lat_deg_dec / 3600);
     124                                        }
     125
     126                                        if (strlen($lon_deg) == 3) {        // [+-]DDD.D
     127                                                $longitude = floatval(ltrim($lon_deg, '0').$lon_deg_dec);
     128                                        } elseif (strlen($lon_deg) == 5) {  // [+-]DDDMM.M
     129                                                $longitude = floatval(ltrim(substr($lon_deg, 0, 2), '0')) + floatval(ltrim(substr($lon_deg, 2, 2), '0').$lon_deg_dec / 60);
     130                                        } elseif (strlen($lon_deg) == 7) {  // [+-]DDDMMSS.S
     131                                                $longitude = floatval(ltrim(substr($lon_deg, 0, 2), '0')) + floatval(ltrim(substr($lon_deg, 2, 2), '0') / 60) + floatval(ltrim(substr($lon_deg, 4, 2), '0').$lon_deg_dec / 3600);
     132                                        }
     133
     134                                        if (strlen($alt_deg) == 3) {        // [+-]DDD.D
     135                                                $altitude = floatval(ltrim($alt_deg, '0').$alt_deg_dec);
     136                                        } elseif (strlen($alt_deg) == 5) {  // [+-]DDDMM.M
     137                                                $altitude = floatval(ltrim(substr($alt_deg, 0, 2), '0')) + floatval(ltrim(substr($alt_deg, 2, 2), '0').$alt_deg_dec / 60);
     138                                        } elseif (strlen($alt_deg) == 7) {  // [+-]DDDMMSS.S
     139                                                $altitude = floatval(ltrim(substr($alt_deg, 0, 2), '0')) + floatval(ltrim(substr($alt_deg, 2, 2), '0') / 60) + floatval(ltrim(substr($alt_deg, 4, 2), '0').$alt_deg_dec / 3600);
     140                                        }
     141
     142                                        if ($latitude !== false) {
     143                                                $info['quicktime']['comments']['gps_latitude'][]  = (($lat_sign == '-') ? -1 : 1) * floatval($latitude);
     144                                        }
     145                                        if ($longitude !== false) {
     146                                                $info['quicktime']['comments']['gps_longitude'][] = (($lon_sign == '-') ? -1 : 1) * floatval($longitude);
     147                                        }
     148                                        if ($altitude !== false) {
     149                                                $info['quicktime']['comments']['gps_altitude'][]  = (($alt_sign == '-') ? -1 : 1) * floatval($altitude);
     150                                        }
     151                                }
     152                                if ($latitude === false) {
     153                                        $info['warning'][] = 'location.ISO6709 string not parsed correctly: "'.$ISO6709string.'", please submit as a bug';
     154                                }
     155                                break;
     156                        }
    82157                }
    83158
     
    423498                                                                                                        // 64-bit integer
    424499                                                                                                        $atom_structure['data'] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 8));
     500                                                                                                        break;
     501
     502                                                                                                case 'covr':
     503                                                                                                        $atom_structure['data'] = substr($boxdata, 8);
     504                                                                                                        // not a foolproof check, but better than nothing
     505                                                                                                        if (preg_match('#^\\xFF\\xD8\\xFF#', $atom_structure['data'])) {
     506                                                                                                                $atom_structure['image_mime'] = 'image/jpeg';
     507                                                                                                        } elseif (preg_match('#^\\x89\\x50\\x4E\\x47\\x0D\\x0A\\x1A\\x0A#', $atom_structure['data'])) {
     508                                                                                                                $atom_structure['image_mime'] = 'image/png';
     509                                                                                                        } elseif (preg_match('#^GIF#', $atom_structure['data'])) {
     510                                                                                                                $atom_structure['image_mime'] = 'image/gif';
     511                                                                                                        }
     512                                                                                                        break;
    425513
    426514                                                                                                case 'atID':
     
    441529                                                                                        if ($atomname == 'covr') {
    442530                                                                                                // not a foolproof check, but better than nothing
    443                                                                                                 if (preg_match('#^\xFF\xD8\xFF#', $atom_structure['data'])) {
     531                                                                                                if (preg_match('#^\\xFF\\xD8\\xFF#', $atom_structure['data'])) {
    444532                                                                                                        $atom_structure['image_mime'] = 'image/jpeg';
    445                                                                                                 } elseif (preg_match('#^\x89\x50\x4E\x47\x0D\x0A\x1A\x0A#', $atom_structure['data'])) {
     533                                                                                                } elseif (preg_match('#^\\x89\\x50\\x4E\\x47\\x0D\\x0A\\x1A\\x0A#', $atom_structure['data'])) {
    446534                                                                                                        $atom_structure['image_mime'] = 'image/png';
    447535                                                                                                } elseif (preg_match('#^GIF#', $atom_structure['data'])) {
     
    9551043                                        $atom_structure['data_references'][$i]['size']                    = getid3_lib::BigEndian2Int(substr($atom_data, $drefDataOffset, 4));
    9561044                                        $drefDataOffset += 4;
    957                                         $atom_structure['data_references'][$i]['type']                    =               substr($atom_data, $drefDataOffset, 4);
     1045                                        $atom_structure['data_references'][$i]['type']                    =                           substr($atom_data, $drefDataOffset, 4);
    9581046                                        $drefDataOffset += 4;
    9591047                                        $atom_structure['data_references'][$i]['version']                 = getid3_lib::BigEndian2Int(substr($atom_data,  $drefDataOffset, 1));
     
    9611049                                        $atom_structure['data_references'][$i]['flags_raw']               = getid3_lib::BigEndian2Int(substr($atom_data,  $drefDataOffset, 3)); // hardcoded: 0x0000
    9621050                                        $drefDataOffset += 3;
    963                                         $atom_structure['data_references'][$i]['data']                    =               substr($atom_data, $drefDataOffset, ($atom_structure['data_references'][$i]['size'] - 4 - 4 - 1 - 3));
     1051                                        $atom_structure['data_references'][$i]['data']                    =                           substr($atom_data, $drefDataOffset, ($atom_structure['data_references'][$i]['size'] - 4 - 4 - 1 - 3));
    9641052                                        $drefDataOffset += ($atom_structure['data_references'][$i]['size'] - 4 - 4 - 1 - 3);
    9651053
     
    10311119                                        return false;
    10321120                                }
    1033                                 $info['quicktime']['time_scale'] = (isset($info['quicktime']['time_scale']) ? max($info['quicktime']['time_scale'], $atom_structure['time_scale']) : $atom_structure['time_scale']);
     1121                                $info['quicktime']['time_scale'] = ((isset($info['quicktime']['time_scale']) && ($info['quicktime']['time_scale'] < 1000)) ? max($info['quicktime']['time_scale'], $atom_structure['time_scale']) : $atom_structure['time_scale']);
    10341122
    10351123                                $atom_structure['creation_time_unix']    = getid3_lib::DateMac2Unix($atom_structure['creation_time']);
     
    10461134                                $atom_structure['modification_date']      = getid3_lib::BigEndian2Int(substr($atom_data,  0, 4)); // "standard Macintosh format"
    10471135                                $atom_structure['version_number']         = getid3_lib::BigEndian2Int(substr($atom_data,  4, 2)); // hardcoded: 0x00
    1048                                 $atom_structure['atom_type']              =               substr($atom_data,  6, 4);        // usually: 'PICT'
     1136                                $atom_structure['atom_type']              =                           substr($atom_data,  6, 4);        // usually: 'PICT'
    10491137                                $atom_structure['atom_index']             = getid3_lib::BigEndian2Int(substr($atom_data, 10, 2)); // usually: 0x01
    10501138
     
    10561144                                $atom_structure['region_size']   = getid3_lib::BigEndian2Int(substr($atom_data,  0, 2)); // The Region size, Region boundary box,
    10571145                                $atom_structure['boundary_box']  = getid3_lib::BigEndian2Int(substr($atom_data,  2, 8)); // and Clipping region data fields
    1058                                 $atom_structure['clipping_data'] =               substr($atom_data, 10);           // constitute a QuickDraw region.
     1146                                $atom_structure['clipping_data'] =                           substr($atom_data, 10);           // constitute a QuickDraw region.
    10591147                                break;
    10601148
     
    11471235                                $atom_structure['creation_time_unix']        = getid3_lib::DateMac2Unix($atom_structure['creation_time']);
    11481236                                $atom_structure['modify_time_unix']          = getid3_lib::DateMac2Unix($atom_structure['modify_time']);
    1149                                 $info['quicktime']['time_scale']    = (isset($info['quicktime']['time_scale']) ? max($info['quicktime']['time_scale'], $atom_structure['time_scale']) : $atom_structure['time_scale']);
     1237                                $info['quicktime']['time_scale']    = ((isset($info['quicktime']['time_scale']) && ($info['quicktime']['time_scale'] < 1000)) ? max($info['quicktime']['time_scale'], $atom_structure['time_scale']) : $atom_structure['time_scale']);
    11501238                                $info['quicktime']['display_scale'] = $atom_structure['matrix_a'];
    11511239                                $info['playtime_seconds']           = $atom_structure['duration'] / $atom_structure['time_scale'];
     
    12671355
    12681356                                // check to see if it looks like chapter titles, in the form of unterminated strings with a leading 16-bit size field
    1269                                 while  (($chapter_string_length = getid3_lib::BigEndian2Int(substr($atom_data, $mdat_offset, 2)))
     1357                                while (($mdat_offset < (strlen($atom_data) - 8))
     1358                                        && ($chapter_string_length = getid3_lib::BigEndian2Int(substr($atom_data, $mdat_offset, 2)))
    12701359                                        && ($chapter_string_length < 1000)
    12711360                                        && ($chapter_string_length <= (strlen($atom_data) - $mdat_offset - 2))
    1272                                         && preg_match('#^[\x20-\xFF]+$#', substr($atom_data, $mdat_offset + 2, $chapter_string_length), $chapter_matches)) {
     1361                                        && preg_match('#^([\x00-\xFF]{2})([\x20-\xFF]+)$#', substr($atom_data, $mdat_offset, $chapter_string_length + 2), $chapter_matches)) {
     1362                                                list($dummy, $chapter_string_length_hex, $chapter_string) = $chapter_matches;
    12731363                                                $mdat_offset += (2 + $chapter_string_length);
    1274                                                 @$info['quicktime']['comments']['chapters'][] = $chapter_matches[0];
    1275                                 }
    1276 
     1364                                                @$info['quicktime']['comments']['chapters'][] = $chapter_string;
     1365
     1366                                                // "encd" atom specifies encoding. In theory could be anything, almost always UTF-8, but may be UTF-16 with BOM (not currently handled)
     1367                                                if (substr($atom_data, $mdat_offset, 12) == "\x00\x00\x00\x0C\x65\x6E\x63\x64\x00\x00\x01\x00") { // UTF-8
     1368                                                        $mdat_offset += 12;
     1369                                                }
     1370                                }
    12771371
    12781372
     
    14241518
    14251519                        case "\x00\x00\x00\x00":
    1426                         case 'meta': // METAdata atom
    14271520                                // some kind of metacontainer, may contain a big data dump such as:
    14281521                                // mdta keys \005 mdtacom.apple.quicktime.make (mdtacom.apple.quicktime.creationdate ,mdtacom.apple.quicktime.location.ISO6709 $mdtacom.apple.quicktime.software !mdtacom.apple.quicktime.model ilst \01D \001 \015data \001DE\010Apple 0 \002 (data \001DE\0102011-05-11T17:54:04+0200 2 \003 *data \001DE\010+52.4936+013.3897+040.247/ \01D \004 \015data \001DE\0104.3.1 \005 \018data \001DE\010iPhone 4
    14291522                                // http://www.geocities.com/xhelmboyx/quicktime/formats/qti-layout.txt
    14301523
    1431                     $atom_structure['version']   =          getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
    1432                     $atom_structure['flags_raw'] =          getid3_lib::BigEndian2Int(substr($atom_data, 1, 3));
    1433                     $atom_structure['subatoms']  = $this->QuicktimeParseContainerAtom(substr($atom_data, 4), $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms);
     1524                                $atom_structure['version']   =          getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
     1525                                $atom_structure['flags_raw'] =          getid3_lib::BigEndian2Int(substr($atom_data, 1, 3));
     1526                                $atom_structure['subatoms']  = $this->QuicktimeParseContainerAtom(substr($atom_data, 4), $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms);
    14341527                                //$atom_structure['subatoms']  = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms);
    14351528                                break;
    14361529
     1530                        case 'meta': // METAdata atom
     1531                                // https://developer.apple.com/library/mac/documentation/QuickTime/QTFF/Metadata/Metadata.html
     1532
     1533                                $atom_structure['version']   =          getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
     1534                                $atom_structure['flags_raw'] =          getid3_lib::BigEndian2Int(substr($atom_data, 1, 3));
     1535                                $atom_structure['subatoms']  = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms);
     1536                                break;
     1537
    14371538                        case 'data': // metaDATA atom
     1539                                static $metaDATAkey = 1; // real ugly, but so is the QuickTime structure that stores keys and values in different multinested locations that are hard to relate to each other
    14381540                                // seems to be 2 bytes language code (ASCII), 2 bytes unknown (set to 0x10B5 in sample I have), remainder is useful data
    14391541                                $atom_structure['language'] =                           substr($atom_data, 4 + 0, 2);
    14401542                                $atom_structure['unknown']  = getid3_lib::BigEndian2Int(substr($atom_data, 4 + 2, 2));
    14411543                                $atom_structure['data']     =                           substr($atom_data, 4 + 4);
     1544                                $atom_structure['key_name'] = @$info['quicktime']['temp_meta_key_names'][$metaDATAkey++];
     1545
     1546                                if ($atom_structure['key_name'] && $atom_structure['data']) {
     1547                                        @$info['quicktime']['comments'][str_replace('com.apple.quicktime.', '', $atom_structure['key_name'])][] = $atom_structure['data'];
     1548                                }
     1549                                break;
     1550
     1551                        case 'keys': // KEYS that may be present in the metadata atom.
     1552                                // https://developer.apple.com/library/mac/documentation/QuickTime/QTFF/Metadata/Metadata.html#//apple_ref/doc/uid/TP40000939-CH1-SW21
     1553                                // The metadata item keys atom holds a list of the metadata keys that may be present in the metadata atom.
     1554                                // This list is indexed starting with 1; 0 is a reserved index value. The metadata item keys atom is a full atom with an atom type of "keys".
     1555                                $atom_structure['version']       = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
     1556                                $atom_structure['flags_raw']     = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3));
     1557                                $atom_structure['entry_count']   = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
     1558                                $keys_atom_offset = 8;
     1559                                for ($i = 1; $i <= $atom_structure['entry_count']; $i++) {
     1560                                        $atom_structure['keys'][$i]['key_size']      = getid3_lib::BigEndian2Int(substr($atom_data, $keys_atom_offset + 0, 4));
     1561                                        $atom_structure['keys'][$i]['key_namespace'] =                           substr($atom_data, $keys_atom_offset + 4, 4);
     1562                                        $atom_structure['keys'][$i]['key_value']     =                           substr($atom_data, $keys_atom_offset + 8, $atom_structure['keys'][$i]['key_size'] - 8);
     1563                                        $keys_atom_offset += $atom_structure['keys'][$i]['key_size']; // key_size includes the 4+4 bytes for key_size and key_namespace
     1564
     1565                                        $info['quicktime']['temp_meta_key_names'][$i] = $atom_structure['keys'][$i]['key_value'];
     1566                                }
    14421567                                break;
    14431568
     
    14671592                                // terminated by a 32-bit integer set to 0. If you are writing a program
    14681593                                // to read user data atoms, you should allow for the terminating 0.
     1594                                if (strlen($atom_data) > 12) {
     1595                                        $subatomoffset += 4;
     1596                                        continue;
     1597                                }
    14691598                                return $atom_structure;
    14701599                        }
     
    17801909                if (empty($QuicktimeIODSaudioProfileNameLookup)) {
    17811910                        $QuicktimeIODSaudioProfileNameLookup = array(
    1782                             0x00 => 'ISO Reserved (0x00)',
    1783                             0x01 => 'Main Audio Profile @ Level 1',
    1784                             0x02 => 'Main Audio Profile @ Level 2',
    1785                             0x03 => 'Main Audio Profile @ Level 3',
    1786                             0x04 => 'Main Audio Profile @ Level 4',
    1787                             0x05 => 'Scalable Audio Profile @ Level 1',
    1788                             0x06 => 'Scalable Audio Profile @ Level 2',
    1789                             0x07 => 'Scalable Audio Profile @ Level 3',
    1790                             0x08 => 'Scalable Audio Profile @ Level 4',
    1791                             0x09 => 'Speech Audio Profile @ Level 1',
    1792                             0x0A => 'Speech Audio Profile @ Level 2',
    1793                             0x0B => 'Synthetic Audio Profile @ Level 1',
    1794                             0x0C => 'Synthetic Audio Profile @ Level 2',
    1795                             0x0D => 'Synthetic Audio Profile @ Level 3',
    1796                             0x0E => 'High Quality Audio Profile @ Level 1',
    1797                             0x0F => 'High Quality Audio Profile @ Level 2',
    1798                             0x10 => 'High Quality Audio Profile @ Level 3',
    1799                             0x11 => 'High Quality Audio Profile @ Level 4',
    1800                             0x12 => 'High Quality Audio Profile @ Level 5',
    1801                             0x13 => 'High Quality Audio Profile @ Level 6',
    1802                             0x14 => 'High Quality Audio Profile @ Level 7',
    1803                             0x15 => 'High Quality Audio Profile @ Level 8',
    1804                             0x16 => 'Low Delay Audio Profile @ Level 1',
    1805                             0x17 => 'Low Delay Audio Profile @ Level 2',
    1806                             0x18 => 'Low Delay Audio Profile @ Level 3',
    1807                             0x19 => 'Low Delay Audio Profile @ Level 4',
    1808                             0x1A => 'Low Delay Audio Profile @ Level 5',
    1809                             0x1B => 'Low Delay Audio Profile @ Level 6',
    1810                             0x1C => 'Low Delay Audio Profile @ Level 7',
    1811                             0x1D => 'Low Delay Audio Profile @ Level 8',
    1812                             0x1E => 'Natural Audio Profile @ Level 1',
    1813                             0x1F => 'Natural Audio Profile @ Level 2',
    1814                             0x20 => 'Natural Audio Profile @ Level 3',
    1815                             0x21 => 'Natural Audio Profile @ Level 4',
    1816                             0x22 => 'Mobile Audio Internetworking Profile @ Level 1',
    1817                             0x23 => 'Mobile Audio Internetworking Profile @ Level 2',
    1818                             0x24 => 'Mobile Audio Internetworking Profile @ Level 3',
    1819                             0x25 => 'Mobile Audio Internetworking Profile @ Level 4',
    1820                             0x26 => 'Mobile Audio Internetworking Profile @ Level 5',
    1821                             0x27 => 'Mobile Audio Internetworking Profile @ Level 6',
    1822                             0x28 => 'AAC Profile @ Level 1',
    1823                             0x29 => 'AAC Profile @ Level 2',
    1824                             0x2A => 'AAC Profile @ Level 4',
    1825                             0x2B => 'AAC Profile @ Level 5',
    1826                             0x2C => 'High Efficiency AAC Profile @ Level 2',
    1827                             0x2D => 'High Efficiency AAC Profile @ Level 3',
    1828                             0x2E => 'High Efficiency AAC Profile @ Level 4',
    1829                             0x2F => 'High Efficiency AAC Profile @ Level 5',
    1830                             0xFE => 'Not part of MPEG-4 audio profiles',
    1831                             0xFF => 'No audio capability required',
     1911                                0x00 => 'ISO Reserved (0x00)',
     1912                                0x01 => 'Main Audio Profile @ Level 1',
     1913                                0x02 => 'Main Audio Profile @ Level 2',
     1914                                0x03 => 'Main Audio Profile @ Level 3',
     1915                                0x04 => 'Main Audio Profile @ Level 4',
     1916                                0x05 => 'Scalable Audio Profile @ Level 1',
     1917                                0x06 => 'Scalable Audio Profile @ Level 2',
     1918                                0x07 => 'Scalable Audio Profile @ Level 3',
     1919                                0x08 => 'Scalable Audio Profile @ Level 4',
     1920                                0x09 => 'Speech Audio Profile @ Level 1',
     1921                                0x0A => 'Speech Audio Profile @ Level 2',
     1922                                0x0B => 'Synthetic Audio Profile @ Level 1',
     1923                                0x0C => 'Synthetic Audio Profile @ Level 2',
     1924                                0x0D => 'Synthetic Audio Profile @ Level 3',
     1925                                0x0E => 'High Quality Audio Profile @ Level 1',
     1926                                0x0F => 'High Quality Audio Profile @ Level 2',
     1927                                0x10 => 'High Quality Audio Profile @ Level 3',
     1928                                0x11 => 'High Quality Audio Profile @ Level 4',
     1929                                0x12 => 'High Quality Audio Profile @ Level 5',
     1930                                0x13 => 'High Quality Audio Profile @ Level 6',
     1931                                0x14 => 'High Quality Audio Profile @ Level 7',
     1932                                0x15 => 'High Quality Audio Profile @ Level 8',
     1933                                0x16 => 'Low Delay Audio Profile @ Level 1',
     1934                                0x17 => 'Low Delay Audio Profile @ Level 2',
     1935                                0x18 => 'Low Delay Audio Profile @ Level 3',
     1936                                0x19 => 'Low Delay Audio Profile @ Level 4',
     1937                                0x1A => 'Low Delay Audio Profile @ Level 5',
     1938                                0x1B => 'Low Delay Audio Profile @ Level 6',
     1939                                0x1C => 'Low Delay Audio Profile @ Level 7',
     1940                                0x1D => 'Low Delay Audio Profile @ Level 8',
     1941                                0x1E => 'Natural Audio Profile @ Level 1',
     1942                                0x1F => 'Natural Audio Profile @ Level 2',
     1943                                0x20 => 'Natural Audio Profile @ Level 3',
     1944                                0x21 => 'Natural Audio Profile @ Level 4',
     1945                                0x22 => 'Mobile Audio Internetworking Profile @ Level 1',
     1946                                0x23 => 'Mobile Audio Internetworking Profile @ Level 2',
     1947                                0x24 => 'Mobile Audio Internetworking Profile @ Level 3',
     1948                                0x25 => 'Mobile Audio Internetworking Profile @ Level 4',
     1949                                0x26 => 'Mobile Audio Internetworking Profile @ Level 5',
     1950                                0x27 => 'Mobile Audio Internetworking Profile @ Level 6',
     1951                                0x28 => 'AAC Profile @ Level 1',
     1952                                0x29 => 'AAC Profile @ Level 2',
     1953                                0x2A => 'AAC Profile @ Level 4',
     1954                                0x2B => 'AAC Profile @ Level 5',
     1955                                0x2C => 'High Efficiency AAC Profile @ Level 2',
     1956                                0x2D => 'High Efficiency AAC Profile @ Level 3',
     1957                                0x2E => 'High Efficiency AAC Profile @ Level 4',
     1958                                0x2F => 'High Efficiency AAC Profile @ Level 5',
     1959                                0xFE => 'Not part of MPEG-4 audio profiles',
     1960                                0xFF => 'No audio capability required',
    18321961                        );
    18331962                }
     
    22582387                                }
    22592388                        }
    2260                         $info['quicktime']['comments'][$comment_key][] = $data;
     2389                        $gooddata = array($data);
     2390                        if ($comment_key == 'genre') {
     2391                                // some other taggers separate multiple genres with semicolon, e.g. "Heavy Metal;Thrash Metal;Metal"
     2392                                $gooddata = explode(';', $data);
     2393                        }
     2394                        foreach ($gooddata as $data) {
     2395                                $info['quicktime']['comments'][$comment_key][] = $data;
     2396                        }
    22612397                }
    22622398                return true;
     
    22762412        }
    22772413
     2414
     2415        /*
     2416        // helper functions for m4b audiobook chapters
     2417        // code by Steffen Hartmann 2015-Nov-08
     2418        */
     2419        public function search_tag_by_key($info, $tag, $history, &$result) {
     2420                foreach ($info as $key => $value) {
     2421                        $key_history = $history.'/'.$key;
     2422                        if ($key === $tag) {
     2423                                $result[] = array($key_history, $info);
     2424                        } else {
     2425                                if (is_array($value)) {
     2426                                        $this->search_tag_by_key($value, $tag, $key_history, $result);
     2427                                }
     2428                        }
     2429                }
     2430        }
     2431
     2432        public function search_tag_by_pair($info, $k, $v, $history, &$result) {
     2433                foreach ($info as $key => $value) {
     2434                        $key_history = $history.'/'.$key;
     2435                        if (($key === $k) && ($value === $v)) {
     2436                                $result[] = array($key_history, $info);
     2437                        } else {
     2438                                if (is_array($value)) {
     2439                                        $this->search_tag_by_pair($value, $k, $v, $key_history, $result);
     2440                                }
     2441                        }
     2442                }
     2443        }
     2444
     2445        public function quicktime_time_to_sample_table($info) {
     2446                $res = array();
     2447                $this->search_tag_by_pair($info['quicktime']['moov'], 'name', 'stbl', 'quicktime/moov', $res);
     2448                foreach ($res as $value) {
     2449                        $stbl_res = array();
     2450                        $this->search_tag_by_pair($value[1], 'data_format', 'text', $value[0], $stbl_res);
     2451                        if (count($stbl_res) > 0) {
     2452                                $stts_res = array();
     2453                                $this->search_tag_by_key($value[1], 'time_to_sample_table', $value[0], $stts_res);
     2454                                if (count($stts_res) > 0) {
     2455                                        return $stts_res[0][1]['time_to_sample_table'];
     2456                                }
     2457                        }
     2458                }
     2459                return array();
     2460        }
     2461
     2462        function quicktime_bookmark_time_scale($info) {
     2463                $time_scale = '';
     2464                $ts_prefix_len = 0;
     2465                $res = array();
     2466                $this->search_tag_by_pair($info['quicktime']['moov'], 'name', 'stbl', 'quicktime/moov', $res);
     2467                foreach ($res as $value) {
     2468                        $stbl_res = array();
     2469                        $this->search_tag_by_pair($value[1], 'data_format', 'text', $value[0], $stbl_res);
     2470                        if (count($stbl_res) > 0) {
     2471                                $ts_res = array();
     2472                                $this->search_tag_by_key($info['quicktime']['moov'], 'time_scale', 'quicktime/moov', $ts_res);
     2473                                foreach ($ts_res as $value) {
     2474                                        $prefix = substr($value[0], 0, -12);
     2475                                        if ((substr($stbl_res[0][0], 0, strlen($prefix)) === $prefix) && ($ts_prefix_len < strlen($prefix))) {
     2476                                                $time_scale = $value[1]['time_scale'];
     2477                                                $ts_prefix_len = strlen($prefix);
     2478                                        }
     2479                                }
     2480                        }
     2481                }
     2482                return $time_scale;
     2483        }
     2484        /*
     2485        // END helper functions for m4b audiobook chapters
     2486        */
     2487
     2488
    22782489}
  • _plugins_/getID3/trunk/getid3/module.audio-video.riff.php

    r92618 r96419  
    11711171                                break;
    11721172
     1173                        case 'WEBP':
     1174                                // https://developers.google.com/speed/webp/docs/riff_container
     1175                                $info['fileformat'] = 'webp';
     1176                                $info['mime_type']  = 'image/webp';
     1177
     1178$info['error'][] = 'WebP image parsing not supported in this version of getID3()';
     1179                                break;
    11731180
    11741181                        default:
    1175                                 $info['error'][] = 'Unknown RIFF type: expecting one of (WAVE|RMP3|AVI |CDDA|AIFF|AIFC|8SVX|CDXA), found "'.$RIFFsubtype.'" instead';
     1182                                $info['error'][] = 'Unknown RIFF type: expecting one of (WAVE|RMP3|AVI |CDDA|AIFF|AIFC|8SVX|CDXA|WEBP), found "'.$RIFFsubtype.'" instead';
    11761183                                //unset($info['fileformat']);
    11771184                }
  • _plugins_/getID3/trunk/getid3/module.graphic.png.php

    r92618 r96419  
    1818class getid3_png extends getid3_handler
    1919{
     20        public $max_data_bytes = 10000000; // if data chunk is larger than this do not read it completely (getID3 only needs the first few dozen bytes for parsing)
    2021
    2122        public function Analyze() {
     23
    2224                $info = &$this->getid3->info;
    2325
     
    4547                while ((($this->ftell() - (strlen($PNGfiledata) - $offset)) < $info['filesize'])) {
    4648                        $chunk['data_length'] = getid3_lib::BigEndian2Int(substr($PNGfiledata, $offset, 4));
     49                        if ($chunk['data_length'] === false) {
     50                                $info['error'][] = 'Failed to read data_length at offset '.$offset;
     51                                return false;
     52                        }
    4753                        $offset += 4;
     54                        $truncated_data = false;
    4855                        while (((strlen($PNGfiledata) - $offset) < ($chunk['data_length'] + 4)) && ($this->ftell() < $info['filesize'])) {
    49                                 $PNGfiledata .= $this->fread($this->getid3->fread_buffer_size());
     56                                if (strlen($PNGfiledata) < $this->max_data_bytes) {
     57                                        $PNGfiledata .= $this->fread($this->getid3->fread_buffer_size());
     58                                } else {
     59                                        $info['warning'][] = 'At offset '.$offset.' chunk "'.substr($PNGfiledata, $offset, 4).'" exceeded max_data_bytes value of '.$this->max_data_bytes.', data chunk will be truncated at '.(strlen($PNGfiledata) - 8).' bytes';
     60                                        break;
     61                                }
    5062                        }
    51                         $chunk['type_text']   =               substr($PNGfiledata, $offset, 4);
     63                        $chunk['type_text']   =                           substr($PNGfiledata, $offset, 4);
    5264                        $offset += 4;
    5365                        $chunk['type_raw']    = getid3_lib::BigEndian2Int($chunk['type_text']);
    54                         $chunk['data']        =               substr($PNGfiledata, $offset, $chunk['data_length']);
     66                        $chunk['data']        =                           substr($PNGfiledata, $offset, $chunk['data_length']);
    5567                        $offset += $chunk['data_length'];
    5668                        $chunk['crc']         = getid3_lib::BigEndian2Int(substr($PNGfiledata, $offset, 4));
     
    163175                                case 'iCCP': // Embedded ICC Profile
    164176                                        $thisfile_png_chunk_type_text['header']                  = $chunk;
    165                                         list($profilename, $compressiondata)                                 = explode("\x00", $chunk['data'], 2);
     177                                        list($profilename, $compressiondata)                     = explode("\x00", $chunk['data'], 2);
    166178                                        $thisfile_png_chunk_type_text['profile_name']            = $profilename;
    167179                                        $thisfile_png_chunk_type_text['compression_method']      = getid3_lib::BigEndian2Int(substr($compressiondata, 0, 1));
     
    174186                                case 'tEXt': // Textual Data
    175187                                        $thisfile_png_chunk_type_text['header']  = $chunk;
    176                                         list($keyword, $text)                                = explode("\x00", $chunk['data'], 2);
     188                                        list($keyword, $text) = explode("\x00", $chunk['data'], 2);
    177189                                        $thisfile_png_chunk_type_text['keyword'] = $keyword;
    178190                                        $thisfile_png_chunk_type_text['text']    = $text;
     
    184196                                case 'zTXt': // Compressed Textual Data
    185197                                        $thisfile_png_chunk_type_text['header']                  = $chunk;
    186                                         list($keyword, $otherdata)                                           = explode("\x00", $chunk['data'], 2);
     198                                        list($keyword, $otherdata)                               = explode("\x00", $chunk['data'], 2);
    187199                                        $thisfile_png_chunk_type_text['keyword']                 = $keyword;
    188200                                        $thisfile_png_chunk_type_text['compression_method']      = getid3_lib::BigEndian2Int(substr($otherdata, 0, 1));
     
    207219                                case 'iTXt': // International Textual Data
    208220                                        $thisfile_png_chunk_type_text['header']                  = $chunk;
    209                                         list($keyword, $otherdata)                                           = explode("\x00", $chunk['data'], 2);
     221                                        list($keyword, $otherdata)                               = explode("\x00", $chunk['data'], 2);
    210222                                        $thisfile_png_chunk_type_text['keyword']                 = $keyword;
    211223                                        $thisfile_png_chunk_type_text['compression']             = (bool) getid3_lib::BigEndian2Int(substr($otherdata, 0, 1));
     
    308320                                case 'sPLT': // Suggested Palette
    309321                                        $thisfile_png_chunk_type_text['header']                           = $chunk;
    310                                         list($palettename, $otherdata)                                                = explode("\x00", $chunk['data'], 2);
     322                                        list($palettename, $otherdata)                                    = explode("\x00", $chunk['data'], 2);
    311323                                        $thisfile_png_chunk_type_text['palette_name']                     = $palettename;
    312324                                        $sPLToffset = 0;
  • _plugins_/getID3/trunk/getid3/module.tag.id3v2.php

    r92618 r96419  
    515515                $genrestring = str_replace('Rock'."\x00".'Rock', 'Folk/Rock', $genrestring);
    516516
     517                // some other taggers separate multiple genres with semicolon, e.g. "Heavy Metal;Thrash Metal;Metal"
     518                $genrestring = str_replace(';', "\x00", $genrestring);
     519
    517520                $genre_elements = explode("\x00", $genrestring);
    518521                foreach ($genre_elements as $element) {
     
    647650                        }
    648651                        $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    649                         if (ord($frame_description) === 0) {
     652                        if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
     653                                // if description only contains a BOM or terminator then make it blank
    650654                                $frame_description = '';
    651655                        }
     
    740744                        }
    741745                        $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    742 
    743                         if (ord($frame_description) === 0) {
     746                        if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
     747                                // if description only contains a BOM or terminator then make it blank
    744748                                $frame_description = '';
    745749                        }
     
    983987                        }
    984988                        $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    985                         if (ord($frame_description) === 0) {
     989                        if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
     990                                // if description only contains a BOM or terminator then make it blank
    986991                                $frame_description = '';
    987992                        }
     
    10901095                                }
    10911096                                $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    1092                                 if (ord($frame_description) === 0) {
     1097                                if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
     1098                                        // if description only contains a BOM or terminator then make it blank
    10931099                                        $frame_description = '';
    10941100                                }
     
    13941400                                }
    13951401                                $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    1396                                 if (ord($frame_description) === 0) {
     1402                                if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
     1403                                        // if description only contains a BOM or terminator then make it blank
    13971404                                        $frame_description = '';
    13981405                                }
     
    15191526                        }
    15201527                        $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    1521                         if (ord($frame_description) === 0) {
     1528                        if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
     1529                                // if description only contains a BOM or terminator then make it blank
    15221530                                $frame_description = '';
    15231531                        }
     
    16011609                        $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
    16021610                        $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    1603                         if (ord($frame_description) === 0) {
     1611                        if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
     1612                                // if description only contains a BOM or terminator then make it blank
    16041613                                $frame_description = '';
    16051614                        }
     
    16261635                        $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    16271636                        if (ord($frame_ownerid) === 0) {
    1628                                 $frame_ownerid == '';
     1637                                $frame_ownerid = '';
    16291638                        }
    16301639                        $frame_offset = $frame_terminatorpos + strlen("\x00");
     
    18011810                        }
    18021811                        $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    1803                         if (ord($frame_description) === 0) {
     1812                        if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
     1813                                // if description only contains a BOM or terminator then make it blank
    18041814                                $frame_description = '';
    18051815                        }
  • _plugins_/getID3/trunk/getid3/module.tag.xmp.php

    r92618 r96419  
    400400        * @param string - Name of the image file to access and extract XMP information from.
    401401        */
    402         public function Image_XMP($sFilename)
     402        public function __construct($sFilename)
    403403        {
    404404                $this->_sFilename = $sFilename;
  • _plugins_/getID3/trunk/getid3/write.apetag.php

    r92618 r96419  
    2727        public $errors                     = array(); // any critical errors will be stored here
    2828
    29         public function getid3_write_apetag() {
     29        public function __construct() {
    3030                return true;
    3131        }
  • _plugins_/getID3/trunk/getid3/write.id3v1.php

    r92618 r96419  
    2525        public $errors   = array(); // any critical errors will be stored here
    2626
    27         public function getid3_write_id3v1() {
     27        public function __construct() {
    2828                return true;
    2929        }
  • _plugins_/getID3/trunk/getid3/write.id3v2.php

    r92618 r96419  
    3131        public $errors                      = array();  // any critical errors will be stored here
    3232
    33         public function getid3_write_id3v2() {
     33        public function __construct() {
    3434                return true;
    3535        }
     
    17601760
    17611761        public function ID3v2IsValidTextEncoding($textencodingbyte) {
     1762                // 0 = ISO-8859-1
     1763                // 1 = UTF-16 with BOM
     1764                // 2 = UTF-16BE without BOM
     1765                // 3 = UTF-8
    17621766                static $ID3v2IsValidTextEncoding_cache = array(
    1763                         2 => array(true, true),
    1764                         3 => array(true, true),
    1765                         4 => array(true, true, true, true));
     1767                        2 => array(true, true),              // ID3v2.2 - allow 0=ISO-8859-1, 1=UTF-16
     1768                        3 => array(true, true),              // ID3v2.3 - allow 0=ISO-8859-1, 1=UTF-16
     1769                        4 => array(true, true, true, true),  // ID3v2.4 - allow 0=ISO-8859-1, 1=UTF-16, 2=UTF-16BE, 3=UTF-8
     1770                );
    17661771                return isset($ID3v2IsValidTextEncoding_cache[$this->majorversion][$textencodingbyte]);
    17671772        }
     
    19071912                        $ID3v2ShortFrameNameLookup[2]['album']                                            = 'TAL';
    19081913                        $ID3v2ShortFrameNameLookup[2]['beats_per_minute']                                 = 'TBP';
     1914                        $ID3v2ShortFrameNameLookup[2]['bpm']                                              = 'TBP';
    19091915                        $ID3v2ShortFrameNameLookup[2]['composer']                                         = 'TCM';
    19101916                        $ID3v2ShortFrameNameLookup[2]['genre']                                            = 'TCO';
     
    19671973                        $ID3v2ShortFrameNameLookup[3]['album']                                            = 'TALB';
    19681974                        $ID3v2ShortFrameNameLookup[3]['beats_per_minute']                                 = 'TBPM';
     1975                        $ID3v2ShortFrameNameLookup[3]['bpm']                                              = 'TBPM';
    19691976                        $ID3v2ShortFrameNameLookup[3]['itunescompilation']                                = 'TCMP';
    19701977                        $ID3v2ShortFrameNameLookup[3]['composer']                                         = 'TCOM';
  • _plugins_/getID3/trunk/getid3/write.lyrics3.php

    r92618 r96419  
    2424        public $errors          = array(); // any critical errors will be stored here
    2525
    26         public function getid3_write_lyrics3() {
     26        public function __construct() {
    2727                return true;
    2828        }
  • _plugins_/getID3/trunk/getid3/write.metaflac.php

    r92618 r96419  
    2424        public $errors   = array(); // any critical errors will be stored here
    2525
    26         public function getid3_write_metaflac() {
     26        public function __construct() {
    2727                return true;
    2828        }
  • _plugins_/getID3/trunk/getid3/write.php

    r92618 r96419  
    6565        private $ThisFileInfo; // analysis of file before writing
    6666
    67         public function getid3_writetags() {
     67        public function __construct() {
    6868                return true;
    6969        }
  • _plugins_/getID3/trunk/getid3/write.real.php

    r92618 r96419  
    2424        public $paddedlength      = 512;     // minimum length of CONT tag in bytes
    2525
    26         public function getid3_write_real() {
     26        public function __construct() {
    2727                return true;
    2828        }
  • _plugins_/getID3/trunk/getid3/write.vorbiscomment.php

    r92618 r96419  
    2424        public $errors   = array(); // any critical errors will be stored here
    2525
    26         public function getid3_write_vorbiscomment() {
     26        public function __construct() {
    2727                return true;
    2828        }
  • _plugins_/getID3/trunk/paquet.xml

    r92618 r96419  
    22        prefix="getid3"
    33        categorie="multimedia"
    4         version="1.3.8"
     4        version="1.4.0"
    55        etat="stable"
    66        compatibilite="[3.0.2;3.1.*]"
     
    1717        <auteur lien="http://www.kent1.info" mail="kent1@arscenic.info">kent1</auteur>
    1818       
    19         <copyright>2008-2015</copyright>
     19        <copyright>2008-2016</copyright>
    2020
    2121        <licence lien="http://www.gnu.org/licenses/gpl-3.0.html">GPL 3</licence>
Note: See TracChangeset for help on using the changeset viewer.