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
Exemple #2
0
def perfStats():  # Mezzmo Addon Performance Logs

    pdfile = openNosyncDB()  # Open Perf Stats database
    pdates = ["Most Recent"]
    curpf = pdfile.execute(
        'SELECT DISTINCT psDate FROM mperfStats ORDER BY psDate DESC LIMIT 30',
    )
    pstatdates = curpf.fetchall()  # Get dates from database
    for a in range(len(pstatdates)):
        pdates.append(pstatdates[a][0])  # Convert rows to list for dialog box
    ddialog = xbmcgui.Dialog()
    vdate = ddialog.select('Select Mezzmo Performance Stats Date', pdates)
    if vdate < 0:  # User cancel
        pdfile.close()
        return
    elif (pdates[vdate]) == "Most Recent":
        curpf = pdfile.execute(
            'SELECT * FROM mperfStats ORDER BY psDate DESC, psTime DESC LIMIT 2000',
        )
        headval = 'Mezzmo Performance Stats for:  ' + pdates[vdate]
    else:
        curpf = pdfile.execute(
            'SELECT * FROM mperfStats WHERE psDate=? ORDER BY psTime DESC',
            (pdates[vdate], ))
        headval = 'Mezzmo Performance Stats for:  ' + pdates[vdate][5:] + "-" + \
        pdates[vdate][:4]
    pstatslist = curpf.fetchall()
    pdfile.close()
    displayPerf(pstatslist, headval)
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)
Exemple #4
0
def displayGenLogs():

    dsfile = openNosyncDB()  # Open Sync logs database

    msdates = ["Most Recent"]
    msdialog = xbmcgui.Dialog()

    cursync = dsfile.execute(
        'SELECT DISTINCT mgDate FROM mgenLog ORDER BY mgDate DESC LIMIT 30', )
    mstatdates = cursync.fetchall()  # Get dates from database
    if mstatdates:
        for a in range(len(mstatdates)):
            msdates.append(
                mstatdates[a][0])  # Convert rows to list for dialog box
        mdate = msdialog.select('Select General Logs Date', msdates)
        if mdate < 0:  # User cancel
            dsfile.close()
            return
        elif (msdates[mdate]) == "Most Recent":
            cursync = dsfile.execute(
                'SELECT * FROM mgenLog ORDER BY mgDate DESC, mgTime DESC  LIMIT 2000',
            )
            headval = "Mezzmo Most Recent General Logs"
        elif len(msdates[mdate]) > 0:  # Get records for selected date
            cursync = dsfile.execute('SELECT * FROM mgenLog WHERE mgDate=? ORDER BY mgTime DESC', \
            (msdates[mdate],))
            headval = 'Mezzmo General Logs for:  ' + msdates[mdate][
                5:] + "-" + msdates[mdate][:4]
    else:  # No gen logs found for date selected
        textval1 = "No Mezzmo general logs found."  # Should never happen. Safety check
        msdialog.textviewer("Mezzmo General Logs", textval1)
        dsfile.close()
        return

    mglogs = cursync.fetchall()  # Get sync logs from database
    textval1 = "{:^38}".format("Date") + "{:>32}".format("General Log Message")
    textval1 = textval1 + "\n"

    if mglogs:
        for a in range(len(mglogs)):  # Display logs if exist
            msdate = mglogs[a][0]
            mstime = mglogs[a][1][:8]  # Strip off milliseconds
            msynclog = mglogs[a][2]
            if msynclog[0:3] == '###':  # Detect multiline logs
                msynclog = msynclog[3:]
                msdatetime = "{:>44}".format(" ")
            else:
                msdatetime = msdate + "   " + mstime + "      "
            textval1 = textval1 + "\n" + msdatetime + msynclog
        msdialog.textviewer(headval, textval1)
    else:  # No records found for date selected
        perfdialog = xbmcgui.Dialog()
        dialog_text = "No general logs found for the selected date."
        perfdialog.ok("Mezzmo Addon Database Error", dialog_text)
    dsfile.close()
    return
