sofa 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +22 -0
- data/.yardopts +6 -0
- data/LICENSE +20 -0
- data/README.md +72 -0
- data/Rakefile +76 -0
- data/doc/Sofa.html +85 -0
- data/doc/Sofa/Mapping.html +168 -0
- data/doc/Sofa/Mapping/ClassMethods.html +314 -0
- data/doc/Sofa/Mapping/InstanceMethods.html +358 -0
- data/doc/Sofa/TVRage.html +85 -0
- data/doc/Sofa/TVRage/Episode.html +358 -0
- data/doc/Sofa/TVRage/Schedule.html +207 -0
- data/doc/Sofa/TVRage/Season.html +236 -0
- data/doc/Sofa/TVRage/Show.html +904 -0
- data/doc/Sofa/TVRage/Show/ShowNotFound.html +92 -0
- data/doc/Sofa/Version.html +100 -0
- data/doc/_index.html +206 -0
- data/doc/class_list.html +137 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +23 -0
- data/doc/css/style.css +261 -0
- data/doc/file.README.html +120 -0
- data/doc/file_list.html +29 -0
- data/doc/index.html +120 -0
- data/doc/js/app.js +91 -0
- data/doc/js/full_list.js +39 -0
- data/doc/js/jquery.js +19 -0
- data/doc/method_list.html +192 -0
- data/doc/top-level-namespace.html +80 -0
- data/lib/sofa.rb +5 -0
- data/lib/sofa/mapping.rb +108 -0
- data/lib/sofa/tvrage.rb +10 -0
- data/lib/sofa/tvrage/episode.rb +39 -0
- data/lib/sofa/tvrage/schedule.rb +25 -0
- data/lib/sofa/tvrage/season.rb +36 -0
- data/lib/sofa/tvrage/show.rb +132 -0
- data/lib/sofa/version.rb +8 -0
- data/sofa.gemspec +126 -0
- data/spec/fixtures/tvrage/cases/castle.xml +228 -0
- data/spec/fixtures/tvrage/cases/community.xml +109 -0
- data/spec/fixtures/tvrage/cases/live_with_regis_and_kelly.xml +56237 -0
- data/spec/fixtures/tvrage/episode_list.xml +1183 -0
- data/spec/fixtures/tvrage/episode_list_one_season.xml +17 -0
- data/spec/fixtures/tvrage/episode_list_two_episodes.xml +25 -0
- data/spec/fixtures/tvrage/full_schedule.xml +4731 -0
- data/spec/fixtures/tvrage/full_show_info.xml +1291 -0
- data/spec/fixtures/tvrage/quickinfo.html +17 -0
- data/spec/fixtures/tvrage/quickinfo_missing.html +1 -0
- data/spec/fixtures/tvrage/search.xml +151 -0
- data/spec/fixtures/tvrage/show_info.xml +42 -0
- data/spec/fixtures/tvrage/show_info_blank.xml +3 -0
- data/spec/fixtures/tvrage/single_episode.xml +8 -0
- data/spec/sofa/mapping_spec.rb +82 -0
- data/spec/sofa/tvrage/cases_spec.rb +29 -0
- data/spec/sofa/tvrage/episode_spec.rb +45 -0
- data/spec/sofa/tvrage/schedule_spec.rb +17 -0
- data/spec/sofa/tvrage/season_spec.rb +61 -0
- data/spec/sofa/tvrage/show_spec.rb +162 -0
- data/spec/sofa/version_spec.rb +11 -0
- data/spec/sofa_spec.rb +5 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +14 -0
- metadata +175 -0
data/lib/sofa/tvrage.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
module Sofa
|
2
|
+
module TVRage
|
3
|
+
# This class holds the XML information of a single episode as per the TVRage API.
|
4
|
+
#
|
5
|
+
# @see http://services.tvrage.com/index.php?page=public TVRage API : Episode List
|
6
|
+
class Episode
|
7
|
+
include Mapping
|
8
|
+
|
9
|
+
# @see Sofa::Mapping
|
10
|
+
maps(
|
11
|
+
:epnum => :num,
|
12
|
+
:seasonnum => :num_in_season,
|
13
|
+
:prodnum => :prod_num,
|
14
|
+
:airdate => :air_date,
|
15
|
+
:link => nil,
|
16
|
+
:title => nil
|
17
|
+
)
|
18
|
+
|
19
|
+
# The season number of the Season this Episode belongs to.
|
20
|
+
# Not actually a part of the TVRage API, but it's used to inject
|
21
|
+
# the +season_num+ when looping through Episodes in a Season.
|
22
|
+
attr_reader :season_num
|
23
|
+
|
24
|
+
# Returns a new instance of Episode, mapping info from the TVRage API
|
25
|
+
#
|
26
|
+
# @param info [Hash<Symbol, Object>] Info to initialize with
|
27
|
+
# @option info [String] :epnum The episode number in the context of all episodes
|
28
|
+
# @option info [String] :seasonnum The episode number in the context of its season
|
29
|
+
# @option info [String] :prodnum
|
30
|
+
# @option info [String] :airdate The date the episode airs
|
31
|
+
# @option info [String] :link The TVRage page for this Episode
|
32
|
+
# @option info [String] :title The title of this Episode
|
33
|
+
# @option info [String] :season_num The season number of the Season this Episode belongs to
|
34
|
+
def initialize(info)
|
35
|
+
update_with_mapping(info)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Sofa
|
2
|
+
module TVRage
|
3
|
+
# This class will hold the full/quick schedule information as per the TVRage API.
|
4
|
+
#
|
5
|
+
# @see http://services.tvrage.com/index.php?page=public&go=fullschedule TVRage API : Full Schedule
|
6
|
+
# @see http://services.tvrage.com/index.php?page=public&go=quickschedule TV Rage API : Quick Schedule
|
7
|
+
class Schedule
|
8
|
+
include HTTParty
|
9
|
+
format :xml
|
10
|
+
base_uri 'services.tvrage.com/feeds'
|
11
|
+
|
12
|
+
class << self
|
13
|
+
# Gets the full schedule for country
|
14
|
+
#
|
15
|
+
# @param country [String] The country to query in (US, UK, NL)
|
16
|
+
# @return [Hash] The parsed XML of schedule information
|
17
|
+
# @see http://services.tvrage.com/feeds/fullschedule.php?country=US US's Full Schedule
|
18
|
+
def full(country)
|
19
|
+
xml = get("/fullschedule.php", :query => {:country => country})
|
20
|
+
xml["schedule"]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Sofa
|
2
|
+
module TVRage
|
3
|
+
# This class holds the XML information of a single season as per the TVRage API.
|
4
|
+
#
|
5
|
+
# @see http://services.tvrage.com/index.php?page=public TVRage API : Episode List
|
6
|
+
class Season
|
7
|
+
include Mapping
|
8
|
+
|
9
|
+
# Maps :no to itself
|
10
|
+
# @see Sofa::Mapping
|
11
|
+
maps(:no => nil)
|
12
|
+
|
13
|
+
# Maps :episode to :episodes
|
14
|
+
# @see Sofa::Mapping
|
15
|
+
# @yieldparam value [Hash, Array] A Hash of info if there's only one. An Array of info if there's multiple
|
16
|
+
# @yieldreturn [Array] A list of episodes initialized with value
|
17
|
+
maps(:episode => :episodes) do |value|
|
18
|
+
case value
|
19
|
+
when Hash
|
20
|
+
[Episode.new(value)]
|
21
|
+
when Array
|
22
|
+
value.map { |info| Episode.new(info) }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# Returns a new instance of Season, mapping info from the TVRage API
|
27
|
+
#
|
28
|
+
# @param info [Hash<Symbol, Object>] Info to initialize with
|
29
|
+
# @option info [String] :no The season number
|
30
|
+
# @option info [String] :episode The collection of episodes
|
31
|
+
def initialize(info)
|
32
|
+
update_with_mapping(info)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
module Sofa
|
2
|
+
module TVRage
|
3
|
+
# This class holds the XML information of a single Show as per the TVRage API.
|
4
|
+
# It's also the root point for communicating with the API.
|
5
|
+
#
|
6
|
+
# @see http://services.tvrage.com/index.php?page=public TVRage API
|
7
|
+
class Show
|
8
|
+
include HTTParty
|
9
|
+
format :xml
|
10
|
+
base_uri 'services.tvrage.com'
|
11
|
+
|
12
|
+
class << self
|
13
|
+
# Gets the info for a Show.
|
14
|
+
#
|
15
|
+
# @param sid [String] The show's id
|
16
|
+
# @return [Hash] The parsed XML
|
17
|
+
# @see http://services.tvrage.com/feeds/showinfo.php?sid=15614 Chuck's Show Info
|
18
|
+
def info(sid)
|
19
|
+
xml = get('/feeds/showinfo.php', :query => {:sid => sid})
|
20
|
+
xml["Showinfo"]
|
21
|
+
end
|
22
|
+
|
23
|
+
# Gets the full show info (info + season list + episode list) for a Show.
|
24
|
+
#
|
25
|
+
# @param sid [String] The show's id
|
26
|
+
# @return [Hash] The parsed XML
|
27
|
+
# @see http://services.tvrage.com/feeds/full_show_info.php?sid=15614 Chuck's Full Show Info
|
28
|
+
def full_info(sid)
|
29
|
+
xml = get('/feeds/full_show_info.php', :query => {:sid => sid})
|
30
|
+
xml["Show"]
|
31
|
+
end
|
32
|
+
|
33
|
+
# Gets the episode list for a Show.
|
34
|
+
#
|
35
|
+
# @param sid [String] The show's id
|
36
|
+
# @return [Hash] The parsed XML
|
37
|
+
# @see http://services.tvrage.com/feeds/episode_list.php?sid=15614 Chuck's Episode List
|
38
|
+
def episode_list(sid)
|
39
|
+
xml = get('/feeds/episode_list.php', :query => {:sid => sid})
|
40
|
+
xml["Show"]
|
41
|
+
end
|
42
|
+
|
43
|
+
# Finds the Show by name using TVRage's Quickinfo API.
|
44
|
+
#
|
45
|
+
# @param name [String] The name of the show to search for
|
46
|
+
# @option options [Boolean] :greedy Whether or not to eager load the Season and Episode info
|
47
|
+
# @return [Show] The show with id parsed from the Quickinfo search
|
48
|
+
# @see http://services.tvrage.com/index.php?page=public&go=quickinfo TVRage Quickinfo API
|
49
|
+
# @see http://services.tvrage.com/tools/quickinfo.php?show=Chuck Chuck's Quickinfo
|
50
|
+
def by_name(name, options = {})
|
51
|
+
html = get('/tools/quickinfo.php', :query => {:show => name}, :format => :html)
|
52
|
+
show_info = Crack::XML.parse(html)["pre"]
|
53
|
+
raise ShowNotFound unless show_info
|
54
|
+
id = show_info.split("\n").first.gsub(%r{^Show ID@}, '').strip
|
55
|
+
Show.new(id, options)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
include Mapping
|
60
|
+
|
61
|
+
# @see Sofa::Mapping
|
62
|
+
maps(
|
63
|
+
:ended => nil,
|
64
|
+
:showid => :show_id,
|
65
|
+
:showname => :name,
|
66
|
+
:name => nil,
|
67
|
+
:showlink => :show_link,
|
68
|
+
:seasons => nil,
|
69
|
+
:started => nil,
|
70
|
+
:startdate => :start_date,
|
71
|
+
:ended => nil,
|
72
|
+
:origin_country => nil,
|
73
|
+
:status => nil,
|
74
|
+
:classification => nil,
|
75
|
+
:runtime => :run_time,
|
76
|
+
:network => nil,
|
77
|
+
:airtime => :air_time,
|
78
|
+
:airday => :air_day,
|
79
|
+
:timezone => :time_zone
|
80
|
+
)
|
81
|
+
maps(:genres => nil) { |value| value["genre"] }
|
82
|
+
maps(:akas => nil) { |value| value["aka"] }
|
83
|
+
|
84
|
+
# Maps :Episodelist to :season_list
|
85
|
+
# @see Sofa::Mapping
|
86
|
+
# @yieldparam value [Hash, Array] A Hash of info if there's only one. An Array of info if there's multiple
|
87
|
+
# @yieldreturn [Array] A list of seasons initialized with value
|
88
|
+
maps(:Episodelist => :season_list) do |value|
|
89
|
+
case seasons = value["Season"]
|
90
|
+
when Hash
|
91
|
+
[Season.new(seasons)]
|
92
|
+
when Array
|
93
|
+
seasons.map { |info| Season.new(info) }
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
# Stores all the info that was greedy-loaded
|
98
|
+
#
|
99
|
+
# @return [Hash] The full show info (including seasons and episodes)
|
100
|
+
# @see Show.full_info
|
101
|
+
attr_accessor :greedy
|
102
|
+
|
103
|
+
# Returns a new instance of Show, loading and then mapping info from the TVRage API.
|
104
|
+
#
|
105
|
+
# @param id [String] The show_id as per the TVRage API
|
106
|
+
# @option options [Boolean] :greedy Whether or not to eager load the Season and Episode info
|
107
|
+
def initialize(id, options = {})
|
108
|
+
raise RuntimeError.new("id is required") unless (@show_id = id)
|
109
|
+
klass = self.class
|
110
|
+
if options[:greedy]
|
111
|
+
update_with_mapping(@greedy = klass.full_info(@show_id))
|
112
|
+
else
|
113
|
+
update_with_mapping(klass.info(@show_id))
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
# @return [Array] The list of seasons
|
118
|
+
def season_list
|
119
|
+
update_with_mapping(self.class.episode_list(@show_id)) unless @season_list
|
120
|
+
@season_list
|
121
|
+
end
|
122
|
+
|
123
|
+
# @return [Array] The list of episodes
|
124
|
+
def episode_list
|
125
|
+
season_list.map { |season| season.episodes }.flatten
|
126
|
+
end
|
127
|
+
|
128
|
+
class ShowNotFound < RuntimeError #:nodoc:
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
data/lib/sofa/version.rb
ADDED
data/sofa.gemspec
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{sofa}
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Henry Hsu"]
|
12
|
+
s.date = %q{2009-11-21}
|
13
|
+
s.description = %q{A simple Ruby library for the TVRage API.}
|
14
|
+
s.email = %q{henry@qlane.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE",
|
17
|
+
"README.md"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
".gitignore",
|
22
|
+
".yardopts",
|
23
|
+
"LICENSE",
|
24
|
+
"README.md",
|
25
|
+
"Rakefile",
|
26
|
+
"doc/Sofa.html",
|
27
|
+
"doc/Sofa/Mapping.html",
|
28
|
+
"doc/Sofa/Mapping/ClassMethods.html",
|
29
|
+
"doc/Sofa/Mapping/InstanceMethods.html",
|
30
|
+
"doc/Sofa/TVRage.html",
|
31
|
+
"doc/Sofa/TVRage/Episode.html",
|
32
|
+
"doc/Sofa/TVRage/Schedule.html",
|
33
|
+
"doc/Sofa/TVRage/Season.html",
|
34
|
+
"doc/Sofa/TVRage/Show.html",
|
35
|
+
"doc/Sofa/TVRage/Show/ShowNotFound.html",
|
36
|
+
"doc/Sofa/Version.html",
|
37
|
+
"doc/_index.html",
|
38
|
+
"doc/class_list.html",
|
39
|
+
"doc/css/common.css",
|
40
|
+
"doc/css/full_list.css",
|
41
|
+
"doc/css/style.css",
|
42
|
+
"doc/file.README.html",
|
43
|
+
"doc/file_list.html",
|
44
|
+
"doc/index.html",
|
45
|
+
"doc/js/app.js",
|
46
|
+
"doc/js/full_list.js",
|
47
|
+
"doc/js/jquery.js",
|
48
|
+
"doc/method_list.html",
|
49
|
+
"doc/top-level-namespace.html",
|
50
|
+
"lib/sofa.rb",
|
51
|
+
"lib/sofa/mapping.rb",
|
52
|
+
"lib/sofa/tvrage.rb",
|
53
|
+
"lib/sofa/tvrage/episode.rb",
|
54
|
+
"lib/sofa/tvrage/schedule.rb",
|
55
|
+
"lib/sofa/tvrage/season.rb",
|
56
|
+
"lib/sofa/tvrage/show.rb",
|
57
|
+
"lib/sofa/version.rb",
|
58
|
+
"sofa.gemspec",
|
59
|
+
"spec/fixtures/tvrage/cases/castle.xml",
|
60
|
+
"spec/fixtures/tvrage/cases/community.xml",
|
61
|
+
"spec/fixtures/tvrage/cases/live_with_regis_and_kelly.xml",
|
62
|
+
"spec/fixtures/tvrage/episode_list.xml",
|
63
|
+
"spec/fixtures/tvrage/episode_list_one_season.xml",
|
64
|
+
"spec/fixtures/tvrage/episode_list_two_episodes.xml",
|
65
|
+
"spec/fixtures/tvrage/full_schedule.xml",
|
66
|
+
"spec/fixtures/tvrage/full_show_info.xml",
|
67
|
+
"spec/fixtures/tvrage/quickinfo.html",
|
68
|
+
"spec/fixtures/tvrage/quickinfo_missing.html",
|
69
|
+
"spec/fixtures/tvrage/search.xml",
|
70
|
+
"spec/fixtures/tvrage/show_info.xml",
|
71
|
+
"spec/fixtures/tvrage/show_info_blank.xml",
|
72
|
+
"spec/fixtures/tvrage/single_episode.xml",
|
73
|
+
"spec/sofa/mapping_spec.rb",
|
74
|
+
"spec/sofa/tvrage/cases_spec.rb",
|
75
|
+
"spec/sofa/tvrage/episode_spec.rb",
|
76
|
+
"spec/sofa/tvrage/schedule_spec.rb",
|
77
|
+
"spec/sofa/tvrage/season_spec.rb",
|
78
|
+
"spec/sofa/tvrage/show_spec.rb",
|
79
|
+
"spec/sofa/version_spec.rb",
|
80
|
+
"spec/sofa_spec.rb",
|
81
|
+
"spec/spec.opts",
|
82
|
+
"spec/spec_helper.rb"
|
83
|
+
]
|
84
|
+
s.homepage = %q{http://github.com/hsume2/sofa}
|
85
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
86
|
+
s.require_paths = ["lib"]
|
87
|
+
s.rubygems_version = %q{1.3.5}
|
88
|
+
s.summary = %q{A Ruby library for the TVRage API.}
|
89
|
+
s.test_files = [
|
90
|
+
"spec/sofa/mapping_spec.rb",
|
91
|
+
"spec/sofa/tvrage/cases_spec.rb",
|
92
|
+
"spec/sofa/tvrage/episode_spec.rb",
|
93
|
+
"spec/sofa/tvrage/schedule_spec.rb",
|
94
|
+
"spec/sofa/tvrage/season_spec.rb",
|
95
|
+
"spec/sofa/tvrage/show_spec.rb",
|
96
|
+
"spec/sofa/version_spec.rb",
|
97
|
+
"spec/sofa_spec.rb",
|
98
|
+
"spec/spec_helper.rb"
|
99
|
+
]
|
100
|
+
|
101
|
+
if s.respond_to? :specification_version then
|
102
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
103
|
+
s.specification_version = 3
|
104
|
+
|
105
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
106
|
+
s.add_runtime_dependency(%q<httparty>, [">= 0"])
|
107
|
+
s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
|
108
|
+
s.add_development_dependency(%q<mocha>, [">= 0"])
|
109
|
+
s.add_development_dependency(%q<fakeweb>, [">= 0"])
|
110
|
+
s.add_development_dependency(%q<yard>, [">= 0"])
|
111
|
+
else
|
112
|
+
s.add_dependency(%q<httparty>, [">= 0"])
|
113
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
114
|
+
s.add_dependency(%q<mocha>, [">= 0"])
|
115
|
+
s.add_dependency(%q<fakeweb>, [">= 0"])
|
116
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
117
|
+
end
|
118
|
+
else
|
119
|
+
s.add_dependency(%q<httparty>, [">= 0"])
|
120
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
121
|
+
s.add_dependency(%q<mocha>, [">= 0"])
|
122
|
+
s.add_dependency(%q<fakeweb>, [">= 0"])
|
123
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
@@ -0,0 +1,228 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<Show>
|
3
|
+
<name>Castle (2009)</name>
|
4
|
+
<totalseasons>2</totalseasons>
|
5
|
+
<showid>19267</showid>
|
6
|
+
<showlink>http://tvrage.com/Castle</showlink>
|
7
|
+
<started>Mar/09/2009</started>
|
8
|
+
<ended/>
|
9
|
+
<image>http://images.tvrage.com/shows/20/19267.jpg</image>
|
10
|
+
<origin_country>US</origin_country>
|
11
|
+
<status>Returning Series</status>
|
12
|
+
<classification>Scripted</classification>
|
13
|
+
<genres>
|
14
|
+
<genre>Crime</genre>
|
15
|
+
<genre>Drama</genre>
|
16
|
+
<genre>Mystery</genre>
|
17
|
+
</genres>
|
18
|
+
<runtime>60</runtime>
|
19
|
+
<network country="US">ABC</network>
|
20
|
+
<airtime>22:00</airtime>
|
21
|
+
<airday>Monday</airday>
|
22
|
+
<timezone>GMT-5 -DST</timezone>
|
23
|
+
<Episodelist>
|
24
|
+
<Season no="1">
|
25
|
+
<episode>
|
26
|
+
<epnum>1</epnum>
|
27
|
+
<seasonnum>01</seasonnum>
|
28
|
+
<prodnum>101</prodnum>
|
29
|
+
<airdate>2009-03-09</airdate>
|
30
|
+
<link>http://www.tvrage.com/Castle/episodes/703445</link>
|
31
|
+
<title>Flowers for Your Grave</title>
|
32
|
+
<screencap>http://images.tvrage.com/screencaps/97/19267/703445.jpg</screencap>
|
33
|
+
</episode>
|
34
|
+
<episode>
|
35
|
+
<epnum>2</epnum>
|
36
|
+
<seasonnum>02</seasonnum>
|
37
|
+
<prodnum>102</prodnum>
|
38
|
+
<airdate>2009-03-16</airdate>
|
39
|
+
<link>http://www.tvrage.com/Castle/episodes/781859</link>
|
40
|
+
<title>Nanny McDead</title>
|
41
|
+
<screencap>http://images.tvrage.com/screencaps/97/19267/781859.jpg</screencap>
|
42
|
+
</episode>
|
43
|
+
<episode>
|
44
|
+
<epnum>3</epnum>
|
45
|
+
<seasonnum>03</seasonnum>
|
46
|
+
<prodnum>103</prodnum>
|
47
|
+
<airdate>2009-03-23</airdate>
|
48
|
+
<link>http://www.tvrage.com/Castle/episodes/781860</link>
|
49
|
+
<title>Hedge Fund Homeboys</title>
|
50
|
+
<screencap>http://images.tvrage.com/screencaps/97/19267/781860.jpg</screencap>
|
51
|
+
</episode>
|
52
|
+
<episode>
|
53
|
+
<epnum>4</epnum>
|
54
|
+
<seasonnum>04</seasonnum>
|
55
|
+
<prodnum>104</prodnum>
|
56
|
+
<airdate>2009-03-30</airdate>
|
57
|
+
<link>http://www.tvrage.com/Castle/episodes/781861</link>
|
58
|
+
<title>Hell Hath No Fury</title>
|
59
|
+
<screencap>http://images.tvrage.com/screencaps/97/19267/781861.jpg</screencap>
|
60
|
+
</episode>
|
61
|
+
<episode>
|
62
|
+
<epnum>5</epnum>
|
63
|
+
<seasonnum>05</seasonnum>
|
64
|
+
<prodnum>105</prodnum>
|
65
|
+
<airdate>2009-04-06</airdate>
|
66
|
+
<link>http://www.tvrage.com/Castle/episodes/781862</link>
|
67
|
+
<title>A Chill Goes Through Her Veins</title>
|
68
|
+
<screencap>http://images.tvrage.com/screencaps/97/19267/781862.jpg</screencap>
|
69
|
+
</episode>
|
70
|
+
<episode>
|
71
|
+
<epnum>6</epnum>
|
72
|
+
<seasonnum>06</seasonnum>
|
73
|
+
<prodnum>106</prodnum>
|
74
|
+
<airdate>2009-04-13</airdate>
|
75
|
+
<link>http://www.tvrage.com/Castle/episodes/781864</link>
|
76
|
+
<title>Always Buy Retail</title>
|
77
|
+
</episode>
|
78
|
+
<episode>
|
79
|
+
<epnum>7</epnum>
|
80
|
+
<seasonnum>07</seasonnum>
|
81
|
+
<prodnum>107</prodnum>
|
82
|
+
<airdate>2009-04-20</airdate>
|
83
|
+
<link>http://www.tvrage.com/Castle/episodes/781863</link>
|
84
|
+
<title>Home Is Where the Heart Stops</title>
|
85
|
+
<screencap>http://images.tvrage.com/screencaps/97/19267/781863.jpg</screencap>
|
86
|
+
</episode>
|
87
|
+
<episode>
|
88
|
+
<epnum>8</epnum>
|
89
|
+
<seasonnum>08</seasonnum>
|
90
|
+
<prodnum>108</prodnum>
|
91
|
+
<airdate>2009-04-27</airdate>
|
92
|
+
<link>http://www.tvrage.com/Castle/episodes/781865</link>
|
93
|
+
<title>Ghosts</title>
|
94
|
+
<screencap>http://images.tvrage.com/screencaps/97/19267/781865.jpg</screencap>
|
95
|
+
</episode>
|
96
|
+
<episode>
|
97
|
+
<epnum>9</epnum>
|
98
|
+
<seasonnum>09</seasonnum>
|
99
|
+
<prodnum>109</prodnum>
|
100
|
+
<airdate>2009-05-04</airdate>
|
101
|
+
<link>http://www.tvrage.com/Castle/episodes/781866</link>
|
102
|
+
<title>Little Girl Lost</title>
|
103
|
+
<screencap>http://images.tvrage.com/screencaps/97/19267/781866.jpg</screencap>
|
104
|
+
</episode>
|
105
|
+
<episode>
|
106
|
+
<epnum>10</epnum>
|
107
|
+
<seasonnum>10</seasonnum>
|
108
|
+
<prodnum>110</prodnum>
|
109
|
+
<airdate>2009-05-11</airdate>
|
110
|
+
<link>http://www.tvrage.com/Castle/episodes/781867</link>
|
111
|
+
<title>A Death in the Family</title>
|
112
|
+
<screencap>http://images.tvrage.com/screencaps/97/19267/781867.jpg</screencap>
|
113
|
+
</episode>
|
114
|
+
</Season>
|
115
|
+
<Season no="2">
|
116
|
+
<episode>
|
117
|
+
<epnum>11</epnum>
|
118
|
+
<seasonnum>01</seasonnum>
|
119
|
+
<prodnum>201</prodnum>
|
120
|
+
<airdate>2009-09-21</airdate>
|
121
|
+
<link>http://www.tvrage.com/Castle/episodes/1064812069</link>
|
122
|
+
<title>Deep in Death</title>
|
123
|
+
<screencap>http://images.tvrage.com/screencaps/97/19267/1064812069.jpg</screencap>
|
124
|
+
</episode>
|
125
|
+
<episode>
|
126
|
+
<epnum>12</epnum>
|
127
|
+
<seasonnum>02</seasonnum>
|
128
|
+
<prodnum>202</prodnum>
|
129
|
+
<airdate>2009-09-28</airdate>
|
130
|
+
<link>http://www.tvrage.com/Castle/episodes/1064824888</link>
|
131
|
+
<title>The Double Down</title>
|
132
|
+
<screencap>http://images.tvrage.com/screencaps/97/19267/1064824888.jpg</screencap>
|
133
|
+
</episode>
|
134
|
+
<episode>
|
135
|
+
<epnum>13</epnum>
|
136
|
+
<seasonnum>03</seasonnum>
|
137
|
+
<prodnum>203</prodnum>
|
138
|
+
<airdate>2009-10-05</airdate>
|
139
|
+
<link>http://www.tvrage.com/Castle/episodes/1064824889</link>
|
140
|
+
<title>Inventing the Girl</title>
|
141
|
+
<screencap>http://images.tvrage.com/screencaps/97/19267/1064824889.jpg</screencap>
|
142
|
+
</episode>
|
143
|
+
<episode>
|
144
|
+
<epnum>14</epnum>
|
145
|
+
<seasonnum>04</seasonnum>
|
146
|
+
<prodnum>204</prodnum>
|
147
|
+
<airdate>2009-10-12</airdate>
|
148
|
+
<link>http://www.tvrage.com/Castle/episodes/1064824890</link>
|
149
|
+
<title>Fool Me Once</title>
|
150
|
+
<screencap>http://images.tvrage.com/screencaps/97/19267/1064824890.jpg</screencap>
|
151
|
+
</episode>
|
152
|
+
<episode>
|
153
|
+
<epnum>15</epnum>
|
154
|
+
<seasonnum>05</seasonnum>
|
155
|
+
<prodnum>205</prodnum>
|
156
|
+
<airdate>2009-10-19</airdate>
|
157
|
+
<link>http://www.tvrage.com/Castle/episodes/1064842856</link>
|
158
|
+
<title>When the Bough Breaks</title>
|
159
|
+
<screencap>http://images.tvrage.com/screencaps/97/19267/1064842856.jpg</screencap>
|
160
|
+
</episode>
|
161
|
+
<episode>
|
162
|
+
<epnum>16</epnum>
|
163
|
+
<seasonnum>06</seasonnum>
|
164
|
+
<prodnum>206</prodnum>
|
165
|
+
<airdate>2009-10-26</airdate>
|
166
|
+
<link>http://www.tvrage.com/Castle/episodes/1064842857</link>
|
167
|
+
<title>Vampire Weekend</title>
|
168
|
+
<screencap>http://images.tvrage.com/screencaps/97/19267/1064842857.jpg</screencap>
|
169
|
+
</episode>
|
170
|
+
<episode>
|
171
|
+
<epnum>17</epnum>
|
172
|
+
<seasonnum>07</seasonnum>
|
173
|
+
<prodnum>207</prodnum>
|
174
|
+
<airdate>2009-11-02</airdate>
|
175
|
+
<link>http://www.tvrage.com/Castle/episodes/1064842858</link>
|
176
|
+
<title>Famous Last Words</title>
|
177
|
+
</episode>
|
178
|
+
<episode>
|
179
|
+
<epnum>18</epnum>
|
180
|
+
<seasonnum>08</seasonnum>
|
181
|
+
<prodnum>208</prodnum>
|
182
|
+
<airdate>2009-11-09</airdate>
|
183
|
+
<link>http://www.tvrage.com/Castle/episodes/1064842859</link>
|
184
|
+
<title>Kill the Messenger</title>
|
185
|
+
</episode>
|
186
|
+
<episode>
|
187
|
+
<epnum>19</epnum>
|
188
|
+
<seasonnum>09</seasonnum>
|
189
|
+
<prodnum>209</prodnum>
|
190
|
+
<airdate>2009-11-16</airdate>
|
191
|
+
<link>http://www.tvrage.com/Castle/episodes/1064842860</link>
|
192
|
+
<title>Love Me Dead</title>
|
193
|
+
</episode>
|
194
|
+
<episode>
|
195
|
+
<epnum>20</epnum>
|
196
|
+
<seasonnum>10</seasonnum>
|
197
|
+
<prodnum>210</prodnum>
|
198
|
+
<airdate>2009-11-23</airdate>
|
199
|
+
<link>http://www.tvrage.com/Castle/episodes/1064842861</link>
|
200
|
+
<title>One Man's Treasure</title>
|
201
|
+
</episode>
|
202
|
+
<episode>
|
203
|
+
<epnum>21</epnum>
|
204
|
+
<seasonnum>11</seasonnum>
|
205
|
+
<prodnum>211</prodnum>
|
206
|
+
<airdate>2009-11-30</airdate>
|
207
|
+
<link>http://www.tvrage.com/Castle/episodes/1064842862</link>
|
208
|
+
<title>The Fifth Bullet</title>
|
209
|
+
</episode>
|
210
|
+
<episode>
|
211
|
+
<epnum>22</epnum>
|
212
|
+
<seasonnum>12</seasonnum>
|
213
|
+
<prodnum>212</prodnum>
|
214
|
+
<airdate>0000-00-00</airdate>
|
215
|
+
<link>http://www.tvrage.com/Castle/episodes/1064842863</link>
|
216
|
+
<title>Season 2, Episode 12</title>
|
217
|
+
</episode>
|
218
|
+
<episode>
|
219
|
+
<epnum>23</epnum>
|
220
|
+
<seasonnum>13</seasonnum>
|
221
|
+
<prodnum>213</prodnum>
|
222
|
+
<airdate>0000-00-00</airdate>
|
223
|
+
<link>http://www.tvrage.com/Castle/episodes/1064842864</link>
|
224
|
+
<title>Season 2, Episode 13</title>
|
225
|
+
</episode>
|
226
|
+
</Season>
|
227
|
+
</Episodelist>
|
228
|
+
</Show>
|