mangdown 0.8.3 → 0.8.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/mangdown.rb +4 -0
- data/lib/mangdown/cbz.rb +38 -15
- data/lib/mangdown/chapter.rb +113 -76
- data/lib/mangdown/commands.rb +26 -30
- data/lib/mangdown/manga.rb +23 -50
- data/lib/mangdown/manga_list.rb +11 -30
- data/lib/mangdown/mangdown.rb +23 -0
- data/lib/mangdown/mangdown_hash.rb +20 -2
- data/lib/mangdown/page.rb +27 -22
- data/lib/mangdown/popular.rb +1 -1
- data/lib/mangdown/properties.rb +43 -0
- data/lib/mangdown/tools.rb +56 -107
- data/lib/mangdown/uri.rb +8 -0
- data/models/chapter.rb +5 -0
- data/models/manga.rb +6 -0
- data/models/page.rb +4 -0
- data/models/site.rb +4 -0
- data/spec/mangdown/chapter_spec.rb +18 -36
- data/spec/mangdown/commands_spec.rb +11 -8
- data/spec/mangdown/manga_spec.rb +14 -11
- data/spec/mangdown/mangdown_hash_spec.rb +5 -4
- data/spec/mangdown/page_spec.rb +6 -6
- data/spec/mangdown/tools_spec.rb +20 -0
- metadata +12 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6443de1c0cb154bfc68bd4b1f5cea81f58946693
|
4
|
+
data.tar.gz: 8726490e4b2178e714ab66db8ee27afafe4107db
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 767c5e5aeb49ff9b2e28d16035ff718d054bded41e78cf690c53659593663469eb98fd22ac03cef0f6b08bbe58c50637450427150f998e319c76c08affc3497a
|
7
|
+
data.tar.gz: 064ca3d79312925c8b919dc9383aedfc8c8884ec8aa40abb923053b1ba1fa9f076a892f2a817a47c44d1146bee3e5a7a84c7d89ed249c94746857c173614993f
|
data/lib/mangdown.rb
CHANGED
@@ -5,7 +5,11 @@ require 'yaml'
|
|
5
5
|
require 'timeout'
|
6
6
|
require 'zip'
|
7
7
|
|
8
|
+
require_relative 'mangdown/mangdown'
|
9
|
+
|
8
10
|
require_relative 'mangdown/tools'
|
11
|
+
require_relative 'mangdown/properties'
|
12
|
+
require_relative 'mangdown/uri'
|
9
13
|
require_relative 'mangdown/page'
|
10
14
|
require_relative 'mangdown/chapter'
|
11
15
|
require_relative 'mangdown/manga'
|
data/lib/mangdown/cbz.rb
CHANGED
@@ -7,32 +7,55 @@ module Mangdown
|
|
7
7
|
zip_file_name = dir + '.cbz'
|
8
8
|
dir += '/' unless dir[-1] == '/'
|
9
9
|
|
10
|
-
::Zip::File.open(zip_file_name, ::Zip::File::CREATE) do |
|
10
|
+
::Zip::File.open(zip_file_name, ::Zip::File::CREATE) do |zip|
|
11
11
|
Dir[File.join(dir, '**', '**')].each do |file|
|
12
|
-
|
12
|
+
zip.add(file.sub(dir, ''), file)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
17
|
def cbz_sub_dirs(dir)
|
18
|
-
check_dir(dir) do |
|
19
|
-
cbz_dir(
|
18
|
+
check_dir(dir) do |sub_dir|
|
19
|
+
cbz_dir(sub_dir)
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
23
|
def all(main_dir)
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
24
|
+
# Make sure all sub dirs are checked
|
25
|
+
validate_file_or_dir_names(main_dir)
|
26
|
+
# Make sure all sub dirs have files checked
|
27
|
+
check_dir(main_dir) { |dir| validate_file_or_dir_names(dir)}
|
28
|
+
# Create cbz files for all sub dirs
|
29
|
+
cbz_sub_dirs(main_dir)
|
30
|
+
# new line
|
31
|
+
puts
|
32
|
+
end
|
33
|
+
|
34
|
+
def check_dir(dir)
|
35
|
+
Dir.glob(dir + '/*').each do |file_name|
|
36
|
+
#do block on each file name, but skip .cbz files
|
37
|
+
next if file_name.include?('.cbz')
|
38
|
+
yield(file_name)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def validate_file_or_dir_names(dir)
|
43
|
+
check_dir(dir) do |file_name|
|
44
|
+
checked_name = check_file_or_dir_name(file_name)
|
45
|
+
File.rename(file_name, checked_name)
|
35
46
|
end
|
36
47
|
end
|
48
|
+
|
49
|
+
def check_file_or_dir_name(name)
|
50
|
+
# slice the last number in the file or directory name,
|
51
|
+
# which will be either the page number or the chapter number
|
52
|
+
num = name.slice(/(\d+)(\.jpg)*\Z/, 1)
|
53
|
+
return unless num
|
54
|
+
|
55
|
+
zeros_to_add = (3-num.length) > 0 ? (3-num.length) : 0
|
56
|
+
num = "0" * zeros_to_add + num
|
57
|
+
name.sub(/(\d+)(\.jpg)*\Z/, num + '\2')
|
58
|
+
end
|
59
|
+
|
37
60
|
end
|
38
61
|
end
|
data/lib/mangdown/chapter.rb
CHANGED
@@ -1,96 +1,133 @@
|
|
1
1
|
module Mangdown
|
2
|
-
|
2
|
+
class Chapter
|
3
3
|
|
4
|
-
|
4
|
+
attr_reader :name, :uri, :pages
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
@
|
9
|
-
|
6
|
+
def initialize(name, uri)
|
7
|
+
@manga = name.slice(/(^.+)\s/, 1)
|
8
|
+
@chapter = name.slice(/\d+\z/)
|
9
|
+
@name = name
|
10
|
+
@uri = Mangdown::Uri.new(uri)
|
11
|
+
@pages = []
|
12
|
+
@properties = Properties.new(@uri)
|
10
13
|
|
11
|
-
|
12
|
-
|
14
|
+
get_pages
|
15
|
+
end
|
13
16
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
17
|
+
# explicit conversion to chapter
|
18
|
+
def to_chapter
|
19
|
+
self
|
20
|
+
end
|
18
21
|
|
19
|
-
# reader method for name
|
20
|
-
def name
|
21
|
-
@info[:name]
|
22
|
-
end
|
23
|
-
|
24
|
-
# download should be in its own module
|
25
|
-
# and the start_dir is sandwich code and should be moved and
|
26
|
-
# passed a block
|
27
22
|
def download
|
28
|
-
|
23
|
+
warn "#download is depreciated use #download_to"
|
29
24
|
|
30
|
-
|
31
|
-
Dir.
|
25
|
+
dir = File.expand_path(@name)
|
26
|
+
Dir.mkdir(dir) unless Dir.exists?(dir)
|
32
27
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
private
|
39
|
-
def get_pages
|
40
|
-
uri = @info[:uri]
|
41
|
-
doc = ::Mangdown::Tools.get_doc(uri)
|
42
|
-
|
43
|
-
get_num_pages(doc).times do
|
44
|
-
page = get_page(doc)
|
45
|
-
uri = get_next_uri(doc)
|
46
|
-
|
47
|
-
@pages << Page.new(page)
|
48
|
-
doc = ::Mangdown::Tools.get_doc(uri)
|
28
|
+
threads = []
|
29
|
+
@pages.each do |page|
|
30
|
+
threads << Thread.new(page) do |this_page|
|
31
|
+
this_page.download_to(dir)
|
49
32
|
end
|
50
33
|
end
|
51
|
-
end
|
52
34
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
image = doc.css('img')[0]
|
35
|
+
threads.each {|thread| thread.join}
|
36
|
+
return @pages.length
|
37
|
+
end
|
57
38
|
|
58
|
-
|
59
|
-
|
60
|
-
|
39
|
+
# download all pages in a chapter
|
40
|
+
def download_to(dir)
|
41
|
+
dir = File.expand_path(dir + '/' + @name)
|
42
|
+
Dir.mkdir(dir) unless Dir.exists?(dir)
|
43
|
+
|
44
|
+
threads = []
|
45
|
+
@pages.each do |page|
|
46
|
+
threads << Thread.new(page) do |this_page|
|
47
|
+
this_page.download_to(dir)
|
48
|
+
end
|
61
49
|
end
|
62
50
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
51
|
+
threads.each {|thread| thread.join}
|
52
|
+
return @pages.length
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
# get page objects for all pages in a chapter
|
58
|
+
def get_pages
|
59
|
+
threads = []
|
60
|
+
get_num_pages(get_page_doc(1)).times do |page|
|
61
|
+
threads << Thread.new(page) do |this_page|
|
62
|
+
hash = get_page(get_page_doc(this_page + 1))
|
63
|
+
@pages << hash.to_page
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
threads.each {|thread| thread.join}
|
68
|
+
return @pages.length
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# mangareader chapter object
|
73
|
+
class MRChapter < Chapter
|
74
|
+
private
|
75
|
+
|
76
|
+
# get the doc for a given page number
|
77
|
+
def get_page_doc(num)
|
78
|
+
doc = Tools.get_doc(
|
79
|
+
Mangdown::Uri.new(
|
80
|
+
@properties.root +
|
81
|
+
"/#{@manga.gsub(' ', '-')}/#{@chapter}/#{num}"
|
82
|
+
).downcase
|
83
|
+
)
|
67
84
|
end
|
68
|
-
|
69
|
-
|
70
|
-
|
85
|
+
|
86
|
+
# get the page uri and name
|
87
|
+
def get_page(doc)
|
88
|
+
image = doc.css('img')[0]
|
89
|
+
|
90
|
+
MDHash.new(
|
91
|
+
uri: image['src'],
|
92
|
+
name: (image['alt'] + ".jpg")
|
93
|
+
)
|
94
|
+
end
|
95
|
+
|
96
|
+
# get the number of pages
|
97
|
+
def get_num_pages(doc)
|
98
|
+
# the select is a dropdown menu of chapter pages
|
71
99
|
doc.css('select')[1].children.length
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
# mangafox chapter object
|
104
|
+
class MFChapter < Chapter
|
105
|
+
private
|
106
|
+
|
107
|
+
# get the doc for a given page number
|
108
|
+
def get_page_doc(num)
|
109
|
+
doc = Tools.get_doc(
|
110
|
+
Mangdown::Uri.new(
|
111
|
+
@properties.root +
|
112
|
+
"/manga/#{@manga.gsub(' ', '_')}/c#{@chapter}/" +
|
113
|
+
"#{num}.html"
|
114
|
+
).downcase
|
115
|
+
)
|
72
116
|
end
|
73
|
-
end
|
74
|
-
|
75
|
-
class MFChapter < Chapter
|
76
|
-
private
|
77
|
-
def get_page(doc)
|
78
|
-
image = doc.css('img')[0]
|
79
117
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
end
|
118
|
+
# get the page name and uri
|
119
|
+
def get_page(doc)
|
120
|
+
image = doc.css('img')[0]
|
121
|
+
|
122
|
+
MDHash.new(
|
123
|
+
uri: image[:src],
|
124
|
+
name: image[:src].sub(/.+\//, '')
|
125
|
+
)
|
126
|
+
end
|
127
|
+
|
128
|
+
# get the number of pages
|
129
|
+
def get_num_pages(doc)
|
130
|
+
doc.css('select')[1].children.length - 1
|
131
|
+
end
|
132
|
+
end
|
96
133
|
end
|
data/lib/mangdown/commands.rb
CHANGED
@@ -2,74 +2,70 @@ module M
|
|
2
2
|
extend self
|
3
3
|
|
4
4
|
include ::Mangdown
|
5
|
-
extend ::Mangdown::Tools
|
6
5
|
|
6
|
+
DATA_FILE_PATH = Dir.home + '/.manga_list.yml'
|
7
|
+
|
8
|
+
# check if the search key contains letters or numbers
|
7
9
|
def valid_search?(search)
|
8
10
|
search =~ /\w/
|
9
11
|
end
|
10
|
-
|
11
|
-
def file_path
|
12
|
-
Dir.home + '/.manga_list.yml'
|
13
|
-
end
|
14
12
|
|
15
|
-
|
13
|
+
# check if the data file is current
|
14
|
+
def file_current?(file)
|
15
|
+
File.exists?(file) ? File.mtime(file) > (Time.now - 604800) : false
|
16
|
+
end
|
17
|
+
|
18
|
+
# return a list of hash with :uri and :name of mangas found in list
|
16
19
|
def find(search)
|
17
20
|
unless valid_search?(search)
|
18
21
|
puts "Searches must contain letters and numbers.."
|
19
22
|
return []
|
20
23
|
end
|
21
24
|
|
22
|
-
|
23
|
-
|
24
|
-
# PopularManga.new('http://www.mangareader.net/popular', 3000)
|
25
|
-
|
26
|
-
if File.exist?(file_path)
|
27
|
-
file_current = File.mtime(file_path) > (Time.now - 60*60*24*7)
|
28
|
-
end
|
29
|
-
|
30
|
-
if file_current
|
31
|
-
@@list = YAML.load(File.open(file_path, 'r').read)
|
25
|
+
if file_current?(DATA_FILE_PATH)
|
26
|
+
list = YAML.load(File.open(DATA_FILE_PATH, 'r').read)
|
32
27
|
else
|
33
|
-
|
28
|
+
list = MangaList.new(
|
34
29
|
'http://www.mangareader.net/alphabetical',
|
35
30
|
'http://mangafox.me/manga/'
|
36
31
|
)
|
37
32
|
|
38
|
-
File.open(
|
39
|
-
|
33
|
+
File.open(DATA_FILE_PATH, 'w+') do |file|
|
34
|
+
file.write( list.to_yaml )
|
40
35
|
end
|
41
36
|
end
|
42
37
|
|
43
|
-
search_result =
|
38
|
+
search_result = list.mangas.select do |manga|
|
44
39
|
manga[:name].downcase.include?(search.downcase)
|
45
40
|
end
|
46
41
|
|
47
|
-
|
48
|
-
|
49
|
-
search_result
|
42
|
+
search_result.empty? ? (puts "Could not find manga") : search_result
|
50
43
|
end
|
51
44
|
|
52
|
-
|
45
|
+
# download a manga (accepts MDHash) between the chapters given
|
46
|
+
# by default the entire manga will be downloaded
|
47
|
+
def download(manga, first = 0, last = -1)
|
53
48
|
if manga.class == MDHash
|
54
|
-
|
49
|
+
manga = manga.to_manga
|
55
50
|
end
|
56
51
|
|
57
|
-
|
58
|
-
manga, first_chapter, last_chapter)
|
59
|
-
::Mangdown::Tools.slow_dl_chapters(chapters)
|
52
|
+
Tools::Downloader.new(manga, first, last)
|
60
53
|
end
|
61
54
|
|
55
|
+
# cbz all subdirectories in a directory
|
62
56
|
def cbz(dir)
|
63
|
-
|
57
|
+
Dir.exist?(dir) ? CBZ.all(dir) : (puts "Cannot find directory")
|
64
58
|
end
|
65
59
|
|
60
|
+
# display help file
|
66
61
|
def help
|
67
62
|
help_file = File.expand_path('../../doc/help.txt',
|
68
63
|
File.dirname(__FILE__))
|
69
64
|
puts File.open(help_file, 'r').read
|
70
65
|
end
|
71
66
|
|
67
|
+
# delete data file
|
72
68
|
def clean_up
|
73
|
-
File.delete(
|
69
|
+
File.delete(DATA_FILE_PATH) if File.exist?(DATA_FILE_PATH)
|
74
70
|
end
|
75
71
|
end
|
data/lib/mangdown/manga.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
module Mangdown
|
2
|
+
|
3
|
+
# mangdown manga object, which holds chapters
|
2
4
|
class Manga
|
3
|
-
include ::Mangdown::Tools
|
4
5
|
|
5
|
-
attr_reader :chapters, :chapters_list
|
6
|
+
attr_reader :name, :uri, :chapters, :chapters_list
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
def initialize(name, uri)
|
9
|
+
@name = name
|
10
|
+
@uri = uri
|
10
11
|
|
11
12
|
#Keeping these chapter objects in memory could be expensive
|
12
13
|
@chapters = []
|
@@ -15,69 +16,41 @@ module Mangdown
|
|
15
16
|
get_chapters_list
|
16
17
|
end
|
17
18
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
# reader method for name
|
24
|
-
def name
|
25
|
-
@info[:name]
|
26
|
-
end
|
19
|
+
# explicit conversion to manga
|
20
|
+
def to_manga
|
21
|
+
self
|
22
|
+
end
|
27
23
|
|
24
|
+
# get push MDHashes of manga chapters to @chapters
|
28
25
|
def get_chapters_list
|
29
|
-
|
30
|
-
|
26
|
+
properties = Properties.new(@uri)
|
27
|
+
doc = Tools.get_doc(@uri)
|
28
|
+
root = properties.root
|
31
29
|
|
32
30
|
#get the link with chapter name and uri
|
33
|
-
doc.css(
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
31
|
+
doc.css(properties.manga_css_klass).each do |chapter|
|
32
|
+
@chapters_list << MDHash.new(
|
33
|
+
uri: (root + chapter[:href].sub(root, '')),
|
34
|
+
name: chapter.text,
|
35
|
+
)
|
38
36
|
end
|
39
37
|
|
40
|
-
|
41
|
-
@chapters_list.reverse!
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def css_klass(site)
|
46
|
-
case site
|
47
|
-
when /mangareader/
|
48
|
-
'div#chapterlist td a'
|
49
|
-
when /mangafox/
|
50
|
-
'a.tips'
|
51
|
-
else
|
52
|
-
nil
|
53
|
-
end
|
38
|
+
@chapters_list.reverse! if properties.reverse
|
54
39
|
end
|
55
40
|
|
56
|
-
# chapter is
|
41
|
+
# returns a MDHash if the chapter is found in @chapters
|
57
42
|
def chapter_found(chapter)
|
58
43
|
@chapters.find do |chp|
|
59
44
|
(chp.name == chapter[:name]) or (chp.uri == chapter[:uri])
|
60
45
|
end
|
61
46
|
end
|
62
47
|
|
48
|
+
# pushes a Chapter object into @chapters unless it is already there
|
63
49
|
def get_chapter(index)
|
64
|
-
|
65
|
-
root = ::Mangdown::Tools.get_root(@info[:uri])
|
66
50
|
chapter = @chapters_list[index]
|
67
51
|
|
68
52
|
unless chapter_found(chapter)
|
69
|
-
|
70
|
-
# almost every class
|
71
|
-
chapter_klass = case root
|
72
|
-
when /mangareader/
|
73
|
-
::Mangdown::MRChapter
|
74
|
-
when /mangafox/
|
75
|
-
::Mangdown::MFChapter
|
76
|
-
else
|
77
|
-
return :no_chapter
|
78
|
-
end
|
79
|
-
|
80
|
-
@chapters << chapter_klass.new(chapter)
|
53
|
+
@chapters << chapter.to_chapter
|
81
54
|
else
|
82
55
|
puts "This chapter has already been added"
|
83
56
|
end
|
data/lib/mangdown/manga_list.rb
CHANGED
@@ -1,46 +1,27 @@
|
|
1
1
|
module Mangdown
|
2
|
+
|
3
|
+
# a list of manga
|
2
4
|
class MangaList
|
3
5
|
|
4
6
|
attr_reader :mangas
|
5
7
|
|
6
8
|
def initialize(*uri)
|
7
|
-
@uri = uri
|
8
9
|
@mangas = []
|
9
10
|
|
10
|
-
|
11
|
+
uri.each {|uri| get_mangas(uri)}
|
11
12
|
end
|
12
13
|
|
14
|
+
# get a list of mangas from the uri
|
13
15
|
def get_mangas(uri)
|
14
|
-
|
15
|
-
|
16
|
-
|
16
|
+
properties = Properties.new(uri)
|
17
|
+
doc = Tools.get_doc(uri)
|
17
18
|
|
18
19
|
# This should be put in a tool
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
root + a[:href]
|
25
|
-
when /mangafox/
|
26
|
-
a[:href]
|
27
|
-
else
|
28
|
-
nil
|
29
|
-
end
|
30
|
-
|
31
|
-
hash[:uri], hash[:name] = url, a.text
|
32
|
-
@mangas << hash
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def css_klass(site)
|
37
|
-
case site
|
38
|
-
when /mangareader/
|
39
|
-
'ul.series_alpha li a'
|
40
|
-
when /mangafox/
|
41
|
-
'div.manga_list li a'
|
42
|
-
else
|
43
|
-
nil
|
20
|
+
doc.css(properties.manga_list_css_klass).each do |a|
|
21
|
+
@mangas << MDHash.new(
|
22
|
+
uri: "#{properties.manga_link_prefix}#{a[:href]}",
|
23
|
+
name: a.text
|
24
|
+
)
|
44
25
|
end
|
45
26
|
end
|
46
27
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Mangdown
|
2
|
+
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def to_s
|
6
|
+
"<#{self.class}::#{self.object_id}" <<
|
7
|
+
@name ? " : #{@name}" : '' <<
|
8
|
+
name ? " : #{name}" : '' <<
|
9
|
+
@uri ? " : #{@uri}" : '' <<
|
10
|
+
uri ? " : #{uri}" : '' <<
|
11
|
+
">"
|
12
|
+
end
|
13
|
+
|
14
|
+
def eql?(other)
|
15
|
+
(self.name == other.name) and (self.uri == other.uri)
|
16
|
+
end
|
17
|
+
|
18
|
+
def ==(other)
|
19
|
+
puts "You may want to use :eql?"
|
20
|
+
super
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
@@ -1,8 +1,26 @@
|
|
1
1
|
module Mangdown
|
2
2
|
class MDHash < ::Hash
|
3
|
-
|
4
|
-
|
3
|
+
|
4
|
+
def initialize(options = {})
|
5
|
+
self[:uri] = options[:uri]
|
6
|
+
self[:name] = options[:name]
|
7
|
+
end
|
8
|
+
|
9
|
+
# explicit conversion to manga
|
10
|
+
def to_manga
|
11
|
+
Manga.new(self[:name], self[:uri])
|
5
12
|
end
|
13
|
+
|
14
|
+
# explicit conversion to chapter
|
15
|
+
def to_chapter
|
16
|
+
klass = Properties.new(self[:uri]).chapter_klass
|
17
|
+
klass.new(self[:name], self[:uri])
|
18
|
+
end
|
19
|
+
|
20
|
+
# explicit conversion to page
|
21
|
+
def to_page
|
22
|
+
Page.new(self[:name], self[:uri])
|
23
|
+
end
|
6
24
|
end
|
7
25
|
end
|
8
26
|
|
data/lib/mangdown/page.rb
CHANGED
@@ -1,30 +1,35 @@
|
|
1
|
-
|
2
|
-
class Page
|
1
|
+
class Mangdown::Page
|
3
2
|
|
4
|
-
|
3
|
+
include Mangdown
|
5
4
|
|
6
|
-
|
7
|
-
# @info[:key]
|
8
|
-
def initialize(info)
|
9
|
-
@info = info
|
10
|
-
end
|
5
|
+
attr_reader :name, :uri
|
11
6
|
|
12
|
-
|
13
|
-
|
14
|
-
|
7
|
+
def initialize(name, uri)
|
8
|
+
@name = name
|
9
|
+
@uri = Mangdown::Uri.new(uri)
|
10
|
+
end
|
15
11
|
|
16
|
-
|
17
|
-
|
18
|
-
|
12
|
+
# explicit conversion to page
|
13
|
+
def to_page
|
14
|
+
self
|
15
|
+
end
|
16
|
+
|
17
|
+
# download the page
|
18
|
+
def download
|
19
|
+
warn "#download is depreciated use #download_to"
|
20
|
+
return nil if File.exist?(@name)
|
21
|
+
File.open(@name, 'wb') do |file|
|
22
|
+
file.write(open(uri).read)
|
23
|
+
end
|
24
|
+
end
|
19
25
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
end
|
26
|
+
# downloads to specified directory
|
27
|
+
def download_to(dir)
|
28
|
+
path = dir + '/' + @name
|
29
|
+
# don't download again
|
30
|
+
return nil if File.exist?(path)
|
31
|
+
File.open(path, 'wb') do |file|
|
32
|
+
file.write(open(uri).read)
|
28
33
|
end
|
29
34
|
end
|
30
35
|
end
|
data/lib/mangdown/popular.rb
CHANGED
@@ -0,0 +1,43 @@
|
|
1
|
+
module Mangdown
|
2
|
+
class Properties
|
3
|
+
|
4
|
+
attr_reader :info
|
5
|
+
|
6
|
+
def initialize(site)
|
7
|
+
@info = Hash.new
|
8
|
+
|
9
|
+
case site
|
10
|
+
when /mangareader/
|
11
|
+
mangareader
|
12
|
+
when /mangafox/
|
13
|
+
mangafox
|
14
|
+
else
|
15
|
+
nil
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def mangareader
|
20
|
+
@info[:manga_list_css_klass] = 'ul.series_alpha li a'
|
21
|
+
@info[:manga_css_klass] = 'div#chapterlist td a'
|
22
|
+
@info[:chapter_klass] = MRChapter
|
23
|
+
@info[:root] = 'http://www.mangareader.net'
|
24
|
+
@info[:manga_link_prefix] = @info[:root]
|
25
|
+
@info[:reverse] = false
|
26
|
+
end
|
27
|
+
|
28
|
+
def mangafox
|
29
|
+
@info[:manga_list_css_klass] = 'div.manga_list li a'
|
30
|
+
@info[:manga_css_klass] = 'a.tips'
|
31
|
+
@info[:chapter_klass] = MFChapter
|
32
|
+
@info[:root] = 'http://mangafox.me'
|
33
|
+
@info[:manga_link_prefix] = ''
|
34
|
+
@info[:reverse] = true
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
def method_missing(method, *args, &block)
|
39
|
+
return @info[method] unless @info[method].nil?
|
40
|
+
super
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/mangdown/tools.rb
CHANGED
@@ -1,140 +1,89 @@
|
|
1
|
+
require 'timeout'
|
2
|
+
|
1
3
|
module Mangdown
|
2
4
|
module Tools
|
3
5
|
extend self
|
4
6
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
end
|
7
|
+
def return_to_start_dir
|
8
|
+
start = Dir.pwd
|
9
|
+
yield
|
10
|
+
Dir.chdir(start)
|
11
|
+
rescue Exception => error
|
12
|
+
Dir.chdir(start)
|
13
|
+
raise error
|
14
|
+
end
|
14
15
|
|
15
16
|
def get_doc(uri)
|
16
|
-
|
17
|
+
@doc = ::Nokogiri::HTML(open(uri))
|
17
18
|
end
|
18
19
|
|
19
20
|
def get_root(uri)
|
20
21
|
@root = ::URI::join(uri, "/").to_s[0..-2]
|
21
22
|
end
|
22
|
-
|
23
|
-
def to_s
|
24
|
-
if special?(self.class)
|
25
|
-
"<#{self.class}::#{self.object_id} : #{@name} : #{@uri}>"
|
26
|
-
else
|
27
|
-
super
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def eql?(other)
|
32
|
-
if special?(self.class)
|
33
|
-
(self.name == other.name) and (self.uri == other.uri)
|
34
|
-
else
|
35
|
-
super
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def ==(other)
|
40
|
-
if special?(self.class)
|
41
|
-
puts 'You may want to use eql?'
|
42
|
-
end
|
43
|
-
|
44
|
-
super
|
45
|
-
end
|
46
|
-
|
23
|
+
|
47
24
|
def no_time_out(tries = 3, &block)
|
48
25
|
tries -= 1
|
49
26
|
begin
|
50
|
-
timeout(120)
|
51
|
-
|
52
|
-
|
53
|
-
rescue
|
54
|
-
if tries >= 0
|
55
|
-
puts "Tries left: #{tries}"
|
56
|
-
no_time_out(tries, &block)
|
57
|
-
else
|
58
|
-
return :timed_out
|
59
|
-
end
|
27
|
+
timeout(120) { yield }
|
28
|
+
rescue Timeout::Error
|
29
|
+
tries >= 0 ? no_time_out(tries, &block) : :timed_out
|
60
30
|
end
|
61
31
|
end
|
62
32
|
|
63
|
-
|
64
|
-
|
33
|
+
class Downloader
|
34
|
+
include Tools
|
65
35
|
|
66
|
-
|
67
|
-
|
68
|
-
manga_from_file = YAML.load(File.open(@@file_name, 'r').read)
|
69
|
-
end
|
36
|
+
def initialize(manga, first, last)
|
37
|
+
@tempfile = File.expand_path("#{manga.name}_temp.yml")
|
70
38
|
|
71
|
-
|
72
|
-
|
73
|
-
manga_from_file.chapters.first.name)
|
74
|
-
lst = (manga.chapters_list[nd][:name] ==
|
75
|
-
manga_from_file.chapters.last.name)
|
76
|
-
# check if this is the right temp file
|
77
|
-
manga = manga_from_file if (frst and lst)
|
78
|
-
else
|
79
|
-
manga.chapters_list[bgn..nd].each_index do |i|
|
80
|
-
no_time_out {manga.get_chapter(i + bgn)}
|
81
|
-
end
|
39
|
+
chapters = slow_get_chapters(manga, first, last)
|
40
|
+
slow_dl_chapters(chapters)
|
82
41
|
end
|
83
42
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
def slow_dl_chapters(manga)
|
90
|
-
start_dir = Dir.pwd
|
91
|
-
Dir.mkdir(manga.name) unless Dir.exist?(manga.name)
|
92
|
-
Dir.chdir(manga.name)
|
93
|
-
|
94
|
-
manga_start_dir = Dir.pwd
|
95
|
-
manga.chapters.each do |chap|
|
96
|
-
no_time_out do
|
97
|
-
Dir.chdir(manga_start_dir)
|
98
|
-
chap.download
|
43
|
+
def slow_get_chapters(manga, bgn, nd)
|
44
|
+
# get Manga object from file if it exists
|
45
|
+
if File.exist?(@tempfile)
|
46
|
+
manga_from_file = YAML
|
47
|
+
.load(File.open(@tempfile, 'r').read)
|
99
48
|
end
|
100
|
-
end
|
101
49
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
50
|
+
# if the manga is from tempfile and the manga has chapters
|
51
|
+
# then check if it has the right chapters
|
52
|
+
if manga_from_file and (manga_from_file.chapters.length > 0)
|
53
|
+
frst = (manga.chapters_list[bgn][:name] ==
|
54
|
+
manga_from_file.chapters.first.name)
|
55
|
+
lst = (manga.chapters_list[nd][:name] ==
|
56
|
+
manga_from_file.chapters.last.name)
|
57
|
+
manga = manga_from_file if (frst and lst)
|
58
|
+
else
|
59
|
+
threads = []
|
60
|
+
manga.chapters_list[bgn..nd].each_index do |index|
|
61
|
+
threads << Thread.new(index) do |i|
|
62
|
+
no_time_out {manga.get_chapter(i + bgn)}
|
63
|
+
end
|
64
|
+
end
|
65
|
+
threads.each {|thread| thread.join}
|
115
66
|
end
|
116
|
-
|
117
|
-
name = name.sub(/(\d+)(\.jpg)*\Z/, num + '\2')
|
118
|
-
end
|
119
67
|
|
120
|
-
|
121
|
-
end
|
68
|
+
File.open(@tempfile, 'w') {|f| f.write(manga.to_yaml)}
|
122
69
|
|
123
|
-
|
124
|
-
Dir.glob(dir + '/*').each do |file_name|
|
125
|
-
#do block on each file name, but skip .cbz files
|
126
|
-
next if file_name.include?('.cbz')
|
127
|
-
yield(file_name)
|
70
|
+
manga
|
128
71
|
end
|
129
|
-
end
|
130
72
|
|
131
|
-
|
132
|
-
|
133
|
-
|
73
|
+
def slow_dl_chapters(manga)
|
74
|
+
dir = File.expand_path(manga.name)
|
75
|
+
Dir.mkdir(dir) unless Dir.exist?(dir)
|
134
76
|
|
135
|
-
|
136
|
-
|
77
|
+
threads = []
|
78
|
+
manga.chapters.each do |chap|
|
79
|
+
threads << Thread.new(chap) do |this_chap|
|
80
|
+
no_time_out {this_chap.download_to(dir)}
|
81
|
+
end
|
137
82
|
end
|
83
|
+
|
84
|
+
threads.each {|thread| thread.join}
|
85
|
+
|
86
|
+
File.delete(@tempfile)
|
138
87
|
end
|
139
88
|
end
|
140
89
|
end
|
data/lib/mangdown/uri.rb
ADDED
data/models/chapter.rb
ADDED
data/models/manga.rb
ADDED
data/models/page.rb
ADDED
data/models/site.rb
ADDED
@@ -1,11 +1,14 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
module Mangdown
|
4
|
-
@@chapter_hash = MDHash.new
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
@@chapter_hash = MDHash.new(
|
5
|
+
uri: 'http://www.mangareader.net/bleach/537',
|
6
|
+
name: 'Bleach 537',
|
7
|
+
manga: 'Bleach',
|
8
|
+
chapter: '537',
|
9
|
+
)
|
10
|
+
|
11
|
+
chapter = @@chapter_hash.to_chapter
|
9
12
|
chapter.download
|
10
13
|
|
11
14
|
STUB_PATH = File.expand_path('../../objects/chapter.yml', __FILE__)
|
@@ -30,48 +33,31 @@ module Mangdown
|
|
30
33
|
end
|
31
34
|
|
32
35
|
it "should have the right first page at the 0 index" do
|
33
|
-
expect(@chapter.pages.first.
|
36
|
+
expect(@chapter.pages.first.name).to eq(
|
34
37
|
'Bleach 537 - Page 1.jpg')
|
35
38
|
end
|
36
39
|
|
37
40
|
it "should have the right last page at the -1 index" do
|
38
|
-
expect(@chapter.pages.last.
|
41
|
+
expect(@chapter.pages.last.name).to eq(
|
39
42
|
'Bleach 537 - Page 21.jpg')
|
40
43
|
end
|
41
44
|
|
42
45
|
context "as a MFChapter" do
|
43
46
|
it "should have pages" do
|
44
|
-
hash = MDHash.new
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
47
|
+
hash = MDHash.new(
|
48
|
+
uri: 'http://mangafox.me/manga/kitsune_no_yomeiri/v01/c001/1.html',
|
49
|
+
name: 'Kitsune no Yomeiri 1',
|
50
|
+
manga: 'Kitsune no Yomeiri',
|
51
|
+
chapter: 1,
|
52
|
+
)
|
53
|
+
|
54
|
+
chapter = hash.to_chapter
|
50
55
|
|
51
56
|
expect(chapter.pages).not_to be_empty
|
52
57
|
end
|
53
58
|
end
|
54
59
|
end
|
55
60
|
|
56
|
-
# Move these to Tools spec
|
57
|
-
=begin
|
58
|
-
context "when the functions for get_pages are run" do
|
59
|
-
it "should have the right chapter uri" do
|
60
|
-
expect(@chapter.uri).to eq(@@uri)
|
61
|
-
end
|
62
|
-
|
63
|
-
it "should get the right image link and filename from a uri" do
|
64
|
-
expect(@chapter.get_page).to eq(
|
65
|
-
['http://i25.mangareader.net/bleach/537/bleach-4149721.jpg',
|
66
|
-
'Bleach 537 - Page 1'])
|
67
|
-
end
|
68
|
-
|
69
|
-
it "should get the right root from uri" do
|
70
|
-
expect(@chapter.get_root(@@uri)).to eq('http://www.mangareader.net')
|
71
|
-
end
|
72
|
-
end
|
73
|
-
=end
|
74
|
-
|
75
61
|
context "when chapter is downloaded" do
|
76
62
|
it "should have a sub directory in the current directory" do
|
77
63
|
dir = Dir.pwd
|
@@ -82,13 +68,9 @@ module Mangdown
|
|
82
68
|
|
83
69
|
it "should download all it's pages" do
|
84
70
|
dir = Dir.pwd + '/' + @chapter.name
|
85
|
-
# expect(dir).to include("mangdown/#{@chapter.name}")
|
86
71
|
|
87
72
|
pages_in_dir = Dir.glob(dir + '/*.jpg').length
|
88
73
|
expect(pages_in_dir).to eq(@chapter.pages.length)
|
89
|
-
#@chapter.pages.each do |page|
|
90
|
-
# expect(Dir.glob(dir + '/*' )).to include(dir +
|
91
|
-
# '/' + page.filename)
|
92
74
|
end
|
93
75
|
end
|
94
76
|
end
|
@@ -4,15 +4,17 @@ module M
|
|
4
4
|
|
5
5
|
describe "commands" do
|
6
6
|
before(:all) do
|
7
|
-
hash = MDHash.new
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
hash = MDHash.new(
|
8
|
+
uri: 'http://www.mangareader.net/6-no-trigger',
|
9
|
+
name: '6 no Trigger'
|
10
|
+
)
|
11
|
+
@manga = hash.to_manga
|
11
12
|
|
12
|
-
hash = MDHash.new
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
hash = MDHash.new(
|
14
|
+
uri: 'http://mangafox.me/manga/naruto/',
|
15
|
+
name: 'Naruto'
|
16
|
+
)
|
17
|
+
@mf_manga = hash.to_manga
|
16
18
|
|
17
19
|
M.download(@manga, 1, 3)
|
18
20
|
M.cbz("./#{@manga.name}")
|
@@ -46,6 +48,7 @@ module M
|
|
46
48
|
|
47
49
|
it "should download a manga from MF" do
|
48
50
|
dir = Dir.pwd
|
51
|
+
#@mf_manga.remove_chapters
|
49
52
|
M.download(@mf_manga, 500, 501)
|
50
53
|
expect(Dir.glob(dir + "/#{@mf_manga.name}/*").length).to eq(2)
|
51
54
|
end
|
data/spec/mangdown/manga_spec.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
require_relative '../spec_helper'
|
2
2
|
|
3
3
|
module Mangdown
|
4
|
-
@@manga_hash
|
5
|
-
|
6
|
-
|
4
|
+
@@manga_hash = MDHash.new(
|
5
|
+
uri: 'http://www.mangareader.net/94/bleach.html',
|
6
|
+
name: 'Bleach'
|
7
|
+
)
|
7
8
|
|
8
|
-
|
9
|
+
manga = @@manga_hash.to_manga
|
9
10
|
|
10
11
|
MANGA_STUB_PATH = File.expand_path('../../objects/manga.yml',
|
11
12
|
__FILE__)
|
@@ -19,7 +20,6 @@ module Mangdown
|
|
19
20
|
before(:each) do
|
20
21
|
print '@'
|
21
22
|
@manga = YAML.load(File.open(Mangdown::MANGA_STUB_PATH, 'r').read)
|
22
|
-
#@manga.get_doc(@@manga_hash[:uri])
|
23
23
|
end
|
24
24
|
|
25
25
|
context "When a manga is initialized" do
|
@@ -33,10 +33,11 @@ module Mangdown
|
|
33
33
|
|
34
34
|
context "as a MangaFox manga" do
|
35
35
|
it "should have chapters" do
|
36
|
-
hash = MDHash.new
|
37
|
-
|
38
|
-
|
39
|
-
|
36
|
+
hash = MDHash.new(
|
37
|
+
uri: 'http://mangafox.me/manga/masca_the_beginning/',
|
38
|
+
name: 'Masca: The Beginning'
|
39
|
+
)
|
40
|
+
manga = hash.to_manga
|
40
41
|
expect(manga.chapters_list).not_to be_empty
|
41
42
|
end
|
42
43
|
end
|
@@ -50,13 +51,15 @@ module Mangdown
|
|
50
51
|
it "should have the right first chapter" do
|
51
52
|
expect(@manga.chapters_list.first).to eq({
|
52
53
|
uri:'http://www.mangareader.net/94-8-1/bleach/chapter-1.html',
|
53
|
-
name: 'Bleach 1'
|
54
|
+
name: 'Bleach 1',
|
55
|
+
})
|
54
56
|
end
|
55
57
|
|
56
58
|
it "should have the right 465th chapter" do
|
57
59
|
expect(@manga.chapters_list[464]).to eq({
|
58
60
|
uri: 'http://www.mangareader.net/bleach/465',
|
59
|
-
name: 'Bleach 465'
|
61
|
+
name: 'Bleach 465',
|
62
|
+
})
|
60
63
|
end
|
61
64
|
end
|
62
65
|
|
@@ -4,13 +4,14 @@ module Mangdown
|
|
4
4
|
|
5
5
|
describe MDHash do
|
6
6
|
before(:all) do
|
7
|
-
@hash = MDHash.new
|
8
|
-
|
9
|
-
|
7
|
+
@hash = MDHash.new(
|
8
|
+
uri: 'http://www.mangareader.net/103/one-piece.html',
|
9
|
+
name: 'One Piece'
|
10
|
+
)
|
10
11
|
end
|
11
12
|
|
12
13
|
it "should get a manga object from get_manga" do
|
13
|
-
expect(@hash.
|
14
|
+
expect(@hash.to_manga).to be_kind_of(Manga)
|
14
15
|
end
|
15
16
|
end
|
16
17
|
end
|
data/spec/mangdown/page_spec.rb
CHANGED
@@ -4,12 +4,12 @@ module Mangdown
|
|
4
4
|
describe Page do
|
5
5
|
before(:all) do
|
6
6
|
@dir = Dir.pwd
|
7
|
-
@page_hash = MDHash.new
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
@page_hash = MDHash.new(
|
8
|
+
uri: 'http://i25.mangareader.net/bleach/537/bleach-4149721.jpg',
|
9
|
+
name: "Bleach 537 - Page 1"
|
10
|
+
)
|
11
11
|
|
12
|
-
|
12
|
+
@page = @page_hash.to_page
|
13
13
|
@page.download
|
14
14
|
PAGE_STUB_PATH = File.expand_path('../../objects/page.yml',
|
15
15
|
__FILE__)
|
@@ -22,7 +22,7 @@ module Mangdown
|
|
22
22
|
|
23
23
|
context "when page is downloaded" do
|
24
24
|
it "should download itself to the current directory" do
|
25
|
-
expect(Dir.glob(@dir + '/*')).to include(@dir + '/' + @page.
|
25
|
+
expect(Dir.glob(@dir + '/*')).to include(@dir + '/' + @page.name)
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# Move these to a Tools spec
|
2
|
+
=begin
|
3
|
+
context "when the functions for get_pages are run" do
|
4
|
+
it "should have the right chapter uri" do
|
5
|
+
expect(@chapter.uri).to eq(@@uri)
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should get the right image link and name from a uri" do
|
9
|
+
expect(@chapter.get_page).to eq(
|
10
|
+
['http://i25.mangareader.net/bleach/537/bleach-4149721.jpg',
|
11
|
+
'Bleach 537 - Page 1'])
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should get the right root from uri" do
|
15
|
+
expect(@chapter.get_root(@@uri)).to eq('http://www.mangareader.net')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
=end
|
19
|
+
|
20
|
+
|
metadata
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mangdown
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jphager2
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-06-12 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
|
-
description: A gem to download Manga
|
13
|
+
description: A gem to download Manga, (pg integration in dev)
|
14
14
|
email: jphager2@gmail.com
|
15
15
|
executables: []
|
16
16
|
extensions: []
|
@@ -24,10 +24,17 @@ files:
|
|
24
24
|
- lib/mangdown/commands.rb
|
25
25
|
- lib/mangdown/manga.rb
|
26
26
|
- lib/mangdown/manga_list.rb
|
27
|
+
- lib/mangdown/mangdown.rb
|
27
28
|
- lib/mangdown/mangdown_hash.rb
|
28
29
|
- lib/mangdown/page.rb
|
29
30
|
- lib/mangdown/popular.rb
|
31
|
+
- lib/mangdown/properties.rb
|
30
32
|
- lib/mangdown/tools.rb
|
33
|
+
- lib/mangdown/uri.rb
|
34
|
+
- models/chapter.rb
|
35
|
+
- models/manga.rb
|
36
|
+
- models/page.rb
|
37
|
+
- models/site.rb
|
31
38
|
- spec/mangdown/chapter_spec.rb
|
32
39
|
- spec/mangdown/commands_spec.rb
|
33
40
|
- spec/mangdown/manga_list_spec.rb
|
@@ -35,9 +42,10 @@ files:
|
|
35
42
|
- spec/mangdown/mangdown_hash_spec.rb
|
36
43
|
- spec/mangdown/page_spec.rb
|
37
44
|
- spec/mangdown/popular_spec.rb
|
45
|
+
- spec/mangdown/tools_spec.rb
|
38
46
|
- spec/objects/make_chapter.rb
|
39
47
|
- spec/spec_helper.rb
|
40
|
-
homepage:
|
48
|
+
homepage: https://github.com/jphager2/mangdown
|
41
49
|
licenses:
|
42
50
|
- MIT
|
43
51
|
metadata: {}
|