rtv 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README +39 -0
- data/bin/tv.rb +20 -0
- data/doc/senderliste.txt +114 -0
- data/lib/rtv.rb +181 -0
- metadata +57 -0
data/README
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
RTV - a command line ruby tv guide
|
2
|
+
|
3
|
+
REQUIREMENTS
|
4
|
+
|
5
|
+
Hpricot ab Version 0.6 wird für das Parsen des HTML Inhaltes verwendet und muss installiert sein.
|
6
|
+
Es kann als Source .gz von http://code.whytheluckystiff.net/hpricot/ oder als gem "hpricot" bezogen werden.
|
7
|
+
|
8
|
+
INSTALLATION
|
9
|
+
|
10
|
+
Ich empfehle einen symbolischen Link namens tv zu erstellen:
|
11
|
+
|
12
|
+
1. chmod +x rtv.rb
|
13
|
+
2. ln -s /bin/tv.rb ~/bin/tv
|
14
|
+
|
15
|
+
|
16
|
+
USAGE
|
17
|
+
|
18
|
+
tv [ELEMENT] ...
|
19
|
+
|
20
|
+
ELEMENT kann folgende Werte enthalten:
|
21
|
+
|
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")
|
27
|
+
|
28
|
+
|
29
|
+
EXAMPLES
|
30
|
+
|
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
|
37
|
+
|
38
|
+
Beliebige sinnvolle Kombinationen in beliebiger Reihenfolge sind möglich:
|
39
|
+
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
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rtv'
|
3
|
+
|
4
|
+
if __FILE__ == $0
|
5
|
+
poptions = {}
|
6
|
+
poptions[:channel] = %w{ PRO7 ARTE 3SAT RTL2 SAT1 VOX RTL K1 }
|
7
|
+
|
8
|
+
swtch = RTV::Switcher.new
|
9
|
+
swtch.options = poptions
|
10
|
+
|
11
|
+
rtv = RTV::Fetcher.new
|
12
|
+
rtv.poptions = poptions
|
13
|
+
rtv.options = swtch.uri_options(ARGV.dup)
|
14
|
+
program = rtv.fetch
|
15
|
+
|
16
|
+
prtr = RTV::Presenter.new 'UTF-8'
|
17
|
+
|
18
|
+
prtr.options = swtch.options
|
19
|
+
prtr.show program
|
20
|
+
end
|
data/doc/senderliste.txt
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
alle => all
|
2
|
+
Free TV => hauptgruppeId:1,3
|
3
|
+
Pay TV => hauptgruppeId:2
|
4
|
+
Digital TV => hauptgruppeId:3
|
5
|
+
Haupt- und Regionalsender => sendergruppeId:1,3
|
6
|
+
Hauptsender und Dritte => sendergruppeId:1,2
|
7
|
+
Haupt => sendergruppeId:1
|
8
|
+
ZDF => ZDF
|
9
|
+
RTL => RTL
|
10
|
+
SAT.1 => SAT1
|
11
|
+
PRO SIEBEN => PRO7
|
12
|
+
KABEL 1 => K1
|
13
|
+
RTL II => RTL2
|
14
|
+
SUPER RTL => SUPER
|
15
|
+
VOX => VOX
|
16
|
+
ARTE => ARTE
|
17
|
+
Tele 5 => TELE5
|
18
|
+
3SAT => 3SAT
|
19
|
+
Das Vierte => DVIER
|
20
|
+
BAYERN => BR
|
21
|
+
HESSEN => HR
|
22
|
+
MDR => MDR
|
23
|
+
NDR => N3
|
24
|
+
RBB => RBB
|
25
|
+
SÜDWEST => SWR
|
26
|
+
WDR => WDR
|
27
|
+
Regional => sendergruppeId:3
|
28
|
+
BRalpha => BRALP
|
29
|
+
TV Berlin => TVB
|
30
|
+
HH 1 => H1
|
31
|
+
Ausland (deutschspr.) => sendergruppeId:4
|
32
|
+
ORF 1 => ORF1
|
33
|
+
ORF 2 => ORF2
|
34
|
+
ATVplus => ATV
|
35
|
+
SF 1 => SF1
|
36
|
+
SF2 => SF2
|
37
|
+
Premiere => sendergruppeId:5
|
38
|
+
Premiere Start => PRS
|
39
|
+
Digital => sendergruppeId:7
|
40
|
+
DW TV => DWTV
|
41
|
+
EinsExtra => EXTRA
|
42
|
+
EinsFestival => FES
|
43
|
+
EinsPlus => MUX
|
44
|
+
Theaterkanal => ZTK
|
45
|
+
ZDF doku => ZDOKU
|
46
|
+
ZDF info => ZINFO
|
47
|
+
Sport => sendergruppeId:8
|
48
|
+
DSF => DSF
|
49
|
+
EUROSPORT => EURO
|
50
|
+
Musik => sendergruppeId:9
|
51
|
+
MTV => MTV
|
52
|
+
VIVA => VIVA
|
53
|
+
Sparten => sendergruppeId:10
|
54
|
+
NICKELODEON => NICK
|
55
|
+
Kinderkanal => KIKA
|
56
|
+
QVC => QVC
|
57
|
+
TW1 => TW1
|
58
|
+
TERRA NOVA => TENO
|
59
|
+
Comedy Central => CC
|
60
|
+
News => sendergruppeId:11
|
61
|
+
BBC WORLD => BBC
|
62
|
+
CNN => CNN
|
63
|
+
Euronews => EURON
|
64
|
+
N 24 => N24
|
65
|
+
N-TV => NTV
|
66
|
+
Bloomberg TV => BLM
|
67
|
+
DMAX => DMAX
|
68
|
+
Ausland => sendergruppeId:12
|
69
|
+
NL 1 => NL1
|
70
|
+
NL 2 => NL2
|
71
|
+
NL 3 => NL3
|
72
|
+
Premiere Sport => sendergruppeId:13
|
73
|
+
Premiere Sport Portal => PSPO1
|
74
|
+
Premiere Direkt => sendergruppeId:15
|
75
|
+
Premiere Direkt => DIR1
|
76
|
+
Premiere Thema => sendergruppeId:16
|
77
|
+
Goldstar TV => GOLD
|
78
|
+
Heimatkanal => HEIMA
|
79
|
+
Animal Planet => APLAN
|
80
|
+
Beate Uhse TV => BUTV
|
81
|
+
Discovery Channel => DISCO
|
82
|
+
Junior => JUNIO
|
83
|
+
MGM => MGM
|
84
|
+
Planet => PLANE
|
85
|
+
Premiere Sci-Fi => SCIFI
|
86
|
+
13th Street => 13TH
|
87
|
+
hit24 => HIT24
|
88
|
+
Discovery Geschichte => DISGE
|
89
|
+
Focus Gesundheit => FOGE
|
90
|
+
Blue Movie => sendergruppeId:17
|
91
|
+
Blue Movie => BLUM
|
92
|
+
Blue Movie Extra => BLUME
|
93
|
+
Arena => sendergruppeId:18
|
94
|
+
Arena => ARENA
|
95
|
+
Kabel/Satellit => sendergruppeId:19
|
96
|
+
AXN => AXN
|
97
|
+
Kinowelt => KINOW
|
98
|
+
SAT.1 omedy => SAT1C
|
99
|
+
Silverline => SILVE
|
100
|
+
History Channel => HISTO
|
101
|
+
NASN => NASN
|
102
|
+
Toon Disney => TOON
|
103
|
+
Premiere Blockbuster => sendergruppeId:20
|
104
|
+
Premiere 1 => PR1
|
105
|
+
Premiere 2 => PR2
|
106
|
+
Premiere 3 => PR3
|
107
|
+
Premiere 4 => PR4
|
108
|
+
Disney Chanel => DISNE
|
109
|
+
Premiere Entertainment => sendergruppeId:21
|
110
|
+
Premiere Filmclassics => PRFC
|
111
|
+
Premiere Filmfest => PRFF
|
112
|
+
Premiere Nostalgie => PRN
|
113
|
+
Premiere Serie => PRSER
|
114
|
+
Premiere Krimi => KRIMI
|
data/lib/rtv.rb
ADDED
@@ -0,0 +1,181 @@
|
|
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
|
+
|
10
|
+
$KCODE = 'u'
|
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"]
|
13
|
+
|
14
|
+
module RTV
|
15
|
+
class Program
|
16
|
+
attr_reader :channel
|
17
|
+
|
18
|
+
def initialize
|
19
|
+
@channel = {}
|
20
|
+
end
|
21
|
+
def << show
|
22
|
+
@channel[show.channel] ||= []
|
23
|
+
@channel[show.channel] << show
|
24
|
+
end
|
25
|
+
end
|
26
|
+
class Show
|
27
|
+
attr_accessor :channel, :name, :time, :date, :desc, :showview, :options
|
28
|
+
Filler = "\t"
|
29
|
+
|
30
|
+
def dont_repeat lastshow = ['', '', '', '']
|
31
|
+
self.to_a.zip(lastshow.to_a).map{|x,y| (x == y) ? (' ' * x.to_s.size) : x}.compact.join(Filler)
|
32
|
+
end
|
33
|
+
def to_a
|
34
|
+
tmp = [@channel, @date, @time, @name]
|
35
|
+
tmp << @desc if @options[:desc]
|
36
|
+
tmp
|
37
|
+
end
|
38
|
+
end
|
39
|
+
class Fetcher
|
40
|
+
TVURL = 'http://www.tvtoday.de/program2007'
|
41
|
+
|
42
|
+
attr_accessor :options, :poptions
|
43
|
+
|
44
|
+
def initialize
|
45
|
+
@options = {}
|
46
|
+
@shows = Program.new
|
47
|
+
end
|
48
|
+
|
49
|
+
def fetch
|
50
|
+
uri = TVURL + '?' + hsh_to_rqst(options)
|
51
|
+
doc = Hpricot(open(uri))
|
52
|
+
|
53
|
+
if @options[:format] == 'search'
|
54
|
+
daten = (doc/"div[@id='titel-uebersicht']")
|
55
|
+
daten.each do |datum|
|
56
|
+
zeiten = datum.parent.parent.parent.next_sibling
|
57
|
+
unless zeiten.nil?
|
58
|
+
zeiten = zeiten.search("span.tv-sendung-uhrzeit")
|
59
|
+
else
|
60
|
+
exit
|
61
|
+
end
|
62
|
+
zeiten.each do |zeit|
|
63
|
+
show = Show.new
|
64
|
+
show.options = @poptions
|
65
|
+
show.time = zeit.innerText
|
66
|
+
show.desc, show.showview = time_to_desc_and_showview(zeit)
|
67
|
+
show.name = time_to_name(zeit)
|
68
|
+
show.channel = time_to_channel(zeit)
|
69
|
+
show.date = datum.innerText[/^\D*(.+) Suchergebnis/, 1]
|
70
|
+
@shows << show
|
71
|
+
end
|
72
|
+
end
|
73
|
+
else
|
74
|
+
zeiten = (doc/"span.tv-sendung-uhrzeit")
|
75
|
+
zeiten.each do |zeit|
|
76
|
+
show = Show.new
|
77
|
+
show.options = @poptions
|
78
|
+
show.time = zeit.innerText
|
79
|
+
show.desc, show.showview = time_to_desc_and_showview(zeit)
|
80
|
+
show.name = time_to_name(zeit)
|
81
|
+
show.channel = time_to_channel(zeit)
|
82
|
+
@shows << show
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
@shows
|
87
|
+
end
|
88
|
+
|
89
|
+
private
|
90
|
+
def hsh_to_rqst hsh
|
91
|
+
hsh.to_a.map{|x| x.map{|y| CGI.escape(y.to_s)}.join('=')}.join('&')
|
92
|
+
end
|
93
|
+
|
94
|
+
def time_to_name zeit
|
95
|
+
zeit.parent.next_sibling.next_sibling.at("a.tv-sendung-titel").innerText
|
96
|
+
end
|
97
|
+
|
98
|
+
def time_to_channel zeit
|
99
|
+
zeit.parent.parent.at("span.tv-sendung-info/a").attributes["href"][/channelId=([^&]+)/, 1]
|
100
|
+
end
|
101
|
+
|
102
|
+
def time_to_desc_and_showview zeit
|
103
|
+
desc_showv = zeit.parent.parent.at("span.tv-sendung-info").innerText.strip.gsub(/[\t\r\n]+/, "\t")
|
104
|
+
desc = desc_showv.sub(/^\([^()]+\)\s+/, '').sub(/\s+Showview [0-9-]+/, '')
|
105
|
+
showview = desc_showv[/\s+Showview ([0-9-]+)/, 1]
|
106
|
+
[desc, showview]
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
class Presenter
|
111
|
+
Source_charset = 'ISO-8859-1'
|
112
|
+
|
113
|
+
attr_accessor :options
|
114
|
+
|
115
|
+
def initialize charset='UTF-8'
|
116
|
+
@target_charset = charset
|
117
|
+
end
|
118
|
+
|
119
|
+
def show program
|
120
|
+
@options[:channel].each do |channel|
|
121
|
+
lastshow = nil
|
122
|
+
tmp = program.channel[channel]
|
123
|
+
unless tmp.nil?
|
124
|
+
tmp.each do |show|
|
125
|
+
puts Iconv.iconv(@target_charset, Source_charset, show.dont_repeat(lastshow))
|
126
|
+
lastshow = show
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
class Switcher
|
134
|
+
attr_accessor :options
|
135
|
+
attr_reader :uri_options
|
136
|
+
|
137
|
+
def initialize
|
138
|
+
@uri_options = {}
|
139
|
+
end
|
140
|
+
|
141
|
+
def uri_options args
|
142
|
+
set_defaults
|
143
|
+
|
144
|
+
tmp_channel = @options[:channel]
|
145
|
+
@options[:channel] = []
|
146
|
+
|
147
|
+
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}\.$/
|
153
|
+
@uri_options[:date] = arg + Time.now.year.to_s
|
154
|
+
|
155
|
+
# Stundenmodus
|
156
|
+
elsif arg =~ /^\d{1,2}(?:\d{2})?$/
|
157
|
+
@uri_options[:time] = arg
|
158
|
+
|
159
|
+
# Channelname oder -alias
|
160
|
+
elsif CHANNEL.include? arg.upcase
|
161
|
+
@options[:channel] << arg.upcase
|
162
|
+
|
163
|
+
# Suchmodus
|
164
|
+
else
|
165
|
+
@uri_options.update({:search => arg, :format => 'search', :time => 'all', :date => 'all', :slotIndex => 'all'})
|
166
|
+
@options[:channel] = CHANNEL
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
@options[:channel] = tmp_channel if @options[:channel].empty?
|
171
|
+
|
172
|
+
@uri_options
|
173
|
+
end
|
174
|
+
|
175
|
+
private
|
176
|
+
def set_defaults
|
177
|
+
# FreeTV
|
178
|
+
@uri_options = {:date => 'now', :time => 'now', :format => 'genre', :channel => 'sendergruppeId:1,3', :order => 'time'}
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
metadata
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.9.4
|
3
|
+
specification_version: 1
|
4
|
+
name: rtv
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 0.0.2
|
7
|
+
date: 2007-07-13 00:00:00 +02:00
|
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
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: rretzbach@gmail.com
|
12
|
+
homepage:
|
13
|
+
rubyforge_project:
|
14
|
+
description:
|
15
|
+
autorequire: rtv
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: false
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
24
|
+
version:
|
25
|
+
platform: ruby
|
26
|
+
signing_key:
|
27
|
+
cert_chain:
|
28
|
+
post_install_message:
|
29
|
+
authors:
|
30
|
+
- Robert Retzbach
|
31
|
+
files:
|
32
|
+
- bin/tv.rb
|
33
|
+
- lib/rtv.rb
|
34
|
+
- doc/senderliste.txt
|
35
|
+
- README
|
36
|
+
test_files: []
|
37
|
+
|
38
|
+
rdoc_options: []
|
39
|
+
|
40
|
+
extra_rdoc_files:
|
41
|
+
- README
|
42
|
+
executables: []
|
43
|
+
|
44
|
+
extensions: []
|
45
|
+
|
46
|
+
requirements: []
|
47
|
+
|
48
|
+
dependencies:
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: hpricot
|
51
|
+
version_requirement:
|
52
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: "0.6"
|
57
|
+
version:
|