epguides 0.0.1

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.
@@ -0,0 +1,36 @@
1
+ Epguides
2
+ ========
3
+
4
+ Epguides makes it easy to look up TV episode information from http://epguides.com if you know either the season and episode number or the air date of an episode.
5
+
6
+ Installation
7
+ ------------
8
+
9
+ gem install epguides
10
+
11
+ Usage
12
+ -----
13
+
14
+ ```ruby
15
+ require 'epguides'
16
+ #=> true
17
+
18
+ show = Epguides::Show.search("The Colbert Report")
19
+ #=> #<Epguides::Show:0x007fc001c71618 @slug=nil, @url="http://epguides.com/ColbertReport/">
20
+ show.name
21
+ #=> "The Colbert Report"
22
+ episode = show.season(8).episode(33)
23
+ #=> #<Epguides::Episode:0x007fc001b794b8 @season="8", @number="33", @prod_number="", @air_date=#<Date: 2012-03-08 ((2455995j,0s,0n),+0s,2299161j)>, @title="Don Fleming, Elvis Costello, Emmylou Harris">
24
+
25
+ show2 = Epguides::Show.new(:slug => 'Archer')
26
+ #=> #<Epguides::Show:0x007fcdf388ed20 @slug="Archer", @url=nil>
27
+ show2.episodes.first
28
+ #=> #<Epguides::Episode:0x007fcdf34a4840 @season="1", @number="01", @prod_number="AR01001", @air_date=#<Date: 2009-09-17 ((2455092j,0s,0n),+0s,2299161j)>, @title="Mole Hunt [Trailer]">
29
+ show2.episodes.find_by_air_date(Date.new(2013,2,21))
30
+ #=> #<Epguides::Episode:0x007fcdf34951b0 @season="4", @number="06", @prod_number="XAR04007", @air_date=#<Date: 2013-02-21 ((2456345j,0s,0n),+0s,2299161j)>, @title="Once Bitten">
31
+
32
+ ```
33
+
34
+ License
35
+ -------
36
+ MIT
@@ -0,0 +1,7 @@
1
+ module Epguides
2
+ end
3
+
4
+ require 'epguides/episode'
5
+ require 'epguides/episode_list'
6
+ require 'epguides/show'
7
+ require 'epguides/season'
@@ -0,0 +1,25 @@
1
+ module Epguides
2
+ class Episode
3
+ REGX = /(\d+)\s+(\d+)-(\d+)\s+(.*)\s+(\d*\/*\w{3}\/\d{2})\s+(.+\Z)/
4
+
5
+ attr_reader :season, :number, :air_date, :title
6
+
7
+ def initialize(season, number, prod_number, air_date, title)
8
+ @season = season
9
+ @number = number
10
+ @prod_number = prod_number.strip
11
+ @air_date = parse_date(air_date)
12
+ @title = title.strip
13
+ end
14
+
15
+ private
16
+
17
+ def parse_date(date)
18
+ if /\d+\/\w{3}\/\d{2}/.match(date)
19
+ DateTime.strptime(date, "%d/%b/%y").to_date
20
+ else
21
+ ''
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,11 @@
1
+ module Epguides
2
+ class EpisodeList < Array
3
+ def find_by_air_date(date)
4
+ self.find {|ep| ep.air_date == date}
5
+ end
6
+
7
+ def find_by_season(season)
8
+ self.find_all {|ep| ep.season == season.to_s}
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,14 @@
1
+ module Epguides
2
+ class Season
3
+ attr_reader :episodes, :season
4
+
5
+ def initialize(season, episodes=[])
6
+ @episodes = episodes
7
+ @season = season
8
+ end
9
+
10
+ def episode(n)
11
+ @episodes.find {|ep| ep.number.to_i == n}
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,68 @@
1
+ # encoding: UTF-8
2
+ require 'json'
3
+ require 'nokogiri'
4
+ require 'open-uri'
5
+ require 'rest-client'
6
+
7
+ module Epguides
8
+ class Show
9
+ attr_reader :slug, :url
10
+
11
+ def initialize(args={})
12
+ @slug = args[:slug]
13
+ @url = args[:url]
14
+ end
15
+
16
+ def episodes
17
+ return @episodes if @episodes
18
+ @episodes = EpisodeList.new
19
+ parse_table.each do |row|
20
+ if m = Episode::REGX.match(row)
21
+ @episodes << Episode.new(m[2], m[3], m[4], m[5], m[6])
22
+ end
23
+ end
24
+ @episodes
25
+ end
26
+
27
+ def name
28
+ doc.css('//h1').text
29
+ end
30
+
31
+ def season(n)
32
+ Season.new(n.to_s, episodes.find_by_season(n))
33
+ end
34
+
35
+ def seasons
36
+ pattern = Regexp.new("•\\s+Season\\s+(\\d+)")
37
+ list.scan(pattern).map do |s|
38
+ Season.new(self, s.first)
39
+ end
40
+ end
41
+
42
+ def url
43
+ @url ||= "http://epguides.com/#{@slug}/"
44
+ end
45
+
46
+ def self.search(q)
47
+ search_url = 'http://ajax.googleapis.com/ajax/services/search/web' +
48
+ '?v=1.0&q=allintitle: site:epguides.com '
49
+ results = JSON.parse RestClient.get(URI.escape(search_url + q))
50
+ new url: results['responseData']['results'].first['url']
51
+ end
52
+
53
+ private
54
+
55
+ def doc
56
+ Nokogiri::HTML(open(url))
57
+ end
58
+
59
+ def list
60
+ doc.xpath('//div[@id = "eplist"]').text
61
+ end
62
+
63
+ def parse_table
64
+ titles = doc.xpath('//div[@id = "eplist"]//a').text
65
+ doc.xpath('//div[@id = "eplist"]').text.split("\r\n")
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,3 @@
1
+ module Epguides
2
+ VERSION = "0.0.1"
3
+ end
metadata ADDED
@@ -0,0 +1,131 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: epguides
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Matt Manning
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-04-08 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: json
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 1.7.7
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 1.7.7
30
+ - !ruby/object:Gem::Dependency
31
+ name: nokogiri
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 1.5.6
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 1.5.6
46
+ - !ruby/object:Gem::Dependency
47
+ name: rest-client
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 1.6.7
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 1.6.7
62
+ - !ruby/object:Gem::Dependency
63
+ name: minitest
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 4.6.2
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 4.6.2
78
+ - !ruby/object:Gem::Dependency
79
+ name: turn
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 0.9.6
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 0.9.6
94
+ description: Query the epguides.com website for TV show information.
95
+ email: matt.manning@gmail.com
96
+ executables: []
97
+ extensions: []
98
+ extra_rdoc_files: []
99
+ files:
100
+ - README.md
101
+ - lib/epguides.rb
102
+ - lib/epguides/episode.rb
103
+ - lib/epguides/episode_list.rb
104
+ - lib/epguides/season.rb
105
+ - lib/epguides/show.rb
106
+ - lib/epguides/version.rb
107
+ homepage: https://github.com/mattmanning/epguides
108
+ licenses: []
109
+ post_install_message:
110
+ rdoc_options: []
111
+ require_paths:
112
+ - lib
113
+ required_ruby_version: !ruby/object:Gem::Requirement
114
+ none: false
115
+ requirements:
116
+ - - ! '>='
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ required_rubygems_version: !ruby/object:Gem::Requirement
120
+ none: false
121
+ requirements:
122
+ - - ! '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ requirements: []
126
+ rubyforge_project:
127
+ rubygems_version: 1.8.24
128
+ signing_key:
129
+ specification_version: 3
130
+ summary: Query the epguides.com website for TV show information.
131
+ test_files: []