def updateServers(url, name, controlurl, manufacturer, model, icon,
                  description, udn):

    svrfile = openNosyncDB()  # Open server database
    curps = svrfile.execute('SELECT srvName FROM mServers WHERE controlUrl=?',
                            (controlurl, ))
    srvrtuple = curps.fetchone()  # Get servers from database
    if not srvrtuple:  # If not found add server
        svrfile.execute('INSERT into mServers (srvUrl, srvName, controlUrl, mSync, sManuf, sModel,  \
        sIcon, sDescr, sUdn) values (?, ?, ?, ?, ?, ?, ?, ?, ?)'                                                                , (url, name, controlurl, 'No',     \
        manufacturer, model, icon, description, udn[5:]))

    svrfile.commit()
    svrfile.close()
def clearPictures():  # Clear picture data

    try:
        picfile = openNosyncDB()  # Open picture database
        picfile.execute('DELETE FROM mPictures', )
        picfile.commit()
        picfile.close()
        mgenlog = 'Mezzmo picture DB cleared.'
        xbmc.log(mgenlog, xbmc.LOGDEBUG)
        #mgenlogUpdate(mgenlog)

    except Exception as e:
        printexception()
        mgenlog = 'Mezzmo clearing picture error.'
        xbmc.log(mgenlog, xbmc.LOGNOTICE)
        mgenlogUpdate(mgenlog)
def clearServers():  # Clear server data

    try:
        svrfile = openNosyncDB()  # Open server database
        svrfile.execute('DELETE FROM mServers', )
        svrfile.commit()
        svrfile.close()
        msynclog = 'Mezzmo sync servers cleared.'
        xbmc.log(msynclog, xbmc.LOGNOTICE)
        mezlogUpdate(msynclog)

    except Exception as e:
        printexception()
        msynclog = 'Mezzmo sync server clearing error.'
        xbmc.log(msynclog, xbmc.LOGNOTICE)
        mezlogUpdate(msynclog)
Exemple #8
0
def clearPerf():  # Clear performance statistics

    perfile = openNosyncDB()  # Open perf stats database
    perfdialog = xbmcgui.Dialog()
    kcmsg = "Confirm clearing the Mezzmo performance logs.  "
    cselect = perfdialog.yesno('Mezzmo Clear Performance Logs', kcmsg)
    if cselect == 1:
        perfile.execute('DELETE FROM mperfStats', )
        perfile.execute('DELETE FROM mperfIndex', )
        perfile.commit()
        mgenlog = 'Mezzmo performance logs cleared by user.'
        xbmc.log(mgenlog, xbmc.LOGNOTICE)
        media.mgenlogUpdate(mgenlog)
        dialog_text = "Most Recent Mezzmo performance logs were deleted."
        perfdialog.ok("Mezzmo Clear Performance Logs", dialog_text)
    perfile.close()
    return
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
Exemple #10
0
def getItemlUrl(contenturl, itemid):  # Get itemurl for generic uPNP

    try:
        svrfile = openNosyncDB()  # Open server database
        curps = svrfile.execute('SELECT sUdn FROM mServers WHERE controlUrl=?',
                                (contenturl, ))
        srvrtuple = curps.fetchone()  # Get server from database
        #xbmc.log('Mezzmo getItemUrl:' + str(srvrtuple[0]), xbmc.LOGNOTICE)
        if srvrtuple:
            itemurl = ('upnp://' + srvrtuple[0] + '/' + itemid).encode(
                'utf-8', 'ignore')
        else:
            itemurl = 'None'
    except:
        itemurl = 'None'
        pass

    svrfile.close()
    return itemurl
Exemple #11
0
def updateSync(controlurl):  # Set sync for Mezzmo server

    try:
        svrfile = openNosyncDB()  # Open server database
        svrfile.execute('UPDATE mServers SET mSync=?', ('No', ))
        xbmc.log('Mezzmo controlurl is: ' + controlurl, xbmc.LOGDEBUG)
        svrfile.execute('UPDATE mServers SET mSync=? WHERE controlUrl=?', (
            'Yes',
            controlurl,
        ))
        svrfile.commit()
        svrfile.close()
        return 0

    except Exception as e:
        printexception()
        msynclog = 'Mezzmo sync server update error.'
        xbmc.log(msynclog, xbmc.LOGNOTICE)
        mezlogUpdate(msynclog)
        return 1
