(make-initial-db 'comment 'disc 'tracks)
(port->stream cddb-port read-line)))
-
-
-
-
-
+;;; Commands
+
+;; string-tokenize is weird, might want to just use regexeps instead
+(define cddb-dtitle-char-set (char-set-difference char-set:printing
+ (char-set #\/)))
+
+(define* (cddb->export cddb #:optional (out (current-output-port)))
+ "Convert database to shell expression for abcde"
+ ;; Using single quoting instead of "" to make life easier
+ (letrec* ((escape-for-shell
+ (lambda (x) (regexp-substitute/global #f "['\\\\]" x
+ 'pre
+ (lambda (m) (string-append "\\" (match:substring m)))
+ 'post)))
+ (disc-query (lambda* (key #:optional (default '("")))
+ (cond ((cddb-query-disc cddb key) => identity)
+ (else default))))
+
+ (artist ((lambda (s) (substring s 0 (- (string-index s #\/) 1))) (car (disc-query 'TITLE)))
+
+ #;(string-trim-right (car (string-tokenize (car (disc-query 'TITLE)) cddb-dtitle-char-set))))
+
+ (album ((lambda (s) (substring s (+ (string-index s #\/) 2))) (car (disc-query 'TITLE)))
+ #;(string-trim (string-join (cdr (string-tokenize (car (disc-query 'TITLE)) cddb-dtitle-char-set))
+ "/"))))
+
+
+ (newline out)
+
+ ;; Not exported CDDBGENRE intentionally, since it appears unused
+ (format out "DISCID=$'~A'~%DALBUM=$'~A'~%DARTIST=$'~A'~%CDYEAR=$'~A'~%"
+ (escape-for-shell (car (disc-query 'DISCID)))
+ (escape-for-shell album)
+ (escape-for-shell artist)
+ (escape-for-shell (car (disc-query 'YEAR))))
+
+ ;; Store genre(s) in a bash array. mp3s will just have to live with
+ ;; using the first, but Vorbis/FLAC can handle an arbitrary set of
+ ;; genres
+ (format out "CDGENRE=(~{$'~A' ~})~%" (map escape-for-shell (disc-query 'GENRE)))
+
+ (format out "~:{TRACK~A=$'~A'~%~}"
+ (map (lambda (ttitle) (list (1+ (first ttitle)) (escape-for-shell (second ttitle))))
+ (cddb-query-tracks cddb 'TITLE)))))
+
+(define (main args)
+ (cond ((string= (second args) "parse")
+ (call-with-input-file (third args)
+ (lambda (f) (cddb->export (read-cddb f)))))
+ (else
+ (apply execlp "cddb-tool" args))))
+
+
+(when (batch-mode?)
+ (exit (main (program-arguments))))
\ No newline at end of file