rtv 0.0.2 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/README +29 -12
  2. data/bin/tv.rb +16 -7
  3. data/lib/rtv.rb +94 -30
  4. metadata +3 -3
data/README CHANGED
@@ -1,16 +1,31 @@
1
1
  RTV - a command line ruby tv guide
2
2
 
3
+
3
4
  REQUIREMENTS
4
5
 
5
6
  Hpricot ab Version 0.6 wird für das Parsen des HTML Inhaltes verwendet und muss installiert sein.
6
7
  Es kann als Source .gz von http://code.whytheluckystiff.net/hpricot/ oder als gem "hpricot" bezogen werden.
7
8
 
9
+
8
10
  INSTALLATION
9
11
 
10
12
  Ich empfehle einen symbolischen Link namens tv zu erstellen:
11
13
 
12
14
  1. chmod +x rtv.rb
13
- 2. ln -s /bin/tv.rb ~/bin/tv
15
+ 2. ln -s bin/tv.rb ~/bin/tv
16
+
17
+
18
+ CONFIGURATION
19
+
20
+ Folgende Optionen können in einer YAML Konfigurationsdatei $HOME/.rtv eingestellt werden:
21
+
22
+ charset Ausgabe Charset, default UTF-8
23
+ senderfilter Sender und -reihenfolge der anzuzeigenden Sender
24
+ senderressource Sendergruppierung aus der Liste in doc/senderliste.txt
25
+
26
+ Eine Beispieldatei kann als Basis verwendet werden:
27
+
28
+ 1. cp etc/config.yaml.example ~/.rtv
14
29
 
15
30
 
16
31
  USAGE
@@ -19,21 +34,23 @@ USAGE
19
34
 
20
35
  ELEMENT kann folgende Werte enthalten:
21
36
 
22
- a) TIME als Sendezeit im Format HH oder HH:MM (maximal eine TIME sinnvoll)
23
- b) DATE als Datum im Format DD.MM
24
- b) CHANNEL als Sender aus der Liste in doc/senderliste.txt
25
- c) PATTERN als Suchbegriff (darf kein Sendername sein, siehe b))
26
- d) DESCRIPTION als Beschreibung (feste Zeichenkette "-d")
37
+ TIME Sendezeit im Format HH oder HH:MM (maximal eine TIME sinnvoll)
38
+ DATE Datum im Format DD.MM
39
+ CHANNEL Sender aus der Liste in doc/senderliste.txt
40
+ PATTERN Suchbegriff (darf kein Sendername sein, siehe b))
41
+ DESCRIPTION Beschreibung, feste Zeichenkette "-d"
42
+ HELP Hilfe, feste Zeichenkette "help" (gibt diese Seite aus)
27
43
 
28
44
 
29
45
  EXAMPLES
30
46
 
31
- tv - Aktuelle Sendungen für ausgewählte Sender
32
- tv 20 - Heute 20 Uhr alle Sendungen für ausgewählte Sender
33
- tv 24.12. - Alle Sendungen an Heilig Abend für ausgewählte Sender
34
- tv pro7 sat1 - Aktuelle Sendungen von nur Pro7 und Sat.1
35
- tv simpsons - Alle Sendungen über Die Simpsons für alle Sender
36
- tv -d - Aktuelle Sendungen für ausgewählte Sender mit Beschreibung
47
+ tv Aktuelle Sendungen für ausgewählte Sender
48
+ tv 20 Heute 20 Uhr alle Sendungen für ausgewählte Sender
49
+ tv 24.12. Alle Sendungen an Heilig Abend für ausgewählte Sender
50
+ tv pro7 sat1 Aktuelle Sendungen von nur Pro7 und Sat.1
51
+ tv simpsons Alle Sendungen über Die Simpsons für alle Sender
52
+ tv -d Aktuelle Sendungen für ausgewählte Sender mit Beschreibung
53
+ tv help Gibt diese Seite aus
37
54
 
38
55
  Beliebige sinnvolle Kombinationen in beliebiger Reihenfolge sind möglich:
39
56
  tv pro7 -d 20 11.07. sat1 - Alle Sendungen auf Pro7 und Sat.1 um 20 Uhr am 11.07. mit Beschreibung
data/bin/tv.rb CHANGED
@@ -1,20 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+
1
3
  require 'rubygems'
2
4
  require 'rtv'
5
+ require 'yaml'
3
6
 
4
7
  if __FILE__ == $0
