getid3_ogg::ParseVorbisComments() –

You appear to be a bot. Output may be restricted

Description

Usage

$bool = getid3_ogg::ParseVorbisComments();

Parameters

Returns

bool

Source

File name: wordpress/wp-includes/ID3/module.audio.ogg.php
Lines:

1 to 100 of 240
  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::getid3_ogg::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->getid3_ogg::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->getid3_ogg::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++;

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

 

 View on GitHub View on Trac