在 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")
我正在尝试以编程方式从 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")