dmanga 0.1.5 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 0e45b26c65b84cfa8d1a871fb73764aee5fff73e
4
- data.tar.gz: defd8e480d4e852a4d906fd15ee2266f007af956
2
+ SHA256:
3
+ metadata.gz: 5a446542e7145f8f7b637dfddae37dc39895776c6ebf8849a4d59fec5bafd0f8
4
+ data.tar.gz: aa28934f5baa37e57779b98df1a0e999fb9de13d8a288812566c0baa5a8ba774
5
5
  SHA512:
6
- metadata.gz: 16c9d7625c2f5d2e9f6ad56d56027634af869bc455174dcdd483cf7bd67bf56be66c4cf4cb85cd0b47d9bce584b2efd4017eb20f124d1879713c90d00ad6a82b
7
- data.tar.gz: fbf342d6070afef628c8c8bc453f5d7eecf1b9280dac9227e6667cbeb5021dc544a4c3ea77328d42e5f5bc7627a94493ef315c7918f032a9b3e5b1689ee2f9a4
6
+ metadata.gz: 79211c48431f4c97905e36588af772998502ea6c382179e1bdbf2593036a999b193388fe9463bbfcaa636d1f3cc89261b900cf4d4dde7905d3b7e27d475ac0d9
7
+ data.tar.gz: 0e0ed22a8966085f29fd0006ec88c404f0f658edd076f61b42ebbc8845f71933a2c0c4c71d8c2132fbb8c0348b1a4ad853080a582e8390fdcde50d5d8cca0be7
data/README.md CHANGED
@@ -1,19 +1,18 @@
1
1
  # DManga
2
2
 
3
- DManga é um script/programa ruby multiplataforma Window/Linux/Mac
4
- para baixar mangas de mangahost.net. Com ele voce pode baixar
5
- qualquer manga hospedado em mangahost.net (site br de hospedagem de
6
- manga) de forma automatizada e sem restrição de quantidade. Basta
7
- dizer o nome do manga e selecionar os capitulos que deseja baixar
8
- e pronto o script fará os downloads do capitulos selecionados.
3
+ DManga é um script/programa ruby multiplataforma Window/Linux/Mac
4
+ para baixar mangas do site mangahost. Com ele você pode baixar
5
+ qualquer manga hospedado em mangahost (site br de hospedagem de
6
+ manga) de forma automatizada e sem restrição de quantidade. Basta
7
+ dizer o nome do manga e selecionar os capítulos que deseja baixar
8
+ e pronto o script fará os downloads do capítulos selecionados.
9
9
 
10
- #### Atualização
10
+ #### Atualização
11
11
 
12
- > - Corrigido erro com download de arachnid, uwakoi (não baixem isso) e outros.
12
+ > - (2020) Corrigido erro de "execution expired"
13
+ <!-- > **Se acontecer qualquer erro atualize o script/programa (esse erro provalvemente já foi corrigido)**. -->
13
14
 
14
- > **Se acontecer qualquer erro atualize o script/programa (esse erro provalvemente já foi corrigido)**.
15
-
16
- > Para atualizar:
15
+ > Para atualizar:
17
16
 
18
17
  > `gem update dmanga`
19
18
 
@@ -24,10 +23,10 @@ e pronto o script fará os downloads do capitulos selecionados.
24
23
  ## Instalação
25
24
 
26
25
  ### Windows
