thetvdb_api 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +72 -1
  3. data/lib/thetvdb_api.rb +4 -1
  4. data/lib/thetvdb_api/actor.rb +2 -2
  5. data/lib/thetvdb_api/banner.rb +2 -2
  6. data/lib/thetvdb_api/base.rb +30 -9
  7. data/lib/thetvdb_api/episode.rb +10 -10
  8. data/lib/thetvdb_api/mappers/actor.rb +17 -0
  9. data/lib/thetvdb_api/mappers/actors.rb +10 -0
  10. data/lib/thetvdb_api/mappers/banner.rb +32 -0
  11. data/lib/thetvdb_api/mappers/banners.rb +10 -0
  12. data/lib/thetvdb_api/mappers/base.rb +13 -0
  13. data/lib/thetvdb_api/mappers/episode.rb +32 -0
  14. data/lib/thetvdb_api/mappers/full_series.rb +12 -0
  15. data/lib/thetvdb_api/mappers/search_episode.rb +10 -0
  16. data/lib/thetvdb_api/mappers/search_series.rb +10 -0
  17. data/lib/thetvdb_api/mappers/search_series/series.rb +25 -0
  18. data/lib/thetvdb_api/mappers/series.rb +37 -0
  19. data/lib/thetvdb_api/mappers/update.rb +14 -0
  20. data/lib/thetvdb_api/mappers/update/banner.rb +19 -0
  21. data/lib/thetvdb_api/mappers/update/element.rb +10 -0
  22. data/lib/thetvdb_api/mappers/update/episode.rb +8 -0
  23. data/lib/thetvdb_api/mappers/update/series.rb +8 -0
  24. data/lib/thetvdb_api/response.rb +30 -0
  25. data/lib/thetvdb_api/search.rb +8 -8
  26. data/lib/thetvdb_api/series.rb +4 -4
  27. data/lib/thetvdb_api/update.rb +42 -8
  28. data/lib/thetvdb_api/version.rb +1 -1
  29. data/spec/integrations/actor_spec.rb +1 -1
  30. data/spec/integrations/banner_spec.rb +1 -1
  31. data/spec/integrations/client_spec.rb +16 -16
  32. data/spec/integrations/episode_spec.rb +4 -4
  33. data/spec/integrations/search_spec.rb +5 -5
  34. data/spec/integrations/series_spec.rb +2 -2
  35. data/spec/integrations/update_spec.rb +10 -4
  36. data/spec/spec_helper.rb +4 -0
  37. data/spec/thetvdb_api/base_spec.rb +39 -7
  38. data/spec/thetvdb_api/episode_spec.rb +4 -4
  39. data/spec/thetvdb_api/mappers/actor_spec.rb +15 -0
  40. data/spec/thetvdb_api/mappers/banner_spec.rb +31 -0
  41. data/spec/thetvdb_api/mappers/search_series/series_spec.rb +15 -0
  42. data/spec/thetvdb_api/mappers/series_spec.rb +31 -0
  43. data/spec/thetvdb_api/mappers/update/banner_spec.rb +15 -0
  44. data/spec/thetvdb_api/response_spec.rb +60 -0
  45. data/spec/thetvdb_api/search_spec.rb +13 -13
  46. data/spec/thetvdb_api/series_spec.rb +6 -6
  47. data/spec/thetvdb_api/update_spec.rb +24 -0
  48. data/thetvdb_api.gemspec +2 -1
  49. metadata +48 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 35bc99ae409ce0fdba0ddbdd73f4ac36efbd54a2
4
- data.tar.gz: 26f99748d70ae7a86306f5f795013fe14c90c11e
3
+ metadata.gz: 85d1ce2f2bb54573fe303c0ec2bdf4c00c3ca8b0
4
+ data.tar.gz: 5fd366803383b832fe7ce43733ddbd2b9e6ee593
5
5
  SHA512:
