From e4bf8210ca7600cda58362e9284327fa21bb3ba9 Mon Sep 17 00:00:00 2001 From: Richard Steinmetz Date: Tue, 16 Nov 2021 12:51:06 +0100 Subject: [PATCH] Improve compatibility with PHP v8 Fix https://github.com/ChristophWurst/ID3Parser/issues/7 Pull in changes from - https://github.com/JamesHeinrich/getID3/commit/4e5bcaf39eaa033e21e722c8788dcaa3d71c8b3a - https://github.com/JamesHeinrich/getID3/commit/0bc9aca9bb7fda128511cc2c038d7bab178cbc37 Ref https://github.com/JamesHeinrich/getID3/issues/299 Signed-off-by: Richard Steinmetz --- src/getID3/Tags/getid3_id3v2.php | 19 ++++++++----------- src/getID3/getid3_lib.php | 14 ++++++++++---- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/getID3/Tags/getid3_id3v2.php b/src/getID3/Tags/getid3_id3v2.php index a572e48..77812eb 100644 --- a/src/getID3/Tags/getid3_id3v2.php +++ b/src/getID3/Tags/getid3_id3v2.php @@ -1870,17 +1870,14 @@ public function ParseID3v2Frame(&$parsedFrame) { $frame_offset = 0; $parsedFrame['peakamplitude'] = getid3_lib::BigEndian2Float(substr($parsedFrame['data'], $frame_offset, 4)); $frame_offset += 4; - $rg_track_adjustment = getid3_lib::Dec2Bin(substr($parsedFrame['data'], $frame_offset, 2)); - $frame_offset += 2; - $rg_album_adjustment = getid3_lib::Dec2Bin(substr($parsedFrame['data'], $frame_offset, 2)); - $parsedFrame['raw']['track']['name'] = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 0, 3)); - $parsedFrame['raw']['track']['originator'] = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 3, 3)); - $parsedFrame['raw']['track']['signbit'] = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 6, 1)); - $parsedFrame['raw']['track']['adjustment'] = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 7, 9)); - $parsedFrame['raw']['album']['name'] = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 0, 3)); - $parsedFrame['raw']['album']['originator'] = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 3, 3)); - $parsedFrame['raw']['album']['signbit'] = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 6, 1)); - $parsedFrame['raw']['album']['adjustment'] = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 7, 9)); + foreach (array('track','album') as $rgad_entry_type) { + $rg_adjustment_word = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); + $frame_offset += 2; + $parsedFrame['raw'][$rgad_entry_type]['name'] = ($rg_adjustment_word & 0xE000) >> 13; + $parsedFrame['raw'][$rgad_entry_type]['originator'] = ($rg_adjustment_word & 0x1C00) >> 10; + $parsedFrame['raw'][$rgad_entry_type]['signbit'] = ($rg_adjustment_word & 0x0200) >> 9; + $parsedFrame['raw'][$rgad_entry_type]['adjustment'] = ($rg_adjustment_word & 0x0100); + } $parsedFrame['track']['name'] = getid3_lib::RGADnameLookup($parsedFrame['raw']['track']['name']); $parsedFrame['track']['originator'] = getid3_lib::RGADoriginatorLookup($parsedFrame['raw']['track']['originator']); $parsedFrame['track']['adjustment'] = getid3_lib::RGADadjustmentLookup($parsedFrame['raw']['track']['adjustment'], $parsedFrame['raw']['track']['signbit']); diff --git a/src/getID3/getid3_lib.php b/src/getID3/getid3_lib.php index 4260f0f..4d2eaf8 100644 --- a/src/getID3/getid3_lib.php +++ b/src/getID3/getid3_lib.php @@ -295,14 +295,20 @@ public static function BigEndian2String($number, $minbytes=1, $synchsafe=false, public static function Dec2Bin($number) { + if (!is_numeric($number)) { + // https://github.com/JamesHeinrich/getID3/issues/299 + trigger_error('TypeError: Dec2Bin(): Argument #1 ($number) must be numeric, '.gettype($number).' given', E_USER_WARNING); + return ''; + } + $bytes = array(); while ($number >= 256) { - $bytes[] = (($number / 256) - (floor($number / 256))) * 256; + $bytes[] = (int) (($number / 256) - (floor($number / 256))) * 256; $number = floor($number / 256); } - $bytes[] = $number; + $bytes[] = (int) $number; $binstring = ''; - for ($i = 0; $i < count($bytes); $i++) { - $binstring = (($i == count($bytes) - 1) ? decbin($bytes[$i]) : str_pad(decbin($bytes[$i]), 8, '0', STR_PAD_LEFT)).$binstring; + foreach ($bytes as $i => $byte) { + $binstring = (($i == count($bytes) - 1) ? decbin($byte) : str_pad(decbin($byte), 8, '0', STR_PAD_LEFT)).$binstring; } return $binstring; }