Exemple #12
0
def perfPlaylist():  # Performance By Playlist

    pdfile = openNosyncDB()  # Open Perf Stats database
    plists = []
    curpf = pdfile.execute(
        'SELECT DISTINCT psPlaylist FROM mperfStats ORDER BY psPlaylist ASC', )
    pstatlists = curpf.fetchall()  # Get playlists from database
    for a in range(len(pstatlists)):
        plists.append(pstatlists[a][0])  # Convert rows to list for dialog box
    ddialog = xbmcgui.Dialog()
    vdate = ddialog.select('Select Mezzmo Performance Stats Playlist', plists)
    if vdate < 0:  # User cancel
        pdfile.close()
        return
    curpf = pdfile.execute(
        'SELECT * FROM mperfStats WHERE psPlaylist=? ORDER BY psDate DESC,              \
    psTime DESC', (plists[vdate], ))
    headval = 'Mezzmo Performance Stats for:  ' + plists[vdate]
    pstatslist = curpf.fetchall()
    pdfile.close()
    displayPerf(pstatslist, headval)
Exemple #13
0
def getPictures():  # Get pictures from DB

    try:
        picfile = openNosyncDB()  # Open picture DB
        curps = picfile.execute('SELECT mpTitle, mpUrl FROM mPictures')
        pictuple = curps.fetchall()  # Get pictures from database
        piclist = []
        for a in range(len(pictuple)):
            itemdict = {
                'title': pictuple[a][0],
                'url': pictuple[a][1],
            }
            piclist.append(itemdict)
        picfile.close()
        #xbmc.log('Mezzmo piclist dictionary: ' + str(piclist), xbmc.LOGNOTICE)
        return (piclist)

    except Exception as e:
        printexception()
        mgenlog = 'Mezzmo get picture error.'
        xbmc.log(mgenlog, xbmc.LOGNOTICE)
        mgenlogUpdate(mgenlog)
Exemple #14
0
def updatePictures(piclist):  # Update picture DB with list

    try:
        picfile = openNosyncDB()  # Open picture DB
        a = 0
        while a < len(piclist):
            title = str(piclist[a]['title'])
            url = str(piclist[a]['url'])
            picfile.execute(
                'INSERT into mPictures (mpTitle, mpUrl) values (?, ?)', (
                    title,
                    url,
                ))
            a += 1
        picfile.commit()
        picfile.close()

    except Exception as e:
        printexception()
        mgenlog = 'Mezzmo update picture error.'
        xbmc.log(mgenlog, xbmc.LOGNOTICE)
        mgenlogUpdate(mgenlog)
Exemple #15
0
def getContentURL(contenturl):  # Check for manufacturer match

    try:
        rfpos = contenturl.rfind('/', 7)
        searchurl = contenturl[:rfpos] + '%'
        svrfile = openNosyncDB()  # Open server database
        curps = svrfile.execute(
            'SELECT sManuf FROM mServers WHERE controlUrl LIKE ?',
            (searchurl, ))
        srvrtuple = curps.fetchone()  # Get server from database
        if srvrtuple:
            manufacturer = srvrtuple[0]
        else:
            manufacturer = 'None'

        xbmc.log('Mezzmo manufacturer is: ' + str(manufacturer), xbmc.LOGDEBUG)
        svrfile.close()
        return manufacturer

    except Exception as e:
        printexception()
        mgenlog = 'Mezzmo content server search error.'
        xbmc.log(mgenlog, xbmc.LOGNOTICE)
        mgenlogUpdate(mgenlog)
