Slurping http://foobar.mp3, который перенаправляет на http://fizzbar.mp3 в Clojure

Я пытаюсь программно скачать mp3 файлы из этого RSS-канала. Когда я открываю 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 Первый URL-адрес в Clojure загружает что-то, похожее на 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 в неподходящем контексте? Любой совет будет принят во внимание!

2 ответа

Решение

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")

Другие вопросы по тегам