fork download
  1. ;; ダウンローダー本体
  2. (define (downloader fname)
  3. ;; 基本のパスを組み立てる
  4. (let ((p (build-path *base* *sub*)))
  5. ;; 引っ越しデータファイル(fname)を開く
  6. (with-input-from-file fname
  7. (lambda ()
  8. ;; ファイルを一行づつ(read-line)読みながら繰り返し
  9. (let loop ((c (read-line)) (html '()) (p1 p))
  10. ;; 空行の場合例外が投げられるのでキャッチして次の処理へ
  11. (with-handlers ((exn:fail:contract?
  12. (lambda (e) (loop (read-line) html p1))))
  13. ;; ファイル末尾で処理を終了する
  14. (unless (eof-object? c)
  15. ;; 読み込んだ行をコロン(:)で分割
  16. (let ((lst (string-split c ":")))
  17. ;; 先頭(head)と残り全て(tail)へと分ける
  18. (let ((head (string-trim (car lst)))
  19. (tail (string-trim (string-join (cdr lst)))))
  20. (case head
  21. ;; スキップするheadは纏めて、次の処理へ
  22. (("AUTHOR" "PRIMARY CATEGORY" "STATUS" "ALLOW COMMENTS" "CONVERT BREAKS" "-----")
  23. (loop (read-line) html p1))
  24. ;; TITLEはフォルダを作成し次の処理へ
  25. (("TITLE") (let ((p2 (build-path p1 (string-delete cs tail))))
  26. (unless (directory-exists? p2)
  27. (make-directory p2))
  28. (loop (read-line) html p2)))
  29. ;; DATEはフォルダを作成し次の処理へ
  30. (("DATE") (let ((p3 (build-path p1 (string-delete cs tail))))
  31. (unless (directory-exists? p3)
  32. (make-directory p3))
  33. (loop (read-line) html p3)))
  34. ;; BODYは後続(空文字列)だけどhtmlへ積む
  35. (("BODY") (loop (read-line) (cons tail html) p1))
  36. ;; 一つの記事が終了
  37. ;; EyeCatchフォルダへのパスを作成
  38. (("--------") (let ((p4 (build-path p1 "EyeCatch"))
  39. ;; 写真アドレスを取り出してリストへ纏める
  40. (urls
  41. (map cadr
  42. ((sxpath '(// img @ src))
  43. (html->xexp (string-join (reverse html)))))))
  44. ;; EyeCatchフォルダを作成
  45. (unless (directory-exists? p4)
  46. (make-directory p4))
  47. ;; 1枚めの写真をEyeCatchフォルダへダウンロード
  48. (system (car urls) p4)
  49. ;; 残りはそのままダウンロード
  50. (for-each
  51. (lambda (url)
  52. (system (command url p1)))
  53. (cdr urls))
  54. (loop (read-line) '() p)))
  55. ;; 残りはHTML情報なんで一行丸ごとhtmlへと追加する
  56. (else (loop (read-line) (cons c html) p1))))))))))))
  57.  
Success #stdin #stdout 0.53s 83456KB
stdin
Standard input is empty
stdout
Standard output is empty