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.
- checksums.yaml +7 -0
- data/lib/tvmaze.rb +26 -0
- data/lib/tvmaze/episode.rb +29 -0
- data/lib/tvmaze/season.rb +24 -0
- data/lib/tvmaze/show.rb +78 -0
- metadata +89 -0
checksums.yaml
ADDED
@@ -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
|
data/lib/tvmaze.rb
ADDED
@@ -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
|
data/lib/tvmaze/show.rb
ADDED
@@ -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: []
|