Contenu connexe Similaire à InterCon 2016 - Performance, anti-patterns e stacks para desenvolvimento ágil (20) InterCon 2016 - Performance, anti-patterns e stacks para desenvolvimento ágil12. #!/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
37. .
!"" _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
# # !"" pool_management
# # # !"" supervisor.ex
# # # $"" worker.ex
# # $"" workflow.ex
# !"" ex_manga_downloadr.ex
# $"" pool_management.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
38. mix.exsdefmodule ExMangaDownloadr.Mixfile do
use Mix.Project
def project do
[app: :ex_manga_downloadr,
version: "1.0.1",
elixir: "~> 1.1",
build_embedded: Mix.env == :prod,
start_permanent: Mix.env == :prod,
escript: [main_module: ExMangaDownloadr.CLI],
deps: deps]
end
# Configuration for the OTP application
#
# Type "mix help compile.app" for more information
def application do
[applications: [:logger, :httpotion, :porcelain],
mod: {PoolManagement, []}]
end
defp deps do
[
{:ibrowse, "~> 4.2.2"},
{:httpotion, "~> 3.0.0"},
{:floki, "~> 0.9.0"},
{:porcelain, "~> 2.0.1"},
{:poolboy, "~> 1.5.1"},
{:mock, "~> 0.1.3", only: :test}
]
end
end
PoolManagement
39. PoolManagement
.
!"" _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
# # !"" pool_management
# # # !"" supervisor.ex
# # # $"" worker.ex
# # $"" workflow.ex
# !"" ex_manga_downloadr.ex
# $"" pool_management.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
pool_management.ex
40. .
!"" _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
# # !"" pool_management
# # # !"" supervisor.ex
# # # $"" worker.ex
# # $"" workflow.ex
# !"" ex_manga_downloadr.ex
# $"" pool_management.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
pool_management.ex
42. Supervisor
.
!"" _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
# # !"" pool_management
# # # !"" supervisor.ex
# # # $"" worker.ex
# # $"" workflow.ex
# !"" ex_manga_downloadr.ex
# $"" pool_management.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
supervisor.ex
43. .
!"" _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
# # !"" pool_management
# # # !"" supervisor.ex
# # # $"" worker.ex
# # $"" workflow.ex
# !"" ex_manga_downloadr.ex
# $"" pool_management.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
supervisor.ex
44. supervisor.exdefmodule PoolManagement.Supervisor do
use Supervisor
def start_link do
Supervisor.start_link(__MODULE__, [])
end
def init([]) do
pool_size = System.get_env("POOL_SIZE") || "50"
pool_options = [
name: {:local, :worker_pool},
worker_module: PoolManagement.Worker,
size: String.to_integer(pool_size),
max_overflow: 0
]
children = [
supervisor(Task.Supervisor, [[name: Fetcher.TaskSupervisor,
strategy: :transient, max_restarts: 10]]),
:poolboy.child_spec(:worker_pool, pool_options, [])
]
supervise(children, strategy: :one_for_one)
end
end
Worker
45. supervisor.exdefmodule PoolManagement.Supervisor do
use Supervisor
def start_link do
Supervisor.start_link(__MODULE__, [])
end
def init([]) do
pool_size = System.get_env("POOL_SIZE") || "50"
pool_options = [
name: {:local, :worker_pool},
worker_module: PoolManagement.Worker,
size: String.to_integer(pool_size),
max_overflow: 0
]
children = [
supervisor(Task.Supervisor, [[name: Fetcher.TaskSupervisor,
strategy: :transient, max_restarts: 10]]),
:poolboy.child_spec(:worker_pool, pool_options, [])
]
supervise(children, strategy: :one_for_one)
end
end
Worker
46. supervisor.exdefmodule PoolManagement.Supervisor do
use Supervisor
def start_link do
Supervisor.start_link(__MODULE__, [])
end
def init([]) do
pool_size = System.get_env("POOL_SIZE") || "50"
pool_options = [
name: {:local, :worker_pool},
worker_module: PoolManagement.Worker,
size: String.to_integer(pool_size),
max_overflow: 0
]
children = [
supervisor(Task.Supervisor, [[name: Fetcher.TaskSupervisor,
strategy: :transient, max_restarts: 10]]),
:poolboy.child_spec(:worker_pool, pool_options, [])
]
supervise(children, strategy: :one_for_one)
end
end
Worker
47. supervisor.exdefmodule PoolManagement.Supervisor do
use Supervisor
def start_link do
Supervisor.start_link(__MODULE__, [])
end
def init([]) do
pool_size = System.get_env("POOL_SIZE") || "50"
pool_options = [
name: {:local, :worker_pool},
worker_module: PoolManagement.Worker,
size: String.to_integer(pool_size),
max_overflow: 0
]
children = [
supervisor(Task.Supervisor, [[name: Fetcher.TaskSupervisor,
strategy: :transient, max_restarts: 10]]),
:poolboy.child_spec(:worker_pool, pool_options, [])
]
supervise(children, strategy: :one_for_one)
end
end
Worker
48. Worker
Supervisor
.
!"" _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
# # !"" pool_management
# # # !"" supervisor.ex
# # # $"" worker.ex
# # $"" workflow.ex
# !"" ex_manga_downloadr.ex
# $"" pool_management.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
worker.ex
49. Supervisor
.
!"" _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
# # !"" pool_management
# # # !"" supervisor.ex
# # # $"" worker.ex
# # $"" workflow.ex
# !"" ex_manga_downloadr.ex
# $"" pool_management.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
worker.ex
50. worker.exdefmodule PoolManagement.Worker do
use GenServer
# Public APIs
def index_page(url, source) do
end
def chapter_page([chapter_link, source]) do
end
def page_image([page_link, source]) do
end
def page_download_image(image_data, directory) do
end
# internal GenServer implementation
def handle_call({:chapter_page, chapter_link, source}, _from, state) do
end
def handle_call({:page_image, page_link, source}, _from, state) do
end
def handle_call({:page_download_image, image_data, directory}, _from, state)
end
## Helper functions
defp manga_source(source, module) do
case source do
"mangafox" -> :"Elixir.ExMangaDownloadr.Mangafox.#{module}"
"mangareader" -> :"Elixir.ExMangaDownloadr.MangaReader.#{module}"
end
end
defp download_image({image_src, image_filename}, directory) do
end
end
51. worker.exdefmodule PoolManagement.Worker do
use GenServer
# Public APIs
def index_page(url, source) do
end
def chapter_page([chapter_link, source]) do
end
def page_image([page_link, source]) do
end
def page_download_image(image_data, directory) do
end
# internal GenServer implementation
def handle_call({:chapter_page, chapter_link, source}, _from, state) do
end
def handle_call({:page_image, page_link, source}, _from, state) do
end
def handle_call({:page_download_image, image_data, directory}, _from, state)
end
## Helper functions
defp manga_source(source, module) do
case source do
"mangafox" -> :"Elixir.ExMangaDownloadr.Mangafox.#{module}"
"mangareader" -> :"Elixir.ExMangaDownloadr.MangaReader.#{module}"
end
end
defp download_image({image_src, image_filename}, directory) do
end
end
52. worker.exdefmodule PoolManagement.Worker do
use GenServer
# Public APIs
def index_page(url, source) do
end
def chapter_page([chapter_link, source]) do
end
def page_image([page_link, source]) do
end
def page_download_image(image_data, directory) do
end
# internal GenServer implementation
def handle_call({:chapter_page, chapter_link, source}, _from, state) do
end
def handle_call({:page_image, page_link, source}, _from, state) do
end
def handle_call({:page_download_image, image_data, directory}, _from, state)
end
## Helper functions
defp manga_source(source, module) do
case source do
"mangafox" -> :"Elixir.ExMangaDownloadr.Mangafox.#{module}"
"mangareader" -> :"Elixir.ExMangaDownloadr.MangaReader.#{module}"
end
end
defp download_image({image_src, image_filename}, directory) do
end
end
53. worker.exdefmodule PoolManagement.Worker do
use GenServer
# Public APIs
def index_page(url, source) do
end
def chapter_page([chapter_link, source]) do
end
def page_image([page_link, source]) do
end
def page_download_image(image_data, directory) do
end
# internal GenServer implementation
def handle_call({:chapter_page, chapter_link, source}, _from, state) do
end
def handle_call({:page_image, page_link, source}, _from, state) do
end
def handle_call({:page_download_image, image_data, directory}, _from, state)
end
## Helper functions
defp manga_source(source, module) do
case source do
"mangafox" -> :"Elixir.ExMangaDownloadr.Mangafox.#{module}"
"mangareader" -> :"Elixir.ExMangaDownloadr.MangaReader.#{module}"
end
end
defp download_image({image_src, image_filename}, directory) do
end
end
54. worker.exdefmodule PoolManagement.Worker do
use GenServer
# Public APIs
def index_page(url, source) do
end
def chapter_page([chapter_link, source]) do
end
def page_image([page_link, source]) do
end
def page_download_image(image_data, directory) do
end
# internal GenServer implementation
def handle_call({:chapter_page, chapter_link, source}, _from, state) do
end
def handle_call({:page_image, page_link, source}, _from, state) do
end
def handle_call({:page_download_image, image_data, directory}, _from, state)
end
## Helper functions
defp manga_source(source, module) do
case source do
"mangafox" -> :"Elixir.ExMangaDownloadr.Mangafox.#{module}"
"mangareader" -> :"Elixir.ExMangaDownloadr.MangaReader.#{module}"
end
end
defp download_image({image_src, image_filename}, directory) do
end
end
55. worker.exdefmodule PoolManagement.Worker do
use GenServer
# Public APIs
def index_page(url, source) do
end
def chapter_page([chapter_link, source]) do
end
def page_image([page_link, source]) do
end
def page_download_image(image_data, directory) do
end
# internal GenServer implementation
def handle_call({:chapter_page, chapter_link, source}, _from, state) do
end
def handle_call({:page_image, page_link, source}, _from, state) do
end
def handle_call({:page_download_image, image_data, directory}, _from, state)
end
## Helper functions
defp manga_source(source, module) do
case source do
"mangafox" -> :"Elixir.ExMangaDownloadr.Mangafox.#{module}"
"mangareader" -> :"Elixir.ExMangaDownloadr.MangaReader.#{module}"
end
end
defp download_image({image_src, image_filename}, directory) do
end
end
56. worker.exdefmodule PoolManagement.Worker do
use GenServer
# Public APIs
def index_page(url, source) do
end
def chapter_page([chapter_link, source]) do
end
def page_image([page_link, source]) do
end
def page_download_image(image_data, directory) do
end
# internal GenServer implementation
def handle_call({:chapter_page, chapter_link, source}, _from, state) do
end
def handle_call({:page_image, page_link, source}, _from, state) do
end
def handle_call({:page_download_image, image_data, directory}, _from, state)
end
## Helper functions
defp manga_source(source, module) do
case source do
"mangafox" -> :"Elixir.ExMangaDownloadr.Mangafox.#{module}"
"mangareader" -> :"Elixir.ExMangaDownloadr.MangaReader.#{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
# # !"" pool_management
# # # !"" supervisor.ex
# # # $"" worker.ex
# # $"" workflow.ex
# !"" ex_manga_downloadr.ex
# $"" pool_management.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
57. worker.exdefmodule PoolManagement.Worker do
use GenServer
# Public APIs
def index_page(url, source) do
end
def chapter_page([chapter_link, source]) do
end
def page_image([page_link, source]) do
end
def page_download_image(image_data, directory) do
end
# internal GenServer implementation
def handle_call({:chapter_page, chapter_link, source}, _from, state) do
end
def handle_call({:page_image, page_link, source}, _from, state) do
end
def handle_call({:page_download_image, image_data, directory}, _from, state)
end
## Helper functions
defp manga_source(source, module) do
case source do
"mangafox" -> :"Elixir.ExMangaDownloadr.Mangafox.#{module}"
"mangareader" -> :"Elixir.ExMangaDownloadr.MangaReader.#{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
# # !"" pool_management
# # # !"" supervisor.ex
# # # $"" worker.ex
# # $"" workflow.ex
# !"" ex_manga_downloadr.ex
# $"" pool_management.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
58. worker.exdefmodule PoolManagement.Worker do
use GenServer
# Public APIs
def index_page(url, source) do
end
def chapter_page([chapter_link, source]) do
end
def page_image([page_link, source]) do
end
def page_download_image(image_data, directory) do
end
# internal GenServer implementation
def handle_call({:chapter_page, chapter_link, source}, _from, state) do
end
def handle_call({:page_image, page_link, source}, _from, state) do
end
def handle_call({:page_download_image, image_data, directory}, _from, state)
end
## Helper functions
defp manga_source(source, module) do
case source do
"mangafox" -> :"Elixir.ExMangaDownloadr.Mangafox.#{module}"
"mangareader" -> :"Elixir.ExMangaDownloadr.MangaReader.#{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
# # !"" pool_management
# # # !"" supervisor.ex
# # # $"" worker.ex
# # $"" workflow.ex
# !"" ex_manga_downloadr.ex
# $"" pool_management.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
59. worker.exdefmodule PoolManagement.Worker do
use GenServer
# Public APIs
def index_page(url, source) do
end
def chapter_page([chapter_link, source]) do
end
def page_image([page_link, source]) do
end
def page_download_image(image_data, directory) do
end
# internal GenServer implementation
def handle_call({:chapter_page, chapter_link, source}, _from, state) do
end
def handle_call({:page_image, page_link, source}, _from, state) do
end
def handle_call({:page_download_image, image_data, directory}, _from, state)
end
## Helper functions
defp manga_source(source, module) do
case source do
"mangafox" -> :"Elixir.ExMangaDownloadr.Mangafox.#{module}"
"mangareader" -> :"Elixir.ExMangaDownloadr.MangaReader.#{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
# # !"" pool_management
# # # !"" supervisor.ex
# # # $"" worker.ex
# # $"" workflow.ex
# !"" ex_manga_downloadr.ex
# $"" pool_management.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
62. defmodule PoolManagement.Worker do
use GenServer
...
def chapter_page([chapter_link, source]) do
Task.Supervisor.async(Fetcher.TaskSupervisor, fn ->
:poolboy.transaction :worker_pool, fn(server) ->
GenServer.call(server, {:chapter_page, chapter_link, source},
@genserver_call_timeout)
end, @task_async_timeout
end)
end
...
def handle_call({:chapter_page, chapter_link, source}, _from, state) do
links = source
|> manga_source("ChapterPage")
|> apply(:pages, [chapter_link])
{:reply, links, state}
end
...
defp manga_source(source, module) do
case source do
"mangareader" -> :"Elixir.ExMangaDownloadr.MangaReader.#{module}"
"mangafox" -> :"Elixir.ExMangaDownloadr.Mangafox.#{module}"
end
end
end
ChapterPage
63. defmodule PoolManagement.Worker do
use GenServer
...
def chapter_page([chapter_link, source]) do
Task.Supervisor.async(Fetcher.TaskSupervisor, fn ->
:poolboy.transaction :worker_pool, fn(server) ->
GenServer.call(server, {:chapter_page, chapter_link, source},
@genserver_call_timeout)
end, @task_async_timeout
end)
end
...
def handle_call({:chapter_page, chapter_link, source}, _from, state) do
links = source
|> manga_source("ChapterPage")
|> apply(:pages, [chapter_link])
{:reply, links, state}
end
...
defp manga_source(source, module) do
case source do
"mangareader" -> :"Elixir.ExMangaDownloadr.MangaReader.#{module}"
"mangafox" -> :"Elixir.ExMangaDownloadr.Mangafox.#{module}"
end
end
end
ChapterPage
64. defmodule PoolManagement.Worker do
use GenServer
...
def chapter_page([chapter_link, source]) do
Task.Supervisor.async(Fetcher.TaskSupervisor, fn ->
:poolboy.transaction :worker_pool, fn(server) ->
GenServer.call(server, {:chapter_page, chapter_link, source},
@genserver_call_timeout)
end, @task_async_timeout
end)
end
...
def handle_call({:chapter_page, chapter_link, source}, _from, state) do
links = source
|> manga_source("ChapterPage")
|> apply(:pages, [chapter_link])
{:reply, links, state}
end
...
defp manga_source(source, module) do
case source do
"mangareader" -> :"Elixir.ExMangaDownloadr.MangaReader.#{module}"
"mangafox" -> :"Elixir.ExMangaDownloadr.Mangafox.#{module}"
end
end
end
ChapterPage
65. defmodule PoolManagement.Worker do
use GenServer
...
def chapter_page([chapter_link, source]) do
Task.Supervisor.async(Fetcher.TaskSupervisor, fn ->
:poolboy.transaction :worker_pool, fn(server) ->
GenServer.call(server, {:chapter_page, chapter_link, source},
@genserver_call_timeout)
end, @task_async_timeout
end)
end
...
def handle_call({:chapter_page, chapter_link, source}, _from, state) do
links = source
|> manga_source("ChapterPage")
|> apply(:pages, [chapter_link])
{:reply, links, state}
end
...
defp manga_source(source, module) do
case source do
"mangareader" -> :"Elixir.ExMangaDownloadr.MangaReader.#{module}"
"mangafox" -> :"Elixir.ExMangaDownloadr.Mangafox.#{module}"
end
end
end
ChapterPage
66. defmodule PoolManagement.Worker do
use GenServer
...
def chapter_page([chapter_link, source]) do
Task.Supervisor.async(Fetcher.TaskSupervisor, fn ->
:poolboy.transaction :worker_pool, fn(server) ->
GenServer.call(server, {:chapter_page, chapter_link, source},
@genserver_call_timeout)
end, @task_async_timeout
end)
end
...
def handle_call({:chapter_page, chapter_link, source}, _from, state) do
links = source
|> manga_source("ChapterPage")
|> apply(:pages, [chapter_link])
{:reply, links, state}
end
...
defp manga_source(source, module) do
case source do
"mangareader" -> :"Elixir.ExMangaDownloadr.MangaReader.#{module}"
"mangafox" -> :"Elixir.ExMangaDownloadr.Mangafox.#{module}"
end
end
end
ChapterPage
68. 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
# # !"" pool_management
# # # !"" supervisor.ex
# # # $"" worker.ex
# # $"" workflow.ex
# !"" ex_manga_downloadr.ex
# $"" pool_management.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
70. Workflow
.
!"" _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
# # !"" pool_management
# # # !"" supervisor.ex
# # # $"" worker.ex
# # $"" workflow.ex
# !"" ex_manga_downloadr.ex
# $"" pool_management.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
71. workflow.exdefmodule ExMangaDownloadr.Workflow do
alias PoolManagement.Worker
require Logger
def chapters({url, source}) do
end
def pages({chapter_list, source}) do
pages_list = chapter_list
|> Enum.map(&Worker.chapter_page([&1, source]))
|> Enum.map(&Task.await(&1, @await_timeout_ms))
|> Enum.reduce([], fn {:ok, list}, acc -> acc ++ list end)
{pages_list, source}
end
def images_sources({pages_list, source}) do
end
def process_downloads(images_list, directory) do
end
def optimize_images(directory) do
Porcelain.shell("mogrify -resize #{@image_dimensions} #{directory}/*.jpg")
directory
end
def compile_pdfs(directory, manga_name) do
end
end
72. workflow.exdefmodule ExMangaDownloadr.Workflow do
alias PoolManagement.Worker
require Logger
def chapters({url, source}) do
end
def pages({chapter_list, source}) do
pages_list = chapter_list
|> Enum.map(&Worker.chapter_page([&1, source]))
|> Enum.map(&Task.await(&1, @await_timeout_ms))
|> Enum.reduce([], fn {:ok, list}, acc -> acc ++ list end)
{pages_list, source}
end
def images_sources({pages_list, source}) do
end
def process_downloads(images_list, directory) do
end
def optimize_images(directory) do
Porcelain.shell("mogrify -resize #{@image_dimensions} #{directory}/*.jpg")
directory
end
def compile_pdfs(directory, manga_name) do
end
end
76. .
!"" _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
# # !"" pool_management
# # # !"" supervisor.ex
# # # $"" worker.ex
# # $"" workflow.ex
# !"" ex_manga_downloadr.ex
# $"" pool_management.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
77. .
!"" _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
# # !"" pool_management
# # # !"" supervisor.ex
# # # $"" worker.ex
# # $"" workflow.ex
# !"" ex_manga_downloadr.ex
# $"" pool_management.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. .
!"" _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
# # !"" pool_management
# # # !"" supervisor.ex
# # # $"" worker.ex
# # $"" workflow.ex
# !"" ex_manga_downloadr.ex
# $"" pool_management.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
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
107. .
!"" 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