6
- metadata.gz: 159ee305365dc047e9312107e81168ccb9001492cfa2097b6efb25d5b34a45359d8ea4a042197dbf54e887c75e3a731715b75e6a12df547011205e355cb223c1
7
- data.tar.gz: 4a2d708ed8cc0e28f70938cf948dd1fa17481dfc7a82bf41fbd9d90f52f893e85ed49a3e87b146bcfe348c6b71b621c5219659aefea9bbb8f50298ba2d004806
6
+ metadata.gz: 3ad836dd05a2e2936e516742d35c9c7ca3379190058878c38dcc0614b0b426857ee494bb8cfe5d100af97f0e423f18e8ce72b1369b74a605ac6d339b3c354f6e
7
+ data.tar.gz: 5727390c2cc4016737ce73be4ce21b529894082334d07f8cc97ccc7058ae234d9e1991529b8275fb5c12e42e604da54a5cc660911d17925543fb0269e85a59ff
data/README.md CHANGED
@@ -41,7 +41,7 @@ client = ThetvdbApi::Client.new
41
41
  client.search.get_series('buffy')
42
42
  client.search.get_series_by_imdb_id('...')
43
43
  client.search.get_series_by_zap2it_id('...')
44
- client.search.get_episode_by_air_date('123', air_date)
44
+ client.search.get_episode('123', air_date)
45
45
  ```
46
46
 
47
47
  Search series by id
@@ -86,6 +86,77 @@ client.update.month
86
86
  client.update.all
87
87
  ```
88
88
 
89
+ ThetvdbApi return response class with pure xml (in body method) string fetched by Faraday, but it can be automatically mapped to Object. I have prepared some class for it which using happymapper gem. You should pass mapper options at the end of method arguments.
90
+
91
+ ```ruby
92
+ require 'thetvdb_api/mappers/update'
93
+ client = ThetvdbApi::Client.new
94
+ client.update.day(mapper: ThetvdbApi::Mappers::Update)
95
+ ```
96
+
97
+ ## Mappers for:
98
+
99
+ ### Search
100
+ ```ruby
101
+ require 'thetvdb_api/mappers/search_series'
102
+ client = ThetvdbApi::Client.new
103
+ client.search.get_series('buffy', mapper: ThetvdbApi::Mappers::SearchSeries)
104
+ client.search.get_series_by_imdb_id('...', mapper: ThetvdbApi::Mappers::SearchSeries)
105
+ client.search.get_series_by_zap2it_id('...', mapper: ThetvdbApi::Mappers::SearchSeries)
106
+ ```
107
+
108
+ ```ruby
109
+ require 'thetvdb_api/mappers/search_episode'
110
+ client = ThetvdbApi::Client.new
111
+ client.search.get_episode('123', air_date, mapper: ThetvdbApi::Mappers::SearchEpisode)
112
+ ```
113
+
114
+ ### Series
115
+ ```ruby
116
+ require 'thetvdb_api/mappers/series'
117
+ client = ThetvdbApi::Client.new
118
+ client.series.find('123', mapper: ThetvdbApi::Mappers::Series)
119
+ ```
120
+
121
+ ```ruby
122
+ require 'thetvdb_api/mappers/full_series'
123
+ client = ThetvdbApi::Client.new
124
+ client.series.find_full('123', mapper: ThetvdbApi::Mappers::FullSeries)
125
+ ```
126
+
127
+ ### Actors
128
+ ```ruby
129
+ require 'thetvdb_api/mappers/actors'
130
+ client = ThetvdbApi::Client.new
131
+ client.actor.all(series_id, mapper: ThetvdbApi::Mappers::Actors)
132
+ ```
133
+
134
+ ### Banners
135
+ ```ruby
136
+ require 'thetvdb_api/mappers/banners'
137
+ client = ThetvdbApi::Client.new
138
+ client.banner.all(series_id, mapper: ThetvdbApi::Mappers::Banners)
139
+ ```
140
+
141
+ ### Episodes
142
+ ```ruby
143
+ require 'thetvdb_api/mappers/episode'
144
+ client = ThetvdbApi::Client.new
145
+ client.episode.find_by_default_order(series_id, season, episode, mapper: ThetvdbApi::Mappers::Episode)
146
+ client.episode.find_by_dvd_order(series_id, season, episode, mapper: ThetvdbApi::Mappers::Episode)
147
+ client.episode.find_by_absolute_order(series_id, absolute, mapper: ThetvdbApi::Mappers::Episode)
148
+ client.episode.find(episode_id, mapper: ThetvdbApi::Mappers::Episode)
149
+ ```
150
+
151
+ ### Updates
152
+ ```ruby
153
+ require 'thetvdb_api/mappers/update'
154
+ client = ThetvdbApi::Client.new
155
+ client.update.day(mapper: ThetvdbApi::Mappers::Update)
156
+ ```
157
+
158
+ You can write own mappers which parse xml and convert it to hash. Remember that your class must have "parse" class method.
159
+
89
160
  ## Contributing
