Class: Pixiv::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/pixiv/client.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(pixiv_id, password) {|agent| ... } ⇒ Pixiv::Client #initialize(agent) ⇒ Pixiv::Client

A new instance of Client, logged in with the given credentials

Overloads:

  • #initialize(pixiv_id, password) {|agent| ... } ⇒ Pixiv::Client

    Parameters:

    • pixiv_id (String)
    • password (String)

    Yields:

    • (agent)

      (optional) gives a chance to customize the agent before logging in

  • #initialize(agent) ⇒ Pixiv::Client

    Parameters:

    • agent (Mechanize::HTTP::Agent)


26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/pixiv/client.rb', line 26

def initialize(*args)
  if args.size < 2
    @agent = args.first || self.class.new_agent
    yield @agent if block_given?
    ensure_logged_in
  else
    pixiv_id, password = *args
    @agent = self.class.new_agent
    yield @agent if block_given?
    (pixiv_id, password)
  end
end

Instance Attribute Details

#agentMechanize::HTTP::Agent (readonly)

Returns:

  • (Mechanize::HTTP::Agent)


14
15
16
# File 'lib/pixiv/client.rb', line 14

def agent
  @agent
end

#member_idInteger (readonly)

Returns:

  • (Integer)


16
17
18
# File 'lib/pixiv/client.rb', line 16

def member_id
  @member_id
end

Class Method Details

.new_agentMechanize::HTTP::Agent

A new agent

Returns:

  • (Mechanize::HTTP::Agent)


5
6
7
8
9
10
11
# File 'lib/pixiv/client.rb', line 5

def self.new_agent
  agent = Mechanize.new
  agent.pluggable_parser['image/gif'] = Mechanize::Download
  agent.pluggable_parser['image/jpeg'] = Mechanize::Download
  agent.pluggable_parser['image/png'] = Mechanize::Download
  agent
end

Instance Method Details

#bookmark_list(member_or_member_id = member_id, page_num = 1) ⇒ Object

Parameters:

  • member_or_member_id (Pixiv::Member, Integer) (defaults to: member_id)
  • page_num (Integer) (defaults to: 1)


68
69
70
71
72
73
# File 'lib/pixiv/client.rb', line 68

def bookmark_list(member_or_member_id = member_id, page_num = 1)
  x = member_or_member_id
  member_id = x.is_a?(Member) ? x.member_id : x
  attrs = {member_id: member_id, page_num: page_num}
  BookmarkList.lazy_new(attrs) { agent.get(BookmarkList.url(member_id, page_num)) }
end

#bookmarks(member_or_member_id = member_id, page_num = 1) ⇒ Object

Parameters:

  • member_or_member_id (Pixiv::Member, Integer) (defaults to: member_id)
  • page_num (Integer) (defaults to: 1)


77
78
79
80
# File 'lib/pixiv/client.rb', line 77

def bookmarks(member_or_member_id = member_id, page_num = 1)
  list = bookmark_list(member_or_member_id, page_num)
  PageCollection::Enumerator.new(self, list)
end

#download_illust(illust, io_or_filename, size = :original) ⇒ Object

Downloads the image to io_or_filename

Parameters:

  • illust (Pixiv::Illust)
  • io_or_filename (#write, String, Array<String, Symbol, #call>)

    io or filename or pattern (see #filename_from_pattern)

  • size (Symbol) (defaults to: :original)

    image size (:small, :medium, or :original)



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/pixiv/client.rb', line 86

def download_illust(illust, io_or_filename, size = :original)
  size = {:s => :small, :m => :medium, :o => :original}[size] || size
  url = illust.__send__("#{size}_image_url")
  referer = case size
            when :small then nil
            when :medium then illust.url
            when :original then illust.original_image_referer
            else raise ArgumentError, "unknown size `#{size}`"
            end
  save_to = io_or_filename
  if save_to.is_a?(Array)
    save_to = filename_from_pattern(save_to, illust, url)
  end
  FileUtils.mkdir_p(File.dirname(save_to)) unless save_to.respond_to?(:write)
  @agent.download(url, save_to, [], referer)
end

#download_manga(illust, pattern) ⇒ Object

Note:

illust#manga? must be true

Downloads the images to pattern

Parameters:

  • illust (Pixiv::Illust)

    the manga to download

  • pattern (Array<String, Symbol, #call>)

    pattern (see #filename_from_pattern)



107
108
109
110
111
112
113
# File 'lib/pixiv/client.rb', line 107

def download_manga(illust, pattern)
  illust.original_image_urls.each do |url|
    filename = filename_from_pattern(pattern, illust, url)
    FileUtils.mkdir_p(File.dirname(filename))
    @agent.download(url, filename, [], illust.original_image_referer)
  end
end

#illust(illust_id) ⇒ Pixiv::Illust

Parameters:

  • illust_id (Integer)

Returns:



54
55
56
57
# File 'lib/pixiv/client.rb', line 54

def illust(illust_id)
  attrs = {illust_id: illust_id}
  Illust.lazy_new(attrs) { agent.get(Illust.url(illust_id)) }
end

#login(pixiv_id, password) ⇒ Object

Log in to Pixiv

Parameters:

  • pixiv_id (String)
  • password (String)

Raises:



42
43
44
45
46
47
48
49
50
# File 'lib/pixiv/client.rb', line 42

def (pixiv_id, password)
  form = agent.get("#{ROOT_URL}/index.php").forms_with(:class => 'login-form').first
  raise Error::LoginFailed, 'login form is not available' unless form
  form.pixiv_id = pixiv_id
  form.pass = password
  doc = agent.submit(form)
  raise Error::LoginFailed unless doc.body =~ /logout/
  @member_id = member_id_from_mypage(doc)
end

#member(member_id = member_id) ⇒ Pixiv::Member

Parameters:

  • member_id (Integer) (defaults to: member_id)

Returns:



61
62
63
64
# File 'lib/pixiv/client.rb', line 61

def member(member_id = member_id)
  attrs = {member_id: member_id}
  Member.lazy_new(attrs) { agent.get(Member.url(member_id)) }
end