anilibria-api-ruby 1.0.0 → 1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 19108f3f24b1792bb2640d48a562bea69ff82c3d9ff3f372ae1efe7952cd8340
4
- data.tar.gz: 0eecd5734d837d98156619f3ac864fd154113478c515cfbee8535cd00af468ad
3
+ metadata.gz: 69881766a2287e012e03871b9997435a9d8f7080eed1377c267847b865c9a0be
4
+ data.tar.gz: c70122a1d4aafea3218cc3f9b9323df801289733f394e7b1f5e847dff72ea466
5
5
  SHA512:
6
- metadata.gz: 34d6bbd2917aa045c0cf7c97a98b19dd6b8e07b9cc19629e322090d978e561e6c8156e9da9c0d4f303f4fa922a0131c87ae61f91fa561aa06de1682418f11e78
7
- data.tar.gz: fceeca87a3a2bcba908deaddca452b27fe38d2e65cb527d55efab0ac8cc8284f475102be8d5264114ee606cd99dd98e83f883264291fb4da78abe1d8a6bfc8c5
6
+ metadata.gz: c25155e4d2fe623944cfa58b6b5ff8836132c4963980db42ea52cc0431301c052dd4accb81722d36d9d8faf148bd26c7d064f10bbfc92602744d13b45fa84b17
7
+ data.tar.gz: 57c3db01725fe8fc00a193269777b9d491816503b996ad105fda3c6210d1d5d9b3c6014317c8138cb8772614b982ecd209f3fe81452de6b27aa3886f84df096f
data/Gemfile CHANGED
@@ -5,5 +5,4 @@ source 'https://rubygems.org'
5
5
  gemspec
6
6
 
7
7
  gem 'rake', '~> 13.0'
8
-
9
8
  gem 'rspec', '~> 3.0'
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- anilibria-api-ruby (1.0.0)
4
+ anilibria-api-ruby (1.0.4)
5
5
  dry-struct (~> 1.4)
6
6
  faraday (~> 2)
7
7
 
data/README.md CHANGED
@@ -24,43 +24,56 @@ $ gem install anilibria-api-ruby
24
24
 
25
25
  ## Usage
26
26
 
27
+ ### Client
28
+
27
29
  Usage example:
28
30
 
29
31
  ```ruby
30
32
  require 'anilibria/api'
31
33
 
32
34
  anilibria = Anilibria::Api::Client.new
35
+ # => #<Anilibria::Api::Client:0x00007f25c52fc1b8 ...
36
+
37
+ anilibria.get_years
38
+ # => [1996, 1998, 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009, ...
33
39
 
34
- anilibria.get_years # => [1996, 1998, 2001, 2003, 2004, 2005, 2006, ...]
40
+ title = anilibria.get_title(code: 'steinsgate')
41
+ # => #<Anilibria::Api::Types::Title id=8674 code="steinsgate" ...
35
42
 
36
- title = anilibria.get_title(code: 'steinsgate') # => #<Anilibria::Api::Types::Title id=8674 code="steinsgate"...
37
- title.names.en # => "Steins;Gate"
43
+ title.names.en
44
+ # => "Steins;Gate"
38
45
  ```
39
46
 
