source: ipk/source.sh4/editors_moviecutlistcollection_1_0/usr/lib/enigma2/python/Plugins/Extensions/ReconstructApSc/plugin.py @ 7451

Last change on this file since 7451 was 7451, checked in by BPanther, 13 years ago

[ipk] - copy source->source.sh4

File size: 4.9 KB
Line 
1from Plugins.Plugin import PluginDescriptor
2from Screens.Screen import Screen
3from Screens.MessageBox import MessageBox
4from Screens.ChoiceBox import ChoiceBox
5import Screens.Standby
6from Components.ActionMap import ActionMap
7from enigma import eTimer, eServiceCenter, iServiceInformation, eConsoleAppContainer
8from os import access, chmod, X_OK
9
10recons_path = "/usr/lib/enigma2/python/Plugins/Extensions/ReconstructApSc/bin/reconstruct_apsc"
11
12def main(session, service, **kwargs):
13        # Hack to make sure it is executable
14        if not access(recons_path, X_OK):
15                chmod(recons_path, 493)
16        session.open(ReconstructApSc, service, **kwargs)
17
18def Plugins(**kwargs):
19        return PluginDescriptor(name="ReconstructApSc", description=_("Reconstruct AP/SC ..."), where = PluginDescriptor.WHERE_MOVIELIST, fnc=main)
20
21
22class ReconstructApSc(ChoiceBox):
23        def __init__(self, session, service):
24                self.service = service
25                serviceHandler = eServiceCenter.getInstance()
26                path = self.service.getPath()
27                info = serviceHandler.info(self.service)
28                if not info:
29                        self.name = path
30                else:
31                        self.name = info.getName(self.service)
32                tlist = [
33                        (_("Don't reconstruct"), "CALLFUNC", self.confirmed0),
34                        (_("Reconstruct the .ap and .sc files of the selected movie"), "CALLFUNC", self.confirmed1),
35                        (_("Reconstruct all missing .ap and .sc files in this directory"), "CALLFUNC", self.confirmed2),
36                        (_("Check any running reconstruct process"), "CALLFUNC", self.confirmed3),
37                ]
38                ChoiceBox.__init__(self, session, _("What would you like to reconstruct?  (\"%s\")") % (self.name), list = tlist, selection = 0)
39                self.skinName = "ChoiceBox"
40
41        def confirmed0(self, arg):
42                self.close()
43
44        def confirmed1(self, arg):
45                ReconstructApScSpawn(self.session, self, [recons_path, self.service.getPath()], self.name, _("movie"))
46
47        def confirmed2(self, arg):
48                dir = self.dirName(self.service.getPath())
49                ReconstructApScSpawn(self.session, self, [recons_path, "-d", dir], dir, _("directory"))
50
51        def confirmed3(self, arg):
52                output = global_recons_queue.checkOutput()
53                if output == False:
54                        mess = "There is no running reconstruction process"
55                else:
56                        mess = "Current reconstruction process output:\n%s" % output
57                self.session.openWithCallback(self.close, MessageBox, mess, MessageBox.TYPE_INFO)
58
59        def dirName(self, str):
60                return '/'.join(str.split('/')[:-1]) + '/'
61
62
63class ReconstructApScQueue:
64        def __init__(self):
65                self.container = eConsoleAppContainer()
66                self.container.appClosed.append(self.runDone)
67                self.container.dataAvail.append(self.collOutput)
68                self.queue = []
69                self.output = ""
70                self.running = False
71
72        def enqueue(self, cb, cmd):
73                self.queue.append((cb, cmd))
74                if not self.running:
75                        self.runNext()
76                        return True
77                else:
78                        return False
79
80        def collOutput(self, data):
81                self.output += data
82
83        def checkOutput(self):
84                if not self.running:
85                        return False
86                else:
87                        return self.output
88
89        def runNext(self):
90                self.output = ""
91                if not self.queue:
92                        self.running = False
93                else:
94                        self.running = True
95                        self.container.execute(*self.queue[0][1])
96
97        def runDone(self, retval):
98                cb = self.queue[0][0]
99                self.queue = self.queue[1:]
100                cb(retval, self.output)
101                self.runNext()
102
103global_recons_errors = [_("The %s \"%s\" is successfully processed:\n%s"),
104                      _("Processing failed for the %s \"%s\":\n%s")]
105
106global_recons_queue = ReconstructApScQueue()
107
108global_recons_block = False
109
110class ReconstructApScSpawn:
111        def __init__(self, session, parent, clist, name, typename):
112                global global_recons_queue
113                global global_recons_block
114                self.session = session
115                self.parent = parent
116                self.name = name
117                self.typename = typename
118                self.clist = [clist[0]] + clist
119                self.mess = ""
120                self.dialog = False
121                self.waitTimer = eTimer()
122                self.waitTimer.callback.append(self.doWaitAck)
123                if global_recons_queue.enqueue(self.doAck, self.clist):
124                        mess = _("The %s \"%s\" is processed in the background.") % (self.typename, self.name)
125                else:
126                        mess = _("Another movie or directory is currently processed.\nThe %s \"%s\" will be processed in the background after it.") % (self.typename, self.name)
127                global_recons_block = True
128                self.dialog = self.session.openWithCallback(self.endc, MessageBox, mess, MessageBox.TYPE_INFO)
129
130        def doAck(self, retval, output):
131                global global_recons_errors
132                self.mess = global_recons_errors[retval] % (self.typename, self.name, output)
133                self.doWaitAck()
134
135        def doWaitAck(self):
136                global global_recons_block
137                if Screens.Standby.inStandby or not self.session.in_exec or (global_recons_block and not self.dialog):
138                        self.waitTimer.start(2000, True)
139                else:
140                        global_recons_block = True
141                        self.session.openWithCallback(self.endw, MessageBox, self.mess, MessageBox.TYPE_INFO)
142
143        def endw(self, arg = 0):
144                global global_recons_block
145                global_recons_block = False
146                if self.session.current_dialog == self.dialog:
147                        self.session.current_dialog.close(True)
148                        self.endc(arg)
149
150        def endc(self, arg = 0):
151                global global_recons_block
152                global_recons_block = False
153                self.dialog = False
154                self.parent.close()
Note: See TracBrowser for help on using the repository browser.