jikan.rb 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/Gemfile.lock +2 -2
- data/README.md +56 -13
- data/lib/jikan.rb +21 -0
- data/lib/jikan/anime.rb +10 -2
- data/lib/jikan/api.rb +7 -2
- data/lib/jikan/entity.rb +7 -3
- data/lib/jikan/manga.rb +8 -0
- data/lib/jikan/query.rb +1 -1
- data/lib/jikan/search.rb +31 -5
- data/lib/jikan/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bae09e79312c387a9c47086ef0dee5abfbdcf30b5a64a3f1a30912f7ef879d4f
|
4
|
+
data.tar.gz: 5b59b649df57bc6eb1901fff87d9fed194fdab9380bae9fec5f3c1d74f71b480
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d5ab097f9f58bfb558c3d62251e0697e64a07969be2a1cfaef8d7d1b5a1a285e5e54bef9f7a2c9fa88d7558d7c3ec307ef2af8ea905672eff202e7f46e0f73b4
|
7
|
+
data.tar.gz: 85f55c4e65258b4e6f341220553c680120995db31617d8a5af9226c5d9a1d4ec726fcfc5c79fad76d61bbd511c7285a0a5bc7158c47e5d0511c674d6b0dadac9
|
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# Jikan.rb
|
2
2
|
|
3
|
+
[![Build Status](https://img.shields.io/travis/Zerocchi/jikan.rb.svg)](https://github.com/Zerocchi/jikan.rb/tree/master) [![Gem Version](https://img.shields.io/gem/v/jikan.rb.svg)](https://rubygems.org/gems/jikan.rb) [![Total Downloads](https://img.shields.io/gem/dt/jikan.rb.svg?colorB=6495ed)](https://rubygems.org/gems/jikan.rb) [![License MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://opensource.org/licenses/mit-license.php) [![Dart](https://img.shields.io/badge/language-Ruby-red.svg)](https://www.ruby-lang.org/)
|
4
|
+
|
3
5
|
This is a thin Ruby wrapper for [jikan.me](http://jikan.me) inspired by [JikanPy](https://github.com/AWConant/jikanpy). For more information, please refer to [Jikan.ME documentation](https://jikan.me/docs).
|
4
6
|
|
5
7
|
## Installation
|
6
8
|
|
7
|
-
**NOTE: This does not work yet until the gem is uploaded.**
|
8
|
-
|
9
9
|
Add this line to your application's Gemfile:
|
10
10
|
|
11
11
|
```ruby
|
12
|
-
gem 'jikan'
|
12
|
+
gem 'jikan.rb'
|
13
13
|
```
|
14
14
|
|
15
15
|
And then execute:
|
@@ -18,19 +18,26 @@ And then execute:
|
|
18
18
|
|
19
19
|
Or install it yourself as:
|
20
20
|
|
21
|
-
$ gem install jikan
|
21
|
+
$ gem install jikan.rb
|
22
22
|
|
23
23
|
## Usage
|
24
24
|
|
25
|
+
```diff
|
26
|
+
- NOTE: As per documentation there's a rate limit of 2000 requests per IP per day, and two concurrent requests
|
27
|
+
- per second. This wrapper does not have any attempt of blocking the limit so please use it wisely.
|
28
|
+
- More information available at https://jikan.docs.apiary.io/#introduction/information
|
29
|
+
```
|
30
|
+
|
25
31
|
**Get anime and manga information based on their ID**
|
26
32
|
|
27
33
|
```ruby
|
28
34
|
# https://myanimelist.net/anime/34798/Yuru_Camp
|
29
35
|
>> qry = Jikan::Query.new
|
30
|
-
=>
|
36
|
+
=> <Jikan::Query:0x026ed9d0>
|
31
37
|
|
32
38
|
>> yurucamp = qry.anime_id 34798 # manga_id for manga
|
33
|
-
#
|
39
|
+
>> yurucamp = Jikan::anime 34798 # shortcut method without instaniating Query object, both are valid
|
40
|
+
# You can also specify flag as second parameter to get more information
|
34
41
|
# >> yurucamp = qry.anime_id 34798, :episodes
|
35
42
|
# All flags are symbol, please refer https://jikan.me/docs#chaining-methods to see all available flags
|
36
43
|
=> <Jikan::Anime:0x0168c4e0>
|
@@ -58,12 +65,12 @@ Or install it yourself as:
|
|
58
65
|
```ruby
|
59
66
|
# https://myanimelist.net/character/16521/Kagome_Ikaruga
|
60
67
|
>> qry = Jikan::Query.new
|
61
|
-
=>
|
68
|
+
=> <Jikan::Query:0x027554b8>
|
62
69
|
|
63
70
|
>> ikaruga = qry.character_id 16521
|
64
|
-
=>
|
71
|
+
=> <Jikan::Character:0x0134b080>
|
65
72
|
|
66
|
-
>> ikaruga.raw # only raw method is available for now for both character and
|
73
|
+
>> ikaruga.raw # only raw method is available for now for both character and person
|
67
74
|
=>{
|
68
75
|
"mal_id"=>16521,
|
69
76
|
"link_canonical"=>"https://myanimelist.net/character/16521/Kagome_Ikaruga",
|
@@ -79,12 +86,12 @@ Or install it yourself as:
|
|
79
86
|
**Search**
|
80
87
|
``` ruby
|
81
88
|
>> qry = Jikan::Query.new
|
82
|
-
=>
|
89
|
+
=> <Jikan::Query:0x027d70e8>
|
83
90
|
|
84
|
-
>> railgun = qry.search("railgun", :anime) # other
|
85
|
-
=>
|
91
|
+
>> railgun = qry.search("railgun", :anime) # other flags are :manga, :character, :person
|
92
|
+
=> <Jikan::Search:0x016fd760>
|
86
93
|
|
87
|
-
>> railgun.raw #
|
94
|
+
>> railgun.raw # return raw result
|
88
95
|
=>{"result"=>
|
89
96
|
[
|
90
97
|
{
|
@@ -105,6 +112,42 @@ Or install it yourself as:
|
|
105
112
|
}
|
106
113
|
]
|
107
114
|
}
|
115
|
+
|
116
|
+
# Return each result items wrapped in their respective object
|
117
|
+
# :person and :character only return raw objects for now so this method isn't available for those flags
|
118
|
+
>> res = railgun.result
|
119
|
+
=> [<Jikan::Anime:0x0196c968>, <Jikan::Anime:0x0196c950>, <Jikan::Anime:0x019f1610>, <Jikan::Anime:0x019f15f8>, ...]
|
120
|
+
|
121
|
+
>> first_anime = res[0]
|
122
|
+
=> <Jikan::Anime:0x0196c968>
|
123
|
+
|
124
|
+
>> first_anime.title
|
125
|
+
=> "Toaru Kagaku no Railgun"
|
126
|
+
|
127
|
+
# Method name follow Jikan::Anime object so it will slighly differ from raw result keys
|
128
|
+
# e.g. raw result key is image_url but Jikan::Anime method is image.
|
129
|
+
>> first_anime.image
|
130
|
+
=> "https://myanimelist.cdn-dena.com/r/100x140/images/anime/8/53581.jpg?s=4003b92ef0e723389087b69a8a08d742"
|
131
|
+
|
132
|
+
>> first_anime.synopsis # same goes to description which is truncated in search result. We use synopsis method instead.
|
133
|
+
=> "The student-filled Academy City is at the forefront of scientific advancement and home to the esper
|
134
|
+
development program. The seven \"Level 5\" espers are the most powerful in Academy City, and ranked th..."
|
135
|
+
|
136
|
+
# Eventhough the result method return specific objects array, it is still bound to the raw result above.
|
137
|
+
# So you don't get full information the same way when you do Jikan::anime(id)
|
138
|
+
>> first_anime.opening # this will return nil because search result doesn't have opening information
|
139
|
+
=> nil
|
140
|
+
|
141
|
+
# To get detailed anime information you can assign special details method on search result object.
|
142
|
+
# This method will call Jikan::Anime(id) or equivalent and get detailed information from the API and return new object.
|
143
|
+
# You can also pass flag as you would do in normal Query or shortcut methods.
|
144
|
+
>> full_info = first_anime.details
|
145
|
+
=> <Jikan::Anime:0x01ad4170>
|
146
|
+
|
147
|
+
>> full_info.opening
|
148
|
+
>> first_anime.details.opening # shorter way but this will call the API again if you change the rightmost method
|
149
|
+
=> ["#1: \"only my railgun\" by fripSide (eps 2-14)", "#2: \"LEVEL 5 -judgelight-\" by fripSide (eps 15-23)"]
|
150
|
+
|
108
151
|
```
|
109
152
|
|
110
153
|
## To-Do
|
data/lib/jikan.rb
CHANGED
@@ -14,4 +14,25 @@ module Jikan
|
|
14
14
|
'person' => [ :pictures ],
|
15
15
|
'search' => [:anime, :manga, :person, :character]
|
16
16
|
}
|
17
|
+
|
18
|
+
# shortcut methods
|
19
|
+
def self.anime(id, flag=nil)
|
20
|
+
Jikan::Query.new.anime_id(id, flag)
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.manga(id, flag=nil)
|
24
|
+
Jikan::Query.new.manga_id(id, flag)
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.character(id, flag=nil)
|
28
|
+
Jikan::Query.new.character_id(id, flag)
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.person(id, flag=nil)
|
32
|
+
Jikan::Query.new.person_id(id, flag)
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.search(query, flag=:anime, page=1)
|
36
|
+
Jikan::Query.new.search(query, flag, page)
|
37
|
+
end
|
17
38
|
end
|
data/lib/jikan/anime.rb
CHANGED
@@ -24,7 +24,7 @@ module Jikan
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def ending
|
27
|
-
raw['
|
27
|
+
raw['ending_theme']
|
28
28
|
end
|
29
29
|
|
30
30
|
def episodes
|
@@ -35,12 +35,20 @@ module Jikan
|
|
35
35
|
raw['episode']
|
36
36
|
end
|
37
37
|
|
38
|
+
def details(flag=nil)
|
39
|
+
unless raw.has_key?('opening') || raw.has_key?('studio')
|
40
|
+
Jikan::anime id, flag
|
41
|
+
else
|
42
|
+
raise NoMethodError, "Method only available for Anime object within Jikan::Search results."
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
38
46
|
def licensor
|
39
47
|
raw['licensor']
|
40
48
|
end
|
41
49
|
|
42
50
|
def opening
|
43
|
-
raw['
|
51
|
+
raw['opening_theme']
|
44
52
|
end
|
45
53
|
|
46
54
|
def premiered
|
data/lib/jikan/api.rb
CHANGED
@@ -31,7 +31,12 @@ module Jikan
|
|
31
31
|
unless Jikan::FLAGS[@endpoint].include? @flag
|
32
32
|
raise Jikan::FlagError, 'Flag not supported'
|
33
33
|
else
|
34
|
-
|
34
|
+
# This is inconsistencies in the API.
|
35
|
+
if @flag == :anime || @flag == :manga
|
36
|
+
@url = "#{@end_url}/#{@flag.to_s}/#{@query.downcase.delete(' ')}/#{@id}"
|
37
|
+
elsif @flag == :character || @flag == :person
|
38
|
+
@url = "#{@end_url}/#{@flag.to_s}/#{@query.downcase}/#{@id}"
|
39
|
+
end
|
35
40
|
end
|
36
41
|
end
|
37
42
|
|
@@ -46,7 +51,7 @@ module Jikan
|
|
46
51
|
def get_data
|
47
52
|
res = HTTP.get(@url)
|
48
53
|
if res.status >= 400
|
49
|
-
raise ClientError, "#{res.status}: error on endpoint #{@endpoint}"
|
54
|
+
raise ClientError, "#{res.status}: error on endpoint #{@endpoint} (URL: #{@url})"
|
50
55
|
end
|
51
56
|
|
52
57
|
JSON.parse(res.body)
|
data/lib/jikan/entity.rb
CHANGED
@@ -19,8 +19,12 @@ module Jikan
|
|
19
19
|
raw['genre']
|
20
20
|
end
|
21
21
|
|
22
|
+
def id
|
23
|
+
raw['id'] || raw['mal_id']
|
24
|
+
end
|
25
|
+
|
22
26
|
def image
|
23
|
-
raw['image']
|
27
|
+
raw['image'] || raw['image_url']
|
24
28
|
end
|
25
29
|
|
26
30
|
def members
|
@@ -56,11 +60,11 @@ module Jikan
|
|
56
60
|
end
|
57
61
|
|
58
62
|
def synopsis
|
59
|
-
raw['synopsis']
|
63
|
+
raw['synopsis'] || raw['description']
|
60
64
|
end
|
61
65
|
|
62
66
|
def link
|
63
|
-
raw['link_canonical']
|
67
|
+
raw['link_canonical'] || raw['url']
|
64
68
|
end
|
65
69
|
|
66
70
|
def title
|
data/lib/jikan/manga.rb
CHANGED
@@ -9,6 +9,14 @@ module Jikan
|
|
9
9
|
raw['chapters']
|
10
10
|
end
|
11
11
|
|
12
|
+
def details(flag=nil)
|
13
|
+
unless raw.has_key?('published') || raw.has_key?('popularity')
|
14
|
+
Jikan::manga id, flag
|
15
|
+
else
|
16
|
+
raise NoMethodError, "Method only available for Manga object within Jikan::Search results."
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
12
20
|
def published
|
13
21
|
raw['published']
|
14
22
|
end
|
data/lib/jikan/query.rb
CHANGED
data/lib/jikan/search.rb
CHANGED
@@ -1,23 +1,49 @@
|
|
1
1
|
module Jikan
|
2
2
|
class Search < BaseEntity
|
3
3
|
|
4
|
+
def initialize(json, type)
|
5
|
+
super(json)
|
6
|
+
@type = type
|
7
|
+
@search = true
|
8
|
+
end
|
9
|
+
|
10
|
+
def is_search?
|
11
|
+
@search
|
12
|
+
end
|
13
|
+
|
4
14
|
def id
|
5
|
-
iter
|
15
|
+
iter { |i| i['id'] }
|
6
16
|
end
|
7
17
|
|
8
18
|
def title
|
9
|
-
iter
|
19
|
+
iter { |i| i['title'] }
|
10
20
|
end
|
11
21
|
|
12
22
|
def url
|
13
|
-
iter
|
23
|
+
iter { |i| i['url'] }
|
24
|
+
end
|
25
|
+
|
26
|
+
# returns each result items wrapped in their respective objects
|
27
|
+
def result
|
28
|
+
case @type
|
29
|
+
when :anime
|
30
|
+
iter { |i| Jikan::Anime.new(i) }
|
31
|
+
when :manga
|
32
|
+
iter { |i| Jikan::Manga.new(i) }
|
33
|
+
when :character
|
34
|
+
raise NoMethodError, "Character only return raw result for now."
|
35
|
+
when :person
|
36
|
+
raise NoMethodError, "Person only return raw result for now."
|
37
|
+
end
|
14
38
|
end
|
15
39
|
|
16
40
|
private
|
17
41
|
|
18
|
-
def iter
|
42
|
+
def iter
|
19
43
|
@raw['result'].map do |item|
|
20
|
-
|
44
|
+
if block_given?
|
45
|
+
yield item
|
46
|
+
end
|
21
47
|
end
|
22
48
|
end
|
23
49
|
end
|
data/lib/jikan/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jikan.rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zerocchi
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01
|
11
|
+
date: 2018-02-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: http
|