在 Clojure 中使用 http://foobar.mp3 重定向到 http://fizzbar.mp3

Slurping http://foobar.mp3 that redirects to http://fizzbar.mp3 in Clojure

我正在尝试以编程方式从 this rss feed 下载 mp3 文件。 当我打开 url 例如:http://menlochurch.podbean.com/mf/feed/5gv2gb/170219_jortberg.mp3 它重定向到 url,例如:http://s62.podbean.com/pb/67f34563539acbe87b9566ecc5738d57/58aeff8e/data4/fs145/948579/uploads/170219_jortberg.mp3

如果我 curl 第一个 url 它会下载一个空文件。

如果我 curl -L 第一个 url 它会正确下载文件。

如果我 curl 第二个 url 它会正确下载文件。

如果我 slurp Clojure 中的第一个 url 它会下载一些看起来像 mp3 的东西(很大并且没有清晰的文本)但是无法播放并且与 [=的输出不同=11=].

如果我在 Clojure 中 slurp 第二个 url 它也会下载一些看起来像 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

如你所见,我吞下的东西几乎是我吞下的两倍大url。

我不知道这是怎么回事,我是不是在不恰当的上下文中使用了 slurp?如有任何建议,我们将不胜感激!

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.

虽然无法读取二进制数据,但以下函数将执行类似于 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")