465 {
466
467
468 $id3v2_majorversion = $ThisFileInfo['id3v2']['majorversion'];
469
471 if (empty($parsedFrame['framenamelong'])) {
472 unset($parsedFrame['framenamelong']);
473 }
475 if (empty($parsedFrame['framenameshort'])) {
476 unset($parsedFrame['framenameshort']);
477 }
478
479 if ($id3v2_majorversion >= 3) {
480 if ($id3v2_majorversion == 3) {
481
482
483 $parsedFrame['flags']['TagAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x8000);
484 $parsedFrame['flags']['FileAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x4000);
485 $parsedFrame['flags']['ReadOnly'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x2000);
486 $parsedFrame['flags']['compression'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0080);
487 $parsedFrame['flags']['Encryption'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0040);
488 $parsedFrame['flags']['GroupingIdentity'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0020);
489
490 } elseif ($id3v2_majorversion == 4) {
491
492
493 $parsedFrame['flags']['TagAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x4000);
494 $parsedFrame['flags']['FileAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x2000);
495 $parsedFrame['flags']['ReadOnly'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x1000);
496 $parsedFrame['flags']['GroupingIdentity'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0040);
497 $parsedFrame['flags']['compression'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0008);
498 $parsedFrame['flags']['Encryption'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0004);
499 $parsedFrame['flags']['Unsynchronisation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0002);
500 $parsedFrame['flags']['DataLengthIndicator'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0001);
501
502
503 if ($parsedFrame['flags']['Unsynchronisation']) {
505 }
506 }
507
508
509 if ($parsedFrame['flags']['compression']) {
511 if (!function_exists('gzuncompress')) {
512 $ThisFileInfo['warning'][] = 'gzuncompress() support required to decompress ID3v2 frame "'.$parsedFrame['frame_name'].'"';
513 } elseif ($decompresseddata = @gzuncompress(substr($parsedFrame['data'], 4))) {
514 $parsedFrame['data'] = $decompresseddata;
515 } else {
516 $ThisFileInfo['warning'][] = 'gzuncompress() failed on compressed contents of ID3v2 frame "'.$parsedFrame['frame_name'].'"';
517 }
518 }
519 }
520
521 if (isset($parsedFrame['datalength']) && ($parsedFrame['datalength'] == 0)) {
522
523 $warning = 'Frame "'.$parsedFrame['frame_name'].'" at offset '.$parsedFrame['dataoffset'].' has no data portion';
524 switch ($parsedFrame['frame_name']) {
525 case 'WCOM':
526 $warning .= ' (this is known to happen with files tagged by RioPort)';
527 break;
528
529 default:
530 break;
531 }
532 $ThisFileInfo['warning'][] = $warning;
533
534 } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'UFID')) ||
535 (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'UFI'))) {
536
537
538
539
540
541
542 $frame_terminatorpos = strpos($parsedFrame['data'], "\x00");
543 $frame_idstring = substr($parsedFrame['data'], 0, $frame_terminatorpos);
544 $parsedFrame['ownerid'] = $frame_idstring;
545 $parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen("\x00"));
546 unset($parsedFrame['data']);
547
548
549 } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'TXXX')) ||
550 (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'TXX'))) {
551
552
553
554
555
556
557
558 $frame_offset = 0;
559 $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
560
561 if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
562 $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
563 }
565 if (ord(substr($parsedFrame[
'data'], $frame_terminatorpos + strlen($this->
TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) {
566 $frame_terminatorpos++;
567 }
568 $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
569 if (ord($frame_description) === 0) {
570 $frame_description = '';
571 }
572 $parsedFrame['encodingid'] = $frame_textencoding;
574
575 $parsedFrame['description'] = $frame_description;
576 $parsedFrame[
'data'] = substr($parsedFrame[
'data'], $frame_terminatorpos + strlen($this->
TextEncodingTerminatorLookup($frame_textencoding)));
577 if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {
578 $ThisFileInfo[
'id3v2'][
'comments'][$parsedFrame[
'framenameshort']][] = trim(
getid3_lib::iconv_fallback($parsedFrame[
'encoding'], $ThisFileInfo[
'id3v2'][
'encoding'], $parsedFrame[
'data']));
579 }
580 unset($parsedFrame['data']);
581
582
583 } elseif ($parsedFrame['frame_name']{0} == 'T') {
584
585
586
587
588
589
590 $frame_offset = 0;
591 $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
592 if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
593 $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
594 }
595
596 $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset);
597
598 $parsedFrame['encodingid'] = $frame_textencoding;
600
601 if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {
602 $ThisFileInfo[
'id3v2'][
'comments'][$parsedFrame[
'framenameshort']][] =
getid3_lib::iconv_fallback($parsedFrame[
'encoding'], $ThisFileInfo[
'id3v2'][
'encoding'], $parsedFrame[
'data']);
603 }
604
605 } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'WXXX')) ||
606 (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'WXX'))) {
607
608
609
610
611
612
613
614 $frame_offset = 0;
615 $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
616 if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
617 $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
618 }
620 if (ord(substr($parsedFrame[
'data'], $frame_terminatorpos + strlen($this->
TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) {
621 $frame_terminatorpos++;
622 }
623 $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
624
625 if (ord($frame_description) === 0) {
626 $frame_description = '';
627 }
628 $parsedFrame[
'data'] = substr($parsedFrame[
'data'], $frame_terminatorpos + strlen($this->
TextEncodingTerminatorLookup($frame_textencoding)));
629
631 if (ord(substr($parsedFrame[
'data'], $frame_terminatorpos + strlen($this->
TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) {
632 $frame_terminatorpos++;
633 }
634 if ($frame_terminatorpos) {
635
636
637 $frame_urldata = (string) substr($parsedFrame['data'], 0, $frame_terminatorpos);
638 } else {
639
640 $frame_urldata = (string) $parsedFrame['data'];
641 }
642
643 $parsedFrame['encodingid'] = $frame_textencoding;
645
646 $parsedFrame['url'] = $frame_urldata;
647 $parsedFrame['description'] = $frame_description;
648 if (!empty($parsedFrame['framenameshort']) && $parsedFrame['url']) {
649 $ThisFileInfo[
'id3v2'][
'comments'][$parsedFrame[
'framenameshort']][] =
getid3_lib::iconv_fallback($parsedFrame[
'encoding'], $ThisFileInfo[
'id3v2'][
'encoding'], $parsedFrame[
'url']);
650 }
651 unset($parsedFrame['data']);
652
653
654 } elseif ($parsedFrame['frame_name']{0} == 'W') {
655
656
657
658
659
660
661 $parsedFrame['url'] = trim($parsedFrame['data']);
662 if (!empty($parsedFrame['framenameshort']) && $parsedFrame['url']) {
663 $ThisFileInfo['id3v2']['comments'][$parsedFrame['framenameshort']][] = $parsedFrame['url'];
664 }
665 unset($parsedFrame['data']);
666
667
668 } elseif ((($id3v2_majorversion == 3) && ($parsedFrame['frame_name'] == 'IPLS')) ||
669 (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'IPL'))) {
670
671
672
673
674
675 $frame_offset = 0;
676 $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
677 if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
678 $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
679 }
680 $parsedFrame['encodingid'] = $frame_textencoding;
682
683 $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset);
684 if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {
685 $ThisFileInfo[
'id3v2'][
'comments'][$parsedFrame[
'framenameshort']][] =
getid3_lib::iconv_fallback($parsedFrame[
'encoding'], $ThisFileInfo[
'id3v2'][
'encoding'], $parsedFrame[
'data']);
686 }
687
688
689 } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'MCDI')) ||
690 (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'MCI'))) {
691
692
693
694
695 if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {
696 $ThisFileInfo['id3v2']['comments'][$parsedFrame['framenameshort']][] = $parsedFrame['data'];
697 }
698
699
700 } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'ETCO')) ||
701 (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'ETC'))) {
702
703
704
705
706
707
708
709
710
711
712
713
714 $frame_offset = 0;
715 $parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
716
717 while ($frame_offset < strlen($parsedFrame['data'])) {
718 $parsedFrame['typeid'] = substr($parsedFrame['data'], $frame_offset++, 1);
721 $frame_offset += 4;
722 }
723 unset($parsedFrame['data']);
724
725
726 } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'MLLT')) ||
727 (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'MLL'))) {
728
729
730
731
732
733
734
735
736
737
738
739 $frame_offset = 0;
745 $parsedFrame['data'] = substr($parsedFrame['data'], 10);
746 while ($frame_offset < strlen($parsedFrame['data'])) {
748 }
749 $reference_counter = 0;
750 while (strlen($deviationbitstream) > 0) {
751 $parsedFrame[$reference_counter]['bytedeviation'] = bindec(substr($deviationbitstream, 0, $parsedFrame['bitsforbytesdeviation']));
752 $parsedFrame[$reference_counter]['msdeviation'] = bindec(substr($deviationbitstream, $parsedFrame['bitsforbytesdeviation'], $parsedFrame['bitsformsdeviation']));
753 $deviationbitstream = substr($deviationbitstream, $parsedFrame['bitsforbytesdeviation'] + $parsedFrame['bitsformsdeviation']);
754 $reference_counter++;
755 }
756 unset($parsedFrame['data']);
757
758
759 } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'SYTC')) ||
760 (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'STC'))) {
761
762
763
764
765
766
767
768
769 $frame_offset = 0;
770 $parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
771 $timestamp_counter = 0;
772 while ($frame_offset < strlen($parsedFrame['data'])) {
773 $parsedFrame[$timestamp_counter]['tempo'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
774 if ($parsedFrame[$timestamp_counter]['tempo'] == 255) {
775 $parsedFrame[$timestamp_counter]['tempo'] += ord(substr($parsedFrame['data'], $frame_offset++, 1));
776 }
777 $parsedFrame[$timestamp_counter][
'timestamp'] =
getid3_lib::BigEndian2Int(substr($parsedFrame[
'data'], $frame_offset, 4));
778 $frame_offset += 4;
779 $timestamp_counter++;
780 }
781 unset($parsedFrame['data']);
782
783
784 } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'USLT')) ||
785 (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'ULT'))) {
786
787
788
789
790
791
792
793
794 $frame_offset = 0;
795 $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
796 if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
797 $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
798 }
799 $frame_language = substr($parsedFrame['data'], $frame_offset, 3);
800 $frame_offset += 3;
802 if (ord(substr($parsedFrame[
'data'], $frame_terminatorpos + strlen($this->
TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) {
803 $frame_terminatorpos++;
804 }
805 $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
806 if (ord($frame_description) === 0) {
807 $frame_description = '';
808 }
809 $parsedFrame[
'data'] = substr($parsedFrame[
'data'], $frame_terminatorpos + strlen($this->
TextEncodingTerminatorLookup($frame_textencoding)));
810
811 $parsedFrame['encodingid'] = $frame_textencoding;
813
814 $parsedFrame['data'] = $parsedFrame['data'];
815 $parsedFrame['language'] = $frame_language;
816 $parsedFrame[
'languagename'] = $this->
LanguageLookup($frame_language,
false);
817 $parsedFrame['description'] = $frame_description;
818 if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {
819 $ThisFileInfo[
'id3v2'][
'comments'][$parsedFrame[
'framenameshort']][] =
getid3_lib::iconv_fallback($parsedFrame[
'encoding'], $ThisFileInfo[
'id3v2'][
'encoding'], $parsedFrame[
'data']);
820 }
821 unset($parsedFrame['data']);
822
823
824 } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'SYLT')) ||
825 (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'SLT'))) {
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840 $frame_offset = 0;
841 $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
842 if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
843 $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
844 }
845 $frame_language = substr($parsedFrame['data'], $frame_offset, 3);
846 $frame_offset += 3;
847 $parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
848 $parsedFrame['contenttypeid'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
850 $parsedFrame['encodingid'] = $frame_textencoding;
852
853 $parsedFrame['language'] = $frame_language;
854 $parsedFrame[
'languagename'] = $this->
LanguageLookup($frame_language,
false);
855
856 $timestampindex = 0;
857 $frame_remainingdata = substr($parsedFrame['data'], $frame_offset);
858 while (strlen($frame_remainingdata)) {
859 $frame_offset = 0;
861 if ($frame_terminatorpos === false) {
862 $frame_remainingdata = '';
863 } else {
864 if (ord(substr($frame_remainingdata, $frame_terminatorpos + strlen($this->
TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) {
865 $frame_terminatorpos++;
866 }
867 $parsedFrame['lyrics'][$timestampindex]['data'] = substr($frame_remainingdata, $frame_offset, $frame_terminatorpos - $frame_offset);
868
869 $frame_remainingdata = substr($frame_remainingdata, $frame_terminatorpos + strlen($this->
TextEncodingTerminatorLookup($frame_textencoding)));
870 if (($timestampindex == 0) && (ord($frame_remainingdata{0}) != 0)) {
871
872 } else {
874 $frame_remainingdata = substr($frame_remainingdata, 4);
875 }
876 $timestampindex++;
877 }
878 }
879 unset($parsedFrame['data']);
880
881
882 } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'COMM')) ||
883 (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'COM'))) {
884
885
886
887
888
889
890
891
892 if (strlen($parsedFrame['data']) < 5) {
893
894 $ThisFileInfo['warning'][] = 'Invalid data (too short) for "'.$parsedFrame['frame_name'].'" frame at offset '.$parsedFrame['dataoffset'];
895
896 } else {
897
898 $frame_offset = 0;
899 $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
900 if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
901 $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
902 }
903 $frame_language = substr($parsedFrame['data'], $frame_offset, 3);
904 $frame_offset += 3;
906 if (ord(substr($parsedFrame[
'data'], $frame_terminatorpos + strlen($this->
TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) {
907 $frame_terminatorpos++;
908 }
909 $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
910 if (ord($frame_description) === 0) {
911 $frame_description = '';
912 }
913 $frame_text = (string) substr($parsedFrame[
'data'], $frame_terminatorpos + strlen($this->
TextEncodingTerminatorLookup($frame_textencoding)));
914
915 $parsedFrame['encodingid'] = $frame_textencoding;
917
918 $parsedFrame['language'] = $frame_language;
919 $parsedFrame[
'languagename'] = $this->
LanguageLookup($frame_language,
false);
920 $parsedFrame['description'] = $frame_description;
921 $parsedFrame['data'] = $frame_text;
922 if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {
923 $ThisFileInfo[
'id3v2'][
'comments'][$parsedFrame[
'framenameshort']][] =
getid3_lib::iconv_fallback($parsedFrame[
'encoding'], $ThisFileInfo[
'id3v2'][
'encoding'], $parsedFrame[
'data']);
924 }
925
926 }
927
928 } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'RVA2')) {
929
930
931
932
933
934
935
936
937
938
939
940
941 $frame_terminatorpos = strpos($parsedFrame['data'], "\x00");
942 $frame_idstring = substr($parsedFrame['data'], 0, $frame_terminatorpos);
943 if (ord($frame_idstring) === 0) {
944 $frame_idstring = '';
945 }
946 $frame_remainingdata = substr($parsedFrame['data'], $frame_terminatorpos + strlen("\x00"));
947 $parsedFrame['description'] = $frame_idstring;
948 while (strlen($frame_remainingdata)) {
949 $frame_offset = 0;
950 $frame_channeltypeid = ord(substr($frame_remainingdata, $frame_offset++, 1));
951 $parsedFrame[$frame_channeltypeid]['channeltypeid'] = $frame_channeltypeid;
952 $parsedFrame[$frame_channeltypeid][
'channeltype'] = $this->
RVA2ChannelTypeLookup($frame_channeltypeid);
953 $parsedFrame[$frame_channeltypeid][
'volumeadjust'] =
getid3_lib::BigEndian2Int(substr($frame_remainingdata, $frame_offset, 2),
false,
true);
954 $frame_offset += 2;
955 $parsedFrame[$frame_channeltypeid]['bitspeakvolume'] = ord(substr($frame_remainingdata, $frame_offset++, 1));
956 $frame_bytespeakvolume = ceil($parsedFrame[$frame_channeltypeid]['bitspeakvolume'] / 8);
957 $parsedFrame[$frame_channeltypeid][
'peakvolume'] =
getid3_lib::BigEndian2Int(substr($frame_remainingdata, $frame_offset, $frame_bytespeakvolume));
958 $frame_remainingdata = substr($frame_remainingdata, $frame_offset + $frame_bytespeakvolume);
959 }
960 unset($parsedFrame['data']);
961
962
963 } elseif ((($id3v2_majorversion == 3) && ($parsedFrame['frame_name'] == 'RVAD')) ||
964 (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'RVA'))) {
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986 $frame_offset = 0;
988 $parsedFrame['incdec']['right'] = (bool) substr($frame_incrdecrflags, 6, 1);
989 $parsedFrame['incdec']['left'] = (bool) substr($frame_incrdecrflags, 7, 1);
990 $parsedFrame['bitsvolume'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
991 $frame_bytesvolume = ceil($parsedFrame['bitsvolume'] / 8);
992 $parsedFrame[
'volumechange'][
'right'] =
getid3_lib::BigEndian2Int(substr($parsedFrame[
'data'], $frame_offset, $frame_bytesvolume));
993 if ($parsedFrame['incdec']['right'] === false) {
994 $parsedFrame['volumechange']['right'] *= -1;
995 }
996 $frame_offset += $frame_bytesvolume;
997 $parsedFrame[
'volumechange'][
'left'] =
getid3_lib::BigEndian2Int(substr($parsedFrame[
'data'], $frame_offset, $frame_bytesvolume));
998 if ($parsedFrame['incdec']['left'] === false) {
999 $parsedFrame['volumechange']['left'] *= -1;
1000 }
1001 $frame_offset += $frame_bytesvolume;
1002 $parsedFrame[
'peakvolume'][
'right'] =
getid3_lib::BigEndian2Int(substr($parsedFrame[
'data'], $frame_offset, $frame_bytesvolume));
1003 $frame_offset += $frame_bytesvolume;
1004 $parsedFrame[
'peakvolume'][
'left'] =
getid3_lib::BigEndian2Int(substr($parsedFrame[
'data'], $frame_offset, $frame_bytesvolume));
1005 $frame_offset += $frame_bytesvolume;
1006 if ($id3v2_majorversion == 3) {
1007 $parsedFrame['data'] = substr($parsedFrame['data'], $frame_offset);
1008 if (strlen($parsedFrame['data']) > 0) {
1009 $parsedFrame['incdec']['rightrear'] = (bool) substr($frame_incrdecrflags, 4, 1);
1010 $parsedFrame['incdec']['leftrear'] = (bool) substr($frame_incrdecrflags, 5, 1);
1011 $parsedFrame[
'volumechange'][
'rightrear'] =
getid3_lib::BigEndian2Int(substr($parsedFrame[
'data'], $frame_offset, $frame_bytesvolume));
1012 if ($parsedFrame['incdec']['rightrear'] === false) {
1013 $parsedFrame['volumechange']['rightrear'] *= -1;
1014 }
1015 $frame_offset += $frame_bytesvolume;
1016 $parsedFrame[
'volumechange'][
'leftrear'] =
getid3_lib::BigEndian2Int(substr($parsedFrame[
'data'], $frame_offset, $frame_bytesvolume));
1017 if ($parsedFrame['incdec']['leftrear'] === false) {
1018 $parsedFrame['volumechange']['leftrear'] *= -1;
1019 }
1020 $frame_offset += $frame_bytesvolume;
1021 $parsedFrame[
'peakvolume'][
'rightrear'] =
getid3_lib::BigEndian2Int(substr($parsedFrame[
'data'], $frame_offset, $frame_bytesvolume));
1022 $frame_offset += $frame_bytesvolume;
1023 $parsedFrame[
'peakvolume'][
'leftrear'] =
getid3_lib::BigEndian2Int(substr($parsedFrame[
'data'], $frame_offset, $frame_bytesvolume));
1024 $frame_offset += $frame_bytesvolume;
1025 }
1026 $parsedFrame['data'] = substr($parsedFrame['data'], $frame_offset);
1027 if (strlen($parsedFrame['data']) > 0) {
1028 $parsedFrame['incdec']['center'] = (bool) substr($frame_incrdecrflags, 3, 1);
1029 $parsedFrame[
'volumechange'][
'center'] =
getid3_lib::BigEndian2Int(substr($parsedFrame[
'data'], $frame_offset, $frame_bytesvolume));
1030 if ($parsedFrame['incdec']['center'] === false) {
1031 $parsedFrame['volumechange']['center'] *= -1;
1032 }
1033 $frame_offset += $frame_bytesvolume;
1034 $parsedFrame[
'peakvolume'][
'center'] =
getid3_lib::BigEndian2Int(substr($parsedFrame[
'data'], $frame_offset, $frame_bytesvolume));
1035 $frame_offset += $frame_bytesvolume;
1036 }
1037 $parsedFrame['data'] = substr($parsedFrame['data'], $frame_offset);
1038 if (strlen($parsedFrame['data']) > 0) {
1039 $parsedFrame['incdec']['bass'] = (bool) substr($frame_incrdecrflags, 2, 1);
1040 $parsedFrame[
'volumechange'][
'bass'] =
getid3_lib::BigEndian2Int(substr($parsedFrame[
'data'], $frame_offset, $frame_bytesvolume));
1041 if ($parsedFrame['incdec']['bass'] === false) {
1042 $parsedFrame['volumechange']['bass'] *= -1;
1043 }
1044 $frame_offset += $frame_bytesvolume;
1045 $parsedFrame[
'peakvolume'][
'bass'] =
getid3_lib::BigEndian2Int(substr($parsedFrame[
'data'], $frame_offset, $frame_bytesvolume));
1046 $frame_offset += $frame_bytesvolume;
1047 }
1048 }
1049 unset($parsedFrame['data']);
1050
1051
1052 } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'EQU2')) {
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064 $frame_offset = 0;
1065 $frame_interpolationmethod = ord(substr($parsedFrame['data'], $frame_offset++, 1));
1066 $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
1067 $frame_idstring = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
1068 if (ord($frame_idstring) === 0) {
1069 $frame_idstring = '';
1070 }
1071 $parsedFrame['description'] = $frame_idstring;
1072 $frame_remainingdata = substr($parsedFrame['data'], $frame_terminatorpos + strlen("\x00"));
1073 while (strlen($frame_remainingdata)) {
1076 $frame_remainingdata = substr($frame_remainingdata, 4);
1077 }
1078 $parsedFrame['interpolationmethod'] = $frame_interpolationmethod;
1079 unset($parsedFrame['data']);
1080
1081
1082 } elseif ((($id3v2_majorversion == 3) && ($parsedFrame['frame_name'] == 'EQUA')) ||
1083 (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'EQU'))) {
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094 $frame_offset = 0;
1095 $parsedFrame['adjustmentbits'] = substr($parsedFrame['data'], $frame_offset++, 1);
1096 $frame_adjustmentbytes = ceil($parsedFrame['adjustmentbits'] / 8);
1097
1098 $frame_remainingdata = (string) substr($parsedFrame['data'], $frame_offset);
1099 while (strlen($frame_remainingdata) > 0) {
1101 $frame_incdec = (bool) substr($frame_frequencystr, 0, 1);
1102 $frame_frequency = bindec(substr($frame_frequencystr, 1, 15));
1103 $parsedFrame[$frame_frequency]['incdec'] = $frame_incdec;
1104 $parsedFrame[$frame_frequency][
'adjustment'] =
getid3_lib::BigEndian2Int(substr($frame_remainingdata, 2, $frame_adjustmentbytes));
1105 if ($parsedFrame[$frame_frequency]['incdec'] === false) {
1106 $parsedFrame[$frame_frequency]['adjustment'] *= -1;
1107 }
1108 $frame_remainingdata = substr($frame_remainingdata, 2 + $frame_adjustmentbytes);
1109 }
1110 unset($parsedFrame['data']);
1111
1112
1113 } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'RVRB')) ||
1114 (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'REV'))) {
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128 $frame_offset = 0;
1130 $frame_offset += 2;
1132 $frame_offset += 2;
1133 $parsedFrame['bouncesL'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
1134 $parsedFrame['bouncesR'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
1135 $parsedFrame['feedbackLL'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
1136 $parsedFrame['feedbackLR'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
1137 $parsedFrame['feedbackRR'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
1138 $parsedFrame['feedbackRL'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
1139 $parsedFrame['premixLR'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
1140 $parsedFrame['premixRL'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
1141 unset($parsedFrame['data']);
1142
1143
1144 } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'APIC')) ||
1145 (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'PIC'))) {
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157 $frame_offset = 0;
1158 $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
1159 if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
1160 $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
1161 }
1162
1163 if ($id3v2_majorversion == 2) {
1164 $frame_imagetype = substr($parsedFrame['data'], $frame_offset, 3);
1165 if (strtolower($frame_imagetype) == 'ima') {
1166
1167
1168 $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
1169 $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
1170 if (ord($frame_mimetype) === 0) {
1171 $frame_mimetype = '';
1172 }
1173 $frame_imagetype = strtoupper(str_replace('image/', '', strtolower($frame_mimetype)));
1174 if ($frame_imagetype == 'JPEG') {
1175 $frame_imagetype = 'JPG';
1176 }
1177 $frame_offset = $frame_terminatorpos + strlen("\x00");
1178 } else {
1179 $frame_offset += 3;
1180 }
1181 }
1182 if ($id3v2_majorversion > 2) {
1183 $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
1184 $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
1185 if (ord($frame_mimetype) === 0) {
1186 $frame_mimetype = '';
1187 }
1188 $frame_offset = $frame_terminatorpos + strlen("\x00");
1189 }
1190
1191 $frame_picturetype = ord(substr($parsedFrame['data'], $frame_offset++, 1));
1192
1194 if (ord(substr($parsedFrame[
'data'], $frame_terminatorpos + strlen($this->
TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) {
1195 $frame_terminatorpos++;
1196 }
1197 $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
1198 if (ord($frame_description) === 0) {
1199 $frame_description = '';
1200 }
1201 $parsedFrame['encodingid'] = $frame_textencoding;
1203
1204 if ($id3v2_majorversion == 2) {
1205 $parsedFrame['imagetype'] = $frame_imagetype;
1206 } else {
1207 $parsedFrame['mime'] = $frame_mimetype;
1208 }
1209 $parsedFrame['picturetypeid'] = $frame_picturetype;
1211 $parsedFrame['description'] = $frame_description;
1212 $parsedFrame[
'data'] = substr($parsedFrame[
'data'], $frame_terminatorpos + strlen($this->
TextEncodingTerminatorLookup($frame_textencoding)));
1213
1215 if (($imagechunkcheck[2] >= 1) && ($imagechunkcheck[2] <= 3)) {
1216 $parsedFrame['image_mime'] = 'image/'.getid3_lib::ImageTypesLookup($imagechunkcheck[2]);
1217 if ($imagechunkcheck[0]) {
1218 $parsedFrame['image_width'] = $imagechunkcheck[0];
1219 }
1220 if ($imagechunkcheck[1]) {
1221 $parsedFrame['image_height'] = $imagechunkcheck[1];
1222 }
1223 $parsedFrame['image_bytes'] = strlen($parsedFrame['data']);
1224 }
1225
1226
1227 } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'GEOB')) ||
1228 (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'GEO'))) {
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238 $frame_offset = 0;
1239 $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
1240 if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
1241 $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
1242 }
1243 $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
1244 $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
1245 if (ord($frame_mimetype) === 0) {
1246 $frame_mimetype = '';
1247 }
1248 $frame_offset = $frame_terminatorpos + strlen("\x00");
1249
1251 if (ord(substr($parsedFrame[
'data'], $frame_terminatorpos + strlen($this->
TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) {
1252 $frame_terminatorpos++;
1253 }
1254 $frame_filename = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
1255 if (ord($frame_filename) === 0) {
1256 $frame_filename = '';
1257 }
1259
1261 if (ord(substr($parsedFrame[
'data'], $frame_terminatorpos + strlen($this->
TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) {
1262 $frame_terminatorpos++;
1263 }
1264 $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
1265 if (ord($frame_description) === 0) {
1266 $frame_description = '';
1267 }
1269
1270 $parsedFrame['objectdata'] = (string) substr($parsedFrame['data'], $frame_offset);
1271 $parsedFrame['encodingid'] = $frame_textencoding;
1273
1274 $parsedFrame['mime'] = $frame_mimetype;
1275 $parsedFrame['filename'] = $frame_filename;
1276 $parsedFrame['description'] = $frame_description;
1277 unset($parsedFrame['data']);
1278
1279
1280 } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'PCNT')) ||
1281 (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'CNT'))) {
1282
1283
1284
1285
1286
1287
1289
1290
1291 } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'POPM')) ||
1292 (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'POP'))) {
1293
1294
1295
1296
1297
1298
1299
1300 $frame_offset = 0;
1301 $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
1302 $frame_emailaddress = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
1303 if (ord($frame_emailaddress) === 0) {
1304 $frame_emailaddress = '';
1305 }
1306 $frame_offset = $frame_terminatorpos + strlen("\x00");
1307 $frame_rating = ord(substr($parsedFrame['data'], $frame_offset++, 1));
1309 $parsedFrame['email'] = $frame_emailaddress;
1310 $parsedFrame['rating'] = $frame_rating;
1311 unset($parsedFrame['data']);
1312
1313
1314 } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'RBUF')) ||
1315 (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'BUF'))) {
1316
1317
1318
1319
1320
1321
1322 $frame_offset = 0;
1324 $frame_offset += 3;
1325
1327 $parsedFrame['flags']['embededinfo'] = (bool) substr($frame_embeddedinfoflags, 7, 1);
1329 unset($parsedFrame['data']);
1330
1331
1332 } elseif (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'CRM')) {
1333
1334
1335
1336
1337
1338
1339
1340 $frame_offset = 0;
1341 $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
1342 $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
1343 $frame_offset = $frame_terminatorpos + strlen("\x00");
1344
1345 $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
1346 $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
1347 if (ord($frame_description) === 0) {
1348 $frame_description = '';
1349 }
1350 $frame_offset = $frame_terminatorpos + strlen("\x00");
1351
1352 $parsedFrame['ownerid'] = $frame_ownerid;
1353 $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset);
1354 $parsedFrame['description'] = $frame_description;
1355 unset($parsedFrame['data']);
1356
1357
1358 } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'AENC')) ||
1359 (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'CRA'))) {
1360
1361
1362
1363
1364
1365
1366
1367
1368 $frame_offset = 0;
1369 $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
1370 $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
1371 if (ord($frame_ownerid) === 0) {
1372 $frame_ownerid == '';
1373 }
1374 $frame_offset = $frame_terminatorpos + strlen("\x00");
1375 $parsedFrame['ownerid'] = $frame_ownerid;
1377 $frame_offset += 2;
1379 $frame_offset += 2;
1380 $parsedFrame['encryptioninfo'] = (string) substr($parsedFrame['data'], $frame_offset);
1381 unset($parsedFrame['data']);
1382
1383
1384 } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'LINK')) ||
1385 (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'LNK'))) {
1386
1387
1388
1389
1390
1391
1392
1393
1394 $frame_offset = 0;
1395 if ($id3v2_majorversion == 2) {
1396 $parsedFrame['frameid'] = substr($parsedFrame['data'], $frame_offset, 3);
1397 $frame_offset += 3;
1398 } else {
1399 $parsedFrame['frameid'] = substr($parsedFrame['data'], $frame_offset, 4);
1400 $frame_offset += 4;
1401 }
1402
1403 $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
1404 $frame_url = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
1405 if (ord($frame_url) === 0) {
1406 $frame_url = '';
1407 }
1408 $frame_offset = $frame_terminatorpos + strlen("\x00");
1409 $parsedFrame['url'] = $frame_url;
1410
1411 $parsedFrame['additionaldata'] = (string) substr($parsedFrame['data'], $frame_offset);
1412 if (!empty($parsedFrame['framenameshort']) && $parsedFrame['url']) {
1413 $ThisFileInfo[
'id3v2'][
'comments'][$parsedFrame[
'framenameshort']][] =
getid3_lib::iconv_fallback($parsedFrame[
'encoding'], $ThisFileInfo[
'id3v2'][
'encoding'], $parsedFrame[
'url']);
1414 }
1415 unset($parsedFrame['data']);
1416
1417
1418 } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'POSS')) {
1419
1420
1421
1422
1423
1424 $frame_offset = 0;
1425 $parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
1427 unset($parsedFrame['data']);
1428
1429
1430 } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'USER')) {
1431
1432
1433
1434
1435
1436
1437
1438 $frame_offset = 0;
1439 $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
1440 if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
1441 $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
1442 }
1443 $frame_language = substr($parsedFrame['data'], $frame_offset, 3);
1444 $frame_offset += 3;
1445 $parsedFrame['language'] = $frame_language;
1446 $parsedFrame[
'languagename'] = $this->
LanguageLookup($frame_language,
false);
1447 $parsedFrame['encodingid'] = $frame_textencoding;
1449
1450 $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset);
1451 if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {
1452 $ThisFileInfo[
'id3v2'][
'comments'][$parsedFrame[
'framenameshort']][] =
getid3_lib::iconv_fallback($parsedFrame[
'encoding'], $ThisFileInfo[
'id3v2'][
'encoding'], $parsedFrame[
'data']);
1453 }
1454 unset($parsedFrame['data']);
1455
1456
1457 } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'OWNE')) {
1458
1459
1460
1461
1462
1463
1464
1465 $frame_offset = 0;
1466 $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
1467 if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
1468 $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
1469 }
1470 $parsedFrame['encodingid'] = $frame_textencoding;
1472
1473 $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
1474 $frame_pricepaid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
1475 $frame_offset = $frame_terminatorpos + strlen("\x00");
1476
1477 $parsedFrame['pricepaid']['currencyid'] = substr($frame_pricepaid, 0, 3);
1478 $parsedFrame[
'pricepaid'][
'currency'] = $this->
LookupCurrencyUnits($parsedFrame[
'pricepaid'][
'currencyid']);
1479 $parsedFrame['pricepaid']['value'] = substr($frame_pricepaid, 3);
1480
1481 $parsedFrame['purchasedate'] = substr($parsedFrame['data'], $frame_offset, 8);
1483 $parsedFrame['purchasedateunix'] = mktime (0, 0, 0, substr($parsedFrame['purchasedate'], 4, 2), substr($parsedFrame['purchasedate'], 6, 2), substr($parsedFrame['purchasedate'], 0, 4));
1484 }
1485 $frame_offset += 8;
1486
1487 $parsedFrame['seller'] = (string) substr($parsedFrame['data'], $frame_offset);
1488 unset($parsedFrame['data']);
1489
1490
1491 } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'COMR')) {
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505 $frame_offset = 0;
1506 $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));
1507 if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {
1508 $ThisFileInfo['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding';
1509 }
1510
1511 $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
1512 $frame_pricestring = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
1513 $frame_offset = $frame_terminatorpos + strlen("\x00");
1514 $frame_rawpricearray = explode('/', $frame_pricestring);
1515 foreach ($frame_rawpricearray as $key => $val) {
1516 $frame_currencyid = substr($val, 0, 3);
1517 $parsedFrame[
'price'][$frame_currencyid][
'currency'] = $this->
LookupCurrencyUnits($frame_currencyid);
1518 $parsedFrame['price'][$frame_currencyid]['value'] = substr($val, 3);
1519 }
1520
1521 $frame_datestring = substr($parsedFrame['data'], $frame_offset, 8);
1522 $frame_offset += 8;
1523
1524 $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
1525 $frame_contacturl = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
1526 $frame_offset = $frame_terminatorpos + strlen("\x00");
1527
1528 $frame_receivedasid = ord(substr($parsedFrame['data'], $frame_offset++, 1));
1529
1531 if (ord(substr($parsedFrame[
'data'], $frame_terminatorpos + strlen($this->
TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) {
1532 $frame_terminatorpos++;
1533 }
1534 $frame_sellername = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
1535 if (ord($frame_sellername) === 0) {
1536 $frame_sellername = '';
1537 }
1539
1541 if (ord(substr($parsedFrame[
'data'], $frame_terminatorpos + strlen($this->
TextEncodingTerminatorLookup($frame_textencoding)), 1)) === 0) {
1542 $frame_terminatorpos++;
1543 }
1544 $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
1545 if (ord($frame_description) === 0) {
1546 $frame_description = '';
1547 }
1549
1550 $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
1551 $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
1552 $frame_offset = $frame_terminatorpos + strlen("\x00");
1553
1554 $frame_sellerlogo = substr($parsedFrame['data'], $frame_offset);
1555
1556 $parsedFrame['encodingid'] = $frame_textencoding;
1558
1559 $parsedFrame['pricevaliduntil'] = $frame_datestring;
1560 $parsedFrame['contacturl'] = $frame_contacturl;
1561 $parsedFrame['receivedasid'] = $frame_receivedasid;
1563 $parsedFrame['sellername'] = $frame_sellername;
1564 $parsedFrame['description'] = $frame_description;
1565 $parsedFrame['mime'] = $frame_mimetype;
1566 $parsedFrame['logo'] = $frame_sellerlogo;
1567 unset($parsedFrame['data']);
1568
1569
1570 } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'ENCR')) {
1571
1572
1573
1574
1575
1576
1577
1578
1579 $frame_offset = 0;
1580 $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
1581 $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
1582 if (ord($frame_ownerid) === 0) {
1583 $frame_ownerid = '';
1584 }
1585 $frame_offset = $frame_terminatorpos + strlen("\x00");
1586
1587 $parsedFrame['ownerid'] = $frame_ownerid;
1588 $parsedFrame['methodsymbol'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
1589 $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset);
1590
1591
1592 } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'GRID')) {
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602 $frame_offset = 0;
1603 $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
1604 $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
1605 if (ord($frame_ownerid) === 0) {
1606 $frame_ownerid = '';
1607 }
1608 $frame_offset = $frame_terminatorpos + strlen("\x00");
1609
1610 $parsedFrame['ownerid'] = $frame_ownerid;
1611 $parsedFrame['groupsymbol'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
1612 $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset);
1613
1614
1615 } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'PRIV')) {
1616
1617
1618
1619
1620
1621
1622 $frame_offset = 0;
1623 $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
1624 $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
1625 if (ord($frame_ownerid) === 0) {
1626 $frame_ownerid = '';
1627 }
1628 $frame_offset = $frame_terminatorpos + strlen("\x00");
1629
1630 $parsedFrame['ownerid'] = $frame_ownerid;
1631 $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset);
1632
1633
1634 } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'SIGN')) {
1635
1636
1637
1638
1639
1640
1641 $frame_offset = 0;
1642 $parsedFrame['groupsymbol'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
1643 $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset);
1644
1645
1646 } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'SEEK')) {
1647
1648
1649
1650
1651 $frame_offset = 0;
1653
1654
1655 } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'ASPI')) {
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665 $frame_offset = 0;
1667 $frame_offset += 4;
1669 $frame_offset += 4;
1671 $frame_offset += 2;
1672 $parsedFrame['bitsperpoint'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));
1673 $frame_bytesperpoint = ceil($parsedFrame['bitsperpoint'] / 8);
1674 for ($i = 0; $i < $frame_indexpoints; $i++) {
1675 $parsedFrame[
'indexes'][$i] =
getid3_lib::BigEndian2Int(substr($parsedFrame[
'data'], $frame_offset, $frame_bytesperpoint));
1676 $frame_offset += $frame_bytesperpoint;
1677 }
1678 unset($parsedFrame['data']);
1679
1680 } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'RGAD')) {
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692 $frame_offset = 0;
1694 $frame_offset += 4;
1695 $rg_track_adjustment =
getid3_lib::Dec2Bin(substr($parsedFrame[
'data'], $frame_offset, 2));
1696 $frame_offset += 2;
1697 $rg_album_adjustment =
getid3_lib::Dec2Bin(substr($parsedFrame[
'data'], $frame_offset, 2));
1698 $frame_offset += 2;
1699 $parsedFrame[
'raw'][
'track'][
'name'] =
getid3_lib::Bin2Dec(substr($rg_track_adjustment, 0, 3));
1700 $parsedFrame[
'raw'][
'track'][
'originator'] =
getid3_lib::Bin2Dec(substr($rg_track_adjustment, 3, 3));
1701 $parsedFrame[
'raw'][
'track'][
'signbit'] =
getid3_lib::Bin2Dec(substr($rg_track_adjustment, 6, 1));
1702 $parsedFrame[
'raw'][
'track'][
'adjustment'] =
getid3_lib::Bin2Dec(substr($rg_track_adjustment, 7, 9));
1703 $parsedFrame[
'raw'][
'album'][
'name'] =
getid3_lib::Bin2Dec(substr($rg_album_adjustment, 0, 3));
1704 $parsedFrame[
'raw'][
'album'][
'originator'] =
getid3_lib::Bin2Dec(substr($rg_album_adjustment, 3, 3));
1705 $parsedFrame[
'raw'][
'album'][
'signbit'] =
getid3_lib::Bin2Dec(substr($rg_album_adjustment, 6, 1));
1706 $parsedFrame[
'raw'][
'album'][
'adjustment'] =
getid3_lib::Bin2Dec(substr($rg_album_adjustment, 7, 9));
1709 $parsedFrame[
'track'][
'adjustment'] =
getid3_lib::RGADadjustmentLookup($parsedFrame[
'raw'][
'track'][
'adjustment'], $parsedFrame[
'raw'][
'track'][
'signbit']);
1712 $parsedFrame[
'album'][
'adjustment'] =
getid3_lib::RGADadjustmentLookup($parsedFrame[
'raw'][
'album'][
'adjustment'], $parsedFrame[
'raw'][
'album'][
'signbit']);
1713
1714 $ThisFileInfo['replay_gain']['track']['peak'] = $parsedFrame['peakamplitude'];
1715 $ThisFileInfo['replay_gain']['track']['originator'] = $parsedFrame['track']['originator'];
1716 $ThisFileInfo['replay_gain']['track']['adjustment'] = $parsedFrame['track']['adjustment'];
1717 $ThisFileInfo['replay_gain']['album']['originator'] = $parsedFrame['album']['originator'];
1718 $ThisFileInfo['replay_gain']['album']['adjustment'] = $parsedFrame['album']['adjustment'];
1719
1720 unset($parsedFrame['data']);
1721
1722 }
1723
1724 return true;
1725 }
FrameNameLongLookup($framename)
TextEncodingTerminatorLookup($encoding)
LanguageLookup($languagecode, $casesensitive=false)
SYTLContentTypeLookup($index)
IsValidDateStampString($datestamp)
RVA2ChannelTypeLookup($index)
TextEncodingNameLookup($encoding)
COMRReceivedAsLookup($index)
FrameNameShortLookup($framename)
LookupCurrencyUnits($currencyid)
APICPictureTypeLookup($index, $returnarray=false)
BigEndian2Float($byteword)
RGADadjustmentLookup($rawadjustment, $signbit)
RGADoriginatorLookup($originatorcode)
GetDataImageSize($imgData)
RGADnameLookup($namecode)
iconv_fallback($in_charset, $out_charset, $string)
Bin2Dec($binstring, $signed=false)