diff e2gallerypro/e2upload/Backend/Assets/getid3/module.tag.lyrics3.php @ 3:3f6b44aa6b35 judyates

[svn r4] added ability to buy stuff, from a Prints page, but it doesn't work well with the css, and it also has not been fitted into the perl make system.
author rlm
date Mon, 22 Feb 2010 08:02:39 -0500
parents
children
line wrap: on
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/e2gallerypro/e2upload/Backend/Assets/getid3/module.tag.lyrics3.php	Mon Feb 22 08:02:39 2010 -0500
     1.3 @@ -0,0 +1,270 @@
     1.4 +<?php
     1.5 +// +----------------------------------------------------------------------+
     1.6 +// | PHP version 5                                                        |
     1.7 +// +----------------------------------------------------------------------+
     1.8 +// | Copyright (c) 2002-2006 James Heinrich, Allan Hansen                 |
     1.9 +// +----------------------------------------------------------------------+
    1.10 +// | This source file is subject to version 2 of the GPL license,         |
    1.11 +// | that is bundled with this package in the file license.txt and is     |
    1.12 +// | available through the world-wide-web at the following url:           |
    1.13 +// | http://www.gnu.org/copyleft/gpl.html                                 |
    1.14 +// +----------------------------------------------------------------------+
    1.15 +// | getID3() - http://getid3.sourceforge.net or http://www.getid3.org    |
    1.16 +// +----------------------------------------------------------------------+
    1.17 +// | Authors: James Heinrich <infoØgetid3*org>                            |
    1.18 +// |          Allan Hansen <ahØartemis*dk>                                |
    1.19 +// +----------------------------------------------------------------------+
    1.20 +// | module.tag.lyrics3.php                                               |
    1.21 +// | module for analyzing Lyrics3 tags                                    |
    1.22 +// | dependencies: module.tag.apetag.php (optional)                       |
    1.23 +// +----------------------------------------------------------------------+
    1.24 +//
    1.25 +// $Id: module.tag.lyrics3.php,v 1.5 2006/11/16 22:04:23 ah Exp $
    1.26 +
    1.27 +
    1.28 +class getid3_lyrics3 extends getid3_handler
    1.29 +{
    1.30 +
    1.31 +    public function Analyze() {
    1.32 +
    1.33 +        $getid3 = $this->getid3;
    1.34 +
    1.35 +        fseek($getid3->fp, (0 - 128 - 9 - 6), SEEK_END);  // end - ID3v1 - LYRICSEND - [Lyrics3size]
    1.36 +        $lyrics3_id3v1 = fread($getid3->fp, 128 + 9 + 6);
    1.37 +        $lyrics3_lsz   = substr($lyrics3_id3v1,  0,   6); // Lyrics3size
    1.38 +        $lyrics3_end   = substr($lyrics3_id3v1,  6,   9); // LYRICSEND or LYRICS200
    1.39 +        $id3v1_tag     = substr($lyrics3_id3v1, 15, 128); // ID3v1
    1.40 +
    1.41 +        // Lyrics3v1, ID3v1, no APE
    1.42 +        if ($lyrics3_end == 'LYRICSEND') {
    1.43 +
    1.44 +            $lyrics3_size    = 5100;
    1.45 +            $lyrics3_offset  = filesize($getid3->filename) - 128 - $lyrics3_size;
    1.46 +            $lyrics3_version = 1;
    1.47 +        } 
    1.48 +
    1.49 +        // Lyrics3v2, ID3v1, no APE
    1.50 +        elseif ($lyrics3_end == 'LYRICS200') {
    1.51 +
    1.52 +            // LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200'
    1.53 +            $lyrics3_size    = $lyrics3_lsz + 6 + strlen('LYRICS200');
    1.54 +            $lyrics3_offset  = filesize($getid3->filename) - 128 - $lyrics3_size;
    1.55 +            $lyrics3_version = 2;
    1.56 +        } 
    1.57 +        
    1.58 +        // Lyrics3v1, no ID3v1, no APE
    1.59 +        elseif (substr(strrev($lyrics3_id3v1), 0, 9) == 'DNESCIRYL') {            // strrev('LYRICSEND') = 'DNESCIRYL'
    1.60 +
    1.61 +            $lyrics3_size    = 5100;
    1.62 +            $lyrics3_offset  = filesize($getid3->filename) - $lyrics3_size;
    1.63 +            $lyrics3_version = 1;
    1.64 +            $lyrics3_offset  = filesize($getid3->filename) - $lyrics3_size;
    1.65 +        } 
    1.66 +    
    1.67 +        // Lyrics3v2, no ID3v1, no APE
    1.68 +        elseif (substr(strrev($lyrics3_id3v1), 0, 9) == '002SCIRYL') {             // strrev('LYRICS200') = '002SCIRYL'
    1.69 +
    1.70 +            $lyrics3_size    = strrev(substr(strrev($lyrics3_id3v1), 9, 6)) + 15;   // LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200'  // 15 = 6 + strlen('LYRICS200')
    1.71 +            $lyrics3_offset  = filesize($getid3->filename) - $lyrics3_size;
    1.72 +            $lyrics3_version = 2;
    1.73 +        } 
    1.74 +    
    1.75 +        elseif (isset($getid3->info['ape']['tag_offset_start']) && ($getid3->info['ape']['tag_offset_start'] > 15)) {
    1.76 +
    1.77 +            fseek($getid3->fp, $getid3->info['ape']['tag_offset_start'] - 15, SEEK_SET);
    1.78 +            $lyrics3_lsz = fread($getid3->fp, 6);
    1.79 +            $lyrics3_end = fread($getid3->fp, 9);
    1.80 +
    1.81 +            
    1.82 +            // Lyrics3v1, APE, maybe ID3v1
    1.83 +            if ($lyrics3_end == 'LYRICSEND') {
    1.84 +
    1.85 +                $lyrics3_size    = 5100;
    1.86 +                $lyrics3_offset  = $getid3->info['ape']['tag_offset_start'] - $lyrics3_size;
    1.87 +                $getid3->info['avdataend'] = $lyrics3_offset;
    1.88 +                $lyrics3_version = 1;
    1.89 +                $getid3->warning('APE tag located after Lyrics3, will probably break Lyrics3 compatability');
    1.90 +            } 
    1.91 +        
    1.92 +            
    1.93 +            // Lyrics3v2, APE, maybe ID3v1
    1.94 +            elseif ($lyrics3_end == 'LYRICS200') {
    1.95 +
    1.96 +                $lyrics3_size    = $lyrics3_lsz + 15; // LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200'
    1.97 +                $lyrics3_offset  = $getid3->info['ape']['tag_offset_start'] - $lyrics3_size;
    1.98 +                $lyrics3_version = 2;
    1.99 +                $getid3->warning('APE tag located after Lyrics3, will probably break Lyrics3 compatability');
   1.100 +
   1.101 +            }
   1.102 +        }
   1.103 +        
   1.104 +        
   1.105 +        //// GetLyrics3Data()
   1.106 +        
   1.107 +        
   1.108 +        if (isset($lyrics3_offset)) {
   1.109 +            
   1.110 +            $getid3->info['avdataend'] = $lyrics3_offset;
   1.111 +            
   1.112 +            if ($lyrics3_size <= 0) {
   1.113 +                return false;
   1.114 +            }
   1.115 +
   1.116 +            fseek($getid3->fp, $lyrics3_offset, SEEK_SET);
   1.117 +            $raw_data = fread($getid3->fp, $lyrics3_size);
   1.118 +    
   1.119 +            if (substr($raw_data, 0, 11) != 'LYRICSBEGIN') {
   1.120 +                if (strpos($raw_data, 'LYRICSBEGIN') !== false) {
   1.121 +    
   1.122 +                    $getid3->warning('"LYRICSBEGIN" expected at '.$lyrics3_offset.' but actually found at '.($lyrics3_offset + strpos($raw_data, 'LYRICSBEGIN')).' - this is invalid for Lyrics3 v'.$lyrics3_version);
   1.123 +                    $getid3->info['avdataend'] = $lyrics3_offset + strpos($raw_data, 'LYRICSBEGIN');
   1.124 +                    $parsed_lyrics3['tag_offset_start'] = $getid3->info['avdataend'];
   1.125 +                    $raw_data = substr($raw_data, strpos($raw_data, 'LYRICSBEGIN'));
   1.126 +                    $lyrics3_size = strlen($raw_data);
   1.127 +                }
   1.128 +                else {
   1.129 +                    throw new getid3_exception('"LYRICSBEGIN" expected at '.$lyrics3_offset.' but found "'.substr($raw_data, 0, 11).'" instead.');
   1.130 +                }
   1.131 +    
   1.132 +            }
   1.133 +    
   1.134 +            $parsed_lyrics3['raw']['lyrics3version'] = $lyrics3_version;
   1.135 +            $parsed_lyrics3['raw']['lyrics3tagsize'] = $lyrics3_size;
   1.136 +            $parsed_lyrics3['tag_offset_start']      = $lyrics3_offset;
   1.137 +            $parsed_lyrics3['tag_offset_end']        = $lyrics3_offset + $lyrics3_size;
   1.138 +    
   1.139 +            switch ($lyrics3_version) {
   1.140 +    
   1.141 +                case 1:
   1.142 +                    if (substr($raw_data, strlen($raw_data) - 9, 9) == 'LYRICSEND') {
   1.143 +                        $parsed_lyrics3['raw']['LYR'] = trim(substr($raw_data, 11, strlen($raw_data) - 11 - 9));
   1.144 +                        getid3_lyrics3::Lyrics3LyricsTimestampParse($parsed_lyrics3);
   1.145 +                    }
   1.146 +                    else {
   1.147 +                        throw new getid3_exception('"LYRICSEND" expected at '.(ftell($getid3->fp) - 11 + $lyrics3_size - 9).' but found "'.substr($raw_data, strlen($raw_data) - 9, 9).'" instead.');
   1.148 +                    }
   1.149 +                    break;
   1.150 +    
   1.151 +                case 2:
   1.152 +                    if (substr($raw_data, strlen($raw_data) - 9, 9) == 'LYRICS200') {
   1.153 +                        $parsed_lyrics3['raw']['unparsed'] = substr($raw_data, 11, strlen($raw_data) - 11 - 9 - 6); // LYRICSBEGIN + LYRICS200 + LSZ
   1.154 +                        $raw_data = $parsed_lyrics3['raw']['unparsed'];
   1.155 +                        while (strlen($raw_data) > 0) {
   1.156 +                            $fieldname = substr($raw_data, 0, 3);
   1.157 +                            $fieldsize = (int)substr($raw_data, 3, 5);
   1.158 +                            $parsed_lyrics3['raw'][$fieldname] = substr($raw_data, 8, $fieldsize);
   1.159 +                            $raw_data  = substr($raw_data, 3 + 5 + $fieldsize);
   1.160 +                        }
   1.161 +    
   1.162 +                        if (isset($parsed_lyrics3['raw']['IND'])) {
   1.163 +                            $i = 0;
   1.164 +                            foreach (array ('lyrics', 'timestamps', 'inhibitrandom') as $flagname) {
   1.165 +                                if (strlen($parsed_lyrics3['raw']['IND']) > ++$i) {
   1.166 +                                    $parsed_lyrics3['flags'][$flagname] = getid3_lyrics3::IntString2Bool(substr($parsed_lyrics3['raw']['IND'], $i, 1));
   1.167 +                                }
   1.168 +                            }
   1.169 +                        }
   1.170 +    
   1.171 +                        foreach (array ('ETT'=>'title', 'EAR'=>'artist', 'EAL'=>'album', 'INF'=>'comment', 'AUT'=>'author') as $key => $value) {
   1.172 +                            if (isset($parsed_lyrics3['raw'][$key])) {
   1.173 +                                $parsed_lyrics3['comments'][$value][] = trim($parsed_lyrics3['raw'][$key]);
   1.174 +                            }
   1.175 +                        }
   1.176 +    
   1.177 +                        if (isset($parsed_lyrics3['raw']['IMG'])) {
   1.178 +                            foreach (explode("\r\n", $parsed_lyrics3['raw']['IMG']) as $key => $image_string) {
   1.179 +                                if (strpos($image_string, '||') !== false) {
   1.180 +                                    $imagearray = explode('||', $image_string);
   1.181 +                                    $parsed_lyrics3['images'][$key]['filename']    = @$imagearray[0];
   1.182 +                                    $parsed_lyrics3['images'][$key]['description'] = @$imagearray[1];
   1.183 +                                    $parsed_lyrics3['images'][$key]['timestamp']   = getid3_lyrics3::Lyrics3Timestamp2Seconds(@$imagearray[2]);
   1.184 +                                }
   1.185 +                            }
   1.186 +                        }
   1.187 +                        
   1.188 +                        if (isset($parsed_lyrics3['raw']['LYR'])) {
   1.189 +                            getid3_lyrics3::Lyrics3LyricsTimestampParse($parsed_lyrics3);
   1.190 +                        }
   1.191 +                    }
   1.192 +                      else {
   1.193 +                        throw new getid3_exception('"LYRICS200" expected at '.(ftell($getid3->fp) - 11 + $lyrics3_size - 9).' but found "'.substr($raw_data, strlen($raw_data) - 9, 9).'" instead.');
   1.194 +                    }
   1.195 +                    break;
   1.196 +    
   1.197 +                default:
   1.198 +                    throw new getid3_exception('Cannot process Lyrics3 version '.$lyrics3_version.' (only v1 and v2)');
   1.199 +            }
   1.200 +    
   1.201 +            if (isset($getid3->info['id3v1']['tag_offset_start']) && ($getid3->info['id3v1']['tag_offset_start'] < $parsed_lyrics3['tag_offset_end'])) {
   1.202 +                $getid3->warning('ID3v1 tag information ignored since it appears to be a false synch in Lyrics3 tag data');
   1.203 +                unset($getid3->info['id3v1']);
   1.204 +            }
   1.205 +    
   1.206 +            $getid3->info['lyrics3'] = $parsed_lyrics3;
   1.207 +    
   1.208 +    
   1.209 +            // Check for APE tag after lyrics3
   1.210 +            if (!@$getid3->info['ape'] && $getid3->option_tag_apetag && class_exists('getid3_apetag')) {
   1.211 +                $apetag = new getid3_apetag($getid3);
   1.212 +                $apetag->option_override_end_offset = $getid3->info['lyrics3']['tag_offset_start'];
   1.213 +                $apetag->Analyze();
   1.214 +            }
   1.215 +        }
   1.216 +
   1.217 +        return true;
   1.218 +    }
   1.219 +    
   1.220 +
   1.221 +    
   1.222 +    
   1.223 +    public static function Lyrics3Timestamp2Seconds($rawtimestamp) {
   1.224 +        if (ereg('^\\[([0-9]{2}):([0-9]{2})\\]$', $rawtimestamp, $regs)) {
   1.225 +            return (int)(($regs[1] * 60) + $regs[2]);
   1.226 +        }
   1.227 +        return false;
   1.228 +    }
   1.229 +
   1.230 +    
   1.231 +    
   1.232 +    public static function Lyrics3LyricsTimestampParse(&$lyrics3_data) {
   1.233 +
   1.234 +        $lyrics_array = explode("\r\n", $lyrics3_data['raw']['LYR']);
   1.235 +        foreach ($lyrics_array as $key => $lyric_line) {
   1.236 +            
   1.237 +            while (ereg('^(\\[[0-9]{2}:[0-9]{2}\\])', $lyric_line, $regs)) {
   1.238 +                $this_line_timestamps[] = getid3_lyrics3::Lyrics3Timestamp2Seconds($regs[0]);
   1.239 +                $lyric_line = str_replace($regs[0], '', $lyric_line);
   1.240 +            }
   1.241 +            $no_timestamp_lyrics_array[$key] = $lyric_line;
   1.242 +            if (@is_array($this_line_timestamps)) {
   1.243 +                sort($this_line_timestamps);
   1.244 +                foreach ($this_line_timestamps as $timestampkey => $timestamp) {
   1.245 +                    if (isset($lyrics3_data['synchedlyrics'][$timestamp])) {
   1.246 +                        // timestamps only have a 1-second resolution, it's possible that multiple lines
   1.247 +                        // could have the same timestamp, if so, append
   1.248 +                        $lyrics3_data['synchedlyrics'][$timestamp] .= "\r\n".$lyric_line;
   1.249 +                    } else {
   1.250 +                        $lyrics3_data['synchedlyrics'][$timestamp] = $lyric_line;
   1.251 +                    }
   1.252 +                }
   1.253 +            }
   1.254 +            unset($this_line_timestamps);
   1.255 +            $regs = array ();
   1.256 +        }
   1.257 +        $lyrics3_data['unsynchedlyrics'] = implode("\r\n", $no_timestamp_lyrics_array);
   1.258 +        if (isset($lyrics3_data['synchedlyrics']) && is_array($lyrics3_data['synchedlyrics'])) {
   1.259 +            ksort($lyrics3_data['synchedlyrics']);
   1.260 +        }
   1.261 +        return true;
   1.262 +    }
   1.263 +
   1.264 +
   1.265 +
   1.266 +    public static function IntString2Bool($char) {
   1.267 +        
   1.268 +        return $char == '1' ? true : ($char == '0' ? false : null);
   1.269 +    }
   1.270 +}
   1.271 +
   1.272 +
   1.273 +?>
   1.274 \ No newline at end of file