]> git.llucax.com Git - personal/documentos.git/blob - glabels/mp3.php
Enunciado e implementación de referencia del ejercicio 1 de 2008-2
[personal/documentos.git] / glabels / mp3.php
1 #!/usr/bin/php4 -qC
2 <?php
3
4 require_once 'HTML/Template/Sigma.php';
5 PEAR::setErrorHandling(PEAR_ERROR_DIE);
6
7 define('X_BASE', 30);
8 define('X_COL2', 205);
9 define('Y_BASE', 35);
10 define('Y_MAX', 310);
11 define('PUNTOS', 5);
12
13 if ($argc < 2) {
14     $name = basename($argv[0]);
15     echo "Modo de uso:\n";
16     echo "  $name <volumen> [<directorio>] [<filename>]\n\n";
17     echo "Por defecto se usa el directorio actual y se guarda el resultado en mp3-dvd-<volumen>.glabels\n";
18     exit;
19 }
20
21 $numero = $argv[1];
22 $dir = @$argv[2] ? $argv[2] : '.';
23 $filename = @$argv[3] ? $argv[3] : "mp3-dvd-$numero.glabels";
24 $template = 'Template.MP3.glabels';
25 $template_dir = '.';
26
27 $datos = array();
28 $d = dir($dir);
29 while (($f = $d->read()) !== false) {
30     if (is_dir("$dir/$f") and $f != '.' and $f != '..') {
31         $d2 = dir("$dir/$f");
32         while (($f2 = $d2->read()) !== false) {
33             if (is_dir("$dir/$f/$f2") and $f2 != '.' and $f2 != '..') {
34                 $is_album = false;
35                 $d3 = dir("$dir/$f/$f2");
36                 while (($f3 = $d3->read()) !== false) {
37                     if (preg_match('/\.mp3$/i', $f3)) {
38                         $is_album = true;
39                     }
40                 }
41                 if ($is_album) {
42                     if (preg_match('/(\d{4}) - (.*)/', $f2, $m)) {
43                         $datos[ucwords($f)][] = ucwords("$m[2] [$m[1]]");
44                     } else {
45                         $datos[ucwords($f)][] = ucwords($f2);
46                     }
47                 }
48             }
49         }
50     }
51 }
52
53 if ($datos) {
54
55     $tpl =& new HTML_Template_Sigma($template_dir);
56     $tpl->loadTemplateFile($template);
57     $tpl->setGlobalVariable(array(
58         'N'      => sprintf("%02d", $numero),
59         'PUNTOS' => PUNTOS,
60     ));
61
62     $x = X_BASE;
63     $y = Y_BASE;
64     ksort($datos);
65     foreach ($datos as $artista => $albums) {
66         if ($y > Y_MAX and !@$col2) {
67             $x = X_COL2;
68             $y = Y_BASE;
69             $col2 = true;
70         }
71         $tpl->setVariable(array(
72             'X'           => $x,
73             'TEXTO_Y'     => $y,
74             'LINEA_Y'     => $y + PUNTOS + 2.5,
75             'LINEA_ANCHO' => strlen($artista) * 2.8 + 25 / strlen($artista),
76             'ARTISTA'     => translate($artista),
77         ));
78         usort($albums, 'cmp');
79         for ($i = 0; $i < count($albums); $i++) {
80             // assign data
81             $tpl->setVariable('ALBUM', translate($albums[$i]));
82             // process the block
83             $tpl->parse('ALBUMS');
84         }
85         $y += PUNTOS * ($i + 2);
86         $tpl->parse('ARTISTAS');
87     }
88
89     $results = $tpl->get();
90     $fo = fopen($filename, 'w');
91     fputs($fo, $results);
92     fclose($fo);
93 }
94
95 function cmp($a, $b) {
96     if (preg_match('/.*\[(\d{4})\]/', $a, $ma)
97         and preg_match('/.*\[(\d{4})\]/', $b, $mb))
98     {
99         if     ($ma[1] == $mb[1]) return 0;
100         elseif ($ma[1] < $mb[1])  return -1;
101         else                      return 1;
102     }
103     else
104     {
105         strcmp($a, $b);
106     }
107 }
108
109 function translate($str) {
110     static $tabla = array();
111     if (!@$tabla) {
112         $tabla = get_html_translation_table(HTML_ENTITIES);
113         array_shift($tabla);
114         foreach ($tabla as $char => $void) {
115             $tabla[$char] = '&#' . ord($char) . ';';
116         }
117     }
118     return strtr($str, $tabla);
119 }
120
121 ?>