Changeset 51852 in spip-zone for _plugins_/getID3/getid3/write.real.php


Ignore:
Timestamp:
Sep 26, 2011, 2:33:32 PM (9 years ago)
Author:
kent1@…
Message:

Mise à jour de getid3 en 1.9.0-20110620 (nécessite PHP 5)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/getID3/getid3/write.real.php

    r22745 r51852  
    1717{
    1818        var $filename;
    19         var $tag_data     = array();
    20         var $warnings     = array(); // any non-critical errors will be stored here
    21         var $errors       = array(); // any critical errors will be stored here
    22         var $paddedlength = 512;     // minimum length of CONT tag in bytes
     19        var $tag_data          = array();
     20        var $fread_buffer_size = 32768;   // read buffer size in bytes
     21        var $warnings          = array(); // any non-critical errors will be stored here
     22        var $errors            = array(); // any critical errors will be stored here
     23        var $paddedlength      = 512;     // minimum length of CONT tag in bytes
    2324
    2425        function getid3_write_real() {
     
    2829        function WriteReal() {
    2930                // File MUST be writeable - CHMOD(646) at least
    30                 if (is_writeable($this->filename)) {
    31                         if ($fp_source = @fopen($this->filename, 'r+b')) {
    32 
    33                                 // Initialize getID3 engine
    34                                 $getID3 = new getID3;
    35                                 $OldThisFileInfo = $getID3->analyze($this->filename);
    36                                 if (empty($OldThisFileInfo['real']['chunks']) && !empty($OldThisFileInfo['real']['old_ra_header'])) {
    37                                         $this->errors[] = 'Cannot write Real tags on old-style file format';
    38                                         fclose($fp_source);
    39                                         return false;
    40                                 }
    41 
    42                                 if (empty($OldThisFileInfo['real']['chunks'])) {
    43                                         $this->errors[] = 'Cannot write Real tags because cannot find DATA chunk in file';
    44                                         fclose($fp_source);
    45                                         return false;
    46                                 }
    47                                 foreach ($OldThisFileInfo['real']['chunks'] as $chunknumber => $chunkarray) {
    48                                         $oldChunkInfo[$chunkarray['name']] = $chunkarray;
    49                                 }
    50                                 if (!empty($oldChunkInfo['CONT']['length'])) {
    51                                         $this->paddedlength = max($oldChunkInfo['CONT']['length'], $this->paddedlength);
    52                                 }
    53 
    54                                 $new_CONT_tag_data = $this->GenerateCONTchunk();
    55                                 $new_PROP_tag_data = $this->GeneratePROPchunk($OldThisFileInfo['real']['chunks'], $new_CONT_tag_data);
    56                                 $new__RMF_tag_data = $this->GenerateRMFchunk($OldThisFileInfo['real']['chunks']);
    57 
    58                                 if (@$oldChunkInfo['.RMF']['length'] == strlen($new__RMF_tag_data)) {
    59                                         fseek($fp_source, $oldChunkInfo['.RMF']['offset'], SEEK_SET);
    60                                         fwrite($fp_source, $new__RMF_tag_data);
     31                if (is_writeable($this->filename) && is_file($this->filename) && ($fp_source = fopen($this->filename, 'r+b'))) {
     32
     33                        // Initialize getID3 engine
     34                        $getID3 = new getID3;
     35                        $OldThisFileInfo = $getID3->analyze($this->filename);
     36                        if (empty($OldThisFileInfo['real']['chunks']) && !empty($OldThisFileInfo['real']['old_ra_header'])) {
     37                                $this->errors[] = 'Cannot write Real tags on old-style file format';
     38                                fclose($fp_source);
     39                                return false;
     40                        }
     41
     42                        if (empty($OldThisFileInfo['real']['chunks'])) {
     43                                $this->errors[] = 'Cannot write Real tags because cannot find DATA chunk in file';
     44                                fclose($fp_source);
     45                                return false;
     46                        }
     47                        foreach ($OldThisFileInfo['real']['chunks'] as $chunknumber => $chunkarray) {
     48                                $oldChunkInfo[$chunkarray['name']] = $chunkarray;
     49                        }
     50                        if (!empty($oldChunkInfo['CONT']['length'])) {
     51                                $this->paddedlength = max($oldChunkInfo['CONT']['length'], $this->paddedlength);
     52                        }
     53
     54                        $new_CONT_tag_data = $this->GenerateCONTchunk();
     55                        $new_PROP_tag_data = $this->GeneratePROPchunk($OldThisFileInfo['real']['chunks'], $new_CONT_tag_data);
     56                        $new__RMF_tag_data = $this->GenerateRMFchunk($OldThisFileInfo['real']['chunks']);
     57
     58                        if (isset($oldChunkInfo['.RMF']['length']) && ($oldChunkInfo['.RMF']['length'] == strlen($new__RMF_tag_data))) {
     59                                fseek($fp_source, $oldChunkInfo['.RMF']['offset'], SEEK_SET);
     60                                fwrite($fp_source, $new__RMF_tag_data);
     61                        } else {
     62                                $this->errors[] = 'new .RMF tag ('.strlen($new__RMF_tag_data).' bytes) different length than old .RMF tag ('.$oldChunkInfo['.RMF']['length'].' bytes)';
     63                                fclose($fp_source);
     64                                return false;
     65                        }
     66
     67                        if (isset($oldChunkInfo['PROP']['length']) && ($oldChunkInfo['PROP']['length'] == strlen($new_PROP_tag_data))) {
     68                                fseek($fp_source, $oldChunkInfo['PROP']['offset'], SEEK_SET);
     69                                fwrite($fp_source, $new_PROP_tag_data);
     70                        } else {
     71                                $this->errors[] = 'new PROP tag ('.strlen($new_PROP_tag_data).' bytes) different length than old PROP tag ('.$oldChunkInfo['PROP']['length'].' bytes)';
     72                                fclose($fp_source);
     73                                return false;
     74                        }
     75
     76                        if (isset($oldChunkInfo['CONT']['length']) && ($oldChunkInfo['CONT']['length'] == strlen($new_CONT_tag_data))) {
     77
     78                                // new data length is same as old data length - just overwrite
     79                                fseek($fp_source, $oldChunkInfo['CONT']['offset'], SEEK_SET);
     80                                fwrite($fp_source, $new_CONT_tag_data);
     81                                fclose($fp_source);
     82                                return true;
     83
     84                        } else {
     85
     86                                if (empty($oldChunkInfo['CONT'])) {
     87                                        // no existing CONT chunk
     88                                        $BeforeOffset = $oldChunkInfo['DATA']['offset'];
     89                                        $AfterOffset  = $oldChunkInfo['DATA']['offset'];
    6190                                } else {
    62                                         $this->errors[] = 'new .RMF tag ('.strlen($new__RMF_tag_data).' bytes) different length than old .RMF tag ('.$oldChunkInfo['.RMF']['length'].' bytes)';
    63                                         fclose($fp_source);
    64                                         return false;
    65                                 }
    66 
    67                                 if (@$oldChunkInfo['PROP']['length'] == strlen($new_PROP_tag_data)) {
    68                                         fseek($fp_source, $oldChunkInfo['PROP']['offset'], SEEK_SET);
    69                                         fwrite($fp_source, $new_PROP_tag_data);
    70                                 } else {
    71                                         $this->errors[] = 'new PROP tag ('.strlen($new_PROP_tag_data).' bytes) different length than old PROP tag ('.$oldChunkInfo['PROP']['length'].' bytes)';
    72                                         fclose($fp_source);
    73                                         return false;
    74                                 }
    75 
    76                                 if (@$oldChunkInfo['CONT']['length'] == strlen($new_CONT_tag_data)) {
    77 
    78                                         // new data length is same as old data length - just overwrite
    79                                         fseek($fp_source, $oldChunkInfo['CONT']['offset'], SEEK_SET);
    80                                         fwrite($fp_source, $new_CONT_tag_data);
    81                                         fclose($fp_source);
    82                                         return true;
    83 
    84                                 } else {
    85 
    86                                         if (empty($oldChunkInfo['CONT'])) {
    87                                                 // no existing CONT chunk
    88                                                 $BeforeOffset = $oldChunkInfo['DATA']['offset'];
    89                                                 $AfterOffset  = $oldChunkInfo['DATA']['offset'];
     91                                        // new data is longer than old data
     92                                        $BeforeOffset = $oldChunkInfo['CONT']['offset'];
     93                                        $AfterOffset  = $oldChunkInfo['CONT']['offset'] + $oldChunkInfo['CONT']['length'];
     94                                }
     95                                if ($tempfilename = tempnam(GETID3_TEMP_DIR, 'getID3')) {
     96                                        if (is_writable($tempfilename) && is_file($tempfilename) && ($fp_temp = fopen($tempfilename, 'wb'))) {
     97
     98                                                rewind($fp_source);
     99                                                fwrite($fp_temp, fread($fp_source, $BeforeOffset));
     100                                                fwrite($fp_temp, $new_CONT_tag_data);
     101                                                fseek($fp_source, $AfterOffset, SEEK_SET);
     102                                                while ($buffer = fread($fp_source, $this->fread_buffer_size)) {
     103                                                        fwrite($fp_temp, $buffer, strlen($buffer));
     104                                                }
     105                                                fclose($fp_temp);
     106
     107                                                if (copy($tempfilename, $this->filename)) {
     108                                                        unlink($tempfilename);
     109                                                        fclose($fp_source);
     110                                                        return true;
     111                                                }
     112                                                unlink($tempfilename);
     113                                                $this->errors[] = 'FAILED: copy('.$tempfilename.', '.$this->filename.')';
     114
    90115                                        } else {
    91                                                 // new data is longer than old data
    92                                                 $BeforeOffset = $oldChunkInfo['CONT']['offset'];
    93                                                 $AfterOffset  = $oldChunkInfo['CONT']['offset'] + $oldChunkInfo['CONT']['length'];
     116                                                $this->errors[] = 'Could not fopen("'.$tempfilename.'", "wb")';
    94117                                        }
    95                                         if ($tempfilename = tempnam('*', 'getID3')) {
    96                                                 ob_start();
    97                                                 if ($fp_temp = fopen($tempfilename, 'wb')) {
    98 
    99                                                         rewind($fp_source);
    100                                                         fwrite($fp_temp, fread($fp_source, $BeforeOffset));
    101                                                         fwrite($fp_temp, $new_CONT_tag_data);
    102                                                         fseek($fp_source, $AfterOffset, SEEK_SET);
    103                                                         while ($buffer = fread($fp_source, GETID3_FREAD_BUFFER_SIZE)) {
    104                                                                 fwrite($fp_temp, $buffer, strlen($buffer));
    105                                                         }
    106                                                         fclose($fp_temp);
    107 
    108                                                         if (copy($tempfilename, $this->filename)) {
    109                                                                 unlink($tempfilename);
    110                                                                 fclose($fp_source);
    111                                                                 return true;
    112                                                         }
    113                                                         unlink($tempfilename);
    114                                                         $this->errors[] = 'FAILED: copy('.$tempfilename.', '.$this->filename.') - '.strip_tags(ob_get_contents());
    115 
    116                                                 } else {
    117 
    118                                                         $this->errors[] = 'Could not open '.$tempfilename.' mode "wb" - '.strip_tags(ob_get_contents());
    119 
    120                                                 }
    121                                                 ob_end_clean();
    122                                         }
    123                                         fclose($fp_source);
    124                                         return false;
    125 
    126                                 }
    127 
    128 
    129                         } else {
    130                                 $this->errors[] = 'Could not open '.$this->filename.' mode "r+b"';
    131                                 return false;
    132                         }
    133                 }
    134                 $this->errors[] = 'File is not writeable: '.$this->filename;
     118                                }
     119                                fclose($fp_source);
     120                                return false;
     121
     122                        }
     123
     124                }
     125                $this->errors[] = 'Could not fopen("'.$this->filename.'", "r+b")';
    135126                return false;
    136127        }
     
    199190                $CONTchunk  = "\x00\x00"; // object version
    200191
    201                 $CONTchunk .= getid3_lib::BigEndian2String(strlen(@$this->tag_data['title']), 2);
    202                 $CONTchunk .= @$this->tag_data['title'];
    203 
    204                 $CONTchunk .= getid3_lib::BigEndian2String(strlen(@$this->tag_data['artist']), 2);
    205                 $CONTchunk .= @$this->tag_data['artist'];
    206 
    207                 $CONTchunk .= getid3_lib::BigEndian2String(strlen(@$this->tag_data['copyright']), 2);
    208                 $CONTchunk .= @$this->tag_data['copyright'];
    209 
    210                 $CONTchunk .= getid3_lib::BigEndian2String(strlen(@$this->tag_data['comment']), 2);
    211                 $CONTchunk .= @$this->tag_data['comment'];
     192                $CONTchunk .= getid3_lib::BigEndian2String((!empty($this->tag_data['title'])     ? strlen($this->tag_data['title'])     : 0), 2);
     193                $CONTchunk .= (!empty($this->tag_data['title'])     ? strlen($this->tag_data['title'])     : '');
     194
     195                $CONTchunk .= getid3_lib::BigEndian2String((!empty($this->tag_data['artist'])    ? strlen($this->tag_data['artist'])    : 0), 2);
     196                $CONTchunk .= (!empty($this->tag_data['artist'])    ? strlen($this->tag_data['artist'])    : '');
     197
     198                $CONTchunk .= getid3_lib::BigEndian2String((!empty($this->tag_data['copyright']) ? strlen($this->tag_data['copyright']) : 0), 2);
     199                $CONTchunk .= (!empty($this->tag_data['copyright']) ? strlen($this->tag_data['copyright']) : '');
     200
     201                $CONTchunk .= getid3_lib::BigEndian2String((!empty($this->tag_data['comment'])   ? strlen($this->tag_data['comment'])   : 0), 2);
     202                $CONTchunk .= (!empty($this->tag_data['comment'])   ? strlen($this->tag_data['comment'])   : '');
    212203
    213204                if ($this->paddedlength > (strlen($CONTchunk) + 8)) {
     
    222213        function RemoveReal() {
    223214                // File MUST be writeable - CHMOD(646) at least
    224                 if (is_writeable($this->filename)) {
    225                         if ($fp_source = @fopen($this->filename, 'r+b')) {
    226 
    227                                 // Initialize getID3 engine
    228                                 $getID3 = new getID3;
    229                                 $OldThisFileInfo = $getID3->analyze($this->filename);
    230                                 if (empty($OldThisFileInfo['real']['chunks']) && !empty($OldThisFileInfo['real']['old_ra_header'])) {
    231                                         $this->errors[] = 'Cannot remove Real tags from old-style file format';
    232                                         fclose($fp_source);
    233                                         return false;
    234                                 }
    235 
    236                                 if (empty($OldThisFileInfo['real']['chunks'])) {
    237                                         $this->errors[] = 'Cannot remove Real tags because cannot find DATA chunk in file';
    238                                         fclose($fp_source);
    239                                         return false;
    240                                 }
    241                                 foreach ($OldThisFileInfo['real']['chunks'] as $chunknumber => $chunkarray) {
    242                                         $oldChunkInfo[$chunkarray['name']] = $chunkarray;
    243                                 }
    244 
    245                                 if (empty($oldChunkInfo['CONT'])) {
    246                                         // no existing CONT chunk
    247                                         fclose($fp_source);
    248                                         return true;
    249                                 }
    250 
    251                                 $BeforeOffset = $oldChunkInfo['CONT']['offset'];
    252                                 $AfterOffset  = $oldChunkInfo['CONT']['offset'] + $oldChunkInfo['CONT']['length'];
    253                                 if ($tempfilename = tempnam('*', 'getID3')) {
    254                                         ob_start();
    255                                         if ($fp_temp = fopen($tempfilename, 'wb')) {
    256 
    257                                                 rewind($fp_source);
    258                                                 fwrite($fp_temp, fread($fp_source, $BeforeOffset));
    259                                                 fseek($fp_source, $AfterOffset, SEEK_SET);
    260                                                 while ($buffer = fread($fp_source, GETID3_FREAD_BUFFER_SIZE)) {
    261                                                         fwrite($fp_temp, $buffer, strlen($buffer));
    262                                                 }
    263                                                 fclose($fp_temp);
    264 
    265                                                 if (copy($tempfilename, $this->filename)) {
    266                                                         unlink($tempfilename);
    267                                                         fclose($fp_source);
    268                                                         return true;
    269                                                 }
     215                if (is_writeable($this->filename) && is_file($this->filename) && ($fp_source = fopen($this->filename, 'r+b')) {
     216
     217                        // Initialize getID3 engine
     218                        $getID3 = new getID3;
     219                        $OldThisFileInfo = $getID3->analyze($this->filename);
     220                        if (empty($OldThisFileInfo['real']['chunks']) && !empty($OldThisFileInfo['real']['old_ra_header'])) {
     221                                $this->errors[] = 'Cannot remove Real tags from old-style file format';
     222                                fclose($fp_source);
     223                                return false;
     224                        }
     225
     226                        if (empty($OldThisFileInfo['real']['chunks'])) {
     227                                $this->errors[] = 'Cannot remove Real tags because cannot find DATA chunk in file';
     228                                fclose($fp_source);
     229                                return false;
     230                        }
     231                        foreach ($OldThisFileInfo['real']['chunks'] as $chunknumber => $chunkarray) {
     232                                $oldChunkInfo[$chunkarray['name']] = $chunkarray;
     233                        }
     234
     235                        if (empty($oldChunkInfo['CONT'])) {
     236                                // no existing CONT chunk
     237                                fclose($fp_source);
     238                                return true;
     239                        }
     240
     241                        $BeforeOffset = $oldChunkInfo['CONT']['offset'];
     242                        $AfterOffset  = $oldChunkInfo['CONT']['offset'] + $oldChunkInfo['CONT']['length'];
     243                        if ($tempfilename = tempnam(GETID3_TEMP_DIR, 'getID3')) {
     244                                if (is_writable($tempfilename) && is_file($tempfilename) && ($fp_temp = fopen($tempfilename, 'wb'))) {
     245
     246                                        rewind($fp_source);
     247                                        fwrite($fp_temp, fread($fp_source, $BeforeOffset));
     248                                        fseek($fp_source, $AfterOffset, SEEK_SET);
     249                                        while ($buffer = fread($fp_source, $this->fread_buffer_size)) {
     250                                                fwrite($fp_temp, $buffer, strlen($buffer));
     251                                        }
     252                                        fclose($fp_temp);
     253
     254                                        if (copy($tempfilename, $this->filename)) {
    270255                                                unlink($tempfilename);
    271                                                 $this->errors[] = 'FAILED: copy('.$tempfilename.', '.$this->filename.') - '.strip_tags(ob_get_contents());
    272 
    273                                         } else {
    274 
    275                                                 $this->errors[] = 'Could not open '.$tempfilename.' mode "wb" - '.strip_tags(ob_get_contents());
    276 
     256                                                fclose($fp_source);
     257                                                return true;
    277258                                        }
    278                                         ob_end_clean();
    279                                 }
    280                                 fclose($fp_source);
    281                                 return false;
    282 
    283 
    284                         } else {
    285                                 $this->errors[] = 'Could not open '.$this->filename.' mode "r+b"';
    286                                 return false;
    287                         }
    288                 }
    289                 $this->errors[] = 'File is not writeable: '.$this->filename;
     259                                        unlink($tempfilename);
     260                                        $this->errors[] = 'FAILED: copy('.$tempfilename.', '.$this->filename.')';
     261
     262                                } else {
     263                                        $this->errors[] = 'Could not fopen("'.$tempfilename.'", "wb")';
     264                                }
     265                        }
     266                        fclose($fp_source);
     267                        return false;
     268                }
     269                $this->errors[] = 'Could not fopen("'.$this->filename.'", "r+b")';
    290270                return false;
    291271        }
Note: See TracChangeset for help on using the changeset viewer.