1 # for localized messages
4 from Plugins.Plugin import PluginDescriptor
5 from Screens.Screen import Screen
6 from Screens.MessageBox import MessageBox
7 from Screens.LocationBox import MovieLocationBox
9 from Components.config import config, ConfigText, ConfigSelection, getConfigListEntry
10 from Components.ActionMap import ActionMap, NumberActionMap
11 from Components.ConfigList import ConfigList, ConfigListScreen
12 from Components.Label import Label
13 from enigma import eTimer, eServiceReference, eServiceCenter, iServiceInformation, eConsoleAppContainer
16 def main(session, service, **kwargs):
17 session.open(MovieRetitle, service, session.current_dialog, **kwargs)
19 def Plugins(**kwargs):
20 return PluginDescriptor(name="MovieRetitle", description=_("Change name..."), where = PluginDescriptor.WHERE_MOVIELIST, fnc=main)
23 class MovieRetitle(Screen, ConfigListScreen):
25 <screen name="TitleDescrInput" position="100,150" size="500,200" title="Name and Description Input">
26 <widget name="config" position="10,10" size="480,120" />
27 <ePixmap position="70,140" size="140,40" pixmap="skin_default/buttons/green.png" alphatest="on" />
28 <widget name="oktext" position="70,140" size="140,40" valign="center" halign="center" zPosition="2" font="Regular;20" transparent="1" />
29 <ePixmap position="290,140" size="140,40" pixmap="skin_default/buttons/red.png" alphatest="on" />
30 <widget name="canceltext" position="290,140" size="140,40" valign="center" halign="center" zPosition="2" font="Regular;20" transparent="1" />
33 def __init__(self, session, service, parent, args = 0):
34 Screen.__init__(self, session, parent = parent)
35 serviceHandler = eServiceCenter.getInstance()
36 info = serviceHandler.info(service)
37 path = service.getPath()
38 if path.endswith(".ts") is True:
41 self.dir = '/'.join(path.split('/')[:-1]) + '/'
42 self.file = self.baseName(path)
43 self.name = info.getName(service)
44 if self.file == self.baseName(self.name):
47 self.title = self.name
48 self.descr = info.getInfoString(service, iServiceInformation.sDescription)
50 self["oktext"] = Label(_("OK"))
51 self["canceltext"] = Label(_("Cancel"))
53 self.input_file = ConfigText(default = self.file, fixed_size = False, visible_width = 42)
54 self.input_title = ConfigText(default = self.title, fixed_size = False, visible_width = 42)
55 self.input_descr = ConfigText(default = self.descr, fixed_size = False, visible_width = 42)
56 tmp = config.movielist.videodirs.value
57 if not self.dir in tmp:
59 self.input_dir = ConfigSelection(choices = tmp, default = self.dir)
61 self["actions"] = NumberActionMap(["SetupActions"],
63 "ok": self.keySelectOrGo,
65 "cancel": self.keyCancel,
68 self.locationEl = getConfigListEntry(_("Location"), self.input_dir)
70 getConfigListEntry(_("Filename"), self.input_file),
71 getConfigListEntry(_("Title"), self.input_title),
72 getConfigListEntry(_("Description"), self.input_descr),
76 ConfigListScreen.__init__(self, l)
78 def pathSelected(self, res):
80 videodirs = config.movielist.videodirs.value
81 if videodirs != self.input_dir.choices:
82 self.input_dir.setChoices(videodirs, default=res)
83 self.input_dir.value = res
85 def keySelectOrGo(self):
86 cur = self["config"].getCurrent()
87 if cur is self.locationEl:
88 self.session.openWithCallback(
91 _("Choose target folder"),
98 if self.input_title.value != self.title or self.input_descr.value != self.descr:
99 self.setTitleDescr(self.path, self.input_title.value, self.input_descr.value)
100 if self.input_file.value != self.file or self.input_dir.value != self.dir:
101 self.maybeMoveMovieFiles(self.path, self.rejoinName(self.input_dir.value, self.input_file.value))
108 def setTitleDescr(self, file, title, descr):
109 if os.path.exists(file + ".ts.meta"):
110 metafile = open(file + ".ts.meta", "r")
111 sid = metafile.readline()
112 oldtitle = metafile.readline().rstrip()
113 olddescr = metafile.readline().rstrip()
114 rest = metafile.read()
116 if not title and title != "":
118 if not descr and descr != "":
120 metafile = open(file + ".ts.meta", "w")
121 metafile.write("%s%s\n%s\n%s" %(sid, title, descr, rest))
124 def maybeMoveMovieFiles(self, fr, to):
125 if os.path.exists(to+".ts"):
128 self.session.openWithCallback(self.confirmedReplace, MessageBox, _("Target file %s.ts already exist.\nDo you want to replace it?") % (to), MessageBox.TYPE_YESNO)
129 elif os.path.isdir(os.path.dirname(to)):
130 self.moveMovieFiles(fr, to)
132 self.session.openWithCallback(self.exitDialog, MessageBox, _("The target directory is not found. The file is not renamed."), MessageBox.TYPE_ERROR)
134 def confirmedReplace(self, answer):
136 self.moveMovieFiles(self.inter_fr, self.inter_to)
138 def moveMovieFiles(self, fr, to):
140 os.rename(fr + ".ts", to + ".ts")
142 print "Moving in background"
143 global_background_mover.enqueue(self.exitDialog, self.session, fr, to)
145 print "Moving in foreground"
146 for suff in (".ts.meta", ".ts.cuts", ".ts.ap", ".eit"):
147 if os.path.exists(fr + suff):
148 os.rename(fr + suff, to + suff)
151 def exitDialog(self, dummy=None):
153 # This will try to get back to an updated movie list.
154 # A proper way to do this should be provided in enigma2.
157 parent.csel.reloadList()
159 except AttributeError:
162 def baseName(self, str):
163 name = str.split('/')[-1]
164 if name.endswith(".ts") is True:
169 def rejoinName(self, dir, name):
171 if name.endswith(".ts") is True:
172 return dir + name[:-3]
176 class MovieRetitleBackgroundMover:
178 self.container = eConsoleAppContainer()
179 self.container.appClosed.append(self.moveNextSuffBG)
183 self.messageQueue = []
184 self.messageTimer = eTimer()
185 self.messageTimer.callback.append(self.tryLaunchMessage)
187 def message(self, session, id, cb, txt):
188 global global_message_block
190 if global_message_block and global_message_block == id:
191 self.messageQueue = [(session, id, txt)] + self.messageQueue
194 for ele in self.messageQueue:
196 self.messageQueue[i] = (session, id, txt)
201 self.messageQueue.append((session, id, txt))
202 self.tryLaunchMessage(callback = cb)
204 def tryLaunchMessage(self, dummy=0, callback = None):
205 global global_message_block
206 self.messageTimer.stop()
207 if not self.messageQueue:
210 elif not Screens.Standby.inStandby and self.messageQueue[0][0].in_exec and (not global_message_block or global_message_block == self.messageQueue[0][1]):
211 self.messageTimer.stop()
212 session = self.messageQueue[0][0]
213 id = self.messageQueue[0][1]
214 mess = self.messageQueue[0][2]
215 self.messageQueue = self.messageQueue[1:]
216 if global_message_block == id:
217 closeprev = session.current_dialog
220 global_message_block = id
222 session.openWithCallback(lambda x: self.tryLaunchMessageCallback(callback, closeprev), MessageBox, mess, MessageBox.TYPE_INFO)
224 global_message_block = False
225 self.tryLaunchMessage()
227 self.messageTimer.start(1500, True)
231 def tryLaunchMessageCallback(self, callback, closeprev):
232 global global_message_block
233 global_message_block = False
235 closeprev.close(True)
236 self.tryLaunchMessage(callback = callback)
238 def enqueue(self, cb, session, fr, to):
240 mess = _("The movie is moved in the background from %s to %s.") % (os.path.dirname(fr), os.path.dirname(to))
241 self.message(session, self.currid, cb, mess)
242 self.queue.append((session, self.currid, fr, to))
254 self.moveMovieFilesBackground(self.queue[0])
256 def runDone(self, retval):
258 self.queue = self.queue[1:]
261 def moveMovieFilesBackground(self, ele):
263 self.sufflst = (".ts.meta", ".ts.cuts", ".ts.ap", ".eit", ".ts")
264 self.sufflst2 = self.sufflst
265 self.moveNextSuffBG(0)
267 def moveNextSuffBG(self, retval):
268 if self.sufflst and not retval:
269 fr = self.ele[2] + self.sufflst[0]
270 to = self.ele[3] + self.sufflst[0]
271 self.sufflst = self.sufflst[1:]
272 print "Moving %s to %s" % (fr, to)
273 if os.path.exists(fr):
274 self.container.execute("/bin/cp", "/bin/cp", fr, to)
276 self.moveNextSuffBG(0)
278 for suff in self.sufflst2:
279 if os.path.exists(self.ele[3] + suff) and os.path.exists(self.ele[2] + suff):
280 os.unlink(self.ele[3] + suff)
281 mess = _("Failed to move the movie %s to %s in the background") % (self.ele[2], self.ele[3])
282 self.message(self.ele[0], self.ele[1], None, mess)
285 for suff in self.sufflst2:
286 if os.path.exists(self.ele[2] + suff) and os.path.exists(self.ele[3] + suff):
287 os.unlink(self.ele[2] + suff)
288 mess = _("Successfully moved the movie %s") % (self.ele[2])
289 self.message(self.ele[0], self.ele[1], None, mess)
292 global_background_mover = MovieRetitleBackgroundMover()
294 global_message_block = False