5
- poptions = {}
6
- poptions[:channel] = %w{ PRO7 ARTE 3SAT RTL2 SAT1 VOX RTL K1 }
8
+ config =
9
+ begin
10
+ configfile = File.join(Gem.user_home, '.rtv')
11
+ YAML.load(File.read(configfile))
12
+ rescue
13
+ {:senderfilter=>["pro7", "arte", "3sat", "rtl2", "sat1", "vox", "rtl", "k1"],
14
+ :senderressource=>"sendergruppeId:1,3",
15
+ :charset=>"UTF-8"}
16
+ end
7
17
 
8
18
  swtch = RTV::Switcher.new
9
- swtch.options = poptions
19
+ swtch.config = config
10
20
 
11
21
  rtv = RTV::Fetcher.new
12
- rtv.poptions = poptions
22
+ rtv.config = swtch.config
13
23
  rtv.options = swtch.uri_options(ARGV.dup)
14
24
  program = rtv.fetch
15
25
 
16
- prtr = RTV::Presenter.new 'UTF-8'
17
-
18
- prtr.options = swtch.options
26
+ prtr = RTV::Presenter.new rtv.config[:charset]
27
+ prtr.config = swtch.config
19
28
  prtr.show program
20
29
  end
data/lib/rtv.rb CHANGED
@@ -9,7 +9,7 @@ require 'time'
9
9
 
10
10
  $KCODE = 'u'
11
11
 
12
- CHANNEL = ["all", "ARD", "ZDF", "RTL", "SAT1", "PRO7", "K1", "RTL2", "SUPER", "VOX", "ARTE", "TELE5", "3SAT", "DVIER", "BR", "HR", "MDR", "N3", "RBB", "SWR", "WDR", "BRALP", "TVB", "H1", "ORF1", "ORF2", "ATV", "SF1", "SF2", "PRS", "DWTV", "EXTRA", "FES", "MUX", "ZTK", "ZDOKU", "ZINFO", "DSF", "EURO", "MTV", "VIVA", "NICK", "KIKA", "QVC", "TW1", "TENO", "CC", "BBC", "CNN", "EURON", "N24", "NTV", "BLM", "DMAX", "NL1", "NL2", "NL3", "PSPO1", "DIR1", "GOLD", "HEIMA", "APLAN", "BUTV", "DISCO", "JUNIO", "MGM", "PLANE", "SCIFI", "13TH", "HIT24", "DISGE", "FOGE", "BLUM", "BLUME", "ARENA", "AXN", "KINOW", "SAT1C", "SILVE", "HISTO", "NASN", "TOON", "PR1", "PR2", "PR3", "PR4", "DISNE", "PRFC", "PRFF", "PRN", "PRSER", "KRIMI"]
12
+ Channel = %w{ard zdf rtl sat1 pro7 k1 rtl2 super vox arte tele5 3sat dvier br hr mdr n3 rbb swr wdr bralp tvb h1 orf1 orf2 atv sf1 sf2 prs dwtv extra fes mux ztk zdoku zinfo dsf euro mtv viva nick kika qvc tw1 teno cc bbc cnn euron n24 ntv blm dmax nl1 nl2 nl3 pspo1 dir1 gold heima aplan butv disco junio mgm plane scifi 13th hit24 disge foge blum blume arena axn kinow sat1c silve histo nasn toon pr1 pr2 pr3 pr4 disne prfc prff prn prser krimi}
13
13
 
14
14
  module RTV
15
15
  class Program
@@ -25,7 +25,12 @@ module RTV
25
25
  end
26
26
  class Show
27
27
  attr_accessor :channel, :name, :time, :date, :desc, :showview, :options
28
+
28
29
  Filler = "\t"
30
+
31
+ def initialize
32
+ @date = nil
33
+ end
29
34
 
30
35
  def dont_repeat lastshow = ['', '', '', '']
31
36
  self.to_a.zip(lastshow.to_a).map{|x,y| (x == y) ? (' ' * x.to_s.size) : x}.compact.join(Filler)
@@ -35,11 +40,14 @@ module RTV
35
40
  tmp << @desc if @options[:desc]
36
41
  tmp
37
42
  end
43
+ def to_s
44
+ @name.to_s
45
+ end
38
46
  end
39
47
  class Fetcher
40
48
  TVURL = 'http://www.tvtoday.de/program2007'
41
49
 
42
- attr_accessor :options, :poptions
50
+ attr_accessor :options, :config
43
51
 
44
52
  def initialize
45
53
  @options = {}
@@ -47,9 +55,16 @@ module RTV
47
55
  end
