Merge branch 'bug_599_picload_fd_leak' into experimental
[vuplus_dvbapp] / lib / python / Plugins / Extensions / MediaScanner / plugin.py
1 from Plugins.Plugin import PluginDescriptor
2 from Components.Scanner import scanDevice
3 from Screens.InfoBar import InfoBar
4 from os import access, F_OK, R_OK
5
6 def execute(option):
7         print "execute", option
8         if option is None:
9                 return
10
11         (_, scanner, files, session) = option
12         scanner.open(files, session)
13
14 def mountpoint_choosen(option):
15         if option is None:
16                 return
17
18         from Screens.ChoiceBox import ChoiceBox
19
20         print "scanning", option
21         (description, mountpoint, session) = option
22         res = scanDevice(mountpoint)
23
24         list = [ (r.description, r, res[r], session) for r in res ]
25
26         if not list:
27                 from Screens.MessageBox import MessageBox
28                 if access(mountpoint, F_OK|R_OK):
29                         session.open(MessageBox, _("No displayable files on this medium found!"), MessageBox.TYPE_ERROR)
30                 else:
31                         print "ignore", mountpoint, "because its not accessible"
32                 return
33
34         session.openWithCallback(execute, ChoiceBox, 
35                 title = _("The following files were found..."),
36                 list = list)
37
38 def scan(session):
39         from Screens.ChoiceBox import ChoiceBox
40
41         from Components.Harddisk import harddiskmanager
42
43         parts = [ (r.description, r.mountpoint, session) for r in harddiskmanager.getMountedPartitions(onlyhotplug = False)]
44         if parts:
45                 for x in parts:
46                         if not access(x[1], F_OK|R_OK):
47                                 parts.remove(x) 
48                 session.openWithCallback(mountpoint_choosen, ChoiceBox, title = _("Please Select Medium to be Scanned"), list = parts)
49
50 def main(session, **kwargs):
51         scan(session)
52
53 def menuEntry(*args):
54         mountpoint_choosen(args)
55
56 from Components.Harddisk import harddiskmanager
57
58 def menuHook(menuid):
59         if menuid != "mainmenu": 
60                 return [ ]
61
62         from Tools.BoundFunction import boundFunction
63         return [(("%s (files)") % r.description, boundFunction(menuEntry, r.description, r.mountpoint), "hotplug_%s" % r.mountpoint, None) for r in harddiskmanager.getMountedPartitions(onlyhotplug = True)]
64
65 global_session = None
66
67 def partitionListChanged(action, device):
68         if InfoBar.instance:
69                 if InfoBar.instance.execing:
70                         if action == 'add' and device.is_hotplug:
71                                 print "mountpoint", device.mountpoint
72                                 print "description", device.description
73                                 print "force_mounted", device.force_mounted
74                                 mountpoint_choosen((device.description, device.mountpoint, global_session))
75                 else:
76                         print "main infobar is not execing... so we ignore hotplug event!"
77         else:
78                         print "hotplug event.. but no infobar"
79
80 def sessionstart(reason, session):
81         global global_session
82         global_session = session
83
84 def autostart(reason, **kwargs):
85         global global_session
86         if reason == 0:
87                 harddiskmanager.on_partition_list_change.append(partitionListChanged)
88         elif reason == 1:
89                 harddiskmanager.on_partition_list_change.remove(partitionListChanged)
90                 global_session = None
91
92 def Plugins(**kwargs):
93         return [
94                 PluginDescriptor(name="MediaScanner", description=_("Scan Files..."), where = PluginDescriptor.WHERE_PLUGINMENU, needsRestart = True, fnc=main),
95 #               PluginDescriptor(where = PluginDescriptor.WHERE_MENU, fnc=menuHook),
96                 PluginDescriptor(where = PluginDescriptor.WHERE_SESSIONSTART, needsRestart = True, fnc = sessionstart),
97                 PluginDescriptor(where = PluginDescriptor.WHERE_AUTOSTART, needsRestart = True, fnc = autostart)
98                 ]