add support for avi/mkv .... please note that not all is working yet, and
[enigma2.git] / lib / python / Components / FileList.py
1 import re
2
3 from os import path as os_path, listdir
4 from MenuList import MenuList
5 from Components.Harddisk import harddiskmanager
6
7 from Tools.Directories import SCOPE_SKIN_IMAGE, resolveFilename
8
9 from enigma import RT_HALIGN_LEFT, eListbox, eListboxPythonMultiContent, \
10         eServiceReference, eServiceCenter, gFont
11 from Tools.LoadPixmap import LoadPixmap
12
13 EXTENSIONS = {
14                 "mp3": "music",
15                 "wav": "music",
16                 "ogg": "music",
17                 "jpg": "picture",
18                 "jpeg": "picture",
19                 "png": "picture",
20                 "bmp": "picture",
21                 "ts": "movie",
22                 "avi": "movie",
23                 "mpg": "movie",
24                 "mpeg": "movie",
25                 "mkv": "movie",
26                 "avi": "movie",
27         }
28
29 def FileEntryComponent(name, absolute = None, isDir = False):
30         res = [ (absolute, isDir) ]
31         res.append((eListboxPythonMultiContent.TYPE_TEXT, 35, 1, 470, 20, 0, RT_HALIGN_LEFT, name))
32         if isDir:
33                 png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "extensions/directory.png"))
34         else:
35                 extension = name.split('.')
36                 extension = extension[-1].lower()
37                 if EXTENSIONS.has_key(extension):
38                         png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "extensions/" + EXTENSIONS[extension] + ".png"))
39                 else:
40                         png = None
41         if png is not None:
42                 res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 10, 2, 20, 20, png))
43         
44         return res
45
46 class FileList(MenuList):
47         def __init__(self, directory, showDirectories = True, showFiles = True, showMountpoints = True, matchingPattern = None, useServiceRef = False, inhibitDirs = False, inhibitMounts = False, enableWrapAround = False, additionalExtensions = None):
48                 MenuList.__init__(self, list, enableWrapAround, eListboxPythonMultiContent)
49                 self.additional_extensions = additionalExtensions
50                 self.mountpoints = []
51                 self.current_directory = None
52                 self.current_mountpoint = None
53                 self.useServiceRef = useServiceRef
54                 self.showDirectories = showDirectories
55                 self.showMountpoints = showMountpoints
56                 self.showFiles = showFiles
57                 # example: matching .nfi and .ts files: "^.*\.(nfi|ts)"
58                 self.matchingPattern = matchingPattern
59                 self.inhibitDirs = inhibitDirs or []
60                 self.inhibitMounts = inhibitMounts or []
61
62                 self.refreshMountpoints()
63                 self.changeDir(directory)
64                 self.l.setFont(0, gFont("Regular", 18))
65                 self.l.setItemHeight(23)
66                 self.serviceHandler = eServiceCenter.getInstance()
67
68         def refreshMountpoints(self):
69                 self.mountpoints = [os_path.join(p.mountpoint, "") for p in harddiskmanager.getMountedPartitions()]
70                 self.mountpoints.sort(reverse = True)
71
72         def getMountpoint(self, file):
73                 file = os_path.join(os_path.realpath(file), "")
74                 for m in self.mountpoints:
75                         if file.startswith(m):
76                                 return m
77                 return False
78
79         def getMountpointLink(self, file):
80                 if os_path.realpath(file) == file:
81                         return self.getMountpoint(file)
82                 else:
83                         if file[-1] == "/":
84                                 file = file[:-1]
85                         mp = self.getMountpoint(file)
86                         last = file
87                         file = os_path.dirname(file)
88                         while last != "/" and mp == self.getMountpoint(file):
89                                 last = file
90                                 file = os_path.dirname(file)
91                         return os_path.join(last, "")
92
93         def getSelection(self):
94                 if self.l.getCurrentSelection() is None:
95                         return None
96                 return self.l.getCurrentSelection()[0]
97
98         def getCurrentEvent(self):
99                 l = self.l.getCurrentSelection()
100                 if not l or l[0][1] == True:
101                         return None
102                 else:
103                         return self.serviceHandler.info(l[0][0]).getEvent(l[0][0])
104
105         def getFileList(self):
106                 return self.list
107
108         def inParentDirs(self, dir, parents):
109                 dir = os_path.realpath(dir)
110                 for p in parents:
111                         if dir.startswith(p):
112                                 return True
113                 return False
114
115         def changeDir(self, directory, select = None):
116                 self.list = []
117
118                 if directory and not os_path.isdir(directory):
119                         directory = None
120                 # if we are just entering from the list of mount points:
121                 if self.current_directory is None:
122                         if directory and self.showMountpoints:
123                                 self.current_mountpoint = self.getMountpointLink(directory)
124                         else:
125                                 self.current_mountpoint = None
126                 self.current_directory = directory
127                 directories = []
128                 files = []
129
130                 if directory is None and self.showMountpoints: # present available mountpoints
131                         for p in harddiskmanager.getMountedPartitions():
132                                 path = os_path.join(p.mountpoint, "")
133                                 if path not in self.inhibitMounts and not self.inParentDirs(path, self.inhibitDirs):
134                                         self.list.append(FileEntryComponent(name = p.description, absolute = path, isDir = True))
135                         files = [ ]
136                         directories = [ ]
137                 elif self.useServiceRef:
138                         root = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + directory)
139                         if self.additional_extensions:
140                                 root.setName(self.additional_extensions)
141                         serviceHandler = eServiceCenter.getInstance()
142                         list = serviceHandler.list(root)
143
144                         while 1:
145                                 s = list.getNext()
146                                 if not s.valid():
147                                         del list
148                                         break
149                                 if s.flags & s.mustDescent:
150                                         directories.append(s.getPath())
151                                 else:
152                                         files.append(s)
153                         directories.sort()
154                         files.sort()
155                 else:
156                         if os_path.exists(directory):
157                                 files = listdir(directory)
158                                 files.sort()
159                                 tmpfiles = files[:]
160                                 for x in tmpfiles:
161                                         if os_path.isdir(directory + x):
162                                                 directories.append(directory + x + "/")
163                                                 files.remove(x)
164
165                 if directory is not None and self.showDirectories:
166                         if directory == self.current_mountpoint and self.showMountpoints:
167                                 self.list.append(FileEntryComponent(name = "<" +_("List of Storage Devices") + ">", absolute = None, isDir = True))
168                         elif (directory != "/") and not (self.inhibitMounts and self.getMountpoint(directory) in self.inhibitMounts):
169                                 self.list.append(FileEntryComponent(name = "<" +_("Parent Directory") + ">", absolute = '/'.join(directory.split('/')[:-2]) + '/', isDir = True))
170
171                 if self.showDirectories:
172                         for x in directories:
173                                 if not (self.inhibitMounts and self.getMountpoint(x) in self.inhibitMounts) and not self.inParentDirs(x, self.inhibitDirs):
174                                         name = x.split('/')[-2]
175                                         self.list.append(FileEntryComponent(name = name, absolute = x, isDir = True))
176
177                 if self.showFiles:
178                         for x in files:
179                                 if self.useServiceRef:
180                                         path = x.getPath()
181                                         name = path.split('/')[-1]
182                                 else:
183                                         path = directory + x
184                                         name = x
185
186                                 if (self.matchingPattern is None) or re.compile(self.matchingPattern).search(path):
187                                         self.list.append(FileEntryComponent(name = name, absolute = x , isDir = False))
188
189                 self.l.setList(self.list)
190
191                 if select is not None:
192                         i = 0
193                         self.moveToIndex(0)
194                         for x in self.list:
195                                 p = x[0][0]
196                                 
197                                 if isinstance(p, eServiceReference):
198                                         p = p.getPath()
199                                 
200                                 if p == select:
201                                         self.moveToIndex(i)
202                                 i += 1
203
204         def getCurrentDirectory(self):
205                 return self.current_directory
206
207         def canDescent(self):
208                 if self.getSelection() is None:
209                         return False
210                 return self.getSelection()[1]
211
212         def descent(self):
213                 if self.getSelection() is None:
214                         return
215                 self.changeDir(self.getSelection()[0], select = self.current_directory)
216
217         def getFilename(self):
218                 if self.getSelection() is None:
219                         return None
220                 x = self.getSelection()[0]
221                 if isinstance(x, eServiceReference):
222                         x = x.getPath()
223                 return x
224
225         def getServiceRef(self):
226                 if self.getSelection() is None:
227                         return None
228                 x = self.getSelection()[0]
229                 if isinstance(x, eServiceReference):
230                         return x
231                 return None
232
233         def execBegin(self):
234                 harddiskmanager.on_partition_list_change.append(self.partitionListChanged)
235
236         def execEnd(self):
237                 harddiskmanager.on_partition_list_change.remove(self.partitionListChanged)
238
239         def refresh(self):
240                 self.changeDir(self.current_directory, self.getFilename())
241
242         def partitionListChanged(self, action, device):
243                 self.refreshMountpoints()
244                 if self.current_directory is None:
245                         self.refresh()