90
161
 
91
162
  1. Fork it
data/lib/thetvdb_api.rb CHANGED
@@ -1,7 +1,10 @@
1
- module ThetvdbApi; end
1
+ module ThetvdbApi
2
+ module Mappers; end
3
+ end
2
4
 
3
5
  require 'thetvdb_api/version'
4
6
  require 'thetvdb_api/configuration'
7
+ require 'thetvdb_api/response'
5
8
  require 'thetvdb_api/client'
6
9
  require 'thetvdb_api/base'
7
10
  require 'thetvdb_api/search'
@@ -1,5 +1,5 @@
1
1
  class ThetvdbApi::Actor < ThetvdbApi::Base
2
- def find(series_id)
3
- get("#{series_uri}/actors.xml").params(series_id: series_id).response
2
+ def find(series_id, options = {})
3
+ get("#{series_uri}/actors.xml").params({ series_id: series_id }.merge(options)).response
4
4
  end
5
5
  end
@@ -1,5 +1,5 @@
1
1
  class ThetvdbApi::Banner < ThetvdbApi::Base
2
- def find(series_id)
3
- get("#{series_uri}/banners.xml").params(series_id: series_id).response
2
+ def find(series_id, options = {})
3
+ get("#{series_uri}/banners.xml").params({ series_id: series_id }.merge(options)).response
4
4
  end
5
5
  end
@@ -1,33 +1,40 @@
1
- require 'httparty'
1
+ require 'faraday'
2
2
  require 'uri_template'
3
3
 
4
4
  class ThetvdbApi::Base
5
- include HTTParty
6
- base_uri 'http://thetvdb.com/api/'
7
-
8
5
  def initialize(client)
9
6
  @client = client
10
7
  @params = {}
8
+ @mapper = nil
9
+ end
10
+
11
+ def connection
12
+ @connection ||= Faraday.new(url: base_url)
11
13
  end
12
14
 
13
15
  def get(uri)
14
16
  @uri_template = URITemplate.new(uri)
15
-
16
17
  self
17
18
  end
18
19
 
19
20
  def params(options)
20
- @params = options
21
-
21
+ @mapper = options.delete(:mapper)
22
+ @params = { language: @client.language }.merge(options)
22
23
  self
23
24
  end
24
25
 
25
26
  def response
26
- @uri_template ? self.class.get(uri, body: @options) : nil
27
+ assert_uri_template
28
+ ThetvdbApi::Response.new(connection.get(uri, @options), @mapper)
27
29
  end
28
30
 
29
31
  def prepare_uri
30
- @uri_template ? @uri_template.expand(@params.merge(api_key: @client.api_key)) : nil
32
+ assert_uri_template
33
+ @uri_template.expand(@params.merge(api_key: api_key))
34
+ end
35
+
36
+ def url
37
+ "#{base_url}#{uri}"
31
38
  end
