Mais conteúdo relacionado Semelhante a A Journey through New Languages - Rancho Dev 2017 (20) A Journey through New Languages - Rancho Dev 201717. #!/usr/bin/env ruby
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
require 'optparse'
options = { test: false }
option_parser = OptionParser.new do |opts|
opts.banner = "Usage: manga-downloadr [options]"
opts.on("-t", "--test", "Test routine") do |t|
options[:url] = "http://www.mangareader.net/onepunch-man"
options[:name] = "one-punch-man"
options[:directory] = "/tmp/manga-downloadr/one-punch-man"
options[:test] = true
end
opts.on("-u URL", "--url URL",
"Full MangaReader.net manga homepage URL - required") do |v|
options[:url] = v
end
opts.on("-n NAME", "--name NAME",
"slug to be used for the sub-folder to store all manga files - required") do |n|
options[:name] = n
end
opts.on("-d DIRECTORY", "--directory DIRECTORY",
"main folder where all mangas will be stored - required") do |d|
options[:directory] = d
end
opts.on("-h", "--help", "Show this message") do
puts opts
exit
end
end
45. .
!"" _build
# $"" ...
!"" config
# $"" config.exs
!"" deps
# !"" ...
!"" ex_manga_downloadr
!"" lib
# !"" ex_manga_downloadr
# # !"" cli.ex
# # !"" mangafox
# # # !"" chapter_page.ex
# # # !"" index_page.ex
# # # $"" page.ex
# # !"" mangareader
# # # !"" chapter_page.ex
# # # !"" index_page.ex
# # # $"" page.ex
# # !"" manga_wrapper.ex
# # $"" workflow.ex
# $"" ex_manga_downloadr.ex
!"" mix.exs
!"" mix.lock
!"" README.md
$"" test
!"" ex_manga_downloadr
# !"" mangafox_test.exs
# $"" mangareader_test.exs
!"" ex_manga_downloadr_test.exs
$"" test_helper.exs
61 directories, 281 files
mix.exs
46. mix.exsdefmodule ExMangaDownloadr.Mixfile do
use Mix.Project
def project do
[app: :ex_manga_downloadr,
version: "1.0.2",
elixir: "~> 1.4",
build_embedded: Mix.env == :prod,
start_permanent: Mix.env == :prod,
escript: [main_module: ExMangaDownloadr.CLI],
deps: deps()]
end
def application do
[applications: [:logger, :httpoison, :porcelain, :observer]]
end
defp deps do
[
{:httpoison, "~> 0.11"},
{:floki, "~> 0.17"},
{:porcelain, "~> 2.0.3"},
{:mock, "~> 0.2", only: :test}
]
end
end
Mixfile
47. MixfilePoolManagement
.
!"" _build
# $"" ...
!"" config
# $"" config.exs
!"" deps
# !"" ...
!"" ex_manga_downloadr
!"" lib
# !"" ex_manga_downloadr
# # !"" cli.ex
# # !"" mangafox
# # # !"" chapter_page.ex
# # # !"" index_page.ex
# # # $"" page.ex
# # !"" mangareader
# # # !"" chapter_page.ex
# # # !"" index_page.ex
# # # $"" page.ex
# # !"" manga_wrapper.ex
# # $"" workflow.ex
# $"" ex_manga_downloadr.ex
!"" mix.exs
!"" mix.lock
!"" README.md
$"" test
!"" ex_manga_downloadr
# !"" mangafox_test.exs
# $"" mangareader_test.exs
!"" ex_manga_downloadr_test.exs
$"" test_helper.exs
61 directories, 281 files
workflow.ex
48. Mixfile
.
!"" _build
# $"" ...
!"" config
# $"" config.exs
!"" deps
# !"" ...
!"" ex_manga_downloadr
!"" lib
# !"" ex_manga_downloadr
# # !"" cli.ex
# # !"" mangafox
# # # !"" chapter_page.ex
# # # !"" index_page.ex
# # # $"" page.ex
# # !"" mangareader
# # # !"" chapter_page.ex
# # # !"" index_page.ex
# # # $"" page.ex
# # !"" manga_wrapper.ex
# # $"" workflow.ex
# $"" ex_manga_downloadr.ex
!"" mix.exs
!"" mix.lock
!"" README.md
$"" test
!"" ex_manga_downloadr
# !"" mangafox_test.exs
# $"" mangareader_test.exs
!"" ex_manga_downloadr_test.exs
$"" test_helper.exs
61 directories, 281 files
workflow.ex
49. workflow.exdefmodule ExMangaDownloadr.Workflow do
def determine_source(url) do
end
def chapters({url, source}) do
{:ok, {_manga_title, chapter_list}} = MangaWrapper.index_page(url, source)
{chapter_list, source}
end
def pages({chapter_list, source}) do
pages_list = chapter_list
|> Task.async_stream(MangaWrapper, :chapter_page, [source], max_concurrency: @max_demand)
|> Enum.to_list()
|> Enum.reduce([], fn {:ok, {:ok, list}}, acc -> acc ++ list end)
{pages_list, source}
end
def images_sources({pages_list, source}) do
pages_list
|> Task.async_stream(MangaWrapper, :page_image, [source], max_concurrency: @max_demand)
|> Enum.to_list()
|> Enum.map(fn {:ok, {:ok, image}} -> image end)
end
def process_downloads(images_list, directory) do
images_list
|> Task.async_stream(MangaWrapper, :page_download_image, [directory],
max_concurrency: @max_demand / 2, timeout: @download_timeout)
|> Enum.to_list()
directory
end
def optimize_images(directory) do … end
def compile_pdfs(directory, manga_name) do … end
defp compile_volume(manga_name, directory, {chunk, index}) do … end
defp prepare_volume(manga_name, directory, chunk, index) do … end
defp chunk(collection, default_size) do … end
end
:chapter_page
50. workflow.exdefmodule ExMangaDownloadr.Workflow do
def determine_source(url) do
end
def chapters({url, source}) do
{:ok, {_manga_title, chapter_list}} = MangaWrapper.index_page(url, source)
{chapter_list, source}
end
def pages({chapter_list, source}) do
pages_list = chapter_list
|> Task.async_stream(MangaWrapper, :chapter_page, [source], max_concurrency: @max_demand)
|> Enum.to_list()
|> Enum.reduce([], fn {:ok, {:ok, list}}, acc -> acc ++ list end)
{pages_list, source}
end
def images_sources({pages_list, source}) do
pages_list
|> Task.async_stream(MangaWrapper, :page_image, [source], max_concurrency: @max_demand)
|> Enum.to_list()
|> Enum.map(fn {:ok, {:ok, image}} -> image end)
end
def process_downloads(images_list, directory) do
images_list
|> Task.async_stream(MangaWrapper, :page_download_image, [directory],
max_concurrency: @max_demand / 2, timeout: @download_timeout)
|> Enum.to_list()
directory
end
def optimize_images(directory) do … end
def compile_pdfs(directory, manga_name) do … end
defp compile_volume(manga_name, directory, {chunk, index}) do … end
defp prepare_volume(manga_name, directory, chunk, index) do … end
defp chunk(collection, default_size) do … end
end
:chapter_page
51. workflow.exdefmodule ExMangaDownloadr.Workflow do
def determine_source(url) do
end
def chapters({url, source}) do
{:ok, {_manga_title, chapter_list}} = MangaWrapper.index_page(url, source)
{chapter_list, source}
end
def pages({chapter_list, source}) do
pages_list = chapter_list
|> Task.async_stream(MangaWrapper, :chapter_page, [source], max_concurrency: @max_demand)
|> Enum.to_list()
|> Enum.reduce([], fn {:ok, {:ok, list}}, acc -> acc ++ list end)
{pages_list, source}
end
def images_sources({pages_list, source}) do
pages_list
|> Task.async_stream(MangaWrapper, :page_image, [source], max_concurrency: @max_demand)
|> Enum.to_list()
|> Enum.map(fn {:ok, {:ok, image}} -> image end)
end
def process_downloads(images_list, directory) do
images_list
|> Task.async_stream(MangaWrapper, :page_download_image, [directory],
max_concurrency: @max_demand / 2, timeout: @download_timeout)
|> Enum.to_list()
directory
end
def optimize_images(directory) do … end
def compile_pdfs(directory, manga_name) do … end
defp compile_volume(manga_name, directory, {chunk, index}) do … end
defp prepare_volume(manga_name, directory, chunk, index) do … end
defp chunk(collection, default_size) do … end
end
:chapter_page
52. workflow.exdefmodule ExMangaDownloadr.Workflow do
def determine_source(url) do
end
def chapters({url, source}) do
{:ok, {_manga_title, chapter_list}} = MangaWrapper.index_page(url, source)
{chapter_list, source}
end
def pages({chapter_list, source}) do
pages_list = chapter_list
|> Task.async_stream(MangaWrapper, :chapter_page, [source], max_concurrency: @max_demand)
|> Enum.to_list()
|> Enum.reduce([], fn {:ok, {:ok, list}}, acc -> acc ++ list end)
{pages_list, source}
end
def images_sources({pages_list, source}) do
pages_list
|> Task.async_stream(MangaWrapper, :page_image, [source], max_concurrency: @max_demand)
|> Enum.to_list()
|> Enum.map(fn {:ok, {:ok, image}} -> image end)
end
def process_downloads(images_list, directory) do
images_list
|> Task.async_stream(MangaWrapper, :page_download_image, [directory],
max_concurrency: @max_demand / 2, timeout: @download_timeout)
|> Enum.to_list()
directory
end
def optimize_images(directory) do … end
def compile_pdfs(directory, manga_name) do … end
defp compile_volume(manga_name, directory, {chunk, index}) do … end
defp prepare_volume(manga_name, directory, chunk, index) do … end
defp chunk(collection, default_size) do … end
end
:chapter_page
55. workflow.exdefmodule ExMangaDownloadr.Workflow do
def determine_source(url) do
end
def chapters({url, source}) do
{:ok, {_manga_title, chapter_list}} = MangaWrapper.index_page(url, source)
{chapter_list, source}
end
def pages({chapter_list, source}) do
pages_list = chapter_list
|> Task.async_stream(MangaWrapper, :chapter_page, [source], max_concurrency: @max_demand)
|> Enum.to_list()
|> Enum.reduce([], fn {:ok, {:ok, list}}, acc -> acc ++ list end)
{pages_list, source}
end
def images_sources({pages_list, source}) do
pages_list
|> Task.async_stream(MangaWrapper, :page_image, [source], max_concurrency: @max_demand)
|> Enum.to_list()
|> Enum.map(fn {:ok, {:ok, image}} -> image end)
end
def process_downloads(images_list, directory) do
images_list
|> Task.async_stream(MangaWrapper, :page_download_image, [directory],
max_concurrency: @max_demand / 2, timeout: @download_timeout)
|> Enum.to_list()
directory
end
def optimize_images(directory) do … end
def compile_pdfs(directory, manga_name) do … end
defp compile_volume(manga_name, directory, {chunk, index}) do … end
defp prepare_volume(manga_name, directory, chunk, index) do … end
defp chunk(collection, default_size) do … end
end
:chapter_page
56. manga_wrapper.exdefmodule MangaWrapper do
require Logger
def index_page(url, source) do
source
|> manga_source("IndexPage")
|> apply(:chapters, [url])
end
def chapter_page(chapter_link, source) do
source
|> manga_source("ChapterPage")
|> apply(:pages, [chapter_link])
end
def page_image(page_link, source) do
source
|> manga_source("Page")
|> apply(:image, [page_link])
end
def page_download_image(image_data, directory) do
download_image(image_data, directory)
end
defp manga_source(source, module) do
case source do
"mangareader" -> :"Elixir.ExMangaDownloadr.MangaReader.#{module}"
"mangafox" -> :"Elixir.ExMangaDownloadr.Mangafox.#{module}"
end
end
defp download_image({image_src, image_filename}, directory) do
end
end
:chapter_page
ChapterPage
57. manga_wrapper.exdefmodule MangaWrapper do
require Logger
def index_page(url, source) do
source
|> manga_source("IndexPage")
|> apply(:chapters, [url])
end
def chapter_page(chapter_link, source) do
source
|> manga_source("ChapterPage")
|> apply(:pages, [chapter_link])
end
def page_image(page_link, source) do
source
|> manga_source("Page")
|> apply(:image, [page_link])
end
def page_download_image(image_data, directory) do
download_image(image_data, directory)
end
defp manga_source(source, module) do
case source do
"mangareader" -> :"Elixir.ExMangaDownloadr.MangaReader.#{module}"
"mangafox" -> :"Elixir.ExMangaDownloadr.Mangafox.#{module}"
end
end
defp download_image({image_src, image_filename}, directory) do
end
end
.
!"" _build
# $"" ...
!"" config
# $"" config.exs
!"" deps
# !"" ...
!"" ex_manga_downloadr
!"" lib
# !"" ex_manga_downloadr
# # !"" cli.ex
# # !"" mangafox
# # # !"" chapter_page.ex
# # # !"" index_page.ex
# # # $"" page.ex
# # !"" mangareader
# # # !"" chapter_page.ex
# # # !"" index_page.ex
# # # $"" page.ex
# # !"" manga_wrapper.ex
# # $"" workflow.ex
# $"" ex_manga_downloadr.ex
!"" mix.exs
!"" mix.lock
!"" README.md
$"" test
!"" ex_manga_downloadr
# !"" mangafox_test.exs
# $"" mangareader_test.exs
!"" ex_manga_downloadr_test.exs
$"" test_helper.exs
61 directories, 281 files
:chapter_page
ChapterPage
58. manga_wrapper.exdefmodule MangaWrapper do
require Logger
def index_page(url, source) do
source
|> manga_source("IndexPage")
|> apply(:chapters, [url])
end
def chapter_page(chapter_link, source) do
source
|> manga_source("ChapterPage")
|> apply(:pages, [chapter_link])
end
def page_image(page_link, source) do
source
|> manga_source("Page")
|> apply(:image, [page_link])
end
def page_download_image(image_data, directory) do
download_image(image_data, directory)
end
defp manga_source(source, module) do
case source do
"mangareader" -> :"Elixir.ExMangaDownloadr.MangaReader.#{module}"
"mangafox" -> :"Elixir.ExMangaDownloadr.Mangafox.#{module}"
end
end
defp download_image({image_src, image_filename}, directory) do
end
end
.
!"" _build
# $"" ...
!"" config
# $"" config.exs
!"" deps
# !"" ...
!"" ex_manga_downloadr
!"" lib
# !"" ex_manga_downloadr
# # !"" cli.ex
# # !"" mangafox
# # # !"" chapter_page.ex
# # # !"" index_page.ex
# # # $"" page.ex
# # !"" mangareader
# # # !"" chapter_page.ex
# # # !"" index_page.ex
# # # $"" page.ex
# # !"" manga_wrapper.ex
# # $"" workflow.ex
# $"" ex_manga_downloadr.ex
!"" mix.exs
!"" mix.lock
!"" README.md
$"" test
!"" ex_manga_downloadr
# !"" mangafox_test.exs
# $"" mangareader_test.exs
!"" ex_manga_downloadr_test.exs
$"" test_helper.exs
61 directories, 281 files
:chapter_page
ChapterPage
59. manga_wrapper.exdefmodule MangaWrapper do
require Logger
def index_page(url, source) do
source
|> manga_source("IndexPage")
|> apply(:chapters, [url])
end
def chapter_page(chapter_link, source) do
source
|> manga_source("ChapterPage")
|> apply(:pages, [chapter_link])
end
def page_image(page_link, source) do
source
|> manga_source("Page")
|> apply(:image, [page_link])
end
def page_download_image(image_data, directory) do
download_image(image_data, directory)
end
defp manga_source(source, module) do
case source do
"mangareader" -> :"Elixir.ExMangaDownloadr.MangaReader.#{module}"
"mangafox" -> :"Elixir.ExMangaDownloadr.Mangafox.#{module}"
end
end
defp download_image({image_src, image_filename}, directory) do
end
end
.
!"" _build
# $"" ...
!"" config
# $"" config.exs
!"" deps
# !"" ...
!"" ex_manga_downloadr
!"" lib
# !"" ex_manga_downloadr
# # !"" cli.ex
# # !"" mangafox
# # # !"" chapter_page.ex
# # # !"" index_page.ex
# # # $"" page.ex
# # !"" mangareader
# # # !"" chapter_page.ex
# # # !"" index_page.ex
# # # $"" page.ex
# # !"" manga_wrapper.ex
# # $"" workflow.ex
# $"" ex_manga_downloadr.ex
!"" mix.exs
!"" mix.lock
!"" README.md
$"" test
!"" ex_manga_downloadr
# !"" mangafox_test.exs
# $"" mangareader_test.exs
!"" ex_manga_downloadr_test.exs
$"" test_helper.exs
61 directories, 281 files
:chapter_page
ChapterPage
60. manga_wrapper.exdefmodule MangaWrapper do
require Logger
def index_page(url, source) do
source
|> manga_source("IndexPage")
|> apply(:chapters, [url])
end
def chapter_page(chapter_link, source) do
source
|> manga_source("ChapterPage")
|> apply(:pages, [chapter_link])
end
def page_image(page_link, source) do
source
|> manga_source("Page")
|> apply(:image, [page_link])
end
def page_download_image(image_data, directory) do
download_image(image_data, directory)
end
defp manga_source(source, module) do
case source do
"mangareader" -> :"Elixir.ExMangaDownloadr.MangaReader.#{module}"
"mangafox" -> :"Elixir.ExMangaDownloadr.Mangafox.#{module}"
end
end
defp download_image({image_src, image_filename}, directory) do
end
end
.
!"" _build
# $"" ...
!"" config
# $"" config.exs
!"" deps
# !"" ...
!"" ex_manga_downloadr
!"" lib
# !"" ex_manga_downloadr
# # !"" cli.ex
# # !"" mangafox
# # # !"" chapter_page.ex
# # # !"" index_page.ex
# # # $"" page.ex
# # !"" mangareader
# # # !"" chapter_page.ex
# # # !"" index_page.ex
# # # $"" page.ex
# # !"" manga_wrapper.ex
# # $"" workflow.ex
# $"" ex_manga_downloadr.ex
!"" mix.exs
!"" mix.lock
!"" README.md
$"" test
!"" ex_manga_downloadr
# !"" mangafox_test.exs
# $"" mangareader_test.exs
!"" ex_manga_downloadr_test.exs
$"" test_helper.exs
61 directories, 281 files
:chapter_page
ChapterPage
62. ChapterPage
.
!"" _build
# $"" ...
!"" config
# $"" config.exs
!"" deps
# !"" ...
!"" ex_manga_downloadr
!"" lib
# !"" ex_manga_downloadr
# # !"" cli.ex
# # !"" mangafox
# # # !"" chapter_page.ex
# # # !"" index_page.ex
# # # $"" page.ex
# # !"" mangareader
# # # !"" chapter_page.ex
# # # !"" index_page.ex
# # # $"" page.ex
# # !"" manga_wrapper.ex
# # $"" workflow.ex
# $"" ex_manga_downloadr.ex
!"" mix.exs
!"" mix.lock
!"" README.md
$"" test
!"" ex_manga_downloadr
# !"" mangafox_test.exs
# $"" mangareader_test.exs
!"" ex_manga_downloadr_test.exs
$"" test_helper.exs
61 directories, 281 files
cli.ex
72. .
!"" _build
# $"" ...
!"" config
# $"" config.exs
!"" deps
# !"" ...
!"" ex_manga_downloadr
!"" lib
# !"" ex_manga_downloadr
# # !"" cli.ex
# # !"" mangafox
# # # !"" chapter_page.ex
# # # !"" index_page.ex
# # # $"" page.ex
# # !"" mangareader
# # # !"" chapter_page.ex
# # # !"" index_page.ex
# # # $"" page.ex
# # !"" manga_wrapper.ex
# # $"" workflow.ex
# $"" ex_manga_downloadr.ex
!"" mix.exs
!"" mix.lock
!"" README.md
$"" test
!"" ex_manga_downloadr
# !"" mangafox_test.exs
# $"" mangareader_test.exs
!"" ex_manga_downloadr_test.exs
$"" test_helper.exs
61 directories, 281 files
.
!"" cr_manga_downloadr
!"" libs
# !"" ...
!"" LICENSE
!"" README.md
!"" shard.lock
!"" shard.yml
!"" spec
# !"" cr_manga_downloadr
# # !"" chapters_spec.cr
# # !"" concurrency_spec.cr
# # !"" image_downloader_spec.cr
# # !"" page_image_spec.cr
# # $"" pages_spec.cr
# !"" fixtures
# # !"" ...
# $"" spec_helper.cr
$"" src
!"" cr_manga_downloadr
# !"" chapters.cr
# !"" concurrency.cr
# !"" downloadr_client.cr
# !"" image_downloader.cr
# !"" page_image.cr
# !"" pages.cr
# !"" records.cr
# !"" version.cr
# $"" workflow.cr
$"" cr_manga_downloadr.cr
73. .
!"" _build
# $"" ...
!"" config
# $"" config.exs
!"" deps
# !"" ...
!"" ex_manga_downloadr
!"" lib
# !"" ex_manga_downloadr
# # !"" cli.ex
# # !"" mangafox
# # # !"" chapter_page.ex
# # # !"" index_page.ex
# # # $"" page.ex
# # !"" mangareader
# # # !"" chapter_page.ex
# # # !"" index_page.ex
# # # $"" page.ex
# # !"" manga_wrapper.ex
# # $"" workflow.ex
# $"" ex_manga_downloadr.ex
!"" mix.exs
!"" mix.lock
!"" README.md
$"" test
!"" ex_manga_downloadr
# !"" mangafox_test.exs
# $"" mangareader_test.exs
!"" ex_manga_downloadr_test.exs
$"" test_helper.exs
61 directories, 281 files
.
!"" cr_manga_downloadr
!"" libs
# !"" ...
!"" LICENSE
!"" README.md
!"" shard.lock
!"" shard.yml
!"" spec
# !"" cr_manga_downloadr
# # !"" chapters_spec.cr
# # !"" concurrency_spec.cr
# # !"" image_downloader_spec.cr
# # !"" page_image_spec.cr
# # $"" pages_spec.cr
# !"" fixtures
# # !"" ...
# $"" spec_helper.cr
$"" src
!"" cr_manga_downloadr
# !"" chapters.cr
# !"" concurrency.cr
# !"" downloadr_client.cr
# !"" image_downloader.cr
# !"" page_image.cr
# !"" pages.cr
# !"" records.cr
# !"" version.cr
# $"" workflow.cr
$"" cr_manga_downloadr.cr
103. .
!"" _build
# $"" ...
!"" config
# $"" config.exs
!"" deps
# !"" ...
!"" ex_manga_downloadr
!"" lib
# !"" ex_manga_downloadr
# # !"" cli.ex
# # !"" mangafox
# # # !"" chapter_page.ex
# # # !"" index_page.ex
# # # $"" page.ex
# # !"" mangareader
# # # !"" chapter_page.ex
# # # !"" index_page.ex
# # # $"" page.ex
# # !"" manga_wrapper.ex
# # $"" workflow.ex
# $"" ex_manga_downloadr.ex
!"" mix.exs
!"" mix.lock
!"" README.md
$"" test
!"" ex_manga_downloadr
# !"" mangafox_test.exs
# $"" mangareader_test.exs
!"" ex_manga_downloadr_test.exs
$"" test_helper.exs
61 directories, 281 files
.
!"" cr_manga_downloadr
!"" libs
# !"" ...
!"" LICENSE
!"" README.md
!"" shard.lock
!"" shard.yml
!"" spec
# !"" cr_manga_downloadr
# # !"" chapters_spec.cr
# # !"" concurrency_spec.cr
# # !"" image_downloader_spec.cr
# # !"" page_image_spec.cr
# # $"" pages_spec.cr
# !"" fixtures
# # !"" ...
# $"" spec_helper.cr
$"" src
!"" cr_manga_downloadr
# !"" chapters.cr
# !"" concurrency.cr
# !"" downloadr_client.cr
# !"" image_downloader.cr
# !"" page_image.cr
# !"" pages.cr
# !"" records.cr
# !"" version.cr
# $"" workflow.cr
$"" cr_manga_downloadr.cr
104. .
!"" cr_manga_downloadr
!"" libs
# !"" ...
!"" LICENSE
!"" README.md
!"" shard.lock
!"" shard.yml
!"" spec
# !"" cr_manga_downloadr
# # !"" chapters_spec.cr
# # !"" concurrency_spec.cr
# # !"" image_downloader_spec.cr
# # !"" page_image_spec.cr
# # $"" pages_spec.cr
# !"" fixtures
# # !"" ...
# $"" spec_helper.cr
$"" src
!"" cr_manga_downloadr
# !"" chapters.cr
# !"" concurrency.cr
# !"" downloadr_client.cr
# !"" image_downloader.cr
# !"" page_image.cr
# !"" pages.cr
# !"" records.cr
# !"" version.cr
# $"" workflow.cr
$"" cr_manga_downloadr.cr
.
!"" bin
# $"" manga-downloadr
!"" Gemfile
!"" Gemfile.lock
!"" lib
# !"" manga-downloadr
# # !"" chapters.rb
# # !"" concurrency.rb
# # !"" downloadr_client.rb
# # !"" image_downloader.rb
# # !"" page_image.rb
# # !"" pages.rb
# # !"" records.rb
# # !"" version.rb
# # $"" workflow.rb
# $"" manga-downloadr.rb
!"" LICENSE.txt
!"" manga-downloadr.gemspec
!"" Rakefile
!"" README.md
$"" spec
!"" fixtures
# !"" ...
!"" manga-downloadr
# !"" chapters_spec.rb
# !"" concurrency_spec.rb
# !"" image_downloader_spec.rb
# !"" page_image_spec.rb
# $"" pages_spec.rb
$"" spec_helper.rb
105. .
!"" cr_manga_downloadr
!"" libs
# !"" ...
!"" LICENSE
!"" README.md
!"" shard.lock
!"" shard.yml
!"" spec
# !"" cr_manga_downloadr
# # !"" chapters_spec.cr
# # !"" concurrency_spec.cr
# # !"" image_downloader_spec.cr
# # !"" page_image_spec.cr
# # $"" pages_spec.cr
# !"" fixtures
# # !"" ...
# $"" spec_helper.cr
$"" src
!"" cr_manga_downloadr
# !"" chapters.cr
# !"" concurrency.cr
# !"" downloadr_client.cr
# !"" image_downloader.cr
# !"" page_image.cr
# !"" pages.cr
# !"" records.cr
# !"" version.cr
# $"" workflow.cr
$"" cr_manga_downloadr.cr
.
!"" bin
# $"" manga-downloadr
!"" Gemfile
!"" Gemfile.lock
!"" lib
# !"" manga-downloadr
# # !"" chapters.rb
# # !"" concurrency.rb
# # !"" downloadr_client.rb
# # !"" image_downloader.rb
# # !"" page_image.rb
# # !"" pages.rb
# # !"" records.rb
# # !"" version.rb
# # $"" workflow.rb
# $"" manga-downloadr.rb
!"" LICENSE.txt
!"" manga-downloadr.gemspec
!"" Rakefile
!"" README.md
$"" spec
!"" fixtures
# !"" ...
!"" manga-downloadr
# !"" chapters_spec.rb
# !"" concurrency_spec.rb
# !"" image_downloader_spec.rb
# !"" page_image_spec.rb
# $"" pages_spec.rb
$"" spec_helper.rb
106. .
!"" cr_manga_downloadr
!"" libs
# !"" ...
!"" LICENSE
!"" README.md
!"" shard.lock
!"" shard.yml
!"" spec
# !"" cr_manga_downloadr
# # !"" chapters_spec.cr
# # !"" concurrency_spec.cr
# # !"" image_downloader_spec.cr
# # !"" page_image_spec.cr
# # $"" pages_spec.cr
# !"" fixtures
# # !"" ...
# $"" spec_helper.cr
$"" src
!"" cr_manga_downloadr
# !"" chapters.cr
# !"" concurrency.cr
# !"" downloadr_client.cr
# !"" image_downloader.cr
# !"" page_image.cr
# !"" pages.cr
# !"" records.cr
# !"" version.cr
# $"" workflow.cr
$"" cr_manga_downloadr.cr
.
!"" bin
# $"" manga-downloadr
!"" Gemfile
!"" Gemfile.lock
!"" lib
# !"" manga-downloadr
# # !"" chapters.rb
# # !"" concurrency.rb
# # !"" downloadr_client.rb
# # !"" image_downloader.rb
# # !"" page_image.rb
# # !"" pages.rb
# # !"" records.rb
# # !"" version.rb
# # $"" workflow.rb
# $"" manga-downloadr.rb
!"" LICENSE.txt
!"" manga-downloadr.gemspec
!"" Rakefile
!"" README.md
$"" spec
!"" fixtures
# !"" ...
!"" manga-downloadr
# !"" chapters_spec.rb
# !"" concurrency_spec.rb
# !"" image_downloader_spec.rb
# !"" page_image_spec.rb
# $"" pages_spec.rb
$"" spec_helper.rb
122. Ruby/Typhoeus
(hydra_concurrency = 50)
41% CPU 1:24 min
Elixir 1.4.5
(@max_demand=50)
120% CPU 1:14 min
Crystal 0.23.0
(opt_batch_size = 50)
14% CPU 1:26 min
Ruby 2.4.1
(opt_batch_size = 50)
33% CPU 1:31 min