Exemple #16
0
def syncContent(content, syncurl, objectId, syncpin, syncoffset, maxrecords):  # Mezzmo data parsing / insertion function
    contentType = 'movies'
    itemsleft = -1
    global mezzmorecs, dupelog
    koditv = media.settings('koditv')
    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
            xbmc.log('Mezzmo total matches = ' + str(TotalMatches), xbmc.LOGDEBUG) 
            xbmc.log('Mezzmo number returned = ' + NumberReturned, xbmc.LOGDEBUG)
            xbmc.log('Mezzmo records = ' + str(mezzmorecs), xbmc.LOGDEBUG)
            if not TotalMatches:                       #  Sanity check
                TotalMatches = 0
            else:
                mezzmorecs = int(TotalMatches) + 5     #  Set global variable with record count
                    
            if int(NumberReturned) == 0:               #  Stop once offset = Total matches
                itemsleft = 0
                return(0)
                break; #sanity check
            
            if maxrecords == 1000 or maxrecords > int(TotalMatches):
                TotalMatches = int(TotalMatches) + 5
                dsyncflag = 1
            else:
                TotalMatches = maxrecords   
                dsyncflag = 0

            if itemsleft == -1:
                itemsleft = TotalMatches

            #xbmc.log('Mezzmo offset = ' + str(syncoffset), xbmc.LOGNOTICE)
            #xbmc.log('Mezzmo items left initial = ' + str(itemsleft), xbmc.LOGNOTICE)

            elems = xml.etree.ElementTree.fromstring(result.text.encode('utf-8'))
            
            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)             

            dbfile = media.openKodiDB()                   #  Open Kodi database
            dbsync = media.openNosyncDB()                 #  Open Mezzmo nosync database
            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)
                else:
                    icon = ''    

                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
                
                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'
                    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))
                        validf = 1	     #  Set valid file info flag
                    
                backdropurl = ''                        
                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'

                trailerurl = ''                                   
                trailerurl = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}trailer')
                if trailerurl != None:
                    trailerurl = trailerurl.text
                
                genre_text = ''
                genre = item.find('.//{urn:schemas-upnp-org:metadata-1-0/upnp/}genre')
                if genre != None:
                    genre_text = genre.text
                    
                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.encode('utf-8', 'ignore')

                creator_text = ''
                creator = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}creator')
                if creator != None:
                    creator_text = creator.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           
                   
                tagline_text = ''
                tagline = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}tag_line')
                if tagline != None:
                    tagline_text = tagline.text
                    
                categories = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}categories')

                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)
                 
                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
                        
                writer_text = ''
                writer = item.find('.//{urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/}writers')
                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
              
                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 = ''
                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
                
                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

                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 = ''
                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 
                mediaClass_text = 'video'
                mediaClass = item.find('.//{urn:schemas-sony-com:av}mediaClass')
                if mediaClass != None:
                    mediaClass_text = mediaClass.text
                    if mediaClass_text == 'V':
                        mediaClass_text = 'video'
                    if mediaClass_text == 'M':
                        mediaClass_text = 'music'
                    if mediaClass_text == 'P':
                        mediaClass_text = 'picture'
                #xbmc.log('Checking title: ' + title.encode('utf-8', 'ignore'), xbmc.LOGNOTICE)  
                mtitle = media.displayTitles(title)                           
                tvcheckval = media.tvChecker(season_text, episode_text, koditv, mtitle, categories) # Check if Ok to add
                if tvcheckval[1] == 1 and validf == 1:                  #  Update nosync database live channel
                    media.syncCount(dbsync, mtitle, "livec")       
                if tvcheckval[2] == 1 and validf == 1:                  #  Update nosync database nosync
                    media.syncCount(dbsync, mtitle, "nosync")               
                if tvcheckval[0] == 1 and validf == 1:  
                    pathcheck = media.getPath(itemurl)                  #  Get path string for media file
                    serverid = media.getMServer(itemurl)                #  Get Mezzmo server id
                    filekey = media.checkDBpath(itemurl, mtitle, playcount, dbfile, pathcheck, serverid,        \
                    season_text, episode_text, album_text, last_played_text, date_added_text, dupelog)
                    #xbmc.log('Checking movie: ' + mtitle.encode('utf-8', 'ignore'), xbmc.LOGNOTICE)                    
                    #xbmc.log('Mezzmo filekey is: ' + str(filekey), xbmc.LOGNOTICE) 
                    durationsecs = getSeconds(duration_text)            #  convert movie duration to seconds before passing
                    kodichange = 'true'                                 #  Enable change detection during sync
                    if filekey[4] == 1:
                        showId = media.checkTVShow(filekey, album_text, genre_text, dbfile, content_rating_text, \
                        production_company_text)
                        mediaId = media.writeEpisodeToDb(filekey, mtitle, description_text, tagline_text,        \
                        writer_text, creator_text, aired_text, rating_val, durationsecs, genre_text, trailerurl, \
                        content_rating_text, icon, kodichange, backdropurl, dbfile, production_company_text,     \
                        sort_title_text, season_text, episode_text, showId, dupelog)  
                    else:  
                        mediaId = media.writeMovieToDb(filekey, mtitle, description_text, tagline_text,          \
                        writer_text, creator_text, release_date_text, rating_val, durationsecs, genre_text,      \
                        trailerurl, content_rating_text, icon, kodichange, backdropurl, dbfile,                  \
                        production_company_text, sort_title_text, dupelog)
                    if (artist != None and filekey[0] > 0) or mediaId == 999999: #  Add actor information to new movie
                        media.writeActorsToDb(artist_text, mediaId, imageSearchUrl, mtitle, dbfile, filekey)
                    media.writeMovieStreams(filekey, video_codec_text, aspect, video_height, video_width,         \
                    audio_codec_text, audio_channels_text, audio_lang, durationsecs, mtitle, kodichange, itemurl, \
                    icon, backdropurl, dbfile, pathcheck, dupelog)      # Update movie stream info 
                    xbmc.log('The movie name is: ' + mtitle.encode('utf-8'), xbmc.LOGDEBUG)
                                                      
            itemsleft = itemsleft - int(NumberReturned)
            xbmc.log('Mezzmo items left: ' + str(itemsleft), xbmc.LOGDEBUG)
            dbfile.commit()                #  Commit writes

            if itemsleft <= 0:
                dbfile.commit()
                dbfile.close()             #  Final commit writes and close Kodi database
                dbsync.commit()
                dbsync.close()
                return(TotalMatches)  
                break
                        
            # get the next items
            offset = (TotalMatches - itemsleft) + syncoffset
            requestedCount = 1000
            if itemsleft < 1000:
                requestedCount = itemsleft
            
            pin = media.settings('content_pin')   
            content = browse.Browse(syncurl, objectId, 'BrowseDirectChildren', offset, requestedCount, syncpin)
    except Exception as e:
        printsyncexception()
        pass
