the_tv_db 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +1 -1
- data/lib/the_tv_db/client.rb +1 -1
- data/lib/the_tv_db/episode.rb +35 -35
- data/lib/the_tv_db/model.rb +14 -4
- data/lib/the_tv_db/response/unzip.rb +4 -19
- data/lib/the_tv_db/series.rb +45 -36
- data/lib/the_tv_db/utils/zip.rb +36 -0
- data/lib/the_tv_db/version.rb +1 -1
- data/lib/the_tv_db.rb +2 -2
- data/spec/the_tv_db/episode_spec.rb +2 -2
- data/spec/the_tv_db/series_spec.rb +6 -3
- data/the_tv_db.gemspec +3 -3
- metadata +18 -18
- data/lib/the_tv_db/core_ext/string.rb +0 -12
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# TheTvDB [![Build Status](https://travis-ci.org/jassa/the_tv_db.png)](https://travis-ci.org/jassa/the_tv_db) [![Dependency Status](https://gemnasium.com/jassa/the_tv_db.png)](https://gemnasium.com/jassa/the_tv_db)
|
1
|
+
# TheTvDB [![Build Status](https://travis-ci.org/jassa/the_tv_db.png)](https://travis-ci.org/jassa/the_tv_db) [![Dependency Status](https://gemnasium.com/jassa/the_tv_db.png)](https://gemnasium.com/jassa/the_tv_db) [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/jassa/the_tv_db)
|
2
2
|
|
3
3
|
Ruby API Client for TheTvDB.com
|
4
4
|
|
data/lib/the_tv_db/client.rb
CHANGED
data/lib/the_tv_db/episode.rb
CHANGED
@@ -2,6 +2,40 @@ module TheTvDB
|
|
2
2
|
class Episode < API
|
3
3
|
include Model
|
4
4
|
|
5
|
+
ATTRS_MAP = {
|
6
|
+
:id => "id",
|
7
|
+
:absolute_number => "absolute_number",
|
8
|
+
:airs_after_season => "airsafter_season",
|
9
|
+
:airs_before_episode => "airsbefore_episode",
|
10
|
+
:airs_before_season => "airsbefore_season",
|
11
|
+
:combined_episode_number => "Combined_episodenumber",
|
12
|
+
:combined_season => "Combined_season",
|
13
|
+
:director => "Director",
|
14
|
+
:dvd_chapter => "DVD_chapter",
|
15
|
+
:dvd_disc_id => "DVD_discid",
|
16
|
+
:dvd_episode_number => "DVD_episodenumber",
|
17
|
+
:dvd_season => "DVD_season",
|
18
|
+
:ep_img_flag => "EpImgFlag",
|
19
|
+
:name => "EpisodeName",
|
20
|
+
:number => "EpisodeNumber",
|
21
|
+
:filename => "filename",
|
22
|
+
:first_aired => "FirstAired",
|
23
|
+
:guest_stars => "GuestStars",
|
24
|
+
:imdb_id => "IMDB_ID",
|
25
|
+
:language => "Language",
|
26
|
+
:last_updated => "lastupdated",
|
27
|
+
:overview => "Overview",
|
28
|
+
:production_code => "ProductionCode",
|
29
|
+
:rating => "Rating",
|
30
|
+
:rating_count => "RatingCount",
|
31
|
+
:season_id => "seasonid",
|
32
|
+
:season_number => "SeasonNumber",
|
33
|
+
:series_id => "seriesid",
|
34
|
+
:writer => "Writer"
|
35
|
+
}.freeze
|
36
|
+
|
37
|
+
attr_accessor *ATTRS_MAP.keys
|
38
|
+
|
5
39
|
class << self
|
6
40
|
|
7
41
|
# Public: Find an episode by air date.
|
@@ -43,39 +77,5 @@ module TheTvDB
|
|
43
77
|
alias :get :find
|
44
78
|
end
|
45
79
|
|
46
|
-
|
47
|
-
:id => "id",
|
48
|
-
:absolute_number => "absolute_number",
|
49
|
-
:airs_after_season => "airsafter_season",
|
50
|
-
:airs_before_episode => "airsbefore_episode",
|
51
|
-
:airs_before_season => "airsbefore_season",
|
52
|
-
:combined_episode_number => "Combined_episodenumber",
|
53
|
-
:combined_season => "Combined_season",
|
54
|
-
:director => "Director",
|
55
|
-
:dvd_chapter => "DVD_chapter",
|
56
|
-
:dvd_disc_id => "DVD_discid",
|
57
|
-
:dvd_episode_number => "DVD_episodenumber",
|
58
|
-
:dvd_season => "DVD_season",
|
59
|
-
:ep_img_flag => "EpImgFlag",
|
60
|
-
:name => "EpisodeName",
|
61
|
-
:number => "EpisodeNumber",
|
62
|
-
:filename => "filename",
|
63
|
-
:first_aired => "FirstAired",
|
64
|
-
:guest_stars => "GuestStars",
|
65
|
-
:imdb_id => "IMDB_ID",
|
66
|
-
:language => "Language",
|
67
|
-
:last_updated => "lastupdated",
|
68
|
-
:overview => "Overview",
|
69
|
-
:production_code => "ProductionCode",
|
70
|
-
:rating => "Rating",
|
71
|
-
:rating_count => "RatingCount",
|
72
|
-
:season_id => "seasonid",
|
73
|
-
:season_number => "SeasonNumber",
|
74
|
-
:series_id => "seriesid",
|
75
|
-
:writer => "Writer"
|
76
|
-
}.freeze
|
77
|
-
|
78
|
-
attr_accessor *ATTRS_MAP.keys
|
79
|
-
|
80
|
-
end # Series
|
80
|
+
end # Episode
|
81
81
|
end # TheTvDB
|
data/lib/the_tv_db/model.rb
CHANGED
@@ -3,15 +3,17 @@ module TheTvDB
|
|
3
3
|
|
4
4
|
attr_accessor :klass
|
5
5
|
|
6
|
-
def initialize(params=nil)
|
6
|
+
def initialize(params=nil, &block)
|
7
7
|
@klass = self.class
|
8
8
|
self.attributes = params
|
9
|
+
|
10
|
+
self.instance_eval(&block) if block_given?
|
9
11
|
end
|
10
12
|
|
11
13
|
def attributes=(params=nil)
|
12
14
|
params.each do |attr, value|
|
13
15
|
begin
|
14
|
-
self.public_send("#{
|
16
|
+
self.public_send("#{attributes_map.key(attr)}=", value)
|
15
17
|
rescue NoMethodError
|
16
18
|
raise UnknownAttributeError, "unknown attribute: #{attr}"
|
17
19
|
end
|
@@ -20,7 +22,7 @@ module TheTvDB
|
|
20
22
|
|
21
23
|
def attributes
|
22
24
|
attrs = {}
|
23
|
-
|
25
|
+
class_attributes.each do |name|
|
24
26
|
attrs[name] = send(name)
|
25
27
|
end
|
26
28
|
attrs
|
@@ -28,7 +30,7 @@ module TheTvDB
|
|
28
30
|
|
29
31
|
def inspect
|
30
32
|
inspection = unless id.nil?
|
31
|
-
|
33
|
+
class_attributes.collect { |name|
|
32
34
|
"#{name}: #{attribute_for_inspect(name)}"
|
33
35
|
}.compact.join(", ")
|
34
36
|
else
|
@@ -49,5 +51,13 @@ module TheTvDB
|
|
49
51
|
end
|
50
52
|
end
|
51
53
|
|
54
|
+
def attributes_map
|
55
|
+
klass::ATTRS_MAP
|
56
|
+
end
|
57
|
+
|
58
|
+
def class_attributes
|
59
|
+
attributes_map.keys
|
60
|
+
end
|
61
|
+
|
52
62
|
end # Model
|
53
63
|
end # TheTvDB
|
@@ -1,27 +1,12 @@
|
|
1
|
-
require 'zip/zip'
|
2
|
-
|
3
1
|
module TheTvDB
|
4
2
|
class Response::Unzip < Faraday::Response::Middleware
|
5
3
|
|
6
4
|
def on_complete(env)
|
7
|
-
|
8
|
-
|
9
|
-
end
|
10
|
-
|
11
|
-
def unzip(body)
|
12
|
-
zipped = Tempfile.new('thetvdb.com')
|
13
|
-
begin
|
14
|
-
zipped.write(body.force_encoding("utf-8"))
|
15
|
-
unzipped = ::Zip::ZipFile.new(zipped)
|
16
|
-
files = {}
|
17
|
-
unzipped.each do |file|
|
18
|
-
files[file.name] = file.get_input_stream.read
|
19
|
-
end
|
20
|
-
files
|
21
|
-
ensure
|
22
|
-
zipped.close
|
23
|
-
zipped.unlink
|
5
|
+
if env[:response_headers]["content-type"] == "application/zip"
|
6
|
+
env[:body] = TheTvDB::Zip.inflate(env[:body])
|
24
7
|
end
|
8
|
+
|
9
|
+
super
|
25
10
|
end
|
26
11
|
|
27
12
|
end # Response::Unzip
|
data/lib/the_tv_db/series.rb
CHANGED
@@ -1,42 +1,6 @@
|
|
1
1
|
module TheTvDB
|
2
2
|
class Series < API
|
3
3
|
include Model
|
4
|
-
|
5
|
-
class << self
|
6
|
-
def search(name, lang="en")
|
7
|
-
data = request("GetSeries.php", { seriesname: name, language: lang })["Data"]
|
8
|
-
return [] if data.nil?
|
9
|
-
|
10
|
-
series = data["Series"]
|
11
|
-
|
12
|
-
case series
|
13
|
-
when Hash
|
14
|
-
[ Series::Collection.new(series) ]
|
15
|
-
when Array
|
16
|
-
series.collect { |serie| Series::Collection.new(serie) }
|
17
|
-
else
|
18
|
-
[]
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def find(id, lang="en")
|
23
|
-
if TheTvDB.api_key
|
24
|
-
files = request("#{TheTvDB.api_key}/series/#{id}/all/#{lang}.zip")
|
25
|
-
data = files["#{lang}.xml"].fetch("Data")
|
26
|
-
record = new(data["Series"])
|
27
|
-
record.episodes = data["Episode"]
|
28
|
-
record.banners = files["banners.xml"]["Banners"]["Banner"]
|
29
|
-
record.actors = files["actors.xml"]["Actors"]["Actor"]
|
30
|
-
else
|
31
|
-
data = request("/data/series/#{id}/all/").fetch("Data")
|
32
|
-
record = new(data["Series"])
|
33
|
-
record.episodes = data["Episode"]
|
34
|
-
end
|
35
|
-
|
36
|
-
return record
|
37
|
-
end
|
38
|
-
alias :get :find
|
39
|
-
end
|
40
4
|
|
41
5
|
ATTRS_MAP = {
|
42
6
|
:id => "id",
|
@@ -67,6 +31,51 @@ module TheTvDB
|
|
67
31
|
}.freeze
|
68
32
|
|
69
33
|
attr_accessor *ATTRS_MAP.keys, :episodes, :banners, :actors
|
34
|
+
|
35
|
+
class << self
|
36
|
+
def search(name, lang="en")
|
37
|
+
data = request("GetSeries.php", { seriesname: name, language: lang })["Data"]
|
38
|
+
return [] if data.nil?
|
39
|
+
|
40
|
+
series = data["Series"]
|
41
|
+
|
42
|
+
case series
|
43
|
+
when Hash
|
44
|
+
[ Series::Collection.new(series) ]
|
45
|
+
when Array
|
46
|
+
series.collect { |serie| Series::Collection.new(serie) }
|
47
|
+
else
|
48
|
+
[]
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def find(id, lang="en")
|
53
|
+
format = TheTvDB.api_key ? :zip : :xml
|
54
|
+
send("get_#{format}_by_id", id, lang)
|
55
|
+
end
|
56
|
+
alias :get :find
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def get_xml_by_id(id, lang)
|
61
|
+
data = request("/data/series/#{id}/all/").fetch("Data")
|
62
|
+
record = new(data["Series"]) do |r|
|
63
|
+
r.episodes = data["Episode"]
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def get_zip_by_id(id, lang)
|
68
|
+
files = request("#{TheTvDB.api_key}/series/#{id}/all/#{lang}.zip")
|
69
|
+
data = files["#{lang}.xml"].fetch("Data")
|
70
|
+
record = new(data["Series"]) do |r|
|
71
|
+
r.episodes = data["Episode"]
|
72
|
+
r.banners = files["banners.xml"]["Banners"]["Banner"]
|
73
|
+
r.actors = files["actors.xml"]["Actors"]["Actor"]
|
74
|
+
end
|
75
|
+
rescue ::Zip::ZipError
|
76
|
+
get_xml_by_id(id, lang)
|
77
|
+
end
|
78
|
+
end
|
70
79
|
|
71
80
|
def episodes=(episodes)
|
72
81
|
@episodes = case episodes
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'zip/zip'
|
2
|
+
|
3
|
+
module TheTvDB
|
4
|
+
module Zip
|
5
|
+
|
6
|
+
class << self
|
7
|
+
|
8
|
+
# Decompresses string.
|
9
|
+
def inflate(string)
|
10
|
+
entries = {}
|
11
|
+
deflated = deflate(string)
|
12
|
+
deflated.each do |entry|
|
13
|
+
entries[entry.name] = entry.get_input_stream.read
|
14
|
+
end
|
15
|
+
entries
|
16
|
+
ensure
|
17
|
+
tmp.close
|
18
|
+
tmp.unlink
|
19
|
+
end
|
20
|
+
|
21
|
+
# Compresses the given string.
|
22
|
+
def deflate(string)
|
23
|
+
tmp.write(string.force_encoding("utf-8"))
|
24
|
+
::Zip::ZipFile.new(tmp)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def tmp
|
30
|
+
@tmp ||= Tempfile.new('thetvdb.com')
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end # Zip
|
36
|
+
end # TheTvDB
|
data/lib/the_tv_db/version.rb
CHANGED
data/lib/the_tv_db.rb
CHANGED
@@ -13,11 +13,11 @@ describe TheTvDB::Episode do
|
|
13
13
|
let(:episodes) { api.episodes.find("82066", "2012-11-16") }
|
14
14
|
|
15
15
|
it "returns an array" do
|
16
|
-
episodes == Array
|
16
|
+
episodes.class.should == Array
|
17
17
|
end
|
18
18
|
|
19
19
|
it "instantiates episode objects" do
|
20
|
-
episodes.first == TheTvDB::Episode
|
20
|
+
episodes.first.class.should == TheTvDB::Episode
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
@@ -4,6 +4,7 @@ describe TheTvDB::Series do
|
|
4
4
|
let(:api) { TheTvDB.new }
|
5
5
|
|
6
6
|
context ".search" do
|
7
|
+
|
7
8
|
it "returns an empty array when no results" do
|
8
9
|
stub_get("GetSeries.php?language=en&seriesname=asdf").
|
9
10
|
to_return(:status => 200, :body => fixture("series/empty.xml"))
|
@@ -43,10 +44,12 @@ describe TheTvDB::Series do
|
|
43
44
|
end
|
44
45
|
|
45
46
|
context "when api key is provided" do
|
46
|
-
before
|
47
|
-
body = TheTvDB::Response::Unzip.new.unzip(fixture("series/en.zip"))
|
47
|
+
before :all do
|
48
48
|
stub_get("ASDF01234F0AF1368/series/82066/all/en.zip").
|
49
|
-
to_return(:status => 200,
|
49
|
+
to_return(:status => 200,
|
50
|
+
:body => fixture("series/en.zip"),
|
51
|
+
:headers => { "content-type" => "application/zip" })
|
52
|
+
|
50
53
|
api = TheTvDB.new(:api_key => "ASDF01234F0AF1368")
|
51
54
|
@series = api.series.find("82066")
|
52
55
|
end
|
data/the_tv_db.gemspec
CHANGED
@@ -18,10 +18,10 @@ Gem::Specification.new do |gem|
|
|
18
18
|
gem.require_paths = ["lib"]
|
19
19
|
|
20
20
|
gem.add_dependency "faraday", "~> 0.8.4"
|
21
|
-
gem.add_dependency "ox", "~> 1.6.
|
21
|
+
gem.add_dependency "ox", "~> 1.6.8"
|
22
22
|
gem.add_dependency "multi_xml", "~> 0.5.1"
|
23
23
|
gem.add_dependency "rubyzip", "~> 0.9.9"
|
24
24
|
|
25
|
-
gem.add_development_dependency "rspec", "~> 2.
|
26
|
-
gem.add_development_dependency "webmock", "~> 1.
|
25
|
+
gem.add_development_dependency "rspec", "~> 2.12.0"
|
26
|
+
gem.add_development_dependency "webmock", "~> 1.9.0"
|
27
27
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: the_tv_db
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: faraday
|
16
|
-
requirement: &
|
16
|
+
requirement: &70353122973600 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,21 +21,21 @@ dependencies:
|
|
21
21
|
version: 0.8.4
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70353122973600
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: ox
|
27
|
-
requirement: &
|
27
|
+
requirement: &70353122973100 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: 1.6.
|
32
|
+
version: 1.6.8
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70353122973100
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: multi_xml
|
38
|
-
requirement: &
|
38
|
+
requirement: &70353122972640 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 0.5.1
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70353122972640
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rubyzip
|
49
|
-
requirement: &
|
49
|
+
requirement: &70353122972180 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,29 +54,29 @@ dependencies:
|
|
54
54
|
version: 0.9.9
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70353122972180
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rspec
|
60
|
-
requirement: &
|
60
|
+
requirement: &70353122971720 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
64
64
|
- !ruby/object:Gem::Version
|
65
|
-
version: 2.
|
65
|
+
version: 2.12.0
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70353122971720
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: webmock
|
71
|
-
requirement: &
|
71
|
+
requirement: &70353122971260 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ~>
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
version: 1.
|
76
|
+
version: 1.9.0
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70353122971260
|
80
80
|
description: Ruby API Client for TheTvDB.com
|
81
81
|
email:
|
82
82
|
- javier@tractical.com
|
@@ -95,7 +95,6 @@ files:
|
|
95
95
|
- lib/the_tv_db/api.rb
|
96
96
|
- lib/the_tv_db/client.rb
|
97
97
|
- lib/the_tv_db/connection.rb
|
98
|
-
- lib/the_tv_db/core_ext/string.rb
|
99
98
|
- lib/the_tv_db/episode.rb
|
100
99
|
- lib/the_tv_db/errors.rb
|
101
100
|
- lib/the_tv_db/model.rb
|
@@ -105,6 +104,7 @@ files:
|
|
105
104
|
- lib/the_tv_db/response/xmlize.rb
|
106
105
|
- lib/the_tv_db/series.rb
|
107
106
|
- lib/the_tv_db/series/collection.rb
|
107
|
+
- lib/the_tv_db/utils/zip.rb
|
108
108
|
- lib/the_tv_db/version.rb
|
109
109
|
- spec/fixtures/episodes/air_date.xml
|
110
110
|
- spec/fixtures/episodes/api_key.xml
|
@@ -1,12 +0,0 @@
|
|
1
|
-
class String
|
2
|
-
# Makes an underscored, lowercase form from the expression in the string.
|
3
|
-
def underscore
|
4
|
-
word = self.dup
|
5
|
-
word.gsub!('::', '/')
|
6
|
-
word.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
|
7
|
-
word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
8
|
-
word.tr!("-", "_")
|
9
|
-
word.downcase!
|
10
|
-
word
|
11
|
-
end
|
12
|
-
end
|