function GenerateID3v2Tag($noerrorsonly = true) { $this->ID3v2FrameIsAllowed(null, ''); // clear static array in case this isn't the first call to $this->GenerateID3v2Tag() $tagstring = ''; if (is_array($this->tag_data)) { foreach ($this->tag_data as $frame_name => $frame_rawinputdata) { foreach ($frame_rawinputdata as $irrelevantindex => $source_data_array) { if (getid3_id3v2::IsValidID3v2FrameName($frame_name, $this->majorversion)) { unset($frame_length); unset($frame_flags); $frame_data = false; if ($this->ID3v2FrameIsAllowed($frame_name, $source_data_array)) { if ($frame_data = $this->GenerateID3v2FrameData($frame_name, $source_data_array)) { $FrameUnsynchronisation = false; if ($this->majorversion >= 4) { // frame-level unsynchronisation $unsynchdata = $frame_data; if ($this->id3v2_use_unsynchronisation) { $unsynchdata = $this->Unsynchronise($frame_data); } if (strlen($unsynchdata) != strlen($frame_data)) { // unsynchronisation needed $FrameUnsynchronisation = true; $frame_data = $unsynchdata; if (isset($TagUnsynchronisation) && $TagUnsynchronisation === false) { // only set to true if ALL frames are unsynchronised } else { $TagUnsynchronisation = true; } } else { if (isset($TagUnsynchronisation)) { $TagUnsynchronisation = false; } } unset($unsynchdata); $frame_length = getid3_lib::BigEndian2String(strlen($frame_data), 4, true); } else { $frame_length = getid3_lib::BigEndian2String(strlen($frame_data), 4, false); } $frame_flags = $this->GenerateID3v2FrameFlags($this->ID3v2FrameFlagsLookupTagAlter($frame_name), $this->ID3v2FrameFlagsLookupFileAlter($frame_name), false, false, false, false, $FrameUnsynchronisation, false); } } else { $this->errors[] = 'Frame "' . $frame_name . '" is NOT allowed'; } if ($frame_data === false) { $this->errors[] = '$this->GenerateID3v2FrameData() failed for "' . $frame_name . '"'; if ($noerrorsonly) { return false; } else { unset($frame_name); } } } else { // ignore any invalid frame names, including 'title', 'header', etc $this->warnings[] = 'Ignoring invalid ID3v2 frame type: "' . $frame_name . '"'; unset($frame_name); unset($frame_length); unset($frame_flags); unset($frame_data); } if (isset($frame_name) && isset($frame_length) && isset($frame_flags) && isset($frame_data)) { $tagstring .= $frame_name . $frame_length . $frame_flags . $frame_data; } } } if (!isset($TagUnsynchronisation)) { $TagUnsynchronisation = false; } if ($this->majorversion <= 3 && $this->id3v2_use_unsynchronisation) { // tag-level unsynchronisation $unsynchdata = $this->Unsynchronise($tagstring); if (strlen($unsynchdata) != strlen($tagstring)) { // unsynchronisation needed $TagUnsynchronisation = true; $tagstring = $unsynchdata; } } while ($this->paddedlength < strlen($tagstring) + getid3_id3v2::ID3v2HeaderLength($this->majorversion)) { $this->paddedlength += 1024; } $footer = false; // ID3v2 footers not yet supported in getID3() if (!$footer && $this->paddedlength > strlen($tagstring) + getid3_id3v2::ID3v2HeaderLength($this->majorversion)) { // pad up to $paddedlength bytes if unpadded tag is shorter than $paddedlength // "Furthermore it MUST NOT have any padding when a tag footer is added to the tag." $tagstring .= @str_repeat("", $this->paddedlength - strlen($tagstring) - getid3_id3v2::ID3v2HeaderLength($this->majorversion)); } if ($this->id3v2_use_unsynchronisation && substr($tagstring, strlen($tagstring) - 1, 1) == "ÿ") { // special unsynchronisation case: // if last byte == $FF then appended a $00 $TagUnsynchronisation = true; $tagstring .= ""; } $tagheader = 'ID3'; $tagheader .= chr($this->majorversion); $tagheader .= chr($this->minorversion); $tagheader .= $this->GenerateID3v2TagFlags(array('unsynchronisation' => $TagUnsynchronisation)); $tagheader .= getid3_lib::BigEndian2String(strlen($tagstring), 4, true); return $tagheader . $tagstring; } $this->errors[] = 'tag_data is not an array in GenerateID3v2Tag()'; return false; }