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: []
|