1 from Plugins.Plugin import PluginDescriptor
2 from Screens.Screen import Screen
3 from Components.Label import Label
4 from Components.MenuList import MenuList
5 from Components.MovieList import MovieList
6 from Screens.InputBox import InputBox
7 from Screens.MessageBox import MessageBox
8 from Components.ActionMap import ActionMap
9 from Components.MultiContent import MultiContentEntryText
10 from enigma import eServiceReference, eListboxPythonMultiContent, eServiceCenter, gFont, iServiceInformation
12 from Tools.Directories import pathExists, resolveFilename, SCOPE_HDD, SCOPE_PLUGINS
16 class MovieTagger(Screen):
18 <screen position="center,70" size="600,460" title="Movie Tagger" >
19 <widget name="moviename" position="10,0" size="580,60" valign="top" font="Regular;25"/>
20 <ePixmap pixmap="skin_default/div-h.png" position="0,62" zPosition="1" size="600,2" />
21 <widget name="assignedTags" position="10,65" size="260,30" valign="top" halign="left" zPosition="2" foregroundColor="white" font="Regular;23"/>
22 <widget name="cTaglist" position="10,100" size="260,250" scrollbarMode="showOnDemand"/>
23 <widget name="definedTags" position="300,65" size="290,30" valign="top" halign="left" zPosition="2" foregroundColor="white" font="Regular;23"/>
24 <widget name="aTaglist" position="290,100" size="300,250" scrollbarMode="showOnDemand"/>
26 <ePixmap pixmap="skin_default/div-h.png" position="0,358" zPosition="1" size="600,2" />
27 <widget name="usedTag" position="10,365" size="185,50" valign="top" halign="center" zPosition="2" foregroundColor="#ffff00" font="Regular;21"/>
28 <widget name="userTag" position="200,365" size="185,50" valign="top" halign="center" zPosition="2" foregroundColor="#ff0000" font="Regular;21"/>
29 <widget name="preTag" position="400,365" size="190,50" valign="top" halign="center" zPosition="2" foregroundColor="#00ff00" font="Regular;21"/>
31 <ePixmap pixmap="skin_default/buttons/red.png" position="0,420" zPosition="0" size="140,40" transparent="1" alphatest="on" />
32 <ePixmap pixmap="skin_default/buttons/green.png" position="155,420" zPosition="0" size="140,40" transparent="1" alphatest="on" />
33 <ePixmap pixmap="skin_default/buttons/yellow.png" position="305,420" zPosition="0" size="140,40" transparent="1" alphatest="on" />
34 <ePixmap pixmap="skin_default/buttons/blue.png" position="455,420" zPosition="0" size="140,40" transparent="1" alphatest="on" />
36 <widget name="buttonred" position="0,420" size="140,40" valign="center" halign="center" zPosition="2" foregroundColor="white" transparent="1" font="Regular;18"/>
37 <widget name="buttongreen" position="155,420" size="140,40" valign="center" halign="center" zPosition="2" foregroundColor="white" transparent="1" font="Regular;18"/>
38 <widget name="buttonyellow" position="305,420" size="140,40" valign="center" halign="center" zPosition="2" foregroundColor="white" transparent="1" font="Regular;18"/>
39 <widget name="buttonblue" position="455,420" size="140,40" valign="center" halign="center" zPosition="2" foregroundColor="white" transparent="1" font="Regular;18"/>
44 def __init__(self, session, service):
45 self.session = session
46 self.service = service
47 self.serviceHandler = eServiceCenter.getInstance()
48 self.info = self.serviceHandler.info(self.service)
50 self.skin = MovieTagger.skin
51 Screen.__init__(self, session)
52 self["moviename"] = Label(self.info.getName(self.service))
53 self["assignedTags"] = Label("AssignedTags")
54 self["definedTags"] = Label("DefinedTags")
55 self["usedTag"] = Label("UsedTag")
56 self["userTag"] = Label("UserTag")
57 self["preTag"] = Label("PreTag")
58 self["buttonred"] = Label("red")
59 self["buttongreen"] = Label("green")
60 self["buttonyellow"] = Label("yellow")
61 self["buttonblue"] = Label("blue")
62 self["cTaglist"] = MenuList([])
63 self["aTaglist"] = TagMenuList([])
64 self["actions"] = ActionMap(["WizardActions","MenuActions","ShortcutActions"],
68 "green": self.keyGreen,
69 "yellow": self.keyYellow,
76 self.pretags = self.loadPreTags("/etc/enigma2/movietags") or self.loadPreTags(resolveFilename(SCOPE_PLUGINS, "Extensions/MovieTagger/movietags"))
77 self.updateCurrentTagList()
78 self.updateAllTagList()
79 self.currList = self["aTaglist"]
80 self.onLayoutFinish.append(self.keyBlue)
82 def loadPreTags(self, filename):
84 with open(filename, "r") as f:
85 pretags = sorted(f.read().splitlines())
87 print "pretags file %s does not exist" % filename
90 print "pretags loaded from %s:" % filename, pretags
93 def updateCurrentTagList(self):
94 print "updating cTagList"
95 self.serviceHandler = eServiceCenter.getInstance()
96 self.info = self.serviceHandler.info(self.service)
97 self.tags = self.info.getInfoString(self.service, iServiceInformation.sTags).split(' ')
99 self["cTaglist"].l.setList(self.tags)
101 def updateAllTagList(self):
102 root = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + resolveFilename(SCOPE_HDD))
112 self.pretags.index(i)
119 res.append(MultiContentEntryText(pos=(5,0),size=(500,25),font=0,text=i))
120 if self.isUsedTag(i):
121 res.append(MultiContentEntryText(pos=(220,0),size=(20,25),font=1,text="X",color=0x00FFFF00)) #yellow
122 if self.isUserTag(i) :
123 res.append(MultiContentEntryText(pos=(240,0),size=(20,25),font=1, text="X",color=0x00FF0000)) #red
125 res.append(MultiContentEntryText(pos=(260,0),size=(20,25),font=1,text="X",color=0x0000FF00)) #green
130 self["aTaglist"].l.setList(taglist)
132 def addTag(self,tagname):
134 self.tags.index(tagname)
136 self.tags.append(tagname)
137 if len(self.tags) >1:
138 self.setTags(" ".join(self.tags))
140 self.setTags(tagname)
141 self.updateCurrentTagList()
142 self.updateAllTagList()
145 def removeTag(self,tagname):
150 self.setTags(" ".join(newtags))
151 self.updateCurrentTagList()
152 self.updateAllTagList()
155 def setTags(self,tagstring,service=False,userNotice=True):
157 serviceRef = self.service
161 service_name =serviceRef.toString().split(":")[-1]
162 filename = service_name+".meta"
163 metadata = self.readMETAData(filename)
164 if metadata is not False:
165 metadata.append(tagstring.strip())
166 return self.writeMETAData(filename,metadata)
168 if userNotice is True:
169 self.session.open(MessageBox,_("Can't write movietags, because no meta-file found!"), MessageBox.TYPE_ERROR)
173 def readMETAData(self,filename):
174 if pathExists(filename):
175 fp = open(filename,"r")
177 data.append(fp.readline())
178 data.append(fp.readline())
179 data.append(fp.readline())
180 data.append(fp.readline())
185 def writeMETAData(self,filename,metadata):
186 if pathExists(filename):
187 fp = open(filename,"w")
188 fp.write(metadata[0])
189 fp.write(metadata[1])
190 fp.write(metadata[2])
191 fp.write(metadata[3])
192 fp.write(metadata[4])
198 def clearAllTags(self,yesno):
200 self.serviceHandler = eServiceCenter.getInstance()
201 root = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + resolveFilename(SCOPE_HDD))
202 list = self.serviceHandler.list(root)
207 serviceref = list.getNext()
208 if not serviceref.valid():
210 if serviceref.flags & eServiceReference.mustDescent:
212 self.setTags("",service=serviceref,userNotice=False)
213 self.updateCurrentTagList()
214 self.updateAllTagList()
216 def isUsedTag(self,tag):
218 self.usedTags.index(tag)
223 def isPreTag(self,tag):
225 self.pretags.index(tag)
230 def isUserTag(self,tag):
231 if self.isPreTag(tag) is False and self.isUsedTag(tag) is True:
237 if self.currList is self["cTaglist"]:
238 self.removeTag(self["cTaglist"].getCurrent())
240 elif self.currList is self["aTaglist"]:
241 print "adding Tag",self["aTaglist"].getCurrent()[0]
242 self.addTag(self["aTaglist"].getCurrent()[0])
245 if self.currList is self["cTaglist"]:
246 self.session.openWithCallback(self.newTagEntered,InputBox, title=_('Whitepace will be replaced by "_"'),windowTitle = _("Enter the new Tag"))
249 if self.currList is self["aTaglist"]:
250 self.session.openWithCallback(self.clearAllTags,MessageBox,_("Clear all Tags?\n\nThis will delete ALL tags in ALL recodings!\nAre you sure?"), MessageBox.TYPE_YESNO)
253 self.setTitle(' '.join((_("Movie Tagger"), _("Ver."), VERSION)))
254 self["assignedTags"].setText(_("Assigned Tags"))
255 self["definedTags"].setText(_("Specified Tags"))
256 self["usedTag"].setText(_("Used Tag"))
257 self["userTag"].setText(_("User-specific Tag"))
258 self["preTag"].setText(_("Predefined Tag"))
259 if self.currList is self["aTaglist"] or self.currList is None:
260 self["aTaglist"].selectionEnabled(0)
261 self["cTaglist"].selectionEnabled(1)
262 self["buttonred"].setText(_("Remove Tag"))
263 self["buttongreen"].setText(_("Add new Tag"))
264 self["buttonyellow"].setText("")
265 self["buttonblue"].setText(_("Toggle List"))
266 self.currList = self["cTaglist"]
268 self["aTaglist"].selectionEnabled(1)
269 self["cTaglist"].selectionEnabled(0)
270 self["buttonred"].setText(_("Add Tag"))
271 self["buttongreen"].setText("")
272 self["buttonyellow"].setText(_("Clear all Tags"))
273 self["buttonblue"].setText(_("Toggle List"))
274 self.currList = self["aTaglist"]
283 self.currList.pageUp()
286 self.currList.pageDown()
288 def newTagEntered(self,newTag):
290 self.addTag(newTag.strip().replace(" ","_"))
292 class TagMenuList(MenuList):
293 def __init__(self, list, enableWrapAround = False):
294 MenuList.__init__(self, list, enableWrapAround, eListboxPythonMultiContent)
295 self.l.setFont(0, gFont("Regular", 20))
296 self.l.setFont(1, gFont("Regular", 25))
298 def postWidgetCreate(self, instance):
299 MenuList.postWidgetCreate(self, instance)
300 instance.setItemHeight(25)
302 def main(session, service, **kwargs):
304 session.open(MovieTagger, service)
308 def Plugins(path,**kwargs):
309 return PluginDescriptor(name="Movie Tagger", description=_("Movie Tagger..."), where = PluginDescriptor.WHERE_MOVIELIST, fnc=main)