Created
March 3, 2012 22:03
-
-
Save telent/1968570 to your computer and use it in GitHub Desktop.
Audio (mp3/flac/etc) tag support for Clojure via JAudiotagger
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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)})) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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"]]) |
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
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"}}