Exemple #17
0
def displayMenu():
    if int(get_installedversion()
           ) < 18:  # Textviewer function added in Kodi 18
        dialog_text = "Mezzmo Logs & Performance Stats are only available in Kodi version 18 and higher."
        xbmcgui.Dialog().ok("Mezzmo Logs & Performance Stats", dialog_text)
        return

    while True:
        try:
            pdfile = openNosyncDB()  # Open Perf Stats database
            pselect = []
            curpf = pdfile.execute('SELECT dtDate FROM dupeTrack LIMIT 1', )
            pstatdates = curpf.fetchone()  # Get dates from dupe database
            if pstatdates:  # If dates in duplicate table
                pselect = ["Mezzmo Duplicate Logs"]

            curpf = pdfile.execute('SELECT msDate FROM msyncLog LIMIT 1', )
            mstatdates = curpf.fetchone()  # Get dates from sync database
            if mstatdates and len(pselect) > 0:  # If dates in sync table
                pselect.extend(["Mezzmo Addon Sync Logs"])
            elif mstatdates and len(pselect) == 0:
                pselect = ["Mezzmo Addon Sync Logs"]

            curpf = pdfile.execute('SELECT psDate FROM mperfStats LIMIT 1', )
            pstatdates = curpf.fetchone()  # Get dates from perf database
            if pstatdates and len(
                    pselect) > 0:  # If dates in performance table
                pselect.extend([
                    "Mezzmo Addon Performance Logs", "Performance By Playlist"
                ])
            elif pstatdates and len(pselect) == 0:
                pselect = [
                    "Mezzmo Addon Performance Logs", "Performance By Playlist"
                ]

            curpf = pdfile.execute('SELECT mgDate FROM mgenLog LIMIT 1', )
            gstatdates = curpf.fetchone(
            )  # Get dates from general log database
            if gstatdates and len(pselect) > 0:  # If dates in general table
                pselect.extend(["Mezzmo Addon General Logs"])
            elif gstatdates and len(pselect) == 0:
                pselect = ["Mezzmo Addon General Logs"]

            if pstatdates and len(
                    pselect) > 0:  # Add performance DB clear option
                pselect.extend(
                    ["[COLOR blue]Mezzmo Clear Performance Logs[/COLOR]"])
            elif len(pselect) == 0:
                pselect(["There are no logs or stats to display"])

            ddialog = xbmcgui.Dialog()
            vdate = ddialog.select('Select Mezzmo Logs or Stats View', pselect)
            xbmc.log('Mezzmo performance selection is: ' + pselect[vdate],
                     xbmc.LOGDEBUG)
            pdfile.close()
        except:
            perfdialog = xbmcgui.Dialog()
            dialog_text = "Error connecting to the Logs & Statistics database.  "
            dialog_text = dialog_text + "Please restart Kodi to correct."
            perfdialog.ok("Mezzmo Addon Database Error", dialog_text)
            break

        if vdate < 0:  # User cancel
            pdfile.close()
            break
        elif (pselect[vdate]) == "Mezzmo Duplicate Logs":
            displayDupeLogs()
        elif (pselect[vdate]) == "Mezzmo Addon Sync Logs":
            displaySyncLogs()
        elif (pselect[vdate]) == "Mezzmo Addon General Logs":
            displayGenLogs()
        elif "Mezzmo Clear Performance Logs" in (pselect[vdate]):
            clearPerf()
        elif (pselect[vdate]) == "Performance By Playlist":
            perfPlaylist()
        elif (pselect[vdate]) == "Mezzmo Addon Performance Logs":
            perfStats()
