2017-02-23 50 views
2

我試圖以編程方式從this rss feed下載mp3文件。 當我打開一個URL,例如:http://menlochurch.podbean.com/mf/feed/5gv2gb/170219_jortberg.mp3 它重定向到像一個網址:http://s62.podbean.com/pb/67f34563539acbe87b9566ecc5738d57/58aeff8e/data4/fs145/948579/uploads/170219_jortberg.mp3在Clojure中啜泣http://foobar.mp3重定向到http://fizzbar.mp3

如果我curl第一URL它下載一個空文件。

如果我curl -L第一個url正確下載文件。

如果我curl第二個URL它正確地下載文件。

如果我slurp Clojure中的第一個URL下載的東西看起來像一個MP3(很大,沒有清晰的文本),但是不可播放,與curl -L的輸出不一樣。

如果我slurp第二url Clojure中它還會下載東西,看起來像一個MP3(大,也沒有清晰的文字),但無法播放,而不是與從curl -L輸出,並且等同於從輸出前slurp

➜ ~ git:(master) ✗ ls -l *.mp3 -rw-r--r-- 1 adam adam 38038533 Feb 23 08:32 curl-url1.mp3 -rw-r--r-- 1 adam adam 38038533 Feb 23 08:37 curl-url2.mp3 -rw-r--r-- 1 adam adam 0 Feb 23 08:45 curl-without-L.mp3 -rw-r--r-- 1 adam adam 67144297 Feb 23 08:31 slurp-url1.mp3 -rw-r--r-- 1 adam adam 67144297 Feb 23 08:31 slurp-url2.mp3

正如你所看到的一切我啜,幾乎是一樣大的什麼,我捲曲的兩倍。

我不知道該怎麼做,我在不合適的環境下使用slurp?任何意見,將不勝感激!

回答

4

slurp適用於字符串,因此不適用於二進制數據。

user=> (doc slurp) 
------------------------- 
clojure.core/slurp 
([f & opts]) 
    Opens a reader on f and reads all its contents, returning a string. 
    See clojure.java.io/reader for a complete list of supported arguments. 
1

雖然啜二進制數據是不可能的,下面的函數將做同樣的事情到slurp但接受二進制流:

(defn copy-uri-to-file [uri file] (with-open [in (clojure.java.io/input-stream uri) out (clojure.java.io/output-stream file)] (clojure.java.io/copy in out)))

對於這個特殊的例子MP3文件可以下載這樣:

(copy-uri-to-file "http://menlochurch.podbean.com/mf/feed/5gv2gb/170219_jortberg.mp3" "foo.mp3")

+0

信用:http://users.utu.fi/machra/posts/2011-08- 24-2-書籤交易-clojure.html –