40
47
  `anilibria` object implements [AniLibria API methods](https://github.com/anilibria/docs/blob/master/api_v2.md#method-list) as is. All methods are available in *snake_case* notation. Same with the `title` object - it implements the [Title](https://github.com/anilibria/docs/blob/master/api_v2.md#возвращаемые-значения-при-запросе-информации-о-тайтле) specification.
41
48
 
42
- ## Authorization
49
+ ### Authorization
43
50
 
44
- The client supports authorization:
51
+ The gem supports authorization:
45
52
 
46
53
  ```ruby
47
- # session = anilibria.auth('wrongemail@example.com', 'WrongPassword') # => nil
48
- # session = anilibria.auth!('wrongemail@example.com', 'WrongPassword') # raises an error Anilibria::Api::Exceptions::AuthError
49
- session = anilibria.auth('correctemail@example.com', 'CorrectPassword') # returns the session string
54
+ # session = anilibria.auth('wrong@example.com', 'WrongPassword')
55
+ # => nil
50
56
 
51
- anilibria.add_favorite(title_id: 9114, session: session) # => true
57
+ # session = anilibria.auth!('wrong@example.com', 'WrongPassword')
58
+ # raises an error Anilibria::Api::Exceptions::AuthError
52
59
 
53
- titles = anilibria.get_favorites(filter: 'id,code,names,description', session: session)
54
- # => [#<Anilibria::Api::Types::Title id=9114 code="shingeki-no-k...
60
+ session = anilibria.auth('correct@example.com', 'CorrectPassword')
61
+ # => "VdZnNZRpEl9w2HcKNRyj1BWXLqdynpog"
55
62
 
63
+ anilibria.add_favorite(title_id: 9114, session: session)
64
+ # => true
65
+
66
+ titles = anilibria.get_favorites(filter: 'id,code,names,description', session: session)
67
+ # => [#<Anilibria::Api::Types::Title id=9114 code="shingeki-no-kyojin-the-final-season-part-2" ...
56
68
  ```
57
69
 
58
- ## API Version
70
+ ### API Version
59
71
 
60
72
  You can get the currently used version of [AniLibria API](https://github.com/anilibria/docs/blob/master/api_v2.md):
61
73
 
62
74
  ```ruby
63
- anilibria.api_version # => "2.13.10"
75
+ anilibria.api_version
76
+ # => "2.13.10"
64
77
  ```
65
78
 
66
79
  ## Contributing
@@ -25,6 +25,8 @@ module Anilibria
25
25
  end
26
26
  end
27
27
 
28
+ Faraday::Utils.default_space_encoding = '%20'
29
+
28
30
  DryTypes = Types::DryTypes
29
31
 
30
32
  API_VERSION = '2.13'.freeze
@@ -39,7 +41,10 @@ module Anilibria
39
41
  attr_reader :connection
40
42
 
41
43
  def initialize(url: ENDPOINT)
42
- @connection = Faraday.new(url: url) do |f|
44
+ @connection = Faraday.new(
45
+ url: url,
46
+ headers: { 'User-Agent' => "anilibria-api-ruby/#{VERSION}" }
47
+ ) do |f|
43
48
  f.request :url_encoded
44
49
  f.response :json, parser_options: { symbolize_names: true }
45
50
  end
@@ -58,7 +63,7 @@ module Anilibria
58
63
  def auth(mail, passwd)
59
64
  response = auth_response(mail, passwd)
60
65
 
61
- return unless response[:key] == 'success'
66
+ return unless auth_successful?(response)
62
67
 
63
68
  response[:sessionId]
64
69
  end
@@ -66,34 +71,50 @@ module Anilibria
66
71
  def auth!(mail, passwd)
67
72
  response = auth_response(mail, passwd)
68
73
 
69
- raise Exceptions::AuthError, response unless response[:key] == 'success'
74
+ unless auth_successful?(response)
75
+ raise(
76
+ Exceptions::AuthError.new(response),
77
+ 'Failed authorization attempt'
78
+ )
79
+ end
70
80
 
71
81
  response[:sessionId]
72
82
  end
73
83
 
74
84
  def api_version
75
- connection.get.headers['api-version']
85
+ connection.head.headers['API-Version']
76
86
  end
77
87
 
78
88
  private
79
89
 
90
+ def check_response!(response)
91
+ return if response.status == 200
92
+
93
+ if !response.body.respond_to?(:to_hash) ||
94
+ !response.body[:error].respond_to?(:to_hash)
95
+ raise Exceptions::ResponseError.new(
96
+ 'Unexpected response from API', response
97
+ )
98
+ end
99
+
100
+ raise Exceptions::ApiError.new(response), response.body.dig(:error, :message)
101
+ end
102
+
80
103
  def auth_response(mail, passwd)
81
104
  response = connection.post(
82
105
  AUTH_ENDPOINT,
83
106
  { mail: mail, passwd: passwd }
84
107
  )
85
108
 
86
- JSON.parse(response.body, { symbolize_names: true })
87
- end
88
-
89
- def check_response!(response)
90
- return if response.status == 200
91
-
92
- if !response.body.respond_to?(:to_hash) || !response.body.key?(:error)
93
- raise Exceptions::ResponseError.new('Unexpected response from API', response)
109
+ begin
110
+ JSON.parse(response.body, { symbolize_names: true })
111
+ rescue JSON::ParserError
112
+ {}
94
113
  end
114
+ end
95
115
 
96
- raise Exceptions::ApiError, response
116
+ def auth_successful?(response)
117
+ response[:key] == 'success' && response.key?(:sessionId)
97
118
  end
98
119
  end
99
120
  end
@@ -7,7 +7,8 @@ module Anilibria
7
7
  def initialize(response)
8
8
  error = response.body[:error].to_h
9
9
  @code = error[:code]
10
- super("#{error[:code]} #{error[:message]}", response)
10
+
11
+ super(error[:message], response)
11
12
  end
12
13
  end
13
14
  end
@@ -2,14 +2,25 @@ module Anilibria
2
2
  module Api
3
3
  module Exceptions
4
4
  class AuthError < Base
5
- attr_reader :err, :key, :mes
5
+ attr_reader :data
6
+
7
+ def initialize(data = {})
8
+ @data = data
6
9
 
7
- def initialize(response_body)
8
- @err = response_body[:err]
9
- @key = response_body[:key]
10
- @mes = response_body[:mes]
11
10
  super("#{mes} (#{key})")
12
11
  end
12
+
13
+ def err
14
+ data[:err]
15
+ end
16
+
17
+ def mes
18
+ data[:mes]
19
+ end
20
+
21
+ def key
22
+ data[:key]
23
+ end
13
24
  end
14
25
  end
15
26
  end
@@ -4,9 +4,10 @@ module Anilibria
4
4
  class ResponseError < Base
5
5
  attr_reader :response
6
6
 
7
- def initialize(message, response)
7
+ def initialize(msg = nil, response = nil)
8
8
  @response = response
9
- super(message)
9
+
10
+ super(msg)
10
11
  end
11
12
  end
12
13
  end
@@ -8,12 +8,23 @@ module Anilibria
8
8
  attribute? :string, DryTypes::String.optional
9
9
  end
10
10
 
11
+ class Posters < Base
12
+ class Poster < Base
13
+ attribute? :url, DryTypes::String.optional
14
+ attribute? :raw_base64_file, DryTypes::String.optional
15
+ end
16
+
17
+ %i[small medium original].each do |size|
18
+ attribute? size, Poster
19
+ end
20
+ end
21
+
11
22
  class Player < Base
12
23
  class Playlist < Base
13
24
  attribute? :serie, DryTypes::Strict::Integer
14
25
  attribute? :created_timestamp, DryTypes::Timestamp
15
26
 
16
- attribute? :hls do
27
+ attribute? :hls, Base do
17
28
  attribute? :fhd, DryTypes::String.optional
18
29
  attribute? :hd, DryTypes::String.optional
19
30
  attribute? :sd, DryTypes::String.optional
@@ -47,7 +58,6 @@ module Anilibria
47
58
  attribute? :name, DryTypes::Strict::String
48
59
  attribute? :announce, DryTypes::Array.of(DryTypes::Strict::String)
49
60
  attribute? :created_timestamp, DryTypes::Timestamp
50
-
51
61
  attribute? :files_list, DryTypes::Array.of(FilesList)
52
62
  end
53
63
 
@@ -56,7 +66,7 @@ module Anilibria
56
66
  attribute? :torrent_id, DryTypes::Strict::Integer
57
67
  attribute? :series, Title::Series
58
68
 
59
- attribute? :quality do
69
+ attribute? :quality, Base do
60
70
  attribute? :string, DryTypes::Strict::String
61
71
  attribute? :type, DryTypes::Strict::String
62
72
  attribute? :resolution, DryTypes::Strict::Integer
@@ -82,7 +92,7 @@ module Anilibria
82
92
  attribute? :id, DryTypes::Strict::Integer
83
93
  attribute? :code, DryTypes::Strict::String
84
94
 
85
- attribute? :names do
95
+ attribute? :names, Base do
86
96
  attribute? :ru, DryTypes::String.optional
87
97
  attribute? :en, DryTypes::String.optional
88
98
  attribute? :alternative, DryTypes::String.optional
@@ -90,24 +100,16 @@ module Anilibria
90
100
 
91
101
  attribute? :announce, DryTypes::String.optional
92
102
 
93
- attribute? :status do
103
+ attribute? :status, Base do
94
104
  attribute? :string, DryTypes::Strict::String
95
105
  attribute? :code, DryTypes::Strict::Integer
96
106
  end
97
107
 
98
- attribute? :posters do
99
- %i[small medium original].each do |poster|
100
- attribute? poster do
101
- attribute? :url, DryTypes::String.optional
102
- attribute? :raw_base64_file, DryTypes::String.optional
103
- end
104
- end
105
- end
106
-
108
+ attribute? :posters, Posters
107
109
  attribute? :updated, DryTypes::Timestamp.optional
108
110
  attribute? :last_change, DryTypes::Timestamp.optional
109
111
 
110
- attribute? :type do
112
+ attribute? :type, Base do
111
113
  attribute? :full_string, DryTypes::String.optional
112
114
  attribute? :string, DryTypes::String.optional
113
115
  attribute? :length, DryTypes::String.optional
@@ -118,7 +120,7 @@ module Anilibria
118
120
  attribute? :genres, DryTypes::Array.of(DryTypes::Strict::String)
119
121
  attribute? :team, Types::Team
120
122
 
121
- attribute? :season do
123
+ attribute? :season, Base do
122
124
  attribute? :string, DryTypes::String.optional
123
125
  attribute? :code, DryTypes::Integer.optional
124
126
  attribute? :year, DryTypes::Integer.optional
@@ -128,7 +130,7 @@ module Anilibria
128
130
  attribute? :description, DryTypes::String.optional
129
131
  attribute? :in_favorites, DryTypes::Integer.optional
130
132
 
131
- attribute? :blocked do
133
+ attribute? :blocked, Base do
132
134
  attribute? :blocked, DryTypes::Strict::Bool
133
135
  attribute? :bakanim, DryTypes::Strict::Bool
134
136
  end
@@ -1,6 +1,6 @@
1
1
  module Anilibria
2
2
  module Api
3
- VERSION = '1.0.0'.freeze
3
+ VERSION = '1.0.4'.freeze
4
4
  public_constant :VERSION
5
5
  end
6
6
  end
data/sample/rss.rb ADDED
@@ -0,0 +1,14 @@
1
+ require 'anilibria/api'
2
+ require 'rss'
3
+
4
+ anilibria = Anilibria::Api::Client.new
5
+
6
+ today_ts = Date.today.to_time.to_i
7
+ raw_rss = anilibria.get_rss(since: today_ts)
8
+
9
+ feed = RSS::Parser.parse(raw_rss)
10
+
11
+ puts feed.channel.title
12
+ feed.items.each do |item|
13
+ puts "#{item.pubDate.strftime('%H:%M:%S')} | #{item.title}"
14
+ end
@@ -0,0 +1,25 @@
1
+ require 'anilibria/api'
2
+
3
+ WEEK_DAYS = %w[
4
+ Понедельник
5
+ Вторник
6
+ Среда
7
+ Четверг
8
+ Пятница
9
+ Суббота
10
+ Воскресенье
11
+ ].freeze
12
+
13
+ anilibria = Anilibria::Api::Client.new
14
+
15
+ schedules = anilibria.get_schedule(filter: 'names.ru')
16
+
17
+ schedules.each do |schedule|
18
+ puts "#{WEEK_DAYS[schedule.day]}:"
19
+
20
+ schedule.list.each do |title|
21
+ puts " #{title.names.ru}"
22
+ end
23
+
24
+ puts
25
+ end
@@ -0,0 +1,29 @@
1
+ require 'anilibria/api'
2
+
3
+ anilibria = Anilibria::Api::Client.new
4
+
5
+ limit = 10
6
+
7
+ puts 'Введите поисковый запрос:'
8
+ input = $stdin.gets.chomp
9
+ puts
10
+
11
+ titles = anilibria.search_titles(
12
+ search: input,
13
+ filter: 'id,names,season,type,team,genres[0]',
14
+ limit: limit
15
+ )
16
+
17
+ puts 'Результаты:'
18
+ puts
19
+
20
+ titles.each do |title|
21
+ puts " id: #{title.id}"
22
+ puts " #{title.names.ru} / #{title.names.en}"
23
+ puts " Сезон: #{title.season.string} #{title.season.year}"
24
+ puts " Тип: #{title.type.full_string}"
25
+ puts " Жанр: #{title.genres.join(', ')}"
26
+ puts
27
+ end
28
+
29
+ puts "Всего найдено #{titles.size}, лимит: #{limit}"
data/sample/title.rb ADDED
@@ -0,0 +1,21 @@
1
+ require 'anilibria/api'
2
+
3
+ anilibria = Anilibria::Api::Client.new
4
+
5
+ title = anilibria.get_random_title(remove: 'posters,player,torrents')
6
+ # title = anilibria.get_title(id: 495, remove: 'posters,player,torrents')
7
+
8
+ subtitle_team = title.team.translator + title.team.editing + title.team.decor
9
+
10
+ puts "#{title.names.ru} / #{title.names.en}"
11
+ puts
12
+ puts "Сезон: #{title.season.year} #{title.season.string}"
13
+ puts "Тип: #{title.type.full_string}"
14
+ puts "Жанры: #{title.genres.join(', ')}"
15
+ puts "Озвучка: #{title.team.voice.join(', ')}"
16
+ puts "Тайминг: #{title.team.timing.join(', ')}" if title.team.timing.any?
17
+ puts "Работа над субтитрами: #{subtitle_team.join(', ')}" if subtitle_team.any?
18
+ puts
19
+ puts title.description
20
+ puts
21
+ puts format('https://www.anilibria.tv/release/%<code>s.html', code: title.code)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: anilibria-api-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Roman Kozachenko
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-02-05 00:00:00.000000000 Z
11
+ date: 2022-02-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-struct
@@ -71,6 +71,10 @@ files:
71
71
  - lib/anilibria/api/types/title.rb
72
72
  - lib/anilibria/api/types/youtube.rb
73
73
  - lib/anilibria/api/version.rb
74
+ - sample/rss.rb
75
+ - sample/schedule.rb
76
+ - sample/search_titles.rb
77
+ - sample/title.rb
74
78
  homepage: https://github.com/psychosocial88/anilibria-api-ruby
75
79
  licenses:
76
80
  - MIT