Exemple #18
0
def displayDupeLogs():

    dlfile = openNosyncDB()  # Open Dupe logs database

    dldates = ["Most Recent"]
    mdate = 0
    dialog = xbmcgui.Dialog()

    dupdate = dlfile.execute(
        'SELECT DISTINCT dtDate FROM dupeTrack ORDER BY dtDate DESC LIMIT 30',
    )
    mstatdates = dupdate.fetchall()  # Get dates from database
    if mstatdates:
        for a in range(len(mstatdates)):
            dldates.append(
                mstatdates[a][0])  # Convert rows to list for dialog box
        mdate = dialog.select('Select Duplicate Videos Date', dldates)
        if mdate < 0:  # User cancel
            dlfile.close()
            return
        elif (dldates[mdate]) == "Most Recent":
            curdl = dlfile.execute(
                'SELECT * FROM dupeTrack ORDER BY dtDate DESC LIMIT 2000', )
            headval = "Most Recent Mezzmo Duplicate Video Logs"
        elif len(dldates[mdate]) > 0:  # Get records for selected date
            curdl = dlfile.execute('SELECT * FROM dupeTrack WHERE dtDate=?',
                                   (dldates[mdate], ))
            headval = 'Mezzmo Duplicate Videos for:  ' + dldates[mdate][
                5:] + "-" + dldates[mdate][:4]
    elif mdate < 0:  # User cancel
        displayMenu()
    else:  # No sync logs found for date selected
        textval1 = "No Mezzmo Duplicate Videos found."  # Should never happen. Safety check
        dialog.textviewer("Mezzmo Duplicate Videos", textval1)
        dlfile.close()
        return

    dllogs = curdl.fetchall()  # Get dupe logs from database
    textval1 = "{:^25}".format("Date") + "{:^21}".format("Record #") + "{:>32}".format     \
    ("Duplicate Mezzmo Entry")
    textval1 = textval1 + "\n"

    if dllogs:
        for a in range(len(dllogs)):  # Display logs if exist
            dldate = dllogs[a][0]
            recnumb = dllogs[a][1]
            ctitle = "                " + dllogs[a][3]
            dldate = "{:>16}".format(dldate)
            if int(recnumb) < 10:
                frecnumb = "{:>16}".format(recnumb)
            elif int(recnumb) < 100:
                frecnumb = "{:>15}".format(recnumb)
            elif int(recnumb) < 1000:
                frecnumb = "{:>14}".format(recnumb)
            else:
                frecnumb = "{:>13}".format(recnumb)
            textval1 = textval1 + "\n" + dldate + frecnumb + ctitle[:64]
        dialog.textviewer(headval, textval1)
    else:  # No records found for date selected
        perfdialog = xbmcgui.Dialog()
        dialog_text = "No duplicate logs found for the selected date."
        perfdialog.ok("Mezzmo Addon Database Error", dialog_text)
    dlfile.close()
    return