Advertisement
Guest User

Untitled

a guest
Sep 6th, 2016
353
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 102.92 KB | None | 0 0
  1. #!/usr/bin/python
  2. # -*- coding: utf8 -*-
  3.  
  4.  
  5. __addonname__ = 'plugin.image.mypicsdb'
  6.  
  7. # common depends on __addonname__
  8. import resources.lib.common as common
  9.  
  10. import os, sys, time, re
  11. from os.path import join,isfile,basename,dirname,splitext
  12. from urllib import unquote_plus
  13.  
  14. from time import strftime,strptime
  15. from traceback import print_exc
  16.  
  17. import xbmc, xbmcplugin, xbmcgui, xbmcaddon
  18.  
  19.  
  20. # MikeBZH44
  21. try:
  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 ) )
  26. except Exception, e:
  27. print "[MyPicsDB] %s" % str( e )
  28. import simplejson
  29.  
  30. # MikeBZH44: commoncache for MyPicsDB with 1 hour timeout
  31. try:
  32. import StorageServer
  33. except:
  34. import resources.lib.storageserverdummy as StorageServer
  35.  
  36. # set variables used by other modules
  37.  
  38. sys_encoding = sys.getfilesystemencoding()
  39.  
  40. if sys.modules.has_key("MypicsDB"):
  41. del sys.modules["MypicsDB"]
  42. import resources.lib.MypicsDB as MypicsDB
  43. import resources.lib.filterwizard as filterwizard
  44. import resources.lib.googlemaps as googlemaps
  45. import resources.lib.translationeditor as translationeditor
  46. import resources.lib.viewer as viewer
  47.  
  48. # these few lines are taken from AppleMovieTrailers script
  49. # Shared resources
  50. home = common.getaddon_path()
  51. BASE_RESOURCE_PATH = join( home, "resources" )
  52. DATA_PATH = common.getaddon_info('profile')
  53. PIC_PATH = join( BASE_RESOURCE_PATH, "images")
  54.  
  55.  
  56. #catching the OS :
  57. # win32 -> win
  58. # darwin -> mac
  59. # linux -> linux
  60. RunningOS = sys.platform
  61.  
  62. cache = StorageServer.StorageServer("MyPicsDB",1)
  63.  
  64. files_fields_description={"strFilename":common.getstring(30300),
  65. "strPath":common.getstring(30301),
  66. "Thumb":common.getstring(30302)
  67. }
  68.  
  69.  
  70. class _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.  
  78. global MPDB
  79.  
  80. class 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.  
  1824. GlobalFilterTrue = []
  1825. GlobalFilterFalse = []
  1826. GlobalMatchAll = 0
  1827. g_start_date = ''
  1828. g_end_date = ''
  1829. Handle = 0
  1830. def 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.  
  1841. if __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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement