wp/wp-includes/ID3/module.audio.flac.php
author ymh <ymh.work@gmail.com>
Tue, 09 Jun 2015 03:35:32 +0200
changeset 5 5e2f62d02dcd
parent 0 d970ebf37754
child 7 cf61fcea0001
permissions -rw-r--r--
upgrade wordpress + plugins
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
/////////////////////////////////////////////////////////////////
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
/// getID3() by James Heinrich <info@getid3.org>               //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
//  available at http://getid3.sourceforge.net                 //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
//            or http://www.getid3.org                         //
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
     6
//          also https://github.com/JamesHeinrich/getID3       //
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
/////////////////////////////////////////////////////////////////
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
// See readme.txt for more details                             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
/////////////////////////////////////////////////////////////////
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
//                                                             //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
// module.audio.flac.php                                       //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
// module for analyzing FLAC and OggFLAC audio files           //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
// dependencies: module.audio.ogg.php                          //
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
//                                                            ///
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
/////////////////////////////////////////////////////////////////
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ogg.php', __FILE__, true);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
* @tutorial http://flac.sourceforge.net/format.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
*/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
class getid3_flac extends getid3_handler
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
{
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
	const syncword = 'fLaC';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
	public function Analyze() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
		$this->fseek($info['avdataoffset']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
		$StreamMarker = $this->fread(4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
		if ($StreamMarker != self::syncword) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
			return $this->error('Expecting "'.getid3_lib::PrintHexBytes(self::syncword).'" at offset '.$info['avdataoffset'].', found "'.getid3_lib::PrintHexBytes($StreamMarker).'"');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
		$info['fileformat']            = 'flac';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
		$info['audio']['dataformat']   = 'flac';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
		$info['audio']['bitrate_mode'] = 'vbr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
		$info['audio']['lossless']     = true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
		// parse flac container
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
		return $this->parseMETAdata();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
	public function parseMETAdata() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
		do {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
			$BlockOffset   = $this->ftell();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
			$BlockHeader   = $this->fread(4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
			$LBFBT         = getid3_lib::BigEndian2Int(substr($BlockHeader, 0, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
			$LastBlockFlag = (bool) ($LBFBT & 0x80);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
			$BlockType     =        ($LBFBT & 0x7F);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
			$BlockLength   = getid3_lib::BigEndian2Int(substr($BlockHeader, 1, 3));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
			$BlockTypeText = self::metaBlockTypeLookup($BlockType);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
			if (($BlockOffset + 4 + $BlockLength) > $info['avdataend']) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
				$this->error('METADATA_BLOCK_HEADER.BLOCK_TYPE ('.$BlockTypeText.') at offset '.$BlockOffset.' extends beyond end of file');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
			if ($BlockLength < 1) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
				$this->error('METADATA_BLOCK_HEADER.BLOCK_LENGTH ('.$BlockLength.') at offset '.$BlockOffset.' is invalid');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
				break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
			$info['flac'][$BlockTypeText]['raw'] = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
			$BlockTypeText_raw = &$info['flac'][$BlockTypeText]['raw'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
			$BlockTypeText_raw['offset']          = $BlockOffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
			$BlockTypeText_raw['last_meta_block'] = $LastBlockFlag;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
			$BlockTypeText_raw['block_type']      = $BlockType;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
			$BlockTypeText_raw['block_type_text'] = $BlockTypeText;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
			$BlockTypeText_raw['block_length']    = $BlockLength;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
			if ($BlockTypeText_raw['block_type'] != 0x06) { // do not read attachment data automatically
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
				$BlockTypeText_raw['block_data']  = $this->fread($BlockLength);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
			switch ($BlockTypeText) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
				case 'STREAMINFO':     // 0x00
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
					if (!$this->parseSTREAMINFO($BlockTypeText_raw['block_data'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
						return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
				case 'PADDING':        // 0x01
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
					unset($info['flac']['PADDING']); // ignore
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
				case 'APPLICATION':    // 0x02
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
					if (!$this->parseAPPLICATION($BlockTypeText_raw['block_data'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
						return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
				case 'SEEKTABLE':      // 0x03
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
					if (!$this->parseSEEKTABLE($BlockTypeText_raw['block_data'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
						return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
				case 'VORBIS_COMMENT': // 0x04
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
					if (!$this->parseVORBIS_COMMENT($BlockTypeText_raw['block_data'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
						return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
				case 'CUESHEET':       // 0x05
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
					if (!$this->parseCUESHEET($BlockTypeText_raw['block_data'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
						return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
				case 'PICTURE':        // 0x06
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
					if (!$this->parsePICTURE()) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
						return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
					}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
					break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
				default:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
					$this->warning('Unhandled METADATA_BLOCK_HEADER.BLOCK_TYPE ('.$BlockType.') at offset '.$BlockOffset);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
			unset($info['flac'][$BlockTypeText]['raw']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
			$info['avdataoffset'] = $this->ftell();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
		while ($LastBlockFlag === false);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
		// handle tags
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
		if (!empty($info['flac']['VORBIS_COMMENT']['comments'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
			$info['flac']['comments'] = $info['flac']['VORBIS_COMMENT']['comments'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
		if (!empty($info['flac']['VORBIS_COMMENT']['vendor'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
			$info['audio']['encoder'] = str_replace('reference ', '', $info['flac']['VORBIS_COMMENT']['vendor']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
		// copy attachments to 'comments' array if nesesary
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
		if (isset($info['flac']['PICTURE']) && ($this->getid3->option_save_attachments !== getID3::ATTACHMENTS_NONE)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
			foreach ($info['flac']['PICTURE'] as $entry) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
				if (!empty($entry['data'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
					$info['flac']['comments']['picture'][] = array('image_mime'=>$entry['image_mime'], 'data'=>$entry['data']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
		if (isset($info['flac']['STREAMINFO'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
			if (!$this->isDependencyFor('matroska')) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
				$info['flac']['compressed_audio_bytes'] = $info['avdataend'] - $info['avdataoffset'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
			$info['flac']['uncompressed_audio_bytes'] = $info['flac']['STREAMINFO']['samples_stream'] * $info['flac']['STREAMINFO']['channels'] * ($info['flac']['STREAMINFO']['bits_per_sample'] / 8);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
			if ($info['flac']['uncompressed_audio_bytes'] == 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
				return $this->error('Corrupt FLAC file: uncompressed_audio_bytes == zero');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
			if (!empty($info['flac']['compressed_audio_bytes'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
				$info['flac']['compression_ratio'] = $info['flac']['compressed_audio_bytes'] / $info['flac']['uncompressed_audio_bytes'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
		// set md5_data_source - built into flac 0.5+
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
		if (isset($info['flac']['STREAMINFO']['audio_signature'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
			if ($info['flac']['STREAMINFO']['audio_signature'] === str_repeat("\x00", 16)) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
                $this->warning('FLAC STREAMINFO.audio_signature is null (known issue with libOggFLAC)');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
			else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
				$info['md5_data_source'] = '';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
				$md5 = $info['flac']['STREAMINFO']['audio_signature'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
				for ($i = 0; $i < strlen($md5); $i++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
					$info['md5_data_source'] .= str_pad(dechex(ord($md5[$i])), 2, '00', STR_PAD_LEFT);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
				if (!preg_match('/^[0-9a-f]{32}$/', $info['md5_data_source'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
					unset($info['md5_data_source']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
		if (isset($info['flac']['STREAMINFO']['bits_per_sample'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
			$info['audio']['bits_per_sample'] = $info['flac']['STREAMINFO']['bits_per_sample'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
			if ($info['audio']['bits_per_sample'] == 8) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
				// special case
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
				// must invert sign bit on all data bytes before MD5'ing to match FLAC's calculated value
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
				// MD5sum calculates on unsigned bytes, but FLAC calculated MD5 on 8-bit audio data as signed
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
				$this->warning('FLAC calculates MD5 data strangely on 8-bit audio, so the stored md5_data_source value will not match the decoded WAV file');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
	private function parseSTREAMINFO($BlockData) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
		$info['flac']['STREAMINFO'] = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
		$streaminfo = &$info['flac']['STREAMINFO'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
		$streaminfo['min_block_size']  = getid3_lib::BigEndian2Int(substr($BlockData, 0, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
		$streaminfo['max_block_size']  = getid3_lib::BigEndian2Int(substr($BlockData, 2, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
		$streaminfo['min_frame_size']  = getid3_lib::BigEndian2Int(substr($BlockData, 4, 3));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
		$streaminfo['max_frame_size']  = getid3_lib::BigEndian2Int(substr($BlockData, 7, 3));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
		$SRCSBSS                       = getid3_lib::BigEndian2Bin(substr($BlockData, 10, 8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
		$streaminfo['sample_rate']     = getid3_lib::Bin2Dec(substr($SRCSBSS,  0, 20));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
		$streaminfo['channels']        = getid3_lib::Bin2Dec(substr($SRCSBSS, 20,  3)) + 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
		$streaminfo['bits_per_sample'] = getid3_lib::Bin2Dec(substr($SRCSBSS, 23,  5)) + 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
		$streaminfo['samples_stream']  = getid3_lib::Bin2Dec(substr($SRCSBSS, 28, 36));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
		$streaminfo['audio_signature'] = substr($BlockData, 18, 16);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
		if (!empty($streaminfo['sample_rate'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
			$info['audio']['bitrate_mode']    = 'vbr';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
			$info['audio']['sample_rate']     = $streaminfo['sample_rate'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
			$info['audio']['channels']        = $streaminfo['channels'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
			$info['audio']['bits_per_sample'] = $streaminfo['bits_per_sample'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
			$info['playtime_seconds']         = $streaminfo['samples_stream'] / $streaminfo['sample_rate'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
			if ($info['playtime_seconds'] > 0) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
				if (!$this->isDependencyFor('matroska')) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
					$info['audio']['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
				else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
					$this->warning('Cannot determine audio bitrate because total stream size is unknown');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
			return $this->error('Corrupt METAdata block: STREAMINFO');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
	private function parseAPPLICATION($BlockData) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
		$ApplicationID = getid3_lib::BigEndian2Int(substr($BlockData, 0, 4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
		$info['flac']['APPLICATION'][$ApplicationID]['name'] = self::applicationIDLookup($ApplicationID);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
		$info['flac']['APPLICATION'][$ApplicationID]['data'] = substr($BlockData, 4);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
	private function parseSEEKTABLE($BlockData) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
		$offset = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
		$BlockLength = strlen($BlockData);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
		$placeholderpattern = str_repeat("\xFF", 8);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
		while ($offset < $BlockLength) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
			$SampleNumberString = substr($BlockData, $offset, 8);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
			$offset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
			if ($SampleNumberString == $placeholderpattern) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
				// placeholder point
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
				getid3_lib::safe_inc($info['flac']['SEEKTABLE']['placeholders'], 1);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
				$offset += 10;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
			} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
				$SampleNumber                                        = getid3_lib::BigEndian2Int($SampleNumberString);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
				$info['flac']['SEEKTABLE'][$SampleNumber]['offset']  = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
				$offset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
				$info['flac']['SEEKTABLE'][$SampleNumber]['samples'] = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 2));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
				$offset += 2;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
	private function parseVORBIS_COMMENT($BlockData) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
		$getid3_ogg = new getid3_ogg($this->getid3);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
		if ($this->isDependencyFor('matroska')) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
			$getid3_ogg->setStringMode($this->data_string);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
		$getid3_ogg->ParseVorbisComments();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
		if (isset($info['ogg'])) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
			unset($info['ogg']['comments_raw']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
			$info['flac']['VORBIS_COMMENT'] = $info['ogg'];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
			unset($info['ogg']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
		unset($getid3_ogg);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
	private function parseCUESHEET($BlockData) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
		$offset = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
		$info['flac']['CUESHEET']['media_catalog_number'] =                              trim(substr($BlockData, $offset, 128), "\0");
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
		$offset += 128;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
		$info['flac']['CUESHEET']['lead_in_samples']      =         getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
		$offset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
		$info['flac']['CUESHEET']['flags']['is_cd']       = (bool) (getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1)) & 0x80);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
		$offset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
		$offset += 258; // reserved
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
		$info['flac']['CUESHEET']['number_tracks']        =         getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
		$offset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
		for ($track = 0; $track < $info['flac']['CUESHEET']['number_tracks']; $track++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
			$TrackSampleOffset = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
			$offset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
			$TrackNumber       = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
			$offset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
			$info['flac']['CUESHEET']['tracks'][$TrackNumber]['sample_offset']         = $TrackSampleOffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
			$info['flac']['CUESHEET']['tracks'][$TrackNumber]['isrc']                  =                           substr($BlockData, $offset, 12);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
			$offset += 12;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
			$TrackFlagsRaw                                                             = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
			$offset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
			$info['flac']['CUESHEET']['tracks'][$TrackNumber]['flags']['is_audio']     = (bool) ($TrackFlagsRaw & 0x80);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
			$info['flac']['CUESHEET']['tracks'][$TrackNumber]['flags']['pre_emphasis'] = (bool) ($TrackFlagsRaw & 0x40);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
			$offset += 13; // reserved
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
			$info['flac']['CUESHEET']['tracks'][$TrackNumber]['index_points']          = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
			$offset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
			for ($index = 0; $index < $info['flac']['CUESHEET']['tracks'][$TrackNumber]['index_points']; $index++) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
				$IndexSampleOffset = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
				$offset += 8;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
				$IndexNumber       = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
				$offset += 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
				$offset += 3; // reserved
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
				$info['flac']['CUESHEET']['tracks'][$TrackNumber]['indexes'][$IndexNumber] = $IndexSampleOffset;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
	* Parse METADATA_BLOCK_PICTURE flac structure and extract attachment
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
	* External usage: audio.ogg
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
	*/
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
	public function parsePICTURE() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
		$info = &$this->getid3->info;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
		$picture['typeid']         = getid3_lib::BigEndian2Int($this->fread(4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
		$picture['type']           = self::pictureTypeLookup($picture['typeid']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
		$picture['image_mime']     = $this->fread(getid3_lib::BigEndian2Int($this->fread(4)));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
		$descr_length              = getid3_lib::BigEndian2Int($this->fread(4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
		if ($descr_length) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
			$picture['description'] = $this->fread($descr_length);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
		$picture['width']          = getid3_lib::BigEndian2Int($this->fread(4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
		$picture['height']         = getid3_lib::BigEndian2Int($this->fread(4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
		$picture['color_depth']    = getid3_lib::BigEndian2Int($this->fread(4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
		$picture['colors_indexed'] = getid3_lib::BigEndian2Int($this->fread(4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
		$data_length               = getid3_lib::BigEndian2Int($this->fread(4));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
		if ($picture['image_mime'] == '-->') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
			$picture['data'] = $this->fread($data_length);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
			$picture['data'] = $this->saveAttachment(
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
				str_replace('/', '_', $picture['type']).'_'.$this->ftell(),
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
				$this->ftell(),
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
				$data_length,
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
				$picture['image_mime']);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
		$info['flac']['PICTURE'][] = $picture;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
		return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
	public static function metaBlockTypeLookup($blocktype) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
		static $lookup = array(
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
			0 => 'STREAMINFO',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
			1 => 'PADDING',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
			2 => 'APPLICATION',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
			3 => 'SEEKTABLE',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
			4 => 'VORBIS_COMMENT',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
			5 => 'CUESHEET',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
			6 => 'PICTURE',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
		);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
		return (isset($lookup[$blocktype]) ? $lookup[$blocktype] : 'reserved');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
	public static function applicationIDLookup($applicationid) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
		// http://flac.sourceforge.net/id.html
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
		static $lookup = array(
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
			0x41544348 => 'FlacFile',                                                                           // "ATCH"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
			0x42534F4C => 'beSolo',                                                                             // "BSOL"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
			0x42554753 => 'Bugs Player',                                                                        // "BUGS"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
			0x43756573 => 'GoldWave cue points (specification)',                                                // "Cues"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
			0x46696361 => 'CUE Splitter',                                                                       // "Fica"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
			0x46746F6C => 'flac-tools',                                                                         // "Ftol"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
			0x4D4F5442 => 'MOTB MetaCzar',                                                                      // "MOTB"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
			0x4D505345 => 'MP3 Stream Editor',                                                                  // "MPSE"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
			0x4D754D4C => 'MusicML: Music Metadata Language',                                                   // "MuML"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
			0x52494646 => 'Sound Devices RIFF chunk storage',                                                   // "RIFF"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
			0x5346464C => 'Sound Font FLAC',                                                                    // "SFFL"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
			0x534F4E59 => 'Sony Creative Software',                                                             // "SONY"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
			0x5351455A => 'flacsqueeze',                                                                        // "SQEZ"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
			0x54745776 => 'TwistedWave',                                                                        // "TtWv"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
			0x55495453 => 'UITS Embedding tools',                                                               // "UITS"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
			0x61696666 => 'FLAC AIFF chunk storage',                                                            // "aiff"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
			0x696D6167 => 'flac-image application for storing arbitrary files in APPLICATION metadata blocks',  // "imag"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
			0x7065656D => 'Parseable Embedded Extensible Metadata (specification)',                             // "peem"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
			0x71667374 => 'QFLAC Studio',                                                                       // "qfst"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
			0x72696666 => 'FLAC RIFF chunk storage',                                                            // "riff"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
			0x74756E65 => 'TagTuner',                                                                           // "tune"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
			0x78626174 => 'XBAT',                                                                               // "xbat"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
			0x786D6364 => 'xmcd',                                                                               // "xmcd"
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
		);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
		return (isset($lookup[$applicationid]) ? $lookup[$applicationid] : 'reserved');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
	public static function pictureTypeLookup($type_id) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
		static $lookup = array (
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
			 0 => 'Other',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
			 1 => '32x32 pixels \'file icon\' (PNG only)',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
			 2 => 'Other file icon',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
			 3 => 'Cover (front)',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
			 4 => 'Cover (back)',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
			 5 => 'Leaflet page',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
			 6 => 'Media (e.g. label side of CD)',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
			 7 => 'Lead artist/lead performer/soloist',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
			 8 => 'Artist/performer',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
			 9 => 'Conductor',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
			10 => 'Band/Orchestra',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
			11 => 'Composer',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
			12 => 'Lyricist/text writer',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
			13 => 'Recording Location',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
			14 => 'During recording',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
			15 => 'During performance',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
			16 => 'Movie/video screen capture',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
			17 => 'A bright coloured fish',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
			18 => 'Illustration',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
			19 => 'Band/artist logotype',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
			20 => 'Publisher/Studio logotype',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
		);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
		return (isset($lookup[$type_id]) ? $lookup[$type_id] : 'reserved');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
5
5e2f62d02dcd upgrade wordpress + plugins
ymh <ymh.work@gmail.com>
parents: 0
diff changeset
   443
}