the_tv_db 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/.rspec +2 -0
- data/README.md +33 -1
- data/lib/the_tv_db/api.rb +21 -0
- data/lib/the_tv_db/client.rb +17 -0
- data/lib/the_tv_db/connection.rb +25 -0
- data/lib/the_tv_db/core_ext/string.rb +12 -0
- data/lib/the_tv_db/episode.rb +81 -0
- data/lib/the_tv_db/errors.rb +18 -0
- data/lib/the_tv_db/model.rb +53 -0
- data/lib/the_tv_db/response/xmlize.rb +26 -0
- data/lib/the_tv_db/response.rb +24 -0
- data/lib/the_tv_db/series/collection.rb +20 -0
- data/lib/the_tv_db/series.rb +75 -0
- data/lib/the_tv_db/version.rb +1 -1
- data/lib/the_tv_db.rb +33 -2
- data/spec/fixtures/episodes/air_date.xml +5 -0
- data/spec/fixtures/episodes/api_key.xml +7 -0
- data/spec/fixtures/episodes/result.xml +30 -0
- data/spec/fixtures/episodes/series_id.xml +5 -0
- data/spec/fixtures/series/404.html +39 -0
- data/spec/fixtures/series/empty.xml +2 -0
- data/spec/fixtures/series/find.xml +751 -0
- data/spec/fixtures/series/result.xml +14 -0
- data/spec/fixtures/series/results.xml +28 -0
- data/spec/spec_helper.rb +32 -0
- data/spec/the_tv_db/episode_spec.rb +65 -0
- data/spec/the_tv_db/series_spec.rb +42 -0
- data/spec/the_tv_db/the_tv_db_spec.rb +15 -0
- data/the_tv_db.gemspec +11 -3
- metadata +111 -7
data/.gitignore
CHANGED
data/.rspec
ADDED
data/README.md
CHANGED
@@ -16,7 +16,39 @@ And then execute:
|
|
16
16
|
|
17
17
|
## Usage
|
18
18
|
|
19
|
-
|
19
|
+
```ruby
|
20
|
+
require "the_tv_db"
|
21
|
+
|
22
|
+
api = TheTvDB.new
|
23
|
+
|
24
|
+
# You can search for a series name
|
25
|
+
api.series.search("Fringe")
|
26
|
+
=> [#<TheTvDB::Series::Collection id: "82066", api_id: "82066", banner: "graphical/82066-g38.jpg", first_aired: "2008-08-26", imdb_id: "tt1119644", name: "Fringe", language: "en", overview: "The series follows a Federal Bureau of Investigatio...", zap2it_id: "SH01059103">]
|
27
|
+
|
28
|
+
# Once you have the series ID you can use it to find its full information
|
29
|
+
series = api.series.find("82066")
|
30
|
+
=> #<TheTvDB::Series id: "82066", actors: "|Anna Torv|Joshua Jackson|John Noble|Jasika Nicole|...", added: nil, added_by: nil, airs_day_of_week: "Friday", airs_time: "9:00 PM", banner: "graphical/82066-g38.jpg", content_rating: "TV-14", fanart: "fanart/original/82066-78.jpg", first_aired: "2008-08-26", genre: "|Drama|Science-Fiction|", imdb_id: "tt1119644", language: "en", last_updated: "1351221356", network: "FOX", network_id: nil, overview: "The series follows a Federal Bureau of Investigatio...", rating: "8.7", rating_count: "571", runtime: "60", poster: "posters/82066-53.jpg", series_id: "75146", series_name: "Fringe", status: "Continuing", zap2it_id: "SH01059103">
|
31
|
+
|
32
|
+
## ...Even with episodes
|
33
|
+
series.episodes
|
34
|
+
=> [#<TheTvDB::Episode id: "694851", absolute_number: nil, airs_after_season: nil, airs_before_episode: "1", airs_before_season: "1", combined_episode_number: "1", combined_season: "0", director: nil, dvd_chapter: nil, dvd_disc_id: nil, dvd_episode_number: nil, dvd_season: nil, ep_img_flag: "1", name: "Unaired Pilot", number: "1", filename: "episodes/82066/694851.jpg", first_aired: nil, guest_stars: nil, imdb_id: nil, language: "en", last_updated: "1263338464", overview: nil, production_code: nil, rating: nil, rating_count: "0", season_id: "32605", season_number: "0", series_id: "82066", ... (96 more)
|
35
|
+
|
36
|
+
# Some methods require an API key,
|
37
|
+
# For example: searching for episodes by air_date
|
38
|
+
api.episodes.find(series_id="82066", air_date="2012-11-16")
|
39
|
+
TheTvDB::TheTvDBError: You must have an Application Key to use this interface
|
40
|
+
|
41
|
+
api = TheTvDB.new(api_key: your_api_key)
|
42
|
+
api.episodes.find(series_id="82066", air_date="2012-11-16")
|
43
|
+
=> [#<TheTvDB::Episode id: "4393016", absolute_number: nil, airs_after_season: nil, airs_before_episode: nil, airs_before_season: nil, combined_episode_number: "7", combined_season: "5", director: nil, dvd_chapter: nil, dvd_disc_id: nil, dvd_episode_number: nil, dvd_season: nil, ep_img_flag: nil, name: "52010", number: "7", filename: nil, first_aired: "2012-11-16", guest_stars: nil, imdb_id: nil, language: "en", last_updated: "1350927372", overview: "The team orchestrates an event of its own.", production_code: nil, rating: nil, rating_count: nil, season_id: "494897", season_number: "5", series_id: "82066", writer: nil>]
|
44
|
+
```
|
45
|
+
|
46
|
+
## Feature & Development Roadmap
|
47
|
+
|
48
|
+
* Series banners
|
49
|
+
* Season posters
|
50
|
+
* Fan-art posters
|
51
|
+
* List of supported languages
|
20
52
|
|
21
53
|
## Contributing
|
22
54
|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "the_tv_db/connection"
|
2
|
+
|
3
|
+
module TheTvDB
|
4
|
+
class API
|
5
|
+
extend Connection
|
6
|
+
|
7
|
+
def initialize(options={}, &block)
|
8
|
+
super()
|
9
|
+
set_api_client
|
10
|
+
self
|
11
|
+
|
12
|
+
self.instance_eval(&block) if block_given?
|
13
|
+
end
|
14
|
+
|
15
|
+
# Assigns current api class
|
16
|
+
def set_api_client
|
17
|
+
TheTvDB.api_client = self
|
18
|
+
end
|
19
|
+
|
20
|
+
end # API
|
21
|
+
end # TheTvDB
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require "faraday"
|
2
|
+
require "the_tv_db/response"
|
3
|
+
require "the_tv_db/response/xmlize"
|
4
|
+
|
5
|
+
module TheTvDB
|
6
|
+
module Connection
|
7
|
+
extend self
|
8
|
+
|
9
|
+
@connection = nil
|
10
|
+
|
11
|
+
def connection
|
12
|
+
@connection ||= Faraday.new(:url => TheTvDB::ENDPOINT) do |faraday|
|
13
|
+
faraday.response :logger if ENV['DEBUG'] # log requests to STDOUT
|
14
|
+
faraday.adapter :typhoeus # make requests with Typhoeus
|
15
|
+
faraday.use TheTvDB::Response::Xmlize
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def request(path, params={})
|
20
|
+
response = connection.get(path, params)
|
21
|
+
response.body
|
22
|
+
end
|
23
|
+
|
24
|
+
end # Connection
|
25
|
+
end # TheTvDB
|
@@ -0,0 +1,12 @@
|
|
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
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module TheTvDB
|
2
|
+
class Episode < API
|
3
|
+
include Model
|
4
|
+
|
5
|
+
class << self
|
6
|
+
|
7
|
+
# Public: Find an episode by air date.
|
8
|
+
#
|
9
|
+
# This is useful for shows that don't contain season and episode info,
|
10
|
+
# but rather have the date in the title.
|
11
|
+
#
|
12
|
+
# series_id - The ID of the series.
|
13
|
+
# air_date - The air date of the episode.
|
14
|
+
# lang - The language of the episode.
|
15
|
+
#
|
16
|
+
# Examples
|
17
|
+
#
|
18
|
+
# find("82066", "2012-11-16")
|
19
|
+
# find("82066", "11/16/2012", "fr")
|
20
|
+
#
|
21
|
+
# Returns array of TheTvDB::Episode objects.
|
22
|
+
def find(series_id, air_date=nil, lang="en")
|
23
|
+
data = request("GetEpisodeByAirDate.php", {
|
24
|
+
apikey: TheTvDB.api_key,
|
25
|
+
seriesid: series_id,
|
26
|
+
airdate: air_date,
|
27
|
+
language: lang
|
28
|
+
})["Data"]
|
29
|
+
|
30
|
+
raise TheTvDBError, data["Error"] if data["Error"]
|
31
|
+
|
32
|
+
episodes = data["Episode"]
|
33
|
+
|
34
|
+
case episodes
|
35
|
+
when Hash
|
36
|
+
[ new(episodes) ]
|
37
|
+
when Array
|
38
|
+
episodes.collect { |episode| new(episode) }
|
39
|
+
else
|
40
|
+
[]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
alias :get :find
|
44
|
+
end
|
45
|
+
|
46
|
+
ATTRS_MAP = {
|
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
|
81
|
+
end # TheTvDB
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module TheTvDB
|
2
|
+
|
3
|
+
# Generic TheTvDB exception class.
|
4
|
+
class TheTvDBError < StandardError
|
5
|
+
end
|
6
|
+
|
7
|
+
# Raised when a connection to the api can't be established.
|
8
|
+
class ConnectionNotEstablished < StandardError
|
9
|
+
end
|
10
|
+
|
11
|
+
# Raised when the record was not found given an id or set of ids.
|
12
|
+
class RecordNotFound < StandardError
|
13
|
+
end
|
14
|
+
|
15
|
+
# Raised when unknown attributes are supplied via mass assignment.
|
16
|
+
class UnknownAttributeError < NoMethodError
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module TheTvDB
|
2
|
+
module Model
|
3
|
+
|
4
|
+
attr_accessor :klass
|
5
|
+
|
6
|
+
def initialize(params=nil)
|
7
|
+
@klass = self.class
|
8
|
+
self.attributes = params
|
9
|
+
end
|
10
|
+
|
11
|
+
def attributes=(params=nil)
|
12
|
+
params.each do |attr, value|
|
13
|
+
begin
|
14
|
+
self.public_send("#{klass::ATTRS_MAP.key(attr)}=", value)
|
15
|
+
rescue NoMethodError
|
16
|
+
raise UnknownAttributeError, "unknown attribute: #{attr}"
|
17
|
+
end
|
18
|
+
end if params
|
19
|
+
end
|
20
|
+
|
21
|
+
def attributes
|
22
|
+
attrs = {}
|
23
|
+
klass::ATTRS_MAP.keys.each do |name|
|
24
|
+
attrs[name] = send(name)
|
25
|
+
end
|
26
|
+
attrs
|
27
|
+
end
|
28
|
+
|
29
|
+
def inspect
|
30
|
+
inspection = unless id.nil?
|
31
|
+
klass::ATTRS_MAP.keys.collect { |name|
|
32
|
+
"#{name}: #{attribute_for_inspect(name)}"
|
33
|
+
}.compact.join(", ")
|
34
|
+
else
|
35
|
+
"not initialized"
|
36
|
+
end
|
37
|
+
"#<#{self.class} #{inspection}>"
|
38
|
+
end
|
39
|
+
|
40
|
+
def attribute_for_inspect(attr_name)
|
41
|
+
value = send(attr_name)
|
42
|
+
|
43
|
+
if value.is_a?(String) && value.length > 50
|
44
|
+
"#{value[0..50]}...".inspect
|
45
|
+
elsif value.is_a?(Date) || value.is_a?(Time)
|
46
|
+
%("#{value.to_s(:db)}")
|
47
|
+
else
|
48
|
+
value.inspect
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end # Model
|
53
|
+
end # TheTvDB
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require "multi_xml"
|
2
|
+
|
3
|
+
module TheTvDB
|
4
|
+
class Response::Xmlize < Response
|
5
|
+
dependency 'multi_xml'
|
6
|
+
|
7
|
+
define_parser do |body|
|
8
|
+
MultiXml.parser = :ox
|
9
|
+
MultiXml.parse body
|
10
|
+
end
|
11
|
+
|
12
|
+
def parse(body)
|
13
|
+
case body
|
14
|
+
when ''
|
15
|
+
nil
|
16
|
+
when 'true'
|
17
|
+
true
|
18
|
+
when 'false'
|
19
|
+
false
|
20
|
+
else
|
21
|
+
self.class.parser.call body
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end # Response::Xmlize
|
26
|
+
end # TheTvDB
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module TheTvDB
|
2
|
+
# Contains methods and attributes that act on the response returned from the
|
3
|
+
# request
|
4
|
+
class Response < Faraday::Response::Middleware
|
5
|
+
CONTENT_TYPE = 'Content-Type'.freeze
|
6
|
+
|
7
|
+
class << self
|
8
|
+
attr_accessor :parser
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.define_parser(&block)
|
12
|
+
@parser = block
|
13
|
+
end
|
14
|
+
|
15
|
+
def response_type(env)
|
16
|
+
env[:response_headers][CONTENT_TYPE].to_s
|
17
|
+
end
|
18
|
+
|
19
|
+
def parse_response?(env)
|
20
|
+
env[:body].respond_to? :to_str
|
21
|
+
end
|
22
|
+
|
23
|
+
end # Response
|
24
|
+
end # TheTvDB
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module TheTvDB
|
2
|
+
class Series::Collection
|
3
|
+
include Model
|
4
|
+
|
5
|
+
ATTRS_MAP = {
|
6
|
+
:id => "seriesid",
|
7
|
+
:api_id => "id",
|
8
|
+
:banner => "banner",
|
9
|
+
:first_aired => "FirstAired",
|
10
|
+
:imdb_id => "IMDB_ID",
|
11
|
+
:name => "SeriesName",
|
12
|
+
:language => "language",
|
13
|
+
:overview => "Overview",
|
14
|
+
:zap2it_id => "zap2it_id"
|
15
|
+
}.freeze
|
16
|
+
|
17
|
+
attr_accessor *ATTRS_MAP.keys
|
18
|
+
|
19
|
+
end # Series::Collection
|
20
|
+
end # TheTvDB
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module TheTvDB
|
2
|
+
class Series < API
|
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)
|
23
|
+
data = request("/data/series/#{id}/all/")["Data"]
|
24
|
+
record = new(data["Series"])
|
25
|
+
record.episodes = data["Episode"]
|
26
|
+
return record
|
27
|
+
rescue MultiXml::ParseError
|
28
|
+
raise RecordNotFound, "Couldn't find series with ID=#{id}"
|
29
|
+
end
|
30
|
+
alias :get :find
|
31
|
+
end
|
32
|
+
|
33
|
+
ATTRS_MAP = {
|
34
|
+
:id => "id",
|
35
|
+
:actors => "Actors",
|
36
|
+
:added => "added",
|
37
|
+
:added_by => "addedBy",
|
38
|
+
:airs_day_of_week => "Airs_DayOfWeek",
|
39
|
+
:airs_time => "Airs_Time",
|
40
|
+
:banner => "banner",
|
41
|
+
:content_rating => "ContentRating",
|
42
|
+
:fanart => "fanart",
|
43
|
+
:first_aired => "FirstAired",
|
44
|
+
:genre => "Genre",
|
45
|
+
:imdb_id => "IMDB_ID",
|
46
|
+
:language => "Language",
|
47
|
+
:last_updated => "lastupdated",
|
48
|
+
:network => "Network",
|
49
|
+
:network_id => "NetworkID",
|
50
|
+
:overview => "Overview",
|
51
|
+
:rating => "Rating",
|
52
|
+
:rating_count => "RatingCount",
|
53
|
+
:runtime => "Runtime",
|
54
|
+
:poster => "poster",
|
55
|
+
:series_id => "SeriesID",
|
56
|
+
:series_name => "SeriesName",
|
57
|
+
:status => "Status",
|
58
|
+
:zap2it_id => "zap2it_id"
|
59
|
+
}.freeze
|
60
|
+
|
61
|
+
attr_accessor *ATTRS_MAP.keys, :episodes
|
62
|
+
|
63
|
+
def episodes=(episodes)
|
64
|
+
@episodes = case episodes
|
65
|
+
when Hash
|
66
|
+
[ Episode.new(episodes) ]
|
67
|
+
when Array
|
68
|
+
episodes.collect { |episode| Episode.new(episode) }
|
69
|
+
else
|
70
|
+
[]
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
end # Series
|
75
|
+
end # TheTvDB
|
data/lib/the_tv_db/version.rb
CHANGED
data/lib/the_tv_db.rb
CHANGED
@@ -1,4 +1,35 @@
|
|
1
|
+
require "the_tv_db/core_ext/string"
|
1
2
|
require "the_tv_db/version"
|
3
|
+
require "the_tv_db/errors"
|
4
|
+
require "the_tv_db/api"
|
5
|
+
require "the_tv_db/model"
|
6
|
+
require "the_tv_db/client"
|
2
7
|
|
3
|
-
module
|
4
|
-
|
8
|
+
module TheTvDB
|
9
|
+
|
10
|
+
SITE = "http://thetvdb.com".freeze
|
11
|
+
ENDPOINT = "http://thetvdb.com/api".freeze
|
12
|
+
|
13
|
+
class << self
|
14
|
+
|
15
|
+
# Handle for the client instance
|
16
|
+
attr_accessor :api_client, :api_key
|
17
|
+
|
18
|
+
def new(options={}, &block)
|
19
|
+
@api_key = options.delete(:api_key)
|
20
|
+
@api_client = TheTvDB::Client.new(options, &block)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Delegate to TheTvDB::Client
|
24
|
+
#
|
25
|
+
def method_missing(method, *args, &block)
|
26
|
+
return super unless new.respond_to?(method)
|
27
|
+
new.send(method, *args, &block)
|
28
|
+
end
|
29
|
+
|
30
|
+
def respond_to?(method, include_private = false)
|
31
|
+
new.respond_to?(method, include_private) || super(method, include_private)
|
32
|
+
end
|
33
|
+
|
34
|
+
end # Self
|
35
|
+
end # TheTvDB
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" ?>
|
2
|
+
<Data>
|
3
|
+
<Episode>
|
4
|
+
<id>4393016</id>
|
5
|
+
<Combined_episodenumber>7</Combined_episodenumber>
|
6
|
+
<Combined_season>5</Combined_season>
|
7
|
+
<DVD_chapter/>
|
8
|
+
<DVD_discid/>
|
9
|
+
<DVD_episodenumber/>
|
10
|
+
<DVD_season/>
|
11
|
+
<Director/>
|
12
|
+
<EpImgFlag/>
|
13
|
+
<EpisodeName>52010</EpisodeName>
|
14
|
+
<EpisodeNumber>7</EpisodeNumber>
|
15
|
+
<FirstAired>2012-11-16</FirstAired>
|
16
|
+
<GuestStars/>
|
17
|
+
<IMDB_ID/>
|
18
|
+
<Language>en</Language>
|
19
|
+
<Overview>The team orchestrates an event of its own.</Overview>
|
20
|
+
<ProductionCode/>
|
21
|
+
<Rating/>
|
22
|
+
<SeasonNumber>5</SeasonNumber>
|
23
|
+
<Writer/>
|
24
|
+
<absolute_number/>
|
25
|
+
<filename/>
|
26
|
+
<lastupdated>1350927372</lastupdated>
|
27
|
+
<seasonid>494897</seasonid>
|
28
|
+
<seriesid>82066</seriesid>
|
29
|
+
</Episode>
|
30
|
+
</Data>
|
@@ -0,0 +1,39 @@
|
|
1
|
+
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
|
2
|
+
<html><head>
|
3
|
+
<title>404 Not Found</title>
|
4
|
+
<script type="text/javascript">
|
5
|
+
//<![CDATA[
|
6
|
+
window.__CF=window.__CF||{};window.__CF.AJS={"ga_key":{"ua":"UA-9131861-1","ga_bs":"2"}};
|
7
|
+
//]]>
|
8
|
+
</script>
|
9
|
+
<script type="text/javascript">
|
10
|
+
//<![CDATA[
|
11
|
+
try{if (!window.CloudFlare) { var CloudFlare=[{verbose:0,p:0,byc:0,owlid:"cf",mirage:{responsive:0,lazy:0},oracle:"9a/82fd4d610b168badf482d8810933fa",paths:{cloudflare:"/cdn-cgi/nexp/aav=1870252173/"},atok:"4fa89040047d9c4e9fe703b2270c89db",zone:"thetvdb.com",rocket:"0",apps:{"ga_key":{"ua":"UA-9131861-1","ga_bs":"2"}}}];var a=document.createElement("script"),b=document.getElementsByTagName("script")[0];a.async=!0;a.src="//ajax.cloudflare.com/cdn-cgi/nexp/aav=4114775854/cloudflare.min.js";b.parentNode.insertBefore(a,b);}}catch(e){};
|
12
|
+
//]]>
|
13
|
+
</script>
|
14
|
+
<script type="text/javascript">
|
15
|
+
/* <![CDATA[ */
|
16
|
+
var _gaq = _gaq || [];
|
17
|
+
_gaq.push(['_setAccount', 'UA-9131861-1']);
|
18
|
+
_gaq.push(['_trackPageview']);
|
19
|
+
|
20
|
+
(function() {
|
21
|
+
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
22
|
+
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
23
|
+
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
24
|
+
})();
|
25
|
+
|
26
|
+
(function(b){(function(a){"__CF"in b&&"DJS"in b.__CF?b.__CF.DJS.push(a):"addEventListener"in b?b.addEventListener("load",a,!1):b.attachEvent("onload",a)})(function(){"FB"in b&&"Event"in FB&&"subscribe"in FB.Event&&(FB.Event.subscribe("edge.create",function(a){_gaq.push(["_trackSocial","facebook","like",a])}),FB.Event.subscribe("edge.remove",function(a){_gaq.push(["_trackSocial","facebook","unlike",a])}),FB.Event.subscribe("message.send",function(a){_gaq.push(["_trackSocial","facebook","send",a])}));"twttr"in b&&"events"in twttr&&"bind"in twttr.events&&twttr.events.bind("tweet",function(a){if(a){var b;if(a.target&&a.target.nodeName=="IFRAME")a:{if(a=a.target.src){a=a.split("#")[0].match(/[^?=&]+=([^&]*)?/g);b=0;for(var c;c=a[b];++b)if(c.indexOf("url")===0){b=unescape(c.split("=")[1]);break a}}b=void 0}_gaq.push(["_trackSocial","twitter","tweet",b])}})})})(window);
|
27
|
+
/* ]]> */
|
28
|
+
</script>
|
29
|
+
</head><body><script type="text/javascript">
|
30
|
+
//<![CDATA[
|
31
|
+
new Image().src = "/cdn-cgi/ping?cf[location]=404&cf[js]=1";
|
32
|
+
//]]>
|
33
|
+
</script>
|
34
|
+
<noscript>
|
35
|
+
<img src="/cdn-cgi/ping?cf[location]=404&cf[js]=0" alt="">
|
36
|
+
</noscript>
|
37
|
+
<h1>Not Found</h1>
|
38
|
+
<p>The requested URL /data/series/-1/all/ was not found on this server.</p>
|
39
|
+
</body></html>
|