Started moving derive-tags into a closure to encapsulate the use-filenames feature. Added some commentary about my idiosyncraties. Added a lot of comments.
This commit is contained in:
parent
5b69308f4d
commit
36d8db1f86
|
@ -19,6 +19,15 @@
|
||||||
(print (.format "mp_suggest (hy version {})" *version*))
|
(print (.format "mp_suggest (hy version {})" *version*))
|
||||||
(sys.exit 0))
|
(sys.exit 0))
|
||||||
|
|
||||||
|
(defn print-help []
|
||||||
|
(print "Usage:")
|
||||||
|
(ap-each optlist (print (.format " -{} --{} {}" (get it 0) (get it 1) (get it 3))))
|
||||||
|
(sys.exit 0))
|
||||||
|
|
||||||
|
; Given a set of command-line arguments, compare that to a mapped
|
||||||
|
; version of the optlist and return a canonicalized dictionary of all
|
||||||
|
; the arguments that have been set.
|
||||||
|
|
||||||
(defn find-opt-reducer [acc it]
|
(defn find-opt-reducer [acc it]
|
||||||
(let [[(, o a) it]
|
(let [[(, o a) it]
|
||||||
[optmap (ap-reduce (do (assoc acc (+ "-" (. it [0])) (. it [1])) acc) optlist {})]]
|
[optmap (ap-reduce (do (assoc acc (+ "-" (. it [0])) (. it [1])) acc) optlist {})]]
|
||||||
|
@ -27,6 +36,10 @@
|
||||||
(assoc acc full (if hasargs a true))))
|
(assoc acc full (if hasargs a true))))
|
||||||
acc))
|
acc))
|
||||||
|
|
||||||
|
; Assuming the directory name looked like "Artist - Album", return the
|
||||||
|
; two names separately. If only one name is here, assume a compilation
|
||||||
|
; or mixtape album and default to "VA" (Various Artists).
|
||||||
|
|
||||||
(defn artist-album []
|
(defn artist-album []
|
||||||
(let [[aa (.split (. (.split (.getcwd os) "/") [-1]) " - ")]
|
(let [[aa (.split (. (.split (.getcwd os) "/") [-1]) " - ")]
|
||||||
[sp (fn [i] (.strip i))]]
|
[sp (fn [i] (.strip i))]]
|
||||||
|
@ -34,6 +47,10 @@
|
||||||
(, "VA" (get aa 0))
|
(, "VA" (get aa 0))
|
||||||
(, (sp (get aa 0)) (sp (get aa 1))))))
|
(, (sp (get aa 0)) (sp (get aa 1))))))
|
||||||
|
|
||||||
|
; A long list of substitutions intended to turn a filename into a
|
||||||
|
; human-readable strategy. This operation is the result of weeks
|
||||||
|
; of experimentation. Doubt it at your peril! :-)
|
||||||
|
|
||||||
(defn title-strategy [orig]
|
(defn title-strategy [orig]
|
||||||
(->> (.strip orig)
|
(->> (.strip orig)
|
||||||
(.sub re "\.[Mm][Pp]3$" "")
|
(.sub re "\.[Mm][Pp]3$" "")
|
||||||
|
@ -43,7 +60,13 @@
|
||||||
(.sub re "^[\d\. ]+" "")
|
(.sub re "^[\d\. ]+" "")
|
||||||
(.sub re ".* \d{2} " "")))
|
(.sub re ".* \d{2} " "")))
|
||||||
|
|
||||||
(defn derive-tags [mp3s]
|
; Given a list of mp3s, derive the list of ID3 tags. Obviously,
|
||||||
|
; filesystem access is a point of failure, but this is mostly
|
||||||
|
; reliable.
|
||||||
|
|
||||||
|
|
||||||
|
(defn tag-deriver [usefilenames]
|
||||||
|
(fn [mp3s]
|
||||||
(defn derive-tag [pos mp3]
|
(defn derive-tag [pos mp3]
|
||||||
(try
|
(try
|
||||||
(let [[tag (.Tag eyeD3)]]
|
(let [[tag (.Tag eyeD3)]]
|
||||||
|
@ -52,24 +75,26 @@
|
||||||
(str (.getGenre tag)) (str (.getTitle tag)) pos))
|
(str (.getGenre tag)) (str (.getTitle tag)) pos))
|
||||||
(catch [err]
|
(catch [err]
|
||||||
(, mp3 "" "" "" ""))))
|
(, mp3 "" "" "" ""))))
|
||||||
(ap-map (apply derive-tag it) mp3s))
|
(ap-map (apply derive-tag it) mp3s)))
|
||||||
|
|
||||||
(defn print-help []
|
; For removing subgenre parentheses. This is why there's the -g option.
|
||||||
(print "Usage:")
|
|
||||||
(ap-each optlist (print (.format " -{} --{} {}" (get it 0) (get it 1) (get it 3))))
|
|
||||||
(sys.exit 0))
|
|
||||||
|
|
||||||
(defn clean-paren [s]
|
(defn clean-paren [s]
|
||||||
(if (not (= (.find s "(") -1))
|
(if (not (= (.find s "(") -1))
|
||||||
(.sub re "\(.*?\)" "" s)
|
(.sub re "\(.*?\)" "" s)
|
||||||
s))
|
s))
|
||||||
|
|
||||||
|
; My FAT-32 based file store via Samba isn't happy with unicode, so
|
||||||
|
; this is here...
|
||||||
|
|
||||||
(defn is-ascii [s]
|
(defn is-ascii [s]
|
||||||
(= (.decode (.encode s "ascii" "ignore") "ascii") s))
|
(= (.decode (.encode s "ascii" "ignore") "ascii") s))
|
||||||
|
|
||||||
(defn ascii-or-nothing [s]
|
(defn ascii-or-nothing [s]
|
||||||
(if (is-ascii s) s ""))
|
(if (is-ascii s) s ""))
|
||||||
|
|
||||||
|
; For all the songs, analyze a consist entry (usually genre and album
|
||||||
|
; names), and return the one with the most votes.
|
||||||
|
|
||||||
(defn find-likely [l]
|
(defn find-likely [l]
|
||||||
(let [[cts
|
(let [[cts
|
||||||
|
@ -85,6 +110,9 @@
|
||||||
""
|
""
|
||||||
(get (get cts 0) 1))))
|
(get (get cts 0) 1))))
|
||||||
|
|
||||||
|
; Auto-capitalize "found" entries like album name and title. Will not
|
||||||
|
; affect manually set entries.
|
||||||
|
|
||||||
(defn sfix [s]
|
(defn sfix [s]
|
||||||
(let [[seq (.split (.strip s))]]
|
(let [[seq (.split (.strip s))]]
|
||||||
(smart_str (string.join (ap-map (.capitalize it) seq) " "))))
|
(smart_str (string.join (ap-map (.capitalize it) seq) " "))))
|
||||||
|
@ -95,7 +123,7 @@
|
||||||
(ap-filter (and (> (len it) 4) (= (slice (.lower it) -4) ".mp3")))
|
(ap-filter (and (> (len it) 4) (= (slice (.lower it) -4) ".mp3")))
|
||||||
(sorted)
|
(sorted)
|
||||||
(enumerate)
|
(enumerate)
|
||||||
(derive-tags)
|
((tag-deriver true))
|
||||||
(list))]
|
(list))]
|
||||||
[(, loc_artist loc_album) (artist-album)]
|
[(, loc_artist loc_album) (artist-album)]
|
||||||
|
|
||||||
|
|
|
@ -59,6 +59,9 @@ the details of all the MP3 files to match your specifications. The
|
||||||
commands can be tweaked, and all of them override the techniques
|
commands can be tweaked, and all of them override the techniques
|
||||||
\Prog{mp\_suggest} uses to derive information.
|
\Prog{mp\_suggest} uses to derive information.
|
||||||
|
|
||||||
|
This is probably completely idiosyncratic to the way I do things in my
|
||||||
|
own music archive, but as an exercise in writing Hy, it was fun.
|
||||||
|
|
||||||
\section{Requirements}
|
\section{Requirements}
|
||||||
%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue