1 # this is free software. use it for whatever you what or modify it.
2 # but dont remove these three lines and dont publish only .pyc-files of these files!
6 from Plugins.Plugin import PluginDescriptor
7 from Screens.Screen import Screen
8 from Components.Label import Label
9 from Components.MenuList import MenuList
10 from Components.MovieList import MovieList
11 from Screens.InputBox import InputBox
12 from Screens.MessageBox import MessageBox
13 from Components.ActionMap import ActionMap, NumberActionMap
14 from Components.GUIComponent import GUIComponent
15 from Components.HTMLComponent import HTMLComponent
16 from Components.MultiContent import RT_HALIGN_LEFT, MultiContentEntryText
17 from enigma import eListboxPythonMultiContent
19 from Tools.Directories import *
21 class MovieTagger(Screen):
23 <screen position="100,100" size="550,400" title="Movie Tagger" >
24 <widget name="moviename" position="10,10" size="530,50" font="Regular;25"/>
25 <widget name="cTaglist" position="10,60" size="220,280" scrollbarMode="showOnDemand"/>
26 <widget name="aTaglist" position="240,60" size="300,280" scrollbarMode="showOnDemand"/>
27 <widget name="buttonred" position="6,350" size="130,40" backgroundColor="red" valign="center" halign="center" zPosition="2" foregroundColor="white" font="Regular;18"/>
28 <widget name="buttongreen" position="142,350" size="130,40" backgroundColor="green" valign="center" halign="center" zPosition="2" foregroundColor="white" font="Regular;18"/>
29 <widget name="buttonyellow" position="278,350" size="130,40" backgroundColor="yellow" valign="center" halign="center" zPosition="2" foregroundColor="white" font="Regular;18"/>
30 <widget name="buttonblue" position="414,350" size="130,40" backgroundColor="blue" valign="center" halign="center" zPosition="2" foregroundColor="white" font="Regular;18"/>
33 pretagfile = "/etc/enigma2/movietags"
35 def __init__(self, session, service):
36 self.session = session
37 self.service = service
38 self.serviceHandler = eServiceCenter.getInstance()
39 self.info = self.serviceHandler.info(self.service)
41 self.skin = MovieTagger.skin
42 Screen.__init__(self, session)
43 self["moviename"] = Label(self.info.getName(self.service))
44 self["buttonred"] = Label(_("red"))
45 self["buttongreen"] = Label(_("green"))
46 self["buttonyellow"] = Label(_("yellow"))
47 self["buttonblue"] = Label(_("blue"))
48 self["cTaglist"] = MenuList([])
49 self["aTaglist"] = TagMenuList([])
50 self["actions"] = ActionMap(["WizardActions","MenuActions","ShortcutActions"],
54 "green": self.keyGreen,
55 "yellow": self.keyYellow,
63 self.updateCurrentTagList()
64 self.updateAllTagList()
65 self.currList =self["aTaglist"]
66 self.onLayoutFinish.append(self.keyBlue)
68 def loadPreTags(self):
69 if pathExists(self.pretagfile):
70 fp = open(self.pretagfile,"r")
73 self.pretags = t.replace("\n"," ").strip().split(" ")
75 print "pretags loaded ", self.pretags
77 def updateCurrentTagList(self):
78 print "updating cTagList"
79 self.serviceHandler = eServiceCenter.getInstance()
80 self.info = self.serviceHandler.info(self.service)
81 self.tags = self.info.getInfoString(self.service, iServiceInformation.sTags).split(' ')
83 self["cTaglist"].l.setList(self.tags)
85 def updateAllTagList(self):
86 root = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + resolveFilename(SCOPE_HDD))
103 res.append(MultiContentEntryText(pos=(5, 0), size=(500, 25), font=0, text=i))
104 if self.isUsedTag(i):
105 res.append(MultiContentEntryText(pos=(220, 0),size=(61, 86), font=1,text="X",color=0x00FFFF00))
106 if self.isUserTag(i) :
107 res.append(MultiContentEntryText(pos=(240, 0),size=(61, 86), font=1,text="X",color=0x00FF0000))#red
109 res.append(MultiContentEntryText(pos=(260, 0),size=(61, 86), font=1,text="X",color=0x000000FF))#blue
114 self["aTaglist"].l.setList(taglist)
116 def addTag(self,tagname):
118 self.tags.index(tagname)
120 self.tags.append(tagname)
121 if len(self.tags) >1:
122 self.setTags(" ".join(self.tags))
124 self.setTags(tagname)
125 self.updateCurrentTagList()
126 self.updateAllTagList()
129 def removeTag(self,tagname):
134 self.setTags(" ".join(newtags))
135 self.updateCurrentTagList()
136 self.updateAllTagList()
139 def setTags(self,tagstring,service=False,userNotice=True):
141 serviceRef = self.service
145 service_name =serviceRef.toString().split(":")[-1]
146 filename = service_name+".meta"
147 metadata = self.readMETAData(filename)
148 if metadata is not False:
149 metadata.append(tagstring.strip())
150 return self.writeMETAData(filename,metadata)
152 if userNotice is True:
153 self.session.open(MessageBox,_("cant write movietags, because no meta-file found!"), MessageBox.TYPE_ERROR)
157 def readMETAData(self,filename):
158 if pathExists(filename):
159 fp = open(filename,"r")
161 data.append(fp.readline())
162 data.append(fp.readline())
163 data.append(fp.readline())
164 data.append(fp.readline())
169 def writeMETAData(self,filename,metadata):
170 if pathExists(filename):
171 fp = open(filename,"w")
172 fp.write(metadata[0])
173 fp.write(metadata[1])
174 fp.write(metadata[2])
175 fp.write(metadata[3])
176 fp.write(metadata[4])
182 def clearAllTags(self,yesno):
184 self.serviceHandler = eServiceCenter.getInstance()
185 root = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + resolveFilename(SCOPE_HDD))
186 list = self.serviceHandler.list(root)
192 serviceref = list.getNext()
193 if not serviceref.valid():
195 if serviceref.flags & eServiceReference.mustDescent:
197 self.setTags("",service=serviceref,userNotice=False)
198 self.updateCurrentTagList()
199 self.updateAllTagList()
201 def isUsedTag(self,tag):
203 self.usedTags.index(tag)
208 def isPreTag(self,tag):
210 self.pretags.index(tag)
215 def isUserTag(self,tag):
216 if self.isPreTag(tag) is False and self.isUsedTag(tag) is True:
222 if self.currList is self["cTaglist"]:
223 self.removeTag(self["cTaglist"].getCurrent())
225 elif self.currList is self["aTaglist"]:
226 print "adding Tag",self["aTaglist"].getCurrent()[0]
227 self.addTag(self["aTaglist"].getCurrent()[0])
230 if self.currList is self["cTaglist"]:
231 self.session.openWithCallback(self.newTagEntered,InputBox, title=_("Whitepace will be replaced by Underscore"),windowTitle = _("enter the new Tag"))
234 if self.currList is self["aTaglist"]:
235 self.session.openWithCallback(self.clearAllTags,MessageBox,_("clear all Tags?\n\nThis will delete ALL tags in ALL recodings!\nAre you sure?"), MessageBox.TYPE_YESNO)
238 if self.currList is self["aTaglist"] or self.currList is None:
239 self["aTaglist"].selectionEnabled(0)
240 self["cTaglist"].selectionEnabled(1)
241 self["buttonred"].setText(_("remove Tag"))
242 self["buttongreen"].setText(_("add new Tag"))
243 self["buttonyellow"].setText("")
244 self["buttonblue"].setText(_("toggle List"))
245 self.currList = self["cTaglist"]
247 self["aTaglist"].selectionEnabled(1)
248 self["cTaglist"].selectionEnabled(0)
249 self["buttonred"].setText(_("add Tag"))
250 self["buttongreen"].setText("")
251 self["buttonyellow"].setText("clear all Tags")
252 self["buttonblue"].setText(_("toggle List"))
253 self.currList = self["aTaglist"]
262 self.currList.pageUp()
265 self.currList.pageDown()
267 def newTagEntered(self,newTag):
269 self.addTag(newTag.strip().replace(" ","_"))
271 class TagMenuList(MenuList, HTMLComponent, GUIComponent):
272 def __init__(self, list):
273 MenuList.__init__(self,list)
274 GUIComponent.__init__(self)
275 self.l = eListboxPythonMultiContent()
278 self.l.setFont(0, gFont("Regular", 20))
279 self.l.setFont(1, gFont("Regular", 25))
281 GUI_WIDGET = eListbox
283 def postWidgetCreate(self, instance):
284 instance.setContent(self.l)
285 instance.setItemHeight(25)
287 def main(session, service, **kwargs):
289 session.open(MovieTagger, service)
291 print "dont send this chrashlog to DMM, if you see this text in a chrashlog :-)"
294 def Plugins(path,**kwargs):
295 return PluginDescriptor(name="Movie Tagger", description=_("Movie Tagger..."), where = PluginDescriptor.WHERE_MOVIELIST, fnc=main)