cleaned the code by using c.c macros
parent
3279235fb7
commit
b8da6992fe
|
@ -3,15 +3,14 @@
|
||||||
(java.text SimpleDateFormat)
|
(java.text SimpleDateFormat)
|
||||||
(java.util TimeZone))
|
(java.util TimeZone))
|
||||||
(:use [clj-lastfm.filecache]
|
(:use [clj-lastfm.filecache]
|
||||||
|
[clojure.contrib.def :only (defstruct- defvar-)]
|
||||||
[clojure.contrib.json.read :only (read-json)]
|
[clojure.contrib.json.read :only (read-json)]
|
||||||
[clojure.walk :only (keywordize-keys)]
|
[clojure.contrib.logging]
|
||||||
[clojure.contrib.import-static]
|
[clojure.walk :only (keywordize-keys)]))
|
||||||
[clojure.contrib.logging]))
|
|
||||||
|
|
||||||
;;;;;;;;;; Basic ;;;;;;;;;;
|
;;;;;;;;;; Basic ;;;;;;;;;;
|
||||||
|
|
||||||
(def #^{:private true}
|
(defvar- api-root-url ["http" "ws.audioscrobbler.com" "/2.0/"])
|
||||||
api-root-url ["http" "ws.audioscrobbler.com" "/2.0/"])
|
|
||||||
|
|
||||||
(defn- api-key []
|
(defn- api-key []
|
||||||
(let [lastfm-api-key (resolve '*lastfm-api-key*)]
|
(let [lastfm-api-key (resolve '*lastfm-api-key*)]
|
||||||
|
@ -19,10 +18,13 @@
|
||||||
(throw (IllegalStateException. "lastfm API key is not set"))
|
(throw (IllegalStateException. "lastfm API key is not set"))
|
||||||
lastfm-api-key)))
|
lastfm-api-key)))
|
||||||
|
|
||||||
(def #^{:private true} guid-pattern
|
(defvar- guid-pattern
|
||||||
#"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$")
|
(let [an "[0-9a-fA-F]"]
|
||||||
|
(re-pattern (str "^" an "{8}-" an "{4}-" an "{4}-" an "{4}-" an "{12}$"))))
|
||||||
|
|
||||||
(def #^{:private true} attr-kw (keyword "@attr"))
|
(defn- mbid? [s] (if (re-matches guid-pattern s) true false))
|
||||||
|
|
||||||
|
(defvar- attr-kw (keyword "@attr"))
|
||||||
|
|
||||||
(defn- safe-parse-int [n]
|
(defn- safe-parse-int [n]
|
||||||
(if (nil? n)
|
(if (nil? n)
|
||||||
|
@ -40,6 +42,8 @@
|
||||||
|
|
||||||
(defn- str-1? [n] (-> n safe-parse-int (= 1)))
|
(defn- str-1? [n] (-> n safe-parse-int (= 1)))
|
||||||
|
|
||||||
|
(defn- blank? [s] (every? #(Character/isWhitespace #^Character %) s))
|
||||||
|
|
||||||
(defn- struct? [obj] (instance? clojure.lang.PersistentStructMap obj))
|
(defn- struct? [obj] (instance? clojure.lang.PersistentStructMap obj))
|
||||||
|
|
||||||
(def #^{:private true :tag SimpleDateFormat} sdftz
|
(def #^{:private true :tag SimpleDateFormat} sdftz
|
||||||
|
@ -51,13 +55,15 @@
|
||||||
(.setTimeZone (TimeZone/getTimeZone "GMT"))))
|
(.setTimeZone (TimeZone/getTimeZone "GMT"))))
|
||||||
|
|
||||||
(defn- parse-date [date-str]
|
(defn- parse-date [date-str]
|
||||||
(try
|
(if (some #(% date-str) [nil? blank?])
|
||||||
(.parse sdftz date-str)
|
nil
|
||||||
(catch java.text.ParseException e
|
(try
|
||||||
(.parse sdf date-str))))
|
(.parse sdftz date-str)
|
||||||
|
(catch java.text.ParseException e
|
||||||
|
(.parse sdf date-str)))))
|
||||||
|
|
||||||
(defn- remove-nil-values [m]
|
(defn- remove-nil-values [m]
|
||||||
(apply hash-map (apply concat (filter #(not (nil? (fnext %))) m))))
|
(apply hash-map (apply concat (filter #(-> % fnext nil? not) m))))
|
||||||
|
|
||||||
(defn- lastfm-url [path]
|
(defn- lastfm-url [path]
|
||||||
(.toString (URI. "http" "www.last.fm" path nil nil)))
|
(.toString (URI. "http" "www.last.fm" path nil nil)))
|
||||||
|
@ -80,7 +86,7 @@
|
||||||
(merge query-params {:api_key @(api-key) :format "json"}))
|
(merge query-params {:api_key @(api-key) :format "json"}))
|
||||||
nil))))
|
nil))))
|
||||||
|
|
||||||
(def #^{:private true} default-cache (create-file-cache))
|
(defvar- default-cache (create-file-cache))
|
||||||
|
|
||||||
(defn- get-url
|
(defn- get-url
|
||||||
([url] (get-url url default-cache))
|
([url] (get-url url default-cache))
|
||||||
|
@ -160,7 +166,7 @@
|
||||||
|
|
||||||
;;;;;;;;;; Bio/Wiki ;;;;;;;;;;
|
;;;;;;;;;; Bio/Wiki ;;;;;;;;;;
|
||||||
|
|
||||||
(defstruct bio-struct :published :summary :content)
|
(defstruct- bio-struct :published :summary :content)
|
||||||
|
|
||||||
(defn- parse-bio [data]
|
(defn- parse-bio [data]
|
||||||
(do
|
(do
|
||||||
|
@ -173,7 +179,7 @@
|
||||||
|
|
||||||
;;;;;;;;;; Location ;;;;;;;;;;
|
;;;;;;;;;; Location ;;;;;;;;;;
|
||||||
|
|
||||||
(defstruct location-struct
|
(defstruct- location-struct
|
||||||
:latitude :longitude :street :postalcode :city :country)
|
:latitude :longitude :street :postalcode :city :country)
|
||||||
|
|
||||||
(defn- parse-location [data]
|
(defn- parse-location [data]
|
||||||
|
@ -189,7 +195,7 @@
|
||||||
|
|
||||||
;;;;;;;;;; Venue ;;;;;;;;;;
|
;;;;;;;;;; Venue ;;;;;;;;;;
|
||||||
|
|
||||||
(defstruct venue-struct
|
(defstruct- venue-struct
|
||||||
:id :name :location :url :website :phonenumber)
|
:id :name :location :url :website :phonenumber)
|
||||||
|
|
||||||
(defn- parse-venue [data]
|
(defn- parse-venue [data]
|
||||||
|
@ -205,15 +211,15 @@
|
||||||
|
|
||||||
;;;;;;;;;; Event ;;;;;;;;;;
|
;;;;;;;;;; Event ;;;;;;;;;;
|
||||||
|
|
||||||
(defstruct event-struct
|
(defstruct- event-struct
|
||||||
:id :title :artists :headliner :venue :start :description
|
:id :title :artists :headliner :venue :start :description
|
||||||
:attendence :reviews :tag :url :website :cancelled :tags)
|
:attendence :reviews :tag :url :website :cancelled :tags)
|
||||||
|
|
||||||
(def #^{:private true} parse-event-artists
|
(defvar- parse-event-artists
|
||||||
(create-parse-string-or-list-fn
|
(create-parse-string-or-list-fn
|
||||||
#(artist-from-name %) #(-> % :artists :artist)))
|
#(artist-from-name %) #(-> % :artists :artist)))
|
||||||
|
|
||||||
(def #^{:private true} parse-event-tags
|
(defvar- parse-event-tags
|
||||||
(create-parse-string-or-list-fn
|
(create-parse-string-or-list-fn
|
||||||
#(tag-from-name %) #(-> % :tags :tag)))
|
#(tag-from-name %) #(-> % :tags :tag)))
|
||||||
|
|
||||||
|
@ -238,7 +244,7 @@
|
||||||
|
|
||||||
;;;;;;;;;; Shout ;;;;;;;;;;
|
;;;;;;;;;; Shout ;;;;;;;;;;
|
||||||
|
|
||||||
(defstruct shout-struct :body :author :date)
|
(defstruct- shout-struct :body :author :date)
|
||||||
|
|
||||||
(defn- parse-shout [data]
|
(defn- parse-shout [data]
|
||||||
(do
|
(do
|
||||||
|
@ -250,7 +256,7 @@
|
||||||
|
|
||||||
;;;;;;;;;; Artist ;;;;;;;;;;
|
;;;;;;;;;; Artist ;;;;;;;;;;
|
||||||
|
|
||||||
(defstruct artist-struct
|
(defstruct- artist-struct
|
||||||
:name :url :mbid :streamable :listeners :playcount :bio)
|
:name :url :mbid :streamable :listeners :playcount :bio)
|
||||||
|
|
||||||
(defn- parse-artist [data]
|
(defn- parse-artist [data]
|
||||||
|
@ -277,12 +283,12 @@
|
||||||
(debug (str "parse-artist-getinfo: " data))
|
(debug (str "parse-artist-getinfo: " data))
|
||||||
(-> data :artist parse-artist))))
|
(-> data :artist parse-artist))))
|
||||||
|
|
||||||
(def #^{:private true} get-artist
|
(defvar- get-artist
|
||||||
(create-get-obj-fn {:method "artist.getinfo"} parse-artist-getinfo))
|
(create-get-obj-fn {:method "artist.getinfo"} parse-artist-getinfo))
|
||||||
|
|
||||||
(defmulti artist
|
(defmulti artist
|
||||||
(fn [artist-or-mbid & _]
|
(fn [artist-or-mbid & _]
|
||||||
(if (re-matches guid-pattern artist-or-mbid) :mbid :artist)))
|
(if (mbid? artist-or-mbid) :mbid :artist)))
|
||||||
|
|
||||||
(defmethod artist :artist
|
(defmethod artist :artist
|
||||||
([artist-name] (artist artist-name nil nil))
|
([artist-name] (artist artist-name nil nil))
|
||||||
|
@ -309,12 +315,12 @@
|
||||||
:streamable (-> data :streamable str-1?)
|
:streamable (-> data :streamable str-1?)
|
||||||
:match (-> data :match safe-parse-double)))
|
:match (-> data :match safe-parse-double)))
|
||||||
|
|
||||||
(def #^{:private true} parse-artist-similar
|
(defvar- parse-artist-similar
|
||||||
(create-parse-one-or-more-fn
|
(create-parse-one-or-more-fn
|
||||||
parse-artist-similar-1
|
parse-artist-similar-1
|
||||||
#(-> % :similarartists :artist)))
|
#(-> % :similarartists :artist)))
|
||||||
|
|
||||||
(def #^{:private true} get-artist-similar
|
(defvar- get-artist-similar
|
||||||
(create-get-obj-fn
|
(create-get-obj-fn
|
||||||
{:method "artist.getsimilar"} parse-artist-similar))
|
{:method "artist.getsimilar"} parse-artist-similar))
|
||||||
|
|
||||||
|
@ -335,12 +341,12 @@
|
||||||
|
|
||||||
;;;;;;;;;; artist.gettoptags ;;;;;;;;;;
|
;;;;;;;;;; artist.gettoptags ;;;;;;;;;;
|
||||||
|
|
||||||
(def #^{:private true} parse-artist-toptags
|
(defvar- parse-artist-toptags
|
||||||
(create-parse-one-or-more-fn
|
(create-parse-one-or-more-fn
|
||||||
#(struct tag-struct (% :name) (% :url))
|
#(struct tag-struct (% :name) (% :url))
|
||||||
#(-> % :toptags :tag)))
|
#(-> % :toptags :tag)))
|
||||||
|
|
||||||
(def #^{:private true} get-artist-toptags
|
(defvar- get-artist-toptags
|
||||||
(create-get-obj-fn
|
(create-get-obj-fn
|
||||||
{:method "artist.gettoptags"} parse-artist-toptags))
|
{:method "artist.gettoptags"} parse-artist-toptags))
|
||||||
|
|
||||||
|
@ -366,12 +372,12 @@
|
||||||
:playcount (-> data :playcount safe-parse-int)
|
:playcount (-> data :playcount safe-parse-int)
|
||||||
:rank (-> data attr-kw :rank safe-parse-int)))
|
:rank (-> data attr-kw :rank safe-parse-int)))
|
||||||
|
|
||||||
(def #^{:private true} parse-artist-topalbums
|
(defvar- parse-artist-topalbums
|
||||||
(create-parse-one-or-more-fn
|
(create-parse-one-or-more-fn
|
||||||
parse-artist-topalbums-1
|
parse-artist-topalbums-1
|
||||||
#(-> % :topalbums :album)))
|
#(-> % :topalbums :album)))
|
||||||
|
|
||||||
(def #^{:private true} get-artist-topalbums
|
(defvar- get-artist-topalbums
|
||||||
(create-get-obj-fn
|
(create-get-obj-fn
|
||||||
{:method "artist.gettopalbums"} parse-artist-topalbums))
|
{:method "artist.gettopalbums"} parse-artist-topalbums))
|
||||||
|
|
||||||
|
@ -392,12 +398,12 @@
|
||||||
:realname (data :realname)
|
:realname (data :realname)
|
||||||
:weight (-> data :weight safe-parse-int)))
|
:weight (-> data :weight safe-parse-int)))
|
||||||
|
|
||||||
(def #^{:private true} parse-artist-topfans
|
(defvar- parse-artist-topfans
|
||||||
(create-parse-one-or-more-fn
|
(create-parse-one-or-more-fn
|
||||||
parse-artist-topfans-1
|
parse-artist-topfans-1
|
||||||
#(-> % :topfans :user)))
|
#(-> % :topfans :user)))
|
||||||
|
|
||||||
(def #^{:private true} get-artist-topfans
|
(defvar- get-artist-topfans
|
||||||
(create-get-obj-fn
|
(create-get-obj-fn
|
||||||
{:method "artist.gettopfans"} parse-artist-topfans))
|
{:method "artist.gettopfans"} parse-artist-topfans))
|
||||||
|
|
||||||
|
@ -425,12 +431,12 @@
|
||||||
:streamable (-> data :streamable :#text str-1?)
|
:streamable (-> data :streamable :#text str-1?)
|
||||||
:streamable-full (-> data :streamable :fulltrack str-1?)))
|
:streamable-full (-> data :streamable :fulltrack str-1?)))
|
||||||
|
|
||||||
(def #^{:private true} parse-artist-toptracks
|
(defvar- parse-artist-toptracks
|
||||||
(create-parse-one-or-more-fn
|
(create-parse-one-or-more-fn
|
||||||
parse-artist-toptracks-1
|
parse-artist-toptracks-1
|
||||||
#(-> % :toptracks :track)))
|
#(-> % :toptracks :track)))
|
||||||
|
|
||||||
(def #^{:private true} get-artist-toptracks
|
(defvar- get-artist-toptracks
|
||||||
(create-get-obj-fn
|
(create-get-obj-fn
|
||||||
{:method "artist.gettoptracks"} parse-artist-toptracks))
|
{:method "artist.gettoptracks"} parse-artist-toptracks))
|
||||||
|
|
||||||
|
@ -444,12 +450,12 @@
|
||||||
|
|
||||||
;;;;;;;;;; artist.getevents ;;;;;;;;;;
|
;;;;;;;;;; artist.getevents ;;;;;;;;;;
|
||||||
|
|
||||||
(def #^{:private true} parse-artist-events
|
(defvar- parse-artist-events
|
||||||
(create-parse-one-or-more-fn
|
(create-parse-one-or-more-fn
|
||||||
parse-event
|
parse-event
|
||||||
#(-> % :events :event)))
|
#(-> % :events :event)))
|
||||||
|
|
||||||
(def #^{:private true} get-artist-events
|
(defvar- get-artist-events
|
||||||
(create-get-obj-fn
|
(create-get-obj-fn
|
||||||
{:method "artist.getevents"} parse-artist-events))
|
{:method "artist.getevents"} parse-artist-events))
|
||||||
|
|
||||||
|
@ -465,14 +471,14 @@
|
||||||
|
|
||||||
(declare get-artist-pastevents)
|
(declare get-artist-pastevents)
|
||||||
|
|
||||||
(def #^{:private true} parse-artist-pastevents
|
(defvar- parse-artist-pastevents
|
||||||
(create-paged-parse-fn
|
(create-paged-parse-fn
|
||||||
#(-> % :events attr-kw)
|
#(-> % :events attr-kw)
|
||||||
#(hash-map :artist (-> % :events attr-kw :artist))
|
#(hash-map :artist (-> % :events attr-kw :artist))
|
||||||
parse-artist-events
|
parse-artist-events
|
||||||
#(get-artist-pastevents %)))
|
#(get-artist-pastevents %)))
|
||||||
|
|
||||||
(def #^{:private true} get-artist-pastevents
|
(defvar- get-artist-pastevents
|
||||||
(create-paged-get-obj-fn
|
(create-paged-get-obj-fn
|
||||||
{:method "artist.getpastevents"}
|
{:method "artist.getpastevents"}
|
||||||
parse-artist-pastevents))
|
parse-artist-pastevents))
|
||||||
|
@ -493,19 +499,19 @@
|
||||||
|
|
||||||
(declare get-artist-shouts)
|
(declare get-artist-shouts)
|
||||||
|
|
||||||
(def #^{:private true} parse-artist-shouts-unpaged
|
(defvar- parse-artist-shouts-unpaged
|
||||||
(create-parse-one-or-more-fn
|
(create-parse-one-or-more-fn
|
||||||
parse-shout
|
parse-shout
|
||||||
#(-> % :shouts :shout)))
|
#(-> % :shouts :shout)))
|
||||||
|
|
||||||
(def #^{:private true} parse-artist-shouts
|
(defvar- parse-artist-shouts
|
||||||
(create-paged-parse-fn
|
(create-paged-parse-fn
|
||||||
#(-> % :shouts attr-kw)
|
#(-> % :shouts attr-kw)
|
||||||
#(hash-map :artist (-> % :shouts attr-kw :artist))
|
#(hash-map :artist (-> % :shouts attr-kw :artist))
|
||||||
parse-artist-shouts-unpaged
|
parse-artist-shouts-unpaged
|
||||||
#(get-artist-shouts %)))
|
#(get-artist-shouts %)))
|
||||||
|
|
||||||
(def #^{:private true} get-artist-shouts
|
(defvar- get-artist-shouts
|
||||||
(create-paged-get-obj-fn
|
(create-paged-get-obj-fn
|
||||||
{:method "artist.getshouts"}
|
{:method "artist.getshouts"}
|
||||||
parse-artist-shouts))
|
parse-artist-shouts))
|
||||||
|
@ -524,23 +530,23 @@
|
||||||
|
|
||||||
;;;;;;;;;; Tag ;;;;;;;;;;
|
;;;;;;;;;; Tag ;;;;;;;;;;
|
||||||
|
|
||||||
(defstruct tag-struct :name :url)
|
(defstruct- tag-struct :name :url)
|
||||||
|
|
||||||
(defn- tag-from-name [tag-name]
|
(defn- tag-from-name [tag-name]
|
||||||
(struct tag-struct tag-name (lastfm-url (str "/tag/" tag-name))))
|
(struct tag-struct tag-name (lastfm-url (str "/tag/" tag-name))))
|
||||||
|
|
||||||
;;;;;;;;;; Album ;;;;;;;;;;
|
;;;;;;;;;; Album ;;;;;;;;;;
|
||||||
|
|
||||||
(defstruct album-struct :name :url :mbid :artist :playcount)
|
(defstruct- album-struct :name :url :mbid :artist :playcount)
|
||||||
|
|
||||||
;;;;;;;;;; Track ;;;;;;;;;;
|
;;;;;;;;;; Track ;;;;;;;;;;
|
||||||
|
|
||||||
(defstruct track-struct
|
(defstruct- track-struct
|
||||||
:name :url :mbid :artist :playcount :listeners :streamable)
|
:name :url :mbid :artist :playcount :listeners :streamable)
|
||||||
|
|
||||||
;;;;;;;;;; User ;;;;;;;;;;
|
;;;;;;;;;; User ;;;;;;;;;;
|
||||||
|
|
||||||
(defstruct user-struct :name :url :realname)
|
(defstruct- user-struct :name :url :realname)
|
||||||
|
|
||||||
(defn- user-from-name [user-name]
|
(defn- user-from-name [user-name]
|
||||||
(struct-map user-struct :name user-name))
|
(struct-map user-struct :name user-name))
|
||||||
|
|
Loading…
Reference in New Issue