Edit File by line

Deprecated: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in /home/sportsfever/public_html/filemanger/function.php on line 93

Warning: Undefined array key "page_file_edit_line" in /home/sportsfever/public_html/filemanger/edit_text_line.php on line 32
/home/sportsfe.../httpdocs/clone/wp-inclu.../ID3
File: getid3.php
'fail_ape' => 'ERROR',
[1500] Fix | Delete
),
[1501] Fix | Delete
[1502] Fix | Delete
// MSOFFICE - data - ZIP compressed data
[1503] Fix | Delete
'msoffice' => array(
[1504] Fix | Delete
'pattern' => '^\\xD0\\xCF\\x11\\xE0\\xA1\\xB1\\x1A\\xE1', // D0CF11E == DOCFILE == Microsoft Office Document
[1505] Fix | Delete
'group' => 'misc',
[1506] Fix | Delete
'module' => 'msoffice',
[1507] Fix | Delete
'mime_type' => 'application/octet-stream',
[1508] Fix | Delete
'fail_id3' => 'ERROR',
[1509] Fix | Delete
'fail_ape' => 'ERROR',
[1510] Fix | Delete
),
[1511] Fix | Delete
[1512] Fix | Delete
// TORRENT - .torrent
[1513] Fix | Delete
'torrent' => array(
[1514] Fix | Delete
'pattern' => '^(d8\\:announce|d7\\:comment)',
[1515] Fix | Delete
'group' => 'misc',
[1516] Fix | Delete
'module' => 'torrent',
[1517] Fix | Delete
'mime_type' => 'application/x-bittorrent',
[1518] Fix | Delete
'fail_id3' => 'ERROR',
[1519] Fix | Delete
'fail_ape' => 'ERROR',
[1520] Fix | Delete
),
[1521] Fix | Delete
[1522] Fix | Delete
// CUE - data - CUEsheet (index to single-file disc images)
[1523] Fix | Delete
'cue' => array(
[1524] Fix | Delete
'pattern' => '', // empty pattern means cannot be automatically detected, will fall through all other formats and match based on filename and very basic file contents
[1525] Fix | Delete
'group' => 'misc',
[1526] Fix | Delete
'module' => 'cue',
[1527] Fix | Delete
'mime_type' => 'application/octet-stream',
[1528] Fix | Delete
),
[1529] Fix | Delete
[1530] Fix | Delete
);
[1531] Fix | Delete
}
[1532] Fix | Delete
[1533] Fix | Delete
return $format_info;
[1534] Fix | Delete
}
[1535] Fix | Delete
[1536] Fix | Delete
/**
[1537] Fix | Delete
* @param string $filedata
[1538] Fix | Delete
* @param string $filename
[1539] Fix | Delete
*
[1540] Fix | Delete
* @return mixed|false
[1541] Fix | Delete
*/
[1542] Fix | Delete
public function GetFileFormat(&$filedata, $filename='') {
[1543] Fix | Delete
// this function will determine the format of a file based on usually
[1544] Fix | Delete
// the first 2-4 bytes of the file (8 bytes for PNG, 16 bytes for JPG,
[1545] Fix | Delete
// and in the case of ISO CD image, 6 bytes offset 32kb from the start
[1546] Fix | Delete
// of the file).
[1547] Fix | Delete
[1548] Fix | Delete
// Identify file format - loop through $format_info and detect with reg expr
[1549] Fix | Delete
foreach ($this->GetFileFormatArray() as $format_name => $info) {
[1550] Fix | Delete
// The /s switch on preg_match() forces preg_match() NOT to treat
[1551] Fix | Delete
// newline (0x0A) characters as special chars but do a binary match
[1552] Fix | Delete
if (!empty($info['pattern']) && preg_match('#'.$info['pattern'].'#s', $filedata)) {
[1553] Fix | Delete
$info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php';
[1554] Fix | Delete
return $info;
[1555] Fix | Delete
}
[1556] Fix | Delete
}
[1557] Fix | Delete
[1558] Fix | Delete
[1559] Fix | Delete
if (preg_match('#\\.mp[123a]$#i', $filename)) {
[1560] Fix | Delete
// Too many mp3 encoders on the market put garbage in front of mpeg files
[1561] Fix | Delete
// use assume format on these if format detection failed
[1562] Fix | Delete
$GetFileFormatArray = $this->GetFileFormatArray();
[1563] Fix | Delete
$info = $GetFileFormatArray['mp3'];
[1564] Fix | Delete
$info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php';
[1565] Fix | Delete
return $info;
[1566] Fix | Delete
} elseif (preg_match('#\\.mp[cp\\+]$#i', $filename) && preg_match('#[\x00\x01\x10\x11\x40\x41\x50\x51\x80\x81\x90\x91\xC0\xC1\xD0\xD1][\x20-37][\x00\x20\x40\x60\x80\xA0\xC0\xE0]#s', $filedata)) {
[1567] Fix | Delete
// old-format (SV4-SV6) Musepack header that has a very loose pattern match and could falsely match other data (e.g. corrupt mp3)
[1568] Fix | Delete
// only enable this pattern check if the filename ends in .mpc/mpp/mp+
[1569] Fix | Delete
$GetFileFormatArray = $this->GetFileFormatArray();
[1570] Fix | Delete
$info = $GetFileFormatArray['mpc'];
[1571] Fix | Delete
$info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php';
[1572] Fix | Delete
return $info;
[1573] Fix | Delete
} elseif (preg_match('#\\.cue$#i', $filename) && preg_match('#FILE "[^"]+" (BINARY|MOTOROLA|AIFF|WAVE|MP3)#', $filedata)) {
[1574] Fix | Delete
// there's not really a useful consistent "magic" at the beginning of .cue files to identify them
[1575] Fix | Delete
// so until I think of something better, just go by filename if all other format checks fail
[1576] Fix | Delete
// and verify there's at least one instance of "TRACK xx AUDIO" in the file
[1577] Fix | Delete
$GetFileFormatArray = $this->GetFileFormatArray();
[1578] Fix | Delete
$info = $GetFileFormatArray['cue'];
[1579] Fix | Delete
$info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php';
[1580] Fix | Delete
return $info;
[1581] Fix | Delete
}
[1582] Fix | Delete
[1583] Fix | Delete
return false;
[1584] Fix | Delete
}
[1585] Fix | Delete
[1586] Fix | Delete
/**
[1587] Fix | Delete
* Converts array to $encoding charset from $this->encoding.
[1588] Fix | Delete
*
[1589] Fix | Delete
* @param array $array
[1590] Fix | Delete
* @param string $encoding
[1591] Fix | Delete
*/
[1592] Fix | Delete
public function CharConvert(&$array, $encoding) {
[1593] Fix | Delete
[1594] Fix | Delete
// identical encoding - end here
[1595] Fix | Delete
if ($encoding == $this->encoding) {
[1596] Fix | Delete
return;
[1597] Fix | Delete
}
[1598] Fix | Delete
[1599] Fix | Delete
// loop thru array
[1600] Fix | Delete
foreach ($array as $key => $value) {
[1601] Fix | Delete
[1602] Fix | Delete
// go recursive
[1603] Fix | Delete
if (is_array($value)) {
[1604] Fix | Delete
$this->CharConvert($array[$key], $encoding);
[1605] Fix | Delete
}
[1606] Fix | Delete
[1607] Fix | Delete
// convert string
[1608] Fix | Delete
elseif (is_string($value)) {
[1609] Fix | Delete
$array[$key] = trim(getid3_lib::iconv_fallback($encoding, $this->encoding, $value));
[1610] Fix | Delete
}
[1611] Fix | Delete
}
[1612] Fix | Delete
}
[1613] Fix | Delete
[1614] Fix | Delete
/**
[1615] Fix | Delete
* @return bool
[1616] Fix | Delete
*/
[1617] Fix | Delete
public function HandleAllTags() {
[1618] Fix | Delete
[1619] Fix | Delete
// key name => array (tag name, character encoding)
[1620] Fix | Delete
static $tags;
[1621] Fix | Delete
if (empty($tags)) {
[1622] Fix | Delete
$tags = array(
[1623] Fix | Delete
'asf' => array('asf' , 'UTF-16LE'),
[1624] Fix | Delete
'midi' => array('midi' , 'ISO-8859-1'),
[1625] Fix | Delete
'nsv' => array('nsv' , 'ISO-8859-1'),
[1626] Fix | Delete
'ogg' => array('vorbiscomment' , 'UTF-8'),
[1627] Fix | Delete
'png' => array('png' , 'UTF-8'),
[1628] Fix | Delete
'tiff' => array('tiff' , 'ISO-8859-1'),
[1629] Fix | Delete
'quicktime' => array('quicktime' , 'UTF-8'),
[1630] Fix | Delete
'real' => array('real' , 'ISO-8859-1'),
[1631] Fix | Delete
'vqf' => array('vqf' , 'ISO-8859-1'),
[1632] Fix | Delete
'zip' => array('zip' , 'ISO-8859-1'),
[1633] Fix | Delete
'riff' => array('riff' , 'ISO-8859-1'),
[1634] Fix | Delete
'lyrics3' => array('lyrics3' , 'ISO-8859-1'),
[1635] Fix | Delete
'id3v1' => array('id3v1' , $this->encoding_id3v1),
[1636] Fix | Delete
'id3v2' => array('id3v2' , 'UTF-8'), // not according to the specs (every frame can have a different encoding), but getID3() force-converts all encodings to UTF-8
[1637] Fix | Delete
'ape' => array('ape' , 'UTF-8'),
[1638] Fix | Delete
'cue' => array('cue' , 'ISO-8859-1'),
[1639] Fix | Delete
'matroska' => array('matroska' , 'UTF-8'),
[1640] Fix | Delete
'flac' => array('vorbiscomment' , 'UTF-8'),
[1641] Fix | Delete
'divxtag' => array('divx' , 'ISO-8859-1'),
[1642] Fix | Delete
'iptc' => array('iptc' , 'ISO-8859-1'),
[1643] Fix | Delete
'dsdiff' => array('dsdiff' , 'ISO-8859-1'),
[1644] Fix | Delete
);
[1645] Fix | Delete
}
[1646] Fix | Delete
[1647] Fix | Delete
// loop through comments array
[1648] Fix | Delete
foreach ($tags as $comment_name => $tagname_encoding_array) {
[1649] Fix | Delete
list($tag_name, $encoding) = $tagname_encoding_array;
[1650] Fix | Delete
[1651] Fix | Delete
// fill in default encoding type if not already present
[1652] Fix | Delete
if (isset($this->info[$comment_name]) && !isset($this->info[$comment_name]['encoding'])) {
[1653] Fix | Delete
$this->info[$comment_name]['encoding'] = $encoding;
[1654] Fix | Delete
}
[1655] Fix | Delete
[1656] Fix | Delete
// copy comments if key name set
[1657] Fix | Delete
if (!empty($this->info[$comment_name]['comments'])) {
[1658] Fix | Delete
foreach ($this->info[$comment_name]['comments'] as $tag_key => $valuearray) {
[1659] Fix | Delete
foreach ($valuearray as $key => $value) {
[1660] Fix | Delete
if (is_string($value)) {
[1661] Fix | Delete
$value = trim($value, " \r\n\t"); // do not trim nulls from $value!! Unicode characters will get mangled if trailing nulls are removed!
[1662] Fix | Delete
}
[1663] Fix | Delete
if (isset($value) && $value !== "") {
[1664] Fix | Delete
if (!is_numeric($key)) {
[1665] Fix | Delete
$this->info['tags'][trim($tag_name)][trim($tag_key)][$key] = $value;
[1666] Fix | Delete
} else {
[1667] Fix | Delete
$this->info['tags'][trim($tag_name)][trim($tag_key)][] = $value;
[1668] Fix | Delete
}
[1669] Fix | Delete
}
[1670] Fix | Delete
}
[1671] Fix | Delete
if ($tag_key == 'picture') {
[1672] Fix | Delete
// pictures can take up a lot of space, and we don't need multiple copies of them; let there be a single copy in [comments][picture], and not elsewhere
[1673] Fix | Delete
unset($this->info[$comment_name]['comments'][$tag_key]);
[1674] Fix | Delete
}
[1675] Fix | Delete
}
[1676] Fix | Delete
[1677] Fix | Delete
if (!isset($this->info['tags'][$tag_name])) {
[1678] Fix | Delete
// comments are set but contain nothing but empty strings, so skip
[1679] Fix | Delete
continue;
[1680] Fix | Delete
}
[1681] Fix | Delete
[1682] Fix | Delete
$this->CharConvert($this->info['tags'][$tag_name], $this->info[$comment_name]['encoding']); // only copy gets converted!
[1683] Fix | Delete
[1684] Fix | Delete
if ($this->option_tags_html) {
[1685] Fix | Delete
foreach ($this->info['tags'][$tag_name] as $tag_key => $valuearray) {
[1686] Fix | Delete
if ($tag_key == 'picture') {
[1687] Fix | Delete
// Do not to try to convert binary picture data to HTML
[1688] Fix | Delete
// https://github.com/JamesHeinrich/getID3/issues/178
[1689] Fix | Delete
continue;
[1690] Fix | Delete
}
[1691] Fix | Delete
$this->info['tags_html'][$tag_name][$tag_key] = getid3_lib::recursiveMultiByteCharString2HTML($valuearray, $this->info[$comment_name]['encoding']);
[1692] Fix | Delete
}
[1693] Fix | Delete
}
[1694] Fix | Delete
[1695] Fix | Delete
}
[1696] Fix | Delete
[1697] Fix | Delete
}
[1698] Fix | Delete
[1699] Fix | Delete
// pictures can take up a lot of space, and we don't need multiple copies of them; let there be a single copy in [comments][picture], and not elsewhere
[1700] Fix | Delete
if (!empty($this->info['tags'])) {
[1701] Fix | Delete
$unset_keys = array('tags', 'tags_html');
[1702] Fix | Delete
foreach ($this->info['tags'] as $tagtype => $tagarray) {
[1703] Fix | Delete
foreach ($tagarray as $tagname => $tagdata) {
[1704] Fix | Delete
if ($tagname == 'picture') {
[1705] Fix | Delete
foreach ($tagdata as $key => $tagarray) {
[1706] Fix | Delete
$this->info['comments']['picture'][] = $tagarray;
[1707] Fix | Delete
if (isset($tagarray['data']) && isset($tagarray['image_mime'])) {
[1708] Fix | Delete
if (isset($this->info['tags'][$tagtype][$tagname][$key])) {
[1709] Fix | Delete
unset($this->info['tags'][$tagtype][$tagname][$key]);
[1710] Fix | Delete
}
[1711] Fix | Delete
if (isset($this->info['tags_html'][$tagtype][$tagname][$key])) {
[1712] Fix | Delete
unset($this->info['tags_html'][$tagtype][$tagname][$key]);
[1713] Fix | Delete
}
[1714] Fix | Delete
}
[1715] Fix | Delete
}
[1716] Fix | Delete
}
[1717] Fix | Delete
}
[1718] Fix | Delete
foreach ($unset_keys as $unset_key) {
[1719] Fix | Delete
// remove possible empty keys from (e.g. [tags][id3v2][picture])
[1720] Fix | Delete
if (empty($this->info[$unset_key][$tagtype]['picture'])) {
[1721] Fix | Delete
unset($this->info[$unset_key][$tagtype]['picture']);
[1722] Fix | Delete
}
[1723] Fix | Delete
if (empty($this->info[$unset_key][$tagtype])) {
[1724] Fix | Delete
unset($this->info[$unset_key][$tagtype]);
[1725] Fix | Delete
}
[1726] Fix | Delete
if (empty($this->info[$unset_key])) {
[1727] Fix | Delete
unset($this->info[$unset_key]);
[1728] Fix | Delete
}
[1729] Fix | Delete
}
[1730] Fix | Delete
// remove duplicate copy of picture data from (e.g. [id3v2][comments][picture])
[1731] Fix | Delete
if (isset($this->info[$tagtype]['comments']['picture'])) {
[1732] Fix | Delete
unset($this->info[$tagtype]['comments']['picture']);
[1733] Fix | Delete
}
[1734] Fix | Delete
if (empty($this->info[$tagtype]['comments'])) {
[1735] Fix | Delete
unset($this->info[$tagtype]['comments']);
[1736] Fix | Delete
}
[1737] Fix | Delete
if (empty($this->info[$tagtype])) {
[1738] Fix | Delete
unset($this->info[$tagtype]);
[1739] Fix | Delete
}
[1740] Fix | Delete
}
[1741] Fix | Delete
}
[1742] Fix | Delete
return true;
[1743] Fix | Delete
}
[1744] Fix | Delete
[1745] Fix | Delete
/**
[1746] Fix | Delete
* Calls getid3_lib::CopyTagsToComments() but passes in the option_tags_html setting from this instance of getID3
[1747] Fix | Delete
*
[1748] Fix | Delete
* @param array $ThisFileInfo
[1749] Fix | Delete
*
[1750] Fix | Delete
* @return bool
[1751] Fix | Delete
*/
[1752] Fix | Delete
public function CopyTagsToComments(&$ThisFileInfo) {
[1753] Fix | Delete
return getid3_lib::CopyTagsToComments($ThisFileInfo, $this->option_tags_html);
[1754] Fix | Delete
}
[1755] Fix | Delete
[1756] Fix | Delete
/**
[1757] Fix | Delete
* @param string $algorithm
[1758] Fix | Delete
*
[1759] Fix | Delete
* @return array|bool
[1760] Fix | Delete
*/
[1761] Fix | Delete
public function getHashdata($algorithm) {
[1762] Fix | Delete
switch ($algorithm) {
[1763] Fix | Delete
case 'md5':
[1764] Fix | Delete
case 'sha1':
[1765] Fix | Delete
break;
[1766] Fix | Delete
[1767] Fix | Delete
default:
[1768] Fix | Delete
return $this->error('bad algorithm "'.$algorithm.'" in getHashdata()');
[1769] Fix | Delete
}
[1770] Fix | Delete
[1771] Fix | Delete
if (!empty($this->info['fileformat']) && !empty($this->info['dataformat']) && ($this->info['fileformat'] == 'ogg') && ($this->info['audio']['dataformat'] == 'vorbis')) {
[1772] Fix | Delete
[1773] Fix | Delete
// We cannot get an identical md5_data value for Ogg files where the comments
[1774] Fix | Delete
// span more than 1 Ogg page (compared to the same audio data with smaller
[1775] Fix | Delete
// comments) using the normal getID3() method of MD5'ing the data between the
[1776] Fix | Delete
// end of the comments and the end of the file (minus any trailing tags),
[1777] Fix | Delete
// because the page sequence numbers of the pages that the audio data is on
[1778] Fix | Delete
// do not match. Under normal circumstances, where comments are smaller than
[1779] Fix | Delete
// the nominal 4-8kB page size, then this is not a problem, but if there are
[1780] Fix | Delete
// very large comments, the only way around it is to strip off the comment
[1781] Fix | Delete
// tags with vorbiscomment and MD5 that file.
[1782] Fix | Delete
// This procedure must be applied to ALL Ogg files, not just the ones with
[1783] Fix | Delete
// comments larger than 1 page, because the below method simply MD5's the
[1784] Fix | Delete
// whole file with the comments stripped, not just the portion after the
[1785] Fix | Delete
// comments block (which is the standard getID3() method.
[1786] Fix | Delete
[1787] Fix | Delete
// The above-mentioned problem of comments spanning multiple pages and changing
[1788] Fix | Delete
// page sequence numbers likely happens for OggSpeex and OggFLAC as well, but
[1789] Fix | Delete
// currently vorbiscomment only works on OggVorbis files.
[1790] Fix | Delete
[1791] Fix | Delete
// phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.safe_modeDeprecatedRemoved
[1792] Fix | Delete
if (preg_match('#(1|ON)#i', ini_get('safe_mode'))) {
[1793] Fix | Delete
[1794] Fix | Delete
$this->warning('Failed making system call to vorbiscomment.exe - '.$algorithm.'_data is incorrect - error returned: PHP running in Safe Mode (backtick operator not available)');
[1795] Fix | Delete
$this->info[$algorithm.'_data'] = false;
[1796] Fix | Delete
[1797] Fix | Delete
} else {
[1798] Fix | Delete
[1799] Fix | Delete
// Prevent user from aborting script
[1800] Fix | Delete
$old_abort = ignore_user_abort(true);
[1801] Fix | Delete
[1802] Fix | Delete
// Create empty file
[1803] Fix | Delete
$empty = tempnam(GETID3_TEMP_DIR, 'getID3');
[1804] Fix | Delete
touch($empty);
[1805] Fix | Delete
[1806] Fix | Delete
// Use vorbiscomment to make temp file without comments
[1807] Fix | Delete
$temp = tempnam(GETID3_TEMP_DIR, 'getID3');
[1808] Fix | Delete
$file = $this->info['filenamepath'];
[1809] Fix | Delete
[1810] Fix | Delete
if (GETID3_OS_ISWINDOWS) {
[1811] Fix | Delete
[1812] Fix | Delete
if (file_exists(GETID3_HELPERAPPSDIR.'vorbiscomment.exe')) {
[1813] Fix | Delete
[1814] Fix | Delete
$commandline = '"'.GETID3_HELPERAPPSDIR.'vorbiscomment.exe" -w -c "'.$empty.'" "'.$file.'" "'.$temp.'"';
[1815] Fix | Delete
$VorbisCommentError = `$commandline`;
[1816] Fix | Delete
[1817] Fix | Delete
} else {
[1818] Fix | Delete
[1819] Fix | Delete
$VorbisCommentError = 'vorbiscomment.exe not found in '.GETID3_HELPERAPPSDIR;
[1820] Fix | Delete
[1821] Fix | Delete
}
[1822] Fix | Delete
[1823] Fix | Delete
} else {
[1824] Fix | Delete
[1825] Fix | Delete
$commandline = 'vorbiscomment -w -c '.escapeshellarg($empty).' '.escapeshellarg($file).' '.escapeshellarg($temp).' 2>&1';
[1826] Fix | Delete
$VorbisCommentError = `$commandline`;
[1827] Fix | Delete
[1828] Fix | Delete
}
[1829] Fix | Delete
[1830] Fix | Delete
if (!empty($VorbisCommentError)) {
[1831] Fix | Delete
[1832] Fix | Delete
$this->warning('Failed making system call to vorbiscomment(.exe) - '.$algorithm.'_data will be incorrect. If vorbiscomment is unavailable, please download from http://www.vorbis.com/download.psp and put in the getID3() directory. Error returned: '.$VorbisCommentError);
[1833] Fix | Delete
$this->info[$algorithm.'_data'] = false;
[1834] Fix | Delete
[1835] Fix | Delete
} else {
[1836] Fix | Delete
[1837] Fix | Delete
// Get hash of newly created file
[1838] Fix | Delete
switch ($algorithm) {
[1839] Fix | Delete
case 'md5':
[1840] Fix | Delete
$this->info[$algorithm.'_data'] = md5_file($temp);
[1841] Fix | Delete
break;
[1842] Fix | Delete
[1843] Fix | Delete
case 'sha1':
[1844] Fix | Delete
$this->info[$algorithm.'_data'] = sha1_file($temp);
[1845] Fix | Delete
break;
[1846] Fix | Delete
}
[1847] Fix | Delete
}
[1848] Fix | Delete
[1849] Fix | Delete
// Clean up
[1850] Fix | Delete
unlink($empty);
[1851] Fix | Delete
unlink($temp);
[1852] Fix | Delete
[1853] Fix | Delete
// Reset abort setting
[1854] Fix | Delete
ignore_user_abort($old_abort);
[1855] Fix | Delete
[1856] Fix | Delete
}
[1857] Fix | Delete
[1858] Fix | Delete
} else {
[1859] Fix | Delete
[1860] Fix | Delete
if (!empty($this->info['avdataoffset']) || (isset($this->info['avdataend']) && ($this->info['avdataend'] < $this->info['filesize']))) {
[1861] Fix | Delete
[1862] Fix | Delete
// get hash from part of file
[1863] Fix | Delete
$this->info[$algorithm.'_data'] = getid3_lib::hash_data($this->info['filenamepath'], $this->info['avdataoffset'], $this->info['avdataend'], $algorithm);
[1864] Fix | Delete
[1865] Fix | Delete
} else {
[1866] Fix | Delete
[1867] Fix | Delete
// get hash from whole file
[1868] Fix | Delete
switch ($algorithm) {
[1869] Fix | Delete
case 'md5':
[1870] Fix | Delete
$this->info[$algorithm.'_data'] = md5_file($this->info['filenamepath']);
[1871] Fix | Delete
break;
[1872] Fix | Delete
[1873] Fix | Delete
case 'sha1':
[1874] Fix | Delete
$this->info[$algorithm.'_data'] = sha1_file($this->info['filenamepath']);
[1875] Fix | Delete
break;
[1876] Fix | Delete
}
[1877] Fix | Delete
}
[1878] Fix | Delete
[1879] Fix | Delete
}
[1880] Fix | Delete
return true;
[1881] Fix | Delete
}
[1882] Fix | Delete
[1883] Fix | Delete
public function ChannelsBitratePlaytimeCalculations() {
[1884] Fix | Delete
[1885] Fix | Delete
// set channelmode on audio
[1886] Fix | Delete
if (!empty($this->info['audio']['channelmode']) || !isset($this->info['audio']['channels'])) {
[1887] Fix | Delete
// ignore
[1888] Fix | Delete
} elseif ($this->info['audio']['channels'] == 1) {
[1889] Fix | Delete
$this->info['audio']['channelmode'] = 'mono';
[1890] Fix | Delete
} elseif ($this->info['audio']['channels'] == 2) {
[1891] Fix | Delete
$this->info['audio']['channelmode'] = 'stereo';
[1892] Fix | Delete
}
[1893] Fix | Delete
[1894] Fix | Delete
// Calculate combined bitrate - audio + video
[1895] Fix | Delete
$CombinedBitrate = 0;
[1896] Fix | Delete
$CombinedBitrate += (isset($this->info['audio']['bitrate']) ? $this->info['audio']['bitrate'] : 0);
[1897] Fix | Delete
$CombinedBitrate += (isset($this->info['video']['bitrate']) ? $this->info['video']['bitrate'] : 0);
[1898] Fix | Delete
if (($CombinedBitrate > 0) && empty($this->info['bitrate'])) {
[1899] Fix | Delete
$this->info['bitrate'] = $CombinedBitrate;
[1900] Fix | Delete
}
[1901] Fix | Delete
//if ((isset($this->info['video']) && !isset($this->info['video']['bitrate'])) || (isset($this->info['audio']) && !isset($this->info['audio']['bitrate']))) {
[1902] Fix | Delete
// // for example, VBR MPEG video files cannot determine video bitrate:
[1903] Fix | Delete
// // should not set overall bitrate and playtime from audio bitrate only
[1904] Fix | Delete
// unset($this->info['bitrate']);
[1905] Fix | Delete
//}
[1906] Fix | Delete
[1907] Fix | Delete
// video bitrate undetermined, but calculable
[1908] Fix | Delete
if (isset($this->info['video']['dataformat']) && $this->info['video']['dataformat'] && (!isset($this->info['video']['bitrate']) || ($this->info['video']['bitrate'] == 0))) {
[1909] Fix | Delete
// if video bitrate not set
[1910] Fix | Delete
if (isset($this->info['audio']['bitrate']) && ($this->info['audio']['bitrate'] > 0) && ($this->info['audio']['bitrate'] == $this->info['bitrate'])) {
[1911] Fix | Delete
// AND if audio bitrate is set to same as overall bitrate
[1912] Fix | Delete
if (isset($this->info['playtime_seconds']) && ($this->info['playtime_seconds'] > 0)) {
[1913] Fix | Delete
// AND if playtime is set
[1914] Fix | Delete
if (isset($this->info['avdataend']) && isset($this->info['avdataoffset'])) {
[1915] Fix | Delete
// AND if AV data offset start/end is known
[1916] Fix | Delete
// THEN we can calculate the video bitrate
[1917] Fix | Delete
$this->info['bitrate'] = round((($this->info['avdataend'] - $this->info['avdataoffset']) * 8) / $this->info['playtime_seconds']);
[1918] Fix | Delete
$this->info['video']['bitrate'] = $this->info['bitrate'] - $this->info['audio']['bitrate'];
[1919] Fix | Delete
}
[1920] Fix | Delete
}
[1921] Fix | Delete
}
[1922] Fix | Delete
}
[1923] Fix | Delete
[1924] Fix | Delete
if ((!isset($this->info['playtime_seconds']) || ($this->info['playtime_seconds'] <= 0)) && !empty($this->info['bitrate'])) {
[1925] Fix | Delete
$this->info['playtime_seconds'] = (($this->info['avdataend'] - $this->info['avdataoffset']) * 8) / $this->info['bitrate'];
[1926] Fix | Delete
}
[1927] Fix | Delete
[1928] Fix | Delete
if (!isset($this->info['bitrate']) && !empty($this->info['playtime_seconds'])) {
[1929] Fix | Delete
$this->info['bitrate'] = (($this->info['avdataend'] - $this->info['avdataoffset']) * 8) / $this->info['playtime_seconds'];
[1930] Fix | Delete
}
[1931] Fix | Delete
if (isset($this->info['bitrate']) && empty($this->info['audio']['bitrate']) && empty($this->info['video']['bitrate'])) {
[1932] Fix | Delete
if (isset($this->info['audio']['dataformat']) && empty($this->info['video']['resolution_x'])) {
[1933] Fix | Delete
// audio only
[1934] Fix | Delete
$this->info['audio']['bitrate'] = $this->info['bitrate'];
[1935] Fix | Delete
} elseif (isset($this->info['video']['resolution_x']) && empty($this->info['audio']['dataformat'])) {
[1936] Fix | Delete
// video only
[1937] Fix | Delete
$this->info['video']['bitrate'] = $this->info['bitrate'];
[1938] Fix | Delete
}
[1939] Fix | Delete
}
[1940] Fix | Delete
[1941] Fix | Delete
// Set playtime string
[1942] Fix | Delete
if (!empty($this->info['playtime_seconds']) && empty($this->info['playtime_string'])) {
[1943] Fix | Delete
$this->info['playtime_string'] = getid3_lib::PlaytimeString($this->info['playtime_seconds']);
[1944] Fix | Delete
}
[1945] Fix | Delete
}
[1946] Fix | Delete
[1947] Fix | Delete
/**
[1948] Fix | Delete
* @return bool
[1949] Fix | Delete
*/
[1950] Fix | Delete
public function CalculateCompressionRatioVideo() {
[1951] Fix | Delete
if (empty($this->info['video'])) {
[1952] Fix | Delete
return false;
[1953] Fix | Delete
}
[1954] Fix | Delete
if (empty($this->info['video']['resolution_x']) || empty($this->info['video']['resolution_y'])) {
[1955] Fix | Delete
return false;
[1956] Fix | Delete
}
[1957] Fix | Delete
if (empty($this->info['video']['bits_per_sample'])) {
[1958] Fix | Delete
return false;
[1959] Fix | Delete
}
[1960] Fix | Delete
[1961] Fix | Delete
switch ($this->info['video']['dataformat']) {
[1962] Fix | Delete
case 'bmp':
[1963] Fix | Delete
case 'gif':
[1964] Fix | Delete
case 'jpeg':
[1965] Fix | Delete
case 'jpg':
[1966] Fix | Delete
case 'png':
[1967] Fix | Delete
case 'tiff':
[1968] Fix | Delete
$FrameRate = 1;
[1969] Fix | Delete
$PlaytimeSeconds = 1;
[1970] Fix | Delete
$BitrateCompressed = $this->info['filesize'] * 8;
[1971] Fix | Delete
break;
[1972] Fix | Delete
[1973] Fix | Delete
default:
[1974] Fix | Delete
if (!empty($this->info['video']['frame_rate'])) {
[1975] Fix | Delete
$FrameRate = $this->info['video']['frame_rate'];
[1976] Fix | Delete
} else {
[1977] Fix | Delete
return false;
[1978] Fix | Delete
}
[1979] Fix | Delete
if (!empty($this->info['playtime_seconds'])) {
[1980] Fix | Delete
$PlaytimeSeconds = $this->info['playtime_seconds'];
[1981] Fix | Delete
} else {
[1982] Fix | Delete
return false;
[1983] Fix | Delete
}
[1984] Fix | Delete
if (!empty($this->info['video']['bitrate'])) {
[1985] Fix | Delete
$BitrateCompressed = $this->info['video']['bitrate'];
[1986] Fix | Delete
} else {
[1987] Fix | Delete
return false;
[1988] Fix | Delete
}
[1989] Fix | Delete
break;
[1990] Fix | Delete
}
[1991] Fix | Delete
$BitrateUncompressed = $this->info['video']['resolution_x'] * $this->info['video']['resolution_y'] * $this->info['video']['bits_per_sample'] * $FrameRate;
[1992] Fix | Delete
[1993] Fix | Delete
$this->info['video']['compression_ratio'] = getid3_lib::SafeDiv($BitrateCompressed, $BitrateUncompressed, 1);
[1994] Fix | Delete
return true;
[1995] Fix | Delete
}
[1996] Fix | Delete
[1997] Fix | Delete
/**
[1998] Fix | Delete
* @return bool
[1999] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function