pixiv_api 0.0.4

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.
Files changed (65) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +4 -0
  5. data/Gemfile +8 -0
  6. data/Guardfile +14 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +33 -0
  9. data/Rakefile +6 -0
  10. data/lib/pixiv_api.rb +22 -0
  11. data/lib/pixiv_api/array_response.rb +23 -0
  12. data/lib/pixiv_api/authentication.rb +60 -0
  13. data/lib/pixiv_api/client.rb +72 -0
  14. data/lib/pixiv_api/configuration.rb +48 -0
  15. data/lib/pixiv_api/pixiv_blob.rb +41 -0
  16. data/lib/pixiv_api/request.rb +18 -0
  17. data/lib/pixiv_api/request/favorite_users.rb +19 -0
  18. data/lib/pixiv_api/request/friends.rb +9 -0
  19. data/lib/pixiv_api/request/novels.rb +21 -0
  20. data/lib/pixiv_api/request/profiles.rb +9 -0
  21. data/lib/pixiv_api/request/promotions.rb +20 -0
  22. data/lib/pixiv_api/request/ranking.rb +9 -0
  23. data/lib/pixiv_api/request/search.rb +10 -0
  24. data/lib/pixiv_api/request/signup.rb +25 -0
  25. data/lib/pixiv_api/request/trends.rb +16 -0
  26. data/lib/pixiv_api/request/upload_work.rb +27 -0
  27. data/lib/pixiv_api/request/users.rb +13 -0
  28. data/lib/pixiv_api/request/util.rb +38 -0
  29. data/lib/pixiv_api/request/version.rb +9 -0
  30. data/lib/pixiv_api/request/works.rb +21 -0
  31. data/lib/pixiv_api/response.rb +134 -0
  32. data/lib/pixiv_api/response/action.rb +23 -0
  33. data/lib/pixiv_api/response/friend.rb +25 -0
  34. data/lib/pixiv_api/response/identity.rb +12 -0
  35. data/lib/pixiv_api/response/illustration.rb +6 -0
  36. data/lib/pixiv_api/response/manga.rb +6 -0
  37. data/lib/pixiv_api/response/novel.rb +15 -0
  38. data/lib/pixiv_api/response/pagination.rb +25 -0
  39. data/lib/pixiv_api/response/promotion.rb +11 -0
  40. data/lib/pixiv_api/response/request.rb +26 -0
  41. data/lib/pixiv_api/response/signup_validation_result.rb +7 -0
  42. data/lib/pixiv_api/response/tag.rb +9 -0
  43. data/lib/pixiv_api/response/ugoira.rb +18 -0
  44. data/lib/pixiv_api/response/upload_status.rb +7 -0
  45. data/lib/pixiv_api/response/upload_token.rb +7 -0
  46. data/lib/pixiv_api/response/user.rb +15 -0
  47. data/lib/pixiv_api/response/version.rb +7 -0
  48. data/lib/pixiv_api/response/work.rb +46 -0
  49. data/lib/pixiv_api/version.rb +3 -0
  50. data/pixiv_api.gemspec +32 -0
  51. data/spec/pixiv_api/authentication_spec.rb +57 -0
  52. data/spec/pixiv_api/client_spec.rb +28 -0
  53. data/spec/pixiv_api/configuration_spec.rb +41 -0
  54. data/spec/pixiv_api/pixiv_blob_spec.rb +23 -0
  55. data/spec/pixiv_api/request/favorite_users_spec.rb +47 -0
  56. data/spec/pixiv_api/request/friends_spec.rb +14 -0
  57. data/spec/pixiv_api/request/novels_spec.rb +37 -0
  58. data/spec/pixiv_api/request/profiles_spec.rb +13 -0
  59. data/spec/pixiv_api/request/signup_spec.rb +76 -0
  60. data/spec/pixiv_api/request/upload_work_spec.rb +41 -0
  61. data/spec/pixiv_api/request/users_spec.rb +32 -0
  62. data/spec/pixiv_api/request/works_spec.rb +16 -0
  63. data/spec/pixiv_api/version_spec.rb +7 -0
  64. data/spec/pixiv_api_spec.rb +8 -0
  65. metadata +275 -0
