· 10 years ago · Sep 06, 2016, 12:02 PM
1#!/usr/bin/python
2# -*- coding: utf8 -*-
3
4
5__addonname__ = 'plugin.image.mypicsdb'
6
7# common depends on __addonname__
8import resources.lib.common as common
9
10import os, sys, time, re
11from os.path import join,isfile,basename,dirname,splitext
12from urllib import unquote_plus
13
14from time import strftime,strptime
15from traceback import print_exc
16
17import xbmc, xbmcplugin, xbmcgui, xbmcaddon
18
19
20# MikeBZH44
21try:
22 import json as simplejson
23 # test json has not loads, call error
24 if not hasattr( simplejson, "loads" ):
25 raise Exception( "Hmmm! Error with json %r" % dir( simplejson ) )
26except Exception, e:
27 print "[MyPicsDB] %s" % str( e )
28 import simplejson
29
30# MikeBZH44: commoncache for MyPicsDB with 1 hour timeout
31try:
32 import StorageServer
33except:
34 import resources.lib.storageserverdummy as StorageServer
35
36# set variables used by other modules
37
38sys_encoding = sys.getfilesystemencoding()
39
40if sys.modules.has_key("MypicsDB"):
41 del sys.modules["MypicsDB"]
42import resources.lib.MypicsDB as MypicsDB
43import resources.lib.filterwizard as filterwizard
44import resources.lib.googlemaps as googlemaps
45import resources.lib.translationeditor as translationeditor
46import resources.lib.viewer as viewer
47
48# these few lines are taken from AppleMovieTrailers script
49# Shared resources
50home = common.getaddon_path()
51BASE_RESOURCE_PATH = join( home, "resources" )
52DATA_PATH = common.getaddon_info('profile')
53PIC_PATH = join( BASE_RESOURCE_PATH, "images")
54
55
56#catching the OS :
57# win32 -> win
58# darwin -> mac
59# linux -> linux
60RunningOS = sys.platform
61
62cache = StorageServer.StorageServer("MyPicsDB",1)
63
64files_fields_description={"strFilename":common.getstring(30300),
65 "strPath":common.getstring(30301),
66 "Thumb":common.getstring(30302)
67 }
68
69
70class _Info:
71 def __init__( self, *args, **kwargs ):
72 self.__dict__.update( kwargs )
73 def has_key(self, key):
74 return key in self.__dict__
75 def __setitem__(self,key,value):
76 self.__dict__[key]=value
77
78global MPDB
79
80class Main:
81 def __init__(self):
82 self.get_args()
83 MPDB = MypicsDB.MyPictureDB()
84
85 def get_args(self):
86 common.log("Main.get_args", "MyPicturesDB plugin called :", xbmc.LOGNOTICE)
87 common.log("Main.get_args", "sys.argv[0] = %s"%sys.argv[0], xbmc.LOGNOTICE)
88 common.log("Main.get_args", "sys.argv[2] = %s"%sys.argv[2], xbmc.LOGNOTICE)
89
90 self.parm = common.smart_utf8(unquote_plus(sys.argv[2])).replace("\\\\", "\\")
91
92 # change for ruuk's plugin screensaver
93 self.parm= self.parm.replace('&plugin_slideshow_ss=true', '')
94
95 # for peppe_sr due to his used skin widget plugin
96 p = re.compile('&reload=[^&]*')
97 self.parm = p.sub('', self.parm)
98
99 sys.argv[2] = self.parm
100 parm = self.cleanup(self.parm[ 1 : ])
101 common.log("Main.get_args", parm)
102
103 args= "self.args = _Info(%s)" % ( parm )
104 exec args
105 if not hasattr(self.args, 'page'):
106 self.args.page=''
107
108 def cleanup(self, parm):
109
110 in_apostrophe=False
111 prev_char = ""
112 prevprev_char = ""
113 output=""
114
115 for char in parm:
116 if char == "'" and prev_char != "\\" or char == "'" and prev_char =="\\" and prevprev_char == "\\":
117 if not in_apostrophe:
118 in_apostrophe = True
119 else:
120 in_apostrophe = False
121 if char == "&" and not in_apostrophe:
122 char = ","
123
124 output += char
125
126 prevprev_char = prev_char
127 prev_char = char
128 if prevprev_char == "\\" and prev_char == "\\" :
129 prev_char = ""
130 prevprev_char = ""
131
132 return output
133
134
135 def add_directory(self,name,params,action,iconimage,fanart=None,contextmenu=None,total=0,info="*",replacemenu=True):
136
137 try:
138 common.log("Main.add_directory", "Name = %s"%name)
139 try:
140 parameter="&".join([param+"="+repr(common.quote_param(valeur.encode("utf-8"))) for param,valeur in params])
141 except:
142 parameter=""
143
144 u=sys.argv[0]+"?"+parameter+"&action="+repr(str(action))+"&name="+repr(common.quote_param(name.encode("utf8")))
145
146 liz=xbmcgui.ListItem(name, thumbnailImage=iconimage)
147
148 if contextmenu :
149 liz.addContextMenuItems(contextmenu,replacemenu)
150 return xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=True)#,totalItems=total)
151 except:
152 pass
153
154
155 def add_action(self,name,params,action,iconimage,fanart=None,contextmenu=None,total=0,info="*",replacemenu=True):
156
157 try:
158 common.log("Main.add_action", "Name = %s"%name)
159 try:
160 parameter="&".join([param+"="+repr(common.quote_param(valeur.encode("utf-8"))) for param,valeur in params])
161 except:
162 parameter=""
163
164 u=sys.argv[0]+"?"+parameter+"&action="+repr(str(action))+"&name="+repr(common.quote_param(name.encode("utf8")))
165
166 liz=xbmcgui.ListItem(name, thumbnailImage=iconimage)
167
168 if contextmenu :
169 liz.addContextMenuItems(contextmenu,replacemenu)
170
171 return xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=False)#,totalItems=total)
172 except:
173 pass
174
175
176 def add_picture(self,picname,picpath,count=0, info="*",fanart=None,contextmenu=None,replacemenu=True):
177 suffix=""
178 rating=""
179 coords=None
180 date = None
181 extension = splitext(picname)[1].upper()
182 try:
183 fullfilepath = join(picpath,picname)
184 common.log("Main.add_picture", "Name = %s"%fullfilepath)
185
186 liz=xbmcgui.ListItem(picname,info)
187 common.log("", picpath)
188 common.log("", picname)
189
190 try:
191 (exiftime,rating) = MPDB.get_pic_date_rating(picpath,picname)
192
193 if exiftime:
194 date = exiftime and strftime("%d.%m.%Y",strptime(exiftime,"%Y-%m-%d %H:%M:%S")) or ""
195 except Exception,msg:
196 common.log("", "%s - %s"%(Exception,msg), xbmc.LOGERROR )
197
198
199 #is the file a video ?
200 if extension in ["."+ext.replace(".","").upper() for ext in common.getaddon_setting("vidsext").split("|")]:
201
202 infolabels = { "date": date }
203 liz.setInfo( type="video", infoLabels=infolabels )
204 #or is the file a picture ?
205 elif extension in ["."+ext.replace(".","").upper() for ext in common.getaddon_setting("picsext").split("|")]:
206
207 if int(common.getaddon_setting("ratingmini"))>0:
208 if not rating:
209 return
210 if int(rating) < int(common.getaddon_setting("ratingmini")):
211 return
212 coords = MPDB.get_gps(picpath,picname)
213 if coords:
214 suffix = suffix + "[COLOR=C0C0C0C0][G][/COLOR]"
215
216 resolutionXY = MPDB.cur.request( """select coalesce(tc.TagContent,0), tt.TagType from TagTypes tt, TagContents tc, TagsInFiles tif, Files fi
217 where tt.TagType in ( 'EXIF ExifImageLength', 'EXIF ExifImageWidth' )
218 and tt.idTagType = tc.idTagType
219 and tc.idTagContent = tif.idTagContent
220 and tif.idFile = fi.idFile
221 and fi.strPath = ?
222 and fi.strFilename = ? """,(picpath,picname))
223
224 if date is None:
225 infolabels = { "picturepath":picname+" "+suffix, "count": count }
226 else:
227 infolabels = { "picturepath":picname+" "+suffix, "date": date, "count": count }
228
229 try:
230 if exiftime != None and exiftime != "0":
231 common.log("Main.add_picture", "Picture has EXIF Date/Time %s"%exiftime)
232 infolabels["exif:exiftime"] = exiftime
233 except:
234 pass
235
236 try:
237
238 if "Width" in resolutionXY[0][1]:
239 resolutionX = resolutionXY[0][0]
240 resolutionY = resolutionXY[1][0]
241 else:
242 resolutionX = resolutionXY[1][0]
243 resolutionY = resolutionXY[0][0]
244
245 if resolutionX != None and resolutionY != None and resolutionX != "0" and resolutionY != "0":
246 common.log("Main.add_picture", "Picture has resolution %s x %s"%(str(resolutionX), str(resolutionY)))
247 infolabels["exif:resolution"] = str(resolutionX) + ',' + str(resolutionY)
248 except:
249 pass
250
251 if int(rating)>0:
252 common.log("Main.add_picture", "Picture has rating")
253 suffix = suffix + "[COLOR=C0FFFF00]"+("*"*int(rating))+"[/COLOR][COLOR=C0C0C0C0]"+("*"*(5-int(rating)))+"[/COLOR]"
254
255 liz.setInfo( type="pictures", infoLabels=infolabels )
256
257 liz.setLabel(picname+" "+suffix)
258
259 if fanart is not None and fanart != False:
260 liz.setProperty('fanart_image',fanart)
261
262 if contextmenu:
263 if coords:
264 common.log("Main.add_picture", "Picture has geolocation")
265 contextmenu.append( (common.getstring(30220),"XBMC.RunPlugin(\"%s?action='geolocate'&place='%s'&path='%s'&filename='%s'&viewmode='view'\" ,)"%(sys.argv[0],"%0.6f,%0.6f"%(coords),
266 common.quote_param(picpath.encode('utf-8')),
267 common.quote_param(picname.encode('utf-8'))
268 )))
269
270 liz.addContextMenuItems(contextmenu,replacemenu)
271
272 return xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=fullfilepath,listitem=liz,isFolder=False)
273 except Exception,msg:
274 common.log("", "%s - %s"%(Exception,msg), xbmc.LOGERROR )
275
276 def change_view(self):
277 view_modes = {
278 'skin.confluence': 500,
279 'skin.aeon.nox': 551,
280 'skin.confluence-vertical': 500,
281 'skin.jx720': 52,
282 'skin.pm3-hd': 53,
283 'skin.rapier': 50,
284 'skin.simplicity': 500,
285 'skin.slik': 53,
286 'skin.touched': 500,
287 'skin.transparency': 53,
288 'skin.xeebo': 55
289 }
290
291 skin_dir = xbmc.getSkinDir()
292 if skin_dir in view_modes:
293 xbmc.executebuiltin('Container.SetViewMode('+ str(view_modes[skin_dir]) +')')
294
295 def show_home(self):
296 common.log("Main.show_home", "start")
297
298 display_all = common.getaddon_setting('m_all')=='true'
299 # last scan picture added
300 if common.getaddon_setting('m_1')=='true' or display_all:
301 self.add_directory(common.getstring(30209)%common.getaddon_setting("recentnbdays"),[("method","recentpicsdb"),("period",""),("value",""),("page","1"),("viewmode","view")],
302 "showpics",join(PIC_PATH,"folder_recent_added.png"))
303
304
305 # Last pictures
306 if common.getaddon_setting('m_2')=='true' or display_all:
307 self.add_directory(common.getstring(30130)%common.getaddon_setting("lastpicsnumber"),[("method","lastpicsshooted"),("page","1"),("viewmode","view")],
308 "showpics",join(PIC_PATH,"folder_recent_shot.png"))
309
310
311 # N random pictures
312 if common.getaddon_setting('m_13')=='true' or display_all:
313 self.add_directory(common.getstring(30654)%common.getaddon_setting("randompicsnumber"),[("method","random"),("page","1"),("viewmode","view")],
314 "showpics",join(PIC_PATH,"folder_random.png"))
315
316
317 # videos
318 if common.getaddon_setting('m_3')=='true' or display_all and common.getaddon_setting("usevids") == "true":
319 self.add_directory(common.getstring(30051),[("method","videos"),("page","1"),("viewmode","view")],
320 "showpics",join(PIC_PATH,"folder_videos.png"))
321
322 # Saved filter wizard settings
323 self.add_directory(common.getstring(30655),[("wizard","settings"),("viewmode","view")],"showwizard",
324 join(PIC_PATH,"folder_wizard.png"))
325
326
327 # show filter wizard
328 self.add_action(common.getstring(30600),[("wizard","dialog"),("viewmode","view")],"showwizard",
329 join(PIC_PATH,"folder_wizard.png"))
330
331
332 # Browse by Date
333 if common.getaddon_setting('m_4')=='true' or display_all:
334 self.add_directory(common.getstring(30101),[("period","year"),("value",""),("viewmode","view")],
335 "showdate",join(PIC_PATH,"folder_date.png"))
336
337
338 # Browse by Folders
339 if common.getaddon_setting('m_5')=='true' or display_all:
340 self.add_directory(common.getstring(30102),[("method","folders"),("folderid",""),("onlypics","non"),("viewmode","view")],
341 "showfolder",join(PIC_PATH,"folder_pictures.png"))
342
343
344 # Browse by Tags
345 if common.getaddon_setting('m_14')=='true' or display_all:
346 self.add_directory(common.getstring(30122),[("tags",""),("viewmode","view")],"showtagtypes",
347 join(PIC_PATH,"folder_tags.png"))
348
349
350 # Periods
351 if common.getaddon_setting('m_10')=='true' or display_all:
352 self.add_directory(common.getstring(30105),[("period",""),("viewmode","view"),],"showperiod",
353 join(PIC_PATH,"folder_date_ranges.png"))
354
355
356 # Collections
357 if common.getaddon_setting('m_11')=='true' or display_all:
358 self.add_directory(common.getstring(30150),[("collect",""),("method","show"),("viewmode","view")],"showcollection",
359 join(PIC_PATH,"folder_collections.png"))
360
361
362 # Global search
363 if common.getaddon_setting('m_12')=='true' or display_all:
364 self.add_directory(common.getstring(30098),[("searchterm",""),("viewmode","view")],"globalsearch",
365 join(PIC_PATH,"folder_search.png"))
366
367
368 # picture sources
369 self.add_directory(common.getstring(30099),[("do","showroots"),("viewmode","view")],"rootfolders",
370 join(PIC_PATH,"folder_paths.png"))
371
372
373 # Settings
374 self.add_action(common.getstring(30009),[("showsettings", ""),("viewmode","view")],"showsettings",
375 join(PIC_PATH,"folder_settings.png"))
376
377
378 # Translation Editor
379 self.add_action(common.getstring(30620),[("showtranslationeditor",""),("viewmode","view")],"showtranslationeditor",
380 join(PIC_PATH,"folder_translate.png"))
381
382
383 # Show readme
384 self.add_action(common.getstring(30123),[("help",""),("viewmode","view")],"help",
385 join(PIC_PATH,"folder_help.png"))
386
387
388 xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_UNSORTED)
389 #xbmcplugin.setPluginCategory( handle=int( sys.argv[ 1 ] ), category=unquote_plus("My Pictures Library".encode("utf-8")) )
390 xbmcplugin.endOfDirectory(int(sys.argv[1]),cacheToDisc=True)
391
392 def show_date(self):
393
394 if int(common.getaddon_setting("ratingmini"))>0:
395 min_rating = int(common.getaddon_setting("ratingmini"))
396 else:
397 min_rating = 0
398
399 #period = year|month|date
400 #value = "2009"|"12/2009"|"25/12/2009"
401 common.log("Main.show_date", "start")
402 action="showdate"
403 monthname = common.getstring(30006).split("|")
404 fullmonthname = common.getstring(30008).split("|")
405 if self.args.period=="year":
406 common.log("Main.show_date", "period=year")
407 listperiod=MPDB.get_years(min_rating)
408 nextperiod="month"
409 allperiod =""
410 action="showdate"
411 periodformat="%Y"
412 displaydate=common.getstring(30004)#%Y
413 thisdateformat=""
414 displaythisdate=""
415 elif self.args.period=="month":
416 common.log("Main.show_date", "period=month")
417 listperiod=MPDB.get_months(self.args.value, min_rating)
418 nextperiod="date"
419 allperiod="year"
420 action="showdate"
421 periodformat="%Y-%m"
422 displaydate=common.getstring(30003)#%b %Y
423 thisdateformat="%Y"
424 displaythisdate=common.getstring(30004)#%Y
425 elif self.args.period=="date":
426 common.log("Main.show_date", "period=date")
427 listperiod=MPDB.get_dates(self.args.value,min_rating)
428 nextperiod="date"
429 allperiod = "month"
430 action="showpics"
431 periodformat="%Y-%m-%d"
432 #page=""
433 displaydate=common.getstring(30002)#"%a %d %b %Y"
434 thisdateformat="%Y-%m"
435 displaythisdate=common.getstring(30003)#"%b %Y"
436 else:
437 common.log("Main.show_date", "period=empty")
438 listperiod=[]
439 nextperiod=None
440
441 #if not None in listperiod:
442 dptd = displaythisdate
443 dptd = dptd.replace("%b",monthname[strptime(self.args.value,thisdateformat).tm_mon - 1]) #replace %b marker by short month name
444 dptd = dptd.replace("%B",fullmonthname[strptime(self.args.value,thisdateformat).tm_mon - 1])#replace %B marker by long month name
445 nameperiode = strftime(dptd.encode("utf8"),strptime(self.args.value,thisdateformat))
446
447 common.log("", "dptd = " + dptd)
448 common.log("", "nameperiode = " + nameperiode)
449 common.log("", "allperiod = " + allperiod)
450
451
452 count = MPDB.count_pics_in_period(allperiod, self.args.value, min_rating)
453 if count > 0:
454 self.add_directory(name = common.getstring(30100)%(nameperiode.decode("utf8"), count), #libellé#"All the period %s (%s pics)"%(self.args.value,MPDB.count_pics_in _period(allperiod,self.args.value)), #libellé
455 params = [("method","date"),("period",allperiod),("value",self.args.value),("page",""),("viewmode","view")],#paramètres
456 action = "showpics",#action
457 iconimage = join(PIC_PATH,"folder_date.png"),#icone
458 contextmenu = [(common.getstring(30152),"XBMC.RunPlugin(\"%s?action='addfolder'&method='date'&period='%s'&value='%s'&viewmode='scan'\")"%(sys.argv[0],allperiod,self.args.value)),]
459 )
460 count = MPDB.count_pics_wo_imagedatetime(allperiod, self.args.value, min_rating)
461 if count > 0 and self.args.period=="year":
462 self.add_directory(name = common.getstring(30054)%(count),
463 params = [("method","date"),("period","wo"),("value",self.args.value),("page",""),("viewmode","view")],#paramètres
464 action = "showpics",#action
465 iconimage = join(PIC_PATH,"folder_date.png"),#icone
466 contextmenu = [(common.getstring(30152),"XBMC.RunPlugin(\"%s?action='addfolder'&method='date'&period='%s'&value='%s'&viewmode='scan'\")"%(sys.argv[0],allperiod,self.args.value)),]
467 )
468
469 total=len(listperiod)
470 for period in listperiod:
471 if period:
472 if action=="showpics":
473 context = [(common.getstring(30152),"XBMC.RunPlugin(\"%s?action='addfolder'&method='date'&period='%s'&value='%s'&page=''&viewmode='scan'\")"%(sys.argv[0],nextperiod,period))]
474 else:
475 context = [(common.getstring(30152),"XBMC.RunPlugin(\"%s?action='addfolder'&method='date'&period='%s'&value='%s'&viewmode='scan'\")"%(sys.argv[0],self.args.period,period))]
476
477 try:
478 dateformat = strptime(period,periodformat)
479 self.add_directory(name = "%s (%s %s)"%(strftime(self.prettydate(displaydate,dateformat).encode("utf8"),dateformat).decode("utf8"),
480 MPDB.count_pics_in_period(self.args.period,period, min_rating),
481 common.getstring(30050).encode("utf8")), #libellé
482 params = [("method","date"),("period",nextperiod),("value",period),("viewmode","view")],#paramètres
483 action = action,#action
484 iconimage = join(PIC_PATH,"folder_date.png"),#icone
485 contextmenu = context,#menucontextuel
486 total = total)#nb total d'éléments
487 except:
488 pass
489
490 xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_UNSORTED)
491 xbmcplugin.endOfDirectory(int(sys.argv[1]))
492
493 def show_folders(self):
494 common.log("Main.show_folders", "start")
495 #get the subfolders if any
496 if int(common.getaddon_setting("ratingmini"))>0:
497 min_rating = int(common.getaddon_setting("ratingmini"))
498 else:
499 min_rating = 0
500 if not self.args.folderid: #No Id given, get all the root folders
501 childrenfolders=[row for row in MPDB.cur.request("SELECT idFolder,FolderName FROM Folders WHERE ParentFolder is null")]
502 else:#else, get subfolders for given folder Id
503 childrenfolders=[row for row in MPDB.cur.request_with_binds("SELECT idFolder,FolderName FROM Folders WHERE ParentFolder=?",(self.args.folderid,)) ]
504
505 #show the folders
506 for idchildren, childrenfolder in childrenfolders:
507 common.log("Main.show_folders", "children folder = %s"%childrenfolder)
508 path = MPDB.cur.request_with_binds( "SELECT FullPath FROM Folders WHERE idFolder = ?",(idchildren,) )[0][0]
509 count = MPDB.count_pics_in_folder(idchildren, min_rating)
510 if count > 0:
511 self.add_directory(name = "%s (%s %s)"%(childrenfolder, count, common.getstring(30050)), #libellé
512 params = [("method","folders"),("folderid",str(idchildren)),("onlypics","non"),("viewmode","view")],#paramètres
513 action = "showfolder",#action
514 iconimage = join(PIC_PATH,"folder_pictures.png"),#icone
515 contextmenu = [(common.getstring(30212),"Container.Update(\"%s?action='rootfolders'&do='addrootfolder'&addpath='%s'&exclude='1'&viewmode='view'\",)"%(sys.argv[0],common.quote_param(path.encode('utf-8'))) ),],
516 total = len(childrenfolders))#nb total d'éléments
517
518 #maintenant, on liste les photos si il y en a, du dossier en cours
519 if min_rating > 0:
520 picsfromfolder = [row for row in MPDB.cur.request_with_binds("SELECT p.FullPath,f.strFilename FROM Files f, Folders p WHERE f.idFolder=p.idFolder AND f.idFolder=? AND f.ImageRating > ? order by f.imagedatetime", (self.args.folderid, min_rating, ) )]
521 else:
522 picsfromfolder = [row for row in MPDB.cur.request_with_binds("SELECT p.FullPath,f.strFilename FROM Files f, Folders p WHERE f.idFolder=p.idFolder AND f.idFolder=? order by f.imagedatetime", (self.args.folderid, ) )]
523
524 count = 0
525 for path, filename in picsfromfolder:
526 path = common.smart_unicode(path)
527 filename = common.smart_unicode(filename)
528
529 count = count + 1
530 common.log("Main.show_folders", "pic's path = %s pic's name = %s"%(path,filename))
531
532 context = []
533 #context.append( (common.getstring(30303),"SlideShow(%s%s,recursive,notrandom)"%(sys.argv[0],sys.argv[2]) ) )
534 context.append( ( common.getstring(30152),"XBMC.RunPlugin(\"%s?action='addtocollection'&viewmode='view'&path='%s'&filename='%s'\")"%(sys.argv[0],
535 common.quote_param(path.encode('utf-8')),
536 common.quote_param(filename.encode('utf-8'))) )
537 )
538 self.add_picture(filename, path, count=count, contextmenu=context,
539 fanart = xbmcplugin.getSetting(int(sys.argv[1]),'usepicasfanart')=='true' and join(path,filename)
540 )
541
542
543 xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_LABEL )
544 xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_DATE )
545 xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_PROGRAM_COUNT )
546
547 self.change_view()
548
549 xbmcplugin.endOfDirectory(int(sys.argv[1]))
550
551 def show_translationeditor(self):
552 ui = translationeditor.TranslationEditor( "script-mypicsdb-translationeditor.xml" , common.getaddon_path(), "Default")
553 ui.doModal()
554 del ui
555
556
557 def show_map(self):
558 """get a google map for the given place (place is a string for an address, or a couple of gps lat/lon datas"""
559
560 try:
561 path = common.smart_unicode(self.args.path)
562 filename = common.smart_unicode(self.args.filename)
563 joined = common.smart_utf8(join(path,filename))
564 except:
565 try:
566 path = common.smart_utf8(self.args.path)
567 filename = common.smart_utf8(self.args.filename)
568 joined = join(path,filename)
569 except:
570 return
571
572 ui = googlemaps.GoogleMap( "script-mypicsdb-googlemaps.xml" , common.getaddon_path(), "Default")
573 ui.set_file(joined)
574 ui.set_place(self.args.place)
575 ui.set_datapath(DATA_PATH)
576 ui.doModal()
577 del ui
578
579
580 def show_help(self):
581 viewer.Viewer()
582
583 def show_settings(self):
584 xbmcaddon.Addon().openSettings()
585
586 def show_wizard(self):
587 if self.args.wizard == 'dialog':
588 global GlobalFilterTrue, GlobalFilterFalse, GlobalMatchAll, g_start_date, g_end_date
589 ui = filterwizard.FilterWizard( "script-mypicsdb-filterwizard.xml" , common.getaddon_path(), "Default")
590 ui.set_delegate(filterwizard_delegate)
591 ui.doModal()
592 del ui
593
594 newtagtrue = ""
595 newtagfalse = ""
596 matchall = GlobalMatchAll
597 start_date = g_start_date
598 end_date = g_end_date
599 if len(GlobalFilterTrue) > 0:
600
601 for tag in GlobalFilterTrue:
602 if len(newtagtrue)==0:
603 newtagtrue = tag
604 else:
605 newtagtrue += "|||" + tag
606 newtagtrue = common.smart_unicode(newtagtrue)
607
608 if len(GlobalFilterFalse) > 0:
609
610 for tag in GlobalFilterFalse:
611 if len(newtagfalse)==0:
612 newtagfalse = tag
613 else:
614 newtagfalse += "|||" + tag
615 newtagfalse = common.smart_unicode(newtagfalse)
616
617 if len(GlobalFilterTrue) > 0 or len(GlobalFilterFalse) > 0 or start_date != '' or end_date != '':
618 xbmc.executebuiltin("XBMC.Container.Update(%s?action='showpics'&viewmode='view'&method='wizard'&matchall='%s'&kw='%s'&nkw='%s'&start='%s'&end='%s')" % ( sys.argv[0], matchall, common.quote_param(newtagtrue.encode('utf-8')), common.quote_param(newtagfalse.encode('utf-8')), start_date, end_date) )
619 elif self.args.wizard == 'settings':
620 filterlist = MPDB.filterwizard_list_filters()
621 total = len(filterlist)
622 for filtername in filterlist:
623 filtername = common.smart_unicode(filtername)
624 common.log('',filtername)
625
626 self.add_directory(name = "%s"%(filtername),
627 params = [("method","wizard_settings"),("viewmode","view"),("filtername", filtername),("period",""),("value",""),("page","1")],
628 action = "showpics",
629 iconimage = join(PIC_PATH,"folder_wizard.png"),
630 contextmenu = [(common.getstring(30152),"XBMC.RunPlugin(\"%s?action='addfolder'&method='wizard_settings'&filtername='%s'&viewmode='scan'\")"%(sys.argv[0],filtername)),],
631 #contextmenu = [('','')],
632 total = total)
633 xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_LABEL)
634 xbmcplugin.endOfDirectory(int(sys.argv[1]))
635
636
637 def show_tagtypes(self):
638 if int(common.getaddon_setting("ratingmini"))>0:
639 min_rating = int(common.getaddon_setting("ratingmini"))
640 else:
641 min_rating = 0
642
643 listtags = MPDB.list_tagtypes_count(min_rating)
644 total = len(listtags)
645 common.log("Main.show_tagtypes", "total # of tag types = %s"%total)
646 for tag, nb in listtags:
647 if nb:
648 self.add_directory(name = "%s (%s %s)"%(tag,nb,common.getstring(30052)), #libellé
649 params = [("method","tagtype"),("tagtype",tag),("page","1"),("viewmode","view")],#paramètres
650 action = "showtags",#action
651 iconimage = join(PIC_PATH,"folder_tags.png"),#icone
652 contextmenu = [('','')],
653 total = total)#nb total d'éléments
654 xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_LABEL)
655 xbmcplugin.endOfDirectory(int(sys.argv[1]))
656
657
658 def show_tags(self):
659 if int(common.getaddon_setting("ratingmini"))>0:
660 min_rating = int(common.getaddon_setting("ratingmini"))
661 else:
662 min_rating = 0
663
664 tagtype = self.args.tagtype.decode("utf8")
665 listtags = [k for k in MPDB.list_tags_count(tagtype, min_rating)]
666 total = len(listtags)
667 common.log("Main.show_tags", "total # of tags = %s"%total)
668 for tag, nb in listtags:
669 if nb:
670 self.add_directory(name = "%s (%s %s)"%(tag,nb,common.getstring(30050)), #libellé
671 params = [("method","tag"),("tag",tag),("tagtype",tagtype),("page","1"),("viewmode","view")],#paramètres
672 action = "showpics",#action
673 iconimage = join(PIC_PATH,"folder_tags.png"),#icone
674 contextmenu = [( common.getstring(30152),"XBMC.RunPlugin(\"%s?action='addfolder'&method='tag'&tag='%s'&tagtype='%s'&viewmode='scan'\")"%(sys.argv[0],common.quote_param(tag),tagtype)),
675 ( common.getstring(30061),"XBMC.RunPlugin(\"%s?action='showpics'&method='tag'&page=''&viewmode='zip'&name='%s'&tag='%s'&tagtype='%s'\")"%(sys.argv[0],common.quote_param(tag),common.quote_param(tag),tagtype) ),
676 ( common.getstring(30062),"XBMC.RunPlugin(\"%s?action='showpics'&method='tag'&page=''&viewmode='export'&name='%s'&tag='%s'&tagtype='%s'\")"%(sys.argv[0],common.quote_param(tag),common.quote_param(tag),tagtype) )
677 ],#menucontextuel
678 total = total)#nb total d'éléments
679 xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_LABEL)
680 xbmcplugin.endOfDirectory(int(sys.argv[1]))
681
682
683 def show_period(self): #TODO finished the datestart and dateend editing
684 common.log("show_period", "started")
685 update=False
686 self.add_directory(name = common.getstring(30106),
687 params = [("period","setperiod"),("viewmode","view")],#paramètres
688 action = "showperiod",#action
689 iconimage = join(PIC_PATH,"folder_date_ranges.png"),#icone
690 contextmenu = None)#menucontextuel
691 #If We previously choose to add a new period, this test will ask user for setting the period :
692 if self.args.period=="setperiod":
693 common.log("show_period", "setperiod")
694 dateofpics = MPDB.get_pics_dates()#the choice of the date is made with pictures in database (datetime of pics are used)
695
696 nameddates = [strftime(self.prettydate(common.getstring(30002),strptime(date,"%Y-%m-%d")).encode("utf8"),strptime(date,"%Y-%m-%d")) for date in dateofpics]
697 common.log("show_period >> namedates", nameddates)
698
699 if len(nameddates):
700
701 dialog = xbmcgui.Dialog()
702 rets = dialog.select(common.getstring(30107),["[[%s]]"%common.getstring(30114)] + nameddates)#dateofpics)#choose the start date
703 if not rets==-1:#is not canceled
704 if rets==0: #input manually the date
705 d = dialog.numeric(1, common.getstring(30117) ,strftime("%d/%m/%Y",strptime(dateofpics[0],"%Y-%m-%d")) )
706 common.log("period", str(d))
707 if d != '':
708 datestart = strftime("%Y-%m-%d",strptime(d.replace(" ","0"),"%d/%m/%Y"))
709 else:
710 datestart = ''
711 deb=0
712 else:
713 datestart = dateofpics[rets-1]
714 deb=rets-1
715
716 if datestart != '':
717 retf = dialog.select(common.getstring(30108),["[[%s]]"%common.getstring(30114)] + nameddates[deb:])#dateofpics[deb:])#choose the end date (all dates before startdate are ignored to preserve begin/end)
718 if not retf==-1:#if end date is not canceled...
719 if retf==0:#choix d'un date de fin manuelle ou choix précédent de la date de début manuelle
720 d = dialog.numeric(1, common.getstring(30118) ,strftime("%d/%m/%Y",strptime(dateofpics[-1],"%Y-%m-%d")) )
721 if d != '':
722 dateend = strftime("%Y-%m-%d",strptime(d.replace(" ","0"),"%d/%m/%Y"))
723 else:
724 dateend =''
725 deb=0
726 else:
727 dateend = dateofpics[deb+retf-1]
728
729 if dateend != '':
730 #now input the title for the period
731 #
732 kb = xbmc.Keyboard(common.smart_utf8(common.getstring(30109)%(datestart,dateend)), common.getstring(30110), False)
733 kb.doModal()
734 if (kb.isConfirmed()):
735 titreperiode = kb.getText()
736 else:
737 titreperiode = common.getstring(30109)%(datestart,dateend)
738 #add the new period inside the database
739 MPDB.period_add(common.smart_unicode(titreperiode),common.smart_unicode(datestart),common.smart_unicode(dateend) )
740 update=True
741 else:
742 common.log("show_period", "No pictures with an EXIF date stored in DB")
743
744 #search for inbase periods and show periods
745 for periodname,dbdatestart,dbdateend in MPDB.periods_list():
746 periodname = common.smart_unicode(periodname)
747 dbdatestart = common.smart_unicode(dbdatestart)
748 dbdateend = common.smart_unicode(dbdateend)
749
750 datestart, dateend = MPDB.period_dates_get_pics(dbdatestart,dbdateend)
751 datestart = common.smart_unicode(datestart)
752 dateend = common.smart_unicode(dateend)
753 self.add_directory(name = "%s [COLOR=C0C0C0C0](%s)[/COLOR]"%(periodname,
754 common.getstring(30113)%(strftime(self.prettydate(common.getstring(30002).encode("utf8"),strptime(datestart,"%Y-%m-%d")).encode("utf8"),strptime(datestart,"%Y-%m-%d")).decode("utf8"),
755 strftime(self.prettydate(common.getstring(30002).encode("utf8"),strptime(dateend ,"%Y-%m-%d")).encode("utf8"),strptime(dateend ,"%Y-%m-%d")).decode("utf8")
756 )), #libellé
757 params = [("method","date"),("period","period"),("datestart",datestart),("dateend",dateend),("page","1"),("viewmode","view")],#paramètres
758 action = "showpics",#action
759 iconimage = join(PIC_PATH,"folder_date_ranges.png"),#icone
760 contextmenu = [ ( common.getstring(30111),"XBMC.RunPlugin(\"%s?action='removeperiod'&viewmode='view'&periodname='%s'&period='period'\")"%(sys.argv[0],common.quote_param(periodname.encode("utf8"))) ),
761 ( common.getstring(30112),"XBMC.RunPlugin(\"%s?action='renameperiod'&viewmode='view'&periodname='%s'&period='period'\")"%(sys.argv[0],common.quote_param(periodname.encode("utf8"))) ),
762 ( common.getstring(30152),"XBMC.RunPlugin(\"%s?action='addfolder'&method='date'&period='period'&datestart='%s'&dateend='%s'&viewmode='scan'\")"%(sys.argv[0],datestart,dateend))
763 ] )#menucontextuel
764
765 xbmcplugin.addSortMethod( int(sys.argv[1]), xbmcplugin.SORT_METHOD_UNSORTED )
766
767 self.change_view()
768
769 xbmcplugin.endOfDirectory( int(sys.argv[1]),updateListing=update )
770
771
772 def show_collection(self):
773 if int(common.getaddon_setting("ratingmini"))>0:
774 min_rating = int(common.getaddon_setting("ratingmini"))
775 else:
776 min_rating = 0
777
778 #herve502
779 from xml.dom.minidom import parseString
780 #/herve502
781 common.log("show_collection", "started")
782 if self.args.method=="setcollection":#ajout d'une collection
783 kb = xbmc.Keyboard("",common.getstring(30155) , False)
784 kb.doModal()
785 if (kb.isConfirmed()):
786 namecollection = kb.getText()
787 else:
788 #name input for collection has been canceled
789 return
790 #create the collection in the database
791 common.log("show_collection", "setcollection = %s"%namecollection)
792 MPDB.collection_new(namecollection)
793 refresh=True
794
795 elif self.args.method=="importcollection_wizard": #import a collection from Filter Wizard Settings
796 filters = MPDB.filterwizard_list_filters()
797 dialog = xbmcgui.Dialog()
798 ret = dialog.select(common.getstring(30608), filters)
799 if ret > -1:
800 # ask user for name of new collection
801 collection_name = filters[ret]
802 kb = xbmc.Keyboard(collection_name,common.getstring(30155) , False)
803 kb.doModal()
804 if (kb.isConfirmed()):
805 collection_name = kb.getText()
806
807 #MPDB.collection_add_dyn_data(collection_name, filters[ret], 'FilterWizard')
808
809 rows = MPDB.filterwizard_get_pics_from_filter(filters[ret], 0)
810
811 if rows != None:
812 MPDB.collection_new(collection_name)
813 for pathname, filename in rows:
814 MPDB.collection_add_pic(collection_name, pathname,filename)
815 else:
816 common.log("show_collection", str(filters[ret]) + " is empty and therefore not created.", xbmc.LOGNOTICE)
817 refresh = True
818
819 #herve502
820 elif self.args.method=="importcollection_picasa": #import xml from picasa
821 dialog = xbmcgui.Dialog()
822 importfile = dialog.browse(1, common.getstring(30162) , "files" ,".xml", True, False, "")
823 if not importfile:
824 return
825
826 not_imported= ""
827 try:
828 fh = open(importfile,'r')
829 importfile = fh.read()
830 fh.close()
831
832 album = parseString(importfile)
833
834 collection_name=album.getElementsByTagName("albumName")[0].firstChild.data.encode("utf-8").strip()
835
836 # ask user if title as new collection name is correct
837 kb = xbmc.Keyboard(collection_name,common.getstring(30155) , False)
838 kb.doModal()
839 if (kb.isConfirmed()):
840 collection_name = kb.getText()
841
842 #create the collection in the database
843 common.log("show_collection", "setcollection = %s"%collection_name)
844
845 MPDB.collection_new(collection_name)
846
847 file_names = album.getElementsByTagName("itemOriginalPath") # Xycl get pictures with complete path name
848 for itemName in file_names: # iterate over the nodes
849 filepath = itemName.firstChild.data.encode("utf-8").strip() # get data ("name of picture")
850 filename = basename(filepath )
851 pathname = dirname(filepath )
852 try:
853 # Path in DB can end with "/" or "\" or without the path delimiter.
854 # Therefore it's a little bit tricky to test for exsistence of path.
855
856 # At first we use what is stored in DB
857
858 # if no row returns then the [0] at the end of select below will raise an exception.
859 # easy test of existence of file in DB
860 filename, pathname = MPDB.cur.request_with_binds("select strFilename, strPath from Files where lower(strFilename) = ? and lower(strPath) = ? ",
861 (filename.lower(), pathname.lower() ) )[0]
862 MPDB.collection_add_pic(collection_name, pathname,filename)
863 except:
864 try:
865 # Secondly we use the stored path in DB without last character
866 filename, pathname = MPDB.cur.request_with_binds("select strFilename, strPath from Files where lower(strFilename) = ? and substr(lower(strPath), 1, length(strPath)-1) = ? ",
867 (filename.lower(), pathname.lower() ) )[0]
868 MPDB.collection_add_pic(collection_name, pathname,filename)
869
870 except:
871 not_imported += common.getstring(30166)%(filename, pathname)
872 pass
873
874
875 except:
876 dialog.ok(common.getstring(30000),common.getstring(30163))
877 return
878
879 if not_imported != "":
880 not_imported = common.getstring(30165) + not_imported
881 viewer.Viewer(header = common.getstring(30167), text = not_imported)
882 refresh=True
883 #/herve502
884 else:
885 refresh=False
886
887 self.add_directory(name = common.getstring(30160),
888 params = [("method","setcollection"),("collect",""),("viewmode","view"),],#paramètres
889 action = "showcollection",#action
890 iconimage = join(PIC_PATH,"folder_collections.png"),#icone
891 contextmenu = None)#menucontextuel
892 self.add_directory(name = common.getstring(30168),
893 params = [("method","importcollection_wizard"),("collect",""),("viewmode","view"),],#paramètres
894 action = "showcollection",#action
895 iconimage = join(PIC_PATH,"folder_collections.png"),#icone
896 contextmenu = None)#menucontextuel
897 #herve502
898 self.add_directory(name = common.getstring(30162),
899 params = [("method","importcollection_picasa"),("collect",""),("viewmode","view"),],#paramètres
900 action = "showcollection",#action
901 iconimage = join(PIC_PATH,"folder_collections.png"),#icone
902 contextmenu = None)#menucontextuel
903 #/herve520
904 for collection in MPDB.collections_list():
905 self.add_action(name = collection[0],
906 params = [("method","collection"),("collect",collection[0]),("page","1"),("viewmode","slideshow")],#paramètres
907 action = "showpics",#action
908 iconimage = join(PIC_PATH,"folder_collections.png"),#icone
909
910 contextmenu = [
911 (common.getstring(30169),"Container.Update(\"%s?action='showpics'&method='collection'&page=''&viewmode='view'&name='%s'&collect='%s'\")"%(sys.argv[0],common.quote_param(collection[0].encode('utf-8')),common.quote_param(collection[0].encode('utf-8'))) ),
912 (common.getstring(30149),"XBMC.RunPlugin(\"%s?action='collectionaddplaylist'&viewmode='view'&collect='%s'\")"%(sys.argv[0],common.quote_param(collection[0].encode('utf-8')) ) ),
913 (common.getstring(30158),"XBMC.RunPlugin(\"%s?action='removecollection'&viewmode='view'&collect='%s'\")"%(sys.argv[0],common.quote_param(collection[0].encode('utf-8')) ) ),
914 (common.getstring(30159),"XBMC.RunPlugin(\"%s?action='renamecollection'&viewmode='view'&collect='%s'\")"%(sys.argv[0],common.quote_param(collection[0].encode('utf-8'))) ),
915 (common.getstring(30061),"XBMC.RunPlugin(\"%s?action='showpics'&method='collection'&page=''&viewmode='zip'&name='%s'&collect='%s'\")"%(sys.argv[0],common.quote_param(collection[0].encode('utf-8')),common.quote_param(collection[0].encode('utf-8'))) ),
916 (common.getstring(30062),"XBMC.RunPlugin(\"%s?action='showpics'&method='collection'&page=''&viewmode='export'&name='%s'&collect='%s'\")"%(sys.argv[0],common.quote_param(collection[0].encode('utf-8')),common.quote_param(collection[0].encode('utf-8'))) )
917 ] )#menucontextuel
918
919 xbmcplugin.addSortMethod( int(sys.argv[1]), xbmcplugin.SORT_METHOD_UNSORTED )
920
921 self.change_view()
922
923
924 xbmcplugin.endOfDirectory( int(sys.argv[1]),updateListing=refresh)
925
926
927 def global_search(self):
928 if int(common.getaddon_setting("ratingmini"))>0:
929 min_rating = int(common.getaddon_setting("ratingmini"))
930 else:
931 min_rating = 0
932
933 if not self.args.searchterm:
934 refresh=0
935 filters = MPDB.search_list_saved()
936 dialog = xbmcgui.Dialog()
937
938 ret = dialog.select(common.getstring(30121), filters)
939 if ret > 0:
940 motrecherche = filters[ret]
941 # Save is important because there are only 10 saved searches and due to save call the search gets a new key!!!
942 MPDB.search_save(motrecherche)
943 elif ret == -1:
944 common.log("Main.global_search", "user cancelled search")
945 xbmcplugin.endOfDirectory( int(sys.argv[1]),updateListing=refresh)
946 return
947
948 else:
949 kb = xbmc.Keyboard("",common.getstring(30115) , False)
950 kb.doModal()
951 if (kb.isConfirmed()):
952 motrecherche = kb.getText()
953 if motrecherche == '':
954 xbmcplugin.endOfDirectory( int(sys.argv[1]),updateListing=refresh)
955 return
956
957 MPDB.search_save(motrecherche)
958 common.log("Main.global_search", "user entered %s"%motrecherche)
959 else:
960 common.log("Main.global_search", "user cancelled search")
961 xbmcplugin.endOfDirectory( int(sys.argv[1]),updateListing=refresh)
962 return
963
964 else:
965 motrecherche = self.args.searchterm
966 common.log("Main.global_search", "search %s"%motrecherche)
967 refresh=1
968
969 listtags = [k for k in MPDB.list_tagtypes_count(min_rating)]
970
971 result = False
972 for tag, _ in listtags:
973 common.log("Main.global_search","Search %s in %s"%(motrecherche, tag))
974 compte = MPDB.search_in_files(tag, motrecherche, min_rating, count=True)
975 if compte:
976 result = True
977 self.add_directory(name = common.getstring(30116)%(compte,motrecherche.decode("utf8"),tag ), #files_fields_description.has_key(colname) and files_fields_description[colname] or colname),
978 params = [("method","search"),("field",u"%s"%common.smart_unicode(tag)),("searchterm",u"%s"%common.smart_unicode(motrecherche)),("page","1"),("viewmode","view")],#paramètres
979 action = "showpics",#action
980 iconimage = join(PIC_PATH,"folder_search.png"),
981 contextmenu = [(common.getstring(30152),"XBMC.RunPlugin(\"%s?action='addfolder'&method='search'&field='%s'&searchterm='%s'&viewmode='scan'\")"%(sys.argv[0],tag,motrecherche))])#menucontextuel
982 if not result:
983 dialog = xbmcgui.Dialog()
984 dialog.ok(common.getstring(30000), common.getstring(30119)%motrecherche)
985 refresh=0
986 xbmcplugin.endOfDirectory( int(sys.argv[1]),updateListing=refresh)
987 return
988 xbmcplugin.addSortMethod( int(sys.argv[1]), xbmcplugin.SORT_METHOD_UNSORTED )
989
990 self.change_view()
991
992 xbmcplugin.endOfDirectory( int(sys.argv[1]),updateListing=refresh)
993
994
995 def get_picture_sources(self):
996 jsonResult = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "Files.GetSources", "params": {"media": "pictures"}, "id": 1}')
997 shares = eval(jsonResult)
998
999 shares = shares['result']
1000 shares = shares.get('sources')
1001
1002 if(shares == None):
1003 shares = []
1004
1005 names = []
1006 sources = []
1007 for s in shares:
1008
1009 if s['file'].startswith('addons://'):
1010 pass
1011 else:
1012 sources.append(s['file'])
1013 names.append(s['label'])
1014 return names, sources
1015
1016 def show_roots(self):
1017 #show the root folders
1018
1019 if self.args.do=="addroot" or self.args.do=="addpicturessource":#add a root to scan
1020
1021 if self.args.do=="addroot":
1022 dialog = xbmcgui.Dialog()
1023 newroot = dialog.browse(0, common.getstring(30201) , 'pictures')
1024
1025 if not newroot:
1026 return
1027 elif self.args.do=="addpicturessource":
1028 _names, sources = self.get_picture_sources()
1029
1030 for source in sources:
1031 try:
1032 if source.startswith('multipath://'):
1033 common.log("Main.show_roots", 'Adding Multipath: "%s"'%unquote_plus(source))
1034 newpartialroot = source[12:-1].split('/')
1035 for item in newpartialroot:
1036 MPDB.add_root_folder(unquote_plus(item),True,True,0)#TODO : traiter le exclude (=0 pour le moment) pour gérer les chemins à exclure
1037 common.log("Main.show_roots", 'Multipath addroot for part "%s" done'%unquote_plus(item))
1038 else:
1039 MPDB.add_root_folder(source,True,True,0)#TODO : traiter le exclude (=0 pour le moment) pour gérer les chemins à exclure
1040 common.log("Main.show_roots", 'Singlepath addroot "%s" done'%source)
1041
1042 xbmc.executebuiltin( "Container.Refresh(\"%s?action='rootfolders'&do='showroots'&exclude='0'&viewmode='view'\",)"%(sys.argv[0],))
1043
1044 except:
1045 common.log("Main.show_roots", 'MPDB.add_root_folder failed for "%s"'%source, xbmc.LOGERROR)
1046
1047 if not(xbmc.getInfoLabel( "Window.Property(DialogAddonScan.IsAlive)" ) == "true"):
1048 common.run_script("%s,--refresh"% join( home, "scanpath.py"))
1049 return
1050
1051
1052 else :
1053 return
1054 if str(self.args.exclude)=="1":
1055 MPDB.add_root_folder(newroot,0,0,1)
1056 xbmc.executebuiltin( "Container.Refresh(\"%s?action='rootfolders'&do='showroots'&exclude='1'&viewmode='view'\",)"%(sys.argv[0],))
1057 common.log("Main.show_roots", 'Exclude folder "%s" added'%newroot)
1058 #xbmc.executebuiltin( "Notification(%s,%s,%s,%s)"%(common.getstring(30000).encode("utf8"),common.getstring(30204).encode("utf8"),3000,join(home,"icon.png").encode("utf8") ) )
1059 dialogok = xbmcgui.Dialog()
1060 dialogok.ok(common.getstring(30000), common.getstring(30217), common.getstring(30218) )
1061 else:
1062 recursive = dialog.yesno(common.getstring(30000),common.getstring(30202)) and 1 or 0 #browse recursively this folder ?
1063 update = True #dialog.yesno(common.getstring(30000),common.getstring(30203)) and 1 or 0 # Remove files from database if pictures does not exists?
1064
1065 try:
1066 if newroot.startswith('multipath://'):
1067 common.log("Main.show_roots", 'Adding Multipath: "%s"'%unquote_plus(newroot))
1068 newpartialroot = newroot[12:-1].split('/')
1069 for item in newpartialroot:
1070 MPDB.add_root_folder(unquote_plus(item),recursive,update,0)#TODO : traiter le exclude (=0 pour le moment) pour gérer les chemins à exclure
1071 common.log("Main.show_roots", 'Multipath addroot for part "%s" done'%unquote_plus(item))
1072 else:
1073 MPDB.add_root_folder(newroot,recursive,update,0)#TODO : traiter le exclude (=0 pour le moment) pour gérer les chemins à exclure
1074 common.log("Main.show_roots", 'Singlepath addroot "%s" done'%newroot)
1075
1076 xbmc.executebuiltin( "Container.Refresh(\"%s?action='rootfolders'&do='showroots'&exclude='0'&viewmode='view'\",)"%(sys.argv[0],))
1077
1078 except:
1079 common.log("Main.show_roots", 'MPDB.add_root_folder failed for "%s"'%newroot, xbmc.LOGERROR)
1080 common.show_notification(common.getstring(30000),common.getstring(30204),3000,join(home,"icon.png"))
1081
1082 if not(xbmc.getInfoLabel( "Window.Property(DialogAddonScan.IsAlive)" ) == "true"): #si dialogaddonscan n'est pas en cours d'utilisation...
1083 if dialog.yesno(common.getstring(30000),common.getstring(30206)):#do a scan now ?
1084 if newroot.startswith('multipath://'):
1085 common.log("Main.show_roots", "Multipaths" )
1086 newpartialroot = newroot[12:-1].split('/')
1087 for item in newpartialroot:
1088 common.log("Main.show_roots", 'Starting scanpath "%s"'% unquote_plus(item) )
1089 common.run_script("%s,%s --rootpath=%s"%( join( home, "scanpath.py"),recursive and "-r, " or "",common.quote_param(unquote_plus(item))))
1090
1091 common.log("Main.show_roots", 'Scanpath "%s" started'% unquote_plus(item) )
1092 else:
1093 common.log("Main.show_roots", 'Starting scanpath "%s"'%newroot)
1094 common.run_script("%s,%s --rootpath=%s"%( join( home, "scanpath.py"),recursive and "-r, " or "",common.quote_param(newroot)))
1095
1096 common.log("Main.show_roots", 'Scanpath "%s" started'%newroot )
1097 else:
1098 return
1099 return
1100
1101 # I don't think that this is ever called because no user knows about it
1102 elif self.args.do=="addrootfolder":
1103 if str(self.args.exclude)=="1":
1104 common.log("Main.show_roots", 'addrootfolder "%s" (exclude) from context menu'%self.args.addpath)
1105 MPDB.add_root_folder(self.args.addpath,0,0,1)
1106
1107 elif self.args.do=="delroot":
1108 try:
1109 dialog = xbmcgui.Dialog()
1110 if dialog.yesno(common.getstring(30250), common.smart_utf8(common.getstring(30251))%common.smart_utf8(self.args.delpath)) :
1111 common.log("Main.show_roots", 'delroot "%s"'% self.args.delpath)
1112 MPDB.delete_root( self.args.delpath)
1113 if self.args.delpath != 'neverexistingpath':
1114 common.show_notification(common.getstring(30000),common.getstring(30205),3000,join(home,"icon.png"))
1115 except IndexError,msg:
1116 common.log("Main.show_roots", 'delroot IndexError %s - %s'%( IndexError,msg), xbmc.LOGERROR )
1117
1118 elif self.args.do=="rootclic":
1119 if not(xbmc.getInfoLabel( "Window.Property(DialogAddonScan.IsAlive)" ) == "true"):
1120 if str(self.args.exclude)=="0":
1121 path,recursive,update,exclude = MPDB.get_root_folders(self.args.rootpath)
1122 common.run_script("%s,%s --rootpath=%s"%( join( home, "scanpath.py"),recursive and "-r, " or "",common.quote_param(path)))
1123
1124 else:
1125 pass
1126 else:
1127 #dialogaddonscan était en cours d'utilisation, on return
1128 return
1129 elif self.args.do=="scanall":
1130 if not(xbmc.getInfoLabel( "Window.Property(DialogAddonScan.IsAlive)" ) == "true"):
1131
1132 common.run_script("%s,--database"% join( home, "scanpath.py"))
1133 return
1134 else:
1135 #dialogaddonscan était en cours d'utilisation, on return
1136 return
1137 elif self.args.do=="refreshpaths":
1138 if not(xbmc.getInfoLabel( "Window.Property(DialogAddonScan.IsAlive)" ) == "true"):
1139 common.run_script("%s,--refresh"% join( home, "scanpath.py"))
1140 return
1141
1142 if int(sys.argv[1]) >= 0:
1143 excludefolders=[]
1144 includefolders=[]
1145 for path,recursive,update,exclude in MPDB.get_all_root_folders():
1146 if exclude:
1147 excludefolders.append([path,recursive,update])
1148 else:
1149 includefolders.append([path,recursive,update])
1150
1151
1152 # Add XBMC picutre sources to database
1153 self.add_action(name = common.getstring(30216),#add a root path
1154 params = [("do","addpicturessource"),("viewmode","view"),("exclude","0")],#paramètres
1155 action = "rootfolders",#action
1156 iconimage = join(PIC_PATH,"folder_paths.png"),#icone
1157 contextmenu = None)#menucontextuel
1158
1159 # Add a path to database
1160 self.add_action(name = common.getstring(30208),#add a root path
1161 params = [("do","addroot"),("viewmode","view"),("exclude","0")],#paramètres
1162 action = "rootfolders",#action
1163 iconimage = join(PIC_PATH,"folder_paths.png"),#icone
1164 contextmenu = None)#menucontextuel
1165
1166 # Scan all paths
1167 if len(includefolders) > 0:
1168 self.add_action(name = common.getstring(30213),#scan all distinct root paths
1169 params = [("do","scanall"),("viewmode","view"),],#paramètres
1170 action = "rootfolders",#action
1171 iconimage = join(PIC_PATH,"folder_paths.png"),#icone
1172 contextmenu = None)#menucontextuel
1173 # Add new pictures
1174 if len(includefolders) > 0:
1175 self.add_action(name = common.getstring(30249),#scan all distinct root paths
1176 params = [("do","refreshpaths"),("viewmode","view"),],#paramètres
1177 action = "rootfolders",#action
1178 iconimage = join(PIC_PATH,"folder_paths.png"),#icone
1179 contextmenu = None)#menucontextuel
1180
1181 # Show included folders
1182 for path,recursive,update in includefolders:
1183 srec = recursive==1 and "ON" or "OFF"
1184 supd = update==1 and "ON" or "OFF"
1185 path = common.smart_unicode(path)
1186
1187 self.add_action(name = "[COLOR=FF66CC00][B][ + ][/B][/COLOR] "+path+" [COLOR=FFC0C0C0][recursive="+srec+" , update="+supd+"][/COLOR]",
1188 params = [("do","rootclic"),("rootpath",path),("viewmode","view"),("exclude","0")],#paramètres
1189 action = "rootfolders",#action
1190 iconimage = join(PIC_PATH,"folder_paths.png"),#icone
1191 #menucontextuel
1192 contextmenu = [( common.getstring(30206),"Notification(TODO : scan folder,scan this folder now !,3000,%s)"%join(home,"icon.png").encode("utf8") ),
1193 ( common.getstring(30207),"Container.Update(\"%s?action='rootfolders'&do='delroot'&delpath='%s'&exclude='1'&viewmode='view'\",)"%(sys.argv[0],common.quote_param(path.encode('utf-8'))))
1194 ]
1195 )
1196 #Add a folder to exclude
1197 if len(includefolders)>=0:
1198 self.add_action(name = common.getstring(30211),#add a folder to exclude
1199 params = [("do","addroot"),("viewmode","view"),("exclude","1")],#paramètres
1200 action = "rootfolders",#action
1201 iconimage = join(PIC_PATH,"folder_paths.png"),#icone
1202 contextmenu = None)#menucontextuel
1203
1204 #Show excluded folders
1205 for path,recursive,update in excludefolders:
1206 self.add_action(name = "[COLOR=FFFF0000][B][ - ][/B][/COLOR] "+path,
1207 params = [("do","rootclic"),("rootpath",path),("viewmode","view"),("exclude","1")],#paramètres
1208 action = "rootfolders",#action
1209 iconimage = join(PIC_PATH,"folder_paths.png"),#icone
1210 #menucontextuel
1211 contextmenu = [( common.getstring(30210),"Container.Update(\"%s?action='rootfolders'&do='delroot'&delpath='%s'&exclude='0'&viewmode='view'\",)"%(sys.argv[0],common.quote_param(path.encode('utf-8'))))])
1212
1213 if self.args.do=="delroot":
1214 xbmcplugin.endOfDirectory( int(sys.argv[1]), updateListing=True)
1215 else:
1216 xbmcplugin.endOfDirectory( int(sys.argv[1]))
1217
1218
1219 def prettydate(self,dateformat,datetuple):
1220 "Replace %a %A %b %B date string formater (see strftime format) by the day/month names for the given date tuple given"
1221 dateformat = dateformat.replace("%a",common.getstring(30005).split("|")[datetuple.tm_wday]) #replace %a marker by short day name
1222 dateformat = dateformat.replace("%A",common.getstring(30007).split("|")[datetuple.tm_wday]) #replace %A marker by long day name
1223 dateformat = dateformat.replace("%b",common.getstring(30006).split("|")[datetuple.tm_mon - 1]) #replace %b marker by short month name
1224 dateformat = dateformat.replace("%B",common.getstring(30008).split("|")[datetuple.tm_mon - 1]) #replace %B marker by long month name
1225 return dateformat
1226
1227
1228 def remove_period(self):
1229
1230 MPDB.period_delete(self.args.periodname)
1231 xbmc.executebuiltin( "Container.Update(\"%s?action='showperiod'&viewmode='view'&period=''\" , replace)"%sys.argv[0] )
1232
1233
1234 def period_rename(self):
1235 #TODO : test if 'datestart' is before 'dateend'
1236 periodname = self.args.periodname
1237 datestart,dateend = MPDB.cur.request_with_binds( """SELECT DateStart,DateEnd FROM Periodes WHERE PeriodeName=? """, (periodname,) )[0]
1238 common.log("", "datestart = %s"%datestart)
1239 common.log("", "dateend = %s"%dateend)
1240 dialog = xbmcgui.Dialog()
1241 d = dialog.numeric(1, "Input start date for period" ,strftime("%d/%m/%Y",strptime(str(datestart),"%Y-%m-%d %H:%M:%S")) )
1242 datestart = strftime("%Y-%m-%d",strptime(d.replace(" ","0"),"%d/%m/%Y"))
1243
1244 d = dialog.numeric(1, "Input end date for period" ,strftime("%d/%m/%Y",strptime(str(dateend),"%Y-%m-%d %H:%M:%S")) )
1245 dateend = strftime("%Y-%m-%d",strptime(d.replace(" ","0"),"%d/%m/%Y"))
1246
1247 kb = xbmc.Keyboard(common.smart_unicode(periodname), common.getstring(30110), False)
1248 kb.doModal()
1249 if (kb.isConfirmed()):
1250 titreperiode = kb.getText()
1251 else:
1252 titreperiode = periodname
1253
1254 MPDB.period_rename(self.args.periodname,titreperiode,datestart,dateend)
1255 xbmc.executebuiltin( "Container.Update(\"%s?action='showperiod'&viewmode='view'&period=''\" , replace)"%sys.argv[0] )
1256
1257
1258 def collection_add_pic(self):
1259 listcollection = ["[[%s]]"%common.getstring(30157)]+[col[0] for col in MPDB.collections_list()]
1260
1261 dialog = xbmcgui.Dialog()
1262 rets = dialog.select(common.getstring(30156),listcollection)
1263 if rets==-1: #choix de liste annulé
1264 return
1265 if rets==0: #premier élément : ajout manuel d'une collection
1266 kb = xbmc.Keyboard("", common.getstring(30155), False)
1267 kb.doModal()
1268 if (kb.isConfirmed()):
1269 namecollection = kb.getText()
1270 else:
1271 #il faut traiter l'annulation
1272 return
1273 #2 créé la collection en base
1274 MPDB.collection_new(namecollection)
1275 else: #dans tous les autres cas, une collection existente choisie
1276 namecollection = listcollection[rets]
1277 #3 associe en base l'id du fichier avec l'id de la collection
1278 namecollection = common.smart_unicode(namecollection)
1279 path = common.smart_unicode(self.args.path)
1280 filename = common.smart_unicode(self.args.filename)
1281
1282 MPDB.collection_add_pic( namecollection, path, filename )
1283 common.show_notification(common.getstring(30000), common.getstring(30154)+ ' ' + namecollection,3000,join(home,"icon.png"))
1284 #xbmc.executebuiltin( "Notification(%s,%s %s,%s,%s)"%(common.getstring(30000).encode('utf-8'),common.getstring(30154).encode('utf-8'),namecollection.encode('utf-8'),3000,join(home,"icon.png").encode('utf-8')))
1285
1286
1287 def collection_add_folder(self):
1288 listcollection = ["[[%s]]"%common.getstring(30157)]+[col[0] for col in MPDB.collections_list()]
1289
1290 dialog = xbmcgui.Dialog()
1291 rets = dialog.select(common.getstring(30156),listcollection)
1292 if rets==-1: #cancel
1293 return
1294 if rets==0: # new collection
1295 kb = xbmc.Keyboard("", common.getstring(30155), False)
1296 kb.doModal()
1297 if (kb.isConfirmed()):
1298 namecollection = kb.getText()
1299 else:
1300 # cancel
1301 return
1302 common.log("", namecollection)
1303 MPDB.collection_new(namecollection)
1304 else: # existing collection
1305 namecollection = listcollection[rets]
1306
1307 #3 associe en base l'id du fichier avec l'id de la collection
1308 filelist = self.show_pics() #on récupère les photos correspondantes à la vue
1309 namecollection = common.smart_unicode(namecollection)
1310 for path,filename in filelist: #on les ajoute une par une
1311 path = common.smart_unicode(path)
1312 filename = common.smart_unicode(filename)
1313 MPDB.collection_add_pic( namecollection,path,filename )
1314 common.show_notification(common.getstring(30000), common.getstring(30161)%len(filelist)+' '+namecollection,3000,join(home,"icon.png"))
1315 #xbmc.executebuiltin( "Notification(%s,%s %s,%s,%s)"%(common.getstring(30000).encode("utf8"), common.getstring(30161).encode("utf8")%len(filelist),namecollection.encode("utf8"), 3000,join(home,"icon.png").encode("utf8")) )
1316
1317
1318 def collection_delete(self):
1319 dialog = xbmcgui.Dialog()
1320
1321 if dialog.yesno(common.getstring(30150), common.getstring(30251)%self.args.collect ):
1322 MPDB.collection_delete(self.args.collect)
1323 xbmc.executebuiltin( "Container.Update(\"%s?action='showcollection'&viewmode='view'&collect=''&method='show'\" , replace)"%sys.argv[0] , )
1324
1325
1326 def collection_rename(self):
1327 kb = xbmc.Keyboard(self.args.collect, common.getstring(30153), False)
1328 kb.doModal()
1329 if (kb.isConfirmed()):
1330 newname = kb.getText()
1331 else:
1332 newname = self.args.collect
1333 MPDB.collection_rename(self.args.collect,newname)
1334 xbmc.executebuiltin( "Container.Update(\"%s?action='showcollection'&viewmode='view'&collect=''&method='show'\" , replace)"%sys.argv[0] , )
1335
1336
1337 def collection_add_playlist(self):
1338
1339 ''' Purpose: launch Select Window populated with music playlists '''
1340 colname = self.args.collect
1341 common.log("", "collection_add_playlist")
1342 try:
1343 result = xbmc.executeJSONRPC('{"jsonrpc": "2.0","id": 1, "method": "Files.GetDirectory", "params": {"directory": "special://musicplaylists/", "media": "music"}}')
1344 playlist_files = eval(result)['result']['files']
1345 except:
1346 return
1347
1348 if playlist_files != None:
1349
1350 plist_files = dict((x['label'],x['file']) for x in playlist_files)
1351 common.log("", plist_files)
1352 playlist_list = plist_files.keys()
1353
1354 playlist_list.sort()
1355 inputchoice = xbmcgui.Dialog().select(common.getstring(30148), playlist_list)
1356 if inputchoice > -1:
1357 MPDB.collection_add_playlist(self.args.collect, plist_files[playlist_list[inputchoice]])
1358 else:
1359 MPDB.collection_add_playlist(self.args.collect, '')
1360
1361
1362 def collection_del_pic(self):
1363 MPDB.collection_del_pic(self.args.collect,self.args.path,self.args.filename)
1364 xbmc.executebuiltin( "Container.Update(\"%s?action='showpics'&viewmode='view'&page='1'&collect='%s'&method='collection'\" , replace)"%(sys.argv[0],common.quote_param(self.args.collect)) , )
1365
1366
1367 def show_diaporama(self):
1368 #1- récupère la liste des images (en utilisant show_pics avec le bon paramètre
1369 self.args.viewmode="diapo"
1370 self.args.page=""
1371 self.show_pics()
1372
1373
1374 def show_lastshots(self):
1375 #récupère X dernières photos puis affiche le résultat
1376 pass
1377
1378
1379 # MikeBZH44 : Method to execute query
1380 def exec_query(self,query):
1381 # Execute query
1382 # Needed to store results if CommonCache cacheFunction is used
1383 _results = MPDB.cur.request( query )
1384 return _results
1385
1386
1387 # MikeBZH44 : Method to query database and store result in Windows properties and CommonCache table
1388 def set_properties(self):
1389 # Init variables
1390 _limit = m.args.limit
1391 _method = m.args.method
1392 _results = []
1393 _count = 0
1394 WINDOW = xbmcgui.Window( 10000 )
1395 START_TIME = time.time()
1396 # Get general statistics and set properties
1397 Count = MPDB.cur.request( """SELECT COUNT(*) FROM Files WHERE ImageDateTime IS NOT NULL""" )[0]
1398 Collections = MPDB.cur.request( """SELECT COUNT(*) FROM collections""" )[0]
1399 Categories = MPDB.cur.request( """select count(distinct tf.idFile) from TagTypes tt, TagContents tc, TagsInFiles tf where tt.idTagType = tc.idTagType and tc.idTagContent = tf.idTagContent and tt.TagTranslation = ( select TagTranslation from TagTypes tti where tti.TagType = 'Category')""" )[0]
1400 Folders = MPDB.cur.request( """SELECT COUNT(*) FROM Folders WHERE HasPics = 1""" )[0]
1401 WINDOW.clearProperty( "MyPicsDB%s.Count" %(_method))
1402 WINDOW.setProperty ( "MyPicsDB%s.Count" %(_method), str(Count[0]) )
1403 WINDOW.clearProperty( "MyPicsDB%s.Categories" %(_method))
1404 WINDOW.setProperty ( "MyPicsDB%s.Categories" %(_method), str(Categories[0]) )
1405 WINDOW.clearProperty( "MyPicsDB%s.Collections" %(_method))
1406 WINDOW.setProperty ( "MyPicsDB%s.Collections" %(_method), str(Collections[0]) )
1407 WINDOW.clearProperty( "MyPicsDB%s.Folders" %(_method))
1408 WINDOW.setProperty ( "MyPicsDB%s.Folders" %(_method), str(Folders[0]) )
1409 # Build query string
1410 # Default query
1411 _query = """SELECT b.FolderName, a.strPath, a.strFilename, ImageDateTime, TagContent """
1412 _query += """FROM Files AS a """
1413 _query += """ INNER JOIN Folders AS b """
1414 _query += """ ON a.idFolder = b.idFolder """
1415 _query += """ LEFT OUTER JOIN (SELECT a.idFile, a.idTagContent, b.TagContent """
1416 _query += """ FROM TagsInFiles AS a, TagContents AS b, TagTypes AS c """
1417 _query += """ WHERE a.idTagContent = b.idTagContent """
1418 _query += """ AND b.idtagType = c.idTagType """
1419 _query += """ AND c.tagType = 'Caption/abstract' """
1420 _query += """ ) AS c """
1421 _query += """ ON a.idFile = c.idFile """
1422 _query += """WHERE ImageDateTime IS NOT NULL """
1423 if _method == "Latest":
1424 # Get latest pictures based on shooted date time or added date time
1425 _sort = m.args.sort
1426 if _sort == "Shooted":
1427 _query += """ORDER BY ImageDateTime DESC LIMIT %s""" %(str(_limit))
1428 if _sort == "Added":
1429 _query += """ORDER BY "DateAdded" DESC LIMIT %s""" %(str(_limit))
1430 if _method == "Random":
1431 # Get random pictures from database
1432 if MPDB.db_backend.lower() == 'mysql':
1433 _query += """ORDER BY RAND() LIMIT %s""" %(str(_limit))
1434 else:
1435 _query += """ORDER BY RANDOM() LIMIT %s""" %(str(_limit))
1436 # Request database
1437 _results = self.exec_query( _query )
1438 cache.table_name = "MyPicsDB"
1439 # Go through results
1440 for _picture in _results:
1441 _count += 1
1442 # Clean and set properties
1443 _path = join( _picture[1], _picture[2])
1444 WINDOW.clearProperty( "MyPicsDB%s.%d.Folder" % ( _method, _count ) )
1445 WINDOW.setProperty( "MyPicsDB%s.%d.Folder" % ( _method, _count ), _picture[0] )
1446 WINDOW.clearProperty( "MyPicsDB%s.%d.Path" % ( _method, _count ) )
1447 WINDOW.setProperty( "MyPicsDB%s.%d.Path" % ( _method, _count ), _path )
1448 WINDOW.clearProperty( "MyPicsDB%s.%d.Name" % ( _method, _count ) )
1449 WINDOW.setProperty( "MyPicsDB%s.%d.Name" % ( _method, _count ), _picture[2] )
1450 WINDOW.clearProperty( "MyPicsDB%s.%d.Date" % ( _method, _count ) )
1451 WINDOW.setProperty( "MyPicsDB%s.%d.Date" % ( _method, _count ), _picture[3] )
1452 WINDOW.clearProperty( "MyPicsDB%s.%d.Comment" % ( _method, _count ) )
1453 WINDOW.setProperty( "MyPicsDB%s.%d.Comment" % ( _method, _count ), _picture[4] )
1454 # Store path into CommonCache
1455 cache.set("MyPicsDB%s.%d" %( _method, _count ), ( _path ))
1456 # Store number of pictures fetched into CommonCache
1457 cache.set("MyPicsDB%s.Nb" %(_method), str(_count) )
1458 # Result contain less than _limit pictures, clean extra properties
1459 if _count < _limit:
1460 for _i in range (_count+1, _limit+1):
1461 WINDOW.clearProperty( "MyPicsDB%s.%d.Folder" % ( _method, _i ) )
1462 WINDOW.clearProperty( "MyPicsDB%s.%d.Path" % ( _method, _i ) )
1463 cache.set("MyPicsDB%s.%d" %( _method, _i ), "")
1464 WINDOW.clearProperty( "MyPicsDB%s.%d.Name" % ( _method, _i ) )
1465 WINDOW.clearProperty( "MyPicsDB%s.%d.Date" % ( _method, _i ) )
1466 WINDOW.clearProperty( "MyPicsDB%s.%d.Comment" % ( _method, _i ) )
1467 # Display execution time
1468 t = ( time.time() - START_TIME )
1469 if t >= 60: return "%.3fm" % ( t / 60.0 )
1470 common.log("set_properties", "Function set_properties took %.3f s" % ( t ))
1471
1472
1473 # MikeBZH44 : Method to get pictures from CommonCache and start slideshow
1474 def set_slideshow(self):
1475 # Init variables
1476 _current = m.args.current
1477 _method = m.args.method
1478 START_TIME = time.time()
1479 # Clear current photo playlist
1480 _json_query = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "Playlist.Clear", "params": {"playlistid": 2}, "id": 1}')
1481 _json_query = unicode(_json_query, 'utf-8', errors='ignore')
1482 _json_pl_response = simplejson.loads(_json_query)
1483 # Get number of picture to display from CommonCache
1484 cache.table_name = "MyPicsDB"
1485 _limit = int(cache.get("MyPicsDB%s.Nb" %(_method)))
1486 # Add pictures to slideshow, start from _current position
1487 for _i in range( _current, _limit + 1 ):
1488 # Get path from CommonCache for current picture
1489 _path = cache.get("MyPicsDB%s.%d" %( _method, _i ))
1490 # Add current picture to slideshow
1491 _json_query = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "Playlist.Add", "params": {"playlistid": 2, "item": {"file" : "%s"}}, "id": 1}' %(str(_path.encode('utf8')).replace("\\","\\\\")))
1492 _json_query = unicode(_json_query, 'utf-8', errors='ignore')
1493 _json_pl_response = simplejson.loads(_json_query)
1494 # If _current not equal 1 then add pictures from 1 to _current - 1
1495 if _current != 1:
1496 for _i in range( 1, _current ):
1497 # Get path from CommonCache for current picture
1498 _path = cache.get("MyPicsDB%s.%d" %( _method, _i ))
1499 # Add current picture to slideshow
1500 _json_query = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "Playlist.Add", "params": {"playlistid": 2, "item": {"file" : "%s"}}, "id": 1}' %(str(_path.encode('utf8')).replace("\\","\\\\")))
1501 _json_query = unicode(_json_query, 'utf-8', errors='ignore')
1502 _json_pl_response = simplejson.loads(_json_query)
1503 # Start Slideshow
1504 _json_query = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "Player.Open", "params": {"item": {"playlistid": 2}}, "id": 1}' )
1505 _json_query = unicode(_json_query, 'utf-8', errors='ignore')
1506 _json_pl_response = simplejson.loads(_json_query)
1507 t = ( time.time() - START_TIME )
1508 # Display execution time
1509 if t >= 60: return "%.3fm" % ( t / 60.0 )
1510 common.log("set_slideshow", "Function set_slideshow took %.3f s" % ( t ))
1511
1512
1513 def show_pics(self):
1514
1515 if int(common.getaddon_setting("ratingmini"))>0:
1516 min_rating = int(common.getaddon_setting("ratingmini"))
1517 else:
1518 min_rating = 0
1519
1520 if not self.args.page: #0 ou "" ou None : pas de pagination ; on affiche toutes les photos de la requête sans limite
1521 limit = -1 # SQL 'LIMIT' statement equals to -1 returns all resulting rows
1522 offset = -1 # SQL 'OFFSET' statement equals to -1 : return resulting rows with no offset
1523 page = 0
1524 else: #do pagination stuff
1525 limit = int(common.getaddon_setting("picsperpage"))
1526 offset = (int(self.args.page)-1)*limit
1527 page = int(self.args.page)
1528
1529 if self.args.method == "folder":#NON UTILISE : l'affichage par dossiers affiche de lui même les photos
1530 pass
1531
1532 elif self.args.method =="wizard_settings":
1533 filelist = MPDB.filterwizard_get_pics_from_filter(self.args.filtername, min_rating)
1534
1535 # we are showing pictures for a RANDOM selection
1536 elif self.args.method == "random":
1537
1538 limit = common.getaddon_setting("randompicsnumber")
1539 if limit < 10:
1540 limit = 10
1541
1542 try:
1543 count = [row for row in MPDB.cur.request( """SELECT count(*) FROM Files WHERE COALESCE(case ImageRating when '' then '0' else ImageRating end,'0') >= ?""", (min_rating,))][0][0]
1544 except:
1545 count = 0
1546
1547 modulo = float(count)/float(limit)
1548
1549 if MPDB.db_backend.lower() == 'mysql':
1550 filelist = [row for row in MPDB.cur.request( """SELECT strPath, strFilename FROM Files WHERE COALESCE(case ImageRating when '' then '0' else ImageRating end,'0') >= ? ORDER BY RAND() LIMIT %s OFFSET %s"""%(limit, offset),(min_rating,) )]
1551 else:
1552 if count < limit:
1553 select = """SELECT strPath, strFilename FROM Files WHERE COALESCE(case ImageRating when '' then '0' else ImageRating end,'0') >= '%s' ORDER BY RANDOM() LIMIT %s OFFSET %s"""%(min_rating, limit, offset)
1554 else:
1555 select = """SELECT strPath, strFilename FROM Files WHERE COALESCE(case ImageRating when '' then '0' else ImageRating end,'0') >= '%s' AND RANDOM() %% %s ORDER BY RANDOM() LIMIT %s OFFSET %s"""%(min_rating, modulo, limit, offset)
1556 filelist = [row for row in MPDB.cur.request(select )]
1557
1558 # we are showing pictures for a DATE selection
1559 elif self.args.method == "date":
1560 # lister les images pour une date donnée
1561 formatstring = {"wo":"","year":"%Y","month":"%Y-%m","date":"%Y-%m-%d","":"%Y","period":"%Y-%m-%d"}[self.args.period]
1562 if self.args.period =="wo":
1563 filelist = MPDB.get_all_files_wo_date(min_rating)
1564
1565 elif self.args.period=="year" or self.args.period=="":
1566 if self.args.value:
1567 filelist = MPDB.pics_for_period('year', self.args.value, min_rating)
1568 else:
1569 filelist = MPDB.search_all_dates(min_rating)
1570
1571 elif self.args.period in ["month","date"]:
1572 filelist = MPDB.pics_for_period(self.args.period, self.args.value, min_rating)
1573
1574 elif self.args.period=="period":
1575 filelist = MPDB.search_between_dates(DateStart=(self.args.datestart,formatstring), DateEnd=(self.args.dateend,formatstring), MinRating=min_rating)
1576 else:#period not recognized, show whole pics : TODO check if useful and if it can not be optimized for something better
1577 listyears=MPDB.get_years()
1578 amini=min(listyears)
1579 amaxi=max(listyears)
1580 if amini and amaxi:
1581 filelist = MPDB.search_between_dates( ("%s"%(amini),formatstring) , ( "%s"%(amaxi),formatstring), MinRating=min_rating )
1582 else:
1583 filelist = []
1584
1585 # we are showing pictures for a TAG selection
1586 elif self.args.method == "wizard":
1587 filelist = MPDB.filterwizard_result(self.args.kw.decode("utf8"), self.args.nkw.decode("utf8"), self.args.matchall, self.args.start, self.args.end, min_rating)
1588
1589 # we are showing pictures for a TAG selection
1590 elif self.args.method == "tag":
1591 if not self.args.tag:#p_category
1592 filelist = MPDB.search_tag(None)
1593 else:
1594 filelist = MPDB.search_tag(self.args.tag.decode("utf8"), self.args.tagtype.decode("utf8"))
1595
1596
1597 # we are showing pictures for a FOLDER selection
1598 elif self.args.method == "folders":
1599 # lister les images du dossier self.args.folderid et ses sous-dossiers
1600 # BUG CONNU : cette requête ne récupère que les photos du dossier choisi, pas les photos 'filles' des sous dossiers
1601 # il faut la modifier pour récupérer les photos filles des sous dossiers
1602 listid = MPDB.all_children_of_folder(self.args.folderid)
1603 filelist = [row for row in MPDB.cur.request( """SELECT p.FullPath,f.strFilename FROM Files f, Folders p WHERE COALESCE(case ImageRating when '' then '0' else ImageRating end,'0') >= ? AND f.idFolder=p.idFolder AND p.ParentFolder in ('%s') ORDER BY ImageDateTime ASC LIMIT %s OFFSET %s"""%("','".join([str(i) for i in listid]),
1604 limit,
1605 offset),(min_rating,))]
1606
1607 elif self.args.method == "collection":
1608 if int(common.getaddon_setting("ratingmini"))>0:
1609 min_rating = int(common.getaddon_setting("ratingmini"))
1610 else:
1611 min_rating = 0
1612 filelist = MPDB.collection_get_pics(self.args.collect, min_rating)
1613
1614 elif self.args.method == "search":
1615 if int(common.getaddon_setting("ratingmini"))>0:
1616 min_rating = int(common.getaddon_setting("ratingmini"))
1617 else:
1618 min_rating = 0
1619 filelist = MPDB.search_in_files(self.args.field,self.args.searchterm, min_rating, count=False)
1620
1621 elif self.args.method == "lastmonth":
1622 #show pics taken within last month
1623 if MPDB.con.get_backend() == "mysql":
1624 filelist = [row for row in MPDB.cur.request( """SELECT strPath,strFilename FROM Files WHERE COALESCE(case ImageRating when '' then '0' else ImageRating end,'0') >= ? AND datetime(ImageDateTime) BETWEEN SysDate() - INTERVAL 1 MONTH AND SysDate() ORDER BY ImageDateTime ASC LIMIT %s OFFSET %s"""%(limit,offset),(min_rating,))]
1625 else:
1626 filelist = [row for row in MPDB.cur.request( """SELECT strPath,strFilename FROM Files WHERE COALESCE(case ImageRating when '' then '0' else ImageRating end,'0') >= ? AND datetime(ImageDateTime) BETWEEN datetime('now','-1 months') AND datetime('now') ORDER BY ImageDateTime ASC LIMIT %s OFFSET %s"""%(limit,offset),(min_rating,))]
1627
1628 elif self.args.method == "recentpicsdb":#pictures added to database within x last days __OK
1629 numberofdays = common.getaddon_setting("recentnbdays")
1630 if MPDB.con.get_backend() == "mysql":
1631 filelist = [row for row in MPDB.cur.request( """SELECT strPath,strFilename FROM Files WHERE COALESCE(case ImageRating when '' then '0' else ImageRating end,'0') >= ? AND DateAdded>=SysDate() - INTERVAL %s DAY ORDER BY DateAdded ASC LIMIT %s OFFSET %s"""%(numberofdays,limit,offset),(min_rating,))]
1632 else:
1633 filelist = [row for row in MPDB.cur.request( """SELECT strPath,strFilename FROM Files WHERE COALESCE(case ImageRating when '' then '0' else ImageRating end,'0') >= ? AND DateAdded >= datetime('now','start of day','-%s days') ORDER BY DateAdded ASC LIMIT %s OFFSET %s"""%(numberofdays,limit,offset),(min_rating,))]
1634
1635 elif self.args.method =="lastpicsshooted":#X last pictures shooted __OK
1636 select = """SELECT strPath,strFilename FROM Files WHERE COALESCE(case ImageRating when '' then '0' else ImageRating end,'0') >= '%s' AND ImageDateTime IS NOT NULL ORDER BY ImageDateTime DESC LIMIT %s"""%(min_rating, common.getaddon_setting('lastpicsnumber'))
1637 filelist = [row for row in MPDB.cur.request( select )]
1638
1639 elif self.args.method =="videos":#show all videos __OK
1640 filelist = [row for row in MPDB.cur.request( """SELECT strPath,strFilename FROM Files WHERE ftype="video" ORDER BY ImageDateTime DESC LIMIT %s OFFSET %s"""%(limit,offset) )]
1641
1642 #on teste l'argumen 'viewmode'
1643 #si viewmode = view : on liste les images
1644 #si viewmode = scan : on liste les photos qu'on retourne
1645 #si viewmode = zip : on liste les photos qu'on zip
1646 #si viewmode = slideshow: on liste les photos qu'on ajoute au diaporama
1647 if self.args.viewmode=="scan":
1648 return filelist
1649 if self.args.viewmode=="slideshow":
1650
1651 playlist_ondisk = MPDB.collection_get_playlist(self.args.collect)
1652
1653 if playlist_ondisk is not None and len(playlist_ondisk) > 0:
1654
1655 playlist = xbmc.PlayList( xbmc.PLAYLIST_MUSIC )
1656 playlist.clear()
1657 playlist.add(playlist_ondisk)
1658
1659 xbmc.Player().play( playlist)
1660 xbmc.executebuiltin("PlayerControl(RepeatAll)")
1661 command = "SlideShow(%s?action=%%27showpics%%27&method=%%27collection%%27&viewmode=%%27view%%27&page=%%27%%27&collect=%%27%s%%27&name=%%27%s%%27, notrandom) "%(sys.argv[0], self.args.collect, self.args.collect)
1662 common.log('', command, xbmc.LOGNOTICE)
1663 xbmc.executebuiltin( command )
1664 return
1665
1666 if self.args.viewmode=="zip":
1667 from tarfile import open as taropen
1668 #TODO : enable user to select the destination
1669 destination = join(DATA_PATH,self.args.name.decode("utf8")+".tar.gz")
1670 destination = common.smart_unicode(xbmc.translatePath(destination))
1671
1672 if isfile(destination):
1673 dialog = xbmcgui.Dialog()
1674 ok = dialog.yesno(common.getstring(30000).encode('utf-8'),common.getstring(30064).encode('utf-8')%basename(destination),dirname(destination), common.getstring(30065).encode('utf-8'))#Archive already exists, overwrite ?
1675 if not ok:
1676 #todo, ask for another name and if cancel, cancel the zip process as well
1677 common.show_notification(common.getstring(30000),common.getstring(30066),3000,join(home,"icon.png"))
1678 #xbmc.executebuiltin( "Notification(%s,%s,%s,%s)"%(common.getstring(30000).encode('utf-8'),common.getstring(30066).encode('utf-8'),3000,join(home,"icon.png").encode('utf-8')) )
1679 return
1680 else:
1681 pass #user is ok to overwrite, let's go on
1682
1683 tar = taropen(destination.encode(sys.getfilesystemencoding()),mode="w:gz")#open a tar file using gz compression
1684 error = 0
1685 pDialog = xbmcgui.DialogProgress()
1686 pDialog.create(common.getstring(30000), common.getstring(30063),'')
1687 compte=0
1688 msg=""
1689 for (path,filename) in filelist:
1690 path = common.smart_unicode(path)
1691 filename = common.smart_unicode(filename)
1692 compte=compte+1
1693 picture = common.smart_unicode(join(path,filename))
1694 arcroot = common.smart_unicode(path.replace( dirname( picture ), "" ))
1695 arcname = common.smart_unicode(join( arcroot, filename ).replace( "\\", "/" ))
1696 if common.smart_unicode(picture) == common.smart_unicode(destination): # sert à rien de zipper le zip lui même :D
1697 continue
1698 pDialog.update(int(100*(compte/float(len(filelist)))),common.getstring(30067),picture)#adding picture to the archive
1699 try:
1700 # Dirty hack for windows. 7Zip uses codepage cp850
1701 if RunningOS == 'win32':
1702 enc='cp850'
1703 else:
1704 enc='utf-8'
1705 tar.add( common.smart_unicode(picture).encode(sys_encoding) , common.smart_unicode(arcname).encode(enc) )
1706 except:
1707 common.log("show_pics >> zip", "tar.gz compression error :", xbmc.LOGERROR)
1708 error += 1
1709 common.log("show_pics >> zip", "Error %s" % common.smart_unicode(arcname).encode(sys_encoding), xbmc.LOGERROR)
1710 print_exc()
1711 if pDialog.iscanceled():
1712 msg = common.getstring(30068) #Zip file has been canceled !
1713 break
1714 tar.close()
1715 if not msg:
1716 if error: msg = common.getstring(30069)%(error,len(filelist)) #"%s Errors while zipping %s files"
1717 else: msg = common.getstring(30070)%len(filelist) #%s files successfully Zipped !!
1718 common.show_notification(common.getstring(30000),msg,3000,join(home,"icon.png"))
1719 return
1720
1721
1722 if self.args.viewmode=="export":
1723 #1- ask for destination
1724 dialog = xbmcgui.Dialog()
1725 dstpath = dialog.browse(3, common.getstring(30180),"files" ,"", True, False, "")#Choose the destination for exported pictures
1726 dstpath = common.smart_unicode(dstpath)
1727
1728 if dstpath == "":
1729 return
1730
1731 ok = dialog.yesno(common.getstring(30000),common.getstring(30181),"(%s)"%self.args.name)#do you want to create a folder for exported pictures ?
1732 if ok:
1733 dirok=False
1734 while not dirok:
1735 kb = xbmc.Keyboard(self.args.name, common.getstring(30182).encode('utf-8'), False)#Input subfolder name
1736 kb.doModal()
1737
1738 if (kb.isConfirmed()):
1739 subfolder = common.smart_unicode(kb.getText())
1740 try:
1741 os.mkdir(join(dstpath,subfolder))
1742 dstpath = join(dstpath,subfolder)
1743 dirok = True
1744 except Exception,msg:
1745 print_exc()
1746 dialog.ok(common.getstring(30000),"Error#%s : %s"%msg.args)
1747 else:
1748 common.show_notification(common.getstring(30000),common.getstring(30183),3000,join(home,"icon.png"))
1749 return
1750
1751 from shutil import copy
1752 pDialog = xbmcgui.DialogProgress()
1753 pDialog.create(common.getstring(30000),common.getstring(30184))# 'Copying files...')
1754 i=0.0
1755 cpt=0
1756 for path,filename in filelist:
1757
1758 path = common.smart_unicode(path)
1759 filename = common.smart_unicode(filename)
1760
1761 pDialog.update(int(100*i/len(filelist)),common.getstring(30185)%join(path,filename),dstpath)#"Copying '%s' to :"
1762 i=i+1.0
1763 if isfile(join(dstpath,filename)):
1764 ok = dialog.yesno(common.getstring(30000),common.getstring(30186)%filename,dstpath,common.getstring(30187))#File %s already exists in... overwrite ?
1765 if not ok:
1766 continue
1767 copy(join(path,filename), dstpath)
1768 cpt = cpt+1
1769 pDialog.update(100,common.getstring(30188),dstpath)#"Copying Finished !
1770 xbmc.sleep(1000)
1771 common.show_notification(common.getstring(30000),common.getstring(30189)%(cpt,dstpath),3000,join(home,"icon.png"))
1772 dialog.browse(2, common.getstring(30188).encode('utf-8'),"files" ,"", True, False, dstpath.encode('utf-8'))#show the folder which contain pictures exported
1773 return
1774
1775 if len(filelist)>=limit:
1776 if int(page)>1:
1777 common.log("show_pics >> pagination", "TODO : display previous page item")
1778 if (page*limit)<(len(filelist)):
1779 common.log("show_pics >> pagination", "TODO : display next page item")
1780
1781
1782 # fill the pictures list
1783 count = 0
1784 for path,filename in filelist:
1785 path = common.smart_unicode(path)
1786 filename = common.smart_unicode(filename)
1787 context=[]
1788 count += 1
1789 # - add to collection
1790 context.append( ( common.getstring(30152),"XBMC.RunPlugin(\"%s?action='addtocollection'&viewmode='view'&path='%s'&filename='%s'\")"%(sys.argv[0],
1791 common.quote_param(path.encode('utf-8')),
1792 common.quote_param(filename.encode('utf-8')))
1793 )
1794 )
1795 # - del pic from collection :
1796 if self.args.method=="collection":
1797 context.append( ( common.getstring(30151),"XBMC.RunPlugin(\"%s?action='delfromcollection'&viewmode='view'&collect='%s'&path='%s'&filename='%s'\")"%(sys.argv[0],
1798 common.quote_param(self.args.collect),
1799 common.quote_param(path.encode('utf-8')),
1800 common.quote_param(filename.encode('utf-8')))
1801 )
1802 )
1803
1804 #3 -
1805 context.append( (common.getstring(30060),"XBMC.RunPlugin(\"%s?action='locate'&filepath='%s'&viewmode='view'\" ,)"%(sys.argv[0],common.quote_param(join(path,filename).encode('utf-8')) ) ) )
1806
1807 #5 - infos
1808 #context.append( ( "paramètres de l'addon","XBMC.ActivateWindow(virtualkeyboard)" ) )
1809 self.add_picture(filename,
1810 path,
1811 count = count,
1812 contextmenu = context,
1813 fanart = xbmcplugin.getSetting(int(sys.argv[1]),'usepicasfanart')=='true' and join(path,filename)
1814 )
1815 xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_DATE )
1816 xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_PROGRAM_COUNT )
1817 xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_LABEL )
1818
1819 self.change_view()
1820
1821 xbmcplugin.endOfDirectory(int(sys.argv[1]))
1822
1823
1824GlobalFilterTrue = []
1825GlobalFilterFalse = []
1826GlobalMatchAll = 0
1827g_start_date = ''
1828g_end_date = ''
1829Handle = 0
1830def filterwizard_delegate(ArrayTrue, ArrayFalse, MatchAll = 0, start_date = '', end_date = ''):
1831 global GlobalFilterTrue, GlobalFilterFalse, GlobalMatchAll, Handle, g_start_date, g_end_date
1832 GlobalFilterTrue = ArrayTrue
1833 GlobalFilterFalse = ArrayFalse
1834 GlobalMatchAll = MatchAll
1835 g_start_date = start_date
1836 g_end_date = end_date
1837 Handle = int(sys.argv[ 1 ] )
1838
1839
1840
1841if __name__=="__main__":
1842
1843 m=Main()
1844 MPDB = MypicsDB.MyPictureDB()
1845
1846 if not sys.argv[ 2 ] or len(sys.argv[ 2 ]) == 0:
1847
1848 if common.getaddon_setting("initDB") == "true":
1849 MPDB.make_new_base(True)
1850 common.setaddon_setting("initDB","false")
1851 else:
1852 MPDB.version_table()
1853
1854 if common.getaddon_setting('bootscan')=='true':
1855 if not(xbmc.getInfoLabel( "Window.Property(DialogAddonScan.IsAlive)" ) == "true"):
1856 common.run_script("%s,--database"%join( home, "scanpath.py") )
1857 xbmc.executebuiltin( "Container.Update(\"%s?action='showhome'&viewmode='view'\" ,)"%(sys.argv[0]) , )
1858 else:
1859 m.show_home()
1860
1861
1862 elif m.args.action=='showhome':
1863 m.show_home()
1864
1865 elif m.args.action=='showdate':
1866 m.show_date()
1867
1868 elif m.args.action=='showfolder':
1869 m.show_folders()
1870
1871 elif m.args.action=='showkeywords':
1872 m.show_keywords()
1873
1874 elif m.args.action=="showtranslationeditor":
1875 m.show_translationeditor()
1876
1877 elif m.args.action=="help":
1878 m.show_help()
1879
1880 elif m.args.action=='showwizard':
1881 m.show_wizard()
1882
1883 elif m.args.action=='showtagtypes':
1884 m.show_tagtypes()
1885
1886 elif m.args.action=='showtags':
1887 m.show_tags()
1888
1889 elif m.args.action=='showpics':
1890 m.show_pics()
1891
1892 elif m.args.action=='showperiod':
1893 m.show_period()
1894
1895 elif m.args.action=='removeperiod':
1896 m.remove_period()
1897
1898 elif m.args.action=='renameperiod':
1899 m.period_rename()
1900
1901 elif m.args.action=='showcollection':
1902 m.show_collection()
1903
1904 elif m.args.action=='addtocollection':
1905 m.collection_add_pic()
1906
1907 elif m.args.action=='removecollection':
1908 m.collection_delete()
1909
1910 elif m.args.action=='delfromcollection':
1911 m.collection_del_pic()
1912
1913 elif m.args.action=='renamecollection':
1914 m.collection_rename()
1915
1916 elif m.args.action=='globalsearch':
1917 m.global_search()
1918
1919 elif m.args.action=='collectionaddplaylist':
1920 m.collection_add_playlist()
1921
1922 elif m.args.action=='addfolder':
1923 m.collection_add_folder()
1924
1925 elif m.args.action=='rootfolders':
1926 m.show_roots()
1927
1928 elif m.args.action=='showsettings':
1929 m.show_settings()
1930
1931 elif m.args.action=='locate':
1932 dialog = xbmcgui.Dialog()
1933 dstpath = dialog.browse(2, common.getstring(30071),"files" ,"", True, False, m.args.filepath)
1934
1935 elif m.args.action=='geolocate':
1936 m.show_map()
1937
1938 elif m.args.action=='diapo':
1939 pass
1940 #m.show_diaporama()
1941
1942 elif m.args.action=='alea':
1943 #TODO : afficher une liste aléatoire de photos
1944 pass
1945 elif m.args.action=='lastshot':
1946 m.show_lastshots()
1947
1948 elif m.args.action=='request':
1949 pass
1950
1951 # MikeBZH44 : Method to query database and store result in Windows properties and CommonCache table
1952 elif m.args.action=='setproperties':
1953 m.set_properties()
1954
1955 # MikeBZH44 : Method to get pictures from CommonCache and start slideshow
1956 elif m.args.action=='slideshow':
1957 m.set_slideshow()
1958
1959 else:
1960 m.show_home()
1961
1962 MPDB.cur.close()
1963 MPDB.con.disconnect()
1964 del MPDB