diff --git a/contextmenu.py b/contextmenu.py index 5e90058d..31323d4a 100644 --- a/contextmenu.py +++ b/contextmenu.py @@ -18,13 +18,8 @@ sys.path.append(_BASE_LIB) ################################################################################################# -import api import loghandler -import read_embyserver as embyserver -import embydb_functions as embydb -import musicutils as musicutils -from utils import settings, dialog, language as lang, kodiSQL -from dialogs import context +from context_entry import ContextMenu ################################################################################################# @@ -33,181 +28,10 @@ log = logging.getLogger("EMBY.contextmenu") ################################################################################################# -OPTIONS = { +if __name__ == "__main__": - 'Refresh': lang(30410), - 'Delete': lang(30409), - 'Addon': lang(30408), - 'AddFav': lang(30405), - 'RemoveFav': lang(30406), - 'RateSong': lang(30407) -} - -class ContextMenu(object): - - _selected_option = None - - - def __init__(self): - - self.emby = embyserver.Read_EmbyServer() - - self.kodi_id = xbmc.getInfoLabel('ListItem.DBID').decode('utf-8') - self.item_type = self._get_item_type() - self.item_id = self._get_item_id(self.kodi_id, self.item_type) - - log.info("Found item_id: %s item_type: %s", self.item_id, self.item_type) - - if self.item_id: - - self.item = self.emby.getItem(self.item_id) - self.api = api.API(self.item) - - if self._select_menu(): - self._action_menu() - - xbmc.sleep(500) - xbmc.executebuiltin('Container.Refresh') - - @classmethod - def _get_item_type(cls): - - item_type = xbmc.getInfoLabel('ListItem.DBTYPE').decode('utf-8') - - if not item_type: - - if xbmc.getCondVisibility('Container.Content(albums)'): - item_type = "album" - elif xbmc.getCondVisibility('Container.Content(artists)'): - item_type = "artist" - elif xbmc.getCondVisibility('Container.Content(songs)'): - item_type = "song" - elif xbmc.getCondVisibility('Container.Content(pictures)'): - item_type = "picture" - else: - log.info("item_type is unknown") - - return item_type - - @classmethod - def _get_item_id(cls, kodi_id, item_type): - - item_id = xbmc.getInfoLabel('ListItem.Property(embyid)') - - if not item_id and kodi_id and item_type: - - conn = kodiSQL('emby') - cursor = conn.cursor() - emby_db = embydb.Embydb_Functions(cursor) - item = emby_db.getItem_byKodiId(kodi_id, item_type) - cursor.close() - try: - item_id = item[0] - except TypeError: - pass - - return item_id - - def _select_menu(self): - # Display select dialog - userdata = self.api.get_userdata() - options = [] - - if userdata['Favorite']: - # Remove from emby favourites - options.append(OPTIONS['RemoveFav']) - else: - # Add to emby favourites - options.append(OPTIONS['AddFav']) - - if self.item_type == "song": - # Set custom song rating - options.append(OPTIONS['RateSong']) - - # Refresh item - options.append(OPTIONS['Refresh']) - # Delete item - options.append(OPTIONS['Delete']) - # Addon settings - options.append(OPTIONS['Addon']) - - addon = xbmcaddon.Addon('plugin.video.emby') - XML_PATH = (addon.getAddonInfo('path'), "default", "1080i") - dialog = context.ContextMenu("script-emby-context.xml", *XML_PATH) - dialog.set_options(options) - dialog.doModal() - if dialog.is_selected(): - self._selected_option = dialog.get_selected() - - return self._selected_option - - def _action_menu(self): - - selected = self._selected_option - - if selected == OPTIONS['Refresh']: - self.emby.refreshItem(self.item_id) - - elif selected == OPTIONS['AddFav']: - self.emby.updateUserRating(self.item_id, favourite=True) - - elif selected == OPTIONS['RemoveFav']: - self.emby.updateUserRating(self.item_id, favourite=False) - - elif selected == OPTIONS['RateSong']: - self._rate_song() - - elif selected == OPTIONS['Addon']: - xbmc.executebuiltin('Addon.OpenSettings(plugin.video.emby)') - - elif selected == OPTIONS['Delete']: - self._delete_item() - - def _rate_song(self): - - conn = kodiSQL('music') - cursor = conn.cursor() - query = "SELECT rating FROM song WHERE idSong = ?" - cursor.execute(query, (self.kodi_id,)) - try: - value = cursor.fetchone()[0] - current_value = int(round(float(value), 0)) - except TypeError: - pass - else: - new_value = dialog("numeric", 0, lang(30411), str(current_value)) - if new_value > -1: - - new_value = int(new_value) - if new_value > 5: - new_value = 5 - - if settings('enableUpdateSongRating') == "true": - musicutils.updateRatingToFile(new_value, self.api.get_file_path()) - - query = "UPDATE song SET rating = ? WHERE idSong = ?" - cursor.execute(query, (new_value, self.kodi_id,)) - conn.commit() - finally: - cursor.close() - - def _delete_item(self): - - delete = True - if settings('skipContextMenu') != "true": - - if not dialog(type_="yesno", heading="{emby}", line1=lang(33041)): - log.info("User skipped deletion for: %s", self.item_id) - delete = False - - if delete: - log.info("Deleting request: %s", self.item_id) - self.emby.deleteItem(self.item_id) - - -# Kodi contextmenu item to configure the emby settings -if __name__ == '__main__': - - log.info("plugin.video.emby contextmenu started") - ContextMenu() - log.info("plugin.video.emby contextmenu stopped") + try: + # Start the context menu + ContextMenu() + except Exception as error: + log.exception(error) diff --git a/resources/lib/context_entry.py b/resources/lib/context_entry.py new file mode 100644 index 00000000..147b78cb --- /dev/null +++ b/resources/lib/context_entry.py @@ -0,0 +1,192 @@ +# -*- coding: utf-8 -*- + +################################################################################################# + +import logging + +import xbmc +import xbmcaddon + +import api +import read_embyserver as embyserver +import embydb_functions as embydb +import musicutils as musicutils +from utils import settings, dialog, language as lang, kodiSQL +from dialogs import context + +################################################################################################# + +log = logging.getLogger("EMBY."+__name__) +OPTIONS = { + + 'Refresh': lang(30410), + 'Delete': lang(30409), + 'Addon': lang(30408), + 'AddFav': lang(30405), + 'RemoveFav': lang(30406), + 'RateSong': lang(30407) +} + +################################################################################################# + + +class ContextMenu(object): + + _selected_option = None + + + def __init__(self): + + self.emby = embyserver.Read_EmbyServer() + + self.kodi_id = xbmc.getInfoLabel('ListItem.DBID').decode('utf-8') + self.item_type = self._get_item_type() + self.item_id = self._get_item_id(self.kodi_id, self.item_type) + + log.info("Found item_id: %s item_type: %s", self.item_id, self.item_type) + + if self.item_id: + + self.item = self.emby.getItem(self.item_id) + self.api = api.API(self.item) + + if self._select_menu(): + self._action_menu() + + xbmc.sleep(500) + xbmc.executebuiltin('Container.Refresh') + + @classmethod + def _get_item_type(cls): + + item_type = xbmc.getInfoLabel('ListItem.DBTYPE').decode('utf-8') + + if not item_type: + + if xbmc.getCondVisibility('Container.Content(albums)'): + item_type = "album" + elif xbmc.getCondVisibility('Container.Content(artists)'): + item_type = "artist" + elif xbmc.getCondVisibility('Container.Content(songs)'): + item_type = "song" + elif xbmc.getCondVisibility('Container.Content(pictures)'): + item_type = "picture" + else: + log.info("item_type is unknown") + + return item_type + + @classmethod + def _get_item_id(cls, kodi_id, item_type): + + item_id = xbmc.getInfoLabel('ListItem.Property(embyid)') + + if not item_id and kodi_id and item_type: + + conn = kodiSQL('emby') + cursor = conn.cursor() + emby_db = embydb.Embydb_Functions(cursor) + item = emby_db.getItem_byKodiId(kodi_id, item_type) + cursor.close() + try: + item_id = item[0] + except TypeError: + pass + + return item_id + + def _select_menu(self): + # Display select dialog + userdata = self.api.get_userdata() + options = [] + + if userdata['Favorite']: + # Remove from emby favourites + options.append(OPTIONS['RemoveFav']) + else: + # Add to emby favourites + options.append(OPTIONS['AddFav']) + + if self.item_type == "song": + # Set custom song rating + options.append(OPTIONS['RateSong']) + + # Refresh item + options.append(OPTIONS['Refresh']) + # Delete item + options.append(OPTIONS['Delete']) + # Addon settings + options.append(OPTIONS['Addon']) + + addon = xbmcaddon.Addon('plugin.video.emby') + XML_PATH = (addon.getAddonInfo('path'), "default", "1080i") + dialog = context.ContextMenu("script-emby-context.xml", *XML_PATH) + dialog.set_options(options) + dialog.doModal() + if dialog.is_selected(): + self._selected_option = dialog.get_selected() + + return self._selected_option + + def _action_menu(self): + + selected = self._selected_option + + if selected == OPTIONS['Refresh']: + self.emby.refreshItem(self.item_id) + + elif selected == OPTIONS['AddFav']: + self.emby.updateUserRating(self.item_id, favourite=True) + + elif selected == OPTIONS['RemoveFav']: + self.emby.updateUserRating(self.item_id, favourite=False) + + elif selected == OPTIONS['RateSong']: + self._rate_song() + + elif selected == OPTIONS['Addon']: + xbmc.executebuiltin('Addon.OpenSettings(plugin.video.emby)') + + elif selected == OPTIONS['Delete']: + self._delete_item() + + def _rate_song(self): + + conn = kodiSQL('music') + cursor = conn.cursor() + query = "SELECT rating FROM song WHERE idSong = ?" + cursor.execute(query, (self.kodi_id,)) + try: + value = cursor.fetchone()[0] + current_value = int(round(float(value), 0)) + except TypeError: + pass + else: + new_value = dialog("numeric", 0, lang(30411), str(current_value)) + if new_value > -1: + + new_value = int(new_value) + if new_value > 5: + new_value = 5 + + if settings('enableUpdateSongRating') == "true": + musicutils.updateRatingToFile(new_value, self.api.get_file_path()) + + query = "UPDATE song SET rating = ? WHERE idSong = ?" + cursor.execute(query, (new_value, self.kodi_id,)) + conn.commit() + finally: + cursor.close() + + def _delete_item(self): + + delete = True + if settings('skipContextMenu') != "true": + + if not dialog(type_="yesno", heading="{emby}", line1=lang(33041)): + log.info("User skipped deletion for: %s", self.item_id) + delete = False + + if delete: + log.info("Deleting request: %s", self.item_id) + self.emby.deleteItem(self.item_id)