source: branches/MootoolsFileManager-Update/plugins/MootoolsFileManager/mootools-filemanager/Assets/Connector/Assets/getid3/module.misc.cue.php @ 1300

Last change on this file since 1300 was 1300, checked in by gogo, 9 years ago

Update the MootoolsFileManager? to the latest cpojer with some modifications.
Add a demo for the MFM examples/mootools-file-manager.php
Change the default config for ImageManager? and ExtendedFileManager? for added security.

File size: 8.3 KB
Line 
1<?php
2/////////////////////////////////////////////////////////////////
3/// getID3() by James Heinrich <info@getid3.org>               //
4//  available at http://getid3.sourceforge.net                 //
5//            or http://www.getid3.org                         //
6/////////////////////////////////////////////////////////////////
7// See readme.txt for more details                             //
8/////////////////////////////////////////////////////////////////
9//                                                             //
10// module.misc.cue.php                                         //
11// module for analyzing CUEsheet files                         //
12// dependencies: NONE                                          //
13//                                                             //
14/////////////////////////////////////////////////////////////////
15//                                                             //
16// Module originally written [2009-Mar-25] by                  //
17//      Nigel Barnes <ngbarnesØhotmail*com>                    //
18// Minor reformatting and similar small changes to integrate   //
19//   into getID3 by James Heinrich <info@getid3.org>           //
20//                                                            ///
21/////////////////////////////////////////////////////////////////
22
23/*
24 * CueSheet parser by Nigel Barnes.
25 *
26 * This is a PHP conversion of CueSharp 0.5 by Wyatt O'Day (wyday.com/cuesharp)
27 */
28
29/**
30 * A CueSheet class used to open and parse cuesheets.
31 *
32 */
33class getid3_cue
34{
35        var $cuesheet = array();
36
37        function getid3_cue(&$fd, &$ThisFileInfo) {
38                $ThisFileInfo['fileformat'] = 'cue';
39                $this->readCueSheetFilename($ThisFileInfo['filenamepath']);
40                $ThisFileInfo['cue'] = $this->cuesheet;
41                return true;
42        }
43
44
45
46        function readCueSheetFilename($filename)
47        {
48                $filedata = file_get_contents($filename);
49                return $this->readCueSheet($filedata);
50        }
51        /**
52        * Parses a cue sheet file.
53        *
54        * @param string $filename - The filename for the cue sheet to open.
55        */
56        function readCueSheet(&$filedata)
57        {
58                $cue_lines = array();
59                foreach (explode("\n", str_replace("\r", null, $filedata)) as $line)
60                {
61                        if ( (strlen($line) > 0) && ($line[0] != '#'))
62                        {
63                                $cue_lines[] = trim($line);
64                        }
65                }
66                $this->parseCueSheet($cue_lines);
67
68                return $this->cuesheet;
69        }
70
71        /**
72        * Parses the cue sheet array.
73        *
74        * @param array $file - The cuesheet as an array of each line.
75        */
76        function parseCueSheet($file)
77        {
78                //-1 means still global, all others are track specific
79                $track_on = -1;
80
81                for ($i=0; $i < count($file); $i++)
82                {
83                        list($key) = explode(' ', strtolower($file[$i]), 2);
84                        switch ($key)
85                        {
86                                case 'catalog':
87                                case 'cdtextfile':
88                                case 'isrc':
89                                case 'performer':
90                                case 'songwriter':
91                                case 'title':
92                                        $this->parseString($file[$i], $track_on);
93                                        break;
94                                case 'file':
95                                        $currentFile = $this->parseFile($file[$i]);
96                                        break;
97                                case 'flags':
98                                        $this->parseFlags($file[$i], $track_on);
99                                        break;
100                                case 'index':
101                                case 'postgap':
102                                case 'pregap':
103                                        $this->parseIndex($file[$i], $track_on);
104                                        break;
105                                case 'rem':
106                                        $this->parseComment($file[$i], $track_on);
107                                        break;
108                                case 'track':
109                                        $track_on++;
110                                        $this->parseTrack($file[$i], $track_on);
111                                        if (isset($currentFile)) // if there's a file
112                                        {
113                                                $this->cuesheet['tracks'][$track_on]['datafile'] = $currentFile;
114                                        }
115                                        break;
116                                default:
117                                        //save discarded junk and place string[] with track it was found in
118                                        $this->parseGarbage($file[$i], $track_on);
119                                        break;
120                        }
121                }
122        }
123
124        /**
125        * Parses the REM command.
126        *
127        * @param string $line - The line in the cue file that contains the TRACK command.
128        * @param integer $track_on - The track currently processing.
129        */
130        function parseComment($line, $track_on)
131        {
132                $explodedline = explode(' ', $line, 3);
133                $comment_REM  = (isset($explodedline[0]) ? $explodedline[0] : '');
134                $comment_type = (isset($explodedline[1]) ? $explodedline[1] : '');
135                $comment_data = (isset($explodedline[2]) ? $explodedline[2] : '');
136                if (($comment_REM == 'REM') && $comment_type) {
137                        $comment_type  = strtolower($comment_type);
138                        $commment_data = trim($comment_data, ' "');
139                        if ($track_on != -1) {
140                                $this->cuesheet['tracks'][$track_on]['comments'][$comment_type][] = $comment_data;
141                        } else {
142                                $this->cuesheet['comments'][$comment_type][] = $comment_data;
143                        }
144                }
145        }
146
147        /**
148        * Parses the FILE command.
149        *
150        * @param string $line - The line in the cue file that contains the FILE command.
151        * @return array - Array of FILENAME and TYPE of file..
152        */
153        function parseFile($line)
154        {
155                $line =            substr($line, strpos($line, ' ') + 1);
156                $type = strtolower(substr($line, strrpos($line, ' ')));
157
158                //remove type
159                $line = substr($line, 0, strrpos($line, ' ') - 1);
160
161                //if quotes around it, remove them.
162                $line = trim($line, '"');
163
164                return array('filename'=>$line, 'type'=>$type);
165        }
166
167        /**
168        * Parses the FLAG command.
169        *
170        * @param string $line - The line in the cue file that contains the TRACK command.
171        * @param integer $track_on - The track currently processing.
172        */
173        function parseFlags($line, $track_on)
174        {
175                if ($track_on != -1)
176                {
177                        foreach (explode(' ', strtolower($line)) as $type)
178                        {
179                                switch ($type)
180                                {
181                                        case 'flags':
182                                                // first entry in this line
183                                                $this->cuesheet['tracks'][$track_on]['flags'] = array(
184                                                        '4ch'  => false,
185                                                        'data' => false,
186                                                        'dcp'  => false,
187                                                        'pre'  => false,
188                                                        'scms' => false,
189                                                );
190                                                break;
191                                        case 'data':
192                                        case 'dcp':
193                                        case '4ch':
194                                        case 'pre':
195                                        case 'scms':
196                                                $this->cuesheet['tracks'][$track_on]['flags'][$type] = true;
197                                                break;
198                                        default:
199                                                break;
200                                }
201                        }
202                }
203        }
204
205        /**
206        * Collect any unidentified data.
207        *
208        * @param string $line - The line in the cue file that contains the TRACK command.
209        * @param integer $track_on - The track currently processing.
210        */
211        function parseGarbage($line, $track_on)
212        {
213                if ( strlen($line) > 0 )
214                {
215                        if ($track_on == -1)
216                        {
217                                $this->cuesheet['garbage'][] = $line;
218                        }
219                        else
220                        {
221                                $this->cuesheet['tracks'][$track_on]['garbage'][] = $line;
222                        }
223                }
224        }
225
226        /**
227        * Parses the INDEX command of a TRACK.
228        *
229        * @param string $line - The line in the cue file that contains the TRACK command.
230        * @param integer $track_on - The track currently processing.
231        */
232        function parseIndex($line, $track_on)
233        {
234                $type = strtolower(substr($line, 0, strpos($line, ' ')));
235                $line =            substr($line, strpos($line, ' ') + 1);
236
237                if ($type == 'index')
238                {
239                        //read the index number
240                        $number = intval(substr($line, 0, strpos($line, ' ')));
241                        $line   =        substr($line, strpos($line, ' ') + 1);
242                }
243
244                //extract the minutes, seconds, and frames
245                $explodedline = explode(':', $line);
246                $minutes = (isset($explodedline[0]) ? $explodedline[0] : '');
247                $seconds = (isset($explodedline[1]) ? $explodedline[1] : '');
248                $frames  = (isset($explodedline[2]) ? $explodedline[2] : '');
249
250                switch ($type) {
251                        case 'index':
252                                $this->cuesheet['tracks'][$track_on][$type][$number] = array('minutes'=>intval($minutes), 'seconds'=>intval($seconds), 'frames'=>intval($frames));
253                                break;
254                        case 'pregap':
255                        case 'postgap':
256                                $this->cuesheet['tracks'][$track_on][$type]          = array('minutes'=>intval($minutes), 'seconds'=>intval($seconds), 'frames'=>intval($frames));
257                                break;
258                }
259        }
260
261        function parseString($line, $track_on)
262        {
263                $category = strtolower(substr($line, 0, strpos($line, ' ')));
264                $line     =            substr($line, strpos($line, ' ') + 1);
265
266                //get rid of the quotes
267                $line = trim($line, '"');
268
269                switch ($category)
270                {
271                        case 'catalog':
272                        case 'cdtextfile':
273                        case 'isrc':
274                        case 'performer':
275                        case 'songwriter':
276                        case 'title':
277                                if ($track_on == -1)
278                                {
279                                        $this->cuesheet[$category] = $line;
280                                }
281                                else
282                                {
283                                        $this->cuesheet['tracks'][$track_on][$category] = $line;
284                                }
285                                break;
286                        default:
287                                break;
288                }
289        }
290
291        /**
292        * Parses the TRACK command.
293        *
294        * @param string $line - The line in the cue file that contains the TRACK command.
295        * @param integer $track_on - The track currently processing.
296        */
297        function parseTrack($line, $track_on)
298        {
299                $line = substr($line, strpos($line, ' ') + 1);
300                $track = ltrim(substr($line, 0, strpos($line, ' ')), '0');
301
302                //find the data type.
303                $datatype = strtolower(substr($line, strpos($line, ' ') + 1));
304
305                $this->cuesheet['tracks'][$track_on] = array('track_number'=>$track, 'datatype'=>$datatype);
306        }
307
308}
309
310?>
Note: See TracBrowser for help on using the repository browser.