mangdown 0.7.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b0eeabd1173684b550b4cdf72608c175b4391510
4
+ data.tar.gz: 65dc5fd208fbea67661742c9783f52faaa12aaeb
5
+ SHA512:
6
+ metadata.gz: ce29debf06fb2c5b16ff66f133c8cd0ef2bc8a2f6de9b234d7d37647a214f4e7011d9a0432965b12983381f219cc2d233e253a609fcc0ed7281c03aef7cbb854
7
+ data.tar.gz: f389ae7aaab05d16ac7669cf1a98f8b7ec358ee5c71a6871a5d5c0aadfe1e5022dd4615ca8061fa9ecf2efd0391fc824ca94832912c860386ec57b93d25c76d0
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2013 John Hager
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/doc/help.txt ADDED
@@ -0,0 +1,33 @@
1
+ ==============================================================================
2
+ Mangdown
3
+
4
+ Commands
5
+
6
+ M#find(string) - Will return an array of Mangdown::MDHash given a string
7
+ which is matched to manga names of the 3000 most popular
8
+ mangas on Mangareader.
9
+
10
+ results = M.find('Naruto')
11
+
12
+
13
+
14
+ *** Use Mangdown::MDHash#get_manga to get a Mangdown::Manga object ***
15
+
16
+ naruto = results[0].get_manga
17
+
18
+
19
+
20
+ M#download(manga, int = 0, int = -1)
21
+ - Will download a manga (Mangdown::Manga object) from the
22
+ first int (index of the first chapter) to the last int
23
+ (index of the last chapter) to a subdirectory named
24
+ #{manga.name}". If no indexes are given, all chapters
25
+ are downloaded.
26
+
27
+ M.download(naruto, 500, 549)
28
+
29
+
30
+
31
+ M#help - Will display help for commands
32
+
33
+ ==============================================================================
@@ -0,0 +1,38 @@
1
+ module Mangdown
2
+ module CBZ
3
+ extend self
4
+ extend ::Mangdown::Tools
5
+
6
+ def cbz_dir(dir)
7
+ zip_file_name = dir + '.cbz'
8
+ dir += '/' unless dir[-1] == '/'
9
+
10
+ ::Zip::File.open(zip_file_name, ::Zip::File::CREATE) do |zp|
11
+ Dir[File.join(dir, '**', '**')].each do |file|
12
+ zp.add(file.sub(dir, ''), file)
13
+ end
14
+ end
15
+ end
16
+
17
+ def cbz_sub_dirs(dir)
18
+ check_dir(dir) do |d|
19
+ cbz_dir(d)
20
+ end
21
+ end
22
+
23
+ def all(main_dir)
24
+ if Dir.exist?(main_dir)
25
+ # Make sure all sub dirs are checked
26
+ validate_file_or_dir_names(main_dir)
27
+ # Make sure all sub dirs have files checked
28
+ check_dir(main_dir) { |d| validate_file_or_dir_names(d)}
29
+ # Create cbz files for all sub dirs
30
+ cbz_sub_dirs(main_dir)
31
+ # new line
32
+ puts
33
+ else
34
+ puts "Cannot find directory"
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,131 @@
1
+ module Mangdown
2
+ class Chapter
3
+ include ::Mangdown::Tools
4
+
5
+ attr_reader :name, :pages, :uri, :num_pages
6
+
7
+ def initialize( uri, name )
8
+ @uri = uri
9
+ @name = name
10
+ @pages = []
11
+ @root = get_root(@uri)
12
+
13
+ get_pages
14
+ end
15
+
16
+ def download
17
+ start_dir = Dir.pwd
18
+ Dir.mkdir(@name) unless Dir.exists?(@name)
19
+ Dir.chdir(@name)
20
+
21
+ @pages.each {|page| page.download}
22
+
23
+ Dir.chdir(start_dir)
24
+ end
25
+
26
+ def get_pages
27
+ uri = @uri
28
+ get_doc(uri)
29
+ @num_pages ||= get_num_pages
30
+
31
+ @num_pages.times do
32
+ page_uri, page_name = get_page
33
+ @pages << Page.new( page_uri, page_name )
34
+ uri = get_next_uri
35
+ get_doc(uri)
36
+ end
37
+
38
+ @doc = "Nokogiri::HTML::Document"
39
+ end
40
+
41
+ #def get_page # STAR
42
+ # image = @doc.css('img')[0]
43
+ # [image['src'], image['alt']]
44
+ #end
45
+
46
+ #def get_next_uri # STAR
47
+ # get_root(@uri)
48
+ # @root + @doc.css('div#imgholder a')[0]['href']
49
+ #end
50
+ end
51
+
52
+ class MRChapter < Chapter
53
+ def get_page # STAR
54
+ image = @doc.css('img')[0]
55
+ [image['src'], image['alt']]
56
+ end
57
+
58
+ def get_next_uri # STAR
59
+ @root + @doc.css('div#imgholder a')[0]['href']
60
+ end
61
+
62
+ def get_num_pages
63
+ @doc.css('select')[1].children.length
64
+ end
65
+ end
66
+
67
+ class FKChapter < Chapter
68
+ attr_reader :num_pages
69
+
70
+ def initialize(uri, name, num_pages)
71
+ @num_pages = num_pages
72
+
73
+ super(uri, name)
74
+ end
75
+
76
+ =begin
77
+ def get_pages
78
+ uri = @uri
79
+ get_doc(uri)
80
+
81
+ @num_pages.times do
82
+ page_uri, page_name = get_page
83
+ @pages << Page.new( page_uri, page_name )
84
+ uri = get_next_uri
85
+ get_doc(uri)
86
+ end
87
+
88
+ @doc = "Nokogiri::HTML::Document"
89
+ end
90
+ =end
91
+
92
+ def get_page # STAR
93
+ page = (@pages.length + 1).to_s
94
+ while page.length < 3
95
+ page = '0' + page
96
+ end
97
+
98
+ # puts "Doc: #{@doc.css('script').text.length}"
99
+ #
100
+ # It seems that Nokogiri cuts out the spaces that were previously there
101
+ # before
102
+ #
103
+ # Watch this because I'm guessing this might revert back
104
+ #
105
+ #s = /(http:\/\/t\.fakku\.net)(.+?)('\+x\+')(\.jpg)/
106
+ #image = @doc.css('script').text.slice(s)
107
+ #image.sub!(/'\+x\+'/, page)
108
+
109
+ script = @doc.css('script').text
110
+
111
+ if script.include?("' + x + '.jpg")
112
+ # puts "With spaces"
113
+ ss = "'\s\\+\sx\s\\+\s'"
114
+ else
115
+ # puts "No spaces"
116
+ ss = "'\\+x\\+'"
117
+ end
118
+
119
+ s = Regexp.new("(http:\/\/t\.fakku\.net)(.+?)(#{ss})(\.jpg)")
120
+ image = script.slice(s)
121
+ image.sub!(Regexp.new(ss), page)
122
+
123
+
124
+ [image, "Page - #{page}"]
125
+ end
126
+
127
+ def get_next_uri # STAR
128
+ "#{::URI.join( @uri, 'read#page=')}#{@pages.length + 2}"
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,45 @@
1
+ module M
2
+ extend self
3
+
4
+ include ::Mangdown
5
+ extend ::Mangdown::Tools
6
+
7
+ #returns a list of hash with :uri and :name of mangas found in @@list
8
+ def find(manga_name)
9
+ unless manga_name =~ /\w/
10
+ puts 'Bad search term'
11
+ return []
12
+ end
13
+
14
+ @@list ||= PopularManga.new('http://www.mangareader.net/popular', 3000)
15
+
16
+ fnd = @@list.mangas_list.select do |m|
17
+ m[1].downcase.include?(manga_name.downcase)
18
+ end
19
+
20
+ fnd.collect! do |m|
21
+ h = MDHash.new
22
+ h[:uri], h[:name] = m[0], m[1]
23
+ h
24
+ end
25
+
26
+ puts "Could not find manga" if fnd.empty?
27
+
28
+ fnd
29
+ end
30
+
31
+ def download(manga, bgn = 0, nd = -1)
32
+ m = slow_get_chapters(manga, bgn, nd)
33
+ slow_dl_chapters(m)
34
+ end
35
+
36
+ def cbz(dir)
37
+ CBZ.all(dir)
38
+ end
39
+
40
+ def help
41
+ help_file = File.expand_path('../../doc/help.txt', File.dirname(__FILE__))
42
+ puts help_file
43
+ puts File.open(help_file, 'r').read
44
+ end
45
+ end
@@ -0,0 +1,46 @@
1
+ module Mangdown
2
+ class Manga
3
+ include ::Mangdown::Tools
4
+
5
+ attr_reader :chapters, :chapters_list, :name, :uri
6
+
7
+ def initialize(uri, name)
8
+ @uri = uri
9
+ @name = name
10
+ @chapters = []
11
+ @chapters_list = []
12
+ @doc = get_doc(@uri)
13
+ @root = get_root(@uri)
14
+
15
+ get_chapters_list
16
+ end
17
+
18
+ def get_chapters_list
19
+ @doc.css('div#chapterlist td a').each do |chapter|
20
+ @chapters_list << ([@root + chapter['href'], chapter.text])
21
+ end
22
+
23
+ @doc = "Nokogiri::HTML::Document"
24
+ end
25
+
26
+ def get_chapter(index)
27
+
28
+ uri, name = @chapters_list[index]
29
+
30
+ unless @chapters.find {|chp| (chp.name == name) or (chp.uri == uri)}
31
+ # this is far from ideal
32
+ chapter_klass = if @root.include?('mangareader')
33
+ MRChapter
34
+ elsif @root.include?('fakku')
35
+ FKChapter
36
+ else
37
+ NO_Chapter
38
+ end
39
+
40
+ @chapters << chapter_klass.new(uri, name)
41
+ else
42
+ nil
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,8 @@
1
+ module Mangdown
2
+ class MDHash < ::Hash
3
+ def get_manga
4
+ Manga.new(self[:uri], self[:name])
5
+ end
6
+ end
7
+ end
8
+
@@ -0,0 +1,16 @@
1
+ module Mangdown
2
+ class Page
3
+ attr_reader :filename, :uri
4
+
5
+ def initialize( uri, filename )
6
+ @filename = filename + '.jpg'
7
+ @uri = uri
8
+ end
9
+
10
+ def download
11
+ File.open(@filename, 'wb') do |file|
12
+ file.write(open(URI.encode(@uri, '[]')).read)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,52 @@
1
+ module Mangdown
2
+ class PopularManga
3
+ include ::Mangdown::Tools
4
+
5
+ attr_reader :uri, :mangas_list, :mangas, :name
6
+
7
+ def initialize(uri, num_mangas, name = "My Pop Manga")
8
+ @uri = uri
9
+ @num_mangas = num_mangas
10
+ @name = name
11
+
12
+ @mangas_list = []
13
+ @mangas = []
14
+
15
+ @root = get_root(@uri)
16
+
17
+ get_mangas_list
18
+ end
19
+
20
+ def get_manga(index)
21
+ uri, name = @mangas_list[index - 1]
22
+ unless @mangas.find {|manga| (manga.name == name) or (manga.uri == uri)}
23
+ @mangas << Manga.new( uri, name )
24
+ else
25
+ nil
26
+ end
27
+ end
28
+
29
+ def get_mangas_list
30
+ (@num_mangas / 30.0).ceil.times do |time|
31
+ get_pop_page_manga(time).each { |manga| @mangas_list << manga }
32
+ end
33
+
34
+ @doc = "Nokogiri::HTML::Document"
35
+ end
36
+
37
+ def get_pop_page_manga(time)
38
+ num = 30 * (time)
39
+ page = @root + '/popular/' + num.to_s
40
+ get_doc(page)
41
+
42
+ last = (@num_mangas > 30) ? 30 : @num_mangas
43
+ @num_mangas -= 30
44
+
45
+ get_manga_on_page[0..(last - 1)]
46
+ end
47
+
48
+ def get_manga_on_page
49
+ @doc.css('h3 a').map {|a| [@root + a['href'], a.text]}
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,110 @@
1
+ module Mangdown
2
+ module Tools
3
+ extend self
4
+
5
+ def get_doc(uri)
6
+ @doc = ::Nokogiri::HTML(open(uri))
7
+ end
8
+
9
+ def get_root(uri)
10
+ @root = ::URI::join(uri, "/").to_s[0..-2]
11
+ end
12
+
13
+ def to_s
14
+ "<#{self.class}::#{self.object_id} : #{@name} : #{@uri}>"
15
+ end
16
+
17
+ def eql?(other)
18
+ (@name == other.name) and (@uri == other.uri)
19
+ end
20
+
21
+ def ==(other)
22
+ puts 'You may want to use :eql?'
23
+ super
24
+ end
25
+
26
+ def no_time_out(tries = 3)
27
+ begin
28
+ timeout(120) do
29
+ yield
30
+ end
31
+ rescue
32
+ if tries > 0
33
+ tries -= 1
34
+ puts "Tries left: #{tries}"
35
+ no_time_out(tries)
36
+ else
37
+ return
38
+ end
39
+ end
40
+ end
41
+
42
+ def slow_get_chapters(manga, bgn, nd)
43
+ @@file_name = File.expand_path("#{manga.name}_temp.yml")
44
+
45
+ exists = File.exist?(@@file_name)
46
+ manga_from_file = YAML.load(File.open(@@file_name, 'r').read) if exists
47
+
48
+ if manga_from_file and (manga_from_file.chapters.length > 0)
49
+ frst = (manga.chapters_list[bgn][1] ==
50
+ manga_from_file.chapters.first.name)
51
+ lst = (manga.chapters_list[nd][1] == manga_from_file.chapters.last.name)
52
+ manga = manga_from_file if (frst and lst)
53
+ else
54
+ manga.chapters_list[bgn..nd].each_index do |i|
55
+ no_time_out {manga.get_chapter(i + bgn)}
56
+ end
57
+ end
58
+
59
+ File.open(@@file_name, 'w') {|f| f.write(manga.to_yaml)}
60
+
61
+ manga
62
+ end
63
+
64
+ def slow_dl_chapters(manga)
65
+ start_dir = Dir.pwd
66
+ Dir.mkdir(manga.name) unless Dir.exist?(manga.name)
67
+ Dir.chdir(manga.name)
68
+
69
+ manga.chapters.each do |chap|
70
+ # puts "DL - #{chap.name}.."
71
+ no_time_out {chap.download}
72
+ end
73
+
74
+ File.delete(@@file_name)
75
+ Dir.chdir(start_dir)
76
+ end
77
+
78
+ def check_file_or_dir_name(name)
79
+ num = name.slice(/(\d+)(\.jpg)*\Z/, 1)
80
+
81
+ if num
82
+ while num.length < 3
83
+ num = '0' + num
84
+ end
85
+
86
+ name = name.sub(/(\d+)(\.jpg)*\Z/, num + '\2')
87
+ end
88
+
89
+ name
90
+ end
91
+
92
+ def check_dir(dir)
93
+ Dir.glob(dir + '/*').each do |d|
94
+ next if d.include?('.cbz')
95
+ yield(d)
96
+ end
97
+ end
98
+
99
+ def validate_file_or_dir_names(dir)
100
+ check_dir(dir) do |e|
101
+ f = check_file_or_dir_name(e)
102
+
103
+ unless f == e
104
+ File.rename(e, f)
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
110
+
data/lib/mangdown.rb ADDED
@@ -0,0 +1,19 @@
1
+ require 'uri'
2
+ require 'open-uri'
3
+ require 'nokogiri'
4
+ require 'yaml'
5
+ require 'timeout'
6
+ require 'zip'
7
+
8
+ require_relative 'mangdown/tools'
9
+ require_relative 'mangdown/page'
10
+ require_relative 'mangdown/chapter'
11
+ require_relative 'mangdown/manga'
12
+ require_relative 'mangdown/popular'
13
+ require_relative 'mangdown/cbz'
14
+ require_relative 'mangdown/commands'
15
+ require_relative 'mangdown/mangdown_hash'
16
+
17
+ unless $0 == __FILE__
18
+ puts '*** Use "M.help" for commands ***'
19
+ end
@@ -0,0 +1,67 @@
1
+ require 'zip'
2
+
3
+
4
+ main_dir = File.expand_path(ARGV[0] || '.')
5
+
6
+ # main_dir = Dir.pwd + '/' + main_dir.to_s unless main_dir =~ /[a-zA-Z]:[\/\\]/
7
+
8
+ Dir.chdir(main_dir)
9
+
10
+ def check_file_or_dir_name(name)
11
+ num = name.slice(/(\d+)(\.jpg)*\Z/, 1)
12
+
13
+ if num
14
+ while num.length < 3
15
+ num = '0' + num
16
+ end
17
+
18
+ name.sub(/(\d+)(\.jpg)*\Z/, num + '\2')
19
+ end
20
+
21
+ name
22
+ end
23
+
24
+ def check_dir(dir)
25
+ Dir.glob(dir + '/*').each do |d|
26
+ next if d.include?('.cbz')
27
+ yield(d)
28
+ end
29
+ end
30
+
31
+ def validate_file_or_dir_names(dir)
32
+ check_dir(dir) do |e|
33
+ f = check_file_or_dir_name(e)
34
+
35
+ unless f == e
36
+ File.rename(e, f)
37
+ end
38
+ end
39
+ end
40
+
41
+ def cbz_dir(dir)
42
+ zip_file_name = dir + '.cbz'
43
+ dir += '/' unless dir[-1] == '/'
44
+
45
+ Zip::File.open(zip_file_name, Zip::File::CREATE) do |zp|
46
+ Dir[File.join(dir, '**', '**')].each do |file|
47
+ zp.add(file.sub(dir, ''), file)
48
+ end
49
+ end
50
+ end
51
+
52
+ def cbz_sub_dirs(dir)
53
+ check_dir(dir) do |d|
54
+ cbz_dir(d)
55
+ end
56
+ end
57
+
58
+ if __FILE__ == $0
59
+ # Make sure all sub dirs are checked
60
+ validate_file_or_dir_names(main_dir)
61
+ # Make sure all sub dirs have files checked
62
+ check_dir(main_dir) { |d| validate_file_or_dir_names(d)}
63
+ # Create cbz files for all sub dirs
64
+ cbz_sub_dirs(main_dir)
65
+ # new line
66
+ puts
67
+ end
@@ -0,0 +1,14 @@
1
+ require_relative '../lib/mangdown'
2
+
3
+ if ARGV.length == 3
4
+ uri, name, pages = ARGV
5
+ pages = pages.to_i
6
+ else
7
+ puts 'Wrong number of arguments'
8
+ exit
9
+ end
10
+
11
+ Dir.chdir('D:/Downloads/Manga/FK')
12
+
13
+ fk = Mangdown::FKChapter.new(uri, name, pages)
14
+ fk.download
@@ -0,0 +1,25 @@
1
+ require_relative 'get_all_fk_page'
2
+
3
+
4
+ module Mangdown
5
+ fk_dir = 'd:/downloads/manga/FK'
6
+
7
+ Dir.chdir(fk_dir)
8
+
9
+ chps = ARGV[0].to_i
10
+ chps = 1 unless (chps > 0 and chps < 100)
11
+
12
+ # puts "chps is: #{chps}"
13
+
14
+ chapters_list = get_chapters(chps)
15
+
16
+ # puts chapters_list.length
17
+ # puts chapters_list
18
+
19
+ chapters_list.each do |ch|
20
+ fk = FKChapter.new(ch[0], ch[1], ch[2])
21
+ fk.download
22
+ end
23
+
24
+ CBZ.cbz_sub_dirs(fk_dir)
25
+ end
@@ -0,0 +1,77 @@
1
+ require_relative '../lib/mangdown'
2
+ require 'timeout'
3
+
4
+ Dir.chdir('D:/downloads/manga')
5
+
6
+ module Mangdown
7
+ def no_time_out(tries = 3)
8
+ begin
9
+ timeout(120) do
10
+ yield
11
+ end
12
+ rescue
13
+ if tries > 0
14
+ tries -= 1
15
+ puts "Tries left: #{tries}"
16
+ no_time_out(tries)
17
+ else
18
+ return
19
+ end
20
+ end
21
+ end
22
+
23
+ def slow_get_chapters(m, bgn, nd)
24
+ @@file_name = File.expand_path("#{m.name}_temp.yml")
25
+
26
+ exists = File.exist?(@@file_name)
27
+ m_from_file = YAML.load(File.open(@@file_name, 'r').read) if exists
28
+
29
+ if m_from_file and (m_from_file.chapters.length > 0)
30
+ frst = (m.chapters_list[bgn][1] == m_from_file.chapters.first.name)
31
+ lst = (m.chapters_list[nd][1] == m_from_file.chapters.last.name)
32
+
33
+ m = m_from_file if (frst and lst)
34
+ else
35
+ m.chapters_list[bgn..nd].each_index do |i|
36
+ no_time_out {m.get_chapter(i + bgn)}
37
+ end
38
+ end
39
+
40
+ File.open(@@file_name, 'w') {|f| f.write(m.to_yaml)}
41
+ m
42
+ end
43
+
44
+ def slow_dl_chapters(m)
45
+ Dir.mkdir(m.name) unless Dir.exist?(m.name)
46
+ Dir.chdir(m.name)
47
+
48
+ m.chapters.each do |chap|
49
+ puts "DL - #{chap.name}.."
50
+ no_time_out {chap.download}
51
+ end
52
+
53
+ File.delete(@@file_name)
54
+ end
55
+
56
+ end
57
+
58
+
59
+ if __FILE__ == $0
60
+ unless ARGV.length >= 2
61
+ puts 'Wrong number of arguments'
62
+ exit
63
+ end
64
+
65
+ uri, name = ARGV
66
+
67
+ m = Manga.new(uri, name)
68
+
69
+ bgn = ARGV[2] ? ARGV[2].to_i - 1 : 0
70
+ nd = ARGV[3] ? ARGV[3].to_i - 1 : m.chapters_list.length
71
+
72
+ m = slow_get_chapters(m, bgn, nd)
73
+ slow_dl_chapters(m)
74
+ else
75
+ puts "Mangdown module included."
76
+ puts "Ready.."
77
+ end
@@ -0,0 +1,72 @@
1
+ require_relative '../lib/mangdown'
2
+
3
+ module Mangdown
4
+
5
+ extend self
6
+
7
+ def fk_uri(uri)
8
+ "http://www.fakku.net#{uri}"
9
+ end
10
+
11
+ def find_chapters(num)
12
+ t = 0
13
+ fk_list = []
14
+ while fk_list.length < num
15
+ page = fk_uri("/page/#{t + 1}")
16
+
17
+ doc = Mangdown::Tools.get_doc(page)
18
+
19
+ doc.css('h2 a.content-title').each do |ch|
20
+ fk_list.push([ch.text, ch[:href]])
21
+ end
22
+
23
+ t += 1
24
+ end
25
+
26
+ fk_list[0..num-1]
27
+ end
28
+
29
+ def get_chapters(num)
30
+ fk_list = []
31
+
32
+ # t.times do |num|
33
+
34
+ # page = "http://www.fakku.net/page/#{num + 1}"
35
+
36
+ # doc = Mangdown::Tools.get_doc(page)
37
+
38
+ # fk_list = doc.css('h2 a.content-title').map {|ch| [ch.text, ch[:href]]}
39
+ # end
40
+ fk_list = find_chapters(num)
41
+
42
+ chapters_list = []
43
+
44
+ fk_list.each do |ch|
45
+ ch_uri = fk_uri(ch[1])
46
+ name = ch[0]
47
+
48
+ doc = Mangdown::Tools.get_doc(ch_uri)
49
+
50
+ # uri = fk_uri(doc.css('div.images a')[0][:href])
51
+ uri = ch_uri + '/read#page=1'
52
+
53
+ pages = doc.css('div#right div.left b')[0].text.to_i
54
+
55
+ chapters_list.push([uri, name, pages])
56
+ end
57
+
58
+ chapters_list
59
+
60
+ end
61
+ end
62
+
63
+
64
+ if __FILE__ == $0
65
+ t = ARGV[0].to_i
66
+ t = 1 if t <= 0
67
+
68
+ Mangdown.get_chapters(t)
69
+ else
70
+ puts "Script loaded"
71
+ end
72
+
@@ -0,0 +1,120 @@
1
+ require 'spec_helper'
2
+
3
+ module Mangdown
4
+ @@uri = 'http://www.mangareader.net/bleach/537'
5
+ @@chapter_name = 'Bleach 537'
6
+
7
+ chapter = MRChapter.new( @@uri, @@chapter_name )
8
+ chapter.download
9
+
10
+ STUB_PATH = File.expand_path('../../objects/chapter.yml', __FILE__)
11
+ File.open(STUB_PATH, 'w+') do |file|
12
+ file.write(chapter.to_yaml)
13
+ end
14
+
15
+ @@fc_uri = 'http://www.fakku.net/doujinshi/pipiruma-extra-edition-dokidoki-summer-vacation/read#page=1'
16
+ @@fc_chapter_name = 'Pipiruma! Extra Edition -DokiDoki Summer Vacation-'
17
+ @@fc_num_pages = 26
18
+
19
+ f_chapter = FKChapter.new( @@fc_uri, @@fc_chapter_name, @@fc_num_pages)
20
+ f_chapter.download
21
+
22
+ FC_STUB_PATH = File.expand_path('../../objects/f_chapter.yml', __FILE__)
23
+ File.open(FC_STUB_PATH, 'w+') do |file|
24
+ file.write(f_chapter.to_yaml)
25
+ end
26
+
27
+ describe MRChapter do
28
+ before(:each) do
29
+ print 'o'
30
+ @chapter = YAML.load(File.open(Mangdown::STUB_PATH, 'r').read)
31
+ @chapter.get_doc(@@uri)
32
+ end
33
+
34
+ context "when chapter is initialized" do
35
+ it "should have the right chapter uri" do
36
+ expect(@chapter.uri).to eq(@@uri)
37
+ end
38
+
39
+ it "should get pages when initialized" do
40
+ expect(@chapter.pages.size).to be > 0
41
+ end
42
+
43
+ it "should have the first page at the 0 index" do
44
+ expect(@chapter.pages.first.filename).to eq('Bleach 537 - Page 1.jpg')
45
+ end
46
+
47
+ it "should have the last page at the -1 index" do
48
+ expect(@chapter.pages.last.filename).to eq('Bleach 537 - Page 21.jpg')
49
+ end
50
+ end
51
+
52
+ context "when the functions for get_pages are run" do
53
+ it "should have the right chapter uri" do
54
+ expect(@chapter.uri).to eq(@@uri)
55
+ end
56
+
57
+ # Probably can get rid of this, not using chapter_mark for functionality
58
+ # xit "should get the right chapter mark from a uri" do
59
+ # expect(@chapter.get_chapter_mark).to eq('Bleach 537')
60
+ # end
61
+
62
+ it "should get the right image link and filename from a uri" do
63
+ expect(@chapter.get_page).to eq(
64
+ ['http://i25.mangareader.net/bleach/537/bleach-4149721.jpg',
65
+ 'Bleach 537 - Page 1'])
66
+ end
67
+
68
+ it "should get the right root from uri" do
69
+ expect(@chapter.get_root(@@uri)).to eq('http://www.mangareader.net')
70
+ end
71
+
72
+ it "should get the right link to the next page from a uri" do
73
+ expect(@chapter.get_next_uri).to eq(
74
+ 'http://www.mangareader.net/bleach/537/2')
75
+ end
76
+
77
+ it "should evaluate the expression to stop get_pages" do
78
+ next_chapter_uri = 'http://www.mangareader.net/bleach/538'
79
+ expect(@chapter.get_doc(next_chapter_uri)).not_to eq(@chapter.name)
80
+ end
81
+ end
82
+
83
+ context "when chapter is downloaded" do
84
+ it "should have the right chapter uri" do
85
+ expect(@chapter.uri).to eq(@@uri)
86
+ end
87
+
88
+ it "should create a directory in the current directory" do
89
+ dir = Dir.pwd
90
+ expect(Dir.glob(dir + '/*' )).to include(dir + '/' + @chapter.name)
91
+ end
92
+
93
+ it "should download all it's pages" do
94
+ dir = Dir.pwd + '/' + @chapter.name
95
+ expect(dir).to include("mangdown/#{@chapter.name}")
96
+ @chapter.pages.each do |page|
97
+ expect(Dir.glob(dir + '/*' )).to include(dir + '/' + page.filename)
98
+ end
99
+ end
100
+ end
101
+ end
102
+
103
+ describe FKChapter do
104
+ before(:each) do
105
+ @f_chapter = YAML.load(File.open(Mangdown::FC_STUB_PATH, 'r').read)
106
+ @f_chapter.get_doc(@@fc_uri)
107
+ end
108
+
109
+ it 'should be downloaded' do
110
+ dir = File.expand_path("../../../#{@f_chapter.name}", __FILE__)
111
+ expect(dir).to include("mangdown/#{@f_chapter.name}")
112
+ @f_chapter.pages.each do |page|
113
+ expect(Dir.glob(dir + '/*')).to include(dir + '/' + page.filename)
114
+ end
115
+ end
116
+ end
117
+ end
118
+
119
+
120
+
@@ -0,0 +1,35 @@
1
+ require 'spec_helper.rb'
2
+
3
+ module M
4
+
5
+ describe "commands" do
6
+ before(:all) do
7
+ @manga = Mangdown::Manga.new('http://www.mangareader.net/6-no-trigger',
8
+ '6 NO TRIGGER')
9
+
10
+ M.download(@manga, 1, 3)
11
+ M.cbz("./#{@manga.name}")
12
+ end
13
+
14
+ it "should find a manga with the find command" do
15
+ m = M.find('Naruto')
16
+ expect(m.first.name).to eq('Naruto')
17
+ end
18
+
19
+ it "should find a list of manga with the find command" do
20
+ m = M.find('Trigger')
21
+ expect(m.length).to be > 1
22
+ end
23
+
24
+ it "should download a manga with the download command" do
25
+ puts Dir.pwd
26
+ chps = Dir.glob("#{Dir.pwd}/#{@manga.name}/*/")
27
+ expect(chps.length).to eq(3)
28
+ end
29
+
30
+ it "should cbz a manga with the cbz command" do
31
+ cbz_s = Dir.glob("#{Dir.pwd}/#{@manga.name}/*.cbz")
32
+ expect(cbz_s.length).to eq(3)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,77 @@
1
+ require_relative '../spec_helper'
2
+
3
+ module Mangdown
4
+ @@m_uri = 'http://www.mangareader.net/94/bleach.html'
5
+ @@manga_name = 'Bleach'
6
+
7
+ manga = Manga.new( @@m_uri, @@manga_name )
8
+
9
+ MANGA_STUB_PATH = File.expand_path('../../objects/manga.yml', __FILE__)
10
+ File.open(MANGA_STUB_PATH, 'w+') do |file|
11
+ file.write(manga.to_yaml)
12
+ end
13
+
14
+
15
+ describe Manga do
16
+ before(:each) do
17
+ print '@'
18
+ @manga = YAML.load(File.open(Mangdown::MANGA_STUB_PATH, 'r').read)
19
+ @manga.get_doc(@@m_uri)
20
+ end
21
+
22
+ context "When a manga is initialized" do
23
+ it "should have chapters" do
24
+ expect(@manga.chapters).to be_empty
25
+ end
26
+
27
+ it "should have chapters listed in chapters_list" do
28
+ expect(@manga.chapters_list).not_to be_empty
29
+ end
30
+ end
31
+
32
+ context "with Bleach manga" do
33
+ it "should have more that 500 chapters" do
34
+ expect(@manga.chapters_list.length).to be > 500
35
+ end
36
+
37
+ it "should have the right first chapter" do
38
+ expect(@manga.chapters_list.first).to eq([
39
+ 'http://www.mangareader.net/94-8-1/bleach/chapter-1.html',
40
+ 'Bleach 1'])
41
+ end
42
+
43
+ it "should have the right 465th chapter" do
44
+ expect(@manga.chapters_list[464]).to eq([
45
+ 'http://www.mangareader.net/bleach/465',
46
+ 'Bleach 465'])
47
+ end
48
+ end
49
+
50
+ context "when a chapter is retrieved" do
51
+ before(:all) do
52
+ @manga2 = YAML.load(File.open(Mangdown::MANGA_STUB_PATH, 'r').read)
53
+ @manga2.get_chapter(0)
54
+ @mchapter = @manga2.chapters_list[0]
55
+ end
56
+
57
+ it "should have a chapter in chapters" do
58
+ expect(@manga2.chapters.length).to eq(1)
59
+ end
60
+
61
+ it "should have chapter 1 in chapters" do
62
+ expect(@manga2.chapters[0].name).to eq(@mchapter[1])
63
+ end
64
+
65
+ it "should have the right chapter sub class" do
66
+ klass = Chapter
67
+ if @mchapter[0].include?('mangareader')
68
+ klass = MRChapter
69
+ elsif @mchapter[0].include?('fakku')
70
+ klass = FKChapter
71
+ end
72
+
73
+ expect(@manga2.chapters[0].class).to eq(klass)
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ module Mangdown
4
+ describe Page do
5
+ before(:all) do
6
+ @dir = Dir.pwd
7
+ @uri = 'http://i25.mangareader.net/bleach/537/bleach-4149721.jpg'
8
+ @filename = "Bleach 537 - Page 1"
9
+ @page = Page.new( @uri, @filename )
10
+ @page.download
11
+ PAGE_STUB_PATH = File.expand_path('../../objects/page.yml', __FILE__)
12
+ File.open(PAGE_STUB_PATH, 'w+') do |file|
13
+ file.write(@page.to_yaml)
14
+ end
15
+ @page2 = YAML.load(File.open(PAGE_STUB_PATH, 'r').read)
16
+ end
17
+
18
+ context "when page is downloaded" do
19
+ it "should download itself to the current directory" do
20
+ expect(Dir.glob(@dir + '/*')).to include(@dir + '/' + @page.filename)
21
+ end
22
+ end
23
+
24
+ context "when a page is compared with a page loaded from a .yml file" do
25
+ it "should compare with #eql?" do
26
+ expect(@page.eql?(@page2))
27
+ end
28
+
29
+ it "should not compare with ==" do
30
+ expect(!@page == @page2)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,67 @@
1
+ require_relative '../spec_helper'
2
+
3
+ module Mangdown
4
+ describe PopularManga do
5
+ before(:all) do
6
+ end
7
+
8
+ context "when initialized" do
9
+ before(:each) do
10
+ end
11
+
12
+ context "with top 20" do
13
+ it "should have a manga list with top 20 mangas" do
14
+ @pop2 = PopularManga.new('http://www.mangareader.net/popular', 20)
15
+ expect(@pop2.mangas_list.length).to eq(20)
16
+ end
17
+ end
18
+
19
+ context "with top 50" do
20
+ it "should have a manga list with top 50 mangas" do
21
+ @pop3 = PopularManga.new('http://www.mangareader.net/popular', 50)
22
+ expect(@pop3.mangas_list.length).to eq(50)
23
+ end
24
+ end
25
+
26
+ context "with top 90" do
27
+ it "should have a manga list with top 90 mangas" do
28
+ @pop4 = PopularManga.new('http://www.mangareader.net/popular', 90)
29
+ expect(@pop4.mangas_list.length).to eq(90)
30
+ end
31
+ end
32
+
33
+ it "should have an empty mangas array" do
34
+ @pop = PopularManga.new('http://www.mangareader.net/popular', 20)
35
+ expect(@pop.mangas).to be_empty
36
+ end
37
+ end
38
+
39
+ context "when get_manga is called" do
40
+ it "should have 1 manga in mangas" do
41
+ @pop = PopularManga.new('http://www.mangareader.net/popular', 20)
42
+ @pop.get_manga(1)
43
+ expect(@pop.mangas.length).to eq(1)
44
+ end
45
+
46
+ it "should have 2 mangas in mangas" do
47
+ @pop = PopularManga.new('http://www.mangareader.net/popular', 20)
48
+ @pop.get_manga(1)
49
+ @pop.get_manga(2)
50
+ expect(@pop.mangas.length).to eq(2)
51
+ end
52
+
53
+ it "should have Bleach in mangas" do
54
+ @pop = PopularManga.new('http://www.mangareader.net/popular', 20)
55
+ @pop.get_manga(1)
56
+ expect(@pop.mangas.length).to eq(1)
57
+ end
58
+
59
+ it "should only get manga once" do
60
+ @pop = PopularManga.new('http://www.mangareader.net/popular', 20)
61
+ @pop.get_manga(1)
62
+ @pop.get_manga(1)
63
+ expect(@pop.mangas.length).to eq(1)
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,5 @@
1
+ require_relative '../../lib/mandown'
2
+
3
+ include Mandown
4
+
5
+ $chapter = Chapter.new('http://www.mangareader.net/bleach/537', 'Bleach 537')
@@ -0,0 +1,39 @@
1
+ require 'rspec'
2
+ require 'yaml'
3
+ require_relative '../lib/mangdown'
4
+
5
+ dirs = ['../../Bleach 537',
6
+ '../../Pipiruma! Extra Edition -DokiDoki Summer Vacation-',
7
+ '../../6 NO TRIGGER']
8
+
9
+ dirs.each do |d|
10
+ dir = File.expand_path(d, __FILE__)
11
+ if Dir.exist?(dir)
12
+ print '*'
13
+ FileUtils.rm_rf(dir)
14
+ end
15
+ end
16
+
17
+ path = File.expand_path('../../Bleach 537 - Page 1.jpg', __FILE__)
18
+ if File.exist?(path)
19
+ print '*'
20
+ FileUtils.rm(path)
21
+ end
22
+
23
+ # This file was generated by the `rspec --init` command. Conventionally, all
24
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
25
+ # Require this file using `require "spec_helper"` to ensure that it is only
26
+ # loaded once.
27
+ #
28
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
29
+ RSpec.configure do |config|
30
+ config.treat_symbols_as_metadata_keys_with_true_values = true
31
+ config.run_all_when_everything_filtered = true
32
+ config.filter_run :focus
33
+
34
+ # Run specs in random order to surface order dependencies. If you find an
35
+ # order dependency and want to debug it, you can fix the order by providing
36
+ # the seed, which is printed after each run.
37
+ # --seed 1234
38
+ config.order = 'random'
39
+ end
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mangdown
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.7.1
5
+ platform: ruby
6
+ authors:
7
+ - jphager2
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-02-14 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A gem to download Manga
14
+ email: jphager2@gmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/mangdown/cbz.rb
20
+ - lib/mangdown/chapter.rb
21
+ - lib/mangdown/commands.rb
22
+ - lib/mangdown/manga.rb
23
+ - lib/mangdown/mangdown_hash.rb
24
+ - lib/mangdown/page.rb
25
+ - lib/mangdown/popular.rb
26
+ - lib/mangdown/tools.rb
27
+ - lib/mangdown.rb
28
+ - scripts/cbz_dirs.rb
29
+ - scripts/dl_fk_ch.rb
30
+ - scripts/dl_fk_chps.rb
31
+ - scripts/dl_slow.rb
32
+ - scripts/get_all_fk_page.rb
33
+ - spec/mangdown/chapter_spec.rb
34
+ - spec/mangdown/commands_spec.rb
35
+ - spec/mangdown/manga_spec.rb
36
+ - spec/mangdown/page_spec.rb
37
+ - spec/mangdown/popular_spec.rb
38
+ - spec/objects/make_chapter.rb
39
+ - spec/spec_helper.rb
40
+ - LICENSE
41
+ - doc/help.txt
42
+ homepage:
43
+ licenses:
44
+ - MIT
45
+ metadata: {}
46
+ post_install_message:
47
+ rdoc_options: []
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - '>='
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ requirements: []
61
+ rubyforge_project:
62
+ rubygems_version: 2.0.2
63
+ signing_key:
64
+ specification_version: 4
65
+ summary: Downloads Manga
66
+ test_files: []