はじめに
- @mine820 さんの【小ネタ】さっそく、ジブリの画像をダウンロードするを拝見しまして、私はElixirでやってみました
0. プロジェクトの作成
$ mix new ghibli_download
$ cd ghibli_download
1. HTTPoisonの導入
mix.exs
defp deps do
[
{:httpoison, "~> 1.6"}
]
end
$ mix deps.get
- 依存関係の解決
2. ソースコードを書く
lib/ghibli_download.ex
defmodule GhibliDownload do
@works ~W{marnie kaguyahime kazetachinu kokurikozaka karigurashi ponyo ged chihiro}
@url_base "http://www.ghibli.jp/gallery"
@ext ".jpg"
@local_base "#{System.user_home()}/memo/ghibli"
def run do
@works
|> Enum.flat_map(&urls(&1, 50))
|> Enum.map(fn {url, file_name} ->
IO.puts(url)
download(url, file_name)
Process.sleep(1000 * 20)
end)
end
defp urls(work, num) do
1..num
|> Enum.map(&{"#{@url_base}/#{file_name(work, &1)}", file_name(work, &1)})
end
defp file_name(work, num) do
"#{work}#{Integer.to_string(num) |> String.pad_leading(3, "0")}#{@ext}"
end
defp download(url, file_name) do
HTTPoison.get!(url)
|> Map.get(:body)
|> (fn content -> File.write("#{@local_base}/#{file_name}", content) end).()
end
end
- 1を"001"にするのってどうやってやるのだろうか? はIn Elixir, how do you format numbers with string interpolationを参考にしました
- String.pad_leading/3
3. 実行
$ iex -S mix
iex> GhibliDownload.run
- 息継ぎをいれたので2時間半くらい放っておけば終わっていることでしょう