def exportData(selectbl): # CSV Output selected table try: #xbmc.log("Mezzmo selectable is: " + str(selectbl), xbmc.LOGNOTICE) folderpath = xbmc.translatePath(os.path.join("special://home/", "output/")) if not xbmcvfs.exists(folderpath): xbmcvfs.mkdir(folderpath) xbmc.log("Mezzmo Export Output folder not found: " + str(folderpath), xbmc.LOGNOTICE) for a in range(len(selectbl)): fpart = datetime.now().strftime('%H%M%S') selectindex = int(selectbl[a][:2]) # Get list index to determine DB selectname = selectbl[a][2:] # Parse table name in DB outfile = folderpath + "mezzmo_" + selectname + "_" + fpart + ".csv" #xbmc.log("Mezzmo selectable is: " + str(selectindex) + ' ' + selectname, xbmc.LOGNOTICE) if selectindex < 8: dbexport = openKodiDB() else: dbexport = openNosyncDB() curm = dbexport.execute('SELECT * FROM '+selectname+'') recs = curm.fetchall() headers = [i[0] for i in curm.description] csvFile = csv.writer(open(outfile, 'wb'), delimiter=',', lineterminator='\n', quoting=csv.QUOTE_ALL, escapechar='\\') csvFile.writerow(headers) # Add the headers and data to the CSV file. for row in recs: recsencode = [] # xbmc.log("Mezzmo output string length is: " + str(len(row)), xbmc.LOGNOTICE) for item in range(len(row)): if isinstance(row[item], int) or isinstance(row[item], float): # Convert to strings recitem = str(row[item]) recitem = recitem.encode('utf-8') elif row[item] != None: recitem = row[item].encode('utf-8') else: recitem = row[item] recsencode.append(recitem) csvFile.writerow(recsencode) dbexport.close() outmsg = folderpath dialog_text = translate(30428) + outmsg xbmcgui.Dialog().ok(translate(30429), dialog_text) except Exception as e: printexception() dbexport.close() mgenlog = translate(30430) + selectname xbmcgui.Dialog().notification(translate(30431), mgenlog, addon_icon, 5000) xbmc.log(mgenlog, xbmc.LOGNOTICE) mgenlogUpdate(mgenlog)
def showPictureMenu(piclist, slidetime): # Picture viewer and menu pselect = 0 select = 0 while pselect >= 0: try: pictures = [] a = 0 while a < len(piclist): pictures.append( piclist[a]['title']) # Convert rows to list for dialog box a += 1 ddialog = xbmcgui.Dialog() pselect = ddialog.select(translate(30416), pictures) if pselect < 0: # User cancel if select > 0: xbmc.executebuiltin('Action(ParentDir)') break else: # Show picture selection = picURL(piclist[pselect]['url']) json_query = xbmc.executeJSONRPC( '{"jsonrpc":"2.0", "method":"Player.Open", \ "params":{"item":{"file":%s }},"id":1}' % (selection)) xbmc.sleep(slidetime * 1000) select = +1 except Exception as e: printexception() mgenlog = 'Mezzmo error displaying picture.' xbmc.log(mgenlog, xbmc.LOGNOTICE) mgenlogUpdate(mgenlog)
def checkSync(): # Check for Sync server svrfile = openNosyncDB() # Open server database curps = svrfile.execute('SELECT controlUrl FROM mServers WHERE mSync=?', ('Yes', )) srvrtuple = curps.fetchone() # Get server from database if srvrtuple: syncurl = srvrtuple[0] else: contenturl = settings('contenturl') # Check for content URL curpc = svrfile.execute('SELECT srvName, sIcon FROM mServers WHERE controlUrl=?', \ (contenturl,)) srvrtuple = curpc.fetchone() # Get server from database if srvrtuple: # Auto update if Mezzmo found syncurl = contenturl sname = srvrtuple[0] if updateSync(contenturl) == 0: # Update sync server flag iconimage = srvrtuple[1] msynclog = 'Mezzmo sync server updated automatically: ' + str( sname) xbmc.log(msynclog, xbmc.LOGNOTICE) mezlogUpdate(msynclog) notify = xbmcgui.Dialog().notification(translate(30401), msynclog, addon_icon, 5000) else: # Sync srver not set yet syncurl = 'None' svrfile.close() return syncurl
def displayServers(): svrfile = openNosyncDB() # Open server database while True: servers = ["Refresh"] curps = svrfile.execute( 'SELECT srvName, mSync, sManuf, controlUrl FROM mServers \ WHERE sManuf LIKE ?', ('Conceiva%', )) srvresults = curps.fetchall() # Get servers from database for a in range(len(srvresults)): if srvresults[a][1] == 'Yes': # Is sync server ? syncserver = srvresults[a][ 0] + ' - [COLOR blue]Sync Server[/COLOR]' servers.append(syncserver) elif srvresults[a][1] == 'No': servers.append( srvresults[a][0]) # Convert rows to list for dialog box ddialog = xbmcgui.Dialog() ssync = ddialog.select(translate(30392), servers) if ssync < 0: # User cancel svrfile.close() break elif ssync == 0: # Refresh uPNP server list clearServers() mscount = getServers() if mscount == 0: msynclog = translate(30399) xbmcgui.Dialog().ok(translate(30398), msynclog) xbmc.log(msynclog, xbmc.LOGNOTICE) mezlogUpdate(msynclog) else: msynclog = 'Mezzmo refresh sync servers found: ' + str(mscount) xbmc.log(msynclog, xbmc.LOGNOTICE) mezlogUpdate(msynclog) elif ssync > 0: if updateSync(srvresults[ssync - 1] [3]) == 0: # Update sync server from selection msynclog ='Mezzmo sync server updated manually: ' + \ str(srvresults[ssync - 1][0]) xbmc.log(msynclog, xbmc.LOGNOTICE) mezlogUpdate(msynclog) svrfile.close() return
def showSingle(url): # Display individual native picture try: if 'upnp' in str(url[0]): # Kodi cannot display pictures over uPNP dialog_text = translate(30413) xbmcgui.Dialog().ok(translate(30406), dialog_text) xbmc.executebuiltin('Action(ParentDir)') return else: itemurl = picURL(url[0]) json_query = xbmc.executeJSONRPC( '{"jsonrpc":"2.0", "method":"Player.Open", \ "params":{"item":{"file":%s }},"id":1}' % (itemurl)) except Exception as e: printexception() mgenlog = 'Mezzmo error displaying single picture.' xbmc.log(mgenlog, xbmc.LOGNOTICE) mgenlogUpdate(mgenlog)
def upnpCheck(): # Check Kodi uPNP setting json_query = xbmc.executeJSONRPC( '{"jsonrpc":"2.0", "method":"Settings.GetSettingValue", \ "params":{"setting":"services.upnp"}, "id":1}') json_query = json.loads(json_query) upnp_enabled = '' if 'result' in json_query and 'value' in json_query['result']: upnp_enabled = json_query['result']['value'] xbmc.log('The uPNP status is: ' + str(upnp_enabled), xbmc.LOGDEBUG) if upnp_enabled == True: return else: dialog_text = translate(30394) cselect = xbmcgui.Dialog().yesno("Mezzmo uPNP Playback", dialog_text) if cselect == 1: # Enable uPNP support in Kodi json_query = xbmc.executeJSONRPC( '{"jsonrpc":"2.0", "method":"Settings.SetSettingValue", \ "params":{"setting":"services.upnp","value":true}, "id":1}') json_query = xbmc.executeJSONRPC( '{"jsonrpc":"2.0", "method":"Settings.GetSettingValue", \ "params":{"setting":"services.upnp"}, "id":1}') json_query = json.loads(json_query) upnp_enabled = '' if 'result' in json_query and 'value' in json_query['result']: upnp_enabled = json_query['result']['value'] if upnp_enabled == True: dialog_text = translate(30397) xbmcgui.Dialog().ok(translate(30396), dialog_text) mgenlog = 'Mezzmo Kodi uPNP Set to Enabled.' xbmc.log(mgenlog, xbmc.LOGNOTICE) mgenlogUpdate(mgenlog) else: dialog_text = translate(30395) xbmcgui.Dialog().ok(translate(30396), dialog_text) mgenlog = 'Mezzmo Kodi uPNP Setting failed.' xbmc.log(mgenlog, xbmc.LOGNOTICE) mgenlogUpdate(mgenlog)
def selectExport(): # Select table to export try: while True: stable = [] selectbl = [] tables = ["Kodi DB - Actors","Kodi DB - Episodes","Kodi DB - Movies","Kodi DB - TV Shows", \ "Kodi DB - Artwork","Kodi DB - Path","Kodi DB - Files","Kodi DB - Streamdetails", \ "Addon DB - uPNP Servers","Addon DB - Duplicates", "Addon DB - Performance Stats", \ "Addon DB - General Logs","Addon DB - Sync Logs","Addon DB - No Sync Videos"] ddialog = xbmcgui.Dialog() stable = ddialog.multiselect(translate(30432), tables) if stable == None: # User cancel break if 0 in stable: selectbl.append('00actor') if 1 in stable: selectbl.append('01episode') if 2 in stable: selectbl.append('02movie') if 3 in stable: selectbl.append('03tvshow') if 4 in stable: selectbl.append('04art') if 5 in stable: selectbl.append('05path') if 6 in stable: selectbl.append('06files') if 7 in stable: selectbl.append('07streamdetails') if 8 in stable: selectbl.append('08mServers') if 9 in stable: selectbl.append('09dupeTrack') if 10 in stable: selectbl.append('10mperfStats') if 11 in stable: selectbl.append('11mgenLog') if 12 in stable: selectbl.append('12msyncLog') if 13 in stable: selectbl.append('13nosyncVideo') exportData(selectbl) except Exception as e: printexception()
def picDisplay(): # Picture slideshow presenter try: piclist = getPictures() # Get pictures from picture DB slidetime = int(settings('slidetime')) # Get slide pause time #xbmc.log('Mezzmo picture list: ' + str(piclist) , xbmc.LOGNOTICE) if 'upnp' in str( piclist[0]['url']): # Kodi cannot display pictures over uPNP dialog_text = translate(30413) xbmcgui.Dialog().ok(translate(30412), dialog_text) xbmc.executebuiltin('Action(ParentDir)') return else: cselect = 3 while cselect >= 0: #pictures = ['Slideshow','Pictures Normal Delay'] pictures = [ translate(30417), translate(30418), translate(30419) ] ddialog = xbmcgui.Dialog() cselect = ddialog.select(translate(30415), pictures) if cselect == 1: # User selects pictures normal showPictureMenu(piclist, slidetime) #xbmc.executebuiltin('Action(ParentDir)') if cselect == 2: # User selects pictures extended showPictureMenu(piclist, (slidetime * 3)) #xbmc.executebuiltin('Action(ParentDir)') elif cselect == 0: # User selects slideshow ShowSlides(piclist, slidetime) elif cselect < 0: #xbmc.executebuiltin('Action(ParentDir)') break #return except Exception as e: printexception() mgenlog = 'Mezzmo error displaying picture slideshow.' xbmc.log(mgenlog, xbmc.LOGNOTICE) mgenlogUpdate(mgenlog)
def getServers(): # Find uPNP servers try: timeoutval = float(settings('ssdp_timeout')) contenturl = '' msgdialogprogress = xbmcgui.DialogProgress() dialogmsg = translate(30402) dialoghead = translate(30401) msgdialogprogress.create(dialoghead, dialogmsg) servers = ssdp.discover("urn:schemas-upnp-org:device:MediaServer:1", timeout=timeoutval) srvcount = len(servers) addtlmsg = ' ' + str(srvcount) + ' uPNP servers discovered.' ddialogmsg = dialogmsg + addtlmsg msgdialogprogress.update(50, ddialogmsg) xbmc.sleep(1000) if srvcount > 0: msynclog = 'Mezzmo sync server search: ' + str( srvcount) + ' uPNP servers found.' xbmc.log(msynclog, xbmc.LOGNOTICE) mezlogUpdate(msynclog) else: msynclog = translate(30403) xbmcgui.Dialog().notification(translate(30401), msynclog, addon_icon, 5000) xbmc.log(msynclog, xbmc.LOGNOTICE) mezlogUpdate(msynclog) return 0 onlyShowMezzmo = False a = 0 mcount = 0 # Count of Mezzmo serves found for server in servers: url = server.location try: response = urllib2.urlopen(url) xmlstring = re.sub(' xmlns="[^"]+"', '', response.read(), count=1) e = xml.etree.ElementTree.fromstring(xmlstring) device = e.find('device') friendlyname = device.find('friendlyName').text manufacturer = device.find('manufacturer').text if manufacturer != None: manufacturer = manufacturer.text else: manufacturer = 'None' modelnumber = device.find('modelNumber') if modelnumber != None: modelnumber = modelnumber.text else: modelnumber = 'None' udn = device.find('UDN') if udn != None: udn = udn.text else: udn = 'None' description = device.find('modelDescription') if description != None: description = description.text else: description = 'None' serviceList = device.find('serviceList') iconList = device.find('iconList') iconurl = '' isMezzmo = False if manufacturer != None and manufacturer == 'Conceiva Pty. Ltd.': iconurl = addon_icon isMezzmo = True mcount += 1 elif iconList != None: bestWidth = 0 for icon in iconList.findall('icon'): mimetype = icon.find('mimetype').text width = icon.find('width').text height = icon.find('height').text width = int(width) if width > bestWidth: bestWidth = width iconurl = icon.find('url').text if iconurl.startswith('/'): end = url.find('/', 8) length = len(url) iconurl = url[:end - length] + iconurl else: end = url.rfind('/') length = len(url) iconurl = url[:end - length] + '/' + iconurl else: iconurl = addon_path + '/resources/media/otherserver.png' if isMezzmo or onlyShowMezzmo == False: contenturl = '' for service in serviceList.findall('service'): serviceId = service.find('serviceId') if serviceId.text == 'urn:upnp-org:serviceId:ContentDirectory': contenturl = service.find('controlURL').text if contenturl.startswith('/'): end = url.find('/', 8) length = len(url) contenturl = url[:end - length] + contenturl elif 'http' not in contenturl: end = url.rfind('/') length = len(url) contenturl = url[:end - length] + '/' + contenturl updateServers(url, friendlyname, contenturl, manufacturer, modelnumber, \ iconurl, description, udn) except urllib2.URLError, urllib2.HTTPError: # Detect Server Issues msynclog = 'Mezzmo uPNP server not responding: ' + url xbmc.log(msynclog, xbmc.LOGNOTICE) mezlogUpdate(msynclog) dialog_text = translate(30405) + url xbmcgui.Dialog().ok(translate(30404), dialog_text) pass a += 1 percent = int(a / float(srvcount) * 50) + 50 dialogmsg = str(a) + ' / ' + str(srvcount) + ' server completed.' msgdialogprogress.update(percent, dialogmsg) xbmc.sleep(500) msgdialogprogress.close() return mcount
def ghandleBrowse(content, contenturl, objectID, parentID): contentType = 'movies' itemsleft = -1 pitemsleft = -1 media.settings('contenturl', contenturl) slideshow = media.settings('slideshow') # Check if slideshow is enabled menuitem1 = addon.getLocalizedString(30347) menuitem2 = addon.getLocalizedString(30346) menuitem3 = addon.getLocalizedString(30372) menuitem4 = addon.getLocalizedString(30373) menuitem5 = addon.getLocalizedString(30379) menuitem6 = addon.getLocalizedString(30380) menuitem7 = addon.getLocalizedString(30384) menuitem8 = addon.getLocalizedString(30412) sync.deleteTexturesCache(contenturl) # Call function to delete textures cache if user enabled. #xbmc.log('Kodi version: ' + installed_version, xbmc.LOGNOTICE) try: while True: e = xml.etree.ElementTree.fromstring(content) body = e.find('.//{http://schemas.xmlsoap.org/soap/envelope/}Body') browseresponse = body.find('.//{urn:schemas-upnp-org:service:ContentDirectory:1}BrowseResponse') result = browseresponse.find('Result') NumberReturned = browseresponse.find('NumberReturned').text TotalMatches = browseresponse.find('TotalMatches').text if int(NumberReturned) == 0: dialog_text = media.translate(30421) + '\n' + xbmc.getInfoLabel("ListItem.Label") xbmcgui.Dialog().ok(media.translate(30424), dialog_text) xbmc.executebuiltin('Action(ParentDir)') break; #sanity check if itemsleft == -1: itemsleft = int(TotalMatches) elems = xml.etree.ElementTree.fromstring(result.text.encode('utf-8')) #elems = xml.etree.ElementTree.fromstring(result.text) picnotify = 0 for container in elems.findall('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}container'): title = container.find('.//{http://purl.org/dc/elements/1.1/}title').text containerid = container.get('id') description_text = '' description = container.find('.//{urn:schemas-upnp-org:metadata-1-0/upnp/}longDescription') if description != None and description.text != None: description_text = description.text icon = container.find('.//{urn:schemas-upnp-org:metadata-1-0/upnp/}albumArtURI') if icon != None: icon = icon.text if (icon[-4:]) != '.jpg': icon = icon + '.jpg' xbmc.log('Handle browse initial icon is: ' + icon, xbmc.LOGDEBUG) itemurl = build_url({'mode': 'server', 'parentID': objectID, 'objectID': containerid, \ 'contentdirectory': contenturl}) li = xbmcgui.ListItem(title) li.setArt({'banner': icon, 'poster': icon, 'icon': icon, 'fanart': addon_fanart}) mediaClass_text = 'video' info = { 'plot': description_text, } li.setInfo(mediaClass_text, info) searchargs = urllib.urlencode({'mode': 'search', 'contentdirectory': contenturl, \ 'objectID': containerid}) li.addContextMenuItems([ (menuitem1, 'Container.Refresh'), (menuitem2, 'Action(ParentDir)') ]) xbmcplugin.addDirectoryItem(handle=addon_handle, url=itemurl, listitem=li, isFolder=True) picnotify += 1 if parentID == '0': contentType = 'top' else: contentType = 'folders' contentType = content_mapping(contentType) piclist = [] clearPictures() upnpnotify = 0 for item in elems.findall('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}item'): title = item.find('.//{http://purl.org/dc/elements/1.1/}title').text itemid = item.get('id') icon = None albumartUri = item.find('.//{urn:schemas-upnp-org:metadata-1-0/upnp/}albumArtURI') if albumartUri != None: icon = albumartUri.text if (icon[-4:]) != '.jpg': icon = icon + '.jpg' xbmc.log('Handle browse second icon is: ' + icon, xbmc.LOGDEBUG) res = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}res') subtitleurl = None duration_text = '' video_width = 0 video_height = 0 aspect = 0.0 validf = 0 protocol_text = '' if res != None: itemurl = res.text #xbmc.log('The current URL is: ' + itemurl, xbmc.LOGNOTICE) subtitleurl = res.get('{http://www.pv.com/pvns/}subtitleFileUri') duration_text = res.get('duration') if duration_text == None: duration_text = '00:00:00.000' elif len(duration_text) < 9: # Check for proper duration Twonky duration_text = duration_text + '.000' elif int(duration_text[len(duration_text)-3:len(duration_text)]) <> 0: duration_text = duration_text[:6] + '.000' #xbmc.log('The duration is: ' + str(duration_text), xbmc.LOGNOTICE) resolution_text = res.get('resolution') if resolution_text != None: mid = resolution_text.find('x') video_width = int(resolution_text[0:mid]) video_height = int(resolution_text[mid + 1:]) aspect = float(float(video_width) / float(video_height)) protocol = res.get('protocolInfo') if protocol != None: protocol_text = protocol #xbmc.log('The protocol is: ' + str(protocol), xbmc.LOGNOTICE) else: duration_text = '00:00:00.000' itemurl = getItemlUrl(contenturl, itemid) if upnpnotify == 0: # Do not repeat notification upnpCheck() # Check Kodi service uPNP setting upnpnotify = 1 if itemurl == 'None': dialog_text = media.translate(30393) xbmcgui.Dialog().ok(media.translate(30406), dialog_text) xbmc.executebuiltin('Action(ParentDir)') break backdropurl = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}cvabackdrop') if backdropurl != None: backdropurl = backdropurl.text if (backdropurl [-4:]) != '.jpg': backdropurl = backdropurl + '.jpg' poster = '' thumb = '' res2 = item.findall('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}res') for protocol in res2: protocolinfo = protocol.attrib["protocolInfo"] if 'poster' in protocolinfo: poster = protocol.text if 'thumb' in protocolinfo: thumb = protocol.text if 'fanart' in protocolinfo and backdropurl == None: backdropurl = protocol.text if 'icon' in protocolinfo and icon == None: icon = protocol.text upnpclass_text = '' upnpclass = item.find('.//{urn:schemas-upnp-org:metadata-1-0/upnp/}class') if upnpclass != None: upnpclass_text = upnpclass.text li = xbmcgui.ListItem(title) if len(thumb) > 0 and len(poster) > 0: li.setArt({'thumb': thumb, 'poster': poster, 'icon': icon, 'fanart': backdropurl}) else: li.setArt({'thumb': icon, 'poster': icon, 'icon': icon, 'fanart': backdropurl}) if subtitleurl != None: li.setSubtitles([subtitleurl]) trailerurl = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}trailer') if trailerurl != None: trailerurl = trailerurl.text genre_text = [] for genre in item.findall('.//{urn:schemas-upnp-org:metadata-1-0/upnp/}genre'): if genre != None: genre_text.append(genre.text.encode('utf-8')) #xbmc.log('Mezzmo genre list is: ' + str(genre_text), xbmc.LOGNOTICE) aired_text = '' aired = item.find('.//{http://purl.org/dc/elements/1.1/}date') if aired != None: aired_text = aired.text album_text = '' album = item.find('.//{urn:schemas-upnp-org:metadata-1-0/upnp/}album') if album != None: album_text = album.text release_year_text = '' release_year = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}release_year') if release_year != None: release_year_text = release_year.text release_date_text = '' release_date = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}release_date') if release_date != None: release_date_text = release_date.text description_text = '' description = item.find('.//{urn:schemas-upnp-org:metadata-1-0/upnp/}longDescription') if description != None and description.text != None: description_text = description.text imageSearchUrl = '' imageSearchUrl = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}imageSearchUrl') if imageSearchUrl != None: imageSearchUrl = imageSearchUrl.text artist_text = '' artist = item.find('.//{urn:schemas-upnp-org:metadata-1-0/upnp/}artist') if artist != None: artist_text = artist.text actor_list = '' cast_dict = [] # Added cast & thumbnail display from Mezzmo server cast_dict_keys = ['name','thumbnail'] actors = item.find('.//{urn:schemas-upnp-org:metadata-1-0/upnp/}artist') if actors != None and imageSearchUrl != None: actor_list = actors.text.encode('utf-8', 'ignore').replace(', Jr.' , ' Jr.').replace(', Sr.' , ' Sr.').split(',') for a in actor_list: actorSearchUrl = imageSearchUrl + "?imagesearch=" + a.lstrip().replace(" ","+") #xbmc.log('search URL: ' + actorSearchUrl, xbmc.LOGNOTICE) # uncomment for thumbnail debugging new_record = [ a.strip() , actorSearchUrl] cast_dict.append(dict(zip(cast_dict_keys, new_record))) elif actors == None: actor_list = [] for actor in item.findall('.//{urn:schemas-upnp-org:metadata-1-0/upnp/}actor'): if actor != None: actor_list.append(actor.text.encode('utf-8')) artist_text = actor_list #xbmc.log('Mezzmo actor list is: ' + str(actor_list), xbmc.LOGNOTICE) #if len(actor_list) == 0: # Sanity check for missing artists # artist_text = ["Unknown artist"] if isinstance(artist_text, str): # Sanity check for missing artists artist_text = ["Unknown artist"] creator_text = '' creator = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}creator') if creator != None: creator_text = creator.text elif creator == None: creator = item.find('.//{http://purl.org/dc/elements/1.1/}creator') if creator != None: creator_text = creator.text director_text = '' director = item.find('.//{urn:schemas-upnp-org:metadata-1-0/upnp/}director') if director != None: creator_text = director.text date_added_text = '' date_added = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}date_added') if date_added != None: date_added_text = date_added.text else: # Kodi uPNP date_added = item.find('.//{urn:schemas-xbmc-org:metadata-1-0/}dateadded') if date_added != None: date_added_text = date_added.text tagline_text = '' tagline = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}tag_line') if tagline != None: tagline_text = tagline.text else: # Kodi uPNP tagline = item.find('.//{http://purl.org/dc/elements/1.1/}description') if tagline != None: tagline_text = tagline.text categories_text = 'movie' categories = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}categories') if categories != None and categories.text != None: categories_text = categories.text.split(',')[0] # Kodi can only handle 1 media type if categories_text[:7].lower() == 'tv show': categories_text = 'episode' contentType = 'episodes' elif categories_text[:5].lower() == 'movie': categories_text = 'movie' contentType = 'movies' album_text = '' elif categories_text[:11].lower() == 'music video': categories_text = 'musicvideo' contentType = 'musicvideos' album_text = '' else: categories_text = 'video' contentType = 'videos' album_text = '' episode_text = '' episode = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}episode') if episode != None: episode_text = episode.text season_text = '' season = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}season') if season != None: season_text = season.text playcount = 0 playcount_text = '' playcountElem = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}playcount') if playcountElem != None: playcount_text = playcountElem.text playcount = int(playcount_text) playcountElem = item.find('.//{urn:schemas-upnp-org:metadata-1-0/upnp/}playbackCount') if playcountElem != None: # Kodi uPNP playcount_text = playcountElem.text playcount = int(playcount_text) last_played_text = '' last_played = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}last_played') if last_played != None: last_played_text = last_played.text last_played_text = '' # Kodi uPNP last_played = item.find('.//{urn:schemas-upnp-org:metadata-1-0/upnp/}lastPlaybackTime') if last_played != None: last_played_text = last_played.text writer_text = '' writer = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}writers') if writer != None: writer_text = writer.text writer_text = '' # Kodi uPNP writer = item.find('.//{urn:schemas-upnp-org:metadata-1-0/upnp/}author') if writer != None: writer_text = writer.text content_rating_text = '' content_rating = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}content_rating') if content_rating != None: content_rating_text = content_rating.text content_rating_text = '' # Kodi uPNP content_rating = item.find('.//{urn:schemas-upnp-org:metadata-1-0/upnp/}rating') if content_rating != None: content_rating_text = content_rating.text imdb_text = '' imdb = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}imdb_id') if imdb != None: imdb_text = imdb.text dcmInfo_text = '0' dcmInfo = item.find('.//{http://www.sec.co.kr/}dcmInfo') if dcmInfo != None: dcmInfo_text = dcmInfo.text valPos = dcmInfo_text.find('BM=') + 3 dcmInfo_text = dcmInfo_text[valPos:] rating_val = '' rating = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}rating') if rating != None: rating_val = rating.text rating_val = float(rating_val) * 2 rating_val = str(rating_val) #kodi ratings are out of 10, Mezzmo is out of 5 rating_val = '' # Kodi uPNP rating = item.find('.//{urn:schemas-xbmc-org:metadata-1-0/}userrating') if rating != None: rating_val = rating.text production_company_text = '' production_company = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}production_company') if production_company != None: production_company_text = production_company.text production_company_text = '' production_company = item.find('.//{http://purl.org/dc/elements/1.1/}publisher') if production_company != None: production_company_text = production_company.text sort_title_text = '' sort_title = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}sort_title') if sort_title != None: sort_title_text = sort_title.text video_codec_text = '' video_codec = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}video_codec') if video_codec != None: video_codec_text = video_codec.text if video_codec_text == 'vc1': # adjust for proper Kodi codec display video_codec_text = 'vc-1' audio_codec_text = '' audio_codec = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}audio_codec') if audio_codec != None: audio_codec_text = audio_codec.text audio_channels_text = '0' audio_channels = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}audio_channels') if audio_channels != None: audio_channels_text = audio_channels.text audio_lang = '' audio_streams = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}audio') if audio_streams != None: for stream in audio_streams.findall('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}stream'): if stream.get('selected') == 'auto' or stream.get('selected') == 'true': audio_lang = stream.get('lang') break subtitle_lang = '' captions_streams = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}captions') if captions_streams != None: for stream in captions_streams.findall('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}stream'): if stream.get('selected') == 'auto' or stream.get('selected') == 'true': subtitle_lang = stream.get('language') break #mediaClass if 'video' in upnpclass_text or 'video' in protocol_text: mediaClass_text = 'video' if 'audio' in upnpclass_text or 'audio' in protocol_text: mediaClass_text = 'music' if 'photo' in upnpclass_text or 'image' in protocol_text: mediaClass_text = 'pictures' if mediaClass_text == 'video': li.addContextMenuItems([ (menuitem1, 'Container.Refresh'), (menuitem2, 'Action(ParentDir)') ]) info = { 'duration': sync.getSeconds(duration_text), 'genre': genre_text, 'year': release_year_text, 'title': title, 'plot': description_text, 'director': creator_text, 'tagline': tagline_text, 'writer': writer_text, 'cast': artist_text, 'artist': artist_text, 'rating': rating_val, 'imdbnumber': imdb_text, 'mediatype': categories_text, 'season': season_text, 'episode': episode_text, 'lastplayed': last_played_text, 'aired': aired_text, 'mpaa':content_rating_text, 'studio':production_company_text, 'playcount':playcount, 'trailer':trailerurl, 'tvshowtitle':album_text, 'dateadded':date_added_text, } li.setInfo(mediaClass_text, info) li.setProperty('ResumeTime', dcmInfo_text) li.setProperty('TotalTime', str(sync.getSeconds(duration_text))) video_info = { 'codec': video_codec_text, 'aspect': aspect, 'width': video_width, 'height': video_height, } li.addStreamInfo('video', video_info) li.addStreamInfo('audio', {'codec': audio_codec_text, 'language': audio_lang, 'channels': int(audio_channels_text)}) li.addStreamInfo('subtitle', {'language': subtitle_lang}) elif mediaClass_text == 'music': mtitle = media.displayTitles(title) # Normalize title pctitle = '"' + mtitle.encode('utf-8','ignore') + '"' # Handle commas li.addContextMenuItems([ (menuitem1, 'Container.Refresh'), (menuitem2, 'Action(ParentDir)') ]) #offsetmenu = 'Resume from ' + time.strftime("%H:%M:%S", time.gmtime(int(dcmInfo_text))) info = { 'duration': sync.getSeconds(duration_text), 'genre': genre_text, 'year': release_year_text, 'title': pctitle, 'artist': artist_text, 'rating': rating_val, 'discnumber': season_text, 'mediatype': 'song', 'tracknumber': episode_text, 'album': album_text, 'playcount':playcount, 'lastplayed': last_played_text, } #mcomment = media.mComment(info, duration_text, offsetmenu[11:]) #info.update(comment = mcomment) li.setInfo(mediaClass_text, info) contentType = 'songs' elif mediaClass_text == 'pictures': li.addContextMenuItems([ (menuitem1, 'Container.Refresh'), (menuitem2, 'Action(ParentDir)'), \ (menuitem8, 'RunScript(%s, %s)' % ("plugin.video.mezzmo", "pictures")) ]) info = { 'title': title, } li.setInfo(mediaClass_text, info) contentType = 'files' picnotify += 1 itemdict = { 'title': title, 'url': itemurl, } piclist.append(itemdict) if picnotify == int(NumberReturned): # Update picture DB updatePictures(piclist) if slideshow == 'true': # Slideshow display prompt picDisplay() itemurl = build_url({'mode': 'picture', 'itemurl': itemurl}) xbmcplugin.addDirectoryItem(handle=addon_handle, url=itemurl, listitem=li, isFolder=False) itemsleft = itemsleft - int(NumberReturned) - 1 xbmc.log('Mezzmo items left: ' + str(itemsleft), xbmc.LOGDEBUG) if itemsleft <= 0: break if pitemsleft == itemsleft: # Detect items left not incrementing mgenlog ='Mezzmo items not displayed: ' + str(pitemsleft) xbmc.log(mgenlog, xbmc.LOGNOTICE) media.mgenlogUpdate(mgenlog) break else: pitemsleft = itemsleft # get the next items offset = int(TotalMatches) - itemsleft requestedCount = 1000 if itemsleft < 1000: requestedCount = itemsleft pin = media.settings('content_pin') content = browse.Browse(contenturl, objectID, 'BrowseDirectChildren', offset, requestedCount, pin) except Exception as e: media.printexception() pass setViewMode(contentType) if contentType == 'top' or contentType == 'folders': contentType = '' xbmcplugin.setContent(addon_handle, contentType) xbmcplugin.addSortMethod(addon_handle, xbmcplugin.SORT_METHOD_UNSORTED) xbmcplugin.addSortMethod(addon_handle, xbmcplugin.SORT_METHOD_DATE) xbmcplugin.addSortMethod(addon_handle, xbmcplugin.SORT_METHOD_TITLE_IGNORE_THE) xbmcplugin.addSortMethod(addon_handle, xbmcplugin.SORT_METHOD_VIDEO_YEAR) xbmcplugin.addSortMethod(addon_handle, xbmcplugin.SORT_METHOD_GENRE) xbmcplugin.addSortMethod(addon_handle, xbmcplugin.SORT_METHOD_DURATION) xbmcplugin.endOfDirectory(addon_handle)