added time extraction
[tvfs.git] / main.py
blob1ad418940f32f1077f5bac29d22db0ae278da115
1 #!/usr/bin/python
3 # tvfs - a simple fuse-module to mount a tv-guide as a filesystem
4 # Copyright (C) 2008, Kristian Rumberg (kristianrumberg@gmail.com)
6 # Permission to use, copy, modify, and/or distribute this software for any
7 # purpose with or without fee is hereby granted, provided that the above
8 # copyright notice and this permission notice appear in all copies.
10 # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 import urllib
19 import tempfile
20 import gzip
21 import libxml2
22 import datetime
24 class GZStream:
25 def __init__(self, url):
26 self.url = url
28 def read(self):
29 stream = urllib.urlopen(self.url)
30 buff = stream.read()
31 f = tempfile.NamedTemporaryFile()
32 f.write(buff)
33 f.flush()
34 gs = gzip.open(f.name)
35 buff = gs.read()
36 gs.close()
37 f.close()
38 return buff
40 class Program:
41 def __init__(self, name, desc, start_str, end_str):
42 self.name = name
43 self.desc = desc
44 self.start_str = start_str
45 self.end_str = end_str
47 def get_name(self):
48 return self.name
50 def get_description(self):
51 return self.desc
53 def get_start(self):
54 return self.start_str
56 def get_end(self):
57 return self.end_str
59 class ProgramList:
60 def __init__(self, name, url):
61 self.url = url
62 self.name = name
63 self.cl = []
65 istream = GZStream(url)
66 doc = libxml2.parseDoc(istream.read())
68 namelist = doc.xpathEval('//programme//title/text()')
69 desclist = doc.xpathEval('//programme//desc/text()')
70 startlist = doc.xpathEval('//programme/attribute::start')
71 endlist = doc.xpathEval('//programme/attribute::stop')
73 for name,desc,start,end in zip(namelist,desclist,startlist,endlist):
74 name = str(name.content)
75 desc = str(desc.content)
76 start = str(start.content)[8:12]
77 end = str(end.content)[8:12]
78 self.cl.append( Program(name, desc, start, end) )
80 def __iter__(self):
81 return self.cl.__iter__()
83 class Channel:
84 def __init__(self, name, baseurl):
85 self.name = name
86 self.baseurl = baseurl
87 self.today = None
89 def list_today(self):
90 if None == self.today:
91 d = datetime.datetime.now()
92 path = self.baseurl + "_" + d.strftime("%Y-%m-%d") + ".xml.gz"
93 self.today = ProgramList(self.name, path)
94 return self.today
96 def get_name(self):
97 return self.name
99 class ChannelList:
100 def __init__(self):
101 basepath = "http://tv.swedb.se/xmltv/"
102 self.cl = []
104 istream = GZStream(basepath + "channels.xml.gz")
105 doc = libxml2.parseDoc(istream.read())
107 namelist = doc.xpathEval('//display-name/text()')
108 idlist = doc.xpathEval('//channel/attribute::id')
109 baselist = doc.xpathEval('//base-url/text()')
111 for name,idn,base in zip(namelist,idlist,baselist):
112 name = str(name.content)
113 idn = str(idn.content)
114 base = str(base.content)
115 self.cl.append( Channel(name, base + idn))
117 def __iter__(self):
118 return self.cl.__iter__()
120 def main():
121 cl = ChannelList()
122 for c in cl:
123 print c.get_name()
124 pl = c.list_today()
125 for p in pl:
126 print p.get_name()
127 print p.get_start()
128 print p.get_end()
129 print p.get_description()
131 if __name__ == "__main__":
132 main()