rtv 0.1.5 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- data/README +15 -10
- data/etc/config.yaml.example +12 -0
- data/lib/#rtv.rb# +269 -0
- data/lib/rtv.rb +27 -19
- metadata +9 -7
- /data/bin/{tv.rb → rtv} +0 -0
data/README
CHANGED
@@ -19,9 +19,12 @@ CONFIGURATION
|
|
19
19
|
|
20
20
|
Folgende Optionen können in einer YAML Konfigurationsdatei $HOME/.rtv eingestellt werden:
|
21
21
|
|
22
|
-
charset
|
23
|
-
senderfilter
|
24
|
-
senderressource
|
22
|
+
charset:string Ausgabe Charset, Voreinstellung UTF-8
|
23
|
+
senderfilter:string Sender und -reihenfolge der anzuzeigenden Sender
|
24
|
+
senderressource:string Sendergruppierung aus der Liste in doc/senderliste.txt
|
25
|
+
redundanz:true|false Zeigt überflüssige Daten an (true), Voreinstellung false
|
26
|
+
eine_pro_sender:true|false Zeigt eine Sendung pro Sender (true)
|
27
|
+
senderlimit:number maximale Ergebnismenge an Sendungen
|
25
28
|
|
26
29
|
Eine Beispieldatei kann als Basis verwendet werden:
|
27
30
|
|
@@ -38,19 +41,21 @@ USAGE
|
|
38
41
|
DATE Datum im Format DD.MM
|
39
42
|
CHANNEL Sender aus der Liste in doc/senderliste.txt
|
40
43
|
PATTERN Suchbegriff (darf kein Sendername sein, siehe b))
|
44
|
+
KEY:VALUE Schlüssel und Wert für Konfigurationsoptionen
|
41
45
|
DESCRIPTION Beschreibung, feste Zeichenkette "-d"
|
42
46
|
HELP Hilfe, feste Zeichenkette "help" (gibt diese Seite aus)
|
43
47
|
|
44
48
|
|
45
49
|
EXAMPLES
|
46
50
|
|
47
|
-
tv
|
48
|
-
tv 20
|
49
|
-
tv 24.12.
|
50
|
-
tv pro7 sat1
|
51
|
-
tv simpsons
|
52
|
-
tv
|
53
|
-
tv
|
51
|
+
tv Aktuelle Sendungen für ausgewählte Sender
|
52
|
+
tv 20 Heute 20 Uhr alle Sendungen für ausgewählte Sender
|
53
|
+
tv 24.12. Alle Sendungen an Heilig Abend für ausgewählte Sender
|
54
|
+
tv pro7 sat1 Aktuelle Sendungen von nur Pro7 und Sat.1
|
55
|
+
tv simpsons Alle Sendungen über Die Simpsons für alle Sender
|
56
|
+
tv redundanz:true Zeigt alle Infos an. (Nützlich für grep)
|
57
|
+
tv -d Aktuelle Sendungen für ausgewählte Sender mit Beschreibung
|
58
|
+
tv help Gibt diese Seite aus
|
54
59
|
|
55
60
|
Beliebige sinnvolle Kombinationen in beliebiger Reihenfolge sind möglich:
|
56
61
|
tv pro7 -d 20 11.07. sat1 - Alle Sendungen auf Pro7 und Sat.1 um 20 Uhr am 11.07. mit Beschreibung
|
data/lib/#rtv.rb#
ADDED
@@ -0,0 +1,269 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'hpricot'
|
5
|
+
require 'open-uri'
|
6
|
+
require 'cgi'
|
7
|
+
require 'iconv'
|
8
|
+
require 'time'
|
9
|
+
require 'base64'
|
10
|
+
|
11
|
+
$KCODE = 'u'
|
12
|
+
|
13
|
+
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}
|
14
|
+
|
15
|
+
module RTV
|
16
|
+
class Program
|
17
|
+
attr_reader :channel
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
@channel = {}
|
21
|
+
end
|
22
|
+
def << show
|
23
|
+
@channel[show.channel] ||= []
|
24
|
+
@channel[show.channel] << show
|
25
|
+
end
|
26
|
+
end
|
27
|
+
class Show
|
28
|
+
attr_accessor :channel, :name, :time, :date, :desc, :showview, :options
|
29
|
+
|
30
|
+
Filler = "\t"
|
31
|
+
|
32
|
+
def to_s *lastshow
|
33
|
+
if @options[:redundanz]
|
34
|
+
self.to_a.compact.join(Filler)
|
35
|
+
else
|
36
|
+
lastshow = if lastshow.first.nil?
|
37
|
+
[()] * to_a.size
|
38
|
+
else
|
39
|
+
lastshow.first
|
40
|
+
end
|
41
|
+
self.to_a.zip(lastshow.to_a).map{|x,y| (x == y) ? (' ' * x.to_s.size) : x}.reject{|x| x.empty?}.join(Filler)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def to_a
|
46
|
+
tmp = [@channel, @date, @time, @name]
|
47
|
+
tmp << @desc if @options[:desc]
|
48
|
+
tmp
|
49
|
+
end
|
50
|
+
end
|
51
|
+
class Fetcher
|
52
|
+
attr_accessor :options, :config
|
53
|
+
|
54
|
+
def initialize
|
55
|
+
@options = {}
|
56
|
+
@shows = Program.new
|
57
|
+
end
|
58
|
+
|
59
|
+
def fetch
|
60
|
+
while search_results?(doc = get_hdoc)
|
61
|
+
extract_shows doc
|
62
|
+
@options[:offset] += 1
|
63
|
+
print "." if $DEBUG
|
64
|
+
end
|
65
|
+
puts if $DEBUG
|
66
|
+
return @shows
|
67
|
+
end
|
68
|
+
|
69
|
+
def extract_shows doc
|
70
|
+
if @options[:format] == 'search'
|
71
|
+
daten = (doc/"div[@id='titel-uebersicht']")
|
72
|
+
daten.each do |datum|
|
73
|
+
zeiten = datum.parent.parent.parent.next_sibling
|
74
|
+
unless zeiten.nil?
|
75
|
+
zeiten = zeiten.search("span.tv-sendung-uhrzeit")
|
76
|
+
else
|
77
|
+
puts "Keine Suchergebnisse!" if $DEBUG
|
78
|
+
exit
|
79
|
+
end
|
80
|
+
zeiten.each do |zeit|
|
81
|
+
show = Show.new
|
82
|
+
show.options = @config
|
83
|
+
show.time = zeit.innerText
|
84
|
+
show.desc, show.showview = time_to_desc_and_showview(zeit)
|
85
|
+
show.name = time_to_name(zeit)
|
86
|
+
show.channel = time_to_channel(zeit)
|
87
|
+
show.date = datum.innerText[/^\D*(.+) Suchergebnis/, 1]
|
88
|
+
add_show show
|
89
|
+
end
|
90
|
+
end
|
91
|
+
else
|
92
|
+
zeiten = (doc/"span.tv-sendung-uhrzeit")
|
93
|
+
zeiten.each do |zeit|
|
94
|
+
show = Show.new
|
95
|
+
show.options = @config
|
96
|
+
show.time = zeit.innerText
|
97
|
+
show.desc, show.showview = time_to_desc_and_showview(zeit)
|
98
|
+
show.name = time_to_name(zeit)
|
99
|
+
show.channel = time_to_channel(zeit)
|
100
|
+
add_show show
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
def add_show show
|
107
|
+
@shows << show
|
108
|
+
end
|
109
|
+
|
110
|
+
def get_hdoc
|
111
|
+
begin
|
112
|
+
uri = convert_to_url("http://www.klack.de/") + '?' + hsh_to_rqst(@options)
|
113
|
+
puts "URL: #{uri}" if $DEBUG
|
114
|
+
doc = Hpricot(open(uri))
|
115
|
+
rescue
|
116
|
+
puts "No Network Connection!"
|
117
|
+
exit
|
118
|
+
end
|
119
|
+
nur ein test ae öpseraf
|
120
|
+
end
|
121
|
+
|
122
|
+
def search_results? doc
|
123
|
+
(doc/"td.noresult").empty?
|
124
|
+
end
|
125
|
+
|
126
|
+
def hsh_to_rqst hsh
|
127
|
+
hsh.to_a.map{|x| x.map{|y| CGI.escape(y.to_s)}.join('=')}.join('&')
|
128
|
+
end
|
129
|
+
|
130
|
+
def time_to_name zeit
|
131
|
+
zeit.parent.next_sibling.next_sibling.at("a.tv-sendung-titel").innerText
|
132
|
+
end
|
133
|
+
|
134
|
+
def time_to_channel zeit
|
135
|
+
zeit.parent.parent.at("span.tv-sendung-info/a").attributes["href"][/channelId=([^&]+)/, 1].downcase
|
136
|
+
end
|
137
|
+
|
138
|
+
def time_to_desc_and_showview zeit
|
139
|
+
desc_showv = zeit.parent.parent.at("span.tv-sendung-info").innerText.strip.gsub(/[\t\r\n]+/, "\t")
|
140
|
+
desc = desc_showv.sub(/^\([^()]+\)\s+/, '').sub(/\s+Showview [0-9-]+/, '')
|
141
|
+
showview = desc_showv[/\s+Showview ([0-9-]+)/, 1]
|
142
|
+
[desc, showview]
|
143
|
+
end
|
144
|
+
|
145
|
+
def convert_to_url str
|
146
|
+
# entferne alle störenden Buchstaben und erstelle die URL
|
147
|
+
url = Base64.decode64("aHR0cDovL3d3dy50dnRvZGF5LmRlL3Byb2dyYW0yMDA3")
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
class Presenter
|
152
|
+
Source_charset = 'ISO-8859-1'
|
153
|
+
|
154
|
+
attr_accessor :config
|
155
|
+
|
156
|
+
def initialize charset = 'UTF-8'
|
157
|
+
@target_charset = charset
|
158
|
+
end
|
159
|
+
|
160
|
+
def show program
|
161
|
+
senderlimit = @config[:senderlimit]
|
162
|
+
@config[:senderfilter].each do |channel|
|
163
|
+
lastshow = nil
|
164
|
+
tmp = program.channel[channel]
|
165
|
+
|
166
|
+
unless tmp.nil?
|
167
|
+
tmp.each do |show|
|
168
|
+
return if (@config[:senderlimit] -= 1) < 1
|
169
|
+
|
170
|
+
puts Iconv.iconv(@target_charset, Source_charset, show.to_s(lastshow))
|
171
|
+
|
172
|
+
break if @config[:eine_pro_sender]
|
173
|
+
lastshow = show
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
class Switcher
|
181
|
+
attr_accessor :config
|
182
|
+
|
183
|
+
Usage = 'RTV - a command line ruby tv guide
|
184
|
+
|
185
|
+
USAGE
|
186
|
+
|
187
|
+
tv [ELEMENT] ...
|
188
|
+
|
189
|
+
ELEMENT kann folgende Werte enthalten:
|
190
|
+
|
191
|
+
a) TIME als Sendezeit im Format HH oder HH:MM (maximal eine TIME sinnvoll)
|
192
|
+
b) DATE als Datum im Format DD.MM
|
193
|
+
b) CHANNEL als Sender aus der Liste in doc/senderliste.txt
|
194
|
+
c) PATTERN als Suchbegriff (darf kein Sendername sein, siehe b))
|
195
|
+
d) DESCRIPTION als Beschreibung, feste Zeichenkette "-d"
|
196
|
+
e) HELP als Hilfe, feste Zeichenkette "help" (gibt diese Seite aus)
|
197
|
+
|
198
|
+
|
199
|
+
EXAMPLES
|
200
|
+
|
201
|
+
tv - Aktuelle Sendungen für ausgewählte Sender
|
202
|
+
tv 20 - Heute 20 Uhr alle Sendungen für ausgewählte Sender
|
203
|
+
tv 24.12. - Alle Sendungen an Heilig Abend für ausgewählte Sender
|
204
|
+
tv pro7 sat1 - Aktuelle Sendungen von nur Pro7 und Sat.1
|
205
|
+
tv simpsons - Alle Sendungen über Die Simpsons für alle Sender
|
206
|
+
tv -d - Aktuelle Sendungen für ausgewählte Sender mit Beschreibung
|
207
|
+
|
208
|
+
Beliebige sinnvolle Kombinationen in beliebiger Reihenfolge sind möglich:
|
209
|
+
tv pro7 -d 20 11.07. sat1 - Alle Sendungen auf Pro7 und Sat.1 um 20 Uhr am 11.07. mit Beschreibung'
|
210
|
+
|
211
|
+
def initialize
|
212
|
+
@uri_options = {}
|
213
|
+
end
|
214
|
+
|
215
|
+
def uri_options args
|
216
|
+
set_defaults
|
217
|
+
|
218
|
+
tmp_channel = @config[:senderfilter]
|
219
|
+
@config[:senderfilter] = []
|
220
|
+
|
221
|
+
args.each do |arg|
|
222
|
+
case arg.downcase
|
223
|
+
|
224
|
+
# Konfigurationenmodus
|
225
|
+
when /(\w+):(\w+)/
|
226
|
+
@config.update YAML.load("--- :" + $1 + ": " + $2)
|
227
|
+
|
228
|
+
# Hilfemodus
|
229
|
+
when "help"
|
230
|
+
puts Usage
|
231
|
+
exit
|
232
|
+
|
233
|
+
# Beschreibungmodus
|
234
|
+
when "-d"
|
235
|
+
@config[:desc] = true
|
236
|
+
|
237
|
+
# Datummodus
|
238
|
+
when /^\d{1,2}\.\d{1,2}\.$/
|
239
|
+
@uri_options[:date] = arg + Time.now.year.to_s
|
240
|
+
|
241
|
+
# Stundenmodus
|
242
|
+
when /^\d{1,2}(?:\d{2})?$/
|
243
|
+
@uri_options[:time] = arg
|
244
|
+
|
245
|
+
# Channelname oder -alias
|
246
|
+
when *Channel
|
247
|
+
@config[:senderfilter] << arg.downcase
|
248
|
+
|
249
|
+
# Suchmodus
|
250
|
+
else
|
251
|
+
@uri_options.update({:search => arg, :format => 'search', :time => 'all', :date => 'all', :slotIndex => 'all'})
|
252
|
+
@config[:senderfilter] = Channel
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
# when channels are specified, use them only
|
257
|
+
@config[:senderfilter] = tmp_channel if @config[:senderfilter].empty?
|
258
|
+
|
259
|
+
@uri_options
|
260
|
+
end
|
261
|
+
|
262
|
+
private
|
263
|
+
def set_defaults
|
264
|
+
# Haupt- und Regionalsender
|
265
|
+
@uri_options = {:date => 'now', :time => 'now', :format => 'genre', :channel => @config[:senderressource], :order => 'time', :offset => 0}
|
266
|
+
end
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
data/lib/rtv.rb
CHANGED
@@ -108,9 +108,14 @@ module RTV
|
|
108
108
|
end
|
109
109
|
|
110
110
|
def get_hdoc
|
111
|
-
|
112
|
-
|
113
|
-
|
111
|
+
begin
|
112
|
+
uri = convert_to_url("http://www.klack.de/") + '?' + hsh_to_rqst(@options)
|
113
|
+
puts "URL: #{uri}" if $DEBUG
|
114
|
+
doc = Hpricot(open(uri))
|
115
|
+
rescue
|
116
|
+
puts "No Network Connection!"
|
117
|
+
exit
|
118
|
+
end
|
114
119
|
end
|
115
120
|
|
116
121
|
def search_results? doc
|
@@ -178,29 +183,32 @@ module RTV
|
|
178
183
|
|
179
184
|
USAGE
|
180
185
|
|
181
|
-
|
186
|
+
tv [ELEMENT] ...
|
182
187
|
|
183
|
-
|
188
|
+
ELEMENT kann folgende Werte enthalten:
|
184
189
|
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
190
|
+
TIME Sendezeit im Format HH oder HH:MM (maximal eine TIME sinnvoll)
|
191
|
+
DATE Datum im Format DD.MM
|
192
|
+
CHANNEL Sender aus der Liste in doc/senderliste.txt
|
193
|
+
PATTERN Suchbegriff (darf kein Sendername sein, siehe b))
|
194
|
+
KEY:VALUE Schlüssel und Wert für Konfigurationsoptionen
|
195
|
+
DESCRIPTION Beschreibung, feste Zeichenkette "-d"
|
196
|
+
HELP Hilfe, feste Zeichenkette "help" (gibt diese Seite aus)
|
191
197
|
|
192
198
|
|
193
199
|
EXAMPLES
|
194
200
|
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
+
tv Aktuelle Sendungen für ausgewählte Sender
|
202
|
+
tv 20 Heute 20 Uhr alle Sendungen für ausgewählte Sender
|
203
|
+
tv 24.12. Alle Sendungen an Heilig Abend für ausgewählte Sender
|
204
|
+
tv pro7 sat1 Aktuelle Sendungen von nur Pro7 und Sat.1
|
205
|
+
tv simpsons Alle Sendungen über Die Simpsons für alle Sender
|
206
|
+
tv redundanz:true Zeigt alle Infos an. (Nützlich für grep)
|
207
|
+
tv -d Aktuelle Sendungen für ausgewählte Sender mit Beschreibung
|
208
|
+
tv help Gibt diese Seite aus
|
201
209
|
|
202
|
-
|
203
|
-
|
210
|
+
Beliebige sinnvolle Kombinationen in beliebiger Reihenfolge sind möglich:
|
211
|
+
tv pro7 -d 20 11.07. sat1 - Alle Sendungen auf Pro7 und Sat.1 um 20 Uhr am 11.07. mit Beschreibung'
|
204
212
|
|
205
213
|
def initialize
|
206
214
|
@uri_options = {}
|
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.1.
|
7
|
-
date: 2007-07-
|
8
|
-
summary: RTV is a command line tv guide for german television.
|
6
|
+
version: 0.1.6
|
7
|
+
date: 2007-07-16 00:00:00 +02:00
|
8
|
+
summary: RTV is a command line tv guide for german television.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
11
11
|
email: rretzbach@gmail.com
|
12
|
-
homepage: http://
|
12
|
+
homepage: http://rubyforge.org/projects/rtv/1
|
13
13
|
rubyforge_project:
|
14
14
|
description:
|
15
15
|
autorequire: rtv
|
@@ -29,9 +29,11 @@ post_install_message:
|
|
29
29
|
authors:
|
30
30
|
- Robert Retzbach
|
31
31
|
files:
|
32
|
-
- bin/
|
32
|
+
- bin/rtv
|
33
|
+
- lib/#rtv.rb#
|
33
34
|
- lib/rtv.rb
|
34
35
|
- doc/senderliste.txt
|
36
|
+
- etc/config.yaml.example
|
35
37
|
- README
|
36
38
|
test_files: []
|
37
39
|
|
@@ -39,8 +41,8 @@ rdoc_options: []
|
|
39
41
|
|
40
42
|
extra_rdoc_files:
|
41
43
|
- README
|
42
|
-
executables:
|
43
|
-
|
44
|
+
executables:
|
45
|
+
- rtv
|
44
46
|
extensions: []
|
45
47
|
|
46
48
|
requirements: []
|
/data/bin/{tv.rb → rtv}
RENAMED
File without changes
|