<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>library/Zend/Id3/Adapter/Id3v2/Exception.php</filename>
    </added>
    <added>
      <filename>library/Zend/Id3/Adapter/Id3v2/Frames.php</filename>
    </added>
    <added>
      <filename>library/Zend/Id3/Adapter/Id3v2/Frames/Abstract.php</filename>
    </added>
    <added>
      <filename>library/Zend/Id3/Adapter/Id3v2/Frames/Exception.php</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -14,117 +14,117 @@
 class Zend_Id3
 {
 
-	/**
-	 * Size of read buffer in bytes
-	 */
-	const FREAD_BUFFER_SIZE = 16384;
-
-	/**
-	 * Name of the file
-	 *
-	 * @var string
-	 */
-	protected $_filename;
-
-	/**
-	 * File Pointer
-	 *
-	 * @var resource
-	 */
-	protected $_filePointer;
-
-	/**
-	 * id3 tag info
-	 *
-	 * @var array
-	 */
-	protected $_info = array();
-
-	/**
-	 *
-	 */
-	function __construct()
-	{
-		// nothing yet
-	}
-
-	/**
-	 *
-	 * @param $filename string
-	 */
-	public function analyze($filename)
-	{
-		// Remote files not supported
-		if (preg_match('#^([a-z][a-z0-9+.-]+):(//)?(.*?@)?#i', $filename)) {
-			include_once 'Zend/Id3/Exception.php';
-			throw new Zend_Id3_Exception('Remote files are not supported');
-		}
-
-		$this-&gt;_filename = $filename;
-
-		// Open local file
-		if (false === ($this-&gt;_filePointer = @fopen($this-&gt;_filename, 'rb'))) {
-			include_once 'Zend/Id3/Exception.php';
-			throw new Zend_Id3_Exception('Could not open file &quot;' . $filename  . &quot;'&quot;);
-		}
-
-		// Set filesize related parameters
-		$this-&gt;_info['filesize']     = filesize($filename);
-		$this-&gt;_info['avdataoffset'] = 0;
-		$this-&gt;_info['avdataend']    = $this-&gt;info['filesize'];
-
-
-		foreach(array('id3v1', 'id3v2') as $tagName) {
-			switch($tagName) {
-				case 'id3v1':
-					include_once 'Zend/Id3/Adapter/Id3v1.php';
-					$tag = new Zend_Id3_Adapter_Id3v1($this);
-					$tag-&gt;analyze();
-					break;
-				case 'id3v2':
-					include_once 'Zend/Id3/Adapter/Id3v2.php';
-					$tag = new Zend_Id3_Adapter_Id3v2($this);
-					$tag-&gt;analyze();
-					break;
-			}
-		}
-
-		fclose($this-&gt;_filePointer);
-
-
-		return $this-&gt;_info;
-	}
-
-	/**
-	 * Gets the open file pointer
-	 *
-	 * @return resource
-	 */
-	public function getFilePointer()
-	{
-		return $this-&gt;_filePointer;
-	}
-
-	/**
-	 * Gets the file info
-	 *
-	 * @return array
-	 */
-	public function getFileInfo()
-	{
-		return $this-&gt;_info;
-	}
-
-	/**
-	 * Sets the file info
-	 *
-	 * @param array $info
-	 * @return Zend_Id3
-	 */
-	public function setFileInfo(array $info)
-	{
-		$this-&gt;_info = $info;
-
-		return $this;
-	}
+    /**
+     * Size of read buffer in bytes
+     */
+    const FREAD_BUFFER_SIZE = 16384;
+
+    /**
+     * Name of the file
+     *
+     * @var string
+     */
+    protected $_filename;
+
+    /**
+     * File Pointer
+     *
+     * @var resource
+     */
+    protected $_filePointer;
+
+    /**
+     * id3 tag info
+     *
+     * @var array
+     */
+    protected $_info = array();
+
+    /**
+     *
+     */
+    function __construct()
+    {
+        // nothing yet
+    }
+
+    /**
+     *
+     * @param $filename string
+     */
+    public function analyze($filename)
+    {
+        // Remote files not supported
+        if (preg_match('#^([a-z][a-z0-9+.-]+):(//)?(.*?@)?#i', $filename)) {
+            include_once 'Zend/Id3/Exception.php';
+            throw new Zend_Id3_Exception('Remote files are not supported');
+        }
+
+        $this-&gt;_filename = $filename;
+
+        // Open local file
+        if (false === ($this-&gt;_filePointer = @fopen($this-&gt;_filename, 'rb'))) {
+            include_once 'Zend/Id3/Exception.php';
+            throw new Zend_Id3_Exception('Could not open file &quot;' . $filename  . &quot;'&quot;);
+        }
+
+        // Set filesize related parameters
+        $this-&gt;_info['filesize']     = filesize($filename);
+        $this-&gt;_info['avdataoffset'] = 0;
+        $this-&gt;_info['avdataend']    = $this-&gt;_info['filesize'];
+
+
+        foreach(array('id3v1', 'id3v2') as $tagName) {
+            switch($tagName) {
+                case 'id3v1':
+                    include_once 'Zend/Id3/Adapter/Id3v1.php';
+                    $tag = new Zend_Id3_Adapter_Id3v1($this);
+                    $tag-&gt;analyze();
+                    break;
+                case 'id3v2':
+                    include_once 'Zend/Id3/Adapter/Id3v2.php';
+                    $tag = new Zend_Id3_Adapter_Id3v2($this);
+                    $tag-&gt;analyze();
+                    break;
+            }
+        }
+
+        fclose($this-&gt;_filePointer);
+
+
+        return $this-&gt;_info;
+    }
+
+    /**
+     * Gets the open file pointer
+     *
+     * @return resource
+     */
+    public function getFilePointer()
+    {
+        return $this-&gt;_filePointer;
+    }
+
+    /**
+     * Gets the file info
+     *
+     * @return array
+     */
+    public function getFileInfo()
+    {
+        return $this-&gt;_info;
+    }
+
+    /**
+     * Sets the file info
+     *
+     * @param array $info
+     * @return Zend_Id3
+     */
+    public function setFileInfo(array $info)
+    {
+        $this-&gt;_info = $info;
+
+        return $this;
+    }
 }</diff>
      <filename>library/Zend/Id3.php</filename>
    </modified>
    <modified>
      <diff>@@ -15,244 +15,245 @@ require_once ('library/Zend/Id3/Adapter/Abstract.php');
 
 class Zend_Id3_Adapter_Id3v1 extends Zend_Id3_Adapter_Abstract
 {
-	/**
-	 * List of Geners for Id3v1
-	 *
-	 * @var array
-	 */
-	protected $_genres = array (
-			0    =&gt; 'Blues',
-			1    =&gt; 'Classic Rock',
-			2    =&gt; 'Country',
-			3    =&gt; 'Dance',
-			4    =&gt; 'Disco',
-			5    =&gt; 'Funk',
-			6    =&gt; 'Grunge',
-			7    =&gt; 'Hip-Hop',
-			8    =&gt; 'Jazz',
-			9    =&gt; 'Metal',
-			10   =&gt; 'New Age',
-			11   =&gt; 'Oldies',
-			12   =&gt; 'Other',
-			13   =&gt; 'Pop',
-			14   =&gt; 'R&amp;B',
-			15   =&gt; 'Rap',
-			16   =&gt; 'Reggae',
-			17   =&gt; 'Rock',
-			18   =&gt; 'Techno',
-			19   =&gt; 'Industrial',
-			20   =&gt; 'Alternative',
-			21   =&gt; 'Ska',
-			22   =&gt; 'Death Metal',
-			23   =&gt; 'Pranks',
-			24   =&gt; 'Soundtrack',
-			25   =&gt; 'Euro-Techno',
-			26   =&gt; 'Ambient',
-			27   =&gt; 'Trip-Hop',
-			28   =&gt; 'Vocal',
-			29   =&gt; 'Jazz+Funk',
-			30   =&gt; 'Fusion',
-			31   =&gt; 'Trance',
-			32   =&gt; 'Classical',
-			33   =&gt; 'Instrumental',
-			34   =&gt; 'Acid',
-			35   =&gt; 'House',
-			36   =&gt; 'Game',
-			37   =&gt; 'Sound Clip',
-			38   =&gt; 'Gospel',
-			39   =&gt; 'Noise',
-			40   =&gt; 'Alt. Rock',
-			41   =&gt; 'Bass',
-			42   =&gt; 'Soul',
-			43   =&gt; 'Punk',
-			44   =&gt; 'Space',
-			45   =&gt; 'Meditative',
-			46   =&gt; 'Instrumental Pop',
-			47   =&gt; 'Instrumental Rock',
-			48   =&gt; 'Ethnic',
-			49   =&gt; 'Gothic',
-			50   =&gt; 'Darkwave',
-			51   =&gt; 'Techno-Industrial',
-			52   =&gt; 'Electronic',
-			53   =&gt; 'Pop-Folk',
-			54   =&gt; 'Eurodance',
-			55   =&gt; 'Dream',
-			56   =&gt; 'Southern Rock',
-			57   =&gt; 'Comedy',
-			58   =&gt; 'Cult',
-			59   =&gt; 'Gangsta Rap',
-			60   =&gt; 'Top 40',
-			61   =&gt; 'Christian Rap',
-			62   =&gt; 'Pop/Funk',
-			63   =&gt; 'Jungle',
-			64   =&gt; 'Native American',
-			65   =&gt; 'Cabaret',
-			66   =&gt; 'New Wave',
-			67   =&gt; 'Psychedelic',
-			68   =&gt; 'Rave',
-			69   =&gt; 'Showtunes',
-			70   =&gt; 'Trailer',
-			71   =&gt; 'Lo-Fi',
-			72   =&gt; 'Tribal',
-			73   =&gt; 'Acid Punk',
-			74   =&gt; 'Acid Jazz',
-			75   =&gt; 'Polka',
-			76   =&gt; 'Retro',
-			77   =&gt; 'Musical',
-			78   =&gt; 'Rock &amp; Roll',
-			79   =&gt; 'Hard Rock',
-			80   =&gt; 'Folk',
-			81   =&gt; 'Folk/Rock',
-			82   =&gt; 'National Folk',
-			83   =&gt; 'Swing',
-			84   =&gt; 'Fast-Fusion',
-			85   =&gt; 'Bebob',
-			86   =&gt; 'Latin',
-			87   =&gt; 'Revival',
-			88   =&gt; 'Celtic',
-			89   =&gt; 'Bluegrass',
-			90   =&gt; 'Avantgarde',
-			91   =&gt; 'Gothic Rock',
-			92   =&gt; 'Progressive Rock',
-			93   =&gt; 'Psychedelic Rock',
-			94   =&gt; 'Symphonic Rock',
-			95   =&gt; 'Slow Rock',
-			96   =&gt; 'Big Band',
-			97   =&gt; 'Chorus',
-			98   =&gt; 'Easy Listening',
-			99   =&gt; 'Acoustic',
-			100  =&gt; 'Humour',
-			101  =&gt; 'Speech',
-			102  =&gt; 'Chanson',
-			103  =&gt; 'Opera',
-			104  =&gt; 'Chamber Music',
-			105  =&gt; 'Sonata',
-			106  =&gt; 'Symphony',
-			107  =&gt; 'Booty Bass',
-			108  =&gt; 'Primus',
-			109  =&gt; 'Porn Groove',
-			110  =&gt; 'Satire',
-			111  =&gt; 'Slow Jam',
-			112  =&gt; 'Club',
-			113  =&gt; 'Tango',
-			114  =&gt; 'Samba',
-			115  =&gt; 'Folklore',
-			116  =&gt; 'Ballad',
-			117  =&gt; 'Power Ballad',
-			118  =&gt; 'Rhythmic Soul',
-			119  =&gt; 'Freestyle',
-			120  =&gt; 'Duet',
-			121  =&gt; 'Punk Rock',
-			122  =&gt; 'Drum Solo',
-			123  =&gt; 'A Cappella',
-			124  =&gt; 'Euro-House',
-			125  =&gt; 'Dance Hall',
-			126  =&gt; 'Goa',
-			127  =&gt; 'Drum &amp; Bass',
-			128  =&gt; 'Club-House',
-			129  =&gt; 'Hardcore',
-			130  =&gt; 'Terror',
-			131  =&gt; 'Indie',
-			132  =&gt; 'BritPop',
-			133  =&gt; 'Negerpunk',
-			134  =&gt; 'Polsk Punk',
-			135  =&gt; 'Beat',
-			136  =&gt; 'Christian Gangsta Rap',
-			137  =&gt; 'Heavy Metal',
-			138  =&gt; 'Black Metal',
-			139  =&gt; 'Crossover',
-			140  =&gt; 'Contemporary Christian',
-			141  =&gt; 'Christian Rock',
-			142  =&gt; 'Merengue',
-			143  =&gt; 'Salsa',
-			144  =&gt; 'Trash Metal',
-			145  =&gt; 'Anime',
-			146  =&gt; 'JPop',
-			147  =&gt; 'Synthpop',
+    /**
+     * List of Geners for Id3v1
+     *
+     * @var array
+     */
+    protected $_genres = array (
+            0    =&gt; 'Blues',
+            1    =&gt; 'Classic Rock',
+            2    =&gt; 'Country',
+            3    =&gt; 'Dance',
+            4    =&gt; 'Disco',
+            5    =&gt; 'Funk',
+            6    =&gt; 'Grunge',
+            7    =&gt; 'Hip-Hop',
+            8    =&gt; 'Jazz',
+            9    =&gt; 'Metal',
+            10   =&gt; 'New Age',
+            11   =&gt; 'Oldies',
+            12   =&gt; 'Other',
+            13   =&gt; 'Pop',
+            14   =&gt; 'R&amp;B',
+            15   =&gt; 'Rap',
+            16   =&gt; 'Reggae',
+            17   =&gt; 'Rock',
+            18   =&gt; 'Techno',
+            19   =&gt; 'Industrial',
+            20   =&gt; 'Alternative',
+            21   =&gt; 'Ska',
+            22   =&gt; 'Death Metal',
+            23   =&gt; 'Pranks',
+            24   =&gt; 'Soundtrack',
+            25   =&gt; 'Euro-Techno',
+            26   =&gt; 'Ambient',
+            27   =&gt; 'Trip-Hop',
+            28   =&gt; 'Vocal',
+            29   =&gt; 'Jazz+Funk',
+            30   =&gt; 'Fusion',
+            31   =&gt; 'Trance',
+            32   =&gt; 'Classical',
+            33   =&gt; 'Instrumental',
+            34   =&gt; 'Acid',
+            35   =&gt; 'House',
+            36   =&gt; 'Game',
+            37   =&gt; 'Sound Clip',
+            38   =&gt; 'Gospel',
+            39   =&gt; 'Noise',
+            40   =&gt; 'Alt. Rock',
+            41   =&gt; 'Bass',
+            42   =&gt; 'Soul',
+            43   =&gt; 'Punk',
+            44   =&gt; 'Space',
+            45   =&gt; 'Meditative',
+            46   =&gt; 'Instrumental Pop',
+            47   =&gt; 'Instrumental Rock',
+            48   =&gt; 'Ethnic',
+            49   =&gt; 'Gothic',
+            50   =&gt; 'Darkwave',
+            51   =&gt; 'Techno-Industrial',
+            52   =&gt; 'Electronic',
+            53   =&gt; 'Pop-Folk',
+            54   =&gt; 'Eurodance',
+            55   =&gt; 'Dream',
+            56   =&gt; 'Southern Rock',
+            57   =&gt; 'Comedy',
+            58   =&gt; 'Cult',
+            59   =&gt; 'Gangsta Rap',
+            60   =&gt; 'Top 40',
+            61   =&gt; 'Christian Rap',
+            62   =&gt; 'Pop/Funk',
+            63   =&gt; 'Jungle',
+            64   =&gt; 'Native American',
+            65   =&gt; 'Cabaret',
+            66   =&gt; 'New Wave',
+            67   =&gt; 'Psychedelic',
+            68   =&gt; 'Rave',
+            69   =&gt; 'Showtunes',
+            70   =&gt; 'Trailer',
+            71   =&gt; 'Lo-Fi',
+            72   =&gt; 'Tribal',
+            73   =&gt; 'Acid Punk',
+            74   =&gt; 'Acid Jazz',
+            75   =&gt; 'Polka',
+            76   =&gt; 'Retro',
+            77   =&gt; 'Musical',
+            78   =&gt; 'Rock &amp; Roll',
+            79   =&gt; 'Hard Rock',
+            80   =&gt; 'Folk',
+            81   =&gt; 'Folk/Rock',
+            82   =&gt; 'National Folk',
+            83   =&gt; 'Swing',
+            84   =&gt; 'Fast-Fusion',
+            85   =&gt; 'Bebob',
+            86   =&gt; 'Latin',
+            87   =&gt; 'Revival',
+            88   =&gt; 'Celtic',
+            89   =&gt; 'Bluegrass',
+            90   =&gt; 'Avantgarde',
+            91   =&gt; 'Gothic Rock',
+            92   =&gt; 'Progressive Rock',
+            93   =&gt; 'Psychedelic Rock',
+            94   =&gt; 'Symphonic Rock',
+            95   =&gt; 'Slow Rock',
+            96   =&gt; 'Big Band',
+            97   =&gt; 'Chorus',
+            98   =&gt; 'Easy Listening',
+            99   =&gt; 'Acoustic',
+            100  =&gt; 'Humour',
+            101  =&gt; 'Speech',
+            102  =&gt; 'Chanson',
+            103  =&gt; 'Opera',
+            104  =&gt; 'Chamber Music',
+            105  =&gt; 'Sonata',
+            106  =&gt; 'Symphony',
+            107  =&gt; 'Booty Bass',
+            108  =&gt; 'Primus',
+            109  =&gt; 'Porn Groove',
+            110  =&gt; 'Satire',
+            111  =&gt; 'Slow Jam',
+            112  =&gt; 'Club',
+            113  =&gt; 'Tango',
+            114  =&gt; 'Samba',
+            115  =&gt; 'Folklore',
+            116  =&gt; 'Ballad',
+            117  =&gt; 'Power Ballad',
+            118  =&gt; 'Rhythmic Soul',
+            119  =&gt; 'Freestyle',
+            120  =&gt; 'Duet',
+            121  =&gt; 'Punk Rock',
+            122  =&gt; 'Drum Solo',
+            123  =&gt; 'A Cappella',
+            124  =&gt; 'Euro-House',
+            125  =&gt; 'Dance Hall',
+            126  =&gt; 'Goa',
+            127  =&gt; 'Drum &amp; Bass',
+            128  =&gt; 'Club-House',
+            129  =&gt; 'Hardcore',
+            130  =&gt; 'Terror',
+            131  =&gt; 'Indie',
+            132  =&gt; 'BritPop',
+            133  =&gt; 'Negerpunk',
+            134  =&gt; 'Polsk Punk',
+            135  =&gt; 'Beat',
+            136  =&gt; 'Christian Gangsta Rap',
+            137  =&gt; 'Heavy Metal',
+            138  =&gt; 'Black Metal',
+            139  =&gt; 'Crossover',
+            140  =&gt; 'Contemporary Christian',
+            141  =&gt; 'Christian Rock',
+            142  =&gt; 'Merengue',
+            143  =&gt; 'Salsa',
+            144  =&gt; 'Trash Metal',
+            145  =&gt; 'Anime',
+            146  =&gt; 'JPop',
+            147  =&gt; 'Synthpop',
 
-			255  =&gt; 'Unknown',
+            255  =&gt; 'Unknown',
 
-			'CR' =&gt; 'Cover',
-			'RX' =&gt; 'Remix'
-		);
+            'CR' =&gt; 'Cover',
+            'RX' =&gt; 'Remix'
+        );
 
-	public function analyze()
-	{
-		$fp = $this-&gt;_id3-&gt;getFilePointer();
-		$info = $this-&gt;_id3-&gt;getFileInfo();
+    public function analyze()
+    {
+        $fp = $this-&gt;_id3-&gt;getFilePointer();
+        $info = $this-&gt;_id3-&gt;getFileInfo();
 
-		fseek($fp, -256, SEEK_END);
-		$_beforeId3v1 = fread($fp, 128);
-		$_id3Tag = fread($fp, 128);
+        fseek($fp, -256, SEEK_END);
+        $_beforeId3v1 = fread($fp, 128);
+        $_id3Tag = fread($fp, 128);
 
-		if(substr($_id3Tag, 0, 3) == 'TAG') {
-			$info['avdataend'] -= 128;
+        if(substr($_id3Tag, 0, 3) == 'TAG') {
+            $info['avdataend'] -= 128;
 
-			$info['id3v1'] = array();
+            $info['id3v1'] = array();
 
-			$info['id3v1']['title'] = $this-&gt;_cutfield(substr($_id3Tag, 3, 30));
-			$info['id3v1']['artist'] = $this-&gt;_cutfield(substr($_id3Tag, 33, 30));
-			$info['id3v1']['album'] = $this-&gt;_cutfield(substr($_id3Tag, 63, 30));
-			$info['id3v1']['year'] = $this-&gt;_cutfield(substr($_id3Tag, 93, 4));
-			$info['id3v1']['comment'] = substr($_id3Tag, 97, 30);
-			$info['id3v1']['genreid'] = ord(substr($_id3Tag, 127, 1));
+            $info['id3v1']['title'] = $this-&gt;_cutfield(substr($_id3Tag, 3, 30));
+            $info['id3v1']['artist'] = $this-&gt;_cutfield(substr($_id3Tag, 33, 30));
+            $info['id3v1']['album'] = $this-&gt;_cutfield(substr($_id3Tag, 63, 30));
+            $info['id3v1']['year'] = $this-&gt;_cutfield(substr($_id3Tag, 93, 4));
+            $info['id3v1']['comment'] = substr($_id3Tag, 97, 30);
+            $info['id3v1']['genreid'] = ord(substr($_id3Tag, 127, 1));
 
-			// check to see if this is ID3v1.1 to see if there is a track number
-			if(($_id3Tag{125} === &quot;\x00&quot;) &amp;&amp; ($_id3Tag{126} !== &quot;\x00&quot;)) {
-				$info['id3v1']['track']   = ord(substr($info['id3v1']['comment'], 29,  1));
-				$info['id3v1']['comment'] =     substr($info['id3v1']['comment'],  0, 28);
-			}
-			$info['id3v1']['comment'] = $this-&gt;_cutfield($info['comment']);
+            // check to see if this is ID3v1.1 to see if there is a track number
+            if(($_id3Tag{125} === &quot;\x00&quot;) &amp;&amp; ($_id3Tag{126} !== &quot;\x00&quot;)) {
+                $info['id3v1']['track']   = ord(substr($info['id3v1']['comment'], 29,  1));
+                $info['id3v1']['comment'] =     substr($info['id3v1']['comment'],  0, 28);
+            }
 
-			$info['id3v1']['genre'] = $this-&gt;_lookupGenreName($info['id3v1']['genreid']);
-			if (!empty($info['id3v1']['genre'])) {
-				unset($info['id3v1']['genreid']);
-			}
-			if (empty($info['id3v1']['genre']) || (@$info['id3v1']['genre'] == 'Unknown')) {
-				unset($info['id3v1']['genre']);
-			}
+            $info['id3v1']['comment'] = $this-&gt;_cutfield($info['id3v1']['comment']);
 
-			$info['id3v1']['tag_offset_end']   = $info['filesize'];
-			$info['id3v1']['tag_offset_start'] = $info['id3v1']['tag_offset_end'] - 128;
-		}
+            $info['id3v1']['genre'] = $this-&gt;_lookupGenreName($info['id3v1']['genreid']);
+            if (!empty($info['id3v1']['genre'])) {
+                unset($info['id3v1']['genreid']);
+            }
+            if (empty($info['id3v1']['genre']) || (@$info['id3v1']['genre'] == 'Unknown')) {
+                unset($info['id3v1']['genre']);
+            }
 
-		if (substr($_beforeId3v1, 0, 3) == 'TAG') {
-			// The way iTunes handles tags is, well, brain-damaged.
-			// It completely ignores v1 if ID3v2 is present.
-			// This goes as far as adding a new v1 tag *even if there already is one*
+            $info['id3v1']['tag_offset_end']   = $info['filesize'];
+            $info['id3v1']['tag_offset_start'] = $info['id3v1']['tag_offset_end'] - 128;
+        }
 
-			// A suspected double-ID3v1 tag has been detected, but it could be that the &quot;TAG&quot; identifier is a legitimate part of an APE or Lyrics3 tag
-			if (substr($_beforeId3v1, 96, 8) == 'APETAGEX') {
-				// an APE tag footer was found before the last ID3v1, assume false &quot;TAG&quot; synch
-			} elseif (substr($_beforeId3v1, 119, 6) == 'LYRICS') {
-				// a Lyrics3 tag footer was found before the last ID3v1, assume false &quot;TAG&quot; synch
-			} else {
-				// APE and Lyrics3 footers not found - assume double ID3v1
-				$info['id3v1']['avdataend'] -= 128;
-			}
-		}
+        if (substr($_beforeId3v1, 0, 3) == 'TAG') {
+            // The way iTunes handles tags is, well, brain-damaged.
+            // It completely ignores v1 if ID3v2 is present.
+            // This goes as far as adding a new v1 tag *even if there already is one*
 
-		$this-&gt;_id3-&gt;setFileInfo($info);
+            // A suspected double-ID3v1 tag has been detected, but it could be that the &quot;TAG&quot; identifier is a legitimate part of an APE or Lyrics3 tag
+            if (substr($_beforeId3v1, 96, 8) == 'APETAGEX') {
+                // an APE tag footer was found before the last ID3v1, assume false &quot;TAG&quot; synch
+            } elseif (substr($_beforeId3v1, 119, 6) == 'LYRICS') {
+                // a Lyrics3 tag footer was found before the last ID3v1, assume false &quot;TAG&quot; synch
+            } else {
+                // APE and Lyrics3 footers not found - assume double ID3v1
+                $info['id3v1']['avdataend'] -= 128;
+            }
+        }
 
-		return true;
-	}
+        $this-&gt;_id3-&gt;setFileInfo($info);
 
-	protected function _cutfield($str)
-	{
-		return trim(substr($str, 0, strcspn($str, &quot;\x00&quot;)));
-	}
+        return true;
+    }
 
-	protected function _lookupGenreName($genreId)
-	{
-		switch ($genreId) {
-			case 'RX':
-				// break intentionally omitted
-			case 'CR':
-				break;
-			default:
-				$genreId = intval($genreId); // to handle 3 or '3' or '03'
-				break;
-		}
-		return (isset($this-&gt;_genres[$genreId]) ? $this-&gt;_genres[$genreId] : false);
-	}
+    protected function _cutfield($str)
+    {
+        return trim(substr($str, 0, strcspn($str, &quot;\x00&quot;)));
+    }
+
+    protected function _lookupGenreName($genreId)
+    {
+        switch ($genreId) {
+            case 'RX':
+                // break intentionally omitted
+            case 'CR':
+                break;
+            default:
+                $genreId = intval($genreId); // to handle 3 or '3' or '03'
+                break;
+        }
+        return (isset($this-&gt;_genres[$genreId]) ? $this-&gt;_genres[$genreId] : false);
+    }
 }
\ No newline at end of file</diff>
      <filename>library/Zend/Id3/Adapter/Id3v1.php</filename>
    </modified>
    <modified>
      <diff>@@ -20,265 +20,270 @@ require_once 'Zend/Id3/ByteConvert.php';
 
 class Zend_Id3_Adapter_Id3v2 extends Zend_Id3_Adapter_Abstract
 {
-	/**
-	 * Starting offset
-	 *
-	 * @var integer
-	 */
-	protected $_startingOffset = 0;
-
-	protected $_frameDataOffset = 0;
-
-	/**
-	 * Major Version of the tag for easy access
-	 *
-	 * @var integer
-	 */
-	protected $_tagMajorVersion;
-
-	/**
-	 * An Array that Stores the tag info
-	 *
-	 * @var array
-	 */
-	protected $_tagInfo = array();
-
-	public function analyze()
-	{
-		/**
-		 * Overall tag structure:
-		 *        +-----------------------------+
-		 *        |      Header (10 bytes)      |
-		 *        +-----------------------------+
-		 *        |       Extended Header       |
-		 *        | (variable length, OPTIONAL) |
-		 *        +-----------------------------+
-		 *        |   Frames (variable length)  |
-		 *        +-----------------------------+
-		 *        |           Padding           |
-		 *        | (variable length, OPTIONAL) |
-		 *        +-----------------------------+
-		 *        | Footer (10 bytes, OPTIONAL) |
-		 *        +-----------------------------+
-		 *
-		 *    Header
-		 *        ID3v2/file identifier      &quot;ID3&quot;
-		 *        ID3v2 version              $04 00
-		 *        ID3v2 flags                (%ab000000 in v2.2, %abc00000 in v2.3, %abcd0000 in v2.4.x)
-		 *        ID3v2 size                 4 * %0xxxxxxx
-		 */
-
-		//$fp = $this-&gt;_id3-&gt;getFilePointer();
-		$this-&gt;_tagInfo = $this-&gt;_id3-&gt;getFileInfo();
-
-
-		$this-&gt;_tagInfo['id3v2']['flags'] = array ();
-
-		$this-&gt;fseek($this-&gt;_startingOffset, SEEK_SET);
-		$header = $this-&gt;fread(10);
-		if (substr($header, 0, 3) == 'ID3'  &amp;&amp;  strlen($header) == 10) {
-
-			$this-&gt;_tagInfo['id3v2']['majorversion'] = ord($header{3});
-			$this-&gt;_tagInfo['id3v2']['minorversion'] = ord($header{4});
-
-			$this-&gt;_tagMajorVersion = $this-&gt;_tagInfo['id3v2']['majorversion'];
-
-		} else {
-			return false;
-		}
-
-		/**
-		 * The current max major version is 4 so that's what we support up to.
-		 */
-		if ($this-&gt;_tagMajorVersion &gt; 4) {
-			include_once 'Zend/Id3/Adapter/Exception.php';
-			throw new Zend_Id3_Adapter_Exception('Zend_Id3_Adapter_Id3v2 can only parse upt to Id3v2.4');
-		}
-
-		$this-&gt;_tagInfo['id3v2']['flags'] = $this-&gt;_processTagFlags(ord($header{5}));
-
-		// length of ID3v2 tag in 10-byte header doesn't include 10-byte header length
-		$this-&gt;_tagInfo['id3v2']['headerlength'] = Zend_Id3_ByteConvert::bigEndianSyncSafe2Int(substr($header, 6, 4)) + 10;
-
-		$this-&gt;_tagInfo['id3v2']['tag_offset_start'] = $this-&gt;_startingOffset;
-		$this-&gt;_tagInfo['id3v2']['tag_offset_end']   = $this-&gt;_tagInfo['id3v2']['tag_offset_start'] + $this-&gt;_tagInfo['id3v2']['headerlength'];
-
-
-		$this-&gt;_id3-&gt;setFileInfo($this-&gt;_tagInfo);
-
-		return true;
-
-	}
-
-	/**
-	 * Handle the proccesing of the Id3v2 Tag Flags
-	 *
-	 * v2.2 = %ab000000
-	 * v2.3 = %abc00000
-	 * v2.4 = %abcd0000
-	 *
-	 * @param integer $flags
-	 * @return array
-	 */
-	protected function _processTagFlags($flags)
-	{
-		$arrFlags = array();
-		switch ($this-&gt;_tagMajorVersion) {
-			case 2:
-				$arrFlags['unsynch']     = (bool)($flags &amp; 0x80); // a - Unsynchronisation
-				$arrFlags['compression'] = (bool)($flags &amp; 0x40); // b - Compression
-				break;
-
-			case 3:
-				$arrFlags['unsynch']     = (bool)($flags &amp; 0x80); // a - Unsynchronisation
-				$arrFlags['exthead']     = (bool)($flags &amp; 0x40); // b - Extended header
-				$arrFlags['experim']     = (bool)($flags &amp; 0x20); // c - Experimental indicator
-				break;
-
-			case 4:
-				$arrFlags['unsynch']     = (bool)($flags &amp; 0x80); // a - Unsynchronisation
-				$arrFlags['exthead']     = (bool)($flags &amp; 0x40); // b - Extended header
-				$arrFlags['experim']     = (bool)($flags &amp; 0x20); // c - Experimental indicator
-				$arrFlags['isfooter']    = (bool)($flags &amp; 0x10); // d - Footer present
-				break;
-		}
-
-		return $arrFlags;
-	}
-
-	/**
-	 * Proccess Frame Data
-	 * All ID3v2 frames consists of one frame header followed by one or more
-	 * fields containing the actual information. The header is always 10
-	 * bytes and laid out as follows:
-	 *
-	 * Frame ID      $xx xx xx xx  (four characters)
-	 * Size      4 * %0xxxxxxx
-	 * Flags         $xx xx
-	 */
-	protected function _fetchFrameData()
-	{
-
-		// get the frame size with out the 10-byte initial header
-		$frameSize = $this-&gt;_tagInfo['id3v2']['headerlength'] - 10;
-
-		// the footer takes the last 10 bytes of the header, after the frame data and before the audio
-		if(isset($this-&gt;_tagInfo['id3v2']['flags']['isfooter'])) {
-			$frameSize -= 10;
-		}
-
-		if($frameSize &gt; 0) {
-
-			$frameData = $this-&gt;fread($frameSize);
-
-			// If the entire frame data is unsynched, de-unsynch it now (ID3v2.3.x)
-			if(isset($this-&gt;_tagInfo['id3v2']['flags']['unsync']) &amp;&amp; $this-&gt;_tagMajorVersion &lt;= 3) {
-				$frameData = str_replace(&quot;\xFF\x00&quot;, &quot;\xFF&quot;, $frameData);
-			}
-
-			/**
-			 * [in ID3v2.4.0] Unsynchronisation [S:6.1] is done on frame level, instead
-			 * of on tag level, making it easier to skip frames, increasing the streamability
-			 * of the tag. The unsynchronisation flag in the header [S:3.1] indicates that
-			 * there exists an unsynchronised frame, while the new unsynchronisation flag in
-			 * the frame header [S:4.1.2] indicates unsynchronisation.
-			 */
-			// how many bytes into the stream - start from after the 10-byte header
-			$this-&gt;_frameDataOffset = 10;
-
-			if(isset($this-&gt;_tagInfo['id3v2']['flags']['exthead']) &amp;&amp; true == $this-&gt;_tagInfo['id3v2']['flags']['exthead']) {
-				$frameData = $this-&gt;_proccessExtendedFrameHeader($frameData);
-			}
-
-		}
-	}
-
-	/**
-	 *
-	 */
-	protected function _proccessExtendedFrameHeader($frameData)
-	{
-		$extendedHeaderOffset = 0;
-		switch($this-&gt;_tagMajorVersion) {
-			/**
-			 * v2.3 definition:
-			 *
-			 * Extended header size  $xx xx xx xx   // 32-bit integer
-			 * Extended Flags        $xx xx
-			 * %x0000000 %00000000 // v2.3
-			 *     x - CRC data present
-			 * Size of padding       $xx xx xx xx
-			 */
-			case 3:
-				$this-&gt;_tagInfo['id3v2']['exthead']['length'] = Zend_Id3_ByteConvert::bigEndian2Int(substr($frameData, $extendedHeaderOffset, 4), 0);
-				$extendedHeaderOffset += 4;
-
-				$this-&gt;_tagInfo['id3v2']['exthead']['flag_bytes'] = 2;
-				$this-&gt;_tagInfo['id3v2']['exthead']['flag_raw'] = Zend_Id3_ByteConvert::bigEndian2Int(substr($frameData, $extendedHeaderOffset, $this-&gt;_tagInfo['id3v2']['exthead']['flag_bytes']));
-				$extendedHeaderOffset += $this-&gt;_tagInfo['id3v2']['exthead']['flag_bytes'];
-
-				$this-&gt;_tagInfo['id3v2']['exthead']['flags']['crc'] = (bool) ($this-&gt;_tagInfo['id3v2']['exthead']['flag_raw'] &amp; 0x8000);
-
-				$this-&gt;_tagInfo['id3v2']['exthead']['padding_size'] = Zend_Id3_ByteConvert::bigEndian2Int(substr($frameData, $extendedHeaderOffset, 4));
-				$extendedHeaderOffset += 4;
-
-				if ($this-&gt;_tagInfo['id3v2']['exthead']['flags']['crc']) {
-				$this-&gt;_tagInfo['id3v2']['exthead']['flag_data']['crc'] = Zend_Id3_ByteConvert::bigEndian2Int(substr($frameData, $extendedHeaderOffset, 4));
-				$extendedHeaderOffset += 4;
-				}
-				$extendedHeaderOffset += $this-&gt;_tagInfo['id3v2']['exthead']['padding_size'];
-				break;
-
-			/**
-			  * v2.4 definition:
-			  *
-			  * Extended header size   4 * %0xxxxxxx  *  28-bit synchsafe integer
-			  * Number of flag bytes       $01
-			  * Extended Flags             $xx
-			  *      %0bcd0000  *  v2.4
-			  *      b - Tag is an update
-			  *          Flag data length       $00
-			  *      c - CRC data present
-			  *          Flag data length       $05
-			  *          Total frame CRC    5 * %0xxxxxxx
-			  *      d - Tag restrictions
-			  *          Flag data length       $01
-			  */
-			case 4:
-
-				$this-&gt;_tagInfo['id3v2']['exthead']['length']     = Zend_Id3_ByteConvert::bigEndian2Int(substr($frameData, $extendedHeaderOffset, 4), 1);
-				$extendedHeaderOffset += 4;
-
-				$this-&gt;_tagInfo['id3v2']['exthead']['flag_bytes'] = 1;
-				$this-&gt;_tagInfo['id3v2']['exthead']['flag_raw'] = Zend_Id3_ByteConvert::bigEndian2Int(substr($frameData, $extendedHeaderOffset, $this-&gt;_tagInfo['id3v2']['exthead']['flag_bytes']));
-				$extendedHeaderOffset += $this-&gt;_tagInfo['id3v2']['exthead']['flag_bytes'];
-
-				$this-&gt;_tagInfo['id3v2']['exthead']['flags']['update']       = (bool) ($this-&gt;_tagInfo['id3v2']['exthead']['flag_raw'] &amp; 0x4000);
-				$this-&gt;_tagInfo['id3v2']['exthead']['flags']['crc']          = (bool) ($this-&gt;_tagInfo['id3v2']['exthead']['flag_raw'] &amp; 0x2000);
-				$this-&gt;_tagInfo['id3v2']['exthead']['flags']['restrictions'] = (bool) ($this-&gt;_tagInfo['id3v2']['exthead']['flag_raw'] &amp; 0x1000);
-
-				if ($this-&gt;_tagInfo['id3v2']['exthead']['flags']['crc']) {
-					$this-&gt;_tagInfo['id3v2']['exthead']['flag_data']['crc'] = Zend_Id3_ByteConvert::bigEndian2Int(substr($frameData, $extendedHeaderOffset, 5), 1);
-					$extendedHeaderOffset += 5;
-				}
-				if ($this-&gt;_tagInfo['id3v2']['exthead']['flags']['restrictions']) {
-					// %ppqrrstt
-					$restrictionsByte = Zend_Id3_ByteConvert::bigEndian2Int(substr($frameData, $extendedHeaderOffset, 1));
-					$extendedHeaderOffset += 1;
-					$this-&gt;_tagInfo['id3v2']['exthead']['flags']['restrictions']['tagsize']  = ($restrictionsByte &amp;&amp; 0xC0) &gt;&gt; 6; // p - Tag size restrictions
-					$this-&gt;_tagInfo['id3v2']['exthead']['flags']['restrictions']['textenc']  = ($restrictionsByte &amp;&amp; 0x20) &gt;&gt; 5; // q - Text encoding restrictions
-					$this-&gt;_tagInfo['id3v2']['exthead']['flags']['restrictions']['textsize'] = ($restrictionsByte &amp;&amp; 0x18) &gt;&gt; 3; // r - Text fields size restrictions
-					$this-&gt;_tagInfo['id3v2']['exthead']['flags']['restrictions']['imgenc']   = ($restrictionsByte &amp;&amp; 0x04) &gt;&gt; 2; // s - Image encoding restrictions
-					$this-&gt;_tagInfo['id3v2']['exthead']['flags']['restrictions']['imgsize']  = ($restrictionsByte &amp;&amp; 0x03) &gt;&gt; 0; // t - Image size restrictions
-				}
-
-				break;
-
-		}
-
-		$this-&gt;_frameDataOffset += $extendedHeaderOffset;
-		$frameData = substr($frameData, $extendedHeaderOffset);
-
-		return $frameData;
-	}
+    /**
+     * Starting offset
+     *
+     * @var integer
+     */
+    protected $_startingOffset = 0;
+
+    protected $_frameDataOffset = 0;
+
+    /**
+     * Major Version of the tag for easy access
+     *
+     * @var integer
+     */
+    protected $_tagMajorVersion;
+
+    /**
+     * An Array that Stores the tag info
+     *
+     * @var array
+     */
+    protected $_tagInfo = array();
+
+    public function analyze()
+    {
+        /**
+         * Overall tag structure:
+         *        +-----------------------------+
+         *        |      Header (10 bytes)      |
+         *        +-----------------------------+
+         *        |       Extended Header       |
+         *        | (variable length, OPTIONAL) |
+         *        +-----------------------------+
+         *        |   Frames (variable length)  |
+         *        +-----------------------------+
+         *        |           Padding           |
+         *        | (variable length, OPTIONAL) |
+         *        +-----------------------------+
+         *        | Footer (10 bytes, OPTIONAL) |
+         *        +-----------------------------+
+         *
+         *    Header
+         *        ID3v2/file identifier      &quot;ID3&quot;
+         *        ID3v2 version              $04 00
+         *        ID3v2 flags                (%ab000000 in v2.2, %abc00000 in v2.3, %abcd0000 in v2.4.x)
+         *        ID3v2 size                 4 * %0xxxxxxx
+         */
+
+        //$fp = $this-&gt;_id3-&gt;getFilePointer();
+        $this-&gt;_tagInfo = $this-&gt;_id3-&gt;getFileInfo();
+
+
+        $this-&gt;_tagInfo['id3v2']['flags'] = array ();
+
+        $this-&gt;fseek($this-&gt;_startingOffset, SEEK_SET);
+        $header = $this-&gt;fread(10);
+        if (substr($header, 0, 3) == 'ID3'  &amp;&amp;  strlen($header) == 10) {
+
+            $this-&gt;_tagInfo['id3v2']['majorversion'] = ord($header{3});
+            $this-&gt;_tagInfo['id3v2']['minorversion'] = ord($header{4});
+
+            $this-&gt;_tagMajorVersion = $this-&gt;_tagInfo['id3v2']['majorversion'];
+
+        } else {
+            return false;
+        }
+
+        /**
+         * The current max major version is 4 so that's what we support up to.
+         */
+        if ($this-&gt;_tagMajorVersion &gt; 4) {
+            include_once 'Zend/Id3/Adapter/Exception.php';
+            throw new Zend_Id3_Adapter_Exception('Zend_Id3_Adapter_Id3v2 can only parse upt to Id3v2.4');
+        }
+
+        $this-&gt;_tagInfo['id3v2']['flags'] = $this-&gt;_processTagFlags(ord($header{5}));
+
+        // length of ID3v2 tag in 10-byte header doesn't include 10-byte header length
+        $this-&gt;_tagInfo['id3v2']['headerlength'] = Zend_Id3_ByteConvert::bigEndianSyncSafe2Int(substr($header, 6, 4)) + 10;
+
+        $this-&gt;_tagInfo['id3v2']['tag_offset_start'] = $this-&gt;_startingOffset;
+        $this-&gt;_tagInfo['id3v2']['tag_offset_end']   = $this-&gt;_tagInfo['id3v2']['tag_offset_start'] + $this-&gt;_tagInfo['id3v2']['headerlength'];
+
+
+        $this-&gt;_parseFrameData();
+
+        $this-&gt;_id3-&gt;setFileInfo($this-&gt;_tagInfo);
+
+        return true;
+
+    }
+
+    /**
+     * Handle the proccesing of the Id3v2 Tag Flags
+     *
+     * v2.2 = %ab000000
+     * v2.3 = %abc00000
+     * v2.4 = %abcd0000
+     *
+     * @param integer $flags
+     * @return array
+     */
+    protected function _processTagFlags($flags)
+    {
+        $arrFlags = array();
+        switch ($this-&gt;_tagMajorVersion) {
+            case 2:
+                $arrFlags['unsynch']     = (bool)($flags &amp; 0x80); // a - Unsynchronisation
+                $arrFlags['compression'] = (bool)($flags &amp; 0x40); // b - Compression
+                break;
+
+            case 3:
+                $arrFlags['unsynch']     = (bool)($flags &amp; 0x80); // a - Unsynchronisation
+                $arrFlags['exthead']     = (bool)($flags &amp; 0x40); // b - Extended header
+                $arrFlags['experim']     = (bool)($flags &amp; 0x20); // c - Experimental indicator
+                break;
+
+            case 4:
+                $arrFlags['unsynch']     = (bool)($flags &amp; 0x80); // a - Unsynchronisation
+                $arrFlags['exthead']     = (bool)($flags &amp; 0x40); // b - Extended header
+                $arrFlags['experim']     = (bool)($flags &amp; 0x20); // c - Experimental indicator
+                $arrFlags['isfooter']    = (bool)($flags &amp; 0x10); // d - Footer present
+                break;
+        }
+
+        return $arrFlags;
+    }
+
+    /**
+     * Proccess Frame Data
+     * All ID3v2 frames consists of one frame header followed by one or more
+     * fields containing the actual information. The header is always 10
+     * bytes and laid out as follows:
+     *
+     * Frame ID      $xx xx xx xx  (four characters)
+     * Size      4 * %0xxxxxxx
+     * Flags         $xx xx
+     */
+    protected function _parseFrameData()
+    {
+
+        // get the frame size with out the 10-byte initial header
+        $frameSize = $this-&gt;_tagInfo['id3v2']['headerlength'] - 10;
+
+        // the footer takes the last 10 bytes of the header, after the frame data and before the audio
+        if(isset($this-&gt;_tagInfo['id3v2']['flags']['isfooter'])) {
+            $frameSize -= 10;
+        }
+
+        if($frameSize &gt; 0) {
+
+            $frameData = $this-&gt;fread($frameSize);
+
+            // If the entire frame data is unsynched, de-unsynch it now (ID3v2.3.x)
+            if(isset($this-&gt;_tagInfo['id3v2']['flags']['unsync']) &amp;&amp; $this-&gt;_tagMajorVersion &lt;= 3) {
+                $frameData = str_replace(&quot;\xFF\x00&quot;, &quot;\xFF&quot;, $frameData);
+            }
+
+            /**
+             * [in ID3v2.4.0] Unsynchronisation [S:6.1] is done on frame level, instead
+             * of on tag level, making it easier to skip frames, increasing the streamability
+             * of the tag. The unsynchronisation flag in the header [S:3.1] indicates that
+             * there exists an unsynchronised frame, while the new unsynchronisation flag in
+             * the frame header [S:4.1.2] indicates unsynchronisation.
+             */
+            // how many bytes into the stream - start from after the 10-byte header
+            $this-&gt;_frameDataOffset = 10;
+
+            if(isset($this-&gt;_tagInfo['id3v2']['flags']['exthead']) &amp;&amp; true == $this-&gt;_tagInfo['id3v2']['flags']['exthead']) {
+                $frameData = $this-&gt;_proccessExtendedFrameHeader($frameData);
+            }
+
+            include_once 'Zend/Id3/Adapter/Id3v2/Frames.php';
+            $frames = new Zend_Id3_Adapter_Id3v2_Frames($frameData, $this-&gt;_frameDataOffset, $this-&gt;_tagMajorVersion);
+
+        }
+    }
+
+    /**
+     *
+     */
+    protected function _proccessExtendedFrameHeader($frameData)
+    {
+        $extendedHeaderOffset = 0;
+        switch($this-&gt;_tagMajorVersion) {
+            /**
+             * v2.3 definition:
+             *
+             * Extended header size  $xx xx xx xx   // 32-bit integer
+             * Extended Flags        $xx xx
+             * %x0000000 %00000000 // v2.3
+             *     x - CRC data present
+             * Size of padding       $xx xx xx xx
+             */
+            case 3:
+                $this-&gt;_tagInfo['id3v2']['exthead']['length'] = Zend_Id3_ByteConvert::bigEndian2Int(substr($frameData, $extendedHeaderOffset, 4), 0);
+                $extendedHeaderOffset += 4;
+
+                $this-&gt;_tagInfo['id3v2']['exthead']['flag_bytes'] = 2;
+                $this-&gt;_tagInfo['id3v2']['exthead']['flag_raw'] = Zend_Id3_ByteConvert::bigEndian2Int(substr($frameData, $extendedHeaderOffset, $this-&gt;_tagInfo['id3v2']['exthead']['flag_bytes']));
+                $extendedHeaderOffset += $this-&gt;_tagInfo['id3v2']['exthead']['flag_bytes'];
+
+                $this-&gt;_tagInfo['id3v2']['exthead']['flags']['crc'] = (bool) ($this-&gt;_tagInfo['id3v2']['exthead']['flag_raw'] &amp; 0x8000);
+
+                $this-&gt;_tagInfo['id3v2']['exthead']['padding_size'] = Zend_Id3_ByteConvert::bigEndian2Int(substr($frameData, $extendedHeaderOffset, 4));
+                $extendedHeaderOffset += 4;
+
+                if ($this-&gt;_tagInfo['id3v2']['exthead']['flags']['crc']) {
+                $this-&gt;_tagInfo['id3v2']['exthead']['flag_data']['crc'] = Zend_Id3_ByteConvert::bigEndian2Int(substr($frameData, $extendedHeaderOffset, 4));
+                $extendedHeaderOffset += 4;
+                }
+                $extendedHeaderOffset += $this-&gt;_tagInfo['id3v2']['exthead']['padding_size'];
+                break;
+
+            /**
+              * v2.4 definition:
+              *
+              * Extended header size   4 * %0xxxxxxx  *  28-bit synchsafe integer
+              * Number of flag bytes       $01
+              * Extended Flags             $xx
+              *      %0bcd0000  *  v2.4
+              *      b - Tag is an update
+              *          Flag data length       $00
+              *      c - CRC data present
+              *          Flag data length       $05
+              *          Total frame CRC    5 * %0xxxxxxx
+              *      d - Tag restrictions
+              *          Flag data length       $01
+              */
+            case 4:
+
+                $this-&gt;_tagInfo['id3v2']['exthead']['length']     = Zend_Id3_ByteConvert::bigEndian2Int(substr($frameData, $extendedHeaderOffset, 4), 1);
+                $extendedHeaderOffset += 4;
+
+                $this-&gt;_tagInfo['id3v2']['exthead']['flag_bytes'] = 1;
+                $this-&gt;_tagInfo['id3v2']['exthead']['flag_raw'] = Zend_Id3_ByteConvert::bigEndian2Int(substr($frameData, $extendedHeaderOffset, $this-&gt;_tagInfo['id3v2']['exthead']['flag_bytes']));
+                $extendedHeaderOffset += $this-&gt;_tagInfo['id3v2']['exthead']['flag_bytes'];
+
+                $this-&gt;_tagInfo['id3v2']['exthead']['flags']['update']       = (bool) ($this-&gt;_tagInfo['id3v2']['exthead']['flag_raw'] &amp; 0x4000);
+                $this-&gt;_tagInfo['id3v2']['exthead']['flags']['crc']          = (bool) ($this-&gt;_tagInfo['id3v2']['exthead']['flag_raw'] &amp; 0x2000);
+                $this-&gt;_tagInfo['id3v2']['exthead']['flags']['restrictions'] = (bool) ($this-&gt;_tagInfo['id3v2']['exthead']['flag_raw'] &amp; 0x1000);
+
+                if ($this-&gt;_tagInfo['id3v2']['exthead']['flags']['crc']) {
+                    $this-&gt;_tagInfo['id3v2']['exthead']['flag_data']['crc'] = Zend_Id3_ByteConvert::bigEndian2Int(substr($frameData, $extendedHeaderOffset, 5), 1);
+                    $extendedHeaderOffset += 5;
+                }
+                if ($this-&gt;_tagInfo['id3v2']['exthead']['flags']['restrictions']) {
+                    // %ppqrrstt
+                    $restrictionsByte = Zend_Id3_ByteConvert::bigEndian2Int(substr($frameData, $extendedHeaderOffset, 1));
+                    $extendedHeaderOffset += 1;
+                    $this-&gt;_tagInfo['id3v2']['exthead']['flags']['restrictions']['tagsize']  = ($restrictionsByte &amp;&amp; 0xC0) &gt;&gt; 6; // p - Tag size restrictions
+                    $this-&gt;_tagInfo['id3v2']['exthead']['flags']['restrictions']['textenc']  = ($restrictionsByte &amp;&amp; 0x20) &gt;&gt; 5; // q - Text encoding restrictions
+                    $this-&gt;_tagInfo['id3v2']['exthead']['flags']['restrictions']['textsize'] = ($restrictionsByte &amp;&amp; 0x18) &gt;&gt; 3; // r - Text fields size restrictions
+                    $this-&gt;_tagInfo['id3v2']['exthead']['flags']['restrictions']['imgenc']   = ($restrictionsByte &amp;&amp; 0x04) &gt;&gt; 2; // s - Image encoding restrictions
+                    $this-&gt;_tagInfo['id3v2']['exthead']['flags']['restrictions']['imgsize']  = ($restrictionsByte &amp;&amp; 0x03) &gt;&gt; 0; // t - Image size restrictions
+                }
+
+                break;
+
+        }
+
+        $this-&gt;_frameDataOffset += $extendedHeaderOffset;
+        $frameData = substr($frameData, $extendedHeaderOffset);
+
+        return $frameData;
+    }
 }</diff>
      <filename>library/Zend/Id3/Adapter/Id3v2.php</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>3a2d6336423b634785c475e9d8fa4987df3889c5</id>
    </parent>
  </parents>
  <author>
    <name>Sid Highwind</name>
    <email>sidhighwind@peter.(none)</email>
  </author>
  <url>http://github.com/sidhighwind/zend_id3/commit/2b94654bad6ae4b51920094606ac7f2924033149</url>
  <id>2b94654bad6ae4b51920094606ac7f2924033149</id>
  <committed-date>2008-10-11T19:30:54-07:00</committed-date>
  <authored-date>2008-10-11T19:30:54-07:00</authored-date>
  <message>Create v2 Frame Parser and started the abstract class for the different frames to implement</message>
  <tree>e7c4d3c4f1f07f6f2b5a9e2caa708b82d831ea5b</tree>
  <committer>
    <name>Sid Highwind</name>
    <email>sidhighwind@peter.(none)</email>
  </committer>
</commit>
