def show_legal_warning(settings_obj): shown = settings_obj.get_legal_warning_shown() if not shown: settings_obj.set_legal_warning_shown(True) d = xbmcgui.Dialog() l1 = 'Spotimc uses SPOTIFY(R) CORE but is not endorsed,' l2 = 'certified or otherwise approved in any way by Spotify.' hide_busy_dialog() d.ok('Spotimc', l1, l2) show_busy_dialog()
def check_addon_version(settings_obj): last_run_version = settings_obj.get_last_run_version() #If current version is higher than the stored one... if __addon_version__ > last_run_version: settings_obj.set_last_run_version(__addon_version__) #Don't display the upgrade message if it's the first run if last_run_version != '': d = xbmcgui.Dialog() l1 = 'Spotimc was updated since the last run.' l2 = 'Do you want to see the changelog?' hide_busy_dialog() if d.yesno('Spotimc', l1, l2): file = settings_obj.get_addon_obj().getAddonInfo('changelog') changelog = open(file).read() dialogs.text_viewer_dialog('ChangeLog', changelog) show_busy_dialog()
def main(): setup_logging() #Look busy while everything gets initialized show_busy_dialog() #Surround the rest of the init process try: #Set font & include manager vars fm = None im = None #And perform the rest of the import statements from utils.environment import set_dll_paths from skinutils import reload_skin from skinutils.fonts import FontManager from skinutils.includes import IncludeManager from _spotify import unload_library #Add the system specific library path set_dll_paths('resources/dlls') #Install custom fonts fm = FontManager() skin_dir = os.path.join(__addon_path__, "resources/skins/DefaultSkin") xml_path = os.path.join(skin_dir, "720p/font.xml") font_dir = os.path.join(skin_dir, "fonts") fm.install_file(xml_path, font_dir) #Install custom includes im = IncludeManager() include_path = os.path.join(skin_dir, "720p/includes.xml") im.install_file(include_path) reload_skin() #Show the busy dialog again after reload_skin(), as it may go away show_busy_dialog() #Load & start the actual gui, no init code beyond this point gui_main(__addon_path__) show_busy_dialog() #Do a final garbage collection after main gc.collect() #from _spotify.utils.moduletracker import _tracked_modules #print "tracked modules after: %d" % len(_tracked_modules) #import objgraph #objgraph.show_backrefs(_tracked_modules, max_depth=5) except (SystemExit, Exception) as ex: if str(ex) != '': dlg = xbmcgui.Dialog() dlg.ok(ex.__class__.__name__, str(ex)) traceback.print_exc() finally: unload_library("libspotify") #Cleanup includes and fonts if im is not None: del im if fm is not None: del fm #Close the background loading window #loadingwin.close() hide_busy_dialog()
def gui_main(addon_dir): #Initialize app var storage app = Application() logout_event = Event() connstate_event = Event() info_value_manager = InfoValueManager() app.set_var('logout_event', logout_event) app.set_var('login_last_error', ErrorType.Ok) app.set_var('connstate_event', connstate_event) app.set_var('exit_requested', False) app.set_var('info_value_manager', info_value_manager) #Check needed directories first data_dir, cache_dir, settings_dir = check_dirs() #Instantiate the settings obj settings_obj = SettingsManager() #Show legal warning show_legal_warning(settings_obj) #Start checking the version check_addon_version(settings_obj) #Don't set cache folder if it's disabled if not settings_obj.get_cache_status(): cache_dir = '' #Initialize spotify stuff ml = MainLoop() buf = BufferManager(get_audio_buffer_size()) callbacks = SpotimcCallbacks(ml, buf, app) sess = Session( callbacks, app_key=appkey, user_agent="python ctypes bindings", settings_location=settings_dir, cache_location=cache_dir, initially_unload_playlists=False, ) #Now that we have a session, set settings set_settings(settings_obj, sess) #Initialize libspotify's main loop handler on a separate thread ml_runner = MainLoopRunner(ml, sess) ml_runner.start() #Stay on the application until told to do so while not app.get_var('exit_requested'): #Set the exit flag if login was cancelled if not do_login(sess, addon_dir, "DefaultSkin", app): app.set_var('exit_requested', True) #Otherwise block until state is sane, and continue elif wait_for_connstate(sess, app, ConnectionState.LoggedIn): proxy_runner = ProxyRunner(sess, buf, host='127.0.0.1', allow_ranges=True) proxy_runner.start() log_str = 'starting proxy at port {0}'.format( proxy_runner.get_port()) get_logger().info(log_str) #Instantiate the playlist manager playlist_manager = playback.PlaylistManager(proxy_runner) app.set_var('playlist_manager', playlist_manager) #Set the track preloader callback preloader_cb = get_preloader_callback(sess, playlist_manager, buf) proxy_runner.set_stream_end_callback(preloader_cb) hide_busy_dialog() mainwin = windows.MainWindow("main-window.xml", addon_dir, "DefaultSkin") mainwin.initialize(sess, proxy_runner, playlist_manager, app) app.set_var('main_window', mainwin) mainwin.doModal() show_busy_dialog() #Playback and proxy deinit sequence proxy_runner.clear_stream_end_callback() playlist_manager.stop() proxy_runner.stop() buf.cleanup() #Join all the running tasks tm = TaskManager() tm.cancel_all() #Clear some vars and collect garbage proxy_runner = None preloader_cb = None playlist_manager = None mainwin = None app.remove_var('main_window') app.remove_var('playlist_manager') gc.collect() #Logout if sess.user() is not None: sess.logout() logout_event.wait(10) #Stop main loop ml_runner.stop() #Some deinitializations info_value_manager.deinit()