302 if (($this->majorversion < 3) || ($this->majorversion > 4)) {
304 $this->errors[] =
'Only ID3v2.3 and ID3v2.4 are supported in GenerateID3v2FrameData()';
308 switch ($frame_name) {
313 if (strlen($source_data_array[
'data']) > 64) {
314 $this->errors[] =
'Identifier not allowed to be longer than 64 bytes in '.$frame_name.
' (supplied data was '.strlen($source_data_array[
'data']).
' bytes long)';
316 $framedata .= str_replace(
"\x00",
'', $source_data_array[
'ownerid']).
"\x00";
317 $framedata .= substr($source_data_array[
'data'], 0, 64);
328 $this->errors[] =
'Invalid Text Encoding in '.$frame_name.
' ('.$source_data_array[
'encodingid'].
') for ID3v2.'.
$this->majorversion;
330 $framedata .= chr($source_data_array[
'encodingid']);
331 $framedata .= $source_data_array[
'description'].getid3_id3v2::TextEncodingTerminatorLookup($source_data_array[
'encodingid']);
332 $framedata .= $source_data_array[
'data'];
343 $this->errors[] =
'Invalid Text Encoding in '.$frame_name.
' ('.$source_data_array[
'encodingid'].
') for ID3v2.'.
$this->majorversion;
344 } elseif (!isset($source_data_array[
'data']) || !$this->
IsValidURL($source_data_array[
'data'],
false,
false)) {
347 $this->warnings[] =
'Invalid URL in '.$frame_name.
' ('.$source_data_array[
'data'].
')';
349 $framedata .= chr($source_data_array[
'encodingid']);
350 $framedata .= $source_data_array[
'description'].getid3_id3v2::TextEncodingTerminatorLookup($source_data_array[
'encodingid']);
351 $framedata .= $source_data_array[
'data'];
361 $this->errors[] =
'Invalid Text Encoding in '.$frame_name.
' ('.$source_data_array[
'encodingid'].
') for ID3v2.'.
$this->majorversion;
363 $framedata .= chr($source_data_array[
'encodingid']);
364 $framedata .= $source_data_array[
'data'];
371 $framedata .= $source_data_array[
'data'];
385 if (($source_data_array[
'timestampformat'] > 2) || ($source_data_array[
'timestampformat'] < 1)) {
386 $this->errors[] =
'Invalid Time Stamp Format byte in '.$frame_name.
' ('.$source_data_array[
'timestampformat'].
')';
388 $framedata .= chr($source_data_array[
'timestampformat']);
389 foreach ($source_data_array as $key => $val) {
391 $this->errors[] =
'Invalid Event Type byte in '.$frame_name.
' ('.$val[
'typeid'].
')';
392 } elseif (($key !=
'timestampformat') && ($key !=
'flags')) {
393 if (($val[
'timestamp'] > 0) && ($previousETCOtimestamp >= $val[
'timestamp'])) {
396 $this->errors[] =
'Out-of-order timestamp in '.$frame_name.
' ('.$val[
'timestamp'].
') for Event Type ('.$val[
'typeid'].
')';
398 $framedata .= chr($val[
'typeid']);
416 if (($source_data_array[
'framesbetweenreferences'] > 0) && ($source_data_array[
'framesbetweenreferences'] <= 65535)) {
419 $this->errors[] =
'Invalid MPEG Frames Between References in '.$frame_name.
' ('.$source_data_array[
'framesbetweenreferences'].
')';
421 if (($source_data_array[
'bytesbetweenreferences'] > 0) && ($source_data_array[
'bytesbetweenreferences'] <= 16777215)) {
424 $this->errors[] =
'Invalid bytes Between References in '.$frame_name.
' ('.$source_data_array[
'bytesbetweenreferences'].
')';
426 if (($source_data_array[
'msbetweenreferences'] > 0) && ($source_data_array[
'msbetweenreferences'] <= 16777215)) {
429 $this->errors[] =
'Invalid Milliseconds Between References in '.$frame_name.
' ('.$source_data_array[
'msbetweenreferences'].
')';
431 if (!$this->
IsWithinBitRange($source_data_array[
'bitsforbytesdeviation'], 8,
false)) {
432 if (($source_data_array[
'bitsforbytesdeviation'] % 4) == 0) {
433 $framedata .= chr($source_data_array[
'bitsforbytesdeviation']);
435 $this->errors[] =
'Bits For Bytes Deviation in '.$frame_name.
' ('.$source_data_array[
'bitsforbytesdeviation'].
') must be a multiple of 4.';
438 $this->errors[] =
'Invalid Bits For Bytes Deviation in '.$frame_name.
' ('.$source_data_array[
'bitsforbytesdeviation'].
')';
440 if (!$this->
IsWithinBitRange($source_data_array[
'bitsformsdeviation'], 8,
false)) {
441 if (($source_data_array[
'bitsformsdeviation'] % 4) == 0) {
442 $framedata .= chr($source_data_array[
'bitsformsdeviation']);
444 $this->errors[] =
'Bits For Milliseconds Deviation in '.$frame_name.
' ('.$source_data_array[
'bitsforbytesdeviation'].
') must be a multiple of 4.';
447 $this->errors[] =
'Invalid Bits For Milliseconds Deviation in '.$frame_name.
' ('.$source_data_array[
'bitsformsdeviation'].
')';
449 foreach ($source_data_array as $key => $val) {
450 if (($key !=
'framesbetweenreferences') && ($key !=
'bytesbetweenreferences') && ($key !=
'msbetweenreferences') && ($key !=
'bitsforbytesdeviation') && ($key !=
'bitsformsdeviation') && ($key !=
'flags')) {
451 $unwrittenbitstream .= str_pad(
getid3_lib::Dec2Bin($val[
'bytedeviation']), $source_data_array[
'bitsforbytesdeviation'],
'0', STR_PAD_LEFT);
452 $unwrittenbitstream .= str_pad(
getid3_lib::Dec2Bin($val[
'msdeviation']), $source_data_array[
'bitsformsdeviation'],
'0', STR_PAD_LEFT);
455 for ($i = 0; $i < strlen($unwrittenbitstream); $i += 8) {
456 $highnibble = bindec(substr($unwrittenbitstream, $i, 4)) << 4;
457 $lownibble = bindec(substr($unwrittenbitstream, $i + 4, 4));
458 $framedata .= chr($highnibble & $lownibble);
469 if (($source_data_array[
'timestampformat'] > 2) || ($source_data_array[
'timestampformat'] < 1)) {
470 $this->errors[] =
'Invalid Time Stamp Format byte in '.$frame_name.
' ('.$source_data_array[
'timestampformat'].
')';
472 $framedata .= chr($source_data_array[
'timestampformat']);
473 foreach ($source_data_array as $key => $val) {
475 $this->errors[] =
'Invalid Event Type byte in '.$frame_name.
' ('.$val[
'typeid'].
')';
476 } elseif (($key !=
'timestampformat') && ($key !=
'flags')) {
477 if (($val[
'tempo'] < 0) || ($val[
'tempo'] > 510)) {
478 $this->errors[] =
'Invalid Tempo (max = 510) in '.$frame_name.
' ('.$val[
'tempo'].
') at timestamp ('.$val[
'timestamp'].
')';
480 if ($val[
'tempo'] > 255) {
481 $framedata .= chr(255);
482 $val[
'tempo'] -= 255;
484 $framedata .= chr($val[
'tempo']);
500 $this->errors[] =
'Invalid Text Encoding in '.$frame_name.
' ('.$source_data_array[
'encodingid'].
') for ID3v2.'.
$this->majorversion;
502 $this->errors[] =
'Invalid Language in '.$frame_name.
' ('.$source_data_array[
'language'].
')';
504 $framedata .= chr($source_data_array[
'encodingid']);
505 $framedata .= strtolower($source_data_array[
'language']);
506 $framedata .= $source_data_array[
'description'].getid3_id3v2::TextEncodingTerminatorLookup($source_data_array[
'encodingid']);
507 $framedata .= $source_data_array[
'data'];
525 $this->errors[] =
'Invalid Text Encoding in '.$frame_name.
' ('.$source_data_array[
'encodingid'].
') for ID3v2.'.
$this->majorversion;
527 $this->errors[] =
'Invalid Language in '.$frame_name.
' ('.$source_data_array[
'language'].
')';
528 } elseif (($source_data_array[
'timestampformat'] > 2) || ($source_data_array[
'timestampformat'] < 1)) {
529 $this->errors[] =
'Invalid Time Stamp Format byte in '.$frame_name.
' ('.$source_data_array[
'timestampformat'].
')';
531 $this->errors[] =
'Invalid Content Type byte in '.$frame_name.
' ('.$source_data_array[
'contenttypeid'].
')';
532 } elseif (!is_array($source_data_array[
'data'])) {
533 $this->errors[] =
'Invalid Lyric/Timestamp data in '.$frame_name.
' (must be an array)';
535 $framedata .= chr($source_data_array[
'encodingid']);
536 $framedata .= strtolower($source_data_array[
'language']);
537 $framedata .= chr($source_data_array[
'timestampformat']);
538 $framedata .= chr($source_data_array[
'contenttypeid']);
539 $framedata .= $source_data_array[
'description'].getid3_id3v2::TextEncodingTerminatorLookup($source_data_array[
'encodingid']);
540 ksort($source_data_array[
'data']);
541 foreach ($source_data_array[
'data'] as $key => $val) {
542 $framedata .= $val[
'data'].getid3_id3v2::TextEncodingTerminatorLookup($source_data_array[
'encodingid']);
556 $this->errors[] =
'Invalid Text Encoding in '.$frame_name.
' ('.$source_data_array[
'encodingid'].
') for ID3v2.'.
$this->majorversion;
558 $this->errors[] =
'Invalid Language in '.$frame_name.
' ('.$source_data_array[
'language'].
')';
560 $framedata .= chr($source_data_array[
'encodingid']);
561 $framedata .= strtolower($source_data_array[
'language']);
562 $framedata .= $source_data_array[
'description'].getid3_id3v2::TextEncodingTerminatorLookup($source_data_array[
'encodingid']);
563 $framedata .= $source_data_array[
'data'];
577 $framedata .= str_replace(
"\x00",
'', $source_data_array[
'description']).
"\x00";
578 foreach ($source_data_array as $key => $val) {
579 if ($key !=
'description') {
580 $framedata .= chr($val[
'channeltypeid']);
582 if (!$this->
IsWithinBitRange($source_data_array[
'bitspeakvolume'], 8,
false)) {
583 $framedata .= chr($val[
'bitspeakvolume']);
584 if ($val[
'bitspeakvolume'] > 0) {
588 $this->errors[] =
'Invalid Bits Representing Peak Volume in '.$frame_name.
' ('.$val[
'bitspeakvolume'].
') (range = 0 to 255)';
611 $this->errors[] =
'Invalid Bits For Volume Description byte in '.$frame_name.
' ('.$source_data_array[
'bitsvolume'].
') (range = 1 to 255)';
614 $incdecflag .= $source_data_array[
'incdec'][
'right'] ?
'1' :
'0';
615 $incdecflag .= $source_data_array[
'incdec'][
'left'] ?
'1' :
'0';
616 $incdecflag .= $source_data_array[
'incdec'][
'rightrear'] ?
'1' :
'0';
617 $incdecflag .= $source_data_array[
'incdec'][
'leftrear'] ?
'1' :
'0';
618 $incdecflag .= $source_data_array[
'incdec'][
'center'] ?
'1' :
'0';
619 $incdecflag .= $source_data_array[
'incdec'][
'bass'] ?
'1' :
'0';
620 $framedata .= chr(bindec($incdecflag));
621 $framedata .= chr($source_data_array[
'bitsvolume']);
622 $framedata .=
getid3_lib::BigEndian2String($source_data_array[
'volumechange'][
'right'], ceil($source_data_array[
'bitsvolume'] / 8),
false);
623 $framedata .=
getid3_lib::BigEndian2String($source_data_array[
'volumechange'][
'left'], ceil($source_data_array[
'bitsvolume'] / 8),
false);
624 $framedata .=
getid3_lib::BigEndian2String($source_data_array[
'peakvolume'][
'right'], ceil($source_data_array[
'bitsvolume'] / 8),
false);
625 $framedata .=
getid3_lib::BigEndian2String($source_data_array[
'peakvolume'][
'left'], ceil($source_data_array[
'bitsvolume'] / 8),
false);
626 if ($source_data_array[
'volumechange'][
'rightrear'] || $source_data_array[
'volumechange'][
'leftrear'] ||
627 $source_data_array[
'peakvolume'][
'rightrear'] || $source_data_array[
'peakvolume'][
'leftrear'] ||
628 $source_data_array[
'volumechange'][
'center'] || $source_data_array[
'peakvolume'][
'center'] ||
629 $source_data_array[
'volumechange'][
'bass'] || $source_data_array[
'peakvolume'][
'bass']) {
630 $framedata .=
getid3_lib::BigEndian2String($source_data_array[
'volumechange'][
'rightrear'], ceil($source_data_array[
'bitsvolume']/8),
false);
631 $framedata .=
getid3_lib::BigEndian2String($source_data_array[
'volumechange'][
'leftrear'], ceil($source_data_array[
'bitsvolume']/8),
false);
632 $framedata .=
getid3_lib::BigEndian2String($source_data_array[
'peakvolume'][
'rightrear'], ceil($source_data_array[
'bitsvolume']/8),
false);
633 $framedata .=
getid3_lib::BigEndian2String($source_data_array[
'peakvolume'][
'leftrear'], ceil($source_data_array[
'bitsvolume']/8),
false);
635 if ($source_data_array[
'volumechange'][
'center'] || $source_data_array[
'peakvolume'][
'center'] ||
636 $source_data_array[
'volumechange'][
'bass'] || $source_data_array[
'peakvolume'][
'bass']) {
637 $framedata .=
getid3_lib::BigEndian2String($source_data_array[
'volumechange'][
'center'], ceil($source_data_array[
'bitsvolume']/8),
false);
638 $framedata .=
getid3_lib::BigEndian2String($source_data_array[
'peakvolume'][
'center'], ceil($source_data_array[
'bitsvolume']/8),
false);
640 if ($source_data_array[
'volumechange'][
'bass'] || $source_data_array[
'peakvolume'][
'bass']) {
641 $framedata .=
getid3_lib::BigEndian2String($source_data_array[
'volumechange'][
'bass'], ceil($source_data_array[
'bitsvolume']/8),
false);
656 if (($source_data_array[
'interpolationmethod'] < 0) || ($source_data_array[
'interpolationmethod'] > 1)) {
657 $this->errors[] =
'Invalid Interpolation Method byte in '.$frame_name.
' ('.$source_data_array[
'interpolationmethod'].
') (valid = 0 or 1)';
659 $framedata .= chr($source_data_array[
'interpolationmethod']);
660 $framedata .= str_replace(
"\x00",
'', $source_data_array[
'description']).
"\x00";
661 foreach ($source_data_array[
'data'] as $key => $val) {
678 $this->errors[] =
'Invalid Adjustment Bits byte in '.$frame_name.
' ('.$source_data_array[
'bitsvolume'].
') (range = 1 to 255)';
680 $framedata .= chr($source_data_array[
'adjustmentbits']);
681 foreach ($source_data_array as $key => $val) {
682 if ($key !=
'bitsvolume') {
683 if (($key > 32767) || ($key < 0)) {
684 $this->errors[] =
'Invalid Frequency in '.$frame_name.
' ('.$key.
') (range = 0 to 32767)';
711 $this->errors[] =
'Invalid Reverb Left in '.$frame_name.
' ('.$source_data_array[
'left'].
') (range = 0 to 65535)';
712 } elseif (!$this->
IsWithinBitRange($source_data_array[
'right'], 16,
false)) {
713 $this->errors[] =
'Invalid Reverb Left in '.$frame_name.
' ('.$source_data_array[
'right'].
') (range = 0 to 65535)';
714 } elseif (!$this->
IsWithinBitRange($source_data_array[
'bouncesL'], 8,
false)) {
715 $this->errors[] =
'Invalid Reverb Bounces, Left in '.$frame_name.
' ('.$source_data_array[
'bouncesL'].
') (range = 0 to 255)';
716 } elseif (!$this->
IsWithinBitRange($source_data_array[
'bouncesR'], 8,
false)) {
717 $this->errors[] =
'Invalid Reverb Bounces, Right in '.$frame_name.
' ('.$source_data_array[
'bouncesR'].
') (range = 0 to 255)';
718 } elseif (!$this->
IsWithinBitRange($source_data_array[
'feedbackLL'], 8,
false)) {
719 $this->errors[] =
'Invalid Reverb Feedback, Left-To-Left in '.$frame_name.
' ('.$source_data_array[
'feedbackLL'].
') (range = 0 to 255)';
720 } elseif (!$this->
IsWithinBitRange($source_data_array[
'feedbackLR'], 8,
false)) {
721 $this->errors[] =
'Invalid Reverb Feedback, Left-To-Right in '.$frame_name.
' ('.$source_data_array[
'feedbackLR'].
') (range = 0 to 255)';
722 } elseif (!$this->
IsWithinBitRange($source_data_array[
'feedbackRR'], 8,
false)) {
723 $this->errors[] =
'Invalid Reverb Feedback, Right-To-Right in '.$frame_name.
' ('.$source_data_array[
'feedbackRR'].
') (range = 0 to 255)';
724 } elseif (!$this->
IsWithinBitRange($source_data_array[
'feedbackRL'], 8,
false)) {
725 $this->errors[] =
'Invalid Reverb Feedback, Right-To-Left in '.$frame_name.
' ('.$source_data_array[
'feedbackRL'].
') (range = 0 to 255)';
726 } elseif (!$this->
IsWithinBitRange($source_data_array[
'premixLR'], 8,
false)) {
727 $this->errors[] =
'Invalid Premix, Left-To-Right in '.$frame_name.
' ('.$source_data_array[
'premixLR'].
') (range = 0 to 255)';
728 } elseif (!$this->
IsWithinBitRange($source_data_array[
'premixRL'], 8,
false)) {
729 $this->errors[] =
'Invalid Premix, Right-To-Left in '.$frame_name.
' ('.$source_data_array[
'premixRL'].
') (range = 0 to 255)';
733 $framedata .= chr($source_data_array[
'bouncesL']);
734 $framedata .= chr($source_data_array[
'bouncesR']);
735 $framedata .= chr($source_data_array[
'feedbackLL']);
736 $framedata .= chr($source_data_array[
'feedbackLR']);
737 $framedata .= chr($source_data_array[
'feedbackRR']);
738 $framedata .= chr($source_data_array[
'feedbackRL']);
739 $framedata .= chr($source_data_array[
'premixLR']);
740 $framedata .= chr($source_data_array[
'premixRL']);
753 $this->errors[] =
'Invalid Text Encoding in '.$frame_name.
' ('.$source_data_array[
'encodingid'].
') for ID3v2.'.
$this->majorversion;
755 $this->errors[] =
'Invalid Picture Type byte in '.$frame_name.
' ('.$source_data_array[
'picturetypeid'].
') for ID3v2.'.
$this->majorversion;
757 $this->errors[] =
'Invalid MIME Type in '.$frame_name.
' ('.$source_data_array[
'mime'].
') for ID3v2.'.
$this->majorversion;
758 } elseif (($source_data_array[
'mime'] ==
'-->') && (!$this->
IsValidURL($source_data_array[
'data'],
false,
false))) {
761 $this->warnings[] =
'Invalid URL in '.$frame_name.
' ('.$source_data_array[
'data'].
')';
763 $framedata .= chr($source_data_array[
'encodingid']);
764 $framedata .= str_replace(
"\x00",
'', $source_data_array[
'mime']).
"\x00";
765 $framedata .= chr($source_data_array[
'picturetypeid']);
766 $framedata .= @$source_data_array[
'description'].getid3_id3v2::TextEncodingTerminatorLookup($source_data_array[
'encodingid']);
767 $framedata .= $source_data_array[
'data'];
780 $this->errors[] =
'Invalid Text Encoding in '.$frame_name.
' ('.$source_data_array[
'encodingid'].
') for ID3v2.'.
$this->majorversion;
782 $this->errors[] =
'Invalid MIME Type in '.$frame_name.
' ('.$source_data_array[
'mime'].
')';
783 } elseif (!$source_data_array[
'description']) {
784 $this->errors[] =
'Missing Description in '.$frame_name;
786 $framedata .= chr($source_data_array[
'encodingid']);
787 $framedata .= str_replace(
"\x00",
'', $source_data_array[
'mime']).
"\x00";
788 $framedata .= $source_data_array[
'filename'].getid3_id3v2::TextEncodingTerminatorLookup($source_data_array[
'encodingid']);
789 $framedata .= $source_data_array[
'description'].getid3_id3v2::TextEncodingTerminatorLookup($source_data_array[
'encodingid']);
790 $framedata .= $source_data_array[
'data'];
810 $this->errors[] =
'Invalid Rating byte in '.$frame_name.
' ('.$source_data_array[
'rating'].
') (range = 0 to 255)';
811 } elseif (!IsValidEmail($source_data_array[
'email'])) {
812 $this->errors[] =
'Invalid Email in '.$frame_name.
' ('.$source_data_array[
'email'].
')';
814 $framedata .= str_replace(
"\x00",
'', $source_data_array[
'email']).
"\x00";
815 $framedata .= chr($source_data_array[
'rating']);
825 if (!$this->
IsWithinBitRange($source_data_array[
'buffersize'], 24,
false)) {
826 $this->errors[] =
'Invalid Buffer Size in '.$frame_name;
827 } elseif (!$this->
IsWithinBitRange($source_data_array[
'nexttagoffset'], 32,
false)) {
828 $this->errors[] =
'Invalid Offset To Next Tag in '.$frame_name;
832 $flag .= $source_data_array[
'flags'][
'embededinfo'] ?
'1' :
'0';
833 $framedata .= chr(bindec($flag));
844 if (!$this->
IsWithinBitRange($source_data_array[
'previewstart'], 16,
false)) {
845 $this->errors[] =
'Invalid Preview Start in '.$frame_name.
' ('.$source_data_array[
'previewstart'].
')';
846 } elseif (!$this->
IsWithinBitRange($source_data_array[
'previewlength'], 16,
false)) {
847 $this->errors[] =
'Invalid Preview Length in '.$frame_name.
' ('.$source_data_array[
'previewlength'].
')';
849 $framedata .= str_replace(
"\x00",
'', $source_data_array[
'ownerid']).
"\x00";
852 $framedata .= $source_data_array[
'encryptioninfo'];
862 $this->errors[] =
'Invalid Frame Identifier in '.$frame_name.
' ('.$source_data_array[
'frameid'].
')';
863 } elseif (!$this->
IsValidURL($source_data_array[
'data'],
true,
false)) {
866 $this->warnings[] =
'Invalid URL in '.$frame_name.
' ('.$source_data_array[
'data'].
')';
867 } elseif ((($source_data_array[
'frameid'] ==
'AENC') || ($source_data_array[
'frameid'] ==
'APIC') || ($source_data_array[
'frameid'] ==
'GEOB') || ($source_data_array[
'frameid'] ==
'TXXX')) && ($source_data_array[
'additionaldata'] ==
'')) {
868 $this->errors[] =
'Content Descriptor must be specified as additional data for Frame Identifier of '.$source_data_array[
'frameid'].
' in '.$frame_name;
869 } elseif (($source_data_array[
'frameid'] ==
'USER') && (
getid3_id3v2::LanguageLookup($source_data_array[
'additionaldata'],
true) ==
'')) {
870 $this->errors[] =
'Language must be specified as additional data for Frame Identifier of '.$source_data_array[
'frameid'].
' in '.$frame_name;
871 } elseif (($source_data_array[
'frameid'] ==
'PRIV') && ($source_data_array[
'additionaldata'] ==
'')) {
872 $this->errors[] =
'Owner Identifier must be specified as additional data for Frame Identifier of '.$source_data_array[
'frameid'].
' in '.$frame_name;
873 } elseif ((($source_data_array[
'frameid'] ==
'COMM') || ($source_data_array[
'frameid'] ==
'SYLT') || ($source_data_array[
'frameid'] ==
'USLT')) && ((
getid3_id3v2::LanguageLookup(substr($source_data_array[
'additionaldata'], 0, 3),
true) ==
'') || (substr($source_data_array[
'additionaldata'], 3) ==
''))) {
874 $this->errors[] =
'Language followed by Content Descriptor must be specified as additional data for Frame Identifier of '.$source_data_array[
'frameid'].
' in '.$frame_name;
876 $framedata .= $source_data_array[
'frameid'];
877 $framedata .= str_replace(
"\x00",
'', $source_data_array[
'data']).
"\x00";
878 switch ($source_data_array[
'frameid']) {
888 $framedata .= $source_data_array[
'additionaldata'];
905 if ($this->majorversion == 3) {
908 $this->errors[] = $source_data_array[
'frameid'].
' is not a valid Frame Identifier in '.$frame_name.
' (in ID3v2.'.$this->majorversion.
')';
912 if ((substr($source_data_array[
'frameid'], 0, 1) ==
'T') || (substr($source_data_array[
'frameid'], 0, 1) ==
'W')) {
915 $this->errors[] = $source_data_array[
'frameid'].
' is not a valid Frame Identifier in '.$frame_name.
' (in ID3v2.'.$this->majorversion.
')';
926 if (($source_data_array[
'timestampformat'] < 1) || ($source_data_array[
'timestampformat'] > 2)) {
927 $this->errors[] =
'Invalid Time Stamp Format in '.$frame_name.
' ('.$source_data_array[
'timestampformat'].
') (valid = 1 or 2)';
928 } elseif (!$this->
IsWithinBitRange($source_data_array[
'position'], 32,
false)) {
929 $this->errors[] =
'Invalid Position in '.$frame_name.
' ('.$source_data_array[
'position'].
') (range = 0 to 4294967295)';
931 $framedata .= chr($source_data_array[
'timestampformat']);
943 $this->errors[] =
'Invalid Text Encoding in '.$frame_name.
' ('.$source_data_array[
'encodingid'].
')';
945 $this->errors[] =
'Invalid Language in '.$frame_name.
' ('.$source_data_array[
'language'].
')';
947 $framedata .= chr($source_data_array[
'encodingid']);
948 $framedata .= strtolower($source_data_array[
'language']);
949 $framedata .= $source_data_array[
'data'];
961 $this->errors[] =
'Invalid Text Encoding in '.$frame_name.
' ('.$source_data_array[
'encodingid'].
')';
962 } elseif (!$this->IsANumber($source_data_array[
'pricepaid'][
'value'],
false)) {
963 $this->errors[] =
'Invalid Price Paid in '.$frame_name.
' ('.$source_data_array[
'pricepaid'][
'value'].
')';
964 } elseif (!$this->IsValidDateStampString($source_data_array[
'purchasedate'])) {
965 $this->errors[] =
'Invalid Date Of Purchase in '.$frame_name.
' ('.$source_data_array[
'purchasedate'].
') (format = YYYYMMDD)';
967 $framedata .= chr($source_data_array[
'encodingid']);
968 $framedata .= str_replace(
"\x00",
'', $source_data_array[
'pricepaid'][
'value']).
"\x00";
969 $framedata .= $source_data_array[
'purchasedate'];
970 $framedata .= $source_data_array[
'seller'];
987 $this->errors[] =
'Invalid Text Encoding in '.$frame_name.
' ('.$source_data_array[
'encodingid'].
')';
988 } elseif (!$this->IsValidDateStampString($source_data_array[
'pricevaliduntil'])) {
989 $this->errors[] =
'Invalid Valid Until date in '.$frame_name.
' ('.$source_data_array[
'pricevaliduntil'].
') (format = YYYYMMDD)';
990 } elseif (!$this->
IsValidURL($source_data_array[
'contacturl'],
false,
true)) {
991 $this->errors[] =
'Invalid Contact URL in '.$frame_name.
' ('.$source_data_array[
'contacturl'].
') (allowed schemes: http, https, ftp, mailto)';
993 $this->errors[] =
'Invalid Received As byte in '.$frame_name.
' ('.$source_data_array[
'contacturl'].
') (range = 0 to 8)';
995 $this->errors[] =
'Invalid MIME Type in '.$frame_name.
' ('.$source_data_array[
'mime'].
')';
997 $framedata .= chr($source_data_array[
'encodingid']);
999 foreach ($source_data_array[
'price'] as $key => $val) {
1001 $pricestrings[] = $key.$val[
'value'];
1003 $this->errors[] =
'Invalid Price String in '.$frame_name.
' ('.$key.$val[
'value'].
')';
1006 $framedata .= implode(
'/', $pricestrings);
1007 $framedata .= $source_data_array[
'pricevaliduntil'];
1008 $framedata .= str_replace(
"\x00",
'', $source_data_array[
'contacturl']).
"\x00";
1009 $framedata .= chr($source_data_array[
'receivedasid']);
1010 $framedata .= $source_data_array[
'sellername'].getid3_id3v2::TextEncodingTerminatorLookup($source_data_array[
'encodingid']);
1011 $framedata .= $source_data_array[
'description'].getid3_id3v2::TextEncodingTerminatorLookup($source_data_array[
'encodingid']);
1012 $framedata .= $source_data_array[
'mime'].
"\x00";
1013 $framedata .= $source_data_array[
'logo'];
1022 if (!$this->
IsWithinBitRange($source_data_array[
'methodsymbol'], 8,
false)) {
1023 $this->errors[] =
'Invalid Group Symbol in '.$frame_name.
' ('.$source_data_array[
'methodsymbol'].
') (range = 0 to 255)';
1025 $framedata .= str_replace(
"\x00",
'', $source_data_array[
'ownerid']).
"\x00";
1026 $framedata .= ord($source_data_array[
'methodsymbol']);
1027 $framedata .= $source_data_array[
'data'];
1036 if (!$this->
IsWithinBitRange($source_data_array[
'groupsymbol'], 8,
false)) {
1037 $this->errors[] =
'Invalid Group Symbol in '.$frame_name.
' ('.$source_data_array[
'groupsymbol'].
') (range = 0 to 255)';
1039 $framedata .= str_replace(
"\x00",
'', $source_data_array[
'ownerid']).
"\x00";
1040 $framedata .= ord($source_data_array[
'groupsymbol']);
1041 $framedata .= $source_data_array[
'data'];
1049 $framedata .= str_replace(
"\x00",
'', $source_data_array[
'ownerid']).
"\x00";
1050 $framedata .= $source_data_array[
'data'];
1057 if (!$this->
IsWithinBitRange($source_data_array[
'groupsymbol'], 8,
false)) {
1058 $this->errors[] =
'Invalid Group Symbol in '.$frame_name.
' ('.$source_data_array[
'groupsymbol'].
') (range = 0 to 255)';
1060 $framedata .= ord($source_data_array[
'groupsymbol']);
1061 $framedata .= $source_data_array[
'data'];
1069 $this->errors[] =
'Invalid Minimum Offset in '.$frame_name.
' ('.$source_data_array[
'data'].
') (range = 0 to 4294967295)';
1083 if (!$this->
IsWithinBitRange($source_data_array[
'datastart'], 32,
false)) {
1084 $this->errors[] =
'Invalid Indexed Data Start in '.$frame_name.
' ('.$source_data_array[
'datastart'].
') (range = 0 to 4294967295)';
1085 } elseif (!$this->
IsWithinBitRange($source_data_array[
'datalength'], 32,
false)) {
1086 $this->errors[] =
'Invalid Indexed Data Length in '.$frame_name.
' ('.$source_data_array[
'datalength'].
') (range = 0 to 4294967295)';
1087 } elseif (!$this->
IsWithinBitRange($source_data_array[
'indexpoints'], 16,
false)) {
1088 $this->errors[] =
'Invalid Number Of Index Points in '.$frame_name.
' ('.$source_data_array[
'indexpoints'].
') (range = 0 to 65535)';
1089 } elseif (!$this->
IsWithinBitRange($source_data_array[
'bitsperpoint'], 8,
false)) {
1090 $this->errors[] =
'Invalid Bits Per Index Point in '.$frame_name.
' ('.$source_data_array[
'bitsperpoint'].
') (range = 0 to 255)';
1091 } elseif ($source_data_array[
'indexpoints'] != count($source_data_array[
'indexes'])) {
1092 $this->errors[] =
'Number Of Index Points does not match actual supplied data in '.$frame_name;
1098 foreach ($source_data_array[
'indexes'] as $key => $val) {
1115 if (($source_data_array[
'track_adjustment'] > 51) || ($source_data_array[
'track_adjustment'] < -51)) {
1116 $this->errors[] =
'Invalid Track Adjustment in '.$frame_name.
' ('.$source_data_array[
'track_adjustment'].
') (range = -51.0 to +51.0)';
1117 } elseif (($source_data_array[
'album_adjustment'] > 51) || ($source_data_array[
'album_adjustment'] < -51)) {
1118 $this->errors[] =
'Invalid Album Adjustment in '.$frame_name.
' ('.$source_data_array[
'album_adjustment'].
') (range = -51.0 to +51.0)';
1120 $this->errors[] =
'Invalid Track Name Code in '.$frame_name.
' ('.$source_data_array[
'raw'][
'track_name'].
') (range = 0 to 2)';
1122 $this->errors[] =
'Invalid Album Name Code in '.$frame_name.
' ('.$source_data_array[
'raw'][
'album_name'].
') (range = 0 to 2)';
1124 $this->errors[] =
'Invalid Track Originator Code in '.$frame_name.
' ('.$source_data_array[
'raw'][
'track_originator'].
') (range = 0 to 3)';
1126 $this->errors[] =
'Invalid Album Originator Code in '.$frame_name.
' ('.$source_data_array[
'raw'][
'album_originator'].
') (range = 0 to 3)';
1129 $framedata .=
getid3_lib::RGADgainString($source_data_array[
'raw'][
'track_name'], $source_data_array[
'raw'][
'track_originator'], $source_data_array[
'track_adjustment']);
1130 $framedata .=
getid3_lib::RGADgainString($source_data_array[
'raw'][
'album_name'], $source_data_array[
'raw'][
'album_originator'], $source_data_array[
'album_adjustment']);
1135 if ($frame_name{0} ==
'T') {
1141 $this->errors[] =
'Invalid Text Encoding in '.$frame_name.
' ('.$source_data_array[
'encodingid'].
') for ID3v2.'.
$this->majorversion;
1143 $framedata .= chr($source_data_array[
'encodingid']);
1144 $framedata .= $source_data_array[
'data'];
1146 } elseif ($frame_name{0} ==
'W') {
1149 if (!$this->
IsValidURL($source_data_array[
'data'],
false,
false)) {
1152 $this->warnings[] =
'Invalid URL in '.$frame_name.
' ('.$source_data_array[
'data'].
')';
1154 $framedata .= $source_data_array[
'data'];
1157 $this->errors[] = $frame_name.
' not yet supported in $this->GenerateID3v2FrameData()';
1162 if (!empty($this->errors)) {
ID3v2IsValidSYLTtype($contenttype)
RGADgainString($namecode, $originatorcode, $replaygain)
LanguageLookup($languagecode, $casesensitive=false)
$id3v2_default_encodingid
ID3v2IsValidRGADname($RGADname)
ID3v2IsValidCOMRreceivedAs($receivedas)
ID3v2IsValidETCOevent($eventid)
IsWithinBitRange($number, $maxbits, $signed=false)
BigEndian2String($number, $minbytes=1, $synchsafe=false, $signed=false)
ID3v2IsValidTextEncoding($textencodingbyte)
IsValidURL($url, $allowUserPass=false)
ID3v2IsValidPriceString($pricestring)
IsValidID3v2FrameName($framename, $id3v2majorversion)
ID3v2IsValidRGADoriginator($RGADoriginator)
ID3v2IsValidAPICpicturetype($picturetype)
IsValidMIMEstring($mimestring)
ID3v2IsValidAPICimageformat($imageformat)
Float2String($floatvalue, $bits)