WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru
функция не описана

getid3_ogg::ParseVorbisComments() public WP 1.0

Это метод класса: getid3_ogg{}

Хуков нет.

Возвращает

true/false.

Использование

$getid3_ogg = new getid3_ogg();
$getid3_ogg->ParseVorbisComments();

Код getid3_ogg::ParseVorbisComments() WP 5.5.1

wp-includes/ID3/module.audio.ogg.php
<?php
public function ParseVorbisComments() {
	$info = &$this->getid3->info;

	$OriginalOffset = $this->ftell();
	$commentdata = null;
	$commentdataoffset = 0;
	$VorbisCommentPage = 1;
	$CommentStartOffset = 0;

	switch ($info['audio']['dataformat']) {
		case 'vorbis':
		case 'speex':
		case 'opus':
			$CommentStartOffset = $info['ogg']['pageheader'][$VorbisCommentPage]['page_start_offset'];  // Second Ogg page, after header block
			$this->fseek($CommentStartOffset);
			$commentdataoffset = 27 + $info['ogg']['pageheader'][$VorbisCommentPage]['page_segments'];
			$commentdata = $this->fread(self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1) + $commentdataoffset);

			if ($info['audio']['dataformat'] == 'vorbis') {
				$commentdataoffset += (strlen('vorbis') + 1);
			}
			else if ($info['audio']['dataformat'] == 'opus') {
				$commentdataoffset += strlen('OpusTags');
			}

			break;

		case 'flac':
			$CommentStartOffset = $info['flac']['VORBIS_COMMENT']['raw']['offset'] + 4;
			$this->fseek($CommentStartOffset);
			$commentdata = $this->fread($info['flac']['VORBIS_COMMENT']['raw']['block_length']);
			break;

		default:
			return false;
	}

	$VendorSize = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4));
	$commentdataoffset += 4;

	$info['ogg']['vendor'] = substr($commentdata, $commentdataoffset, $VendorSize);
	$commentdataoffset += $VendorSize;

	$CommentsCount = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4));
	$commentdataoffset += 4;
	$info['avdataoffset'] = $CommentStartOffset + $commentdataoffset;

	$basicfields = array('TITLE', 'ARTIST', 'ALBUM', 'TRACKNUMBER', 'GENRE', 'DATE', 'DESCRIPTION', 'COMMENT');
	$ThisFileInfo_ogg_comments_raw = &$info['ogg']['comments_raw'];
	for ($i = 0; $i < $CommentsCount; $i++) {

		if ($i >= 10000) {
			// https://github.com/owncloud/music/issues/212#issuecomment-43082336
			$this->warning('Unexpectedly large number ('.$CommentsCount.') of Ogg comments - breaking after reading '.$i.' comments');
			break;
		}

		$ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] = $CommentStartOffset + $commentdataoffset;

		if ($this->ftell() < ($ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] + 4)) {
			if ($oggpageinfo = $this->ParseOggPageHeader()) {
				$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;

				$VorbisCommentPage++;

				// First, save what we haven't read yet
				$AsYetUnusedData = substr($commentdata, $commentdataoffset);

				// Then take that data off the end
				$commentdata     = substr($commentdata, 0, $commentdataoffset);

				// Add [headerlength] bytes of dummy data for the Ogg Page Header, just to keep absolute offsets correct
				$commentdata .= str_repeat("\x00", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
				$commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);

				// Finally, stick the unused data back on the end
				$commentdata .= $AsYetUnusedData;

				//$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);
				$commentdata .= $this->fread($this->OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1));
			}

		}
		$ThisFileInfo_ogg_comments_raw[$i]['size'] = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4));

		// replace avdataoffset with position just after the last vorbiscomment
		$info['avdataoffset'] = $ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] + $ThisFileInfo_ogg_comments_raw[$i]['size'] + 4;

		$commentdataoffset += 4;
		while ((strlen($commentdata) - $commentdataoffset) < $ThisFileInfo_ogg_comments_raw[$i]['size']) {
			if (($ThisFileInfo_ogg_comments_raw[$i]['size'] > $info['avdataend']) || ($ThisFileInfo_ogg_comments_raw[$i]['size'] < 0)) {
				$this->warning('Invalid Ogg comment size (comment #'.$i.', claims to be '.number_format($ThisFileInfo_ogg_comments_raw[$i]['size']).' bytes) - aborting reading comments');
				break 2;
			}

			$VorbisCommentPage++;

			$oggpageinfo = $this->ParseOggPageHeader();
			$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;

			// First, save what we haven't read yet
			$AsYetUnusedData = substr($commentdata, $commentdataoffset);

			// Then take that data off the end
			$commentdata     = substr($commentdata, 0, $commentdataoffset);

			// Add [headerlength] bytes of dummy data for the Ogg Page Header, just to keep absolute offsets correct
			$commentdata .= str_repeat("\x00", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
			$commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);

			// Finally, stick the unused data back on the end
			$commentdata .= $AsYetUnusedData;

			//$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);
			if (!isset($info['ogg']['pageheader'][$VorbisCommentPage])) {
				$this->warning('undefined Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell());
				break;
			}
			$readlength = self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1);
			if ($readlength <= 0) {
				$this->warning('invalid length Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell());
				break;
			}
			$commentdata .= $this->fread($readlength);

			//$filebaseoffset += $oggpageinfo['header_end_offset'] - $oggpageinfo['page_start_offset'];
		}
		$ThisFileInfo_ogg_comments_raw[$i]['offset'] = $commentdataoffset;
		$commentstring = substr($commentdata, $commentdataoffset, $ThisFileInfo_ogg_comments_raw[$i]['size']);
		$commentdataoffset += $ThisFileInfo_ogg_comments_raw[$i]['size'];

		if (!$commentstring) {

			// no comment?
			$this->warning('Blank Ogg comment ['.$i.']');

		} elseif (strstr($commentstring, '=')) {

			$commentexploded = explode('=', $commentstring, 2);
			$ThisFileInfo_ogg_comments_raw[$i]['key']   = strtoupper($commentexploded[0]);
			$ThisFileInfo_ogg_comments_raw[$i]['value'] = (isset($commentexploded[1]) ? $commentexploded[1] : '');

			if ($ThisFileInfo_ogg_comments_raw[$i]['key'] == 'METADATA_BLOCK_PICTURE') {

				// http://wiki.xiph.org/VorbisComment#METADATA_BLOCK_PICTURE
				// The unencoded format is that of the FLAC picture block. The fields are stored in big endian order as in FLAC, picture data is stored according to the relevant standard.
				// http://flac.sourceforge.net/format.html#metadata_block_picture
				$flac = new getid3_flac($this->getid3);
				$flac->setStringMode(base64_decode($ThisFileInfo_ogg_comments_raw[$i]['value']));
				$flac->parsePICTURE();
				$info['ogg']['comments']['picture'][] = $flac->getid3->info['flac']['PICTURE'][0];
				unset($flac);

			} elseif ($ThisFileInfo_ogg_comments_raw[$i]['key'] == 'COVERART') {

				$data = base64_decode($ThisFileInfo_ogg_comments_raw[$i]['value']);
				$this->notice('Found deprecated COVERART tag, it should be replaced in honor of METADATA_BLOCK_PICTURE structure');
				/** @todo use 'coverartmime' where available */
				$imageinfo = getid3_lib::GetDataImageSize($data);
				if ($imageinfo === false || !isset($imageinfo['mime'])) {
					$this->warning('COVERART vorbiscomment tag contains invalid image');
					continue;
				}

				$ogg = new self($this->getid3);
				$ogg->setStringMode($data);
				$info['ogg']['comments']['picture'][] = array(
					'image_mime'   => $imageinfo['mime'],
					'datalength'   => strlen($data),
					'picturetype'  => 'cover art',
					'image_height' => $imageinfo['height'],
					'image_width'  => $imageinfo['width'],
					'data'         => $ogg->saveAttachment('coverart', 0, strlen($data), $imageinfo['mime']),
				);
				unset($ogg);

			} else {

				$info['ogg']['comments'][strtolower($ThisFileInfo_ogg_comments_raw[$i]['key'])][] = $ThisFileInfo_ogg_comments_raw[$i]['value'];

			}

		} else {

			$this->warning('[known problem with CDex >= v1.40, < v1.50b7] Invalid Ogg comment name/value pair ['.$i.']: '.$commentstring);

		}
		unset($ThisFileInfo_ogg_comments_raw[$i]);
	}
	unset($ThisFileInfo_ogg_comments_raw);


	// Replay Gain Adjustment
	// http://privatewww.essex.ac.uk/~djmrob/replaygain/
	if (isset($info['ogg']['comments']) && is_array($info['ogg']['comments'])) {
		foreach ($info['ogg']['comments'] as $index => $commentvalue) {
			switch ($index) {
				case 'rg_audiophile':
				case 'replaygain_album_gain':
					$info['replay_gain']['album']['adjustment'] = (double) $commentvalue[0];
					unset($info['ogg']['comments'][$index]);
					break;

				case 'rg_radio':
				case 'replaygain_track_gain':
					$info['replay_gain']['track']['adjustment'] = (double) $commentvalue[0];
					unset($info['ogg']['comments'][$index]);
					break;

				case 'replaygain_album_peak':
					$info['replay_gain']['album']['peak'] = (double) $commentvalue[0];
					unset($info['ogg']['comments'][$index]);
					break;

				case 'rg_peak':
				case 'replaygain_track_peak':
					$info['replay_gain']['track']['peak'] = (double) $commentvalue[0];
					unset($info['ogg']['comments'][$index]);
					break;

				case 'replaygain_reference_loudness':
					$info['replay_gain']['reference_volume'] = (double) $commentvalue[0];
					unset($info['ogg']['comments'][$index]);
					break;

				default:
					// do nothing
					break;
			}
		}
	}

	$this->fseek($OriginalOffset);

	return true;
}