@@ -0,0 +1,9 @@
1
+ module PixivApi
2
+ module Request
3
+ module Profiles
4
+ def profiles(*args)
5
+ unsupported!('me/profile/contacts')
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,20 @@
1
+ module PixivApi
2
+ module Request
3
+ module Promotions
4
+ def promotions(site_id:, **args)
5
+ args.merge!(site_id: site_id)
6
+ objects_from_response(Response::Promotion, :get, '/v1/me/promotions.json', args)
7
+ end
8
+
9
+ def update_promotions(site_id:, **args)
10
+ args.merge!(site_id: site_id)
11
+ action_from_response(Response::Promotion, :put, '/v1/me/promotions.json', args)
12
+ end
13
+
14
+ def delete_promotions(site_id:, **args)
15
+ args.merge!(site_id: site_id)
16
+ action_from_response(Response::Promotion, :delete, '/v1/me/promotions.json', args)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,9 @@
1
+ module PixivApi
2
+ module Request
3
+ module Ranking
4
+ def ranking_novel(*args)
5
+ objects_from_response(Response::Novel, :get, '/v1/ranking/novel.json', args.extract_options!)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ module PixivApi
2
+ module Request
3
+ module Search
4
+ def search_works(q:, sort:, **args)
5
+ args.merge!(q: q, sort: sort)
6
+ objects_from_response(Response::Work, :get, '/v1/search/works.json', args)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,25 @@
1
+ module PixivApi
2
+ module Request
3
+ module Signup
4
+ def signup_validation_send_mail(*args)
5
+ object_from_response(Response::SignupValidationResult, :get, 'v1/signup_validation/send_mail', args.extract_options!)
6
+ end
7
+
8
+ def signup_send_mail(*args)
9
+ object_from_response(Response::SignupValidationResult, :post, 'v1/signup/send_mail', args.extract_options!)
10
+ end
11
+
12
+ def signup_validation_check_code(*args)
13
+ object_from_response(Response::SignupValidationResult, :get, 'v1/signup_validation/check_code', args.extract_options!)
14
+ end
15
+
16
+ def signup_validation(*args)
17
+ object_from_response(Response::SignupValidationResult, :get, 'v1/signup_validation', args.extract_options!)
18
+ end
19
+
20
+ def signup(*args)
21
+ object_from_response(Response::SignupValidationResult, :post, 'v1/signup', args.extract_options!)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,16 @@
1
+ module PixivApi
2
+ module Request
3
+ module Trends
4
+ def trend_works(*args)
5
+ objects_from_response(Response::Work, :get, '/v1/trends/works.json', args.extract_options!)
6
+ end
7
+
8
+ def trend_tags(*args)
9
+ raise PixivApi::Client::UnsupportedApiError, 'route of /v1/trends/tags.json is deprecated.'
10
+
11
+ # arguments = Arguments.new(args)
12
+ # objects_from_response(Response::Tag, :get, '/v1/trends/tags.json', arguments.options)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,27 @@
1
+ require 'mime/types'
2
+
3
+ module PixivApi
4
+ module Request
5
+ module UploadWork
6
+ def upload(files:, type:, age_limit:, sexual:, **args)
7
+ options = {
8
+ body: args.merge(
9
+ {
10
+ type: type,
11
+ age_limit: age_limit,
12
+ sexual: sexual,
13
+ files: files,
14
+ }
15
+ )
16
+ }
17
+
18
+ object_from_response(Response::UploadToken, :post, '/v1/upload/works', options)
19
+ end
20
+
21
+ def upload_status(upload_token:)
22
+ options = { params: { upload_token: upload_token } }
23
+ object_from_response(Response::UploadStatus, :get, "/v1/upload/works/status.json", options)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,13 @@
1
+ module PixivApi
2
+ module Request
3
+ module Users
4
+ def me(*args)
5
+ object_from_response(Response::User, :get, '/v1/me.json', *args)
6
+ end
7
+
8
+ def user(user_id:, **args)
9
+ object_from_response(Response::User, :get, "/v1/users/#{user_id}.json", *args)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,38 @@
1
+ require 'active_support'
2
+ require 'active_support/core_ext/hash/slice'
3
+
4
+ module PixivApi
5
+ module Request
6
+ module Util
7
+ def object_from_response(klass, http_method, path, *opts)
8
+ response = request(http_method, path, *opts)
9
+ parsed = response.parsed['response']
10
+ parsed = parsed[0] if parsed.is_a?(Array)
11
+
12
+ klass.from_response(response, parsed)
13
+ end
14
+
15
+ def objects_from_response(klass, http_method, path, *opts)
16
+ response = request(http_method, path, *opts)
17
+ objects_from_array(response, klass, response.parsed['response'] || [])
18
+ end
19
+
20
+ def action_from_response(http_method, path, *opts)
21
+ response = request(http_method, path, *opts)
22
+ Response::Action.from_response(response)
23
+ end
24
+
25
+ private
26
+
27
+ def objects_from_array(response, klass, array)
28
+ ArrayResponse.from_response(response, klass, array)
29
+ end
30
+
31
+ def request(http_method, path, *opts)
32
+ options = opts.extract_options!
33
+
34
+ public_send(http_method, path, options.slice(:params, :body))
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,9 @@
1
+ module PixivApi
2
+ module Request
3
+ module Version
4
+ def version(*)
5
+ object_from_response(Response::Version, :get, '/v1/version.json')
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,21 @@
1
+ module PixivApi
2
+ module Request
3
+ module Works
4
+ def my_works(*args)
5
+ objects_from_response(Response::Work, :get, '/v1/me/works.json', args.extract_options!)
6
+ end
7
+
8
+ def works(*args)
9
+ objects_from_response(Response::Work, :get, '/v1/works.json', args.extract_options!)
10
+ end
11
+
12
+ def user_works(user_id:, **args)
13
+ objects_from_response(Response::Work, :get, '/v1/me/works.json', args)
14
+ end
15
+
16
+ def work(id:, **args)
17
+ object_from_response(Response::Work, :get, "/v1/works/#{id}.json", args)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,134 @@
1
+ require 'memoizable'
2
+ require 'active_support/core_ext/hash/indifferent_access'
3
+
4
+ module PixivApi
5
+ class Response
6
+ autoload :Action, 'pixiv_api/response/action'
7
+ autoload :User, 'pixiv_api/response/user'
8
+ autoload :Identity, 'pixiv_api/response/identity'
9
+ autoload :Work, 'pixiv_api/response/work'
10
+ autoload :Novel, 'pixiv_api/response/novel'
11
+ autoload :Manga, 'pixiv_api/response/manga'
12
+ autoload :Illustration, 'pixiv_api/response/illustration'
13
+ autoload :Tag, 'pixiv_api/response/tag'
14
+ autoload :Ugoira, 'pixiv_api/response/ugoira'
15
+ autoload :Friend, 'pixiv_api/response/friend'
16
+ autoload :Promotion, 'pixiv_api/response/promotion'
17
+ autoload :Pagination, 'pixiv_api/response/pagination'
18
+ autoload :Request, 'pixiv_api/response/request'
19
+ autoload :SignupValidationResult, 'pixiv_api/response/signup_validation_result'
20
+ autoload :Version, 'pixiv_api/response/version'
21
+ autoload :UploadToken, 'pixiv_api/response/upload_token'
22
+ autoload :UploadStatus, 'pixiv_api/response/upload_status'
23
+
24
+ include Memoizable
25
+ extend Forwardable
26
+
27
+ attr_reader :attributes, :response
28
+ alias_method :to_h, :attributes
29
+
30
+ def_delegators :@attributes, :fetch, :slice, :values_at
31
+
32
+ class << self
33
+ def from_response(response, *attributes)
34
+ new(response, *attributes)
35
+ end
36
+
37
+ def attr_reader(*attributes)
38
+ attributes.each do |attr|
39
+ define_attribute_method(attr)
40
+ define_predicate_method(attr)
41
+ end
42
+ end
43
+
44
+ def define_attribute_method(key1, klass = nil, key2 = nil)
45
+ define_method(key1) do
46
+ if klass.nil?
47
+ @attributes[key1]
48
+ else
49
+ if @attributes[key1]
50
+ dup = attributes_for_object(key1, key2)
51
+ klass.new(@response, dup)
52
+ else
53
+ nil
54
+ end
55
+ end
56
+ end
57
+
58
+ memoize(key1)
59
+ end
60
+
61
+ def define_attributes_method(key1, klass = nil, key2 = nil)
62
+ define_method(key1) do
63
+ if klass.nil?
64
+ @attributes[key1]
65
+ else
66
+ @attributes[key1].map do |attr|
67
+ dup = attributes_for_object(key1, key2)
68
+ klass.new(@response, dup)
69
+ end
70
+ end
71
+ end
72
+
73
+ memoize(key1)
74
+ end
75
+
76
+ def define_time_method(*attributes)
77
+ attributes.each do |attr|
78
+ define_method(attr) do
79
+ Time.parse(@attributes[attr])
80
+ end
81
+
82
+ memoize(attr)
83
+ end
84
+ end
85
+
86
+ def define_blob_method(key)
87
+ method_name = :"blob_#{key}"
88
+
89
+ define_method method_name do
90
+ fetch(key, {}).each_with_object({}) do |(key, value), memo|
91
+ memo[key] = PixivApi::PixivBlob.new(value)
92
+ end
93
+ end
94
+
95
+ memoize(method_name)
96
+ end
97
+
98
+ private
99
+
100
+ def define_predicate_method(key1, key2 = key1)
101
+ predicate_method = :"#{key1}?"
102
+
103
+ define_method(predicate_method) do ||
104
+ !!@attributes[key2]
105
+ end
106
+
107
+ memoize(predicate_method)
108
+ end
109
+ end
110
+
111
+ def initialize(response, attributes = {})
112
+ @response = response
113
+ @request = PixivApi::Response::Request.new(response)
114
+ @attributes = attributes.with_indifferent_access
115
+ end
116
+
117
+ def [](method)
118
+ public_send(method.to_sym)
119
+ rescue NoMethodError
120
+ nil
121
+ end
122
+
123
+ private
124
+
125
+ def attributes_for_object(key1, key2=nil)
126
+ if key2.nil?
127
+ @attributes[key1]
128
+ else
129
+ attributes = @attributes.dup
130
+ attributes.delete(key1).merge(key2 => attributes)
131
+ end
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,23 @@
1
+ module PixivApi
2
+ class Response
3
+ class Action < Response
4
+ attr_reader :status
5
+
6
+ def self.from_response(response)
7
+ new(response, response.parsed)
8
+ end
9
+
10
+ def errors
11
+ fetch('errors', {})
12
+ end
13
+
14
+ def success?
15
+ status == 'success'
16
+ end
17
+
18
+ def failure?
19
+ !success?
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,25 @@
1
+ module PixivApi
2
+ class Response
3
+ class Friend < Identity
4
+ attr_reader :id, :account, :user_id, :name
5
+
6
+ define_blob_method :profile_image_urls
7
+
8
+ def initialize(response, attributes)
9
+ user_id = attributes['user'].delete('id')
10
+
11
+ merged = attributes['user'].merge(
12
+ id: attributes['id'],
13
+ user_id: user_id
14
+ )
15
+
16
+ super(response, merged)
17
+ end
18
+
19
+ def avatar_url
20
+ blob_profile_image_urls['px_50x50']
21
+ end
22
+ memoize(:avatar_url)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,12 @@
1
+ module PixivApi
2
+ class Response
3
+ class Identity < Response
4
+ attr_reader :id
5
+
6
+ def initialize(*)
7
+ super
8
+ @attributes.fetch(:id)
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,6 @@
1
+ module PixivApi
2
+ class Response
3
+ class Illustration < Work
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module PixivApi
2
+ class Response
3
+ class Manga < Work
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,15 @@
1
+ module PixivApi
2
+ class Response
3
+ class Novel < Identity
4
+ attr_reader :id, :title, :caption, :tags, :stats,
5
+ :publicity, :age_limit, :is_liked, :favorite_id,
6
+ :page_count, :text_length, :series, :body
7
+
8
+ define_attribute_method :user, Response::User
9
+
10
+ define_blob_image_method :image_urls
11
+
12
+ define_time_method :created_time, :reuploaded_time
13
+ end
14
+ end
15
+ end