48
56
 
49
57
  def fetch
50
- uri = TVURL + '?' + hsh_to_rqst(options)
51
- doc = Hpricot(open(uri))
52
-
58
+ while search_results?(doc = get_hdoc)
59
+ extract_shows doc
60
+ @options[:offset] += 1
61
+ print "." if $DEBUG
62
+ end
63
+ puts if $DEBUG
64
+ return @shows
65
+ end
66
+
67
+ def extract_shows doc
53
68
  if @options[:format] == 'search'
54
69
  daten = (doc/"div[@id='titel-uebersicht']")
55
70
  daten.each do |datum|
@@ -57,11 +72,12 @@ module RTV
57
72
  unless zeiten.nil?
58
73
  zeiten = zeiten.search("span.tv-sendung-uhrzeit")
59
74
  else
75
+ puts "Keine Suchergebnisse!" if $DEBUG
60
76
  exit
61
77
  end
62
78
  zeiten.each do |zeit|
63
79
  show = Show.new
64
- show.options = @poptions
80
+ show.options = @config
65
81
  show.time = zeit.innerText
66
82
  show.desc, show.showview = time_to_desc_and_showview(zeit)
67
83
  show.name = time_to_name(zeit)
@@ -74,7 +90,7 @@ module RTV
74
90
  zeiten = (doc/"span.tv-sendung-uhrzeit")
75
91
  zeiten.each do |zeit|
76
92
  show = Show.new
77
- show.options = @poptions
93
+ show.options = @config
78
94
  show.time = zeit.innerText
79
95
  show.desc, show.showview = time_to_desc_and_showview(zeit)
80
96
  show.name = time_to_name(zeit)
@@ -82,11 +98,19 @@ module RTV
82
98
  @shows << show
83
99
  end
84
100
  end
85
-
86
- @shows
87
101
  end
88
102
 
89
103
  private
104
+ def get_hdoc
105
+ uri = TVURL + '?' + hsh_to_rqst(@options)
106
+ puts "URL: #{uri}" if $DEBUG
107
+ doc = Hpricot(open(uri))
108
+ end
109
+
110
+ def search_results? doc
111
+ (doc/"td.noresult").empty?
112
+ end
113
+
90
114
  def hsh_to_rqst hsh
91
115
  hsh.to_a.map{|x| x.map{|y| CGI.escape(y.to_s)}.join('=')}.join('&')
92
116
  end
@@ -96,7 +120,7 @@ module RTV
96
120
  end
97
121
 
98
122
  def time_to_channel zeit
99
- zeit.parent.parent.at("span.tv-sendung-info/a").attributes["href"][/channelId=([^&]+)/, 1]
123
+ zeit.parent.parent.at("span.tv-sendung-info/a").attributes["href"][/channelId=([^&]+)/, 1].downcase
100
124
  end
101
125
 
102
126
  def time_to_desc_and_showview zeit
@@ -110,16 +134,17 @@ module RTV
110
134
  class Presenter
111
135
  Source_charset = 'ISO-8859-1'
112
136
 
113
- attr_accessor :options
137
+ attr_accessor :config
114
138
 
115
139
  def initialize charset='UTF-8'
116
140
  @target_charset = charset
117
141
  end
118
142
 
119
143
  def show program
120
- @options[:channel].each do |channel|
144
+ @config[:senderfilter].each do |channel|
121
145
  lastshow = nil
122
146
  tmp = program.channel[channel]
147
+
123
148
  unless tmp.nil?
124
149
  tmp.each do |show|
125
150
  puts Iconv.iconv(@target_charset, Source_charset, show.dont_repeat(lastshow))
@@ -131,8 +156,35 @@ module RTV
131
156
  end
132
157
 
133
158
  class Switcher