32
39
 
33
40
  def uri
@@ -49,4 +56,18 @@ class ThetvdbApi::Base
49
56
  def language
50
57
  @client.language
51
58
  end
59
+
60
+ def api_key
61
+ @client.api_key
62
+ end
63
+
64
+ private
65
+
66
+ def assert_uri_template
67
+ raise "Path doesn't exists, use get(path) to setup path for request" unless @uri_template
68
+ end
69
+
70
+ def base_url
71
+ 'http://thetvdb.com/api/'
72
+ end
52
73
  end
@@ -1,23 +1,23 @@
1
1
  class ThetvdbApi::Episode < ThetvdbApi::Base
2
- def find_by_default_order(series_id, season, episode, language = self.language)
3
- find_by_order('default', series_id, season, episode, language)
2
+ def find_by_default_order(series_id, season, episode, options = {})
3
+ find_by_order('default', series_id, season, episode, options)
4
4
  end
5
5
 
6
- def find_by_dvd_order(series_id, season, episode, language = self.language)
7
- find_by_order('dvd', series_id, season, episode, language)
6
+ def find_by_dvd_order(series_id, season, episode, options = {})
7
+ find_by_order('dvd', series_id, season, episode, options)
8
8
  end
9
9
 
10
- def find_by_absolute_order(series_id, absolute, language = self.language)
10
+ def find_by_absolute_order(series_id, absolute, options = {})
11
11
  get("#{series_uri}/absolute/{absolute}/{language}.xml").
12
- params(series_id: series_id, absolute: absolute, language: language).response
12
+ params({ series_id: series_id, absolute: absolute }.merge(options)).response
13
13
  end
14
14
 
15
- def find(episode_id, language = self.language)
16
- get("{api_key}/episodes/{episode_id}/{language}.xml").params(episode_id: episode_id, language: language).response
15
+ def find(episode_id, options = {})
16
+ get("{api_key}/episodes/{episode_id}/{language}.xml").params({ episode_id: episode_id }.merge(options)).response
17
17
  end
18
18
 
19
- def find_by_order(order, series_id, season, episode, language)
19
+ def find_by_order(order, series_id, season, episode, options)
20
20
  get("#{series_uri}/{order}/{season}/{episode}/{language}.xml").
21
- params(series_id: series_id, season: season, episode: episode, language: language, order: order).response
21
+ params({ series_id: series_id, season: season, episode: episode, order: order }.merge(options)).response
22
22
  end
23
23
  end
