5e5b03ae6edc21fc1bfe8423f86b6b050eb3af9e
[enigma2.git] / lib / python / Tools / Directories.py
1 # -*- coding: utf-8 -*-
2 from os import path as os_path, mkdir, rmdir, system, walk
3 from re import compile
4
5 SCOPE_TRANSPONDERDATA = 0
6 SCOPE_SYSETC = 1
7 SCOPE_FONTS = 2
8 SCOPE_SKIN = 3
9 SCOPE_SKIN_IMAGE = 4
10 SCOPE_USERETC = 5
11 SCOPE_CONFIG = 6
12 SCOPE_LANGUAGE = 7
13 SCOPE_HDD = 8
14 SCOPE_PLUGINS = 9
15 SCOPE_MEDIA = 10
16 SCOPE_PLAYLIST = 11
17 SCOPE_CURRENT_SKIN = 12
18 SCOPE_DEFAULTDIR = 13
19 SCOPE_DEFAULTPARTITION = 14
20 SCOPE_DEFAULTPARTITIONMOUNTDIR = 14
21
22 PATH_CREATE = 0
23 PATH_DONTCREATE = 1
24 PATH_FALLBACK = 2
25 defaultPaths = {
26                 SCOPE_TRANSPONDERDATA: ("/etc/", PATH_DONTCREATE),
27                 SCOPE_SYSETC: ("/etc/", PATH_DONTCREATE),
28                 SCOPE_FONTS: ("/usr/share/fonts/", PATH_DONTCREATE),
29                 SCOPE_CONFIG: ("/etc/enigma2/", PATH_CREATE),
30                 SCOPE_PLUGINS: ("/usr/lib/enigma2/python/Plugins/", PATH_CREATE),
31     
32                 SCOPE_LANGUAGE: ("/usr/share/enigma2/po/", PATH_DONTCREATE),
33
34                 SCOPE_SKIN: ("/usr/share/enigma2/", PATH_DONTCREATE),
35                 SCOPE_SKIN_IMAGE: ("/usr/share/enigma2/", PATH_DONTCREATE),
36                 SCOPE_HDD: ("/hdd/movie/", PATH_DONTCREATE),
37                 SCOPE_MEDIA: ("/media/", PATH_DONTCREATE),
38                 SCOPE_PLAYLIST: ("/etc/enigma2/playlist/", PATH_CREATE),
39                 
40                 SCOPE_USERETC: ("", PATH_DONTCREATE), # user home directory
41                 
42                 SCOPE_DEFAULTDIR: ("/usr/share/enigma2/defaults/", PATH_CREATE),
43                 SCOPE_DEFAULTPARTITION: ("/dev/mtdblock/6", PATH_DONTCREATE),
44                 SCOPE_DEFAULTPARTITIONMOUNTDIR: ("/usr/share/enigma2/dealer", PATH_CREATE),
45         }
46
47 FILE_COPY = 0 # copy files from fallback dir to the basedir
48 FILE_MOVE = 1 # move files
49 PATH_COPY = 2 # copy the complete fallback dir to the basedir
50 PATH_MOVE = 3 # move the fallback dir to the basedir (can be used for changes in paths)
51 fallbackPaths = {
52                 SCOPE_CONFIG: [("/home/root/", FILE_MOVE),
53                                            ("/usr/share/enigma2/defaults/", FILE_COPY)],
54                 SCOPE_HDD: [("/hdd/movies", PATH_MOVE)]
55         }
56
57 def resolveFilename(scope, base = "", path_prefix = None):
58         if base[0:2] == "~/":
59                 # you can only use the ~/ if we have a prefix directory
60                 assert path_prefix is not None
61                 base = os_path.join(path_prefix, base[2:])
62
63         # don't resolve absolute paths
64         if base[0:1] == '/':
65                 return base
66
67         if scope == SCOPE_CURRENT_SKIN:
68                 from Components.config import config
69                 tmp = defaultPaths[SCOPE_SKIN]
70                 pos = config.skin.primary_skin.value.rfind('/')
71                 if pos != -1:
72                         path = tmp[0]+config.skin.primary_skin.value[:pos+1]
73                 else:
74                         path = tmp[0]
75         else:
76                 tmp = defaultPaths[scope]
77                 path = tmp[0]
78
79         flags = tmp[1]
80
81         if flags == PATH_CREATE:
82                 if not pathExists(path):
83                         mkdir(path)
84
85         fallbackPath = fallbackPaths.get(scope)
86
87         if fallbackPath and not fileExists(path + base):
88                 for x in fallbackPath:
89                         if x[1] == FILE_COPY:
90                                 if fileExists(x[0] + base):
91                                         system("cp " + x[0] + base + " " + path + base)
92                                         break
93                         elif x[1] == FILE_MOVE:
94                                 if fileExists(x[0] + base):
95                                         system("mv " + x[0] + base + " " + path + base)
96                                         break
97                         elif x[1] == PATH_COPY:
98                                 if pathExists(x[0]):
99                                         if not pathExists(defaultPaths[scope][0]):
100                                                 mkdir(path)
101                                         system("cp -a " + x[0] + "* " + path)
102                                         break
103                         elif x[1] == PATH_MOVE:
104                                 if pathExists(x[0]):
105                                         system("mv " + x[0] + " " + path)
106                                         break
107
108         # FIXME: we also have to handle DATADIR etc. here.
109         return path + base
110         # this is only the BASE - an extension must be added later.
111
112 def pathExists(path):
113         return os_path.exists(path)
114
115 def createDir(path):
116         try:
117                 mkdir(path)
118         except:
119                 ret = 0
120         else:
121                 ret = 1
122         return ret
123
124 def removeDir(path):
125         try:
126                 rmdir(path)
127         except:
128                 ret = 0
129         else:
130                 ret = 1
131         return ret
132
133 def fileExists(f, mode='r'):
134         try:
135                 file = open(f, mode)
136         except IOError:
137                 exists = 0
138         else:
139                 exists = 1
140         return exists
141
142 def getRecordingFilename(basename, dirname = None):
143         # filter out non-allowed characters
144         non_allowed_characters = "/.\\:*?<>|\""
145         filename = ""
146         
147         basename = basename.replace('\xc2\x86', '').replace('\xc2\x87', '')
148         
149         for c in basename:
150                 if c in non_allowed_characters:
151                         c = "_"
152                 filename += c
153
154         if dirname is not None:
155                 filename = ''.join([dirname, filename])
156
157         i = 0
158         while True:
159                 path = resolveFilename(SCOPE_HDD, filename)
160                 if i > 0:
161                         path += "_%03d" % i
162                 try:
163                         open(path + ".ts")
164                         i += 1
165                 except IOError:
166                         return path
167
168 # this is clearly a hack:
169 def InitFallbackFiles():
170         resolveFilename(SCOPE_CONFIG, "userbouquet.favourites.tv")
171         resolveFilename(SCOPE_CONFIG, "bouquets.tv")
172         resolveFilename(SCOPE_CONFIG, "userbouquet.favourites.radio")
173         resolveFilename(SCOPE_CONFIG, "bouquets.radio")
174
175 # returns a list of tuples containing pathname and filename matching the given pattern
176 # example-pattern: match all txt-files: ".*\.txt$"
177 def crawlDirectory(directory, pattern):
178         expression = compile(pattern)
179         list = []
180         for root, dirs, files in walk(directory):
181                 for file in files:
182                         if expression.match(file) is not None:
183                                 list.append((root, file))
184         return list