sofa 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. data/spec/sofa/tvrage/episode_spec.rb +11 -0
  2. data/spec/spec_helper.rb +2 -2
  3. metadata +111 -122
  4. data/.document +0 -5
  5. data/.gitignore +0 -22
  6. data/.yardopts +0 -6
  7. data/Rakefile +0 -76
  8. data/doc/Sofa.html +0 -85
  9. data/doc/Sofa/Mapping.html +0 -168
  10. data/doc/Sofa/Mapping/ClassMethods.html +0 -314
  11. data/doc/Sofa/Mapping/InstanceMethods.html +0 -358
  12. data/doc/Sofa/TVRage.html +0 -85
  13. data/doc/Sofa/TVRage/Episode.html +0 -358
  14. data/doc/Sofa/TVRage/Schedule.html +0 -207
  15. data/doc/Sofa/TVRage/Season.html +0 -236
  16. data/doc/Sofa/TVRage/Show.html +0 -904
  17. data/doc/Sofa/TVRage/Show/ShowNotFound.html +0 -92
  18. data/doc/Sofa/Version.html +0 -100
  19. data/doc/_index.html +0 -206
  20. data/doc/class_list.html +0 -137
  21. data/doc/css/common.css +0 -1
  22. data/doc/css/full_list.css +0 -23
  23. data/doc/css/style.css +0 -261
  24. data/doc/file.README.html +0 -120
  25. data/doc/file_list.html +0 -29
  26. data/doc/index.html +0 -120
  27. data/doc/js/app.js +0 -91
  28. data/doc/js/full_list.js +0 -39
  29. data/doc/js/jquery.js +0 -19
  30. data/doc/method_list.html +0 -192
  31. data/doc/top-level-namespace.html +0 -80
  32. data/lib/sofa.rb +0 -5
  33. data/lib/sofa/mapping.rb +0 -108
  34. data/lib/sofa/tvrage.rb +0 -10
  35. data/lib/sofa/tvrage/episode.rb +0 -39
  36. data/lib/sofa/tvrage/schedule.rb +0 -25
  37. data/lib/sofa/tvrage/season.rb +0 -36
  38. data/lib/sofa/tvrage/show.rb +0 -132
  39. data/lib/sofa/version.rb +0 -8
  40. data/sofa.gemspec +0 -126
  41. data/spec/fixtures/tvrage/cases/castle.xml +0 -228
  42. data/spec/fixtures/tvrage/cases/community.xml +0 -109
  43. data/spec/fixtures/tvrage/cases/live_with_regis_and_kelly.xml +0 -56237
  44. data/spec/fixtures/tvrage/episode_list.xml +0 -1183
  45. data/spec/fixtures/tvrage/episode_list_one_season.xml +0 -17
  46. data/spec/fixtures/tvrage/episode_list_two_episodes.xml +0 -25
  47. data/spec/fixtures/tvrage/full_schedule.xml +0 -4731
  48. data/spec/fixtures/tvrage/full_show_info.xml +0 -1291
  49. data/spec/fixtures/tvrage/quickinfo.html +0 -17
  50. data/spec/fixtures/tvrage/quickinfo_missing.html +0 -1
  51. data/spec/fixtures/tvrage/search.xml +0 -151
  52. data/spec/fixtures/tvrage/show_info.xml +0 -42
  53. data/spec/fixtures/tvrage/show_info_blank.xml +0 -3
  54. data/spec/fixtures/tvrage/single_episode.xml +0 -8
  55. data/spec/spec.opts +0 -1
@@ -1,10 +0,0 @@
1
- require 'httparty'
2
-
3
- module Sofa
4
- module TVRage
5
- autoload :Schedule, 'sofa/tvrage/schedule'
6
- autoload :Show, 'sofa/tvrage/show'
7
- autoload :Season, 'sofa/tvrage/season'
8
- autoload :Episode, 'sofa/tvrage/episode'
9
- end
10
- end
@@ -1,39 +0,0 @@
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
@@ -1,25 +0,0 @@
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
@@ -1,36 +0,0 @@
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
@@ -1,132 +0,0 @@
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
@@ -1,8 +0,0 @@
1
- module Sofa
2
- module Version
3
- MAJOR = 0
4
- MINOR = 1
5
- PATCH = 0
6
- STRING = "#{MAJOR}.#{MINOR}.#{PATCH}"
7
- end
8
- end
@@ -1,126 +0,0 @@
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
-
@@ -1,228 +0,0 @@
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>