function array_join_merge($arr1, $arr2) { // written by dev-null@christophe.vg // taken from http://www.php.net/manual/en/function.array-merge-recursive.php if (is_array($arr1) && is_array($arr2)) { // the same -> merge $new_array = array(); if (is_hash($arr1) && is_hash($arr2)) { // hashes -> merge based on keys $keys = array_merge(array_keys($arr1), array_keys($arr2)); foreach ($keys as $key) { $new_array[$key] = array_join_merge(@$arr1[$key], @$arr2[$key]); } } else { // two real arrays -> merge $new_array = array_reverse(array_unique(array_reverse(array_merge($arr1, $arr2)))); } return $new_array; } else { // not the same ... take new one if defined, else the old one stays return $arr2 ? $arr2 : $arr1; } }
function setActionEnabling($componentName, $actions) { $this->data[$componentName]['actions'] = array_join_merge($this->data[$componentName]['actions'], $actions); }
function WriteID3v2($filename, $data, $majorversion = 4, $minorversion = 0, $overwrite = FALSE, $paddedlength = 0, $showerrors = FALSE) { // File MUST be writeable - CHMOD(646) at least. It's best if the // directory is also writeable, because that method is both faster and less susceptible to errors. if (is_writeable($filename) || !file_exists($filename) && is_writeable(dirname($filename))) { $OldMP3fileInfo = GetAllMP3info($filename); if ($overwrite) { // ignore previous data } else { // merge with existing data $data = array_join_merge($OldMP3fileInfo, $data); $paddedlength = max($OldMP3fileInfo['id3']['id3v2']['headerlength'], $paddedlength); } if ($NewID3v2Tag = GenerateID3v2Tag($data['id3']['id3v2'], $majorversion, $minorversion, $paddedlength, '', FALSE, $showerrors, TRUE)) { if (!file_exists($filename) && is_writeable(dirname($filename)) || is_writeable($filename) && $OldMP3fileInfo['id3']['id3v2']['headerlength'] == strlen($NewID3v2Tag)) { // best and fastest method - insert-overwrite existing tag (padded to length of old tag if neccesary) if (file_exists($filename)) { if ($fp = @fopen($filename, 'r+b')) { rewind($fp); fwrite($fp, $NewID3v2Tag, strlen($NewID3v2Tag)); fclose($fp); } else { $error .= 'Could not open ' . $filename . ' mode "r+b"<BR>'; } } else { if ($fp = @fopen($filename, 'wb')) { rewind($fp); fwrite($fp, $NewID3v2Tag, strlen($NewID3v2Tag)); fclose($fp); } else { $error .= 'Could not open ' . $filename . ' mode "wb"<BR>'; } } } else { // new tag is longer than old tag - must rewrite entire file if (is_writeable(dirname($filename))) { // preferred alternate method - only one copying operation, minimal chance of corrupting // original file if script is interrupted, but required directory to be writeable if ($OldMP3fileInfo['audiobytes'] > 0) { if ($fp_source = @fopen($filename, 'rb')) { rewind($fp_source); if ($OldMP3fileInfo['audiodataoffset'] !== FALSE) { fseek($fp_source, $OldMP3fileInfo['audiodataoffset'], SEEK_SET); } if ($fp_temp = @fopen($filename . 'getid3tmp', 'wb')) { fwrite($fp_temp, $NewID3v2Tag, strlen($NewID3v2Tag)); // while (($buffer = fread($fp_source, FREAD_BUFFER_SIZE)) !== FALSE) { while ($buffer = fread($fp_source, FREAD_BUFFER_SIZE)) { fwrite($fp_temp, $buffer, strlen($buffer)); } fclose($fp_temp); } else { $error .= 'Could not open ' . $filename . 'getid3tmp mode "wb"<BR>'; } fclose($fp_source); } else { // no previous audiodata if ($fp_temp = @fopen($filename . 'getid3tmp', 'wb')) { fwrite($fp_temp, $NewID3v2Tag, strlen($NewID3v2Tag)); fclose($fp_temp); } } } else { $error .= 'Could not open ' . $filename . ' mode "rb"<BR>'; } if (file_exists($filename)) { unlink($filename); } rename($filename . 'getid3tmp', $filename); } else { // less desirable alternate method - double-copies the file, overwrites original file // and could corrupt source file if the script is interrupted or an error occurs. if ($fp_source = @fopen($filename, 'rb')) { rewind($fp_source); if ($OldMP3fileInfo['audiodataoffset'] !== FALSE) { fseek($fp_source, $OldMP3fileInfo['audiodataoffset'], SEEK_SET); } if ($fp_temp = tmpfile()) { fwrite($fp_temp, $NewID3v2Tag, strlen($NewID3v2Tag)); // while (($buffer = fread($fp_source, FREAD_BUFFER_SIZE)) !== FALSE) { while ($buffer = fread($fp_source, FREAD_BUFFER_SIZE)) { fwrite($fp_temp, $buffer, strlen($buffer)); } fclose($fp_source); if ($fp_source = @fopen($filename, 'wb')) { rewind($fp_temp); // while (($buffer = fread($fp_temp, FREAD_BUFFER_SIZE)) !== FALSE) { while ($buffer = fread($fp_temp, FREAD_BUFFER_SIZE)) { fwrite($fp_source, $buffer, strlen($buffer)); } fseek($fp_temp, -128, SEEK_END); fclose($fp_source); } else { $error .= 'Could not open ' . $filename . ' mode "wb"<BR>'; } fclose($fp_temp); } else { $error .= 'Could not create tmpfile()<BR>'; } } else { $error .= 'Could not open ' . $filename . ' mode "rb"<BR>'; } } } } else { $error .= 'GenerateID3v2Tag() failed<BR>'; } if ($error) { if ($showerrors) { echo $error; } return FALSE; } else { return TRUE; } } else { return FALSE; } }
function WriteID3v2($filename, $data, $majorversion = 3, $minorversion = 0, $overwrite = false, $paddedlength = 4096, $showerrors = true) { // File MUST be writeable - CHMOD(646) at least. It's best if the // directory is also writeable, because that method is both faster and less susceptible to errors. $error = ''; if (is_writeable($filename) || !file_exists($filename) && is_writeable(dirname($filename))) { $OldThisfileInfo = GetAllFileInfo($filename); if ($overwrite) { // ignore previous data } else { // merge with existing data $data = array_join_merge($OldThisfileInfo, $data); $paddedlength = max($OldThisfileInfo['id3v2']['headerlength'], $paddedlength); } if ($NewID3v2Tag = GenerateID3v2Tag($data['id3v2'], $majorversion, $minorversion, $paddedlength, '', false, $showerrors, true)) { if (!file_exists($filename) && is_writeable(dirname($filename)) || is_writeable($filename) && isset($OldThisfileInfo['id3v2']['headerlength']) && $OldThisfileInfo['id3v2']['headerlength'] == strlen($NewID3v2Tag)) { // best and fastest method - insert-overwrite existing tag (padded to length of old tag if neccesary) if (file_exists($filename)) { ob_start(); if ($fp = fopen($filename, 'r+b')) { rewind($fp); fwrite($fp, $NewID3v2Tag, strlen($NewID3v2Tag)); fclose($fp); } else { $error .= 'Could not open ' . $filename . ' mode "r+b" - ' . strip_tags(ob_get_contents()) . '<BR>'; } ob_end_clean(); } else { ob_start(); if ($fp = fopen($filename, 'wb')) { rewind($fp); fwrite($fp, $NewID3v2Tag, strlen($NewID3v2Tag)); fclose($fp); } else { $error .= 'Could not open ' . $filename . ' mode "wb" - ' . strip_tags(ob_get_contents()) . '<BR>'; } ob_end_clean(); } } else { if ($tempfilename = tempnam('/tmp', 'getID3')) { ob_start(); if ($fp_source = fopen($filename, 'rb')) { if ($fp_temp = fopen($tempfilename, 'wb')) { fwrite($fp_temp, $NewID3v2Tag, strlen($NewID3v2Tag)); rewind($fp_source); if (!empty($OldThisfileInfo['avdataoffset'])) { fseek($fp_source, $OldThisfileInfo['avdataoffset'], SEEK_SET); } while ($buffer = fread($fp_source, FREAD_BUFFER_SIZE)) { fwrite($fp_temp, $buffer, strlen($buffer)); } fclose($fp_temp); fclose($fp_source); copy($tempfilename, $filename); unlink($tempfilename); return true; } else { $error .= 'Could not open ' . $tempfilename . ' mode "wb" - ' . strip_tags(ob_get_contents()) . '<BR>'; } fclose($fp_source); } else { $error .= 'Could not open ' . $filename . ' mode "rb" - ' . strip_tags(ob_get_contents()) . '<BR>'; } ob_end_clean(); } if ($error) { if ($showerrors) { echo $error; } } return false; } } else { $error .= 'GenerateID3v2Tag() failed<BR>'; } if ($error) { if ($showerrors) { echo $error; } return false; } return true; } return false; }