134
- attr_accessor :options
135
- attr_reader :uri_options
159
+ attr_accessor :config
160
+
161
+ Usage = 'RTV - a command line ruby tv guide
162
+
163
+ USAGE
164
+
165
+ tv [ELEMENT] ...
166
+
167
+ ELEMENT kann folgende Werte enthalten:
168
+
169
+ a) TIME als Sendezeit im Format HH oder HH:MM (maximal eine TIME sinnvoll)
170
+ b) DATE als Datum im Format DD.MM
171
+ b) CHANNEL als Sender aus der Liste in doc/senderliste.txt
172
+ c) PATTERN als Suchbegriff (darf kein Sendername sein, siehe b))
173
+ d) DESCRIPTION als Beschreibung, feste Zeichenkette "-d"
174
+ e) HELP als Hilfe, feste Zeichenkette "help" (gibt diese Seite aus)
175
+
176
+
177
+ EXAMPLES
178
+
179
+ tv - Aktuelle Sendungen für ausgewählte Sender
180
+ tv 20 - Heute 20 Uhr alle Sendungen für ausgewählte Sender
181
+ tv 24.12. - Alle Sendungen an Heilig Abend für ausgewählte Sender
182
+ tv pro7 sat1 - Aktuelle Sendungen von nur Pro7 und Sat.1
183
+ tv simpsons - Alle Sendungen über Die Simpsons für alle Sender
184
+ tv -d - Aktuelle Sendungen für ausgewählte Sender mit Beschreibung
185
+
186
+ Beliebige sinnvolle Kombinationen in beliebiger Reihenfolge sind möglich:
187
+ tv pro7 -d 20 11.07. sat1 - Alle Sendungen auf Pro7 und Sat.1 um 20 Uhr am 11.07. mit Beschreibung'
136
188
 
137
189
  def initialize
138
190
  @uri_options = {}
@@ -141,41 +193,53 @@ module RTV
141
193
  def uri_options args
142
194
  set_defaults
143
195
 
144
- tmp_channel = @options[:channel]
145
- @options[:channel] = []
196
+ tmp_channel = @config[:senderfilter]
197
+ @config[:senderfilter] = []
146
198
 
147
199
  args.each do |arg|
148
- # Beschreibungmodus
149
- if arg == "-d"
150
- @options[:desc] = true
151
- # Datummodus
152
- elsif arg =~ /^\d{1,2}\.\d{1,2}\.$/
200
+ case arg.downcase
201
+ when "all"
202
+ @uri_options = all
203
+
204
+ # Hilfemodus
205
+ when "help"
206
+ puts Usage
207
+ exit
208
+
209
+ # Beschreibungmodus
210
+ when "-d"
211
+ @config[:desc] = true
212
+
213
+ # Datummodus
214
+ when /^\d{1,2}\.\d{1,2}\.$/
153
215
  @uri_options[:date] = arg + Time.now.year.to_s
154
216
 
155
- # Stundenmodus
156
- elsif arg =~ /^\d{1,2}(?:\d{2})?$/
217
+ # Stundenmodus
218
+ when /^\d{1,2}(?:\d{2})?$/
157
219
  @uri_options[:time] = arg
158
220
 
159
221
  # Channelname oder -alias
160
- elsif CHANNEL.include? arg.upcase
161
- @options[:channel] << arg.upcase
222
+ when *Channel
223
+ @config[:senderfilter] << arg.downcase
162
224
 
163
225
  # Suchmodus
164
226
  else
165
227
  @uri_options.update({:search => arg, :format => 'search', :time => 'all', :date => 'all', :slotIndex => 'all'})
166
- @options[:channel] = CHANNEL
228
+ @config[:senderfilter] = Channel
167
229
  end
168
230
  end
169
231
 
170
- @options[:channel] = tmp_channel if @options[:channel].empty?
232
+ # when channels are specified, use them only
233
+ @config[:senderfilter] = tmp_channel if @config[:senderfilter].empty?
171
234
 
172
235
  @uri_options
173
236
  end
174
237
 
175
238
  private
176
239
  def set_defaults
177
- # FreeTV
178
- @uri_options = {:date => 'now', :time => 'now', :format => 'genre', :channel => 'sendergruppeId:1,3', :order => 'time'}
240
+ # Haupt- und Regionalsender
241
+ @uri_options = {:date => 'now', :time => 'now', :format => 'genre', :channel => @config[:senderressource], :order => 'time', :offset => 0}
179
242
  end
180
243
  end
181
- end
244
+ end
245
+
metadata CHANGED
@@ -3,13 +3,13 @@ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: rtv
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.0.2
7
- date: 2007-07-13 00:00:00 +02:00
6
+ version: 0.1.1
7
+ date: 2007-07-14 00:00:00 +02:00
8
8
  summary: RTV is a command line tv guide for german television. It features a flexible argument parsing for quick usage in your favorite shell so you don't have to remember the syntax. Query shows by name, date, time or channel! Get it now!
9
9
  require_paths:
10
10
  - lib
11
11
  email: rretzbach@gmail.com
12
- homepage:
12
+ homepage: http://rtv.rubyforge.org/
13
13
  rubyforge_project:
14
14
  description:
15
15
  autorequire: rtv