6 char *server = "gnudb.org";
9 #define DPRINT if(debug)fprint
14 typedef struct Track Track;
25 typedef struct Toc Toc;
42 sysfatal("can't malloc: %r");
52 t = emalloc(strlen(s)+1);
62 print("title\t%s\n", t->title);
64 print("year\t%s\n", t->year);
66 print("artist\t%s\n", t->artist);
67 for(i=0; i<t->ntrack; i++){
68 print("%d\t%s", i+1, t->track[i].title);
73 s = (n - t->track[i].n)/75;
74 print("\t%d:%2.2d", s/60, s%60);
76 if(t->track[i].artist[0] != 0)
77 print("\t%s", t->track[i].artist);
82 print("Total time: %d:%2.2d\n", s/60, s%60);
92 for(i=0; i < t->ntrack; i++){
93 print("</mnt/cd/a%03d audio/flacenc ", i);
94 print("-T 'title='^%q -T 'trackno=%d' ", t->track[i].title, i+1);
96 print("-T 'year='^%q ", t->year);
97 if(t->track[i].artist[0] != 0 || t->artist[0] != 0)
98 print("-T 'artist='^%q ", t->track[i].artist[0] != 0 ? t->track[i].artist : t->artist);
99 print(">%q/a%03d.flac\n", eflag, i);
108 if((p = strchr(s, '/')) == nil)
125 fd = dial(netmkaddr(server, "tcp", "8880"), 0, 0, 0);
127 fprint(2, "%s: %s: cannot dial: %r\n", argv0, server);
130 Binit(&bin, fd, OREAD);
132 if((p=Brdline(&bin, '\n')) == nil || atoi(p)/100 != 2) {
136 fprint(2, "%s: error talking to cddb server %s\n",
139 p[Blinelen(&bin)-1] = 0;
140 fprint(2, "%s: server says: %s\n", argv0, p);
145 fprint(fd, "cddb hello gre plan9 9cd 1.0\r\n");
146 if((p = Brdline(&bin, '\n')) == nil || atoi(p)/100 != 2)
150 * Protocol level 6 is the same as level 5 except that
151 * the character set is now UTF-8 instead of ISO-8859-1.
153 fprint(fd, "proto 6\r\n");
154 DPRINT(2, "proto 6\r\n");
155 if((p = Brdline(&bin, '\n')) == nil || atoi(p)/100 != 2)
157 p[Blinelen(&bin)-1] = 0;
158 DPRINT(2, "cddb: %s\n", p);
160 fprint(fd, "cddb query %8.8lux %d", t->diskid, t->ntrack);
161 DPRINT(2, "cddb query %8.8lux %d", t->diskid, t->ntrack);
162 for(i=0; i<t->ntrack; i++) {
163 fprint(fd, " %d", t->track[i].n);
164 DPRINT(2, " %d", t->track[i].n);
166 fprint(fd, " %d\r\n", t->track[t->ntrack].n);
167 DPRINT(2, " %d\r\n", t->track[t->ntrack].n);
169 if((p = Brdline(&bin, '\n')) == nil || atoi(p)/100 != 2)
171 p[Blinelen(&bin)-1] = 0;
172 DPRINT(2, "cddb: %s\n", p);
173 nf = tokenize(p, f, nelem(f));
178 case 200: /* exact match */
184 case 210: /* exact matches */
185 case 211: /* close matches */
186 if((p = Brdline(&bin, '\n')) == nil)
188 if(p[0] == '.') /* no close matches? */
190 p[Blinelen(&bin)-1] = '\0';
192 /* accept first match */
193 nf = tokenize(p, f, nelem(f));
199 /* snarf rest of buffer */
201 if((p = Brdline(&bin, '\n')) == nil)
203 p[Blinelen(&bin)-1] = '\0';
204 DPRINT(2, "cddb: %s\n", p);
207 case 202: /* no match */
215 for(i=0; i<t->ntrack; i++) {
216 t->track[i].title = "";
217 t->track[i].artist = "";
220 /* fetch results for this cd */
221 fprint(fd, "cddb read %s %s\r\n", categ, id);
223 if((p = Brdline(&bin, '\n')) == nil)
225 q = p+Blinelen(&bin)-1;
228 DPRINT(2, "cddb %s\n", p);
229 if(strncmp(p, "DTITLE=", 7) == 0) {
233 t->artist = estrdup(p);
236 t->title = estrdup(p);
238 else if(strncmp(p, "DYEAR=", 6) == 0) {
239 t->year = estrdup(p+6);
241 else if(strncmp(p, "TTITLE", 6) == 0 && isdigit(p[6])) {
251 t->track[i].artist = estrdup(p);
254 t->track[i].title = estrdup(p);
259 fprint(fd, "quit\r\n");
269 fprint(2, "usage: aux/cddb [-DTt] [-s server] query diskid n ...\n");
274 main(int argc, char **argv)
284 server = EARGF(usage());
287 eflag = EARGF(usage());
297 if(argc < 3 || strcmp(argv[0], "query") != 0)
300 toc.diskid = strtoul(argv[1], 0, 16);
301 toc.ntrack = atoi(argv[2]);
302 if(argc != 3+toc.ntrack+1)
303 sysfatal("argument count does not match given ntrack");
305 for(i=0; i<=toc.ntrack; i++)
306 toc.track[i].n = atoi(argv[3+i]);
308 if(cddbfilltoc(&toc) < 0)