From 6232ec3b7cddb7f3d4bba17e7409d5a84095cc01 Mon Sep 17 00:00:00 2001
From: Bill Dengler <codeofdusk@gmail.com>
Date: Wed, 10 Jun 2015 17:29:26 -0400
Subject: [PATCH 1/5] Fix utils.

---
 src/twitter/utils.py | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

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:

From 28e0edf2a568418967a4fb1d504c455228e8cf6a Mon Sep 17 00:00:00 2001
From: Bill Dengler <codeofdusk@gmail.com>
Date: Wed, 10 Jun 2015 17:53:28 -0400
Subject: [PATCH 2/5] Fixed controler.

---
 src/controller/buffersController.py | 22 ------------------
 src/controller/mainController.py    | 36 +++++++++++++++++++++++++++--
 src/controller/settings.py          |  8 +++++++
 3 files changed, 42 insertions(+), 24 deletions(-)

diff --git a/src/controller/buffersController.py b/src/controller/buffersController.py
index 4415f0f1..90bc2c1a 100644
--- a/src/controller/buffersController.py
+++ b/src/controller/buffersController.py
@@ -82,28 +82,6 @@ class bufferController(object):
    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 7e008d78..7651c89f 100644
--- a/src/controller/mainController.py
+++ b/src/controller/mainController.py
@@ -992,11 +992,43 @@ 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()
+  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 config.app['app-settings']['use_Codeofdusk_audio_handlers']:
+    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..f9b02202 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

From 3d748e5c1e3bbd4a26afa438ec242a1aa826c4a4 Mon Sep 17 00:00:00 2001
From: Bill Dengler <codeofdusk@gmail.com>
Date: Wed, 10 Jun 2015 18:12:39 -0400
Subject: [PATCH 3/5] Fix WX view.

---
 src/wxUI/dialogs/configuration.py | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/wxUI/dialogs/configuration.py b/src/wxUI/dialogs/configuration.py
index 085809e1..ececb701 100644
--- a/src/wxUI/dialogs/configuration.py
+++ b/src/wxUI/dialogs/configuration.py
@@ -29,6 +29,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)

From 63615e41b8ee13d50b6158cb271fa09c2459de1f Mon Sep 17 00:00:00 2001
From: Bill Dengler <codeofdusk@gmail.com>
Date: Wed, 10 Jun 2015 18:20:00 -0400
Subject: [PATCH 4/5] Fix default keymap.

---
 src/keymaps/default.keymap | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

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

From 90e067572db2f120f8fec215816b29cae541fbd5 Mon Sep 17 00:00:00 2001
From: Bill Dengler <codeofdusk@gmail.com>
Date: Wed, 10 Jun 2015 18:34:06 -0400
Subject: [PATCH 5/5] Fixes.

---
 src/app-configuration.defaults    | 3 +++
 src/controller/mainController.py  | 7 ++++---
 src/controller/settings.py        | 4 ++--
 src/wxUI/dialogs/configuration.py | 4 ++--
 4 files changed, 11 insertions(+), 7 deletions(-)

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/mainController.py b/src/controller/mainController.py
index 7651c89f..bd25279b 100644
--- a/src/controller/mainController.py
+++ b/src/controller/mainController.py
@@ -997,6 +997,8 @@ class Controller(object):
   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:
@@ -1009,9 +1011,8 @@ class Controller(object):
    if hasattr(urls_list, "destroy"): urls_list.destroy()
   if url != None:
    output.speak("Opening media...",True)
-   if config.app['app-settings']['use_Codeofdusk_audio_handlers']:
-    if sound.URLPlayer.is_playable(url=url,play=True,volume=buffer.session.settings["sound"]["volume"]) == False:
-     return webbrowser.open_new_tab(url)
+   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")
diff --git a/src/controller/settings.py b/src/controller/settings.py
index f9b02202..2eedff7a 100644
--- a/src/controller/settings.py
+++ b/src/controller/settings.py
@@ -61,7 +61,7 @@ class globalSettingsController(object):
   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", "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"])
@@ -87,7 +87,7 @@ 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"]["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"):
diff --git a/src/wxUI/dialogs/configuration.py b/src/wxUI/dialogs/configuration.py
index ececb701..1b5040a3 100644
--- a/src/wxUI/dialogs/configuration.py
+++ b/src/wxUI/dialogs/configuration.py
@@ -31,8 +31,8 @@ class general(wx.Panel, baseDialog.BaseWXDialog):
   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.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)