Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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
Exemplo n.º 5
0
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)
Exemplo n.º 6
0
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)
Exemplo n.º 7
0
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()
Exemplo n.º 8
0
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)
Exemplo n.º 9
0
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
Exemplo n.º 10
0
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)