pixiv 0.0.1 → 0.0.2

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.
data/README.md CHANGED
@@ -14,12 +14,16 @@ crawl the pixiv service. Do not abuse this library or you may be banned!
14
14
 
15
15
  Add this line to your application's Gemfile:
16
16
 
17
- gem 'pixiv', github: 'uasi/pixiv'
17
+ gem 'pixiv'
18
18
 
19
19
  And then execute:
20
20
 
21
21
  $ bundle
22
22
 
23
+ Or install it yourself as:
24
+
25
+ $ gem install pixiv
26
+
23
27
  ## Usage
24
28
 
25
29
  See [a sample script](https://gist.github.com/4362297)
@@ -10,6 +10,8 @@ module Pixiv
10
10
  "#{ROOT_URL}/bookmark.php?id=#{member_id}&rest=show&p=#{page_num}"
11
11
  end
12
12
 
13
+ # @return [Integer]
14
+ lazy_attr_reader(:bookmarks_count) { at!('a[href="/bookmark.php?type=illust_all"]').inner_text.match(/(\d+)/).to_a[1].to_i }
13
15
  # @return [Integer]
14
16
  lazy_attr_reader(:page_num) { at!('li.pages-current').inner_text.to_i }
15
17
  # @return [Boolean]
@@ -18,9 +20,9 @@ module Pixiv
18
20
  lazy_attr_reader(:member_id) { doc.body.match(/pixiv\.context\.userId = '(\d+)'/).to_a[1].to_i }
19
21
  # @return [Array<Integer>]
20
22
  lazy_attr_reader(:illust_ids) { search!('li[id^="li_"] a[href^="member_illust.php?mode=medium"]').map {|n| n.attr('href').match(/illust_id=(\d+)$/).to_a[1].to_i } }
21
- # @return [Array<Hash{Symbol=>Object}>]
23
+ # @return [Array<Hash{Symbol=>Object}, nil>]
22
24
  lazy_attr_reader(:illust_hashes) {
23
- search!('li[id^="li_"]').map {|node| illust_hash_from_bookmark_item(node) }.compact
25
+ search!('li[id^="li_"]').map {|node| illust_hash_from_bookmark_item(node) }
24
26
  }
25
27
 
26
28
  alias page_hashes illust_hashes
data/lib/pixiv/client.rb CHANGED
@@ -4,6 +4,7 @@ module Pixiv
4
4
  # @return [Mechanize::HTTP::Agent]
5
5
  def self.new_agent
6
6
  agent = Mechanize.new
7
+ agent.max_history = 1
7
8
  agent.pluggable_parser['image/gif'] = Mechanize::Download
8
9
  agent.pluggable_parser['image/jpeg'] = Mechanize::Download
9
10
  agent.pluggable_parser['image/png'] = Mechanize::Download
@@ -40,12 +41,14 @@ module Pixiv
40
41
  # @param [String] pixiv_id
41
42
  # @param [String] password
42
43
  def login(pixiv_id, password)
43
- form = agent.get("#{ROOT_URL}/index.php").forms_with(:class => 'login-form').first
44
- raise Error::LoginFailed, 'login form is not available' unless form
44
+ doc = agent.get("#{ROOT_URL}/index.php")
45
+ return if doc && doc.body =~ /logout/
46
+ form = doc.forms_with(action: '/login.php').first
47
+ puts doc.body and raise Error::LoginFailed, 'login form is not available' unless form
45
48
  form.pixiv_id = pixiv_id
46
49
  form.pass = password
47
50
  doc = agent.submit(form)
48
- raise Error::LoginFailed unless doc.body =~ /logout/
51
+ raise Error::LoginFailed unless doc && doc.body =~ /logout/
49
52
  @member_id = member_id_from_mypage(doc)
50
53
  end
51
54
 
@@ -72,11 +75,15 @@ module Pixiv
72
75
  BookmarkList.lazy_new(attrs) { agent.get(BookmarkList.url(member_id, page_num)) }
73
76
  end
74
77
 
75
- # @param [Pixiv::Member, Integer] member_or_member_id
76
- # @param [Integer] page_num
77
- def bookmarks(member_or_member_id = member_id, page_num = 1)
78
- list = bookmark_list(member_or_member_id, page_num)
79
- PageCollection::Enumerator.new(self, list)
78
+ # @param [Pixiv::BookmarkList, Pixiv::Member, Integer] list_or_member
79
+ # @param [Hash] opts
80
+ # @option opts [Boolean] :include_deleted (false)
81
+ # whether the returning enumerator yields deleted illust as +nil+ or not
82
+ # @return [Pixiv::PageCollection::Enumerator]
83
+ def bookmarks(list_or_member, opts = {})
84
+ list = list_or_member.is_a?(BookmarkList) ? list_or_member
85
+ : bookmark_list(list_or_member)
86
+ PageCollection::Enumerator.new(self, list, !!opts[:include_deleted])
80
87
  end
81
88
 
82
89
  # Downloads the image to +io_or_filename+
@@ -104,11 +111,19 @@ module Pixiv
104
111
  # @param [Pixiv::Illust] illust the manga to download
105
112
  # @param [Array<String, Symbol, #call>] pattern pattern (see {#filename_from_pattern})
106
113
  # @note +illust#manga?+ must be +true+
107
- def download_manga(illust, pattern)
108
- illust.original_image_urls.each do |url|
109
- filename = filename_from_pattern(pattern, illust, url)
110
- FileUtils.mkdir_p(File.dirname(filename))
111
- @agent.download(url, filename, [], illust.original_image_referer)
114
+ # @todo Document +&block+
115
+ def download_manga(illust, pattern, &block)
116
+ action = DownloadActionRegistry.new(&block)
117
+ illust.original_image_urls.each_with_index do |url, n|
118
+ begin
119
+ action.before_each.call(url, n) if action.before_each
120
+ filename = filename_from_pattern(pattern, illust, url)
121
+ FileUtils.mkdir_p(File.dirname(filename))
122
+ @agent.download(url, filename, [], illust.original_image_referer)
123
+ action.after_each.call(url, n) if action.after_each
124
+ rescue
125
+ action.on_error ? action.on_error.call($!) : raise
126
+ end
112
127
  end
113
128
  end
114
129
 
@@ -154,4 +169,22 @@ module Pixiv
154
169
  }.join('')
