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 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)
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)
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
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
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
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)
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)
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)
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)
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
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()
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