38 lines
1.4 KiB
Clojure
38 lines
1.4 KiB
Clojure
|
(ns clj-lastfm.filecache
|
||
|
(:import (java.io File))
|
||
|
(:use clojure.contrib.duck-streams))
|
||
|
|
||
|
(def default-cache-dir (File. (System/getProperty "java.io.tmpdir")))
|
||
|
(def default-expiry-time (* 24 60)) ;in minutes
|
||
|
|
||
|
(defn- minutes-to-millis [mins] (* mins 1000 60))
|
||
|
(defn- recently-modified? [#^File file expiry-time]
|
||
|
(> (.lastModified file)
|
||
|
(- (System/currentTimeMillis) (minutes-to-millis expiry-time))))
|
||
|
|
||
|
(defn create-file-cache
|
||
|
"Creates a file cache"
|
||
|
([] (create-file-cache default-cache-dir default-expiry-time))
|
||
|
([cache-dir] (create-file-cache cache-dir default-expiry-time))
|
||
|
([cache-dir expiry-time]
|
||
|
{:cache-dir cache-dir :expiry-time expiry-time}))
|
||
|
|
||
|
(defn get-file-content
|
||
|
"Gets the content of the URL provided from cache if present, else fetches and
|
||
|
caches it and returns the content"
|
||
|
[{#^File cache-dir :cache-dir expiry-time :expiry-time} url]
|
||
|
(let [url-hash (hash url)
|
||
|
cache-file (File. (str (.getCanonicalPath cache-dir)
|
||
|
File/separator "clj-lastfm-" url-hash))]
|
||
|
(do
|
||
|
(when-not (and (.exists cache-file) (recently-modified? cache-file expiry-time))
|
||
|
(copy (reader url) cache-file))
|
||
|
(slurp (.getCanonicalPath cache-file)))))
|
||
|
|
||
|
(comment
|
||
|
|
||
|
(def cache (create-file-cache))
|
||
|
(def url "http://ws.audioscrobbler.com/2.0/?method=artist.gettoptracks&artist=bon%20jovi&api_key=23caa86333d2cb2055fa82129802780a&format=json")
|
||
|
(println (get-file-content cache url))
|
||
|
|
||
|
)
|