mrmanga 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +40 -2
- data/lib/mrmanga/cli.rb +39 -6
- data/lib/mrmanga/downloader.rb +22 -4
- data/lib/mrmanga/manga.rb +4 -0
- data/lib/mrmanga/parser.rb +13 -2
- data/lib/mrmanga/pdf_renderer.rb +19 -6
- data/lib/mrmanga/version.rb +1 -1
- data/mrmanga.gemspec +1 -0
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e33e9eac4da9f4876817148f7e86a7bbfde98b98
|
4
|
+
data.tar.gz: '07975718124aca4d535f13425dd68b61ef98fa70'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f271f43d5ad2beb5cd1a822d21f704aea46b9faf80827d6b7ca3ef7a213fa222b210663371e2d161b28dd9ec5535eef911bc0c597b6f64c678daa2952324c7ae
|
7
|
+
data.tar.gz: c03ab4a2efd9816b96a8b069ec0ac9b4da67c4956d5f46bacb21428445e98fb5499cd99fac423ea776733a7955ebea520d0c825b5819ae66f2f0ce801288512d
|
data/README.md
CHANGED
@@ -1,16 +1,54 @@
|
|
1
1
|
# mrmanga
|
2
2
|
|
3
|
+
[](https://badge.fury.io/rb/mrmanga)
|
4
|
+
[]()
|
5
|
+
[]()
|
6
|
+
|
3
7
|
#### Aka mintmanga/readmanga downloader
|
4
8
|
|
5
|
-
##
|
9
|
+
## Features
|
10
|
+
|
11
|
+
* mintmanga and readmanga support
|
12
|
+
* Automatic PDF creation with correct metadata (Title, Author, Keywords)
|
13
|
+
* Outlines in PDF (chapters/pages)
|
14
|
+
* Multithreaded download
|
15
|
+
* Download only specified volumes
|
16
|
+
|
17
|
+
## Linux/Mac Installation
|
6
18
|
|
7
19
|
$ gem install mrmanga
|
8
20
|
|
21
|
+
Requires Ruby 2.3+, ImageMagick (or GraphicsMagick), libxml2 (for nokogiri)
|
22
|
+
|
23
|
+
## Windows Installation
|
24
|
+
|
25
|
+
Download and install ruby 2.4 from here: https://rubyinstaller.org/downloads/
|
26
|
+
|
27
|
+
**DONT UNCHECK ANY CHECKBOXES!**
|
28
|
+
|
29
|
+
After installation, you will be asked to install devtools, just press enter in this screen and wait.
|
30
|
+
|
31
|
+
Download and install ImageMagick from here: http://imagemagick.org/script/download.php
|
32
|
+
|
33
|
+
Open CMD and enter this command:
|
34
|
+
|
35
|
+
```bash
|
36
|
+
$ gem install mrmanga --no-ri
|
37
|
+
```
|
38
|
+
|
39
|
+
Now you can use it in any folder where you want to store your downloads, just simply type `mrmanga` in console and follow the instructions.
|
40
|
+
|
9
41
|
## Usage
|
10
42
|
|
11
43
|
$ mrmanga
|
12
44
|
|
13
|
-
And follow the instructions
|
45
|
+
And follow the instructions. By default, it will download to the folder where you runned it.
|
46
|
+
|
47
|
+
## Future and TODOs
|
48
|
+
|
49
|
+
* EPUB generation (GEPUB) with cover selection
|
50
|
+
* More usable CLI
|
51
|
+
* Non-interactive mode
|
14
52
|
|
15
53
|
## Development
|
16
54
|
|
data/lib/mrmanga/cli.rb
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
module Mrmanga
|
2
2
|
class CLI
|
3
|
+
def parse_volumes_range(string)
|
4
|
+
return 'all' if string == 'all'
|
5
|
+
|
6
|
+
if /^\d+-\d+$/ =~ string
|
7
|
+
# 13-37 syntax
|
8
|
+
a = string.split('-')
|
9
|
+
return (a[0]..a[1]).to_a
|
10
|
+
end
|
11
|
+
|
12
|
+
string.tr(' ', '').split(',').map(&:to_i)
|
13
|
+
end
|
14
|
+
|
3
15
|
def interactive_shell
|
4
16
|
require 'highline/import'
|
5
17
|
|
@@ -13,7 +25,30 @@ module Mrmanga
|
|
13
25
|
q.validate = regex
|
14
26
|
end
|
15
27
|
|
16
|
-
|
28
|
+
# TODO: Ask for volumes to download
|
29
|
+
|
30
|
+
puts "Just press Enter to download all the volumes, or specity volumes using this: 1-5 or this: 1, 2, 3, 4, 5 (or 1,2,3,4,5) syntaxes. Also you can download one volume by entering it's number (like this: 1)"
|
31
|
+
|
32
|
+
volumes = ask('Which volumes should i download? ') { |q| q.default = 'all' }
|
33
|
+
|
34
|
+
volumes = parse_volumes_range(volumes)
|
35
|
+
|
36
|
+
puts "Will download these volumes: #{volumes.join(', ')}" if volumes != 'all'
|
37
|
+
|
38
|
+
downloader_settings = {
|
39
|
+
threads: ask('How many threads should i use to download? (6) ', Integer) { |q| q.default = 6 },
|
40
|
+
volumes: volumes
|
41
|
+
}
|
42
|
+
|
43
|
+
create_pdfs = agree('Create pdfs for volumes?') { |q| q.default = 'yes' }
|
44
|
+
|
45
|
+
pdf_settings = {
|
46
|
+
disable_outline_pages: false
|
47
|
+
}
|
48
|
+
|
49
|
+
if create_pdfs
|
50
|
+
pdf_settings[:disable_outline_pages] = !agree('Add pages in PDF outline?') { |q| q.default = 'no' }
|
51
|
+
end
|
17
52
|
|
18
53
|
say 'Parsing manga info'
|
19
54
|
|
@@ -21,16 +56,14 @@ module Mrmanga
|
|
21
56
|
|
22
57
|
say 'Parsed, downloading'
|
23
58
|
|
24
|
-
dl = Mrmanga::Downloader.new(manga)
|
59
|
+
dl = Mrmanga::Downloader.new(manga, downloader_settings)
|
25
60
|
|
26
61
|
manga.volumes.each do |vol, _|
|
27
|
-
puts "Downloading volume #{vol}"
|
28
|
-
|
29
62
|
volume = dl.download_volume(vol)
|
30
63
|
|
31
|
-
if create_pdfs
|
64
|
+
if create_pdfs && volume
|
32
65
|
puts "Rendering pdf of Vol.#{volume[:volume]}"
|
33
|
-
Mrmanga::PdfRenderer.new(manga, volume[:volume], volume[:pages])
|
66
|
+
Mrmanga::PdfRenderer.new(manga, volume[:volume], volume[:pages], pdf_settings)
|
34
67
|
end
|
35
68
|
end
|
36
69
|
end
|
data/lib/mrmanga/downloader.rb
CHANGED
@@ -1,18 +1,30 @@
|
|
1
1
|
require 'down'
|
2
2
|
require 'fileutils'
|
3
3
|
require 'parallel'
|
4
|
+
require 'progressbar'
|
4
5
|
|
5
6
|
module Mrmanga
|
6
7
|
class Downloader
|
7
|
-
def initialize(manga)
|
8
|
+
def initialize(manga, settings)
|
8
9
|
@manga = manga
|
9
10
|
|
11
|
+
@settings = settings
|
12
|
+
|
10
13
|
@name = @manga.info[:info][:name]
|
11
14
|
|
12
15
|
raise "Folder '#{@name}' already exists" if File.directory?(@name)
|
13
16
|
end
|
14
17
|
|
15
18
|
def download_volume(volume)
|
19
|
+
if @settings[:volumes] != 'all'
|
20
|
+
unless @settings[:volumes].include?(volume)
|
21
|
+
puts "Skipping Vol. #{volume}"
|
22
|
+
return false
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
puts "Downloading volume #{volume}"
|
27
|
+
|
16
28
|
prefix = "#{@name}/vol#{volume}"
|
17
29
|
|
18
30
|
parser = Mrmanga::Parser.new
|
@@ -22,13 +34,17 @@ module Mrmanga
|
|
22
34
|
downloaded = {}
|
23
35
|
|
24
36
|
@manga.volumes[volume].each do |volch|
|
25
|
-
puts "Downloading vol.#{volch[0]} ch.#{volch[1]}"
|
26
37
|
pages = parser.get_chapter_pages(@manga, volch[0], volch[1])
|
27
38
|
|
28
|
-
|
29
|
-
|
39
|
+
progress = ProgressBar.create(title: "Downloading vol.#{volch[0]} ch.#{volch[1]}", total: pages.count)
|
40
|
+
|
41
|
+
Parallel.each_with_index(pages, in_threads: @settings[:threads]) do |page, index|
|
42
|
+
progress.increment
|
30
43
|
|
31
44
|
temp = Down.download(page[:link], open_timeout: 20, read_timeout: 20)
|
45
|
+
|
46
|
+
temp.close # Windows needs this
|
47
|
+
|
32
48
|
ext = File.extname(temp.path)
|
33
49
|
|
34
50
|
new_path = File.join(prefix, "#{volch[0]} - #{volch[1]} - #{index + 1}#{ext}")
|
@@ -39,6 +55,8 @@ module Mrmanga
|
|
39
55
|
end
|
40
56
|
|
41
57
|
downloaded[volch[1]] = pages
|
58
|
+
|
59
|
+
progress.finish
|
42
60
|
end
|
43
61
|
|
44
62
|
{
|
data/lib/mrmanga/manga.rb
CHANGED
data/lib/mrmanga/parser.rb
CHANGED
@@ -21,7 +21,9 @@ module Mrmanga
|
|
21
21
|
|
22
22
|
noko_first = Nokogiri::HTML(Faraday.get("http://#{parsed[:site]}#{first_link}?mature=1").body)
|
23
23
|
|
24
|
-
|
24
|
+
volch_with_orig = noko_first.css('#chapterSelectorSelect > option').map { |el| [el.attr('value'), el.text] }
|
25
|
+
|
26
|
+
volch = volch_with_orig.map(&:first)
|
25
27
|
|
26
28
|
regex_volch = /^\/[\w]+\/vol(\d+)\/(\d+).*$/
|
27
29
|
|
@@ -30,13 +32,22 @@ module Mrmanga
|
|
30
32
|
|
31
33
|
raise "Wrong url: #{vl}" unless match
|
32
34
|
|
33
|
-
match.to_a.drop(1)
|
35
|
+
match.to_a.drop(1).map(&:to_i)
|
34
36
|
end
|
35
37
|
|
36
38
|
volch.reverse!
|
37
39
|
|
40
|
+
orig_names = {}
|
41
|
+
|
42
|
+
volch.each do |item|
|
43
|
+
orig_names[item[0]] = {} unless orig_names.key?(item[0])
|
44
|
+
|
45
|
+
orig_names[item[0]][item[1]] = volch_with_orig.pop.last
|
46
|
+
end
|
47
|
+
|
38
48
|
manga = Mrmanga::Manga.new
|
39
49
|
|
50
|
+
manga.add_original_chapters(orig_names)
|
40
51
|
manga.add_info(
|
41
52
|
site: parsed[:site],
|
42
53
|
name: parsed[:name]
|
data/lib/mrmanga/pdf_renderer.rb
CHANGED
@@ -3,7 +3,7 @@ require 'mini_magick'
|
|
3
3
|
|
4
4
|
module Mrmanga
|
5
5
|
class PdfRenderer
|
6
|
-
def initialize(manga, volume, chapters)
|
6
|
+
def initialize(manga, volume, chapters, settings)
|
7
7
|
info = manga.info[:metadata].clone
|
8
8
|
|
9
9
|
title = info[:Title]
|
@@ -18,7 +18,6 @@ module Mrmanga
|
|
18
18
|
|
19
19
|
chapters.each do |ch, pages|
|
20
20
|
puts "Chapter #{ch}"
|
21
|
-
|
22
21
|
outline_map[ch] = []
|
23
22
|
|
24
23
|
pages.each do |page|
|
@@ -45,15 +44,29 @@ module Mrmanga
|
|
45
44
|
section info[:Title]
|
46
45
|
|
47
46
|
outline_map.each do |chapter, pages|
|
48
|
-
section
|
49
|
-
|
50
|
-
|
47
|
+
section manga.info[:original_chapters][volume][chapter], destination: pages.first do
|
48
|
+
unless settings[:disable_outline_pages]
|
49
|
+
pages.each do |page_number|
|
50
|
+
page title: "Page #{page_number}", destination: page_number
|
51
|
+
end
|
51
52
|
end
|
52
53
|
end
|
53
54
|
end
|
54
55
|
end
|
55
56
|
|
56
|
-
|
57
|
+
# Normalize filename (may contain inappropriate chars)
|
58
|
+
|
59
|
+
# Removing non-word chars
|
60
|
+
title.gsub!(/[^[[[:word:]]| |.]+]/, '')
|
61
|
+
# Stripping spaces, dots, underscores, dashes from start and end
|
62
|
+
title.gsub!(/^[\.|_| |-]+/, '')
|
63
|
+
title.gsub!(/[\.|_| |-]+$/, '')
|
64
|
+
|
65
|
+
filename = "#{manga.info[:info][:name]}/#{title} Vol. #{volume}.pdf"
|
66
|
+
|
67
|
+
doc.render_file filename
|
68
|
+
|
69
|
+
puts "Rendered to #{filename}"
|
57
70
|
end
|
58
71
|
end
|
59
72
|
end
|
data/lib/mrmanga/version.rb
CHANGED
data/mrmanga.gemspec
CHANGED
@@ -28,6 +28,7 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.add_dependency 'down', '~> 4.0'
|
29
29
|
spec.add_dependency 'parallel', '~> 1.11'
|
30
30
|
spec.add_dependency 'mini_magick', '~> 4.8'
|
31
|
+
spec.add_dependency 'progressbar', '~> 1.8'
|
31
32
|
|
32
33
|
spec.add_development_dependency 'bundler', '~> 1.15'
|
33
34
|
spec.add_development_dependency 'rake', '~> 10.0'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mrmanga
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrey Viktorov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-07-
|
11
|
+
date: 2017-07-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: highline
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '4.8'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: progressbar
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '1.8'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '1.8'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: bundler
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|