• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

camatcode / basenji / c0c3386ac4393a4f105fa48bf7a0a348a4e6caa6

12 Jul 2025 04:02PM UTC coverage: 75.056% (+1.4%) from 73.621%
c0c3386ac4393a4f105fa48bf7a0a348a4e6caa6

Pull #39

github

camatcode
feat: added comic optimizer that makes CBZs
Pull Request #39: WIP: chore: stashing

55 of 59 new or added lines in 5 files covered. (93.22%)

23 existing lines in 6 files now uncovered.

668 of 890 relevant lines covered (75.06%)

566.15 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

95.65
/lib/basenji/reader/process/comic_optimizer.ex
1
defmodule Basenji.Reader.Process.ComicOptimizer do
2
  @moduledoc false
3

4
  import Basenji.Reader
5

6
  def optimize(comic_file_path) do
7
    tmp_dir =
8✔
8
      System.tmp_dir!()
9
      |> Path.join("basenji")
10
      |> Path.join("basenji_optimize_#{System.monotonic_time()}")
8✔
11

12
    :ok = File.mkdir_p!(tmp_dir)
8✔
13

14
    comic_name =
8✔
15
      Path.basename(comic_file_path)
16
      |> Path.rootname()
17
      |> ProperCase.snake_case()
18

19
    images_dir = Path.join(tmp_dir, "#{comic_name}_images")
8✔
20
    :ok = File.mkdir_p!(images_dir)
8✔
21

22
    with {:ok, %{page_count: page_count}} <- info(comic_file_path),
8✔
23
         {:ok, %{entries: entries}} <- read(comic_file_path),
8✔
24
         {:ok, stream} <- stream_pages(comic_file_path, optimize: true) do
8✔
25
      padding = String.length("#{page_count}") - 1
8✔
26

27
      stream
28
      |> Stream.with_index()
29
      |> Enum.each(fn {page, page_idx} ->
8✔
30
        page_bytes = page |> Enum.to_list()
32✔
31
        ext = Enum.at(entries, page_idx) |> Map.get(:file_name) |> Path.extname()
32✔
32

33
        file_name = "#{String.pad_leading("#{page_idx + 1}", padding, "0")}#{ext}"
32✔
34
        :ok = File.write!(Path.join(images_dir, file_name), page_bytes)
32✔
35
      end)
36

37
      optimized_name = "#{comic_name}_optimized.cbz"
8✔
38

39
      response = zip(tmp_dir, "#{comic_name}_images", optimized_name)
8✔
40
      File.rm_rf!(images_dir)
8✔
41
      response
8✔
42
    end
43
  end
44

45
  defp zip(parent_dir, images_dir_name, zip_file_name) do
46
    flags = [
8✔
47
      # Recursive
48
      "-r",
49
      # Maximum compression level
50
      "-9",
51
      # Quiet
52
      "-q",
53
      # Use deflate compression method
54
      "-Z",
55
      "bzip2"
56
    ]
57

58
    System.cmd("zip", flags ++ [zip_file_name, images_dir_name], cd: parent_dir)
59
    |> case do
8✔
60
      {_, 0} ->
8✔
61
        {:ok, Path.join(parent_dir, zip_file_name)}
62

NEW
63
      {error_output, exit_code} ->
×
64
        {:error, {exit_code, error_output}}
65
    end
66
  end
67
end
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc