summaryrefslogtreecommitdiffstats
path: root/modules/id3
diff options
context:
space:
mode:
authorKarl 'vollmerk' Vollmer <vollmer@ampache.org>2006-10-19 04:26:11 +0000
committerKarl 'vollmerk' Vollmer <vollmer@ampache.org>2006-10-19 04:26:11 +0000
commitd45a743f64419e590a59cb1589abde773505c7d7 (patch)
treedfd10d245bcf7afc6a180a6203c9cf1ca44e3675 /modules/id3
parent1c1ad6ef87a034ee6491844b1650cd6aa0cb3093 (diff)
downloadampache-d45a743f64419e590a59cb1589abde773505c7d7.tar.gz
ampache-d45a743f64419e590a59cb1589abde773505c7d7.tar.bz2
ampache-d45a743f64419e590a59cb1589abde773505c7d7.zip
improved quarantine a little more and updated to new getid3 some genre issues still unresolved
Diffstat (limited to 'modules/id3')
-rw-r--r--modules/id3/getid3/getid3.lib.php27
-rw-r--r--modules/id3/getid3/getid3.php164
-rw-r--r--modules/id3/getid3/helperapps/readme.txt55
-rw-r--r--modules/id3/getid3/module.archive.gzip.php7
-rw-r--r--modules/id3/getid3/module.archive.tar.php42
-rw-r--r--modules/id3/getid3/module.archive.zip.php2
-rw-r--r--modules/id3/getid3/module.audio-video.asf.php2
-rw-r--r--modules/id3/getid3/module.audio-video.flv.php106
-rw-r--r--modules/id3/getid3/module.audio-video.quicktime.php2
-rw-r--r--modules/id3/getid3/module.audio-video.riff.php8
-rw-r--r--modules/id3/getid3/module.audio.aac.php2
-rw-r--r--modules/id3/getid3/module.audio.flac.php4
-rw-r--r--modules/id3/getid3/module.audio.mp3.php94
-rw-r--r--modules/id3/getid3/module.audio.shorten.php3
-rw-r--r--modules/id3/getid3/module.misc.iso.php4
-rw-r--r--modules/id3/getid3/module.tag.id3v2.php256
-rw-r--r--modules/id3/getid3/write.php3
-rwxr-xr-xmodules/id3/vainfo.class.php23
18 files changed, 492 insertions, 312 deletions
diff --git a/modules/id3/getid3/getid3.lib.php b/modules/id3/getid3/getid3.lib.php
index 46bcc84c..b5146b7e 100644
--- a/modules/id3/getid3/getid3.lib.php
+++ b/modules/id3/getid3/getid3.lib.php
@@ -524,7 +524,7 @@ class getid3_lib
die(implode(' and ', $RequiredFiles).' are required in '.GETID3_HELPERAPPSDIR.' for getid3_lib::md5_file() to function under Windows in PHP < v4.2.0');
}
}
- $commandline = GETID3_HELPERAPPSDIR.'md5sum.exe "'.str_replace('/', GETID3_OS_DIRSLASH, $file).'"';
+ $commandline = GETID3_HELPERAPPSDIR.'md5sum.exe "'.str_replace('/', DIRECTORY_SEPARATOR, $file).'"';
if (ereg("^[\\]?([0-9a-f]{32})", strtolower(`$commandline`), $r)) {
return $r[1];
}
@@ -559,14 +559,14 @@ class getid3_lib
die(implode(' and ', $RequiredFiles).' are required in '.GETID3_HELPERAPPSDIR.' for getid3_lib::sha1_file() to function under Windows in PHP < v4.3.0');
}
}
- $commandline = GETID3_HELPERAPPSDIR.'sha1sum.exe "'.str_replace('/', GETID3_OS_DIRSLASH, $file).'"';
+ $commandline = GETID3_HELPERAPPSDIR.'sha1sum.exe "'.str_replace('/', DIRECTORY_SEPARATOR, $file).'"';
if (ereg("^sha1=([0-9a-f]{40})", strtolower(`$commandline`), $r)) {
return $r[1];
}
} else {
- $commandline = 'sha1sum "'.$file.'"';
+ $commandline = 'sha1sum '.escapeshellarg($file).'';
if (ereg("^([0-9a-f]{40})[ \t\n\r]", strtolower(`$commandline`), $r)) {
return $r[1];
}
@@ -617,14 +617,14 @@ class getid3_lib
break;
}
}
- $commandline = GETID3_HELPERAPPSDIR.'head.exe -c '.$end.' "'.str_replace('/', GETID3_OS_DIRSLASH, $file).'" | ';
+ $commandline = GETID3_HELPERAPPSDIR.'head.exe -c '.$end.' "'.escapeshellarg(str_replace('/', DIRECTORY_SEPARATOR, $file)).'" | ';
$commandline .= GETID3_HELPERAPPSDIR.'tail.exe -c '.$size.' | ';
$commandline .= GETID3_HELPERAPPSDIR.$windows_call;
} else {
- $commandline = 'head -c '.$end.' "'.$file.'" | ';
- $commandline .= 'tail -c '.$size.' | ';
+ $commandline = 'head -c'.$end.' '.escapeshellarg($file).' | ';
+ $commandline .= 'tail -c'.$size.' | ';
$commandline .= $unix_call;
}
@@ -1170,7 +1170,7 @@ class getid3_lib
function GetDataImageSize($imgData) {
$GetDataImageSize = false;
if ($tempfilename = tempnam('*', 'getID3')) {
- if ($tmp = @fopen($tempfilename, 'rb')) {
+ if ($tmp = @fopen($tempfilename, 'wb')) {
fwrite($tmp, $imgData);
fclose($tmp);
$GetDataImageSize = @GetImageSize($tempfilename);
@@ -1202,7 +1202,8 @@ class getid3_lib
}
function CopyTagsToComments(&$ThisFileInfo) {
- // Copy all entries from ['tags'] into common ['comments'] and ['comments_html']
+
+ // Copy all entries from ['tags'] into common ['comments']
if (!empty($ThisFileInfo['tags'])) {
foreach ($ThisFileInfo['tags'] as $tagtype => $tagarray) {
foreach ($tagarray as $tagname => $tagdata) {
@@ -1237,14 +1238,18 @@ class getid3_lib
}
if (empty($ThisFileInfo['comments'][$tagname]) || !in_array(trim($value), $ThisFileInfo['comments'][$tagname])) {
$ThisFileInfo['comments'][$tagname][] = trim($value);
- if (isset($ThisFileInfo['tags_html'][$tagtype][$tagname][$key])) {
- $ThisFileInfo['comments_html'][$tagname][] = $ThisFileInfo['tags_html'][$tagtype][$tagname][$key];
- }
}
}
}
}
}
+
+ // Copy to ['comments_html']
+ foreach ($ThisFileInfo['comments'] as $field => $values) {
+ foreach ($values as $index => $value) {
+ $ThisFileInfo['comments_html'][$field][$index] = str_replace('&#0;', '', getid3_lib::MultiByteCharString2HTML($value, $ThisFileInfo['encoding']));
+ }
+ }
}
}
diff --git a/modules/id3/getid3/getid3.php b/modules/id3/getid3/getid3.php
index d0a8d479..c949cacc 100644
--- a/modules/id3/getid3/getid3.php
+++ b/modules/id3/getid3/getid3.php
@@ -10,7 +10,7 @@
/////////////////////////////////////////////////////////////////
// Defines
-define('GETID3_VERSION', '1.7.5-200512251515');
+define('GETID3_VERSION', '1.7.7');
define('GETID3_FREAD_BUFFER_SIZE', 16384); // read buffer size in bytes
@@ -18,28 +18,29 @@ define('GETID3_FREAD_BUFFER_SIZE', 16384); // read buffer size in bytes
class getID3
{
// public: Settings
- var $encoding = 'ISO-8859-1'; // CASE SENSITIVE! - i.e. (must be supported by iconv())
- // Examples: ISO-8859-1 UTF-8 UTF-16 UTF-16BE
+ var $encoding = 'ISO-8859-1'; // CASE SENSITIVE! - i.e. (must be supported by iconv())
+ // Examples: ISO-8859-1 UTF-8 UTF-16 UTF-16BE
- var $encoding_id3v1 = 'ISO-8859-1'; // Should always be 'ISO-8859-1', but some tags may be written
- // in other encodings such as 'EUC-CN'
+ var $encoding_id3v1 = 'ISO-8859-1'; // Should always be 'ISO-8859-1', but some tags may be written in other encodings such as 'EUC-CN'
+
+ var $tempdir = '*'; // default '*' should use system temp dir
// public: Optional tag checks - disable for speed.
- var $option_tag_id3v1 = true; // Read and process ID3v1 tags
- var $option_tag_id3v2 = true; // Read and process ID3v2 tags
- var $option_tag_lyrics3 = true; // Read and process Lyrics3 tags
- var $option_tag_apetag = true; // Read and process APE tags
- var $option_tags_process = true; // Copy tags to root key 'tags' and encode to $this->encoding
- var $option_tags_html = true; // Copy tags to root key 'tags_html' properly translated from various encodings to HTML entities
+ var $option_tag_id3v1 = true; // Read and process ID3v1 tags
+ var $option_tag_id3v2 = true; // Read and process ID3v2 tags
+ var $option_tag_lyrics3 = true; // Read and process Lyrics3 tags
+ var $option_tag_apetag = true; // Read and process APE tags
+ var $option_tags_process = true; // Copy tags to root key 'tags' and encode to $this->encoding
+ var $option_tags_html = true; // Copy tags to root key 'tags_html' properly translated from various encodings to HTML entities
// public: Optional tag/comment calucations
- var $option_extra_info = true; // Calculate additional info such as bitrate, channelmode etc
+ var $option_extra_info = true; // Calculate additional info such as bitrate, channelmode etc
// public: Optional calculations
- var $option_md5_data = false; // Get MD5 sum of data part - slow
- var $option_md5_data_source = false; // Use MD5 of source file if availble - only FLAC and OptimFROG
- var $option_sha1_data = false; // Get SHA1 sum of data part - slow
- var $option_max_2gb_check = true; // Check whether file is larger than 2 Gb and thus not supported by PHP
+ var $option_md5_data = false; // Get MD5 sum of data part - slow
+ var $option_md5_data_source = false; // Use MD5 of source file if availble - only FLAC and OptimFROG
+ var $option_sha1_data = false; // Get SHA1 sum of data part - slow
+ var $option_max_2gb_check = true; // Check whether file is larger than 2 Gb and thus not supported by PHP
// private
var $filename;
@@ -88,11 +89,9 @@ class getID3
// Get base path of getID3() - ONCE
if (!defined('GETID3_INCLUDEPATH')) {
- define('GETID3_OS_DIRSLASH', (GETID3_OS_ISWINDOWS ? '\\' : '/'));
-
foreach (get_included_files() as $key => $val) {
if (basename($val) == 'getid3.php') {
- define('GETID3_INCLUDEPATH', dirname($val).GETID3_OS_DIRSLASH);
+ define('GETID3_INCLUDEPATH', dirname($val).DIRECTORY_SEPARATOR);
break;
}
}
@@ -111,7 +110,7 @@ class getID3
// ie for "C:/Program Files/Apache/" put "C:/PROGRA~1/APACHE/"
// IMPORTANT: This path must include the trailing slash
if (GETID3_OS_ISWINDOWS && !defined('GETID3_HELPERAPPSDIR')) {
- $helperappsdir = GETID3_INCLUDEPATH.'..'.GETID3_OS_DIRSLASH.'helperapps'; // must not have any space in this path
+ $helperappsdir = GETID3_INCLUDEPATH.'..'.DIRECTORY_SEPARATOR.'helperapps'; // must not have any space in this path
if (!is_dir($helperappsdir)) {
@@ -119,37 +118,51 @@ class getID3
} elseif (strpos(realpath($helperappsdir), ' ') !== false) {
- $DirPieces = explode(GETID3_OS_DIRSLASH, realpath($helperappsdir));
- $DirPieces8 = $DirPieces;
-
- $CLIdir = $DirPieces[0].' && cd \\';
- for ($i = 1; $i < count($DirPieces); $i++) {
- if (strpos($DirPieces[$i], ' ') === false) {
- $CLIdir .= ' && cd '.$DirPieces[$i];
- } else {
- ob_start();
- system($CLIdir.' && dir /ad /x');
- $subdirsraw = explode("\n", ob_get_contents());
- ob_end_clean();
- foreach ($subdirsraw as $line) {
- if (eregi('^[0-9]{4}/[0-9]{2}/[0-9]{2} [0-9]{2}:[0-9]{2} [AP]M <DIR> ([^ ]{8}) '.preg_quote($DirPieces[$i]).'$', trim($line), $matches)) {
- $CLIdir .= ' && cd '.$matches[1];
- break;
- }
- }
- $DirPieces8[$i] = $matches[1];
- }
- }
- $helperappsdir = implode(GETID3_OS_DIRSLASH, $DirPieces8);
+ $DirPieces = explode(DIRECTORY_SEPARATOR, realpath($helperappsdir));
+ $DirPieces8 = $DirPieces;
+
+ $CLIdir = $DirPieces[0].' && cd \\';
+ for ($i = 1; $i < count($DirPieces); $i++) {
+ if (strpos($DirPieces[$i], ' ') === false) {
+ $CLIdir .= ' && cd '.$DirPieces[$i];
+ } else {
+ ob_start();
+ system($CLIdir.' && dir /ad /x');
+ $subdirsraw = explode("\n", ob_get_contents());
+ ob_end_clean();
+ foreach ($subdirsraw as $dummy => $line) {
+ if (eregi('^[0-9]{4}/[0-9]{2}/[0-9]{2} [0-9]{2}:[0-9]{2} [AP]M <DIR> ([^ ]{8}) '.preg_quote($DirPieces[$i]).'$', trim($line), $matches)) {
+ $CLIdir .= ' && cd '.$matches[1];
+ break;
+ }
+ }
+ $DirPieces8[$i] = $matches[1];
+ }
+ }
+ $helperappsdir = implode(DIRECTORY_SEPARATOR, $DirPieces8);
}
- define('GETID3_HELPERAPPSDIR', realpath($helperappsdir).GETID3_OS_DIRSLASH);
+ define('GETID3_HELPERAPPSDIR', realpath($helperappsdir).DIRECTORY_SEPARATOR);
}
}
+ // public: setOption
+ function setOption($optArray) {
+ if (!is_array($optArray) || empty($optArray)) {
+ return false;
+ }
+ foreach ($optArray as $opt => $val) {
+ if (isset($this, $opt) === false) {
+ continue;
+ }
+ $this->$opt = $val;
+ }
+ return true;
+ }
+
// public: analyze file - replaces GetAllFileInfo() and GetTagOnly()
function analyze($filename) {
@@ -406,7 +419,7 @@ class getID3
// remove possible empty keys
$AVpossibleEmptyKeys = array('dataformat', 'bits_per_sample', 'encoder_options', 'streams');
- foreach ($AVpossibleEmptyKeys as $key) {
+ foreach ($AVpossibleEmptyKeys as $dummy => $key) {
if (empty($this->info['audio'][$key]) && isset($this->info['audio'][$key])) {
unset($this->info['audio'][$key]);
}
@@ -669,12 +682,12 @@ class getID3
),
// FLV - audio/video - FLash Video
- 'flv' => array(
- 'pattern' => '^FLV\x01',
- 'group' => 'audio-video',
- 'module' => 'flv',
- 'mime_type' => 'video/x-flv',
- ),
+ 'flv' => array(
+ 'pattern' => '^FLV\x01',
+ 'group' => 'audio-video',
+ 'module' => 'flv',
+ 'mime_type' => 'video/x-flv',
+ ),
// MKAV - audio/video - Mastroka
'matroska' => array(
@@ -832,7 +845,7 @@ class getID3
'fail_ape' => 'ERROR',
),
- // SZIP - audio - SZIP compressed data
+ // SZIP - audio/data - SZIP compressed data
'szip' => array(
'pattern' => '^SZ\x0A\x04',
'group' => 'archive',
@@ -862,7 +875,7 @@ class getID3
'fail_ape' => 'ERROR',
),
- // ZIP - data - ZIP compressed data
+ // ZIP - data - ZIP compressed data
'zip' => array(
'pattern' => '^PK\x03\x04',
'group' => 'archive',
@@ -870,7 +883,30 @@ class getID3
'mime_type' => 'application/zip',
'fail_id3' => 'ERROR',
'fail_ape' => 'ERROR',
- )
+ ),
+
+
+ // Misc other formats
+
+ // PDF - data - ZIP compressed data
+ 'pdf' => array(
+ 'pattern' => '^\x25PDF',
+ 'group' => 'misc',
+ 'module' => 'pdf',
+ 'mime_type' => 'application/pdf',
+ 'fail_id3' => 'ERROR',
+ 'fail_ape' => 'ERROR',
+ ),
+
+ // MSOFFICE - data - ZIP compressed data
+ 'msoffice' => array(
+ 'pattern' => '^\xD0\xCF\x11\xE0', // D0CF11E == DOCFILE == Microsoft Office Document
+ 'group' => 'misc',
+ 'module' => 'msoffice',
+ 'mime_type' => 'application/octet-stream',
+ 'fail_id3' => 'ERROR',
+ 'fail_ape' => 'ERROR',
+ ),
);
}
@@ -898,29 +934,12 @@ class getID3
if (preg_match('/\.mp[123a]$/i', $filename)) {
-
// Too many mp3 encoders on the market put gabage in front of mpeg files
// use assume format on these if format detection failed
$GetFileFormatArray = $this->GetFileFormatArray();
$info = $GetFileFormatArray['mp3'];
$info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php';
return $info;
-
- //} elseif (preg_match('/\.tar$/i', $filename)) {
- //
- // // TAR files don't have any useful header to work from
- // // TAR - data - TAR compressed data
- // $info = array(
- // 'pattern' => '^.{512}',
- // 'group' => 'archive',
- // 'module' => 'tar',
- // 'mime_type' => 'application/octet-stream',
- // 'fail_id3' => 'ERROR',
- // 'fail_ape' => 'ERROR',
- // );
- // $info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php';
- // return $info;
-
}
return false;
@@ -1087,6 +1106,7 @@ class getID3
} else {
$commandline = 'vorbiscomment -w -c "'.$empty.'" "'.$file.'" "'.$temp.'" 2>&1';
+ $commandline = 'vorbiscomment -w -c '.escapeshellarg($empty).' '.escapeshellarg($file).' '.escapeshellarg($temp).' 2>&1';
$VorbisCommentError = `$commandline`;
}
@@ -1276,6 +1296,10 @@ class getID3
return true;
}
+ function getid3_tempnam() {
+ return tempnam($this->tempdir, 'gI3');
+ }
+
}
?> \ No newline at end of file
diff --git a/modules/id3/getid3/helperapps/readme.txt b/modules/id3/getid3/helperapps/readme.txt
new file mode 100644
index 00000000..c210a598
--- /dev/null
+++ b/modules/id3/getid3/helperapps/readme.txt
@@ -0,0 +1,55 @@
+/////////////////////////////////////////////////////////////////
+/// getID3() by James Heinrich <info@getid3.org> //
+// available at http://getid3.sourceforge.net //
+// or http://www.getid3.org //
+/////////////////////////////////////////////////////////////////
+// //
+// /helperapps/readme.txt - part of getID3() //
+// List of binary files required under Windows for some //
+// features and/or file formats //
+// See /readme.txt for more details //
+// ///
+/////////////////////////////////////////////////////////////////
+
+This directory should contain binaries of various helper applications
+that getID3() depends on to handle some file formats under Windows.
+
+The location of this directory is configurable in /getid3/getid3.php
+as GETID3_HELPERAPPSDIR
+
+If this directory is empty, or you are missing any files, please
+download the latest version of the "getID3()-WindowsSupport" package
+from the usual download location (http://getid3.sourceforge.net)
+
+
+
+Included files:
+=====================================================
+
+Taken from http://www.cygwin.com/
+* cygwin1.dll
+
+Taken from http://unxutils.sourceforge.net/
+* head.exe
+* md5sum.exe
+* tail.exe
+
+Taken from http://ebible.org/mpj/software.htm
+* sha1sum.exe
+
+Taken from http://www.vorbis.com/download.psp
+* vorbiscomment.exe
+
+Taken from http://flac.sourceforge.net/download.html
+* metaflac.exe
+
+Taken from http://www.etree.org/shncom.html
+* shorten.exe
+
+
+/////////////////////////////////////////////////////////////////
+
+Changelog:
+
+2003.12.29:
+ * Initial release \ No newline at end of file
diff --git a/modules/id3/getid3/module.archive.gzip.php b/modules/id3/getid3/module.archive.gzip.php
index a494e4d0..34a44b13 100644
--- a/modules/id3/getid3/module.archive.gzip.php
+++ b/modules/id3/getid3/module.archive.gzip.php
@@ -17,15 +17,10 @@
class getid3_gzip {
// public: Optional file list - disable for speed.
- var $option_gzip_parse_contents = true; // decode gzipped files, if possible, and parse recursively (.tar.gz for example)
+ var $option_gzip_parse_contents = false; // decode gzipped files, if possible, and parse recursively (.tar.gz for example)
function getid3_gzip(&$fd, &$ThisFileInfo) {
$ThisFileInfo['fileformat'] = 'gzip';
- return $this->read_gzip($fd, $ThisFileInfo);
- }
-
- // Reads the gzip-file
- function read_gzip($fd, &$ThisFileInfo) {
$start_length = 10;
$unpack_header = 'a1id1/a1id2/a1cmethod/a1flags/a4mtime/a1xflags/a1os';
diff --git a/modules/id3/getid3/module.archive.tar.php b/modules/id3/getid3/module.archive.tar.php
index df2753f2..61aff401 100644
--- a/modules/id3/getid3/module.archive.tar.php
+++ b/modules/id3/getid3/module.archive.tar.php
@@ -18,35 +18,25 @@ class getid3_tar {
function getid3_tar(&$fd, &$ThisFileInfo) {
$ThisFileInfo['fileformat'] = 'tar';
+ $ThisFileInfo['tar']['files'] = array();
- @fseek($fd, 0);
- $filebuffer = @fread($fd, $ThisFileInfo['filesize']);
- return $this->read_tar($filebuffer, $ThisFileInfo);
- }
-
- // Reads the tar-file
- function read_tar(&$filebuffer, &$ThisFileInfo) {
-
- $header_length = 512;
$unpack_header = 'a100fname/a8mode/a8uid/a8gid/a12size/a12mtime/a8chksum/a1typflag/a100lnkname/a6magic/a2ver/a32uname/a32gname/a8devmaj/a8devmin/a155/prefix';
-
$null_512k = str_repeat("\0", 512); // end-of-file marker
- $ThisFileInfo['tar']['files'] = array();
+ @fseek($fd, 0);
+ while (!feof($fd)) {
+ $buffer = fread($fd, 512);
- while(strlen($filebuffer) != 0) {
- $buffer = substr($filebuffer, 0, $header_length);
- $filebuffer = substr($filebuffer, strlen($buffer));
// check the block
$checksum = 0;
for ($i = 0; $i < 148; $i++) {
- $checksum += ord(substr($buffer, $i, 1));
+ $checksum += ord($buffer{$i});
}
for ($i = 148; $i < 156; $i++) {
$checksum += ord(' ');
}
for ($i = 156; $i < 512; $i++) {
- $checksum += ord(substr($buffer, $i, 1));
+ $checksum += ord($buffer{$i});
}
$attr = unpack($unpack_header, $buffer);
$name = trim(@$attr['fname']);
@@ -65,8 +55,8 @@ class getid3_tar {
$devmaj = octdec(trim(@$attr['devmaj']));
$devmin = octdec(trim(@$attr['devmin']));
$prefix = trim(@$attr['prefix']);
- // EOF Found
if (($checksum == 256) && ($chksum == 0)) {
+ // EOF Found
break;
}
if ($prefix) {
@@ -75,22 +65,18 @@ class getid3_tar {
if ((preg_match('#/$#', $name)) && !$name) {
$typeflag = 5;
}
- // If it's the end of the tar-file...
if ($buffer == $null_512k) {
+ // it's the end of the tar-file...
break;
}
- // Read the next chunk
- $data = substr($filebuffer, 0, $size);
- $filebuffer = substr($filebuffer, strlen($data));
- if (strlen($data) != $size) {
- $ThisFileInfo['error'][] = 'Read error on tar file';
- return false;
- }
+
+ // Read to the next chunk
+ fseek($fd, $size, SEEK_CUR);
+
$diff = $size % 512;
if ($diff != 0) {
// Padding, throw away
- $buff = substr($filebuffer, 0, (512 - $diff));
- $filebuffer = substr($filebuffer, strlen($buff));
+ fseek($fd, (512 - $diff), SEEK_CUR);
}
// Protect against tar-files with garbage at the end
if ($name == '') {
@@ -122,7 +108,7 @@ class getid3_tar {
// Parses the file mode to file permissions
function display_perms($mode) {
// Determine Type
- if ($mode & 0x1000) $type='p'; // FIFO pipe
+ if ($mode & 0x1000) $type='p'; // FIFO pipe
elseif ($mode & 0x2000) $type='c'; // Character special
elseif ($mode & 0x4000) $type='d'; // Directory
elseif ($mode & 0x6000) $type='b'; // Block special
diff --git a/modules/id3/getid3/module.archive.zip.php b/modules/id3/getid3/module.archive.zip.php
index 285dfd9e..da6fb72f 100644
--- a/modules/id3/getid3/module.archive.zip.php
+++ b/modules/id3/getid3/module.archive.zip.php
@@ -406,7 +406,7 @@ class getid3_zip
$UNIXminute = (($DOStime & 0x07E0) >> 5);
$UNIXhour = (($DOStime & 0xF800) >> 11);
- return mktime($UNIXhour, $UNIXminute, $UNIXsecond, $UNIXmonth, $UNIXday, $UNIXyear);
+ return gmmktime($UNIXhour, $UNIXminute, $UNIXsecond, $UNIXmonth, $UNIXday, $UNIXyear);
}
}
diff --git a/modules/id3/getid3/module.audio-video.asf.php b/modules/id3/getid3/module.audio-video.asf.php
index 34203fce..b13db542 100644
--- a/modules/id3/getid3/module.audio-video.asf.php
+++ b/modules/id3/getid3/module.audio-video.asf.php
@@ -1071,6 +1071,7 @@ class getid3_asf
foreach ($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'] as $dummy => $dataarray) {
if (@$dataarray['flags']['stream_number'] == $streamnumber) {
$thisfile_asf_videomedia_currentstream['bitrate'] = $dataarray['bitrate'];
+ $thisfile_video['streams'][$streamnumber]['bitrate'] = $dataarray['bitrate'];
$thisfile_video['bitrate'] += $dataarray['bitrate'];
break;
}
@@ -1084,7 +1085,6 @@ class getid3_asf
$thisfile_video['streams'][$streamnumber]['resolution_x'] = $thisfile_asf_videomedia_currentstream['image_width'];
$thisfile_video['streams'][$streamnumber]['resolution_y'] = $thisfile_asf_videomedia_currentstream['image_height'];
$thisfile_video['streams'][$streamnumber]['bits_per_sample'] = $thisfile_asf_videomedia_currentstream['format_data']['bits_per_pixel'];
- $thisfile_video['streams'][$streamnumber]['bitrate'] = $thisfile_asf_videomedia_currentstream['bitrate'];
break;
default:
diff --git a/modules/id3/getid3/module.audio-video.flv.php b/modules/id3/getid3/module.audio-video.flv.php
index 98661d6c..d7ca5cf7 100644
--- a/modules/id3/getid3/module.audio-video.flv.php
+++ b/modules/id3/getid3/module.audio-video.flv.php
@@ -15,6 +15,10 @@
// Steve Webster <steve.webster@featurecreep.com> //
// * version 0.2 (22 February 2006) //
// //
+// Modified to not read entire file into memory //
+// by James Heinrich <info@getid3.org> //
+// * version 0.3 (15 June 2006) //
+// //
/////////////////////////////////////////////////////////////////
// //
// module.audio-video.flv.php //
@@ -37,81 +41,84 @@ class getid3_flv
function getid3_flv(&$fd, &$ThisFileInfo, $ReturnAllTagData=false) {
fseek($fd, $ThisFileInfo['avdataoffset'], SEEK_SET);
- $FLVfileData = fread($fd, $ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset']);
+ $FLVdataLength = $ThisFileInfo['avdataend'] - $ThisFileInfo['avdataoffset'];
+ $FLVheader = fread($fd, 5);
+
+ $ThisFileInfo['fileformat'] = 'flv';
+ $ThisFileInfo['flv']['header']['signature'] = substr($FLVheader, 0, 3);
+ $ThisFileInfo['flv']['header']['version'] = getid3_lib::BigEndian2Int(substr($FLVheader, 3, 1));
+ $TypeFlags = getid3_lib::BigEndian2Int(substr($FLVheader, 4, 1));
- $FLVmagic = substr($FLVfileData, 0, 3);
- if ($FLVmagic != 'FLV') {
+ if ($ThisFileInfo['flv']['header']['signature'] != 'FLV') {
$ThisFileInfo['error'][] = 'Expecting "FLV" at offset '.$ThisFileInfo['avdataoffset'].', found "'.$ThisFileInfo['flv']['header']['signature'].'"';
unset($ThisFileInfo['flv']);
unset($ThisFileInfo['fileformat']);
return false;
}
- $ThisFileInfo['flv']['header']['signature'] = $FLVmagic;
- $ThisFileInfo['flv']['header']['version'] = ord($FLVfileData{3});
- $ThisFileInfo['fileformat'] = 'flv';
-
- $TypeFlags = ord($FLVfileData{4});
- $ThisFileInfo['flv']['header']['hasAudio'] = (bool) ($TypeFlags & 4);
- $ThisFileInfo['flv']['header']['hasVideo'] = (bool) ($TypeFlags & 1);
- $FrameSizeDataLength = getid3_lib::BigEndian2Int(substr($FLVfileData, 5, 4));
+ $ThisFileInfo['flv']['header']['hasAudio'] = (bool) ($TypeFlags & 0x04);
+ $ThisFileInfo['flv']['header']['hasVideo'] = (bool) ($TypeFlags & 0x01);
- // FLV tags
- $CurrentOffset = $FrameSizeDataLength;
- $FLVdataLength = strlen($FLVfileData);
+ $FrameSizeDataLength = getid3_lib::BigEndian2Int(fread($fd, 4));
+ $FLVheaderFrameLength = 9;
+ if ($FrameSizeDataLength > $FLVheaderFrameLength) {
+ fseek($fd, $FrameSizeDataLength - $FLVheaderFrameLength, SEEK_CUR);
+ }
$Duration = 0;
-
- $SoundFormat = null;
- $VideoFormat = null;
- while ($CurrentOffset < $FLVdataLength) {
- // previous tag size
- $PreviousTagLength = getid3_lib::BigEndian2Int(substr($FLVfileData, $CurrentOffset, 4));
- $CurrentOffset += 4;
-
- $TagType = ord(substr($FLVfileData, $CurrentOffset, 1));
- $DataLength = getid3_lib::BigEndian2Int(substr($FLVfileData, $CurrentOffset + 1, 3));
- $Timestamp = getid3_lib::BigEndian2Int(substr($FLVfileData, $CurrentOffset + 4, 3));
+ while ((ftell($fd) + 1) < $ThisFileInfo['avdataend']) {
+ //if (!$ThisFileInfo['flv']['header']['hasAudio'] || isset($ThisFileInfo['flv']['audio']['audioFormat'])) {
+ // if (!$ThisFileInfo['flv']['header']['hasVideo'] || isset($ThisFileInfo['flv']['video']['videoCodec'])) {
+ // break;
+ // }
+ //}
+
+ $ThisTagHeader = fread($fd, 16);
+
+ $PreviousTagLength = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 0, 4));
+ $TagType = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 4, 1));
+ $DataLength = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 5, 3));
+ $Timestamp = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 8, 3));
+ $LastHeaderByte = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 15, 1));
+ $NextOffset = ftell($fd) - 1 + $DataLength;
switch ($TagType) {
case GETID3_FLV_TAG_AUDIO:
- if (is_null($SoundFormat)) {
- $SoundInfo = ord(substr($FLVfileData, $CurrentOffset + 11, 1));
- $SoundFormat = $SoundInfo & 0x07;
- $ThisFileInfo['flv']['audio']['audioFormat'] = $SoundFormat;
- $ThisFileInfo['flv']['audio']['audioRate'] = ($SoundInfo & 0x30) / 0x10;
- $ThisFileInfo['flv']['audio']['audioSampleSize'] = ($SoundInfo & 0x40) / 0x40;
- $ThisFileInfo['flv']['audio']['audioType'] = ($SoundInfo & 0x80) / 0x80;
+ if (!isset($ThisFileInfo['flv']['audio']['audioFormat'])) {
+ $ThisFileInfo['flv']['audio']['audioFormat'] = $LastHeaderByte & 0x07;
+ $ThisFileInfo['flv']['audio']['audioRate'] = ($LastHeaderByte & 0x30) / 0x10;
+ $ThisFileInfo['flv']['audio']['audioSampleSize'] = ($LastHeaderByte & 0x40) / 0x40;
+ $ThisFileInfo['flv']['audio']['audioType'] = ($LastHeaderByte & 0x80) / 0x80;
}
break;
case GETID3_FLV_TAG_VIDEO:
- if (is_null($VideoFormat)) {
- $VideoInfo = ord(substr($FLVfileData, $CurrentOffset + 11, 1));
- $VideoFormat = $VideoInfo & 0x07;
- $ThisFileInfo['flv']['video']['videoCodec'] = $VideoFormat;
+ if (!isset($ThisFileInfo['flv']['video']['videoCodec'])) {
+ $ThisFileInfo['flv']['video']['videoCodec'] = $LastHeaderByte & 0x07;
+
+ $FLVvideoHeader = fread($fd, 11);
- if ($VideoFormat != GETID3_FLV_VIDEO_VP6) {
+ if ($ThisFileInfo['flv']['video']['videoCodec'] != GETID3_FLV_VIDEO_VP6) {
- $PictureSizeType = (getid3_lib::BigEndian2Int(substr($FLVfileData, $CurrentOffset + 15, 2))) >> 7;
+ $PictureSizeType = (getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 3, 2))) >> 7;
$PictureSizeType = $PictureSizeType & 0x0007;
$ThisFileInfo['flv']['header']['videoSizeType'] = $PictureSizeType;
switch ($PictureSizeType) {
case 0:
- $PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVfileData, $CurrentOffset + 16, 2));
+ $PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 2));
$PictureSizeEnc <<= 1;
$ThisFileInfo['video']['resolution_x'] = ($PictureSizeEnc & 0xFF00) >> 8;
- $PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVfileData, $CurrentOffset + 17, 2));
+ $PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 2));
$PictureSizeEnc <<= 1;
$ThisFileInfo['video']['resolution_y'] = ($PictureSizeEnc & 0xFF00) >> 8;
break;
case 1:
- $PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVfileData, $CurrentOffset + 16, 4));
+ $PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 4));
$PictureSizeEnc <<= 1;
$ThisFileInfo['video']['resolution_x'] = ($PictureSizeEnc & 0xFFFF0000) >> 16;
- $PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVfileData, $CurrentOffset + 18, 4));
+ $PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 7, 4));
$PictureSizeEnc <<= 1;
$ThisFileInfo['video']['resolution_y'] = ($PictureSizeEnc & 0xFFFF0000) >> 16;
break;
@@ -154,16 +161,15 @@ class getid3_flv
// Meta tag
case GETID3_FLV_TAG_META:
- $reader = new AMFReader(new AMFStream(substr($FLVfileData, $CurrentOffset + 11, $DataLength)));
+ fseek($fd, -1, SEEK_CUR);
+ $reader = new AMFReader(new AMFStream(fread($fd, $DataLength)));
$eventName = $reader->readData();
$ThisFileInfo['meta'][$eventName] = $reader->readData();
-
unset($reader);
- $ThisFileInfo['video']['frame_rate'] = $ThisFileInfo['meta']['onMetaData']['framerate'];
- $ThisFileInfo['video']['resolution_x'] = $ThisFileInfo['meta']['onMetaData']['width'];
- $ThisFileInfo['video']['resolution_y'] = $ThisFileInfo['meta']['onMetaData']['height'];
-
+ $ThisFileInfo['video']['frame_rate'] = $ThisFileInfo['meta']['onMetaData']['framerate'];
+ $ThisFileInfo['video']['resolution_x'] = $ThisFileInfo['meta']['onMetaData']['width'];
+ $ThisFileInfo['video']['resolution_y'] = $ThisFileInfo['meta']['onMetaData']['height'];
break;
default:
@@ -175,7 +181,7 @@ class getid3_flv
$Duration = $Timestamp;
}
- $CurrentOffset += ($DataLength + 11);
+ fseek($fd, $NextOffset, SEEK_SET);
}
$ThisFileInfo['playtime_seconds'] = $Duration / 1000;
@@ -191,7 +197,7 @@ class getid3_flv
$ThisFileInfo['audio']['dataformat'] = 'flv';
}
if (@$ThisFileInfo['flv']['header']['hasVideo']) {
- $ThisFileInfo['video']['codec'] = $this->FLVvideoCodec($ThisFileInfo['flv']['video']['videoCodec']);
+ $ThisFileInfo['video']['codec'] = $this->FLVvideoCodec($ThisFileInfo['flv']['video']['videoCodec']);
$ThisFileInfo['video']['dataformat'] = 'flv';
$ThisFileInfo['video']['lossless'] = false;
}
diff --git a/modules/id3/getid3/module.audio-video.quicktime.php b/modules/id3/getid3/module.audio-video.quicktime.php
index c5d6e8d9..e08b9b29 100644
--- a/modules/id3/getid3/module.audio-video.quicktime.php
+++ b/modules/id3/getid3/module.audio-video.quicktime.php
@@ -520,7 +520,7 @@ class getid3_quicktime
$atomstructure['time_to_sample_table'][$i]['sample_duration'] = getid3_lib::BigEndian2Int(substr($atomdata, $sttsEntriesDataOffset, 4));
$sttsEntriesDataOffset += 4;
- if (!empty($ThisFileInfo['quicktime']['time_scale'])) {
+ if (!empty($ThisFileInfo['quicktime']['time_scale']) && (@$atomstructure['time_to_sample_table'][$i]['sample_duration'] > 0)) {
$stts_new_framerate = $ThisFileInfo['quicktime']['time_scale'] / $atomstructure['time_to_sample_table'][$i]['sample_duration'];
if ($stts_new_framerate <= 60) {
// some atoms have durations of "1" giving a very large framerate, which probably is not right
diff --git a/modules/id3/getid3/module.audio-video.riff.php b/modules/id3/getid3/module.audio-video.riff.php
index b2225a28..f32dab4e 100644
--- a/modules/id3/getid3/module.audio-video.riff.php
+++ b/modules/id3/getid3/module.audio-video.riff.php
@@ -201,7 +201,7 @@ class getid3_riff
$thisfile_riff_WAVE_bext_0['reserved'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_bext_0['data'], 347, 254));
$thisfile_riff_WAVE_bext_0['coding_history'] = explode("\r\n", trim(substr($thisfile_riff_WAVE_bext_0['data'], 601)));
- $thisfile_riff_WAVE_bext_0['origin_date_unix'] = mktime(
+ $thisfile_riff_WAVE_bext_0['origin_date_unix'] = gmmktime(
substr($thisfile_riff_WAVE_bext_0['origin_time'], 0, 2),
substr($thisfile_riff_WAVE_bext_0['origin_time'], 3, 2),
substr($thisfile_riff_WAVE_bext_0['origin_time'], 6, 2),
@@ -1005,7 +1005,7 @@ class getid3_riff
}
- function RIFFcommentsParse(&$RIFFinfoArray, &$CommentsTargetArray) {
+ function RIFFcommentsParse(&$RIFFinfoArray, &$CommentsTargetArray) {
$RIFFinfoKeyLookup = array(
'IARL'=>'archivallocation',
'IART'=>'artist',
@@ -1055,9 +1055,9 @@ class getid3_riff
}
}
}
- }
+ }
return true;
- }
+ }
function ParseRIFF(&$fd, $startoffset, $maxoffset, &$ThisFileInfo) {
diff --git a/modules/id3/getid3/module.audio.aac.php b/modules/id3/getid3/module.audio.aac.php
index 9e7ce47c..4d35fb21 100644
--- a/modules/id3/getid3/module.audio.aac.php
+++ b/modules/id3/getid3/module.audio.aac.php
@@ -299,7 +299,7 @@ class getid3_aac
}
// used to calculate bitrate below
- static $BitrateCache = array();
+ $BitrateCache = array();
while (true) {
diff --git a/modules/id3/getid3/module.audio.flac.php b/modules/id3/getid3/module.audio.flac.php
index 18a55b0d..573ed986 100644
--- a/modules/id3/getid3/module.audio.flac.php
+++ b/modules/id3/getid3/module.audio.flac.php
@@ -47,7 +47,7 @@ class getid3_flac
$METAdataBlockLength = getid3_lib::BigEndian2Int(substr($METAdataBlockHeader, 1, 3));
$METAdataBlockTypeText = getid3_flac::FLACmetaBlockTypeLookup($METAdataBlockType);
- if ($METAdataBlockLength <= 0) {
+ if ($METAdataBlockLength < 0) {
$ThisFileInfo['error'][] = 'corrupt or invalid METADATA_BLOCK_HEADER.BLOCK_TYPE ('.$METAdataBlockType.') at offset '.$METAdataBlockOffset;
break;
}
@@ -60,7 +60,7 @@ class getid3_flac
$ThisFileInfo_flac_METAdataBlockTypeText_raw['block_type'] = $METAdataBlockType;
$ThisFileInfo_flac_METAdataBlockTypeText_raw['block_type_text'] = $METAdataBlockTypeText;
$ThisFileInfo_flac_METAdataBlockTypeText_raw['block_length'] = $METAdataBlockLength;
- $ThisFileInfo_flac_METAdataBlockTypeText_raw['block_data'] = fread($fd, $METAdataBlockLength);
+ $ThisFileInfo_flac_METAdataBlockTypeText_raw['block_data'] = @fread($fd, $METAdataBlockLength);
$ThisFileInfo['avdataoffset'] = ftell($fd);
switch ($METAdataBlockTypeText) {
diff --git a/modules/id3/getid3/module.audio.mp3.php b/modules/id3/getid3/module.audio.mp3.php
index 5fb6110c..baff8387 100644
--- a/modules/id3/getid3/module.audio.mp3.php
+++ b/modules/id3/getid3/module.audio.mp3.php
@@ -1880,51 +1880,57 @@ class getid3_mp3
}
function LAMEpresetUsedLookup($LAMEtag) {
- if ($LAMEtag['preset_used_id'] == 0) {
- // no preset used (LAME >=3.93)
- // no preset recorded (LAME <3.93)
- return '';
- }
- static $LAMEpresetUsedLookup = array();
- if (empty($LAMEpresetUsedLookup)) {
- for ($i = 8; $i <= 320; $i++) {
- switch ($LAMEtag['vbr_method']) {
- case 'cbr':
- $LAMEpresetUsedLookup[$i] = '--alt-preset '.$LAMEtag['vbr_method'].' '.$i;
- break;
- case 'abr':
- default: // other VBR modes shouldn't be here(?)
- $LAMEpresetUsedLookup[$i] = '--alt-preset '.$i;
- break;
- }
- }
- // named old-style presets (studio, phone, voice, etc) are handled in GuessEncoderOptions()
-
- // named alt-presets
- $LAMEpresetUsedLookup[1000] = '--r3mix';
- $LAMEpresetUsedLookup[1001] = '--alt-preset standard';
- $LAMEpresetUsedLookup[1002] = '--alt-preset extreme';
- $LAMEpresetUsedLookup[1003] = '--alt-preset insane';
- $LAMEpresetUsedLookup[1004] = '--alt-preset fast standard';
- $LAMEpresetUsedLookup[1005] = '--alt-preset fast extreme';
- $LAMEpresetUsedLookup[1006] = '--alt-preset medium';
- $LAMEpresetUsedLookup[1007] = '--alt-preset fast medium';
-
- // LAME 3.94 additions/changes
- $LAMEpresetUsedLookup[1010] = '--preset portable'; // 3.94a15 Oct 21 2003
- $LAMEpresetUsedLookup[1015] = '--preset radio'; // 3.94a15 Oct 21 2003
-
- $LAMEpresetUsedLookup[320] = '--preset insane'; // 3.94a15 Nov 12 2003
- $LAMEpresetUsedLookup[430] = '--preset radio'; // 3.94a15 Nov 12 2003
- $LAMEpresetUsedLookup[450] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'portable'; // 3.94a15 Nov 12 2003
- $LAMEpresetUsedLookup[460] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'medium'; // 3.94a15 Nov 12 2003
- $LAMEpresetUsedLookup[470] = '--r3mix'; // 3.94b1 Dec 18 2003
- $LAMEpresetUsedLookup[480] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'standard'; // 3.94a15 Nov 12 2003
- $LAMEpresetUsedLookup[500] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'extreme'; // 3.94a15 Nov 12 2003
- }
- return (isset($LAMEpresetUsedLookup[$LAMEtag['preset_used_id']]) ? $LAMEpresetUsedLookup[$LAMEtag['preset_used_id']] : 'new/unknown preset: '.$LAMEtag['preset_used_id'].' - report to info@getid3.org');
- }
+ if ($LAMEtag['preset_used_id'] == 0) {
+ // no preset used (LAME >=3.93)
+ // no preset recorded (LAME <3.93)
+ return '';
+ }
+ $LAMEpresetUsedLookup = array();
+
+ ///// THIS PART CANNOT BE STATIC .
+ for ($i = 8; $i <= 320; $i++) {
+ switch ($LAMEtag['vbr_method']) {
+ case 'cbr':
+ $LAMEpresetUsedLookup[$i] = '--alt-preset '.$LAMEtag['vbr_method'].' '.$i;
+ break;
+ case 'abr':
+ default: // other VBR modes shouldn't be here(?)
+ $LAMEpresetUsedLookup[$i] = '--alt-preset '.$i;
+ break;
+ }
+ }
+
+ // named old-style presets (studio, phone, voice, etc) are handled in GuessEncoderOptions()
+
+ // named alt-presets
+ $LAMEpresetUsedLookup[1000] = '--r3mix';
+ $LAMEpresetUsedLookup[1001] = '--alt-preset standard';
+ $LAMEpresetUsedLookup[1002] = '--alt-preset extreme';
+ $LAMEpresetUsedLookup[1003] = '--alt-preset insane';
+ $LAMEpresetUsedLookup[1004] = '--alt-preset fast standard';
+ $LAMEpresetUsedLookup[1005] = '--alt-preset fast extreme';
+ $LAMEpresetUsedLookup[1006] = '--alt-preset medium';
+ $LAMEpresetUsedLookup[1007] = '--alt-preset fast medium';
+
+ // LAME 3.94 additions/changes
+ $LAMEpresetUsedLookup[1010] = '--preset portable'; // 3.94a15 Oct 21 2003
+ $LAMEpresetUsedLookup[1015] = '--preset radio'; // 3.94a15 Oct 21 2003
+
+ $LAMEpresetUsedLookup[320] = '--preset insane'; // 3.94a15 Nov 12 2003
+ $LAMEpresetUsedLookup[410] = '-V9';
+ $LAMEpresetUsedLookup[420] = '-V8';
+ $LAMEpresetUsedLookup[440] = '-V6';
+ $LAMEpresetUsedLookup[430] = '--preset radio'; // 3.94a15 Nov 12 2003
+ $LAMEpresetUsedLookup[450] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'portable'; // 3.94a15 Nov 12 2003
+ $LAMEpresetUsedLookup[460] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'medium'; // 3.94a15 Nov 12 2003
+ $LAMEpresetUsedLookup[470] = '--r3mix'; // 3.94b1 Dec 18 2003
+ $LAMEpresetUsedLookup[480] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'standard'; // 3.94a15 Nov 12 2003
+ $LAMEpresetUsedLookup[490] = '-V1';
+ $LAMEpresetUsedLookup[500] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'extreme'; // 3.94a15 Nov 12 2003
+
+ return (isset($LAMEpresetUsedLookup[$LAMEtag['preset_used_id']]) ? $LAMEpresetUsedLookup[$LAMEtag['preset_used_id']] : 'new/unknown preset: '.$LAMEtag['preset_used_id'].' - report to info@getid3.org');
+ }
}
diff --git a/modules/id3/getid3/module.audio.shorten.php b/modules/id3/getid3/module.audio.shorten.php
index 2088db72..3a09bdd8 100644
--- a/modules/id3/getid3/module.audio.shorten.php
+++ b/modules/id3/getid3/module.audio.shorten.php
@@ -124,6 +124,7 @@ class getid3_shorten
}
}
$commandline = GETID3_HELPERAPPSDIR.'shorten.exe -x "'.$ThisFileInfo['filenamepath'].'" - | '.GETID3_HELPERAPPSDIR.'head.exe -c 44';
+ $commandline = str_replace('/', '\\', $commandline);
} else {
@@ -135,7 +136,7 @@ class getid3_shorten
$ThisFileInfo['error'][] = 'shorten binary was not found in path or /usr/local/bin';
return false;
}
- $commandline = (file_exists('/usr/local/bin/shorten') ? '/usr/local/bin/' : '' ) . 'shorten -x "'.$ThisFileInfo['filenamepath'].'" - | head -c 44';
+ $commandline = (file_exists('/usr/local/bin/shorten') ? '/usr/local/bin/' : '' ) . 'shorten -x '.escapeshellarg($ThisFileInfo['filenamepath']).' - | head -c 44';
}
diff --git a/modules/id3/getid3/module.misc.iso.php b/modules/id3/getid3/module.misc.iso.php
index 86115793..94df9294 100644
--- a/modules/id3/getid3/module.misc.iso.php
+++ b/modules/id3/getid3/module.misc.iso.php
@@ -338,7 +338,7 @@ class getid3_iso
if (!$UNIXyear) {
return false;
}
- return mktime($UNIXhour, $UNIXminute, $UNIXsecond, $UNIXmonth, $UNIXday, $UNIXyear);
+ return gmmktime($UNIXhour, $UNIXminute, $UNIXsecond, $UNIXmonth, $UNIXday, $UNIXyear);
}
function ISOtime2UNIXtime($ISOtime) {
@@ -359,7 +359,7 @@ class getid3_iso
$UNIXsecond = ord($ISOtime{5});
$GMToffset = $this->TwosCompliment2Decimal(ord($ISOtime{5}));
- return mktime($UNIXhour, $UNIXminute, $UNIXsecond, $UNIXmonth, $UNIXday, $UNIXyear);
+ return gmmktime($UNIXhour, $UNIXminute, $UNIXsecond, $UNIXmonth, $UNIXday, $UNIXyear);
}
function TwosCompliment2Decimal($BinaryValue) {
diff --git a/modules/id3/getid3/module.tag.id3v2.php b/modules/id3/getid3/module.tag.id3v2.php
index 8bb6c3cb..16f517e8 100644
--- a/modules/id3/getid3/module.tag.id3v2.php
+++ b/modules/id3/getid3/module.tag.id3v2.php
@@ -234,7 +234,7 @@ class getid3_id3v2
} elseif (($frame_name == "\x00".'MP3') || ($frame_name == "\x00\x00".'MP') || ($frame_name == ' MP3') || ($frame_name == 'MP3e')) {
// MP3ext known broken frames - "ok" for the purposes of this test
} elseif (($id3v2_majorversion == 4) && ($this->IsValidID3v2FrameName(substr($framedata, getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0), 4), 3))) {
- $ThisFileInfo['warning'][] = 'ID3v2 tag written as ID3v2.4, but with non-synchsafe integers (ID3v2.3 style). Older versions of Helium2 (www.helium2.com) is a known culprit of this. Tag has been parsed as ID3v2.3';
+ $ThisFileInfo['warning'][] = 'ID3v2 tag written as ID3v2.4, but with non-synchsafe integers (ID3v2.3 style). Older versions of (Helium2; iTunes) are known culprits of this. Tag has been parsed as ID3v2.3';
$id3v2_majorversion = 3;
$frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0); // 32-bit integer
}
@@ -292,7 +292,8 @@ class getid3_id3v2
} else {
// next frame is invalid too, abort processing
- unset($framedata);
+ //unset($framedata);
+ $framedata = null;
$ThisFileInfo['error'][] = 'Next ID3v2 frame is also invalid, aborting processing.';
}
@@ -305,7 +306,8 @@ class getid3_id3v2
} else {
// next frame is invalid too, abort processing
- unset($framedata);
+ //unset($framedata);
+ $framedata = null;
$ThisFileInfo['warning'][] = 'Invalid ID3v2 frame size, aborting.';
}
@@ -386,6 +388,10 @@ class getid3_id3v2
}
}
+ if (!isset($thisfile_id3v2['comments']['year']) && ereg('^([0-9]{4})', trim(@$thisfile_id3v2['comments']['recording_time'][0]), $matches)) {
+ $thisfile_id3v2['comments']['year'] = array($matches[1]);
+ }
+
// Set avdataoffset
$ThisFileInfo['avdataoffset'] = $thisfile_id3v2['headerlength'];
@@ -2873,88 +2879,168 @@ class getid3_id3v2
$begin = __LINE__;
- /** This is not a comment!
-
- COM comment
- COMM comment
- TAL album
- TALB album
- TBP bpm
- TBPM bpm
- TCM composer
- TCO genre
- TCOM composer
- TCON genre
- TCOP copyright
- TCR copyright
- TEN encoded_by
- TENC encoded_by
- TEXT lyricist
- TIT1 description
- TIT2 title
- TIT3 subtitle
- TLA language
- TLAN language
- TLE length
- TLEN length
- TMOO mood
- TOA original_artist
- TOAL original_album
- TOF original_filename
- TOFN original_filename
- TOL original_lyricist
- TOLY original_lyricist
- TOPE original_artist
- TOT original_album
- TP1 artist
- TP2 band
- TP3 conductor
- TP4 remixer
- TPB publisher
- TPE1 artist
- TPE2 band
- TPE3 conductor
- TPE4 remixer
- TPUB publisher
- TRC isrc
- TRCK track
- TRK track
- TSI size
- TSIZ size
- TSRC isrc
- TSS encoder_settings
- TSSE encoder_settings
- TSST subtitle
- TT1 description
- TT2 title
- TT3 subtitle
- TXT lyricist
- TXX text
- TXXX text
- TYE year
- TYER year
- UFI unique_file_identifier
- UFID unique_file_identifier
- ULT unsychronised_lyric
- USER terms_of_use
- USLT unsynchronised lyric
- WAF url_file
- WAR url_artist
- WAS url_source
- WCOP copyright
- WCP copyright
- WOAF url_file
- WOAR url_artist
- WOAS url_source
- WORS url_station
- WPB url_publisher
- WPUB url_publisher
- WXX url_user
- WXXX url_user
- TFEA featured_artist
- TSTU studio
-
- */
+ /** This is not a comment!
+
+ AENC audio_encryption
+ APIC attached_picture
+ ASPI audio_seek_point_index
+ BUF recommended_buffer_size
+ CNT play_counter
+ COM comments
+ COMM comments
+ COMR commercial_frame
+ CRA audio_encryption
+ CRM encrypted_meta_frame
+ ENCR encryption_method_registration
+ EQU equalisation
+ EQU2 equalisation
+ EQUA equalisation
+ ETC event_timing_codes
+ ETCO event_timing_codes
+ GEO general_encapsulated_object
+ GEOB general_encapsulated_object
+ GRID group_identification_registration
+ IPL involved_people_list
+ IPLS involved_people_list
+ LINK linked_information
+ LNK linked_information
+ MCDI music_cd_identifier
+ MCI music_cd_identifier
+ MLL mpeg_location_lookup_table
+ MLLT mpeg_location_lookup_table
+ OWNE ownership_frame
+ PCNT play_counter
+ PIC attached_picture
+ POP popularimeter
+ POPM popularimeter
+ POSS position_synchronisation_frame
+ PRIV private_frame
+ RBUF recommended_buffer_size
+ REV reverb
+ RVA relative_volume_adjustment
+ RVA2 relative_volume_adjustment
+ RVAD relative_volume_adjustment
+ RVRB reverb
+ SEEK seek_frame
+ SIGN signature_frame
+ SLT synchronised_lyric
+ STC synced_tempo_codes
+ SYLT synchronised_lyric
+ SYTC synchronised_tempo_codes
+ TAL album
+ TALB album
+ TBP bpm
+ TBPM bpm
+ TCM composer
+ TCO content_type
+ TCOM composer
+ TCON content_type
+ TCOP copyright_message
+ TCR copyright_message
+ TDA date
+ TDAT date
+ TDEN encoding_time
+ TDLY playlist_delay
+ TDOR original_release_time
+ TDRC recording_time
+ TDRL release_time
+ TDTG tagging_time
+ TDY playlist_delay
+ TEN encoded_by
+ TENC encoded_by
+ TEXT lyricist
+ TFLT file_type
+ TFT file_type
+ TIM time
+ TIME time
+ TIPL involved_people_list
+ TIT1 content_group_description
+ TIT2 title
+ TIT3 subtitle
+ TKE initial_key
+ TKEY initial_key
+ TLA language
+ TLAN language
+ TLE length
+ TLEN length
+ TMCL musician_credits_list
+ TMED media_type
+ TMOO mood
+ TMT media_type
+ TOA original_artist
+ TOAL original_album
+ TOF original_filename
+ TOFN original_filename
+ TOL original_lyricist
+ TOLY original_lyricist
+ TOPE original_artist
+ TOR original_year
+ TORY original_year
+ TOT original_album
+ TOWN file_owner
+ TP1 artist
+ TP2 band
+ TP3 conductor
+ TP4 remixer
+ TPA part_of_a_set
+ TPB publisher
+ TPE1 artist
+ TPE2 band
+ TPE3 conductor
+ TPE4 remixer
+ TPOS part_of_a_set
+ TPRO produced_notice
+ TPUB publisher
+ TRC isrc
+ TRCK track_number
+ TRD recording_dates
+ TRDA recording_dates
+ TRK track_number
+ TRSN internet_radio_station_name
+ TRSO internet_radio_station_owner
+ TSI size
+ TSIZ size
+ TSOA album_sort_order
+ TSOP performer_sort_order
+ TSOT title_sort_order
+ TSRC isrc
+ TSS encoder_settings
+ TSSE encoder_settings
+ TSST set_subtitle
+ TT1 description
+ TT2 title
+ TT3 subtitle
+ TXT lyricist
+ TXX text
+ TXXX text
+ TYE year
+ TYER year
+ UFI unique_file_identifier
+ UFID unique_file_identifier
+ ULT unsychronised_lyric
+ USER terms_of_use
+ USLT unsynchronised_lyric
+ WAF url_file
+ WAR url_artist
+ WAS url_source
+ WCM commercial_information
+ WCOM commercial_information
+ WCOP copyright
+ WCP copyright
+ WOAF url_file
+ WOAR url_artist
+ WOAS url_source
+ WORS url_station
+ WPAY url_payment
+ WPB url_publisher
+ WPUB url_publisher
+ WXX url_user
+ WXXX url_user
+ TFEA featured_artist
+ TSTU recording_studio
+ rgad replay_gain_adjustment
+
+ */
return getid3_lib::EmbeddedLookup($framename, $begin, __LINE__, __FILE__, 'id3v2-framename_short');
}
diff --git a/modules/id3/getid3/write.php b/modules/id3/getid3/write.php
index e9dbf160..73e26103 100644
--- a/modules/id3/getid3/write.php
+++ b/modules/id3/getid3/write.php
@@ -102,6 +102,7 @@ class getid3_writetags
case 'mp3':
case 'mp2':
case 'mp1':
+ case 'riff': // maybe not officially, but people do it anyway
$AllowedTagFormats = array('id3v1', 'id3v2.2', 'id3v2.3', 'id3v2.4', 'ape', 'lyrics3');
break;
@@ -300,7 +301,7 @@ class getid3_writetags
$this->errors[] = 'WriteVorbisComment() failed with message(s):<PRE><UL><LI>'.trim(implode('</LI><LI>', $vorbiscomment_writer->errors)).'</LI></UL></PRE>';
}
} else {
- $this->errors[] = 'WriteVorbisComment() failed';
+ $this->errors[] = 'FormatDataForVorbisComment() failed';
}
break;
diff --git a/modules/id3/vainfo.class.php b/modules/id3/vainfo.class.php
index 14d2f658..18a3ed4f 100755
--- a/modules/id3/vainfo.class.php
+++ b/modules/id3/vainfo.class.php
@@ -348,11 +348,26 @@ class vainfo {
/* Go through the tags */
foreach ($tags as $tag=>$data) {
-
- /* This is our baseline for naming so
- * no translation is needed
+
+ /**
+ * the new getid3 handles this differently
+ * so we now need to account for it :(
*/
- $array[$tag] = $this->_clean_tag($data['0'],$this->_file_encoding);
+ switch ($tag) {
+ case 'track_number':
+ $array['track'] = $this->_clean_tag($data['0'],$this->_file_encoding);
+ break;
+ case 'content_type':
+ $data['0'] = preg_replace("/^\(\d+\)/","",$data['0']);
+ $array['genre'] = $this->_clean_tag($data['0'],$this->_file_encoding);
+ break;
+ case 'comments':
+ $array['comment'] = $this->_clean_tag($data['0'],$this->_file_encoding);
+ break;
+ default:
+ $array[$tag] = $this->_clean_tag($data['0'],$this->_file_encoding);
+ break;
+ } // end switch on tag
} // end foreach