Remove broken debug print, whoops
[clinton/abcde.git] / abcddb-tool
index 8aab4ed..3701916 100755 (executable)
@@ -88,8 +88,58 @@ of (disc-number . tag-value)"
               (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