Skip to content

Instantly share code, notes, and snippets.

@telent
Created March 3, 2012 22:03
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save telent/1968570 to your computer and use it in GitHub Desktop.
Save telent/1968570 to your computer and use it in GitHub Desktop.
Audio (mp3/flac/etc) tag support for Clojure via JAudiotagger
(ns onelouder.core
(:import [org.jaudiotagger.audio AudioFileIO]
[org.jaudiotagger.tag FieldKey]))
(defn tags [file]
(let [fields (apply conj {} (map (fn [n] [(keyword (. (. n toString) toLowerCase)) n]) (. FieldKey values)))
tag (. file (getTag))]
(apply conj {}
(filter (fn [[name val]] (and val (not (empty? val))))
(map (fn [[name val]]
[name (seq (map #(. % getContent) (. tag (getFields val))))])
fields)))))
(defn audioheader [file]
(bean (. file (getAudioHeader))))
(defn metadata [filename]
(let [file (AudioFileIO/read (new java.io.File filename))]
{:tags (tags file)
:audioheader (audioheader file)}))
(defproject onelouder "1.0.0-SNAPSHOT"
:description "Audio (mp3/flac/etc) tag support for Clojure via JAudiotagger"
:dependencies [[org.clojure/clojure "1.3.0"]
[org/jaudiotagger "2.0.3"]])
@telent
Copy link
Author

telent commented Mar 3, 2012

onelouder.core> (metadata "/home/dan/music/Archive-Controlling Crowds/04.Dangervisit.flac")
{:tags {:track ("4"), :encoder ("reference libFLAC 1.2.1 20070917"), :album ("Controlling Crowds"), :genre ("Trip-Hop"), :title ("Dangervisit"), :year ("2009"), :artist ("Archive")}, :audioheader {:channelNumber 2, :encodingType "FLAC 16 bits", :sampleRate "44100", :extraEncodingInfos "", :trackLength 457, :class org.jaudiotagger.audio.generic.GenericAudioHeader, :bitRate "751", :lossless false, :sampleRateAsNumber 44100, :channels "2", :preciseLength 457.21335, :format "FLAC 16 bits", :bitRateAsNumber 751, :variableBitRate true}}
onelouder.core> (metadata "/home/dan/music/prescription_7/04 - Attack Ships On Fire.mp3")
{:tags {:disc_no ("1"), :album_artist ("Various Artists"), :artist ("London Elektricity"), :comment ("Amazon.com Song ID: 209206656"), :cover_art ("image/jpeg::57098"), :year ("2009"), :title ("Attack Ships On Fire"), :genre ("Dance & DJ"), :album ("Hospital Mix 7"), :track_total ("4"), :track ("4"), :composer (""), :conductor (""), :disc_total ("1")}, :audioheader {:encodingType "mp3", :sampleRate "44100", :protected false, :trackLengthAsString "06:04", :numberOfFrames 13950, :trackLength 364, :padding false, :mp3StartByte 57524, :mpegVersion "MPEG-1", :class org.jaudiotagger.audio.mp3.MP3AudioHeader, :preciseTrackLength 364.40816326530614, :bitRate "~248", :numberOfFramesEstimate 27096, :sampleRateAsNumber 44100, :private false, :encoder "LAME3.97 ", :original true, :channels "Joint Stereo", :mpegLayer "Layer 3", :format "MPEG-1 Layer 3", :bitRateAsNumber 248, :variableBitRate true, :copyrighted false, :emphasis "None"}}

@telent
Copy link
Author

telent commented Mar 3, 2012

The :tags map values are deliberately lists, because the spec apparently allows for multiple tags with the same name.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment