pyTivo
[pyTivo/krkeegan.git] / plugin.py
blobb728b3192878b3d0a7af27e89be2d3e3da95ce6a
1 import os, shutil, re
2 from urllib import unquote, unquote_plus
3 from urlparse import urlparse
5 def GetPlugin(name):
6 module_name = '.'.join(['plugins', name, name])
7 module = __import__(module_name, fromlist=name)
8 plugin = getattr(module, name)()
9 return plugin
11 class Plugin:
13 content_type = ''
15 def SendFile(self, handler, container, name):
16 o = urlparse("http://fake.host" + handler.path)
17 path = unquote_plus(o.path)
18 handler.send_response(200)
19 handler.end_headers()
20 f = file(container['path'] + path[len(name)+1:], 'rb')
21 shutil.copyfileobj(f, handler.wfile)
23 def get_local_path(self, handler, query):
25 subcname = query['Container'][0]
26 container = handler.server.containers[subcname.split('/')[0]]
28 path = container['path']
29 for folder in subcname.split('/')[1:]:
30 if folder == '..':
31 return False
32 path = os.path.join(path, folder)
33 return path
35 def get_files(self, handler, query, filterFunction=None):
36 subcname = query['Container'][0]
37 path = self.get_local_path(handler, query)
39 files = os.listdir(path)
40 if filterFunction:
41 files = filter(filterFunction, files)
42 totalFiles = len(files)
44 def dir_sort(x, y):
45 xdir = os.path.isdir(os.path.join(path, x))
46 ydir = os.path.isdir(os.path.join(path, y))
48 if xdir and ydir:
49 return name_sort(x, y)
50 elif xdir:
51 return -1
52 elif ydir:
53 return 1
54 else:
55 return name_sort(x, y)
57 def name_sort(x, y):
58 numbername = re.compile(r'(\d*)(.*)')
59 m = numbername.match(x)
60 xNumber = m.group(1)
61 xStr = m.group(2)
62 m = numbername.match(y)
63 yNumber = m.group(1)
64 yStr = m.group(2)
66 if xNumber and yNumber:
67 xNumber, yNumber = int(xNumber), int(yNumber)
68 if xNumber == yNumber:
69 return cmp(xStr, yStr)
70 else:
71 return cmp(xNumber, yNumber)
72 elif xNumber:
73 return -1
74 elif yNumber:
75 return 1
76 else:
77 return cmp(xStr, yStr)
79 files.sort(dir_sort)
81 index = 0
82 count = 10
83 if query.has_key('ItemCount'):
84 count = int(query['ItemCount'] [0])
86 if query.has_key('AnchorItem'):
87 anchor = unquote(query['AnchorItem'][0])
88 for i in range(len(files)):
89 if os.path.isdir(os.path.join(path,files[i])):
90 file_url = '/TiVoConnect?Command=QueryContainer&Container=' + subcname + '/' + files[i]
91 else:
92 file_url = '/' + subcname + '/' + files[i]
93 if file_url == anchor:
94 if count > 0:
95 index = i + 1
96 elif count < 0:
97 index = i - 1
98 else:
99 index = i
100 break
101 if query.has_key('AnchorOffset'):
102 index = index + int(query['AnchorOffset'][0])
104 if index < index + count:
105 files = files[max(index, 0):index + count ]
106 return files, totalFiles, index
107 else:
108 files = files[max(index + count, 0):index]
109 return files, totalFiles, index + count