155
170
  end
156
171
  end
172
+
173
+ class DownloadActionRegistry
174
+ def initialize(&block)
175
+ instance_eval(&block) if block
176
+ end
177
+
178
+ def before_each(&block)
179
+ block ? (@before_each = block) : @before_each
180
+ end
181
+
182
+ def after_each(&block)
183
+ block ? (@after_each = block) : @after_each
184
+ end
185
+
186
+ def on_error(&block)
187
+ block ? (@on_error = block) : @on_error
188
+ end
189
+ end
157
190
  end
data/lib/pixiv/page.rb CHANGED
@@ -23,6 +23,13 @@ module Pixiv
23
23
  set_attrs!(attrs)
24
24
  end
25
25
 
26
+ # Whether +attr_name+ is fetched or not
27
+ # @param [String, Symbol] attr_name
28
+ # @return [Boolean]
29
+ def fetched?(attr_name = :doc)
30
+ instance_variable_get(:"@#{attr_name}") != nil
31
+ end
32
+
26
33
  # @return [Nokogiri::HTTP::Document]
27
34
  def doc
28
35
  @doc ||= begin
@@ -32,14 +32,16 @@ module Pixiv
32
32
  class PageCollection::Enumerator
33
33
  include Enumerable
34
34
 
35
- def initialize(client, collection)
35
+ def initialize(client, collection, include_deleted_page = false)
36
36
  @client = client
37
37
  @collection = collection
38
+ @include_deleted_page = include_deleted_page
38
39
  end
39
40
 
40
41
  def each_page
41
42
  each_collection do |collection|
42
43
  pages_from_collection(collection).each do |page|
44
+ next if page.nil? && !@include_deleted_page
43
45
  yield page
44
46
  end
45
47
  end
@@ -56,7 +58,11 @@ module Pixiv
56
58
  yield pages_from_collection(collection)
57
59
  end
58
60
  else
59
- ::Enumerator.new {|y| each_slice {|slice| y << slice } }
61
+ ::Enumerator.new {|y|
62
+ each_slice do |slice|
63
+ y << (@include_deleted_page ? slice.compact : slice)
64
+ end
65
+ }
60
66
  end
61
67
  end
62
68
  end
@@ -65,8 +71,10 @@ module Pixiv
65
71
 
66
72
  def pages_from_collection(collection)
67
73
  collection.page_hashes.map {|attrs|
68
- url = attrs.delete(:url)
69
- collection.page_class.lazy_new(attrs) { @client.agent.get(url) }
74
+ if attrs
75
+ url = attrs.delete(:url)
76
+ collection.page_class.lazy_new(attrs) { @client.agent.get(url) }
77
+ end
70
78
  }
71
79
  end
72
80
 
@@ -78,4 +86,4 @@ module Pixiv
78
86
  end
79
87
  end
80
88
  end
81
- end
89
+ end
data/lib/pixiv/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Pixiv
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pixiv
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-23 00:00:00.000000000 Z
12
+ date: 2012-12-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: mechanize