1 from Plugins.Plugin import PluginDescriptor
2 from Screens.Screen import Screen
3 from Screens.MessageBox import MessageBox
4 from Screens.LocationBox import MovieLocationBox
6 from Components.config import config, ConfigText, ConfigSelection, getConfigListEntry
7 from Components.ActionMap import ActionMap
8 from Components.ConfigList import ConfigListScreen
9 from Components.Sources.StaticText import StaticText
10 from enigma import eTimer, eServiceCenter, iServiceInformation, eConsoleAppContainer
11 from os import path as os_path, rename as os_rename, unlink as os_unlink, fsync
13 def main(session, service, **kwargs):
14 session.open(MovieRetitle, service, session.current_dialog, **kwargs)
16 def Plugins(**kwargs):
17 return PluginDescriptor(name="MovieRetitle", description=_("change name..."), where = PluginDescriptor.WHERE_MOVIELIST, fnc=main)
20 class MovieRetitle(Screen, ConfigListScreen):
21 def __init__(self, session, service, parent, args = 0):
22 Screen.__init__(self, session, parent = parent)
23 self.skinName = [ "MovieRetitle", "Setup" ]
25 serviceHandler = eServiceCenter.getInstance()
26 info = serviceHandler.info(service)
27 path = service.getPath()
28 if path.endswith(".ts") is True:
31 self.dir = '/'.join(path.split('/')[:-1]) + '/'
32 self.file = self.baseName(path)
33 self.name = info.getName(service)
34 if self.file == self.baseName(self.name):
37 self.orig_title = self.name
38 self.descr = info.getInfoString(service, iServiceInformation.sDescription)
40 self["key_green"] = StaticText(_("OK"))
41 self["key_red"] = StaticText(_("Cancel"))
43 self.input_file = ConfigText(default = self.file, fixed_size = False, visible_width = 42)
44 self.input_title = ConfigText(default = self.orig_title, fixed_size = False, visible_width = 42)
45 self.input_descr = ConfigText(default = self.descr, fixed_size = False, visible_width = 42)
46 tmp = config.movielist.videodirs.value
47 if not self.dir in tmp:
49 self.input_dir = ConfigSelection(choices = tmp, default = self.dir)
51 self["actions"] = ActionMap(["SetupActions"],
53 "ok": self.keySelectOrGo,
55 "cancel": self.keyCancel,
58 self.locationEl = getConfigListEntry(_("Location"), self.input_dir)
60 getConfigListEntry(_("Filename"), self.input_file),
61 getConfigListEntry(_("Title"), self.input_title),
62 getConfigListEntry(_("Description"), self.input_descr),
66 ConfigListScreen.__init__(self, l, session = session)
68 self.onLayoutFinish.append(self.setCustomTitle)
70 def setCustomTitle(self):
71 self.setTitle(_("Name and Description Input"))
73 def pathSelected(self, res):
75 videodirs = config.movielist.videodirs.value
76 if videodirs != self.input_dir.choices:
77 self.input_dir.setChoices(videodirs, default=res)
78 self.input_dir.value = res
80 def keySelectOrGo(self):
81 cur = self["config"].getCurrent()
82 if cur is self.locationEl:
83 self.session.openWithCallback(
86 _("Choose target folder"),
93 if self.input_title.value != self.orig_title or self.input_descr.value != self.descr:
94 self.setTitleDescr(self.path, self.input_title.value, self.input_descr.value)
95 if self.input_file.value != self.file or self.input_dir.value != self.dir:
96 self.maybeMoveMovieFiles(self.path, self.rejoinName(self.input_dir.value, self.input_file.value))
103 def setTitleDescr(self, file, title, descr):
104 if os_path.exists(file + ".ts.meta"):
105 metafile = open(file + ".ts.meta", "r")
106 sid = metafile.readline()
107 oldtitle = metafile.readline().rstrip()
108 olddescr = metafile.readline().rstrip()
109 rest = metafile.read()
111 if not title and title != "":
113 if not descr and descr != "":
115 metafile = open(file + ".ts.meta", "w")
116 metafile.write("%s%s\n%s\n%s" %(sid, title, descr, rest))
118 fsync(metafile.fileno())
121 def maybeMoveMovieFiles(self, fr, to):
122 if os_path.exists(to+".ts"):
125 self.session.openWithCallback(self.confirmedReplace, MessageBox, _("Target file %s.ts already exist.\nDo you want to replace it?") % (to), MessageBox.TYPE_YESNO)
126 elif os_path.isdir(os_path.dirname(to)):
127 self.moveMovieFiles(fr, to)
129 self.session.openWithCallback(self.exitDialog, MessageBox, _("The target directory is not found. The file is not renamed."), MessageBox.TYPE_ERROR)
131 def confirmedReplace(self, answer):
133 self.moveMovieFiles(self.inter_fr, self.inter_to)
135 def moveMovieFiles(self, fr, to):
137 os_rename(fr + ".ts", to + ".ts")
139 print "Moving in background"
140 global_background_mover.enqueue(self.exitDialog, self.session, fr, to)
142 print "Moving in foreground"
143 for suff in (".ts.meta", ".ts.cuts", ".ts.ap", ".ts.sc", ".eit"):
144 if os_path.exists(fr + suff):
145 os_rename(fr + suff, to + suff)
148 def exitDialog(self, dummy=None):
150 # This will try to get back to an updated movie list.
151 # A proper way to do this should be provided in enigma2.
154 parent.csel.reloadList()
156 except AttributeError:
158 # when started from MovieSelection Quickbutton Plugin, MovieSelection is parent, not MovieContextMenu --> try again
159 self.parent.reloadList()
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.appClosed_conn = self.container.appClosed.connect(self.moveNextSuffBG)
183 self.messageQueue = []
184 self.messageTimer = eTimer()
185 self.messageTimer_conn = self.messageTimer.timeout.connect(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", ".ts.sc", ".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