From ce47644868d6711728907ec9f0fc4320893669ef Mon Sep 17 00:00:00 2001 From: angelblue05 Date: Thu, 6 Sep 2018 14:41:02 -0500 Subject: [PATCH] Remove old code --- context.py | 2 +- context_play.py | 2 +- default.py | 196 +------------ resources/lib/full_sync.py | 485 -------------------------------- resources/lib/helper/api.py | 180 ------------ resources/lib/helper/utils.py | 114 -------- resources/lib/helper/xmls.py | 265 ----------------- resources/lib/player.py | 516 ---------------------------------- resources/lib/views.py | 3 +- service.py | 4 +- 10 files changed, 6 insertions(+), 1761 deletions(-) diff --git a/context.py b/context.py index 3bf53b07..75288ff8 100644 --- a/context.py +++ b/context.py @@ -28,7 +28,7 @@ LOG = logging.getLogger("EMBY.context") if __name__ == "__main__": - LOG.info("--->[ context ]") + LOG.debug("--->[ context ]") try: Context() diff --git a/context_play.py b/context_play.py index 5cfac752..32b00287 100644 --- a/context_play.py +++ b/context_play.py @@ -28,7 +28,7 @@ LOG = logging.getLogger("EMBY.context") if __name__ == "__main__": - LOG.info("--->[ context ]") + LOG.debug("--->[ context ]") try: Context(True) diff --git a/default.py b/default.py index 9b3ffc37..23073229 100644 --- a/default.py +++ b/default.py @@ -28,7 +28,7 @@ LOG = logging.getLogger("EMBY.default") if __name__ == "__main__": - LOG.info("--->[ default ]") + LOG.debug("--->[ default ]") try: Events() @@ -36,197 +36,3 @@ if __name__ == "__main__": LOG.exception(error) LOG.info("---<[ default ]") - - -""" - -# -*- coding: utf-8 -*- - -################################################################################################# - -import logging -import os -import sys -import urlparse - -import xbmc -import xbmcaddon -import xbmcplugin - -################################################################################################# - -_ADDON = xbmcaddon.Addon(id='plugin.video.emby') -_CWD = _ADDON.getAddonInfo('path').decode('utf-8') -_BASE_LIB = xbmc.translatePath(os.path.join(_CWD, 'resources', 'lib')).decode('utf-8') -sys.path.append(_BASE_LIB) - -################################################################################################# - -import entrypoint -import loghandler -from utils import window, dialog, language as lang -from ga_client import GoogleAnalytics -import database - -################################################################################################# - -loghandler.config() -log = logging.getLogger("EMBY.default") - -################################################################################################# - - -class Main(object): - - # MAIN ENTRY POINT - #@utils.profiling() - - def __init__(self): - - # Parse parameters - base_url = sys.argv[0] - path = sys.argv[2] - params = urlparse.parse_qs(path[1:]) - log.warn("Parameter string: %s params: %s", path, params) - try: - mode = params['mode'][0] - except (IndexError, KeyError): - mode = "" - - if "/extrafanart" in base_url: - - emby_path = path[1:] - emby_id = params.get('id', [""])[0] - entrypoint.getExtraFanArt(emby_id, emby_path) - - elif "/Extras" in base_url or "/VideoFiles" in base_url: - - emby_path = path[1:] - emby_id = params.get('id', [""])[0] - entrypoint.getVideoFiles(emby_id, emby_path) - - elif not self._modes(mode, params): - # Other functions - if mode == 'settings': - xbmc.executebuiltin('Addon.OpenSettings(plugin.video.emby)') - - elif mode in ('manualsync', 'fastsync', 'repair', 'refreshboxsets'): - self._library_sync(mode) - - elif mode == 'texturecache': - import artwork - artwork.Artwork().texture_cache_sync() - else: - entrypoint.doMainListing() - - if sys.argv: - xbmcplugin.endOfDirectory(int(sys.argv[1])) - - @classmethod - def _modes(cls, mode, params): - import utils - modes = { - - 'reset': database.db_reset, - 'resetauth': entrypoint.resetAuth, - 'play': entrypoint.doPlayback, - 'passwords': utils.passwordsXML, - 'adduser': entrypoint.addUser, - 'thememedia': entrypoint.getThemeMedia, - 'channels': entrypoint.BrowseChannels, - 'channelsfolder': entrypoint.BrowseChannels, - 'browsecontent': entrypoint.BrowseContent, - 'getsubfolders': entrypoint.GetSubFolders, - 'nextup': entrypoint.getNextUpEpisodes, - 'inprogressepisodes': entrypoint.getInProgressEpisodes, - 'recentepisodes': entrypoint.getRecentEpisodes, - 'refreshplaylist': entrypoint.refreshPlaylist, - 'deviceid': entrypoint.resetDeviceId, - 'delete': entrypoint.deleteItem, - 'connect': entrypoint.emby_connect, - 'backup': entrypoint.emby_backup, - - 'manuallogin': entrypoint.test_manual_login, - 'connectlogin': entrypoint.test_connect_login, - 'manualserver': entrypoint.test_manual_server, - 'connectservers': entrypoint.test_connect_servers, - 'connectusers': entrypoint.test_connect_users - } - if mode in modes: - # Simple functions - action = modes[mode] - item_id = params.get('id') - if item_id: - item_id = item_id[0] - - if mode == 'play': - database_id = params.get('dbid') - action(item_id, database_id) - - elif mode == 'recentepisodes': - limit = int(params['limit'][0]) - action(item_id, limit, params.get('filters', [""])[0]) - - elif mode in ('nextup', 'inprogressepisodes'): - limit = int(params['limit'][0]) - action(item_id, limit) - - elif mode in ('channels', 'getsubfolders'): - action(item_id) - - elif mode == 'browsecontent': - action(item_id, params.get('type', [""])[0], params.get('folderid', [""])[0]) - - elif mode == 'channelsfolder': - folderid = params['folderid'][0] - action(item_id, folderid) - else: - action() - - return True - - return False - - @classmethod - def _library_sync(cls, mode): - - if window('emby_online') != "true": - # Server is not online, do not run the sync - dialog(type_="ok", - heading="{emby}", - line1=lang(33034)) - log.warn("Not connected to the emby server") - - elif window('emby_dbScan') != "true": - import librarysync - library_sync = librarysync.LibrarySync() - - if mode == 'manualsync': - librarysync.ManualSync().sync() - elif mode == 'fastsync': - library_sync.startSync() - elif mode == 'refreshboxsets': - librarysync.ManualSync().sync('boxsets') - else: - library_sync.fullSync(repair=True) - else: - log.warn("Database scan is already running") - - -if __name__ == "__main__": - - log.info("plugin.video.emby started") - - try: - Main() - except Exception as error: - if not (hasattr(error, 'quiet') and error.quiet): - ga = GoogleAnalytics() - errStrings = ga.formatException() - ga.sendEventData("Exception", errStrings[0], errStrings[1]) - log.exception(error) - raise - - log.info("plugin.video.emby stopped") - -""" diff --git a/resources/lib/full_sync.py b/resources/lib/full_sync.py index 6fc85ce2..ef738a12 100644 --- a/resources/lib/full_sync.py +++ b/resources/lib/full_sync.py @@ -315,488 +315,3 @@ class FullSync(object): obj.boxsets_reset() self.boxsets() - - - - - -""" -# -*- coding: utf-8 -*- - -################################################################################################## - -import logging -import sqlite3 -import threading -from datetime import datetime, timedelta, time - -import xbmc -import xbmcgui -import xbmcvfs - -import api -import utils -import clientinfo -import database -import downloadutils -import itemtypes -import emby_api as mb -import embydb_functions as embydb -import read_embyserver as embyserver -import userclient -import views -from objects import Movies, MusicVideos, TVShows, Music -from utils import window, settings, language as lang, should_stop -from ga_client import GoogleAnalytics - -################################################################################################## - -log = logging.getLogger("EMBY."+__name__) - -################################################################################################## - -class LibrarySync(threading.Thread): - - _shared_state = {} - - isFastSync = False - - stop_thread = False - suspend_thread = False - - # Track websocketclient updates - addedItems = [] - updateItems = [] - userdataItems = [] - removeItems = [] - forceLibraryUpdate = False - incremental_count = 0 - refresh_views = False - - - def __init__(self): - - self.__dict__ = self._shared_state - self.monitor = xbmc.Monitor() - - self.clientInfo = clientinfo.ClientInfo() - self.doUtils = downloadutils.DownloadUtils().downloadUrl - self.user = userclient.UserClient() - self.emby = embyserver.Read_EmbyServer() - self.kodi_version = int(xbmc.getInfoLabel('System.BuildVersion')[:2]) - - threading.Thread.__init__(self) - - - def progressDialog(self, title): - - dialog = None - - dialog = xbmcgui.DialogProgressBG() - dialog.create("Emby for Kodi", title) - log.debug("Show progress dialog: %s" % title) - - return dialog - - def saveLastSync(self): - - # Save last sync time - overlap = 2 - - try: # datetime fails when used more than once, TypeError - if self.isFastSync: - result = self.doUtils("{server}/emby/Emby.Kodi.SyncQueue/GetServerDateTime?format=json") - server_time = result['ServerDateTime'] - server_time = utils.convertDate(server_time) - else: - raise Exception("Fast sync server plugin is not enabled.") - - except Exception as e: - # If the server plugin is not installed or an error happened. - log.debug("An exception occurred: %s" % e) - time_now = datetime.utcnow()-timedelta(minutes=overlap) - lastSync = time_now.strftime('%Y-%m-%dT%H:%M:%SZ') - log.info("New sync time: client time -%s min: %s" % (overlap, lastSync)) - - else: - lastSync = (server_time - timedelta(minutes=overlap)).strftime('%Y-%m-%dT%H:%M:%SZ') - log.info("New sync time: server time -%s min: %s" % (overlap, lastSync)) - - finally: - settings('LastIncrementalSync', value=lastSync) - - - def fullSync(self, manualrun=False, repair=False): - # Only run once when first setting up. Can be run manually. - music_enabled = settings('enableMusic') == "true" - - xbmc.executebuiltin('InhibitIdleShutdown(true)') - screensaver = utils.getScreensaver() - utils.setScreensaver(value="") - window('emby_dbScan', value="true") - # Add sources - utils.sourcesXML() - - # use emby and video DBs - with database.DatabaseConn('emby') as cursor_emby: - with database.DatabaseConn('video') as cursor_video: - # content sync: movies, tvshows, musicvideos, music - - if manualrun: - message = "Manual sync" - elif repair: - message = "Repair sync" - repair_list = [] - choices = ['all', 'movies', 'musicvideos', 'tvshows'] - if music_enabled: - choices.append('music') - - if self.kodi_version > 15: - # Jarvis or higher - types = xbmcgui.Dialog().multiselect(lang(33094), choices) - if types is None: - pass - elif 0 in types: # all - choices.pop(0) - repair_list.extend(choices) - else: - for index in types: - repair_list.append(choices[index]) - else: - resp = xbmcgui.Dialog().select(lang(33094), choices) - if resp == 0: # all - choices.pop(resp) - repair_list.extend(choices) - else: - repair_list.append(choices[resp]) - - log.info("Repair queued for: %s", repair_list) - else: - message = "Initial sync" - window('emby_initialScan', value="true") - - pDialog = self.progressDialog("%s" % message) - starttotal = datetime.now() - - # Set views - views.Views(cursor_emby, cursor_video).maintain() - cursor_emby.connection.commit() - #self.maintainViews(cursor_emby, cursor_video) - - # Sync video library - process = { - - 'movies': self.movies, - 'boxsets': self.boxsets, - 'musicvideos': self.musicvideos, - 'tvshows': self.tvshows - } - for itemtype in process: - - if repair and itemtype not in repair_list: - continue - - startTime = datetime.now() - completed = process[itemtype](cursor_emby, cursor_video, pDialog) - if not completed: - xbmc.executebuiltin('InhibitIdleShutdown(false)') - utils.setScreensaver(value=screensaver) - window('emby_dbScan', clear=True) - if pDialog: - pDialog.close() - - return False - else: - elapsedTime = datetime.now() - startTime - log.info("SyncDatabase (finished %s in: %s)" - % (itemtype, str(elapsedTime).split('.')[0])) - - - # sync music - # use emby and music - if music_enabled: - if repair and 'music' not in repair_list: - pass - else: - with database.DatabaseConn('emby') as cursor_emby: - with database.DatabaseConn('music') as cursor_music: - startTime = datetime.now() - completed = self.music(cursor_emby, cursor_music, pDialog) - if not completed: - xbmc.executebuiltin('InhibitIdleShutdown(false)') - utils.setScreensaver(value=screensaver) - window('emby_dbScan', clear=True) - if pDialog: - pDialog.close() - - return False - else: - elapsedTime = datetime.now() - startTime - log.info("SyncDatabase (finished music in: %s)" - % (str(elapsedTime).split('.')[0])) - - if pDialog: - pDialog.close() - - with database.DatabaseConn('emby') as cursor_emby: - emby_db = embydb.Embydb_Functions(cursor_emby) - current_version = emby_db.get_version(self.clientInfo.get_version()) - - window('emby_version', current_version) - - settings('SyncInstallRunDone', value="true") - - self.saveLastSync() - xbmc.executebuiltin('UpdateLibrary(video)') - elapsedtotal = datetime.now() - starttotal - - xbmc.executebuiltin('InhibitIdleShutdown(false)') - utils.setScreensaver(value=screensaver) - window('emby_dbScan', clear=True) - window('emby_initialScan', clear=True) - - xbmcgui.Dialog().notification( - heading=lang(29999), - message="%s %s %s" % - (message, lang(33025), str(elapsedtotal).split('.')[0]), - icon="special://home/addons/plugin.video.emby/icon.png", - sound=False) - - return True - - - def refreshViews(self): - - with database.DatabaseConn('emby') as cursor_emby: - with database.DatabaseConn() as cursor_video: - # Compare views, assign correct tags to items - views.Views(cursor_emby, cursor_video).maintain() - - def offline_mode_views(self): - - with database.DatabaseConn('emby') as cursor_emby: - with database.DatabaseConn() as cursor_video: - views.Views(cursor_emby, cursor_video).offline_mode() - - - def compareDBVersion(self, current, minimum): - # It returns True is database is up to date. False otherwise. - log.info("current: %s minimum: %s" % (current, minimum)) - - try: - currMajor, currMinor, currPatch = current.split(".") - minMajor, minMinor, minPatch = minimum.split(".") - except ValueError as error: - raise ValueError("Unable to compare versions: %s, %s" % (current, minimum)) - - if currMajor > minMajor: - return True - elif currMajor == minMajor and (currMinor > minMinor or - (currMinor == minMinor and currPatch >= minPatch)): - return True - else: - # Database out of date. - return False - - def run(self): - - try: - self.run_internal() - except Warning as e: - if "restricted" in e: - pass - elif "401" in e: - pass - except Exception as e: - ga = GoogleAnalytics() - errStrings = ga.formatException() - if not (hasattr(e, 'quiet') and e.quiet): - ga.sendEventData("Exception", errStrings[0], errStrings[1]) - window('emby_dbScan', clear=True) - log.exception(e) - xbmcgui.Dialog().ok( - heading=lang(29999), - line1=( - "Library sync thread has exited! " - "You should restart Kodi now. " - "Please report this on the forum."), - line2=(errStrings[0] + " (" + errStrings[1] + ")")) - - def run_internal(self): - - dialog = xbmcgui.Dialog() - - startupComplete = False - - log.warn("---===### Starting LibrarySync ###===---") - if utils.verify_advancedsettings(): - # Advancedsettings was modified, Kodi needs to restart - log.warn("###===--- LibrarySync Aborted ---===###") - return - - while not self.monitor.abortRequested(): - - # In the event the server goes offline - while self.suspend_thread: - # Set in service.py - if self.monitor.waitForAbort(5): - # Abort was requested while waiting. We should exit - break - - if (window('emby_dbCheck') != "true" and settings('SyncInstallRunDone') == "true"): - # Verify the validity of the database - log.info("Doing DB Version Check") - with database.DatabaseConn('emby') as cursor: - emby_db = embydb.Embydb_Functions(cursor) - currentVersion = emby_db.get_version() - ###$ Begin migration $### - if not currentVersion: - currentVersion = emby_db.get_version(settings('dbCreatedWithVersion') or self.clientInfo.get_version()) - log.info("Migration of database version completed") - ###$ End migration $### - - window('emby_version', value=currentVersion) - - minVersion = window('emby_minDBVersion') - uptoDate = self.compareDBVersion(currentVersion, minVersion) - - if not uptoDate: - log.warn("Database version out of date: %s minimum version required: %s" - % (currentVersion, minVersion)) - - resp = dialog.yesno(lang(29999), lang(33022)) - if not resp: - log.warn("Database version is out of date! USER IGNORED!") - dialog.ok(lang(29999), lang(33023)) - else: - database.db_reset() - - break - - window('emby_dbCheck', value="true") - - - if not startupComplete: - # Verify the video database can be found - videoDb = database.video_database() - if not xbmcvfs.exists(videoDb): - # Database does not exists - log.error( - "The current Kodi version is incompatible " - "with the Emby for Kodi add-on. Please visit " - "https://github.com/MediaBrowser/Emby.Kodi/wiki " - "to know which Kodi versions are supported.") - - dialog.ok( - heading=lang(29999), - line1=lang(33024)) - break - - # Run start up sync - log.warn("Database version: %s", window('emby_version')) - log.info("SyncDatabase (started)") - startTime = datetime.now() - librarySync = self.startSync() - elapsedTime = datetime.now() - startTime - log.info("SyncDatabase (finished in: %s) %s" - % (str(elapsedTime).split('.')[0], librarySync)) - - # Add other servers at this point - # TODO: re-add once plugin listing is created - # self.user.load_connect_servers() - - # Only try the initial sync once per kodi session regardless - # This will prevent an infinite loop in case something goes wrong. - startupComplete = True - - # Process updates - if self.incremental_count > 5: - self.incremental_count = 0 - window('emby_kodiScan', clear=True) - - if ((not xbmc.Player().isPlayingVideo() or xbmc.getCondVisibility('VideoPlayer.Content(livetv)')) and - window('emby_dbScan') != "true" and window('emby_shouldStop') != "true"): - - self.incrementalSync() - - if window('emby_onWake') == "true" and window('emby_online') == "true": - # Kodi is waking up - # Set in kodimonitor.py - window('emby_onWake', clear=True) - if window('emby_syncRunning') != "true": - log.info("SyncDatabase onWake (started)") - librarySync = self.startSync() - log.info("SyncDatabase onWake (finished) %s" % librarySync) - - if self.stop_thread: - # Set in service.py - log.debug("Service terminated thread.") - break - - if self.monitor.waitForAbort(1): - # Abort was requested while waiting. We should exit - break - - log.warn("###===--- LibrarySync Stopped ---===###") - - def stopThread(self): - self.stop_thread = True - log.debug("Ending thread...") - - def suspendThread(self): - self.suspend_thread = True - log.debug("Pausing thread...") - - def resumeThread(self): - self.suspend_thread = False - log.debug("Resuming thread...") - -class ManualSync(LibrarySync): - - - def __init__(self): - LibrarySync.__init__(self) - - def sync(self, mediatype=None): - - if mediatype in ('movies', 'boxsets', 'musicvideos', 'tvshows'): - with database.DatabaseConn('emby') as cursor_emby: - with database.DatabaseConn('video') as cursor_video: - pDialog = self.progressDialog("Manual Sync: %s" % mediatype) - if mediatype == 'movies': - self.movies(cursor_emby, cursor_video, pDialog) - elif mediatype == "boxsets": - self.boxsets(cursor_emby, cursor_video, pDialog) - elif mediatype =='musicvideos': - self.musicvideos(cursor_emby, cursor_video, pDialog) - elif mediatype == 'tvshows': - self.tvshows(cursor_emby, cursor_video, pDialog) - - pDialog.close() - return - - elif mediatype == 'music': - with database.DatabaseConn('emby') as cursor_emby: - with database.DatabaseConn('music') as cursor_music: - pDialog = self.progressDialog("Manual Sync: %s" % mediatype) - self.music(cursor_emby, cursor_music, pDialog) - pDialog.close() - return - else: - return self.fullSync(manualrun=True) - - def movies(self, embycursor, kodicursor, pdialog): - return Movies(embycursor, kodicursor, pdialog).compare_all() - - def boxsets(self, embycursor, kodicursor, pdialog): - return Movies(embycursor, kodicursor, pdialog).force_refresh_boxsets() - - def musicvideos(self, embycursor, kodicursor, pdialog): - return MusicVideos(embycursor, kodicursor, pdialog).compare_all() - - def tvshows(self, embycursor, kodicursor, pdialog): - return TVShows(embycursor, kodicursor, pdialog).compare_all() - - def music(self, embycursor, kodicursor, pdialog): - return Music(embycursor, kodicursor).compare_all() -""" diff --git a/resources/lib/helper/api.py b/resources/lib/helper/api.py index 570ffa97..bc68815a 100644 --- a/resources/lib/helper/api.py +++ b/resources/lib/helper/api.py @@ -33,80 +33,6 @@ class API(object): ''' return (playcount or 1) if played else None - - - - def get_userdata(self): - # Default - favorite = False - likes = None - playcount = None - played = False - last_played = None - resume = 0 - - try: - userdata = self.item['UserData'] - except KeyError: # No userdata found. - pass - else: - favorite = userdata['IsFavorite'] - likes = userdata.get('Likes') - - last_played = userdata.get('LastPlayedDate') - if last_played: - last_played = last_played.split('.')[0].replace('T', " ") - - if userdata['Played']: - # Playcount is tied to the watch status - played = True - playcount = userdata['PlayCount'] - if playcount == 0: - playcount = 1 - - if last_played is None: - last_played = self.get_date_created() - - playback_position = userdata.get('PlaybackPositionTicks') - if playback_position: - resume = playback_position / 10000000.0 - - return { - - 'Favorite': favorite, - 'Likes': likes, - 'PlayCount': playcount, - 'Played': played, - 'LastPlayedDate': last_played, - 'Resume': resume - } - - def get_people(self): - # Process People - director = [] - writer = [] - cast = [] - - if 'People' in self.item: - for person in self.item['People']: - - type_ = person['Type'] - name = person['Name'] - - if type_ == 'Director': - director.append(name) - elif type_ == 'Actor': - cast.append(name) - elif type_ in ('Writing', 'Writer'): - writer.append(name) - - return { - - 'Director': director, - 'Writer': writer, - 'Cast': cast - } - def get_actors(self): cast = [] @@ -125,40 +51,6 @@ class API(object): return cast - def get_media_streams(self): - - video_tracks = [] - audio_tracks = [] - subtitle_languages = [] - - try: - media_streams = self.item['MediaSources'][0]['MediaStreams'] - - except KeyError: - if not self.item.get("MediaStreams"): - return None - media_streams = self.item['MediaStreams'] - - for media_stream in media_streams: - # Sort through Video, Audio, Subtitle - stream_type = media_stream['Type'] - - if stream_type == "Video": - self._video_stream(video_tracks, media_stream) - - elif stream_type == "Audio": - self._audio_stream(audio_tracks, media_stream) - - elif stream_type == "Subtitle": - subtitle_languages.append(media_stream.get('Language', "Unknown")) - - return { - - 'video': video_tracks, - 'audio': audio_tracks, - 'subtitle': subtitle_languages - } - def media_streams(self, video, audio, subtitles): return { 'video': video or [], @@ -247,21 +139,6 @@ class API(object): return resume - def get_studios(self): - # Process Studios - studios = [] - try: - studio = self.item['SeriesStudio'] - studios.append(self.validate_studio(studio)) - - except KeyError: - for studio in self.item['Studios']: - - name = studio['Name'] - studios.append(self.validate_studio(name)) - - return studios - def validate_studio(self, studio_name): # Convert studio for Kodi to properly detect them studios = { @@ -277,36 +154,6 @@ class API(object): } return studios.get(studio_name.lower(), studio_name) - def get_genres(self): - - all_genres = "" - genres = self.item.get('Genres', self.item.get('SeriesGenres')) - - if genres: - all_genres = " / ".join(genres) - - return all_genres - - def get_date_created(self): - - try: - date_added = self.item['DateCreated'] - date_added = date_added.split('.')[0].replace('T', " ") - except KeyError: - date_added = None - - return date_added - - def get_premiere_date(self): - - try: - premiere = self.item['PremiereDate'] - premiere = premiere.split('.')[0].replace('T', " ") - except KeyError: - premiere = None - - return premiere - def get_overview(self, overview=None): overview = overview or self.item.get('Overview') @@ -321,24 +168,6 @@ class API(object): return overview - def get_tagline(self): - - try: - tagline = self.item['Taglines'][0] - except IndexError: - tagline = None - - return tagline - - def get_provider(self, name): - - try: - provider = self.item['ProviderIds'][name] - except KeyError: - provider = None - - return provider - def get_mpaa(self): # Convert more complex cases mpaa = self.item.get('OfficialRating', "") @@ -352,15 +181,6 @@ class API(object): return mpaa - def get_country(self): - - try: - country = self.item['ProductionLocations'][0] - except (IndexError, KeyError): - country = None - - return country - def get_file_path(self, path=None): if path is None: diff --git a/resources/lib/helper/utils.py b/resources/lib/helper/utils.py index 14f5feac..45487a55 100644 --- a/resources/lib/helper/utils.py +++ b/resources/lib/helper/utils.py @@ -273,117 +273,3 @@ def normalize_string(text): text = unicodedata.normalize('NFKD', unicode(text, 'utf-8')).encode('ascii', 'ignore') return text - - -""" - - - - -################################################################################################# -# Utility methods - -def getScreensaver(): - # Get the current screensaver value - result = JSONRPC('Settings.getSettingValue').execute({'setting': "screensaver.mode"}) - try: - return result['result']['value'] - except KeyError: - return "" - -def setScreensaver(value): - # Toggle the screensaver - params = { - 'setting': "screensaver.mode", - 'value': value - } - result = JSONRPC('Settings.setSettingValue').execute(params) - log.info("Toggling screensaver: %s %s" % (value, result)) - -def convertDate(date): - try: - date = datetime.strptime(date, "%Y-%m-%dT%H:%M:%SZ") - except (ImportError, TypeError): - # TypeError: attribute of type 'NoneType' is not callable - # Known Kodi/python error - date = datetime(*(time.strptime(date, "%Y-%m-%dT%H:%M:%SZ")[0:6])) - - return date - - -def indent(elem, level=0): - # Prettify xml trees - i = "\n" + level*" " - if len(elem): - if not elem.text or not elem.text.strip(): - elem.text = i + " " - if not elem.tail or not elem.tail.strip(): - elem.tail = i - for elem in elem: - indent(elem, level+1) - if not elem.tail or not elem.tail.strip(): - elem.tail = i - else: - if level and (not elem.tail or not elem.tail.strip()): - elem.tail = i - -def profiling(sortby="cumulative"): - # Will print results to Kodi log - def decorator(func): - def wrapper(*args, **kwargs): - import cProfile - import pstats - - pr = cProfile.Profile() - - pr.enable() - result = func(*args, **kwargs) - pr.disable() - - s = StringIO.StringIO() - ps = pstats.Stats(pr, stream=s).sort_stats(sortby) - ps.print_stats() - log.info(s.getvalue()) - - return result - - return wrapper - return decorator - -################################################################################################# -# Addon utilities - - -def verify_advancedsettings(): - # Track the existance of true - # incompatible with plugin paths - log.info("verifying advanced settings") - if settings('useDirectPaths') != "0": return - - path = xbmc.translatePath("special://userdata/").decode('utf-8') - xmlpath = "%sadvancedsettings.xml" % path - - try: - xmlparse = etree.parse(xmlpath) - except: # Document is blank or missing - return - else: - root = xmlparse.getroot() - - video = root.find('videolibrary') - if video is not None: - cleanonupdate = video.find('cleanonupdate') - if cleanonupdate is not None and cleanonupdate.text == "true": - log.warn("cleanonupdate disabled") - video.remove(cleanonupdate) - - try: - indent(root) - except: pass - etree.ElementTree(root).write(xmlpath) - - xbmcgui.Dialog().ok(heading=language(29999), line1=language(33097)) - xbmc.executebuiltin('RestartApp') - return True - return -""" diff --git a/resources/lib/helper/xmls.py b/resources/lib/helper/xmls.py index 0029dc59..00dfdce4 100644 --- a/resources/lib/helper/xmls.py +++ b/resources/lib/helper/xmls.py @@ -80,272 +80,7 @@ def tvtunes_nfo(path, urls): indent(xml) write_xml(etree.tostring(xml, 'UTF-8'), path) - - - """ -# -*- coding: utf-8 -*- - -################################################################################################# - -import inspect -import json -import logging -import sqlite3 -import StringIO -import os -import sys -import time -import urllib -import unicodedata -import xml.etree.ElementTree as etree -from datetime import datetime -from uuid import uuid4 - - -import xbmc -import xbmcaddon -import xbmcgui -import xbmcplugin -import xbmcvfs - -################################################################################################# - -log = logging.getLogger("EMBY."+__name__) - -################################################################################################# - - - - -################################################################################################# -# Utility methods - -def getScreensaver(): - # Get the current screensaver value - result = JSONRPC('Settings.getSettingValue').execute({'setting': "screensaver.mode"}) - try: - return result['result']['value'] - except KeyError: - return "" - -def setScreensaver(value): - # Toggle the screensaver - params = { - 'setting': "screensaver.mode", - 'value': value - } - result = JSONRPC('Settings.setSettingValue').execute(params) - log.info("Toggling screensaver: %s %s" % (value, result)) - -def convertDate(date): - try: - date = datetime.strptime(date, "%Y-%m-%dT%H:%M:%SZ") - except (ImportError, TypeError): - # TypeError: attribute of type 'NoneType' is not callable - # Known Kodi/python error - date = datetime(*(time.strptime(date, "%Y-%m-%dT%H:%M:%SZ")[0:6])) - - return date - -def normalize_string(text): - # For theme media, do not modify unless - # modified in TV Tunes - text = text.replace(":", "") - text = text.replace("/", "-") - text = text.replace("\\", "-") - text = text.replace("<", "") - text = text.replace(">", "") - text = text.replace("*", "") - text = text.replace("?", "") - text = text.replace('|', "") - text = text.strip() - # Remove dots from the last character as windows can not have directories - # with dots at the end - text = text.rstrip('.') - text = unicodedata.normalize('NFKD', unicode(text, 'utf-8')).encode('ascii', 'ignore') - - return text - -def indent(elem, level=0): - # Prettify xml trees - i = "\n" + level*" " - if len(elem): - if not elem.text or not elem.text.strip(): - elem.text = i + " " - if not elem.tail or not elem.tail.strip(): - elem.tail = i - for elem in elem: - indent(elem, level+1) - if not elem.tail or not elem.tail.strip(): - elem.tail = i - else: - if level and (not elem.tail or not elem.tail.strip()): - elem.tail = i - -def profiling(sortby="cumulative"): - # Will print results to Kodi log - def decorator(func): - def wrapper(*args, **kwargs): - import cProfile - import pstats - - pr = cProfile.Profile() - - pr.enable() - result = func(*args, **kwargs) - pr.disable() - - s = StringIO.StringIO() - ps = pstats.Stats(pr, stream=s).sort_stats(sortby) - ps.print_stats() - log.info(s.getvalue()) - - return result - - return wrapper - return decorator - -################################################################################################# -# Addon utilities - -def sourcesXML(): - # To make Master lock compatible - path = xbmc.translatePath("special://profile/").decode('utf-8') - xmlpath = "%ssources.xml" % path - - try: - xmlparse = etree.parse(xmlpath) - except: # Document is blank or missing - root = etree.Element('sources') - else: - root = xmlparse.getroot() - - - video = root.find('video') - if video is None: - video = etree.SubElement(root, 'video') - etree.SubElement(video, 'default', attrib={'pathversion': "1"}) - - # Add elements - count = 2 - for source in root.findall('.//path'): - if source.text == "smb://": - count -= 1 - - if count == 0: - # sources already set - break - else: - # Missing smb:// occurences, re-add. - for i in range(0, count): - source = etree.SubElement(video, 'source') - etree.SubElement(source, 'name').text = "Emby" - etree.SubElement(source, 'path', attrib={'pathversion': "1"}).text = "smb://" - etree.SubElement(source, 'allowsharing').text = "true" - # Prettify and write to file - try: - indent(root) - except: pass - etree.ElementTree(root).write(xmlpath) - -def passwordsXML(): - - # To add network credentials - path = xbmc.translatePath("special://userdata/").decode('utf-8') - xmlpath = "%spasswords.xml" % path - - try: - xmlparse = etree.parse(xmlpath) - except: # Document is blank or missing - root = etree.Element('passwords') - else: - root = xmlparse.getroot() - - dialog = xbmcgui.Dialog() - credentials = settings('networkCreds') - if credentials: - # Present user with options - option = dialog.select(language(33075), [language(33076), language(33077)]) - - if option < 0: - # User cancelled dialog - return - - elif option == 1: - # User selected remove - for paths in root.getiterator('passwords'): - for path in paths: - if path.find('.//from').text == "smb://%s/" % credentials: - paths.remove(path) - log.info("Successfully removed credentials for: %s" % credentials) - etree.ElementTree(root).write(xmlpath) - break - else: - log.info("Failed to find saved server: %s in passwords.xml" % credentials) - - settings('networkCreds', value="") - xbmcgui.Dialog().notification( - heading=language(29999), - message="%s %s" % (language(33078), credentials), - icon="special://home/addons/plugin.video.emby/icon.png", - time=1000, - sound=False) - return - - elif option == 0: - # User selected to modify - server = dialog.input(language(33083), credentials) - if not server: - return - else: - # No credentials added - dialog.ok(heading=language(29999), line1=language(33082)) - server = dialog.input(language(33084)) - if not server: - return - - # Network username - user = dialog.input(language(33079)) - if not user: - return - # Network password - password = dialog.input(heading=language(33080), option=xbmcgui.ALPHANUM_HIDE_INPUT) - if not password: - return - - # Add elements - for path in root.findall('.//path'): - if path.find('.//from').text.lower() == "smb://%s/" % server.lower(): - # Found the server, rewrite credentials - topath = "smb://%s:%s@%s/" % (user, password, server) - path.find('.//to').text = topath.replace("\\", ";") - break - else: - # Server not found, add it. - path = etree.SubElement(root, 'path') - etree.SubElement(path, 'from', attrib={'pathversion': "1"}).text = "smb://%s/" % server - topath = "smb://%s:%s@%s/" % (user, password, server) - etree.SubElement(path, 'to', attrib={'pathversion': "1"}).text = topath.replace("\\", ";") - # Force Kodi to see the credentials without restarting - xbmcvfs.exists(topath) - - # Add credentials - settings('networkCreds', value=server) - log.info("Added server: %s to passwords.xml" % server) - # Prettify and write to file - try: - indent(root) - except: pass - etree.ElementTree(root).write(xmlpath) - - dialog.notification( - heading=language(29999), - message="%s %s" % (language(33081), server), - icon="special://home/addons/plugin.video.emby/icon.png", - time=1000, - sound=False) - def verify_advancedsettings(): # Track the existance of true # incompatible with plugin paths diff --git a/resources/lib/player.py b/resources/lib/player.py index d53844c8..b05b182d 100644 --- a/resources/lib/player.py +++ b/resources/lib/player.py @@ -364,519 +364,3 @@ class Player(xbmc.Player): window('emby.external_check', clear=True) self.played.clear() - - - - - - - -""" -# -*- coding: utf-8 -*- - -################################################################################################# - -import json -import logging - -import xbmc -import xbmcvfs -import xbmcgui - -import clientinfo -import downloadutils -import read_embyserver as embyserver -import websocket_client as wsc -from utils import window, settings, language as lang, JSONRPC -from ga_client import GoogleAnalytics, log_error - -################################################################################################# - -log = logging.getLogger("EMBY."+__name__) - -################################################################################################# - - -class Player(xbmc.Player): - - # Borg - multiple instances, shared state - _shared_state = {} - - played_info = {} - currentFile = None - - - def __init__(self): - - self.__dict__ = self._shared_state - - self.clientInfo = clientinfo.ClientInfo() - self.doUtils = downloadutils.DownloadUtils().downloadUrl - self.emby = embyserver.Read_EmbyServer() - self.ws = wsc.WebSocketClient() - self.xbmcplayer = xbmc.Player() - - log.debug("Starting playback monitor.") - xbmc.Player.__init__(self) - - def set_audio_subs(self, audio_index=None, subs_index=None): - - ''' Only for after playback started - ''' - player = xbmc.Player() - log.info("Setting audio: %s subs: %s", audio_index, subs_index) - - if audio_index and len(player.getAvailableAudioStreams()) > 1: - player.setAudioStream(audio_index - 1) - - if subs_index: - mapping = window('emby_%s.indexMapping.json' % self.current_file) - - if subs_index == -1: - player.showSubtitles(False) - - elif mapping: - external_index = mapping - # If there's external subtitles added via playbackutils - for index in external_index: - if external_index[index] == subs_index: - player.setSubtitleStream(int(index)) - break - else: - # User selected internal subtitles - external = len(external_index) - audio_tracks = len(player.getAvailableAudioStreams()) - player.setSubtitleStream(external + subs_index - audio_tracks - 1) - else: - # Emby merges audio and subtitle index together - audio_tracks = len(player.getAvailableAudioStreams()) - player.setSubtitleStream(subs_index - audio_tracks - 1) - - @log_error() - def onPlayBackStarted(self): - # Will be called when xbmc starts playing a file - self.stopAll() - - # Get current file - try: - currentFile = self.xbmcplayer.getPlayingFile() - xbmc.sleep(300) - except: - currentFile = "" - count = 0 - while not currentFile: - xbmc.sleep(100) - try: - currentFile = self.xbmcplayer.getPlayingFile() - except: pass - - if count == 5: # try 5 times - log.info("Cancelling playback report...") - break - else: count += 1 - - # if we did not get the current file return - if currentFile == "": - return - - # process the playing file - self.currentFile = currentFile - - # We may need to wait for info to be set in kodi monitor - item = window('emby_%s.json' % currentFile) - #itemId = window("emby_%s.itemid" % currentFile) - tryCount = 0 - while not item: - - xbmc.sleep(200) - item = window('emby_%s.json' % currentFile) - if tryCount == 20: # try 20 times or about 10 seconds - log.info("Could not find item, cancelling playback report...") - break - else: tryCount += 1 - - else: - item_id = item.get('id') - log.info("ONPLAYBACK_STARTED: %s itemid: %s", currentFile.decode('utf-8'), item_id) - - # Only proceed if an itemId was found. - runtime = item.get('runtime') - refresh_id = item.get('refreshid') - play_method = item.get('playmethod') - item_type = item.get('type') - playsession_id = item.get('playsession_id') - mediasource_id = item.get('mediasource_id') - - - #self.set_audio_subs(item.get('forcedaudio'), item.get('forcedsubs')) - - # Prevent manually mark as watched in Kodi monitor - window('emby.skip.%s' % item_id, value="true") - - customseek = window('emby_customPlaylist.seektime') - if window('emby_customPlaylist') == "true" and customseek: - # Start at, when using custom playlist (play to Kodi from webclient) - log.info("Seeking to: %s", customseek) - self.xbmcplayer.seekTime(int(customseek)/10000000.0) - window('emby_customPlaylist.seektime', clear=True) - - try: - seekTime = self.xbmcplayer.getTime() - except: - # at this point we should be playing and if not then bail out - return - - # Get playback volume - result = JSONRPC('Application.GetProperties').execute({'properties': ["volume", "muted"]}) - result = result.get('result') - - volume = result.get('volume') - muted = result.get('muted') - - # Postdata structure to send to Emby server - url = "{server}/emby/Sessions/Playing" - postdata = { - - 'QueueableMediaTypes': "Video,Audio", - 'CanSeek': True, - 'ItemId': item_id, - 'MediaSourceId': mediasource_id or item_id, - 'PlayMethod': play_method, - 'VolumeLevel': volume, - 'PositionTicks': int(seekTime * 10000000), - 'IsMuted': muted, - 'PlaySessionId': playsession_id - } - - # Get the current audio track and subtitles - if play_method == "Transcode": - # property set in PlayUtils.py - postdata['AudioStreamIndex'] = window("%sAudioStreamIndex" % currentFile) - postdata['SubtitleStreamIndex'] = window("%sSubtitleStreamIndex" % currentFile) - else: - # Get the current kodi audio and subtitles and convert to Emby equivalent - params = { - 'playerid': 1, - 'properties': ["currentsubtitle","currentaudiostream","subtitleenabled"] - } - result = JSONRPC('Player.GetProperties').execute(params) - tracks_data = None - try: - tracks_data = json.loads(result) - tracks_data = tracks_data.get('result') - except: - tracks_data = None - - try: # Audio tracks - indexAudio = tracks_data['currentaudiostream']['index'] - except: - indexAudio = 0 - - try: # Subtitles tracks - indexSubs = tracks_data['currentsubtitle']['index'] - except: - indexSubs = 0 - - try: # If subtitles are enabled - subsEnabled = tracks_data['subtitleenabled'] - except: - subsEnabled = "" - - # Postdata for the audio - postdata['AudioStreamIndex'] = indexAudio + 1 - - # Postdata for the subtitles - if subsEnabled and len(xbmc.Player().getAvailableSubtitleStreams()) > 0: - - # Number of audiotracks to help get Emby Index - audioTracks = len(xbmc.Player().getAvailableAudioStreams()) - mapping = window("emby_%s.indexMapping" % currentFile) - - if mapping: # Set in playbackutils.py - - log.debug("Mapping for external subtitles index: %s", mapping) - externalIndex = json.loads(mapping) - - if externalIndex.get(str(indexSubs)): - # If the current subtitle is in the mapping - postdata['SubtitleStreamIndex'] = externalIndex[str(indexSubs)] - else: - # Internal subtitle currently selected - subindex = indexSubs - len(externalIndex) + audioTracks + 1 - postdata['SubtitleStreamIndex'] = subindex - - else: # Direct paths enabled scenario or no external subtitles set - postdata['SubtitleStreamIndex'] = indexSubs + audioTracks + 1 - else: - postdata['SubtitleStreamIndex'] = "" - - - # Post playback to server - log.debug("Sending POST play started: %s.", postdata) - self.doUtils(url, postBody=postdata, action_type="POST") - - # Ensure we do have a runtime - try: - runtime = int(runtime) - except ValueError: - try: - runtime = int(self.xbmcplayer.getTotalTime()) - log.info("Runtime is missing, Kodi runtime: %s" % runtime) - except: - runtime = 0 - log.info("Runtime is missing, Using Zero") - - # Save data map for updates and position calls - data = { - - 'runtime': runtime, - 'item_id': item_id, - 'mediasource_id': mediasource_id, - 'refresh_id': refresh_id, - 'currentfile': currentFile, - 'AudioStreamIndex': postdata['AudioStreamIndex'], - 'SubtitleStreamIndex': postdata['SubtitleStreamIndex'], - 'playmethod': play_method, - 'Type': item_type, - 'currentPosition': int(seekTime), - 'playsession_id': playsession_id - } - - self.played_info[currentFile] = data - log.info("ADDING_FILE: %s", self.played_info) - - ga = GoogleAnalytics() - ga.sendEventData("PlayAction", item_type, play_method) - ga.sendScreenView(item_type) - - def reportPlayback(self): - - log.debug("reportPlayback Called") - - # Get current file - currentFile = self.currentFile - data = self.played_info.get(currentFile) - - # only report playback if emby has initiated the playback (item_id has value) - if data: - # Get playback information - itemId = data['item_id'] - audioindex = data['AudioStreamIndex'] - subtitleindex = data['SubtitleStreamIndex'] - playTime = data['currentPosition'] - playMethod = data['playmethod'] - paused = data.get('paused', False) - playsession_id = data.get('playsession_id') - mediasource_id = data.get('mediasource_id') - - - # Get playback volume - result = JSONRPC('Application.GetProperties').execute({'properties': ["volume", "muted"]}) - result = result.get('result') - - volume = result.get('volume') - muted = result.get('muted') - - # Postdata for the websocketclient report - postdata = { - - 'QueueableMediaTypes': "Video", - 'CanSeek': True, - 'ItemId': itemId, - 'MediaSourceId': mediasource_id or itemId, - 'PlayMethod': playMethod, - 'PositionTicks': int(playTime * 10000000), - 'IsPaused': paused, - 'VolumeLevel': volume, - 'IsMuted': muted, - 'PlaySessionId': playsession_id - } - - if playMethod == "Transcode": - # Track can't be changed, keep reporting the same index - postdata['AudioStreamIndex'] = audioindex - postdata['AudioStreamIndex'] = subtitleindex - - else: - # Get current audio and subtitles track - params = { - 'playerid': 1, - 'properties': ["currentsubtitle","currentaudiostream","subtitleenabled"] - } - result = JSONRPC('Player.GetProperties').execute(params) - result = result.get('result') - - try: # Audio tracks - indexAudio = result['currentaudiostream']['index'] - except (KeyError, TypeError): - indexAudio = 0 - - try: # Subtitles tracks - indexSubs = result['currentsubtitle']['index'] - except (KeyError, TypeError): - indexSubs = 0 - - try: # If subtitles are enabled - subsEnabled = result['subtitleenabled'] - except (KeyError, TypeError): - subsEnabled = "" - - # Postdata for the audio - data['AudioStreamIndex'], postdata['AudioStreamIndex'] = [indexAudio + 1] * 2 - - # Postdata for the subtitles - if subsEnabled and len(xbmc.Player().getAvailableSubtitleStreams()) > 0: - - # Number of audiotracks to help get Emby Index - audioTracks = len(xbmc.Player().getAvailableAudioStreams()) - mapping = window("emby_%s.indexMapping" % currentFile) - - if mapping: # Set in PlaybackUtils.py - - log.debug("Mapping for external subtitles index: %s" % mapping) - externalIndex = json.loads(mapping) - - if externalIndex.get(str(indexSubs)): - # If the current subtitle is in the mapping - subindex = [externalIndex[str(indexSubs)]] * 2 - data['SubtitleStreamIndex'], postdata['SubtitleStreamIndex'] = subindex - else: - # Internal subtitle currently selected - subindex = [indexSubs - len(externalIndex) + audioTracks + 1] * 2 - data['SubtitleStreamIndex'], postdata['SubtitleStreamIndex'] = subindex - - else: # Direct paths enabled scenario or no external subtitles set - subindex = [indexSubs + audioTracks + 1] * 2 - data['SubtitleStreamIndex'], postdata['SubtitleStreamIndex'] = subindex - else: - data['SubtitleStreamIndex'], postdata['SubtitleStreamIndex'] = [""] * 2 - - # Report progress via websocketclient - log.debug("Report: %s", postdata) - self.emby.progress_report(postdata) - - - @log_error() - def onPlayBackSeek(self, time, seekOffset): - # Make position when seeking a bit more accurate - currentFile = self.currentFile - log.debug("PLAYBACK_SEEK: %s" % currentFile) - - if self.played_info.get(currentFile): - position = None - try: - position = self.xbmcplayer.getTime() - except: - pass - - if position is not None: - self.played_info[currentFile]['currentPosition'] = position - self.reportPlayback() - - def stopAll(self): - - if not self.played_info: - return - - log.info("Played_information: %s" % self.played_info) - # Process each items - for item in self.played_info: - - data = self.played_info.get(item) - if data: - - log.debug("Item path: %s" % item) - log.debug("Item data: %s" % data) - - runtime = data['runtime'] - currentPosition = data['currentPosition'] - itemid = data['item_id'] - refresh_id = data['refresh_id'] - currentFile = data['currentfile'] - media_type = data['Type'] - playMethod = data['playmethod'] - - self.stop_playback(data) - - if currentPosition and runtime: - try: - if window('emby.external'): - window('emby.external', clear=True) - raise ValueError - - percentComplete = (currentPosition * 10000000) / int(runtime) - except ZeroDivisionError: - # Runtime is 0. - percentComplete = 0 - except ValueError: - percentComplete = 100 - - markPlayedAt = float(settings('markPlayed')) / 100 - log.info("Percent complete: %s Mark played at: %s" - % (percentComplete, markPlayedAt)) - - # Send the delete action to the server. - offerDelete = False - - if media_type == "Episode" and settings('deleteTV') == "true": - offerDelete = True - elif media_type == "Movie" and settings('deleteMovies') == "true": - offerDelete = True - - if settings('offerDelete') != "true": - # Delete could be disabled, even if the subsetting is enabled. - offerDelete = False - - if percentComplete >= markPlayedAt and offerDelete: - resp = xbmcgui.Dialog().yesno(lang(30091), lang(33015), autoclose=120000) - if resp: - url = "{server}/emby/Items/%s?format=json" % itemid - log.info("Deleting request: %s" % itemid) - self.doUtils(url, action_type="DELETE") - else: - log.info("User skipped deletion.") - - window('emby.external_check', clear=True) - - ##### Track end of playlist - if media_type == "Audio": - playlist = xbmc.PlayList(xbmc.PLAYLIST_MUSIC) - else: - playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) - - if int(playlist.getposition()) < 0: - ''' If playback is stopped within the first 30 seconds, - Kodi doesn't consider this watched and playlist should not be cleared. - When the end is reached, position is -1. - ''' - log.info("Clear playlist, end detected.") - playlist.clear() - - path = xbmc.translatePath( - "special://profile/addon_data/plugin.video.emby/temp/").decode('utf-8') - - dirs, files = xbmcvfs.listdir(path) - for file in files: - xbmcvfs.delete("%s%s" % (path, file)) - - self.played_info.clear() - - ga = GoogleAnalytics() - ga.sendEventData("PlayAction", "Stopped") - - def stop_playback(self, data): - - log.info("stop playback called.") - - position_ticks = int(data['currentPosition'] * 10000000) - position = data['runtime'] if position_ticks and window('emby.external') else position_ticks - - self.emby.stop_playback(data['item_id'], position, data['playsession_id'], data.get('mediasource_id')) - - # Stop transcode - if data['playmethod'] == "Transcode": - log.info("Transcoding for %s terminated." % data['item_id']) - url = "{server}/emby/Videos/ActiveEncodings?DeviceId=%s" % self.clientInfo.get_device_id() - self.doUtils(url, action_type="DELETE") - -""" diff --git a/resources/lib/views.py b/resources/lib/views.py index f38623fa..6e120d95 100644 --- a/resources/lib/views.py +++ b/resources/lib/views.py @@ -121,8 +121,7 @@ class Views(object): def get_views(self): - ''' Get all views and the media folders that make up the views. - Add custom views that are not media folders but should still be added + ''' Get the media folders. Add or remove them. ''' media = { 'movies': "Movie", diff --git a/service.py b/service.py index e9c62522..a57ef191 100644 --- a/service.py +++ b/service.py @@ -31,7 +31,7 @@ DELAY = int(settings('startupDelay') or 0) if __name__ == "__main__": - LOG.info("--->[ service ]") + LOG.warn("--->[ service ]") LOG.warn("Delay startup by %s seconds.", DELAY) session = Service() @@ -46,4 +46,4 @@ if __name__ == "__main__": LOG.exception(error) session.shutdown() - LOG.info("---<[ service ]") + LOG.warn("---<[ service ]")