mrmanga 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![Gem Version](https://badge.fury.io/rb/mrmanga.svg)](https://badge.fury.io/rb/mrmanga)
|
4
|
+
[![Gem](https://img.shields.io/gem/dtv/mrmanga.svg)]()
|
5
|
+
[![Gemnasium](https://img.shields.io/gemnasium/4ndv/mrmanga.svg)]()
|
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
|