tvmaze 0.1.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ca56db2f1cf308965c20e266099aa5acf89d47a9
4
+ data.tar.gz: 4ab426ae40a5819ebb420742badc692acdaaca3b
5
+ SHA512:
6
+ metadata.gz: bc1c8ae0ae4bab97d438e9ec3ea4e3faa143e951fb5cd2773e0cfca2ab87c8858a05cdedfbbb6f4bfec8dcb5079ba37f1545bbc7048aca8d99f7ce216dd40675
7
+ data.tar.gz: 3930d6f29dd378d164c7b96bdb7ff3397a32f79651ef29b9e7caf43c627c95b772bcb13852e61e2e65389edadee92cb376a57d6b744b37f7d3f5ab698dfeb834
@@ -0,0 +1,26 @@
1
+ require 'rest-client'
2
+ require 'json'
3
+ require 'tvmaze/show'
4
+ require 'tvmaze/episode'
5
+ require 'tvmaze/season'
6
+
7
+ module TVMaze
8
+ @@api_base = 'http://api.tvmaze.com'
9
+
10
+ def self.request(path, params = {})
11
+ url = @@api_base + path
12
+ res = RestClient.get(url, params: params) do |response, request, result, &block|
13
+ case response.code
14
+ when 200
15
+ response.return!(request, result, &block)
16
+ when 401
17
+ fail TVMaze::Unauthorized
18
+ when 403
19
+ fail TVMaze::Forbidden
20
+ when 404
21
+ fail TVMaze::NotFound
22
+ end
23
+ end
24
+ JSON.parse(res)
25
+ end
26
+ end
@@ -0,0 +1,29 @@
1
+ module TVMaze
2
+ class Episode
3
+ EPISODE_MAPPING = { id: :id, url: :url, name: :name, season: :season,
4
+ number: :number, airtime: :airtime, runtime: :runtime,
5
+ summary: :summary }
6
+
7
+ EPISODE_MAPPING.values.each do |value|
8
+ attr_accessor value
9
+ end
10
+
11
+ attr_accessor :image_medium, :image_original, :airdate, :airstamp
12
+
13
+ def initialize(json = {})
14
+ return if json.nil?
15
+
16
+ EPISODE_MAPPING.each do |source, destination|
17
+ send("#{destination}=", json[source.to_s] || json[source.to_sym])
18
+ end
19
+
20
+ @airdate = Date.parse(json['airdate']) unless json['airdate'].nil?
21
+ @airstamp = DateTime.parse(json['airstamp']) unless json['airstamp'].nil?
22
+
23
+ unless json['image'].nil?
24
+ @image_original = json['image']['original']
25
+ @image_medium = json['image']['medium']
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,24 @@
1
+ module TVMaze
2
+ class Season
3
+ attr_accessor :number, :episodes
4
+
5
+ def initialize
6
+ @episodes = []
7
+ end
8
+
9
+ def self.from_episodes(episodes)
10
+ seasons = []
11
+ episodes.each do |e|
12
+ next if e.season.nil?
13
+ season = seasons.find { |s| s.number == e.season }
14
+ if season.nil?
15
+ season = Season.new
16
+ season.number = e.season
17
+ seasons << season
18
+ end
19
+ season.episodes << e
20
+ end
21
+ seasons
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,78 @@
1
+ module TVMaze
2
+ class Show
3
+ SHOW_MAPPING = { id: :id, url: :url, name: :name, type: :type,
4
+ language: :language, genres: :genres, status: :status,
5
+ runtime: :runtime, premiered: :premiered,
6
+ schedule: :schedule, rating: :rating, weight: :weight,
7
+ network: :network, webChannel: :web_channel,
8
+ summary: :summary, updated: :updated }
9
+
10
+ SHOW_MAPPING.values.each do |value|
11
+ attr_accessor value
12
+ end
13
+
14
+ attr_accessor :next_episode, :episodes, :image_medium, :image_original,
15
+ :seasons
16
+
17
+ def initialize(json = {})
18
+ @seasons = []
19
+ @episodes = []
20
+
21
+ return if json.nil?
22
+ SHOW_MAPPING.each do |source, destination|
23
+ send("#{destination}=", json[source.to_s] || json[source.to_sym])
24
+ end
25
+
26
+ unless json['image'].nil?
27
+ @image_original = json['image']['original']
28
+ @image_medium = json['image']['medium']
29
+ end
30
+
31
+ unless json['_embedded'].nil?
32
+ embedded_json = json['_embedded']
33
+ @next_episode = TVMaze::Episode.new(embedded_json['nextepisode'])
34
+ @episodes = parse_episodes(embedded_json['episodes'])
35
+ @seasons = parse_seasons(@episodes)
36
+ end
37
+ end
38
+
39
+ def self.search(query = '', params = {})
40
+ params[:q] = query.to_s.strip
41
+ result = TVMaze.request('/search/shows', params)
42
+ build_search_results(result)
43
+ end
44
+
45
+ def self.find(id, params = {})
46
+ embed = params.delete(:embed)
47
+ embed ||= []
48
+ result = TVMaze.request(find_url(id, embed), params)
49
+ Show.new(result)
50
+ end
51
+
52
+ protected
53
+
54
+ def self.find_url(id, embeds_array = [])
55
+ url = "/shows/#{id}"
56
+
57
+ prefix = 'embed'
58
+ prefix << '[]' if embeds_array.count > 1
59
+ query = embeds_array.map { |e| prefix + '=' + e }.join('&')
60
+
61
+ [url, query].compact.join('?')
62
+ end
63
+
64
+ def self.build_search_results(search_results_json)
65
+ search_results_json.map { |entry_json| Show.new(entry_json['show']) }
66
+ end
67
+
68
+ def parse_episodes(json_array)
69
+ return [] if json_array.nil? || json_array.count == 0
70
+ json_array.map { |episode_json| TVMaze::Episode.new(episode_json) }
71
+ end
72
+
73
+ def parse_seasons(json_array)
74
+ return [] if json_array.nil? || json_array.count == 0
75
+ TVMaze::Season.from_episodes(json_array)
76
+ end
77
+ end
78
+ end
metadata ADDED
@@ -0,0 +1,89 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tvmaze
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ivan Parfenchuk
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-11-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rest-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.8.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.8.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: factory_girl
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: tvmaze is a small wrapper around TVmaze API (http://api.tvmaze.com/).
56
+ email: uson1x@gmail.com
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - lib/tvmaze.rb
62
+ - lib/tvmaze/episode.rb
63
+ - lib/tvmaze/season.rb
64
+ - lib/tvmaze/show.rb
65
+ homepage: http://rubygems.org/gems/tvmaze
66
+ licenses:
67
+ - MIT
68
+ metadata: {}
69
+ post_install_message:
70
+ rdoc_options: []
71
+ require_paths:
72
+ - lib
73
+ required_ruby_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ required_rubygems_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ requirements: []
84
+ rubyforge_project:
85
+ rubygems_version: 2.4.8
86
+ signing_key:
87
+ specification_version: 4
88
+ summary: TVmaze API wrapper.
89
+ test_files: []