27
- Primeiro você precisa ter ruby instalado, você pode baixar ruby
28
- deste [site](https://github.com/oneclick/rubyinstaller2/releases),
29
- basta baixar um dos instaladores que estão abaixo do titulo 'Downloads',
30
- algo com o nome similar a rubyinstaller-2.4.1-1rc3-x86.exe (pode ser uma
26
+ Primeiro você precisa ter ruby instalado, você pode baixar ruby
27
+ deste [site](https://github.com/oneclick/rubyinstaller2/releases),
28
+ basta baixar um dos instaladores que estão abaixo do titulo 'Downloads',
29
+ algo com o nome similar a rubyinstaller-2.4.1-1rc3-x86.exe (pode ser uma
31
30
  versão superior) para arquitetura 32 bits e rubyinstaller-2.4.1-1rc3-x64.exe para 64.
32
31
 
33
32
  Com o ruby instalado. Abra o prompt de comando.
@@ -53,7 +52,7 @@ Atualize sempre para obter melhoras (desempenho ou novas funcionalidades) e corr
53
52
  ### Linux (debian/ubuntu)
54
53
  Abra o terminal.
55
54
 
56
- Se voce não tem o ruby instalado:
55
+ Se você não tem o ruby instalado:
57
56
 
58
57
  `$ sudo apt-get install ruby`
59
58
 
@@ -92,36 +91,42 @@ Ex2:
92
91
  `dmanga tomo-chan`
93
92
 
94
93
  Ex3:
94
+
95
+ Também é possível pesquisar o nome do manga em japonês.
96
+
97
+ `dmanga "アイズ"`
98
+
99
+ Ex4:
95
100
  <!--![exemplo de uso](https://github.com/david-endrew/somethings/blob/master/uso_exemplo.gif)-->
96
101
  ![exemplo de uso](https://github.com/dkeas/somethings/blob/master/uso_exemplo.gif)
97
102
 
98
- obs: A pasta padrão de destino dos downloads é a pasta Downloads mas
99
- você pode dizer ao script a pasta de destino do downloads com a
100
- opçao -d, veja [Opções](#opções) para mais detalhes.
103
+ obs: A pasta padrão de destino dos downloads é a pasta *Downloads* mas
104
+ você pode dizer ao script a pasta de destino dos downloads com a
105
+ opção -d, veja [Opções](#opções) para mais detalhes.
101
106
 
102
107
  obs: o nome do manga não precisa ser o nome exato, pode ser parte do
103
108
  nome ou alguma palavra contida no nome, em todo caso o script/programa
104
109
  fará uma busca no site com o nome passado.
105
110
 
106
- obs: você pode cancelar a execução do script/program a qualquer hora
111
+ obs: você pode cancelar a execução do script/programa a qualquer hora
107
112
  clicando ctrl-c no prompt.
108
113
 
109
- **obs: se o nome do manga contiver mais de uma palavra coloque-o
114
+ **obs: se o nome do manga contiver mais de uma palavra coloque-o
110
115
  entre aspas**.
111
116
 
112
- O scrip/program mostará os mangas encontrados na busca no site
117
+ O scrip/programa mostrará os mangas encontrados na busca no site
113
118
  um de cada vez, selecione o que corresponde a sua busca.
114
119
 
115
- Após será mostrada a lista de capitulos encontrados para aquele manga.
120
+ Após será mostrada a lista de capítulos encontrados para aquele manga.
116
121
 
117
- Quando ele perguntar "Quais capitulos você que baixar?", digite
118
- uma das sequintes opções:
122
+ Quando ele perguntar "Quais capítulos você que baixar?", digite
123
+ uma das seguintes opções:
119
124
 
120
- 1. Para baixar todos so capitulos:
125
+ 1. Para baixar todos os capítulos:
121
126
 
122
127
  `todos`
123
128
 
124
- Baixa todos os capitulos disponiveis.
129
+ Baixa todos os capítulos disponíveis.
125
130
 
126
131
  2. Para selecionar um intervalo digite:
127
132
 
@@ -135,15 +140,15 @@ uma das sequintes opções:
135
140
 
136
141
  Ex2:
137
142
 
138
- `1-1l`
143
+ `1-11`
139
144
 
140
145
  Baixa do capitulo 1 ao 11.
141
146
 
142
- Se voce quiser baixar de um certo capitulo ao ultimo, basta digitar
147
+ Se você quiser baixar de um certo capitulo ao ultimo, basta digitar
143
148
  no limite superior do intervalo um numero maior que o numero do
144
149
  ultimo capitulo (ex: 999999).
145
150
 
146
- 3. Para selecionar capitulos especificos:
151
+ 3. Para selecionar capítulos específicos:
147
152
 
148
153
  `numeroDoCapitulo,numeroDoCapitulo,numeroDoCapitulo...`
149
154
 
@@ -151,16 +156,16 @@ uma das sequintes opções:
151
156
 
152
157
  `2,5,130`
153
158
 
154
- Baixa os capitulos 2, 5 e 130.
159
+ Baixa os capítulos 2, 5 e 130.
155
160
 
156
- Obs: os numeros dos capitulos devem ser digitados separados por
161
+ Obs: os números dos capítulos devem ser digitados separados por
157
162
  virgula e **sem espaços**.
158
163
 
159
164
  ### Opções
160
165
 
161
166
  `--version`
162
167
 
163
- Mostra o numero da versao do programa e sai.
168
+ Mostra o numero da versão do programa e sai.
164
169
 
165
170
  `-d <pasta de download>, --directory <pasta de download>`
166
171
 
@@ -168,7 +173,7 @@ Define a pasta de destino do downlaod.
168
173
 
169
174
  `-h , --help`
170
175
 
171
- Mostra a messagem de ajuda e sai.
176
+ Mostra a mensagem de ajuda e sai.
172
177
 
173
178
  `-v , --verbose`
174
179
 
@@ -178,21 +183,21 @@ Mostra detalhes da execução do programa.
178
183
 
179
184
  `dmanga -d "C:\Users\usuario\images\manga e animes" "One piece"`
180
185
 
181
- No windows, baixe 'One piece' para 'C:\Users\usuario\images\manga e animes'
186
+ No Windows, baixe 'One piece' para 'C:\Users\usuario\images\manga e animes'
182
187
 
183
188
  `dmanga "One punch man"`
184
189
 
185
- Baixe 'One punch man' para 'Downloads'.
190
+ Baixe 'One punch man' para 'Downloads'.
186
191
 
187
192
  `dmanga -d /home/usuario/Images/mangas tomo-chan`
188
193
 
189
- No linux baixe 'tomo-chan' para '/home/usuario/Images/mangas'.
194
+ No Linux baixe 'tomo-chan' para '/home/usuario/Images/mangas'.
190
195
 
191
- ### Exemplos de seleção de capitulos
196
+ ### Exemplos de seleção de capítulos
192
197
 
193
198
  `todos`
194
199
 
195
- Baixa todos os capitulos.
200
+ Baixa todos os capítulos.
196
201
 
197
202
  `34-96`
198
203
 
@@ -200,11 +205,11 @@ Baixa do capitulo 34 ao 96.
200
205
 
201
206
  `1,3,55`
202
207
 
203
- Baixa os capitulos 1, 3 e 55.
208
+ Baixa os capítulos 1, 3 e 55.
204
209
 
205
210
  `34,124`
206
211
 
207
- Baixa os capitulos 34 e 124.
212
+ Baixa os capítulos 34 e 124.
208
213
 
209
214
  `200`
210
215
 
data/Rakefile CHANGED
@@ -17,7 +17,7 @@ desc "change to master branch"
17
17
  task :master do system "git checkout master" end
18
18
 
19
19
  desc "exec the app"
20
- task :exe do system "ruby -Ilib exe/dmanga denki ga honya" end
20
+ task :exe do system "ruby -Ilib exe/dmanga 'denki ga honya' -v" end
21
21
 
22
22
  desc "console with app loaded"
23
23
  task :console do system "bundle exec bin/console" end
@@ -31,12 +31,12 @@ Gem::Specification.new do |spec|
31
31
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
32
32
  spec.require_paths = ["lib"]
33
33
 
34
- spec.add_runtime_dependency "ruby-progressbar","~> 1.8"
34
+ spec.add_runtime_dependency "ruby-progressbar","~> 1.9"
35
35
  spec.add_runtime_dependency "addressable","~> 2.5"
36
36
  spec.add_runtime_dependency "rubyzip","~> 1.2"
37
37
  spec.add_runtime_dependency "formatador", "~> 0.2"
38
- spec.add_development_dependency "minitest","~> 5.10"
39
- spec.add_development_dependency "webmock", "~> 3.0"
40
- spec.add_development_dependency "rake", "~> 12.0"
41
- spec.add_development_dependency "bundler", "~> 1.14"
38
+ spec.add_development_dependency "minitest","~> 5.11"
39
+ spec.add_development_dependency "webmock", "~> 3.3"
40
+ spec.add_development_dependency "rake", "~> 12.3"
41
+ spec.add_development_dependency "bundler", "~> 1.16"
42
42
  end
data/exe/dmanga CHANGED
@@ -12,46 +12,46 @@ begin
12
12
  mangahost.download
13
13
  DManga::display_feedback "\nTodos os download concluidos"
14
14
 
15
- rescue URI::InvalidURIError => uri_error
16
- DManga::display_error("Nome do manga não deve conter acentos, cecedilha ou simbolos",
17
- uri_error)
15
+ rescue URI::InvalidURIError => uri_error
16
+ DManga::display_error("Nome do manga não deve conter acentos, cecedilha ou simbolos",
17
+ uri_error)
18
18
 
19
- rescue Errno::ECONNRESET => con_error
20
- DManga::display_error("Não foi possivel conectar a internet",
21
- con_error)
19
+ rescue Errno::ECONNRESET => con_error
20
+ DManga::display_error("Não foi possivel conectar a internet",
21
+ con_error)
22
22
 
23
- rescue OpenURI::HTTPError => http_error
24
- DManga::display_error("Servidor recusando conexao",
25
- http_error)
23
+ rescue OpenURI::HTTPError => http_error
24
+ DManga::display_error("Servidor recusando conexao",
25
+ http_error)
26
26
 
27
- rescue DManga::MangaNotFoundError => manga_error
28
- DManga::display_warn "\t#{manga_error}"
29
- DManga::display_feedback "\tExiting"
27
+ rescue DManga::MangaNotFoundError => manga_error
28
+ DManga::display_warn "\t#{manga_error}"
29
+ DManga::display_feedback "\tExiting"
30
30
 
31
- rescue Net::ReadTimeout => timeout_error
32
- DManga::display_error("Site demorou demais para responder",
33
- timeout_error)
31
+ rescue Net::ReadTimeout => timeout_error
32
+ DManga::display_error("Site demorou demais para responder",
33
+ timeout_error)
34
34
 
35
- rescue Net::OpenTimeout => timeout_error
36
- DManga::display_error("Site demorou demais para responder",
37
- timeout_error)
35
+ rescue Net::OpenTimeout => timeout_error
36
+ DManga::display_error("Site demorou demais para responder",
37
+ timeout_error)
38
38
 
39
- rescue SocketError => sock_error
40
- DManga::display_error("Nao foi possivel conectar a internet",
41
- sock_error)
39
+ rescue SocketError => sock_error
40
+ DManga::display_error("Nao foi possivel conectar a internet",
41
+ sock_error)
42
42
 
43
- rescue OpenSSL::SSL::SSLError => ssl_error
44
- DManga::display_error("Não foi possivel conectar a internet",
45
- ssl_error)
43
+ rescue OpenSSL::SSL::SSLError => ssl_error
44
+ DManga::display_error("Não foi possivel conectar a internet",
45
+ ssl_error)
46
46
 
47
- rescue Errno::ENETUNREACH => error
48
- DManga::display_error("Não foi possivel conectar a internet",
49
- error)
47
+ rescue Errno::ENETUNREACH => error
48
+ DManga::display_error("Não foi possivel conectar a internet",
49
+ error)
50
50
 
51
- rescue Errno::ENOENT => error
52
- DManga::display_error("Diretorio epecificado não existe",
53
- error)
51
+ rescue Errno::ENOENT => error
52
+ DManga::display_error("Diretorio epecificado não existe",
53
+ error)
54
54
 
55
- rescue Interrupt
56
- DManga::display_feedback("\nBye")
57
- end
55
+ rescue Interrupt
56
+ DManga::display_feedback("\nBye")
57
+ end
@@ -1,136 +1,130 @@
1
- # require 'dmanga/site_parser_base'
2
1
  require 'dmanga/site_parser_base'
3
2
  require 'dmanga/zip_file_generator'
4
- #require 'pry'
5
3
 
6
4
  module DManga
7
- class MangaHostParser < SiteParserBase
8
-
9
- # url used to search in the site
10
- SEARCH_URL = "https://mangahost.net/find/"
11
-
12
- # regex to extract url of found mangas
13
- SEARCH_LINK_REGEX = /entry-title">\s*<a\s*href="(.*)?"\s*title="(.*)"/
14
-
15
- # Regex to extract chapters' url from manga page.
16
- # Manga host has two diferent manga pages.
17
- # One to medium/short mangas and one to big mangas
18
- # /capitulo['"]\stitle=['"]Ler Online\s+-\s+(.*?)['"]\s+href=['"](.*?)['"]/, # for short/medium mangas
19
- CHAPTER_LINK_REGEX = [
20
- /capitulo.*?Ler\s+Online\s+-\s+(.*?)['"]\s+href=['"](.*?)['"]/, # for short/medium mangas
21
- /<a\s+href=['"](.*?)['"]\s+title=['"]Ler\s+Online\s+-\s+(.*?)\s+\[\]/ # for big mangas
22
- ]
23
-
24
- # regex to extract images' url from chapter page
25
- IMG_LINK_REGEX = [/img_\d+['"]\s+src=['"](.*?)['"]/,
26
- /url['"]:['"](.*?)['"]\}/]
27
-
28
- def download
29
-
30
- # white space is not allowed in the search url.
31
- guess_manga_name = @options.manga.gsub(/\s/, '+') # Replace ' ' by '+'
32
-
33
- search("#{SEARCH_URL}#{guess_manga_name}", SEARCH_LINK_REGEX)
34
-
35
- # puts "executing chapters".green ## DEBUG
36
- # Due the organazation of the chapters page the chapters are
37
- # extracted in reverse order
38
- @chapters = parse(@manga_url, CHAPTER_LINK_REGEX[0]) do |resul, page|
39
-
40
- # use long mangas regex if short mangas regex
41
- # returns empty array
42
- if resul.empty?
43
- # Extract chapters name and url and
44
- # swap chapter[0](name) with chapter[1](url)
45
- # to conform with result from CHAPTER_LINK_REGEX[0]
46
- page.scan(CHAPTER_LINK_REGEX[1]) {|chapter| resul << chapter.rotate}
47
- end
48
- resul
49
- end
5
+ class MangaHostParser < SiteParserBase
50
6
 
51
- # correct utf-8 errors
52
- correct_chapters_name
53
-
54
- # prompt user to select chapters to download
55
- select_chapters
56
-
57
- # remove simbols that cannot be used in folder's name on windows
58
- remove_invalid_simbols(@manga_name)
59
- # create manga directory
60
- remove_invalid_simbols(@manga_name)
61
- create_dir(@manga_name)
62
-
63
- # download selected chapters
64
- @chapters.reverse_each do |chapter|
65
- imgs_url = parse(chapter[1], IMG_LINK_REGEX[0]) do |resul, page|
66
- # use second pattern if the first returns a empty
67
- # array
68
- # binding.pry # DEBUG
69
- if resul.empty?
70
- page.scan(IMG_LINK_REGEX[1]) do |img|
71
- #resul << img[0].gsub!(%r{\\}, "")
72
- resul << img[0]
73
- end
74
- end
75
-
76
- resul.each do |img|
77
- # some images urls are incorrect and need to be corrected. For exemple:
78
- # img.mangahost.net/br/images/img.png.webp => img.mangahost.net/br/mangas_files/img.png
79
- img.sub!(/images/, "mangas_files")
80
- img.sub!(/\.webp/, "")
81
-
82
- #correct créditos img problem
83
- correct_image_uri(img)
84
-
85
- img.gsub!(%r{\\}, "")
86
- end
87
- resul
88
- end
89
-
90
- # create chapter directory relative to manga directory
91
- chapter_name = "#{chapter[0]}"
92
- # remove simbols that cannot be used in folder's name on windows
93
- remove_invalid_simbols chapter_name
94
- chapter_dir = "#{@manga_name}/#{chapter_name}"
95
- create_dir(chapter_dir)
96
-
97
- DManga::display_feedback "\nBaixando #{chapter_name}"
98
- imgs_download(chapter_dir, imgs_url)
99
- end
100
- end
7
+ # url used to search in the site
8
+ SEARCH_URL = "https://mangahost2.com/find/"
101
9
 
102
- private
103
- # Due to problems with open-uri and utf-8
104
- # some chapters' name need to be corrected.
105
- # substitute Cap$amptulo for capitulo.
106
- def correct_chapters_name
107
- @chapters.each {|chapter| chapter[0].sub!(/[cC]ap.*?tulo/, "capitulo")}
108
- end
10
+ # regex to extract url of found mangas
11
+ SEARCH_LINK_REGEX = /entry-title">\s*<a\s*href="(.*)?"\s*title="(.*)"/
12
+
13
+ # Regex to extract chapters' url from manga page.
14
+ # Manga host has two diferent manga pages.
15
+ # One to medium/short mangas and one to big mangas
16
+ CHAPTER_LINK_REGEX = [
17
+ /capitulo.*?Ler\s+Online\s+-\s+(.*?)['"]\s+href=['"](.*?)['"]/, # for short/medium mangas
18
+ /<a\s+href=['"](.*?)['"]\s+title=['"]Ler\s+Online\s+-\s+(.*?)\s+\[\]/ # for big mangas
19
+ ]
20
+
21
+ # regex to extract images' url from chapter page
22
+ IMG_LINK_REGEX = [/img_\d+['"]\s+src=['"](.*?)['"]/,
23
+ /url['"]:['"](.*?)['"]\}/]
109
24
 
110
- UNICODE_TABLE = {
111
- "\\u00e1" => "\u00e1",
112
- "\\u00e9" => "\u00e9",
113
- "\\u00ed" => "\u00ed"
114
- #'\\u00c1' => "\u00c1"
115
- #'\\u00c1' => "\u00c1"
116
- }
117
-
118
- # Due to problems with open-uri and utf-8
119
- # some images uris need to be corrected.
120
- # substitute Cru00e9ditos for Créditos.
121
- # one uri at a time
122
- def correct_image_uri(img_uri)
123
- #if img_uri =~ /\\u..../i
124
- result = img_uri.scan(/\\u..../i) #do |r|
125
- #binding.pry
126
- result.each do |r|
127
- img_uri.sub!(r, UNICODE_TABLE[r.downcase])
25
+ def download
26
+
27
+ @options.site = SEARCH_URL.match(%r{.*://(.*)/find/})[1]
28
+
29
+ # white space is not allowed in the search url.
30
+ guess_manga_name = @options.manga.gsub(/\s/, '+') # Replace ' ' by '+'
31
+ guess_manga_name = encode_manga_name(guess_manga_name)
32
+
33
+ search("#{SEARCH_URL}#{guess_manga_name}", SEARCH_LINK_REGEX)
34
+
35
+ # Due the organazation of the chapters page the chapters are
36
+ # extracted in reverse order
37
+ @chapters = parse(@manga_url, CHAPTER_LINK_REGEX[0]) do |resul, page|
38
+
39
+ # use long mangas regex if short mangas regex
40
+ # returns empty array
41
+ if resul.empty?
42
+ # Extract chapters name and url and
43
+ # swap chapter[0](name) with chapter[1](url)
44
+ # to conform with result from CHAPTER_LINK_REGEX[0]
45
+ page.scan(CHAPTER_LINK_REGEX[1]) {|chapter| resul << chapter.rotate}
46
+ end
47
+ resul
48
+ end
49
+
50
+ # correct utf-8 errors
51
+ correct_chapters_name
52
+
53
+ # prompt user to select chapters to download
54
+ select_chapters
55
+
56
+ # remove simbols that cannot be used in folder's name on windows
57
+ remove_invalid_simbols(@manga_name)
58
+ # create manga directory
59
+ remove_invalid_simbols(@manga_name)
60
+ create_dir(@manga_name)
61
+
62
+ # download selected chapters
63
+ @chapters.reverse_each do |chapter|
64
+ imgs_url = parse(chapter[1], IMG_LINK_REGEX[0]) do |resul, page|
65
+ # use second pattern if the first returns a empty
66
+ # array
67
+ if resul.empty?
68
+ page.scan(IMG_LINK_REGEX[1]) do |img|
69
+ resul << img[0]
128
70
  end
129
- #img_uri.gsub!($&, UNICODE_TABLE[$&.downcase])
130
- #binding.pry
131
- #exit
132
- #end
133
- #img_uri.sub!(/[cC]r.*?ditos/, "Créditos")
71
+ end
72
+
73
+ resul.each do |img|
74
+ # some images urls are incorrect and need to be corrected. For exemple:
75
+ # img.mangahost.net/br/images/img.png.webp => img.mangahost.net/br/mangas_files/img.png
76
+ img.sub!(/images/, "mangas_files")
77
+ img.sub!(/\.webp/, "")
78
+
79
+ #correct créditos img problem
80
+ correct_image_uri(img)
81
+
82
+ img.gsub!(%r{\\}, "")
83
+ end
84
+ resul
134
85
  end
86
+
87
+ # create chapter directory relative to manga directory
88
+ chapter_name = "#{chapter[0]}"
89
+ # remove simbols that cannot be used in folder's name on windows
90
+ remove_invalid_simbols chapter_name
91
+ chapter_dir = "#{@manga_name}/#{chapter_name}"
92
+ create_dir(chapter_dir)
93
+
94
+ DManga::display_feedback "\nBaixando #{chapter_name}"
95
+ imgs_download(chapter_dir, imgs_url)
96
+ end
97
+ end
98
+
99
+ private
100
+ # Due to problems with open-uri and unicode
101
+ # some chapters' name need to be corrected.
102
+ # substitute Cap$amptulo for capitulo.
103
+ def correct_chapters_name
104
+ @chapters.each {|chapter| chapter[0].sub!(/[cC]ap.*?tulo/, "capitulo")}
105
+ end
106
+
107
+ UNICODE_TABLE = {
108
+ "\\u00e1" => "\u00e1",
109
+ "\\u00e9" => "\u00e9",
110
+ "\\u00ed" => "\u00ed"
111
+ }
112
+
113
+ # this will allow utf-8 characters in manga name
114
+ # e.g. japanese names
115
+ def encode_manga_name(manga_name)
116
+ Addressable::URI.encode(manga_name)
117
+ end
118
+
119
+ # Due to problems with open-uri and utf-8
120
+ # some images uris need to be corrected.
121
+ # substitute Cru00e9ditos for Créditos.
122
+ # one url at a time
123
+ def correct_image_uri(img_uri)
124
+ result = img_uri.scan(/\\u..../i)
125
+ result.each do |r|
126
+ img_uri.sub!(r, UNICODE_TABLE[r.downcase])
127
+ end
135
128
  end
129
+ end
136
130
  end
@@ -3,11 +3,12 @@ require 'dmanga/version'
3
3
  module DManga
4
4
  class Options
5
5
  DEFAULT_DOWNLOAD_DIR = "#{ENV['HOME']}/Downloads"
6
- attr_reader :download_dir, :verbose, :site, :manga
6
+ attr_reader :download_dir, :verbose, :manga
7
+ attr_accessor :site
7
8
  def initialize(argv)
8
9
  @download_dir = DEFAULT_DOWNLOAD_DIR
9
10
  @verbose = false
10
- @site = "mangahost.net"
11
+ @site = "mangahost.cc"
11
12
  parse(argv)
12
13
  @manga = argv[0]
13
14
  end
@@ -23,11 +24,11 @@ module DManga
23
24
  exit
24
25
  end
25
26
 
26
- opts.on('-v', '--verbose',
27
+ opts.on('-v', '--verbose',
27
28
  'Exibe informações da execução do programa.') do
28
29
  @verbose = true
29
30
  end
30
- opts.on('-d', '--directory DIRETORIO',
31
+ opts.on('-d', '--directory DIRETORIO',
31
32
  'O diretorio de destino do download. Padrão é Downloads.') do |path|
32
33
  @download_dir = path
33
34
  end
@@ -3,89 +3,87 @@ require 'dmanga/os'
3
3
  require 'ruby-progressbar'
4
4
  require 'open-uri'
5
5
  require 'addressable/uri'
6
- #require 'pry'
7
- # require 'formatador'
8
6
 
9
7
  module DManga
10
- class SiteParserBase
11
- USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"
8
+ class SiteParserBase
9
+ USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0"
12
10
 
13
- attr_accessor :manga_name, :manga_url,
14
- :chapters, :verbose
11
+ attr_accessor :manga_name, :manga_url,
12
+ :chapters, :verbose
15
13
 
16
- def initialize(argv)
17
- @options = Options.new(argv)
18
- @manga_url = nil
19
- # manga_name also is used as manga directory name
20
- @manga_name = nil
21
- @chapters = nil
22
- end
14
+ def initialize(argv)
15
+ @options = Options.new(argv)
16
+ @manga_url = nil
17
+ # manga_name is also used as manga directory name
18
+ @manga_name = nil
19
+ @chapters = nil
20
+ end
23
21
 
24
- # Parse the html and colect links that match the pattern.
25
- # Can receive a block.
26
- def parse(url, regex)
27
- DManga::display_feedback "\nfetching #{url}" if @options.verbose
28
- result = []
29
- open(url, "User-Agent" => USER_AGENT) do |response|
30
- if response.status[1] == "OK"
31
- DManga::display_feedback "parsing #{url}" if @options.verbose
32
- page = response.read
33
- page.scan(regex) do |r| # => try first regex
34
- if r.length < 2
35
- result << r[0]
36
- else
37
- result << r
38
- end
39
- end
40
- result = yield(result, page) if block_given?
41
- else
42
- DManga::display_error("ERRO: Servidor respondeu: #{response.status.inpect}")
43
- end
22
+ # Parse the html and extract links that match the pattern.
23
+ # Can receive a block.
24
+ def parse(url, regex)
25
+ DManga::display_feedback "\nfetching #{url}" if @options.verbose
26
+ result = []
27
+ URI.open(url, "User-Agent" => USER_AGENT) do |response|
28
+ if response.status[1] == "OK"
29
+ DManga::display_feedback "parsing #{url}" if @options.verbose
30
+ page = response.read
31
+ page.scan(regex) do |r| # => try first regex
32
+ if r.length < 2
33
+ result << r[0]
34
+ else
35
+ result << r
44
36
  end
45
- result
37
+ end
38
+ result = yield(result, page) if block_given?
39
+ else
40
+ DManga::display_error("ERRO: Servidor respondeu: #{response.status.inpect}")
46
41
  end
42
+ end
43
+ result
44
+ end
47
45
 
48
- def search(url, regex)
49
- DManga::display_feedback "Iniciando busca em #{@options.site}"
50
- search_result = parse(url, regex)
51
- select_manga(search_result)
52
- end
46
+ def search(url, regex)
47
+ DManga::display_feedback "Iniciando busca em #{@options.site}"
48
+ search_result = parse(url, regex)
49
+ select_manga(search_result)
50
+ end
53
51
 
54
- def select_manga(mangas)
55
- puts # just a new line for better output
56
- unless mangas.empty?
57
- mangas.each do |manga|
58
- DManga::display_prompt("Você quer baixar #{manga[1]} [s/n]? ")
59
- res = $stdin.gets.chomp
60
- if res == 's'
61
- @manga_url = manga[0]
62
- @manga_name = manga[1]
63
- break
64
- elsif res != 'n'
65
- DManga::display_warn("\tOpção invalida")
66
- DManga::display_feedback("\tSaindo")
67
- exit(true)
68
- end
69
- end
70
- else
71
- raise MangaNotFoundError, "manga não encontrado"
72
- end
73
- raise MangaNotFoundError, "manga não encontrado" if @manga_url.nil?
52
+ def select_manga(mangas)
53
+ puts # just a new line for better output
54
+ unless mangas.empty?
55
+ mangas.each do |manga|
56
+ DManga::display_prompt("Você quer baixar #{manga[1]} [s/n]? ")
57
+ res = $stdin.gets.chomp
58
+ if res == 's'
59
+ @manga_url = manga[0]
60
+ @manga_name = manga[1]
61
+ break
62
+ elsif res != 'n'
63
+ DManga::display_warn("\tOpção invalida")
64
+ DManga::display_feedback("\tSaindo")
65
+ exit(true)
66
+ end
74
67
  end
68
+ else
69
+ raise MangaNotFoundError, "manga não encontrado"
70
+ end
71
+ raise MangaNotFoundError, "manga não encontrado" if @manga_url.nil?
72
+ end
75
73
 
76
- def select_chapters
77
- DManga::display_feedback "\nCapítulos:"
78
- @chapters.reverse_each.with_index do |chapter, index|
79
- DManga::display_feedback "(#{index + 1})\t#{chapter[0]}"
80
- end
81
- answer = nil
82
- DManga::display_feedback "\n#{@chapters.length} capitulos encontrados\n"
83
- loop do
84
- DManga::display_prompt("Quais capitulos você quer baixar? ")
85
- answer = $stdin.gets.chomp
86
- if answer == "o" || answer.empty?
87
- DManga::display_feedback(
88
- <<-EOS
74
+ def select_chapters
75
+ DManga::display_feedback "\nCapítulos:"
76
+ @chapters.reverse_each.with_index do |chapter, index|
77
+ DManga::display_feedback "(#{index + 1})\t#{chapter[0]}"
78
+ end
79
+ answer = nil
80
+ DManga::display_feedback "\n#{@chapters.length} capitulos encontrados\n"
81
+ loop do
82
+ DManga::display_prompt("Quais capitulos você quer baixar? ")
83
+ answer = $stdin.gets.chomp
84
+ if answer == "o" || answer.empty?
85
+ DManga::display_feedback(
86
+ <<-EOS
89
87
  o - exibe opções.
90
88
  c - cancelar.
91
89
  todos - baixar todos os capítulos.
@@ -93,107 +91,107 @@ module DManga
93
91
  Ex: 0-10 - baixa do 0 ao 10.
94
92
  capNum,capNum,capNum - baixar capitulos selecionados.
95
93
  Ex: 29,499,1 - baixa capitulos 29, 499 e 1.
96
- EOS
97
- )
98
- elsif answer == "c"
99
- DManga::display_feedback("Saindo")
100
- exit true
101
- elsif answer == "todos"
102
- DManga::display_feedback "Baixando todos os capítulos" if @options.verbose
103
- break
104
- elsif answer =~ /(\d+)-(\d+)/
105
- b = Integer($2) <= @chapters.length ? Integer($2) * -1 : @chapters.length * -1
106
- e = Integer($1) * -1
107
- @chapters = @chapters[b..e]
108
- DManga::display_feedback "Baixando capítulos do #{$1} ao #{$2}" if @options.verbose
109
- break
110
- elsif answer =~ /^(\d+,?)+$/
111
- answer = answer.split(',')
112
- aux = []
113
- # downloads are processed in reverse order (to make
114
- # it in crescent order)so the answer is reversed too
115
- answer.reverse_each do |c|
116
- chp = @chapters[Integer(c) * -1]
117
- aux << chp unless chp.nil?
118
- end
119
- @chapters = aux
120
- DManga::display_feedback "Baixando capítulos #{answer.to_s}" if @options.verbose
121
- break
122
- else
123
- DManga::display_warn("\tOpção invalida")
124
- end
125
- end
126
- end
127
-
128
- # return a progressbar suitable to the user operating system
129
- def get_progressbar
130
- if DManga::OS.windows?
131
- return ProgressBar.create(:title => 'Baixando',
132
- :starting_at => 20,
133
- :length => 70,
134
- :total => nil)
135
- else
136
- return ProgressBar.create(:title => 'Baixando',
137
- :starting_at => 20,
138
- :total => nil)
139
- end
94
+ EOS
95
+ )
96
+ elsif answer == "c"
97
+ DManga::display_feedback("Saindo")
98
+ exit true
99
+ elsif answer == "todos"
100
+ DManga::display_feedback "Baixando todos os capítulos" if @options.verbose
101
+ break
102
+ elsif answer =~ /(\d+)-(\d+)/
103
+ b = Integer($2) <= @chapters.length ? Integer($2) * -1 : @chapters.length * -1
104
+ e = Integer($1) * -1
105
+ @chapters = @chapters[b..e]
106
+ DManga::display_feedback "Baixando capítulos do #{$1} ao #{$2}" if @options.verbose
107
+ break
108
+ elsif answer =~ /^(\d+,?)+$/
109
+ answer = answer.split(',')
110
+ aux = []
111
+ # downloads are processed in reverse order (to make
112
+ # it in crescent order)so the answer is reversed too
113
+ answer.reverse_each do |c|
114
+ chp = @chapters[Integer(c) * -1]
115
+ aux << chp unless chp.nil?
116
+ end
117
+ @chapters = aux
118
+ DManga::display_feedback "Baixando capítulos #{answer.to_s}" if @options.verbose
119
+ break
120
+ else
121
+ DManga::display_warn("\tOpção invalida")
140
122
  end
123
+ end
124
+ end
141
125
 
142
- # download images to path relative to Downloads directory
143
- def imgs_download(chp_path, imgs_urls)
144
- imgs_urls.each do |url|
145
- original_filename = url.slice(/(?u)(\w|[_-])+\.(png|jpg)/i)
126
+ # return a progressbar suitable to the user operating system
127
+ def get_progressbar
128
+ if DManga::OS.windows?
129
+ return ProgressBar.create(:title => 'Baixando',
130
+ :starting_at => 20,
131
+ :length => 70,
132
+ :total => nil)
133
+ else
134
+ return ProgressBar.create(:title => 'Baixando',
135
+ :starting_at => 20,
136
+ :total => nil)
137
+ end
138
+ end
146
139
 
147
- img_path = [@options.download_dir,
148
- chp_path,
149
- original_filename].join(File::SEPARATOR)
150
- unless File.exist? img_path
151
- encoded_url = Addressable::URI.encode(url)
152
- DManga::display_feedback "\n#{encoded_url}"
153
- pbar = get_progressbar
154
- open(
155
- encoded_url, "User-Agent" => USER_AGENT,
156
- :progress_proc => lambda {|s| pbar.increment }
157
- ) do |response|
158
- if response.status[1] == "OK"
159
- DManga::display_feedback "Salvando imagem em:'#{img_path}'" if @options.verbose
160
- File.open(img_path, "wb") do |img|
161
- img.puts response.read
162
- end
163
- else
164
- puts "Error #{reponse.status}"
165
- end
166
- end
167
- puts
168
- end
169
- end
170
- end
140
+ # download images to path relative to Downloads directory
141
+ def imgs_download(chp_path, imgs_urls)
142
+ imgs_urls.each do |url|
143
+ original_filename = url.slice(/(?u)(\w|[_-])+\.(png|jpg)/i)
171
144
 
172
- # check if the directory exists and
173
- # create a directory relative to downlaod directory
174
- def create_dir(relative_path)
175
- absolute_path = [@options.download_dir, relative_path].join(File::SEPARATOR)
176
- DManga::display_feedback "\nCriando diretorio '#{relative_path}' em '#{@options.download_dir}'" if @options.verbose
177
- unless Dir.exist? absolute_path
178
- Dir.mkdir(absolute_path)
179
- puts if @options.verbose ## just a blank line for prettier output
145
+ img_path = [@options.download_dir,
146
+ chp_path,
147
+ original_filename].join(File::SEPARATOR)
148
+ unless File.exist? img_path
149
+ encoded_url = Addressable::URI.encode(url)
150
+ DManga::display_feedback "\n#{encoded_url}"
151
+ pbar = get_progressbar
152
+ URI.open(
153
+ encoded_url, "User-Agent" => USER_AGENT,
154
+ :progress_proc => lambda {|s| pbar.increment }
155
+ ) do |response|
156
+ if response.status[1] == "OK"
157
+ DManga::display_feedback "Salvando imagem em:'#{img_path}'" if @options.verbose
158
+ File.open(img_path, "wb") do |img|
159
+ img.puts response.read
160
+ end
180
161
  else
181
- DManga::display_feedback "'#{relative_path}' directorio ja existe" if @options.verbose
162
+ puts "Error #{reponse.status}"
182
163
  end
164
+ end
165
+ puts
183
166
  end
167
+ end
168
+ end
184
169
 
185
- def zip_chapter
186
- # TODO
187
- end
170
+ # check if the directory exists and
171
+ # create a directory relative to downlaod directory
172
+ def create_dir(relative_path)
173
+ absolute_path = [@options.download_dir, relative_path].join(File::SEPARATOR)
174
+ DManga::display_feedback "\nCriando diretorio '#{relative_path}' em '#{@options.download_dir}'" if @options.verbose
175
+ unless Dir.exist? absolute_path
176
+ Dir.mkdir(absolute_path)
177
+ puts if @options.verbose ## just a blank line for prettier output
178
+ else
179
+ DManga::display_feedback "'#{relative_path}' directorio ja existe" if @options.verbose
180
+ end
181
+ end
188
182
 
189
- # Returns the download destination directory
190
- def download_dir
191
- @options.download_dir
192
- end
183
+ #def zip_chapter
184
+ ## TODO
185
+ #end
193
186
 
194
- def remove_invalid_simbols(name)
195
- # windows OS dont accept these simbols in folder name
196
- name.gsub!(/[\/\\:*?"<>|]/, '_')
197
- end
187
+ # Returns the download destination directory
188
+ def download_dir
189
+ @options.download_dir
190
+ end
191
+
192
+ def remove_invalid_simbols(name)
193
+ # windows OS dont accept these simbols in folder name
194
+ name.gsub!(%r{[/\\:*?"<>|]|(\.+$)|(^\.+)}, '_')
198
195
  end
196
+ end
199
197
  end
@@ -1,3 +1,3 @@
1
1
  module DManga
2
- VERSION = "0.1.5"
2
+ VERSION = '1.0.2'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dmanga
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Endrew
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-07-11 00:00:00.000000000 Z
11
+ date: 2020-06-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ruby-progressbar
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.8'
19
+ version: '1.9'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.8'
26
+ version: '1.9'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: addressable
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -72,56 +72,56 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '5.10'
75
+ version: '5.11'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '5.10'
82
+ version: '5.11'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: webmock
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '3.0'
89
+ version: '3.3'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '3.0'
96
+ version: '3.3'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: rake
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '12.0'
103
+ version: '12.3'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '12.0'
110
+ version: '12.3'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: bundler
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '1.14'
117
+ version: '1.16'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '1.14'
124
+ version: '1.16'
125
125
  description: Downloads any manga from mangahost.net. You can search and select any
126
126
  chapter or range of chapters
127
127
  email:
@@ -169,8 +169,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
169
169
  - !ruby/object:Gem::Version
170
170
  version: '0'
171
171
  requirements: []
172
- rubyforge_project:
173
- rubygems_version: 2.6.11
172
+ rubygems_version: 3.1.2
174
173
  signing_key:
175
174
  specification_version: 4
176
175
  summary: Downloads any manga from mangahost.net