@@ -0,0 +1,17 @@
1
+ require 'happymapper'
2
+
3
+ class ThetvdbApi::Mappers::Actor
4
+ include HappyMapper
5
+
6
+ tag 'Actor'
7
+
8
+ element :id, Integer
9
+ element :image_path, String, tag: 'Image'
10
+ element :name, String, tag: 'Name'
11
+ element :role, String, tag: 'Role'
12
+ element :sort_order, Integer, tag: 'SortOrder'
13
+
14
+ def image_url
15
+ image_path ? "http://thetvdb.com/banners/#{image_path}" : nil
16
+ end
17
+ end
@@ -0,0 +1,10 @@
1
+ require 'happymapper'
2
+ require 'thetvdb_api/mappers/actor'
3
+
4
+ class ThetvdbApi::Mappers::Actors
5
+ include HappyMapper
6
+
7
+ tag 'Actors'
8
+
9
+ has_many :actors, ThetvdbApi::Mappers::Actor, tag: 'Actor'
10
+ end
@@ -0,0 +1,32 @@
1
+ require 'happymapper'
2
+
3
+ class ThetvdbApi::Mappers::Banner
4
+ include HappyMapper
5
+
6
+ tag 'Banner'
7
+
8
+ element :id, Integer
9
+ element :path, String, tag: 'BannerPath'
10
+ element :thumbnail_path, String, tag: 'ThumbnailPath'
11
+ element :vignette_path, String, tag: 'VignettePath'
12
+ element :type, String, tag: 'BannerType'
13
+ element :type2, String, tag: 'BannerType2'
14
+ element :language, String, tag: 'Language'
15
+ element :season, Integer, tag: 'Season'
16
+ element :rating, Float, tag: 'Rating'
17
+ element :rating_count, Integer, tag: 'RatingCount'
18
+ element :series_name, String, tag: 'SeriesName'
19
+ element :colors, String, tag: 'Colors'
20
+
21
+ def url
22
+ path ? "http://thetvdb.com/banners/#{path}" : nil
23
+ end
24
+
25
+ def thumbnail_url
26
+ thumbnail_path ? "http://thetvdb.com/banners/#{thumbnail_path}" : nil
27
+ end
28
+
29
+ def vignette_url
30
+ vignette_path ? "http://thetvdb.com/banners/#{vignette_path}" : nil
31
+ end
32
+ end
@@ -0,0 +1,10 @@
1
+ require 'happymapper'
2
+ require 'thetvdb_api/mappers/banner'
3
+
4
+ class ThetvdbApi::Mappers::Banners
5
+ include HappyMapper
6
+
7
+ tag 'Banners'
8
+
9
+ has_many :banners, ThetvdbApi::Mappers::Banner, tag: 'Banner'
10
+ end
@@ -0,0 +1,13 @@
1
+ require 'happymapper'
2
+
3
+ class ThetvdbApi::Mappers::Base
4
+ include HappyMapper
5
+
6
+ element :id, Integer
7
+ element :first_aired, Date, tag: 'FirstAired'
8
+ element :imdb_id, String, tag: 'IMDB_ID'
9
+ element :language, String, tag: 'Language'
10
+ element :overview, String, tag: 'Overview'
11
+ element :rating, Float, tag: 'Rating'
12
+ element :rating_count, Integer, tag: 'RatingCount'
13
+ end
@@ -0,0 +1,32 @@
1
+ require 'happymapper'
2
+ require 'base'
3
+
4
+ class ThetvdbApi::Mappers::Episode < ThetvdbApi::Mappers::Base
5
+ tag 'Episode'
6
+
7
+ element :combined_episode_number, Integer, tag: 'Combined_episodenumber'
8
+ element :combined_season, Integer, tag: 'Combined_season'
9
+ element :dvd_chapter, String, tag: 'DVD_chapter'
10
+ element :dvd_discid, String, tag: 'DVD_discid'
11
+ element :dvd_episodenumber, String, tag: 'DVD_episodenumber'
12
+ element :dvd_season, String, tag: 'DVD_season'
13
+ element :director, String, tag: 'Director'
14
+ element :ep_img_flag, Integer, tag: 'EpImgFlag'
15
+ element :name, String, tag: 'EpisodeName'
16
+ element :number, String, tag: 'EpisodeNumber'
17
+ element :guest_stars, String, tag: 'GuestStars'
18
+ element :production_code, String, tag: 'ProductionCode'
19
+ element :season_number, Integer, tag: 'SeasonNumber'
20
+ element :writer, String, tag: 'Writer'
21
+ element :absolute_number, Integer
22
+ element :airs_after_season, Integer, tag: 'airsafter_season'
23
+ element :airs_before_episode, Integer, tag: 'airsbefore_episode'
24
+ element :airs_before_season, Integer, tag: 'airsbefore_season'
25
+ element :filename, String
26
+ element :last_updated_timestamp, Integer, tag: 'lastupdated'
27
+ element :season_id, Integer, tag: 'seasonid'
28
+ element :series_id, Integer, tag: 'seriesid'
29
+ element :thumb_added_at, Time, tag: 'thumb_added'
30
+ element :thumb_height, Integer
31
+ element :thumb_width, Integer
32
+ end
@@ -0,0 +1,12 @@
1
+ require 'happymapper'
2
+ require 'thetvdb_api/mappers/episode'
3
+ require 'thetvdb_api/mappers/series'
4
+
5
+ class ThetvdbApi::Mappers::FullSeries
6
+ include HappyMapper
7
+
8
+ tag 'Data'
9
+
10
+ element :series, ThetvdbApi::Mappers::Series, tag: 'Series'
11
+ has_many :episodes, ThetvdbApi::Mappers::Episode, tag: 'Episodes'
12
+ end
@@ -0,0 +1,10 @@
1
+ require 'happymapper'
2
+ require 'episode'
3
+
4
+ class ThetvdbApi::Mappers::SearchEpisode
5
+ include HappyMapper
6
+
7
+ tag 'Data'
8
+
9
+ has_many :series, ThetvdbApi::Mappers::Episode, tag: 'Episode'
10
+ end
@@ -0,0 +1,10 @@
1
+ require 'happymapper'
2
+ require 'search_series/series'
3
+
4
+ class ThetvdbApi::Mappers::SearchSeries
5
+ include HappyMapper
6
+
7
+ tag 'Data'
8
+
9
+ has_many :series, ThetvdbApi::Mappers::SearchSeries::Series, tag: 'Series'
10
+ end
@@ -0,0 +1,25 @@
1
+ require 'happymapper'
2
+
3
+ class ThetvdbApi::Mappers::SearchSeries
4
+ class Series
5
+ include HappyMapper
6
+
7
+ tag 'Series'
8
+
9
+ element :id, Integer
10
+ element :series_id, Integer, tag: 'seriesid'
11
+ element :language, String
12
+ element :name, String, tag: 'SeriesName'
13
+ element :aliases, String, tag: 'AliasNames'
14
+ element :banner_path, String, tag: 'banner'
15
+ element :overview, String, tag: 'Overview'
16
+ element :first_aired, Date
17
+ element :imdb_id, String, tag: 'IMDB_ID'
18
+ element :zap2it_id, String
19
+ element :network, String, tag: 'Network'
20
+
21
+ def banner_url
22
+ banner_path ? "http://thetvdb.com/banners/#{banner_path}" : nil
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,37 @@
1
+ require 'happymapper'
2
+ require 'base'
3
+
4
+ class ThetvdbApi::Mappers::Series < ThetvdbApi::Mappers::Base
5
+ tag 'Series'
6
+
7
+ element :actors, String, tag: 'Actors'
8
+ element :airs_day_of_week, String, tag: 'Airs_DayOfWeek'
9
+ element :airs_time, String, tag: 'Airs_Time'
10
+ element :content_rating, String, tag: 'ContentRating'
11
+ element :genres, String, tag: 'Genre'
12
+ element :network, String, targ: 'Network'
13
+ element :network_id, Integer, targ: 'NetworkID'
14
+ element :runtime, Integer, tag: 'Runtime'
15
+ element :series_id, Integer, tag: 'SeriesID'
16
+ element :name, String, tag: 'SeriesName'
17
+ element :status, String, tag: 'Status'
18
+ element :added_at, Time, tag: 'added'
19
+ element :added_by, Integer, tag: 'adddedBy'
20
+ element :banner_path, String, tag: 'banner'
21
+ element :fanart_path, String, tag: 'fanart'
22
+ element :last_updated_timestamp, Integer, tag: 'lastupdated'
23
+ element :poster_path, String, tag: 'posters'
24
+ element :zap2it_id, String
25
+
26
+ def banner_url
27
+ banner_path ? "http://thetvdb.com/banners/#{banner_path}" : nil
28
+ end
29
+
30
+ def fanart_url
31
+ fanart_path ? "http://thetvdb.com/banners/#{fanart_path}" : nil
32
+ end
33
+
34
+ def poster_url
35
+ poster_path ? "http://thetvdb.com/banners/#{poster_path}" : nil
36
+ end
37
+ end