Mercurial > judyates
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