diff --git a/src/app-configuration.defaults b/src/app-configuration.defaults index 4939c87e..9952ef2d 100644 --- a/src/app-configuration.defaults +++ b/src/app-configuration.defaults @@ -6,6 +6,9 @@ ignored_sessions = list(default=list()) [app-settings] language = string(default="system") hide_gui = boolean(default=False) +use_slow_audio_algo = boolean(default=False) +use_Codeofdusk_audio_handlers = boolean(default=False) +prefer_geocodes = boolean(default=False) voice_enabled = boolean(default=False) ask_at_exit = boolean(default=True) use_invisible_keyboard_shorcuts = boolean(default=True) diff --git a/src/controller/buffersController.py b/src/controller/buffersController.py index 4d660219..e155b63b 100644 --- a/src/controller/buffersController.py +++ b/src/controller/buffersController.py @@ -81,29 +81,6 @@ class bufferController(object): if hasattr(sound.URLPlayer, "stream"): sound.URLPlayer.stream.volume = self.session.settings["sound"]["volume"] self.session.sound.play("volume_changed.ogg") - - def interact(self): - if hasattr(sound.URLPlayer,'stream'): - return sound.URLPlayer.stop_audio(delete=True) - tweet = self.get_tweet() - url=None - urls = utils.find_urls(tweet) - if len(urls) == 1: - url=urls[0] - elif len(urls) > 1: - urls_list = dialogs.urlList.urlList() - urls_list.populate_list(urls) - if urls_list.get_response() == widgetUtils.OK: - url=urls_list.get_string() - if hasattr(urls_list, "destroy"): urls_list.destroy() - if url != None: - output.speak(_(u"Opening media..."), True) - if sound.URLPlayer.is_playable(url=url, play=True, volume=self.session.settings["sound"]["volume"]) == False: - return webbrowser.open_new_tab(url) -# else: -# output.speak(_(u"Not actionable."), True) -# self.session.sound.play("error.ogg") - def start_stream(self): pass diff --git a/src/controller/mainController.py b/src/controller/mainController.py index e2e55976..43883758 100644 --- a/src/controller/mainController.py +++ b/src/controller/mainController.py @@ -992,11 +992,44 @@ class Controller(object): def interact(self): "Select the best action for the currently focused tweet (audio, geocode, URL, etc)." buffer = self.get_current_buffer() - buffer.interact() + if hasattr(sound.URLPlayer,'stream') and config.app['app-settings']['use_Codeofdusk_audio_handlers']: + return sound.URLPlayer.stop_audio(delete=True) + tweet = buffer.get_tweet() + if utils.is_geocoded(tweet) and config.app['app-settings']['use_Codeofdusk_audio_handlers'] and config.app['app-settings']['prefer_geocodes']: + return self.reverse_geocode() + if config.app['app-settings']['use_Codeofdusk_audio_handlers'] == False: + return buffer.url() + url=None + urls = utils.find_urls(tweet) + if len(urls) == 1: + url=urls[0] + elif len(urls) > 1: + urls_list = dialogs.urlList.urlList() + urls_list.populate_list(urls) + if urls_list.get_response() == widgetUtils.OK: + url=urls_list.get_string() + if hasattr(urls_list, "destroy"): urls_list.destroy() + if url != None: + output.speak("Opening media...",True) + if sound.URLPlayer.is_playable(url=url,play=True,volume=buffer.session.settings["sound"]["volume"]) == False: + return webbrowser.open_new_tab(url) + else: + output.speak(_(u"Not actionable."), True) + buffer.session.sound.play("error.ogg") + + def secondary_interact(self): + buffer = self.get_current_buffer() + tweet=buffer.get_tweet() + if utils.is_geocoded(tweet) and config.app['app-settings']['use_Codeofdusk_audio_handlers'] and config.app['app-settings']['prefer_geocodes']: + return self.view_reverse_geocode() + elif config.app['app-settings']['use_Codeofdusk_audio_handlers']: + return buffer.url() + else: + return buffer.audio() def url(self, *args, **kwargs): buffer = self.get_current_buffer() - buffer.url() + return buffer.url() def audio(self, *args, **kwargs): self.get_current_buffer().audio() diff --git a/src/controller/settings.py b/src/controller/settings.py index dfb61059..2eedff7a 100644 --- a/src/controller/settings.py +++ b/src/controller/settings.py @@ -60,6 +60,9 @@ class globalSettingsController(object): self.dialog.set_value("general", "use_invisible_shorcuts", config.app["app-settings"]["use_invisible_keyboard_shorcuts"]) self.dialog.set_value("general", "disable_sapi5", config.app["app-settings"]["voice_enabled"]) self.dialog.set_value("general", "hide_gui", config.app["app-settings"]["hide_gui"]) + self.dialog.set_value("general", "use_slow_audio_algo", config.app["app-settings"]["use_slow_audio_algo"]) + self.dialog.set_value("general", "use_Codeofdusk_audio_handlers", config.app["app-settings"]["use_Codeofdusk_audio_handlers"]) + self.dialog.set_value("general", "prefer_geocodes", config.app["app-settings"]["prefer_geocodes"]) self.dialog.create_proxy() self.dialog.set_value("proxy", "server", config.app["proxy"]["server"]) self.dialog.set_value("proxy", "port", config.app["proxy"]["port"]) @@ -84,7 +87,12 @@ class globalSettingsController(object): config.app["app-settings"]["hide_gui"] = self.dialog.get_value("general", "hide_gui") config.app["app-settings"]["ask_at_exit"] = self.dialog.get_value("general", "ask_at_exit") config.app["app-settings"]["play_ready_sound"] = self.dialog.get_value("general", "play_ready_sound") + config.app["app-settings"]["use_Codeofdusk_audio_handlers"] = self.dialog.get_value("general", "use_Codeofdusk_audio_handlers") + config.app["app-settings"]["prefer_geocodes"] = self.dialog.get_value("general", "prefer_geocodes") config.app["app-settings"]["speak_ready_msg"] = self.dialog.get_value("general", "speak_ready_msg") + if config.app["app-settings"]["use_slow_audio_algo"] != self.dialog.get_value("general", "use_invisible_shorcuts"): + config.app["app-settings"]["use_slow_audio_algo"] = self.dialog.get_value("general", "use_invisible_shorcuts") + self.needs_restart=True if config.app["proxy"]["server"] != self.dialog.get_value("proxy", "server") or config.app["proxy"]["port"] != self.dialog.get_value("proxy", "port") or config.app["proxy"]["user"] != self.dialog.get_value("proxy", "user") or config.app["proxy"]["password"] != self.dialog.get_value("proxy", "password"): if self.is_started == True: self.needs_restart = True diff --git a/src/keymaps/default.keymap b/src/keymaps/default.keymap index 61f9ebf1..bab3716e 100644 --- a/src/keymaps/default.keymap +++ b/src/keymaps/default.keymap @@ -24,8 +24,9 @@ view_item = control+win+v exit = control+win+f4 open_timeline = control+win+i remove_buffer = control+win+shift+i -interact = control+alt+win+return -url = control+win+return +interact = control+win+return +secondary_interact = control+alt+win+return + volume_up = control+win+alt+up volume_down = control+win+alt+down go_home = control+win+home diff --git a/src/twitter/utils.py b/src/twitter/utils.py index 8bd7f2b7..1c5ddc6c 100644 --- a/src/twitter/utils.py +++ b/src/twitter/utils.py @@ -44,16 +44,34 @@ def find_next_reply(id, listItem): if listItem[i]["in_reply_to_status_id_str"] == str(id): return i return None -def is_audio(tweet): +def is_audio(tweet,force=False): + if force == False and 'is_audio' in tweet: + return tweet['is_audio'] try: if len(find_urls(tweet)) < 1: + tweet['is_audio']=False return False + if len(tweet["entities"]["hashtags"]) > 0: for i in tweet["entities"]["hashtags"]: if i["text"] == "audio": + tweet['is_audio']=True return True except: log.exception("Exception while executing is_audio hashtag algorithm") + try: + if config.app["app-settings"]["use_slow_audio_algo"]: + for u in find_urls(tweet): + if url_is_audio(u): + tweet['is_audio']=True + return True + except: + log.exception("Exception while executing is_audio Codeofdusk algorithm.") + tweet['is_audio']=False + return False + +def url_is_audio(u): + return sound.URLPlayer.is_playable(u) def is_geocoded(tweet): if tweet.has_key("coordinates") and tweet["coordinates"] != None: diff --git a/src/wxUI/dialogs/configuration.py b/src/wxUI/dialogs/configuration.py index c6b6f100..f35c4994 100644 --- a/src/wxUI/dialogs/configuration.py +++ b/src/wxUI/dialogs/configuration.py @@ -30,6 +30,12 @@ class general(wx.Panel, baseDialog.BaseWXDialog): sizer.Add(self.disable_sapi5, 0, wx.ALL, 5) self.hide_gui = wx.CheckBox(self, -1, _(u"Hide GUI on launch")) sizer.Add(self.hide_gui, 0, wx.ALL, 5) + self.use_slow_audio_algo = wx.CheckBox(self, -1, _(u"Use slow audio tweet detection algorithm (increases audio tweet detection accuracy at the cost of significantly reduced client performance)")) + sizer.Add(self.use_slow_audio_algo, 0, wx.ALL, 5) + self.use_Codeofdusk_audio_handlers = wx.CheckBox(self, -1, _(u"Use Codeofdusk's tweet interaction handlers (intelegently handle audio and geotweets, but may impact client performance on very slow connections)")) + sizer.Add(self.use_Codeofdusk_audio_handlers, 0, wx.ALL, 5) + self.prefer_geocodes = wx.CheckBox(self, -1, _(u"Codeofdusk's tweet interaction handlers: always display geocode on interact, even if the tweet contains URLs")) + sizer.Add(self.prefer_geocodes, 0, wx.ALL, 5) kmbox = wx.BoxSizer(wx.VERTICAL) km_label = wx.StaticText(self, -1, _(u"Keymap")) self.km = wx.ComboBox(self, -1, choices=keymaps, style=wx.CB_READONLY)