mirror of
https://github.com/MCV-Software/TWBlue.git
synced 2025-08-26 01:49:22 +00:00
Compare commits
28 Commits
snapshot10
...
snapshot10
Author | SHA1 | Date | |
---|---|---|---|
70b5f25cf0 | |||
2b65b89afb | |||
44e8ed6456 | |||
792655e299 | |||
0f56d8cdd4 | |||
6c47dd2fa9 | |||
![]() |
49073bc151 | ||
![]() |
336acd9860 | ||
4daeeb7beb | |||
408ff50404 | |||
148c5176c6 | |||
bdb9de863f | |||
ce1f8b2cc3 | |||
5933323beb | |||
22b1b0a149 | |||
e71afeb10f | |||
98f026156d | |||
cbee57aa30 | |||
fd9e4dc05d | |||
6022cecad1 | |||
89e39e2168 | |||
a69bf99c1a | |||
d34ef81324 | |||
a3c050195a | |||
3623eafacd | |||
![]() |
2bd3f0a1d1 | ||
f1f828522e | |||
51e4898346 |
@@ -75,7 +75,7 @@ setuptools install a script, called easy_install. You can find it in the python
|
|||||||
|
|
||||||
easy_install will automatically get the additional libraries that these packages need to work properly.
|
easy_install will automatically get the additional libraries that these packages need to work properly.
|
||||||
Run the following command to quickly install and upgrade all packages and their dependencies:
|
Run the following command to quickly install and upgrade all packages and their dependencies:
|
||||||
easy_install -Z --upgrade six configobj goslate markdown future pocket suds requests oauthlib requests-oauthlib pypubsub pygeocoder arrow
|
easy_install -Z --upgrade six configobj goslate markdown future pocket suds requests oauthlib requests-oauthlib pypubsub pygeocoder arrow python-dateutil futures
|
||||||
|
|
||||||
#### Other dependencies
|
#### Other dependencies
|
||||||
|
|
||||||
|
@@ -405,19 +405,21 @@ documentation.append(_(u"""We would also like to thank the translators of TWBlue
|
|||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""* English: [Bryner Villalobos](https://twitter.com/Bry_StarkCR) and [Bill Dengler](https://twitter.com/codeofdusk)."""))
|
documentation.append(_(u"""* English: [Bryner Villalobos](https://twitter.com/Bry_StarkCR) and [Bill Dengler](https://twitter.com/codeofdusk)."""))
|
||||||
documentation.append(_(u"""* Arabic: Mohammed Al Shara."""))
|
documentation.append(_(u"""* Arabic: [Mohammed Al Shara](https://twitter.com/mohammed0204)."""))
|
||||||
documentation.append(_(u"""* Catalan: [Joan Rabat](https://twitter.com/joanrabat) and Juan Carlos Rivilla."""))
|
documentation.append(_(u"""* Catalan: [Joan Rabat](https://twitter.com/joanrabat) and Juan Carlos Rivilla."""))
|
||||||
documentation.append(_(u"""* Spanish: [Manuel Cortéz](https://twitter.com/manuelcortez00)."""))
|
documentation.append(_(u"""* Spanish: [Manuel Cortéz](https://twitter.com/manuelcortez00)."""))
|
||||||
documentation.append(_(u"""* Basque: [Sukil Etxenike](https://twitter.com/sukil2011)."""))
|
documentation.append(_(u"""* Basque: [Sukil Etxenike](https://twitter.com/sukil2011)."""))
|
||||||
documentation.append(_(u"""* Finnish: Jani Kinnunen."""))
|
documentation.append(_(u"""* Finnish: [Jani Kinnunen](https://twitter.com/jani_kinnunen)."""))
|
||||||
documentation.append(_(u"""* French: Rémi Ruiz."""))
|
documentation.append(_(u"""* French: [Rémi Ruiz](https://twitter.com/blindhelp38)."""))
|
||||||
documentation.append(_(u"""* Galician: [Alba Kinteiro](https://twitter.com/albasmileforeve)."""))
|
documentation.append(_(u"""* Galician: [Alba Kinteiro](https://twitter.com/albasmileforeve)."""))
|
||||||
documentation.append(_(u"""* German: Steffen Schultz."""))
|
documentation.append(_(u"""* German: [Steffen Schultz](https://twitter.com/schulle4u)."""))
|
||||||
|
documentation.append(_(u"""* Croatian: [Zvonimir Stanečić](https://twitter.com/zvonimirek222)."""))
|
||||||
documentation.append(_(u"""* Hungarian: Robert Osztolykan."""))
|
documentation.append(_(u"""* Hungarian: Robert Osztolykan."""))
|
||||||
|
documentation.append(_(u"""* Italian: [Christian Leo Mameli](https://twitter.com/llajta2012)."""))
|
||||||
documentation.append(_(u"""* Polish: Pawel Masarczyk."""))
|
documentation.append(_(u"""* Polish: Pawel Masarczyk."""))
|
||||||
documentation.append(_(u"""* Portuguese: Odenilton Júnior Santos."""))
|
documentation.append(_(u"""* Portuguese: Odenilton Júnior Santos."""))
|
||||||
documentation.append(_(u"""* Russian: Alexander Jaszyn."""))
|
documentation.append(_(u"""* Russian: [Александр Яшин](https://twitter.com/radovest)."""))
|
||||||
documentation.append(_(u"""* Turkish: Burak."""))
|
documentation.append(_(u"""* Turkish: [Burak Yüksek](https://twitter.com/burakyuksek)."""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""Many thanks also to the people who worked on the documentation. Initially, [Manuel Cortez](https://twitter.com/manuelcortez00) did the documentation in Spanish, and translated to English by [Bryner Villalobos](https://twitter.com/Bry_StarkCR), [Robert Spangler](https://twitter.com/glasscity1837), [Sussan Rey](https://twitter.com/sussanrey17), [Anibal Hernandez](https://twitter.com/anibalmetal), and [Holly Scott-Gardner](https://twitter.com/holly1994). It was updated by [Sukil Etxenike](https://twitter.com/sukil2011), with some valuable corrections by [Brian Hartgen](https://twitter.com/brianhartgen) and [Bill Dengler](https://twitter.com/codeofdusk)."""))
|
documentation.append(_(u"""Many thanks also to the people who worked on the documentation. Initially, [Manuel Cortez](https://twitter.com/manuelcortez00) did the documentation in Spanish, and translated to English by [Bryner Villalobos](https://twitter.com/Bry_StarkCR), [Robert Spangler](https://twitter.com/glasscity1837), [Sussan Rey](https://twitter.com/sussanrey17), [Anibal Hernandez](https://twitter.com/anibalmetal), and [Holly Scott-Gardner](https://twitter.com/holly1994). It was updated by [Sukil Etxenike](https://twitter.com/sukil2011), with some valuable corrections by [Brian Hartgen](https://twitter.com/brianhartgen) and [Bill Dengler](https://twitter.com/codeofdusk)."""))
|
||||||
|
@@ -8,7 +8,7 @@ language = string(default="system")
|
|||||||
hide_gui = boolean(default=False)
|
hide_gui = boolean(default=False)
|
||||||
voice_enabled = boolean(default=False)
|
voice_enabled = boolean(default=False)
|
||||||
ask_at_exit = boolean(default=True)
|
ask_at_exit = boolean(default=True)
|
||||||
handle_longtweets = boolean(default=False)
|
handle_longtweets = boolean(default=True)
|
||||||
use_invisible_keyboard_shorcuts = boolean(default=True)
|
use_invisible_keyboard_shorcuts = boolean(default=True)
|
||||||
play_ready_sound = boolean(default=True)
|
play_ready_sound = boolean(default=True)
|
||||||
speak_ready_msg = boolean(default=True)
|
speak_ready_msg = boolean(default=True)
|
||||||
|
@@ -5,12 +5,12 @@ if snapshot == False:
|
|||||||
version = "0.80"
|
version = "0.80"
|
||||||
update_url = 'http://twblue.es/updates/twblue_ngen.json'
|
update_url = 'http://twblue.es/updates/twblue_ngen.json'
|
||||||
else:
|
else:
|
||||||
version = "10.6"
|
version = "10.92"
|
||||||
update_url = 'http://twblue.es/updates/snapshots_ngen.json'
|
update_url = 'http://twblue.es/updates/snapshots_ngen.json'
|
||||||
author = u"Manuel Cortéz, Bill Dengler"
|
author = u"Manuel Cortéz, Bill Dengler"
|
||||||
authorEmail = "manuel@manuelcortez.net"
|
authorEmail = "manuel@manuelcortez.net"
|
||||||
copyright = u"Copyright (C) 2015, Technow S.L. \nCopyright (C) 2015, Bill Dengler\nCopyright (C) 2013-2015, Manuel cortéz."
|
copyright = u"Copyright (C) 2015, Technow S.L. \nCopyright (C) 2015, Bill Dengler\nCopyright (C) 2013-2015, Manuel cortéz."
|
||||||
description = unicode(name+" is an app designed to use Twitter simply and efficiently while using minimal system resources. This app provides access to most Twitter features.")
|
description = unicode(name+" is an app designed to use Twitter simply and efficiently while using minimal system resources. This app provides access to most Twitter features.")
|
||||||
translators = [u"Bryner Villalobos, Bill Dengler (English)", u"Mohammed Al Shara (Arabic)", u"Joan Rabat, Juan Carlos Rivilla (Catalan)", u"Manuel cortéz (Spanish)", u"Sukil Etxenike Arizaleta (Basque)", u"Jani Kinnunen (finnish)", u"Rémy Ruiz (French)", u"Alba Quinteiro (Galician)", u"Steffen Schultz (German)", u"Robert Osztolykan (Hungarian)", u"Paweł Masarczyk (Polish)", u"Odenilton Júnior Santos (Portuguese)", u"Alexander Jaszyn (Russian)", u"Burak (Turkish)"]
|
translators = [u"Bryner Villalobos, Bill Dengler (English)", u"Mohammed Al Shara (Arabic)", u"Joan Rabat, Juan Carlos Rivilla (Catalan)", u"Manuel cortéz (Spanish)", u"Sukil Etxenike Arizaleta (Basque)", u"Jani Kinnunen (finnish)", u"Rémy Ruiz (French)", u"Juan Buño (Galician)", u"Steffen Schultz (German)", u"Robert Osztolykan (Hungarian)", u"Paweł Masarczyk (Polish)", u"Odenilton Júnior Santos (Portuguese)", u"Alexander Jaszyn (Russian)", u"Burak (Turkish)"]
|
||||||
url = u"http://twblue.es"
|
url = u"http://twblue.es"
|
||||||
report_bugs_url = "http://twblue.es/bugs/api/soap/mantisconnect.php?wsdl"
|
report_bugs_url = "http://twblue.es/bugs/api/soap/mantisconnect.php?wsdl"
|
@@ -231,7 +231,8 @@ class baseBufferController(bufferController):
|
|||||||
return self.get_message()
|
return self.get_message()
|
||||||
|
|
||||||
def get_message(self):
|
def get_message(self):
|
||||||
return " ".join(self.compose_function(self.get_right_tweet(), self.session.db, self.session.settings["general"]["relative_times"]))
|
tweet = self.get_right_tweet()
|
||||||
|
return " ".join(self.compose_function(tweet, self.session.db, self.session.settings["general"]["relative_times"]))
|
||||||
|
|
||||||
def get_full_tweet(self):
|
def get_full_tweet(self):
|
||||||
tweet = self.get_right_tweet()
|
tweet = self.get_right_tweet()
|
||||||
@@ -360,8 +361,8 @@ class baseBufferController(bufferController):
|
|||||||
if self.name in self.session.settings["other_buffers"]["autoread_buffers"] and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and self.session.settings["sound"]["session_mute"] == False:
|
if self.name in self.session.settings["other_buffers"]["autoread_buffers"] and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and self.session.settings["sound"]["session_mute"] == False:
|
||||||
output.speak(" ".join(tweet[:2]))
|
output.speak(" ".join(tweet[:2]))
|
||||||
#Improve performance on Windows
|
#Improve performance on Windows
|
||||||
if platform.system() == "Windows":
|
# if platform.system() == "Windows":
|
||||||
call_threaded(utils.is_audio,item)
|
# call_threaded(utils.is_audio,item)
|
||||||
|
|
||||||
def bind_events(self):
|
def bind_events(self):
|
||||||
log.debug("Binding events...")
|
log.debug("Binding events...")
|
||||||
@@ -604,6 +605,26 @@ class baseBufferController(bufferController):
|
|||||||
user.profileController(session=self.session, user=dlg.get_user())
|
user.profileController(session=self.session, user=dlg.get_user())
|
||||||
if hasattr(dlg, "destroy"): dlg.destroy()
|
if hasattr(dlg, "destroy"): dlg.destroy()
|
||||||
|
|
||||||
|
def get_quoted_tweet(self, tweet):
|
||||||
|
# try:
|
||||||
|
quoted_tweet = self.session.twitter.twitter.show_status(id=tweet["id"])
|
||||||
|
urls = utils.find_urls_in_text(quoted_tweet["text"])
|
||||||
|
for url in range(0, len(urls)):
|
||||||
|
try: quoted_tweet["text"] = quoted_tweet["text"].replace(urls[url], quoted_tweet["entities"]["urls"][url]["expanded_url"])
|
||||||
|
except IndexError: pass
|
||||||
|
# except TwythonError as e:
|
||||||
|
# utils.twitter_error(e)
|
||||||
|
# return
|
||||||
|
l = tweets.is_long(quoted_tweet)
|
||||||
|
id = tweets.get_id(l)
|
||||||
|
# try:
|
||||||
|
original_tweet = self.session.twitter.twitter.show_status(id=id)
|
||||||
|
urls = utils.find_urls_in_text(original_tweet["text"])
|
||||||
|
for url in range(0, len(urls)):
|
||||||
|
try: original_tweet["text"] = original_tweet["text"].replace(urls[url], original_tweet["entities"]["urls"][url]["expanded_url"])
|
||||||
|
except IndexError: pass
|
||||||
|
return compose.compose_quoted_tweet(quoted_tweet, original_tweet, self.session.db, self.session.settings["general"]["relative_times"])
|
||||||
|
|
||||||
class listBufferController(baseBufferController):
|
class listBufferController(baseBufferController):
|
||||||
def __init__(self, parent, function, name, sessionObject, account, sound=None, bufferType=None, list_id=None, *args, **kwargs):
|
def __init__(self, parent, function, name, sessionObject, account, sound=None, bufferType=None, list_id=None, *args, **kwargs):
|
||||||
super(listBufferController, self).__init__(parent, function, name, sessionObject, account, sound=None, bufferType=None, *args, **kwargs)
|
super(listBufferController, self).__init__(parent, function, name, sessionObject, account, sound=None, bufferType=None, *args, **kwargs)
|
||||||
@@ -887,6 +908,7 @@ class trendsBufferController(bufferController):
|
|||||||
self.buffer.name = name
|
self.buffer.name = name
|
||||||
self.compose_function = self.compose_function_
|
self.compose_function = self.compose_function_
|
||||||
self.get_formatted_message = self.get_message
|
self.get_formatted_message = self.get_message
|
||||||
|
self.reply = self.search_topic
|
||||||
|
|
||||||
def start_stream(self):
|
def start_stream(self):
|
||||||
try:
|
try:
|
||||||
@@ -913,12 +935,11 @@ class trendsBufferController(bufferController):
|
|||||||
def bind_events(self):
|
def bind_events(self):
|
||||||
log.debug("Binding events...")
|
log.debug("Binding events...")
|
||||||
self.buffer.list.list.Bind(wx.EVT_CHAR_HOOK, self.get_event)
|
self.buffer.list.list.Bind(wx.EVT_CHAR_HOOK, self.get_event)
|
||||||
# widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.post_tweet, self.buffer.tweet)
|
widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.tweet_about_this_trend, self.buffer.tweetTrendBtn)
|
||||||
# widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.retweet, self.buffer.retweet)
|
widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.post_tweet, self.buffer.tweet)
|
||||||
# widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.direct_message, self.buffer.dm)
|
|
||||||
# widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.reply, self.buffer.reply)
|
|
||||||
widgetUtils.connect_event(self.buffer.list.list, wx.EVT_LIST_ITEM_RIGHT_CLICK, self.show_menu)
|
widgetUtils.connect_event(self.buffer.list.list, wx.EVT_LIST_ITEM_RIGHT_CLICK, self.show_menu)
|
||||||
widgetUtils.connect_event(self.buffer.list.list, wx.EVT_LIST_KEY_DOWN, self.show_menu_by_key)
|
widgetUtils.connect_event(self.buffer.list.list, wx.EVT_LIST_KEY_DOWN, self.show_menu_by_key)
|
||||||
|
widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.search_topic, self.buffer.search_topic)
|
||||||
|
|
||||||
def get_message(self):
|
def get_message(self):
|
||||||
return self.compose_function(self.trends[self.buffer.list.get_selected()])[0]
|
return self.compose_function(self.trends[self.buffer.list.get_selected()])[0]
|
||||||
@@ -933,11 +954,13 @@ class trendsBufferController(bufferController):
|
|||||||
elif dlg == widgetUtils.NO:
|
elif dlg == widgetUtils.NO:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def interact(self, *args, **kwargs):
|
def search_topic(self, *args, **kwargs):
|
||||||
self.searchfunction(value=self.get_message())
|
topic = self.trends[self.buffer.list.get_selected()]["name"]
|
||||||
|
pub.sendMessage("search", term=topic)
|
||||||
|
|
||||||
def show_menu(self, ev, pos=0, *args, **kwargs):
|
def show_menu(self, ev, pos=0, *args, **kwargs):
|
||||||
menu = menus.trendsPanelMenu()
|
menu = menus.trendsPanelMenu()
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.search_topic, menuitem=menu.search_topic)
|
||||||
widgetUtils.connect_event(menu, widgetUtils.MENU, self.tweet_about_this_trend, menuitem=menu.tweetThisTrend)
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.tweet_about_this_trend, menuitem=menu.tweetThisTrend)
|
||||||
widgetUtils.connect_event(menu, widgetUtils.MENU, self.view, menuitem=menu.view)
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.view, menuitem=menu.view)
|
||||||
widgetUtils.connect_event(menu, widgetUtils.MENU, self.copy, menuitem=menu.copy)
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.copy, menuitem=menu.copy)
|
||||||
|
@@ -15,12 +15,23 @@ class listsController(object):
|
|||||||
self.dialog.populate_list(self.get_all_lists())
|
self.dialog.populate_list(self.get_all_lists())
|
||||||
widgetUtils.connect_event(self.dialog.createBtn, widgetUtils.BUTTON_PRESSED, self.create_list)
|
widgetUtils.connect_event(self.dialog.createBtn, widgetUtils.BUTTON_PRESSED, self.create_list)
|
||||||
widgetUtils.connect_event(self.dialog.editBtn, widgetUtils.BUTTON_PRESSED, self.edit_list)
|
widgetUtils.connect_event(self.dialog.editBtn, widgetUtils.BUTTON_PRESSED, self.edit_list)
|
||||||
|
widgetUtils.connect_event(self.dialog.deleteBtn, widgetUtils.BUTTON_PRESSED, self.remove_list)
|
||||||
widgetUtils.connect_event(self.dialog.view, widgetUtils.BUTTON_PRESSED, self.open_list_as_buffer)
|
widgetUtils.connect_event(self.dialog.view, widgetUtils.BUTTON_PRESSED, self.open_list_as_buffer)
|
||||||
|
widgetUtils.connect_event(self.dialog.deleteBtn, widgetUtils.BUTTON_PRESSED, self.remove_list)
|
||||||
|
else:
|
||||||
|
self.dialog = lists.userListViewer(user)
|
||||||
|
self.dialog.populate_list(self.get_user_lists(user))
|
||||||
|
widgetUtils.connect_event(self.dialog.createBtn, widgetUtils.BUTTON_PRESSED, self.subscribe)
|
||||||
|
widgetUtils.connect_event(self.dialog.deleteBtn, widgetUtils.BUTTON_PRESSED, self.unsubscribe)
|
||||||
self.dialog.get_response()
|
self.dialog.get_response()
|
||||||
|
|
||||||
def get_all_lists(self):
|
def get_all_lists(self):
|
||||||
return [compose.compose_list(item) for item in self.session.db["lists"]]
|
return [compose.compose_list(item) for item in self.session.db["lists"]]
|
||||||
|
|
||||||
|
def get_user_lists(self, user):
|
||||||
|
self.lists = self.session.twitter.twitter.show_lists(reverse=True, screen_name=user)
|
||||||
|
return [compose.compose_list(item) for item in self.lists]
|
||||||
|
|
||||||
def create_list(self, *args, **kwargs):
|
def create_list(self, *args, **kwargs):
|
||||||
dialog = lists.createListDialog()
|
dialog = lists.createListDialog()
|
||||||
if dialog.get_response() == widgetUtils.OK:
|
if dialog.get_response() == widgetUtils.OK:
|
||||||
@@ -73,4 +84,23 @@ class listsController(object):
|
|||||||
def open_list_as_buffer(self, *args, **kwargs):
|
def open_list_as_buffer(self, *args, **kwargs):
|
||||||
if self.dialog.lista.get_count() == 0: return
|
if self.dialog.lista.get_count() == 0: return
|
||||||
list = self.session.db["lists"][self.dialog.get_item()]
|
list = self.session.db["lists"][self.dialog.get_item()]
|
||||||
pub.sendMessage("create-new-buffer", buffer="list", account=self.session.db["user_name"], create=list["name"])
|
pub.sendMessage("create-new-buffer", buffer="list", account=self.session.db["user_name"], create=list["name"])
|
||||||
|
|
||||||
|
def subscribe(self, *args, **kwargs):
|
||||||
|
if self.dialog.lista.get_count() == 0: return
|
||||||
|
list_id = self.lists[self.dialog.get_item()]["id"]
|
||||||
|
try:
|
||||||
|
list = self.session.twitter.twitter.subscribe_to_list(list_id=list_id)
|
||||||
|
item = utils.find_item(list["id"], self.session.db["lists"])
|
||||||
|
self.session.db["lists"].append(list)
|
||||||
|
except TwythonError as e:
|
||||||
|
output.speak("error %s: %s" % (e.status_code, e.msg))
|
||||||
|
|
||||||
|
def unsubscribe(self, *args, **kwargs):
|
||||||
|
if self.dialog.lista.get_count() == 0: return
|
||||||
|
list_id = self.lists[self.dialog.get_item()]["id"]
|
||||||
|
try:
|
||||||
|
list = self.session.twitter.twitter.unsubscribe_from_list(list_id=list_id)
|
||||||
|
self.session.db["lists"].remove(list)
|
||||||
|
except TwythonError as e:
|
||||||
|
output.speak("error %s: %s" % (e.status_code, e.msg))
|
||||||
|
@@ -125,10 +125,11 @@ class Controller(object):
|
|||||||
log.debug("Binding other application events...")
|
log.debug("Binding other application events...")
|
||||||
pub.subscribe(self.logout_account, "logout")
|
pub.subscribe(self.logout_account, "logout")
|
||||||
pub.subscribe(self.login_account, "login")
|
pub.subscribe(self.login_account, "login")
|
||||||
pub.subscribe(self.manage_stream_errors, "streamError")
|
pub.subscribe(self.manage_stream_errors, "stream-error")
|
||||||
pub.subscribe(self.create_new_buffer, "create-new-buffer")
|
pub.subscribe(self.create_new_buffer, "create-new-buffer")
|
||||||
pub.subscribe(self.restart_streams, "restart-streams")
|
pub.subscribe(self.restart_streams, "restart-streams")
|
||||||
pub.subscribe(self.execute_action, "execute-action")
|
pub.subscribe(self.execute_action, "execute-action")
|
||||||
|
pub.subscribe(self.search_topic, "search")
|
||||||
if system == "Windows":
|
if system == "Windows":
|
||||||
pub.subscribe(self.invisible_shorcuts_changed, "invisible-shorcuts-changed")
|
pub.subscribe(self.invisible_shorcuts_changed, "invisible-shorcuts-changed")
|
||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.show_hide, menuitem=self.view.show_hide)
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.show_hide, menuitem=self.view.show_hide)
|
||||||
@@ -156,7 +157,9 @@ class Controller(object):
|
|||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.delete, self.view.delete)
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.delete, self.view.delete)
|
||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.follow, menuitem=self.view.follow)
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.follow, menuitem=self.view.follow)
|
||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.send_dm, self.view.dm)
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.send_dm, self.view.dm)
|
||||||
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.view_user_lists, menuitem=self.view.viewLists)
|
||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.get_more_items, menuitem=self.view.load_previous_items)
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.get_more_items, menuitem=self.view.load_previous_items)
|
||||||
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.view_user_lists, menuitem=self.view.viewLists)
|
||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.clear_buffer, menuitem=self.view.clear)
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.clear_buffer, menuitem=self.view.clear)
|
||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.remove_buffer, self.view.deleteTl)
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.remove_buffer, self.view.deleteTl)
|
||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.check_for_updates, self.view.check_for_updates)
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.check_for_updates, self.view.check_for_updates)
|
||||||
@@ -394,7 +397,10 @@ class Controller(object):
|
|||||||
self.buffers.remove(buffer)
|
self.buffers.remove(buffer)
|
||||||
del buffer
|
del buffer
|
||||||
|
|
||||||
def search(self, value="", *args, **kwargs):
|
def search_topic(self, term):
|
||||||
|
self.search(value=term)
|
||||||
|
|
||||||
|
def search(self, event=None, value="", *args, **kwargs):
|
||||||
""" Searches words or users in twitter. This creates a new buffer containing the search results."""
|
""" Searches words or users in twitter. This creates a new buffer containing the search results."""
|
||||||
log.debug("Creating a new search...")
|
log.debug("Creating a new search...")
|
||||||
dlg = dialogs.search.searchDialog(value)
|
dlg = dialogs.search.searchDialog(value)
|
||||||
@@ -468,8 +474,20 @@ class Controller(object):
|
|||||||
buffer = self.get_best_buffer()
|
buffer = self.get_best_buffer()
|
||||||
SoundsTutorial.soundsTutorial(buffer.session)
|
SoundsTutorial.soundsTutorial(buffer.session)
|
||||||
|
|
||||||
def view_user_lists(self, users):
|
def view_user_lists(self, *args, **kwargs):
|
||||||
pass
|
buff = self.get_best_buffer()
|
||||||
|
if not hasattr(buff, "get_right_tweet"): return
|
||||||
|
tweet = buff.get_right_tweet()
|
||||||
|
if buff.type != "people":
|
||||||
|
users = utils.get_all_users(tweet, buff.session.db)
|
||||||
|
else:
|
||||||
|
users = [tweet["screen_name"]]
|
||||||
|
dlg = dialogs.utils.selectUserDialog(_(u"Select the user"), users)
|
||||||
|
if dlg.get_response() == widgetUtils.OK:
|
||||||
|
user = dlg.get_user()
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
l = listsController.listsController(buff.session, user=user)
|
||||||
|
|
||||||
def add_to_list(self, *args, **kwargs):
|
def add_to_list(self, *args, **kwargs):
|
||||||
buff = self.get_best_buffer()
|
buff = self.get_best_buffer()
|
||||||
@@ -1227,8 +1245,15 @@ class Controller(object):
|
|||||||
self.set_buffer_positions(i)
|
self.set_buffer_positions(i)
|
||||||
|
|
||||||
def manage_stream_errors(self, session):
|
def manage_stream_errors(self, session):
|
||||||
log.debug(" Restarting %s session streams. It will be destroyed" % (session,))
|
log.error(" Restarting %s session streams. It will be destroyed" % (session,))
|
||||||
s = session_.sessions[session]
|
s = session_.sessions[session]
|
||||||
|
try:
|
||||||
|
if hasattr(s, "main_stream"): del s.main_stream
|
||||||
|
del s.timelinesStream
|
||||||
|
s.counter = 0
|
||||||
|
s.reconnection_function_active = False
|
||||||
|
except AttributeError:
|
||||||
|
log.error("Error deleting some thing")
|
||||||
for i in self.buffers:
|
for i in self.buffers:
|
||||||
if i.invisible == True and i.session.session_id == s.session_id and i.type != "people":
|
if i.invisible == True and i.session.session_id == s.session_id and i.type != "people":
|
||||||
i.start_stream()
|
i.start_stream()
|
||||||
|
@@ -74,10 +74,10 @@ class audioUploader(object):
|
|||||||
def on_pause(self, *args, **kwargs):
|
def on_pause(self, *args, **kwargs):
|
||||||
if self.dialog.get("pause") == _(u"Pause"):
|
if self.dialog.get("pause") == _(u"Pause"):
|
||||||
self.recording.pause()
|
self.recording.pause()
|
||||||
self.dialog.set("pause", _(u"Resume"))
|
self.dialog.set("pause", _(u"&Resume"))
|
||||||
elif self.dialog.get("pause") == _(u"Resume"):
|
elif self.dialog.get("pause") == _(u"Resume"):
|
||||||
self.recording.play()
|
self.recording.play()
|
||||||
self.dialog.set("pause", _(U"Pause"))
|
self.dialog.set("pause", _(U"&Pause"))
|
||||||
|
|
||||||
def on_record(self, *args, **kwargs):
|
def on_record(self, *args, **kwargs):
|
||||||
if self.recording != None:
|
if self.recording != None:
|
||||||
@@ -92,7 +92,7 @@ class audioUploader(object):
|
|||||||
self.file = tempfile.mktemp(suffix='.wav')
|
self.file = tempfile.mktemp(suffix='.wav')
|
||||||
self.recording = sound.recording(self.file)
|
self.recording = sound.recording(self.file)
|
||||||
self.recording.play()
|
self.recording.play()
|
||||||
self.dialog.set("record", _(u"Stop"))
|
self.dialog.set("record", _(u"&Stop"))
|
||||||
output.speak(_(u"Recording"))
|
output.speak(_(u"Recording"))
|
||||||
|
|
||||||
def stop_recording(self):
|
def stop_recording(self):
|
||||||
@@ -100,11 +100,11 @@ class audioUploader(object):
|
|||||||
self.recording.free()
|
self.recording.free()
|
||||||
output.speak(_(u"Stopped"))
|
output.speak(_(u"Stopped"))
|
||||||
self.recorded = True
|
self.recorded = True
|
||||||
self.dialog.set("record", _(u"Record"))
|
self.dialog.set("record", _(u"&Record"))
|
||||||
self.file_attached()
|
self.file_attached()
|
||||||
|
|
||||||
def file_attached(self):
|
def file_attached(self):
|
||||||
self.dialog.set("pause", _(u"Pause"))
|
self.dialog.set("pause", _(u"&Pause"))
|
||||||
self.dialog.disable_control("record")
|
self.dialog.disable_control("record")
|
||||||
self.dialog.enable_control("play")
|
self.dialog.enable_control("play")
|
||||||
self.dialog.enable_control("discard")
|
self.dialog.enable_control("discard")
|
||||||
@@ -137,11 +137,11 @@ class audioUploader(object):
|
|||||||
# try:
|
# try:
|
||||||
self.playing = sound_lib.stream.FileStream(file=unicode(self.file), flags=sound_lib.stream.BASS_UNICODE)
|
self.playing = sound_lib.stream.FileStream(file=unicode(self.file), flags=sound_lib.stream.BASS_UNICODE)
|
||||||
self.playing.play()
|
self.playing.play()
|
||||||
self.dialog.set("play", _(u"Stop"))
|
self.dialog.set("play", _(u"&Stop"))
|
||||||
try:
|
try:
|
||||||
while self.playing.is_playing:
|
while self.playing.is_playing:
|
||||||
pass
|
pass
|
||||||
self.dialog.set("play", _(u"Play"))
|
self.dialog.set("play", _(u"&Play"))
|
||||||
self.playing.free()
|
self.playing.free()
|
||||||
self.playing = None
|
self.playing = None
|
||||||
except:
|
except:
|
||||||
@@ -151,7 +151,7 @@ class audioUploader(object):
|
|||||||
output.speak(_(u"Stopped"))
|
output.speak(_(u"Stopped"))
|
||||||
self.playing.stop()
|
self.playing.stop()
|
||||||
self.playing.free()
|
self.playing.free()
|
||||||
self.dialog.set("play", _(u"Play"))
|
self.dialog.set("play", _(u"&Play"))
|
||||||
self.playing = None
|
self.playing = None
|
||||||
|
|
||||||
def postprocess(self):
|
def postprocess(self):
|
||||||
|
@@ -31,14 +31,14 @@ class audioDialog(widgetUtils.BaseDialog):
|
|||||||
btnSizer = wx.BoxSizer(wx.HORIZONTAL)
|
btnSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
btnSizer2 = wx.BoxSizer(wx.HORIZONTAL)
|
btnSizer2 = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
|
|
||||||
self.play = wx.Button(panel, -1, _(u"Play"))
|
self.play = wx.Button(panel, -1, _(u"&Play"))
|
||||||
self.play.Disable()
|
self.play.Disable()
|
||||||
self.pause = wx.Button(panel, -1, _(u"Pause"))
|
self.pause = wx.Button(panel, -1, _(u"&Pause"))
|
||||||
self.pause.Disable()
|
self.pause.Disable()
|
||||||
self.record = wx.Button(panel, -1, _(u"Record"))
|
self.record = wx.Button(panel, -1, _(u"&Record"))
|
||||||
self.record.SetFocus()
|
self.record.SetFocus()
|
||||||
self.attach_exists = wx.Button(panel, -1, _(u"Add an existing file"))
|
self.attach_exists = wx.Button(panel, -1, _(u"&Add an existing file"))
|
||||||
self.discard = wx.Button(panel, -1, _(u"Discard"))
|
self.discard = wx.Button(panel, -1, _(u"&Discard"))
|
||||||
self.discard.Disable()
|
self.discard.Disable()
|
||||||
label = wx.StaticText(panel, -1, _(u"Upload to"))
|
label = wx.StaticText(panel, -1, _(u"Upload to"))
|
||||||
self.services = wx.ComboBox(panel, -1, choices=services, value=services[0], style=wx.CB_READONLY)
|
self.services = wx.ComboBox(panel, -1, choices=services, value=services[0], style=wx.CB_READONLY)
|
||||||
@@ -47,7 +47,7 @@ class audioDialog(widgetUtils.BaseDialog):
|
|||||||
servicesBox.Add(self.services, 0, wx.ALL, 5)
|
servicesBox.Add(self.services, 0, wx.ALL, 5)
|
||||||
self.attach = wx.Button(panel, wx.ID_OK, _(u"Attach"))
|
self.attach = wx.Button(panel, wx.ID_OK, _(u"Attach"))
|
||||||
self.attach.Disable()
|
self.attach.Disable()
|
||||||
cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Cancel"))
|
cancel = wx.Button(panel, wx.ID_CANCEL, _(u"&Cancel"))
|
||||||
btnSizer.Add(self.play, 0, wx.ALL, 5)
|
btnSizer.Add(self.play, 0, wx.ALL, 5)
|
||||||
btnSizer.Add(self.pause, 0, wx.ALL, 5)
|
btnSizer.Add(self.pause, 0, wx.ALL, 5)
|
||||||
btnSizer.Add(self.record, 0, wx.ALL, 5)
|
btnSizer.Add(self.record, 0, wx.ALL, 5)
|
||||||
|
@@ -11,9 +11,17 @@ def fix():
|
|||||||
locales.BasqueLocale = BasqueLocale
|
locales.BasqueLocale = BasqueLocale
|
||||||
locales.TurkishLocale.names[-1] = "tr_tr"
|
locales.TurkishLocale.names[-1] = "tr_tr"
|
||||||
locales.ArabicLocale.names[-1] = "ar_eg"
|
locales.ArabicLocale.names[-1] = "ar_eg"
|
||||||
|
# insert a modified function so if there is no language available in arrow, returns English locale.
|
||||||
|
locales.get_locale = get_locale
|
||||||
# We need to reassign the locales list for updating the list with our new contents.
|
# We need to reassign the locales list for updating the list with our new contents.
|
||||||
locales._locales = locales._map_locales()
|
locales._locales = locales._map_locales()
|
||||||
|
|
||||||
|
def get_locale(name):
|
||||||
|
locale_cls = locales._locales.get(name.lower())
|
||||||
|
if locale_cls is None:
|
||||||
|
return locales.EnglishLocale()
|
||||||
|
return locale_cls()
|
||||||
|
|
||||||
class CatalaLocale(Locale):
|
class CatalaLocale(Locale):
|
||||||
names = ['ca', 'ca_ca']
|
names = ['ca', 'ca_ca']
|
||||||
past = 'Fa {0}'
|
past = 'Fa {0}'
|
||||||
|
@@ -1,6 +1,5 @@
|
|||||||
import win32com.client
|
import win32com.client
|
||||||
|
|
||||||
|
|
||||||
def fix():
|
def fix():
|
||||||
if win32com.client.gencache.is_readonly == True:
|
if win32com.client.gencache.is_readonly == True:
|
||||||
win32com.client.gencache.is_readonly = False
|
win32com.client.gencache.is_readonly = False
|
||||||
|
@@ -69,6 +69,7 @@ def getLanguageDescription(language):
|
|||||||
"ar":pgettext("languageName","Arabic"),
|
"ar":pgettext("languageName","Arabic"),
|
||||||
"ne":pgettext("languageName","Nepali"),
|
"ne":pgettext("languageName","Nepali"),
|
||||||
"sr":pgettext("languageName","Serbian (Latin)"),
|
"sr":pgettext("languageName","Serbian (Latin)"),
|
||||||
|
"ja":pgettext("languageName","Japanese"),
|
||||||
}.get(language,None)
|
}.get(language,None)
|
||||||
return desc
|
return desc
|
||||||
|
|
||||||
@@ -195,10 +196,13 @@ def langToWindowsLocale(lang):
|
|||||||
"gl": "glc",
|
"gl": "glc",
|
||||||
"eu": "euq",
|
"eu": "euq",
|
||||||
"hu": "hun",
|
"hu": "hun",
|
||||||
|
"hr": "hrv",
|
||||||
"it": "ita",
|
"it": "ita",
|
||||||
|
"ja": "jpn",
|
||||||
"pl": "plk",
|
"pl": "plk",
|
||||||
"pt": "ptb",
|
"pt": "ptb",
|
||||||
"ru": "rus",
|
"ru": "rus",
|
||||||
"tr": "trk"
|
"tr": "trk",
|
||||||
|
"sr": "eng",
|
||||||
}
|
}
|
||||||
return languages[lang]
|
return languages[lang]
|
||||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
BIN
src/locales/RS/LC_MESSAGES/twblue.mo
Normal file
BIN
src/locales/RS/LC_MESSAGES/twblue.mo
Normal file
Binary file not shown.
2823
src/locales/RS/LC_MESSAGES/twblue.po
Normal file
2823
src/locales/RS/LC_MESSAGES/twblue.po
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
BIN
src/locales/ja/lc_messages/twblue.mo
Normal file
BIN
src/locales/ja/lc_messages/twblue.mo
Normal file
Binary file not shown.
2828
src/locales/ja/lc_messages/twblue.po
Normal file
2828
src/locales/ja/lc_messages/twblue.po
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
BIN
src/locales/sr/LC_MESSAGES/twblue.mo
Normal file
BIN
src/locales/sr/LC_MESSAGES/twblue.mo
Normal file
Binary file not shown.
2821
src/locales/sr/LC_MESSAGES/twblue.po
Normal file
2821
src/locales/sr/LC_MESSAGES/twblue.po
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -16,6 +16,7 @@
|
|||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
############################################################
|
############################################################
|
||||||
|
from twitter import utils
|
||||||
|
|
||||||
def get_id(url):
|
def get_id(url):
|
||||||
return url.split("/")[-1]
|
return url.split("/")[-1]
|
||||||
@@ -25,4 +26,10 @@ def is_long(tweet):
|
|||||||
for url in range(0, len(tweet["entities"]["urls"])):
|
for url in range(0, len(tweet["entities"]["urls"])):
|
||||||
if "twitter.com" in tweet["entities"]["urls"][url]["expanded_url"]:
|
if "twitter.com" in tweet["entities"]["urls"][url]["expanded_url"]:
|
||||||
long = get_id(tweet["entities"]["urls"][url]["expanded_url"])
|
long = get_id(tweet["entities"]["urls"][url]["expanded_url"])
|
||||||
return long
|
return long
|
||||||
|
|
||||||
|
def clear_url(tweet):
|
||||||
|
urls = utils.find_urls_in_text(tweet["text"])
|
||||||
|
try: tweet["message"] = tweet["message"].replace(urls[-1], "")
|
||||||
|
except IndexError: pass
|
||||||
|
return tweet
|
@@ -27,7 +27,9 @@ def stream_threaded(func, *args, **kwargs):
|
|||||||
try:
|
try:
|
||||||
func(**k)
|
func(**k)
|
||||||
except:
|
except:
|
||||||
pub.sendMessage("streamError", session=a[0])
|
log.error("Error in stream with args: %r" % (a,))
|
||||||
|
pub.sendMessage("stream-error", session=a[0])
|
||||||
|
|
||||||
thread = threading.Thread(target=new_func, args=args, kwargs=kwargs)
|
thread = threading.Thread(target=new_func, args=args, kwargs=kwargs)
|
||||||
thread.daemon = True
|
thread.daemon = True
|
||||||
thread.start()
|
thread.start()
|
||||||
|
@@ -9,7 +9,7 @@ import output
|
|||||||
import time
|
import time
|
||||||
import sound
|
import sound
|
||||||
import logging
|
import logging
|
||||||
from twitter import utils
|
from twitter import utils, compose
|
||||||
from twython import TwythonError, TwythonRateLimitError, TwythonAuthError
|
from twython import TwythonError, TwythonRateLimitError, TwythonAuthError
|
||||||
import config_utils
|
import config_utils
|
||||||
import shelve
|
import shelve
|
||||||
@@ -18,6 +18,7 @@ import os
|
|||||||
from mysc.thread_utils import stream_threaded
|
from mysc.thread_utils import stream_threaded
|
||||||
from pubsub import pub
|
from pubsub import pub
|
||||||
log = logging.getLogger("sessionmanager.session")
|
log = logging.getLogger("sessionmanager.session")
|
||||||
|
from long_tweets import tweets
|
||||||
|
|
||||||
sessions = {}
|
sessions = {}
|
||||||
|
|
||||||
@@ -61,6 +62,8 @@ class Session(object):
|
|||||||
self.db[name] = []
|
self.db[name] = []
|
||||||
for i in data:
|
for i in data:
|
||||||
if utils.find_item(i["id"], self.db[name]) == None and utils.is_allowed(i, self.settings["twitter"]["ignored_clients"]) == True:
|
if utils.find_item(i["id"], self.db[name]) == None and utils.is_allowed(i, self.settings["twitter"]["ignored_clients"]) == True:
|
||||||
|
try: i = self.check_quoted_status(i)
|
||||||
|
except: pass
|
||||||
if self.settings["general"]["reverse_timelines"] == False: self.db[name].append(i)
|
if self.settings["general"]["reverse_timelines"] == False: self.db[name].append(i)
|
||||||
else: self.db[name].insert(0, i)
|
else: self.db[name].insert(0, i)
|
||||||
num = num+1
|
num = num+1
|
||||||
@@ -413,3 +416,28 @@ class Session(object):
|
|||||||
os.remove(shelfname)
|
os.remove(shelfname)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def check_quoted_status(self, tweet):
|
||||||
|
status = tweets.is_long(tweet)
|
||||||
|
if status != False:
|
||||||
|
tweet["quoted"] = 1
|
||||||
|
tweet = self.get_quoted_tweet(tweet)
|
||||||
|
return tweet
|
||||||
|
|
||||||
|
|
||||||
|
def get_quoted_tweet(self, tweet):
|
||||||
|
quoted_tweet = self.twitter.twitter.show_status(id=tweet["id"])
|
||||||
|
urls = utils.find_urls_in_text(quoted_tweet["text"])
|
||||||
|
for url in range(0, len(urls)):
|
||||||
|
try: quoted_tweet["text"] = quoted_tweet["text"].replace(urls[url], quoted_tweet["entities"]["urls"][url]["expanded_url"])
|
||||||
|
except IndexError: pass
|
||||||
|
l = tweets.is_long(quoted_tweet)
|
||||||
|
id = tweets.get_id(l)
|
||||||
|
try: original_tweet = self.twitter.twitter.show_status(id=id)
|
||||||
|
except: return quoted_tweet
|
||||||
|
urls = utils.find_urls_in_text(original_tweet["text"])
|
||||||
|
for url in range(0, len(urls)):
|
||||||
|
try: original_tweet["text"] = original_tweet["text"].replace(urls[url], original_tweet["entities"]["urls"][url]["expanded_url"])
|
||||||
|
except IndexError: pass
|
||||||
|
return compose.compose_quoted_tweet(quoted_tweet, original_tweet)
|
||||||
|
|
||||||
|
23
src/setup.py
23
src/setup.py
@@ -25,6 +25,7 @@ import gettext
|
|||||||
import application
|
import application
|
||||||
import platform
|
import platform
|
||||||
from glob import glob
|
from glob import glob
|
||||||
|
import wx
|
||||||
|
|
||||||
def get_architecture_files():
|
def get_architecture_files():
|
||||||
if platform.architecture()[0][:2] == "32":
|
if platform.architecture()[0][:2] == "32":
|
||||||
@@ -48,7 +49,7 @@ def get_data():
|
|||||||
("accessible_output2/lib", glob("accessible_output2/lib/*.dll")),
|
("accessible_output2/lib", glob("accessible_output2/lib/*.dll")),
|
||||||
("keys/lib", glob("keys/lib/*.dll")),
|
("keys/lib", glob("keys/lib/*.dll")),
|
||||||
("keymaps", glob("keymaps/*.keymap")),
|
("keymaps", glob("keymaps/*.keymap")),
|
||||||
]+get_sounds()+get_locales()+get_documentation()+sound_lib.find_datafiles()+accessible_output2.find_datafiles()+enchant.utils.win32_data_files()+get_architecture_files()
|
]+get_sounds()+get_locales()+get_documentation()+sound_lib.find_datafiles()+accessible_output2.find_datafiles()+enchant.utils.win32_data_files()+get_architecture_files()+wx_files()
|
||||||
|
|
||||||
def get_documentation ():
|
def get_documentation ():
|
||||||
answer = []
|
answer = []
|
||||||
@@ -79,6 +80,24 @@ def get_locales():
|
|||||||
answer.append(new)
|
answer.append(new)
|
||||||
return answer
|
return answer
|
||||||
|
|
||||||
|
def wx_files():
|
||||||
|
wxDir=wx.__path__[0]
|
||||||
|
localeMoFiles=set()
|
||||||
|
for f in glob("locales/*/LC_MESSAGES"):
|
||||||
|
g=f.replace("locales", "locale")
|
||||||
|
wxMoFile=os.path.join(wxDir,g,"wxstd.mo")
|
||||||
|
if os.path.isfile(wxMoFile):
|
||||||
|
localeMoFiles.add((f,(wxMoFile,)))
|
||||||
|
lang=os.path.split(os.path.split(f)[0])[1]
|
||||||
|
if '_' in lang:
|
||||||
|
lang=lang.split('_')[0]
|
||||||
|
f=os.path.join('locale',lang,'lc_messages')
|
||||||
|
g=f.replace("locale", "locales")
|
||||||
|
wxMoFile=os.path.join(wxDir,f,"wxstd.mo")
|
||||||
|
if os.path.isfile(wxMoFile):
|
||||||
|
localeMoFiles.add((g,(wxMoFile,)))
|
||||||
|
return list(localeMoFiles)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
setup(
|
setup(
|
||||||
name = application.name,
|
name = application.name,
|
||||||
@@ -92,7 +111,7 @@ options = {
|
|||||||
'py2exe': {
|
'py2exe': {
|
||||||
'optimize':2,
|
'optimize':2,
|
||||||
'packages': ["pubsub", "pubsub.core", "pubsub.core.kwargs", "dbhash"],
|
'packages': ["pubsub", "pubsub.core", "pubsub.core.kwargs", "dbhash"],
|
||||||
'dll_excludes': ["MPR.dll", "api-ms-win-core-apiquery-l1-1-0.dll", "api-ms-win-core-console-l1-1-0.dll", "api-ms-win-core-delayload-l1-1-1.dll", "api-ms-win-core-errorhandling-l1-1-1.dll", "api-ms-win-core-file-l1-2-0.dll", "api-ms-win-core-handle-l1-1-0.dll", "api-ms-win-core-heap-obsolete-l1-1-0.dll", "api-ms-win-core-libraryloader-l1-1-1.dll", "api-ms-win-core-localization-l1-2-0.dll", "api-ms-win-core-processenvironment-l1-2-0.dll", "api-ms-win-core-processthreads-l1-1-1.dll", "api-ms-win-core-profile-l1-1-0.dll", "api-ms-win-core-registry-l1-1-0.dll", "api-ms-win-core-synch-l1-2-0.dll", "api-ms-win-core-sysinfo-l1-2-0.dll", "api-ms-win-security-base-l1-2-0.dll", "api-ms-win-core-heap-l1-2-0.dll", "api-ms-win-core-interlocked-l1-2-0.dll", "api-ms-win-core-localization-obsolete-l1-1-0.dll", "api-ms-win-core-string-l1-1-0.dll", "api-ms-win-core-string-obsolete-l1-1-0.dll", "WLDAP32.dll", "MSVCP90.dll"],
|
'dll_excludes': ["MPR.dll", "api-ms-win-core-apiquery-l1-1-0.dll", "api-ms-win-core-console-l1-1-0.dll", "api-ms-win-core-delayload-l1-1-1.dll", "api-ms-win-core-errorhandling-l1-1-1.dll", "api-ms-win-core-file-l1-2-0.dll", "api-ms-win-core-handle-l1-1-0.dll", "api-ms-win-core-heap-obsolete-l1-1-0.dll", "api-ms-win-core-libraryloader-l1-1-1.dll", "api-ms-win-core-localization-l1-2-0.dll", "api-ms-win-core-processenvironment-l1-2-0.dll", "api-ms-win-core-processthreads-l1-1-1.dll", "api-ms-win-core-profile-l1-1-0.dll", "api-ms-win-core-registry-l1-1-0.dll", "api-ms-win-core-synch-l1-2-0.dll", "api-ms-win-core-sysinfo-l1-2-0.dll", "api-ms-win-security-base-l1-2-0.dll", "api-ms-win-core-heap-l1-2-0.dll", "api-ms-win-core-interlocked-l1-2-0.dll", "api-ms-win-core-localization-obsolete-l1-1-0.dll", "api-ms-win-core-string-l1-1-0.dll", "api-ms-win-core-string-obsolete-l1-1-0.dll", "WLDAP32.dll", "MSVCP90.dll", "CRYPT32.dll", "mfc90.dll"],
|
||||||
'skip_archive': True
|
'skip_archive': True
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
19
src/sound.py
19
src/sound.py
@@ -129,24 +129,7 @@ class URLStream(object):
|
|||||||
self.stream.volume = float(volume)
|
self.stream.volume = float(volume)
|
||||||
self.stream.play()
|
self.stream.play()
|
||||||
log.debug("played")
|
log.debug("played")
|
||||||
call_threaded(self.delete_when_done)
|
# call_threaded(self.delete_when_done)
|
||||||
|
|
||||||
def is_playable(self, url,play=False,volume=1.0):
|
|
||||||
try:
|
|
||||||
log.debug("Checking URL playability...")
|
|
||||||
self.prepare(url)
|
|
||||||
if self.prepared == True:
|
|
||||||
stream=sound_lib.stream.URLStream(url=self.url)
|
|
||||||
if play:
|
|
||||||
return self.play(stream=stream,volume=volume,announce=False)
|
|
||||||
return True
|
|
||||||
except:
|
|
||||||
return False
|
|
||||||
|
|
||||||
def delete_when_done(self):
|
|
||||||
while hasattr(self,'stream') and self.stream.is_playing:
|
|
||||||
pass
|
|
||||||
del self.stream
|
|
||||||
|
|
||||||
def stop_audio(self,delete=False):
|
def stop_audio(self,delete=False):
|
||||||
if hasattr(self, "stream"):
|
if hasattr(self, "stream"):
|
||||||
|
@@ -21,15 +21,24 @@ class timelinesStreamer(TwythonStreamer):
|
|||||||
self.lists = self.session.lists
|
self.lists = self.session.lists
|
||||||
|
|
||||||
def on_error(self, status_code, data):
|
def on_error(self, status_code, data):
|
||||||
log.debug("%s: %s" % (status_code, data))
|
log.error("error in stream: %s: %s" % (status_code, data))
|
||||||
|
# pub.sendMessage("stream-error", session=self.session.session_id)
|
||||||
|
|
||||||
def on_timeout(self, *args, **kwargs):
|
def on_timeout(self, *args, **kwargs):
|
||||||
log.debug("Twitter timeout Error")
|
log.error("Twitter timeout Error")
|
||||||
pub.sendMessage("stream-error")
|
# pub.sendMessage("stream-error", session=self.session.session_id)
|
||||||
|
|
||||||
def check_tls(self, data):
|
def check_tls(self, data):
|
||||||
for i in self.session.settings["other_buffers"]["timelines"]:
|
for i in self.session.settings["other_buffers"]["timelines"]:
|
||||||
if data["user"]["screen_name"] == i:
|
if data["user"]["screen_name"] == i:
|
||||||
|
if utils.find_item(data["id"], self.session.db["%s-timeline" % (i,)]) != None:
|
||||||
|
log.error("duplicated tweet. Ignoring it...")
|
||||||
|
return
|
||||||
|
try:
|
||||||
|
data_ = self.session.check_quoted_status(data)
|
||||||
|
data = data_
|
||||||
|
except:
|
||||||
|
pass
|
||||||
if self.session.settings["general"]["reverse_timelines"] == False: self.session.db["%s-timeline" % (i,)].append(data)
|
if self.session.settings["general"]["reverse_timelines"] == False: self.session.db["%s-timeline" % (i,)].append(data)
|
||||||
else: self.session.db["%s-timeline" % (i,)].insert(0, data)
|
else: self.session.db["%s-timeline" % (i,)].insert(0, data)
|
||||||
pub.sendMessage("item-in-timeline", data= data, user= self.session.db["user_name"], who= i)
|
pub.sendMessage("item-in-timeline", data= data, user= self.session.db["user_name"], who= i)
|
||||||
@@ -38,6 +47,7 @@ class timelinesStreamer(TwythonStreamer):
|
|||||||
i.users.index(data["user"]["id"])
|
i.users.index(data["user"]["id"])
|
||||||
usr = data["in_reply_to_user_id"]
|
usr = data["in_reply_to_user_id"]
|
||||||
if (usr != None and usr in self.friends) or data.has_key("retweeted_status"):
|
if (usr != None and usr in self.friends) or data.has_key("retweeted_status"):
|
||||||
|
data = self.session.check_quoted_status(data)
|
||||||
if self.session.settings["general"]["reverse_timelines"] == False: self.session.db["%s" % (i.name,)].append(data)
|
if self.session.settings["general"]["reverse_timelines"] == False: self.session.db["%s" % (i.name,)].append(data)
|
||||||
else: self.session.db["%s" % (i,)].insert(0, data)
|
else: self.session.db["%s" % (i,)].insert(0, data)
|
||||||
pub.sendMessage("item-in-list", data= data, user= self.session.db["user_name"], where= i.name)
|
pub.sendMessage("item-in-list", data= data, user= self.session.db["user_name"], where= i.name)
|
||||||
|
@@ -22,22 +22,32 @@ class streamer(TwythonStreamer):
|
|||||||
# self.blocked_users = []
|
# self.blocked_users = []
|
||||||
|
|
||||||
def on_timeout(self, *args, **kwargs):
|
def on_timeout(self, *args, **kwargs):
|
||||||
log.debug("Twitter timeout Error")
|
log.error("Twitter timeout Error")
|
||||||
pub.sendMessage("stream-error")
|
# pub.sendMessage("stream-error", session=self.session.session_id)
|
||||||
|
|
||||||
def on_error(self, status_code, data):
|
def on_error(self, status_code, data):
|
||||||
log.debug("Error %s: %s" % (status_code, data))
|
log.error("Error %s: %s" % (status_code, data))
|
||||||
|
# pub.sendMessage("stream-error", session=self.session.session_id)
|
||||||
|
|
||||||
def get_user(self):
|
def get_user(self):
|
||||||
return self.session.db["user_name"]
|
return self.session.db["user_name"]
|
||||||
|
|
||||||
def put_data(self, place, data):
|
def put_data(self, place, data):
|
||||||
if self.session.db.has_key(place):
|
if self.session.db.has_key(place):
|
||||||
|
if utils.find_item(data["id"], self.session.db[place]) != None:
|
||||||
|
log.error("duplicated tweet. Ignoring it...")
|
||||||
|
return
|
||||||
|
try:
|
||||||
|
data_ = self.session.check_quoted_status(data)
|
||||||
|
data = data_
|
||||||
|
except:
|
||||||
|
pass
|
||||||
if self.session.settings["general"]["reverse_timelines"] == False:
|
if self.session.settings["general"]["reverse_timelines"] == False:
|
||||||
self.session.db[place].append(data)
|
self.session.db[place].append(data)
|
||||||
else:
|
else:
|
||||||
self.session.db[place].insert(0, data)
|
self.session.db[place].insert(0, data)
|
||||||
utils.is_audio(data)
|
utils.is_audio(data)
|
||||||
|
|
||||||
def block_user(self, data):
|
def block_user(self, data):
|
||||||
id = data["target"]["id"]
|
id = data["target"]["id"]
|
||||||
if id in self.friends:
|
if id in self.friends:
|
||||||
|
@@ -10,7 +10,7 @@ import languageHandler
|
|||||||
import arrow
|
import arrow
|
||||||
import logging
|
import logging
|
||||||
import config
|
import config
|
||||||
from long_tweets import twishort
|
from long_tweets import twishort, tweets
|
||||||
log = logging.getLogger("compose")
|
log = logging.getLogger("compose")
|
||||||
|
|
||||||
def StripChars(s):
|
def StripChars(s):
|
||||||
@@ -60,11 +60,33 @@ def compose_tweet(tweet, db, relative_times):
|
|||||||
try:
|
try:
|
||||||
oldtext=text
|
oldtext=text
|
||||||
text=twishort.get_full_text(tweet['long_uri'])
|
text=twishort.get_full_text(tweet['long_uri'])
|
||||||
|
try: text = "rt @%s: %s" % (tweet["retweeted_status"]["user"]["screen_name"], StripChars(text))
|
||||||
|
except KeyError: pass
|
||||||
except:
|
except:
|
||||||
text=oldtext
|
text=oldtext
|
||||||
|
if tweet.has_key("message"):
|
||||||
|
text = tweet["message"]
|
||||||
|
return [user+", ", text, ts+", ", source]
|
||||||
|
|
||||||
tweet["text"] = text
|
tweet["text"] = text
|
||||||
return [user+", ", tweet["text"], ts+", ", source]
|
return [user+", ", tweet["text"], ts+", ", source]
|
||||||
|
|
||||||
|
def compose_quoted_tweet(quoted_tweet, original_tweet):
|
||||||
|
""" It receives a tweet and returns a list with the user, text for the tweet or message, date and the client where user is."""
|
||||||
|
text = StripChars(quoted_tweet["text"])
|
||||||
|
quoting_user = quoted_tweet["user"]["name"]
|
||||||
|
source = re.sub(r"(?s)<.*?>", "", quoted_tweet["source"])
|
||||||
|
try: text = "rt @%s: %s" % (quoted_tweet["retweeted_status"]["user"]["screen_name"], StripChars(quoted_tweet["retweeted_status"]["text"]))
|
||||||
|
except KeyError: text = "%s" % (StripChars(quoted_tweet["text"]))
|
||||||
|
if text[-1] in chars: text=text+"."
|
||||||
|
original_user = original_tweet["user"]["screen_name"]
|
||||||
|
original_text = StripChars(original_tweet["text"])
|
||||||
|
try: original_text = "rt @%s: %s" % (original_tweet["retweeted_status"]["user"]["screen_name"], StripChars(original_tweet["retweeted_status"]["text"]))
|
||||||
|
except KeyError: original_text = "%s" % (StripChars(original_tweet["text"]))
|
||||||
|
quoted_tweet["message"] = _(u"{0}. Quoted tweet from @{1}: {2}").format( quoted_tweet["text"], original_user, original_text)
|
||||||
|
quoted_tweet = tweets.clear_url(quoted_tweet)
|
||||||
|
return quoted_tweet
|
||||||
|
|
||||||
def compose_followers_list(tweet, db, relative_times=True):
|
def compose_followers_list(tweet, db, relative_times=True):
|
||||||
if system == "Windows":
|
if system == "Windows":
|
||||||
original_date = arrow.get(tweet["created_at"], "ddd MMM D H:m:s Z YYYY", locale="en")
|
original_date = arrow.get(tweet["created_at"], "ddd MMM D H:m:s Z YYYY", locale="en")
|
||||||
|
@@ -53,5 +53,3 @@ class twitter(object):
|
|||||||
settings["twitter"]["user_secret"] = user_secret
|
settings["twitter"]["user_secret"] = user_secret
|
||||||
settings.write()
|
settings.write()
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
log.error(certs.where())
|
|
@@ -16,9 +16,11 @@ class trendsPanel(wx.Panel):
|
|||||||
self.create_list()
|
self.create_list()
|
||||||
self.tweet = wx.Button(self, -1, _(u"Tweet"))
|
self.tweet = wx.Button(self, -1, _(u"Tweet"))
|
||||||
self.tweetTrendBtn = wx.Button(self, -1, _(u"Tweet about this trend"))
|
self.tweetTrendBtn = wx.Button(self, -1, _(u"Tweet about this trend"))
|
||||||
|
self.search_topic = wx.Button(self, -1, _(u"Search topic"))
|
||||||
btnSizer = wx.BoxSizer(wx.HORIZONTAL)
|
btnSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
btnSizer.Add(self.tweet, 0, wx.ALL, 5)
|
btnSizer.Add(self.tweet, 0, wx.ALL, 5)
|
||||||
btnSizer.Add(self.tweetTrendBtn, 0, wx.ALL, 5)
|
btnSizer.Add(self.tweetTrendBtn, 0, wx.ALL, 5)
|
||||||
|
btnSizer.Add(self.search_topic, 0, wx.ALL, 5)
|
||||||
self.sizer.Add(btnSizer, 0, wx.ALL, 5)
|
self.sizer.Add(btnSizer, 0, wx.ALL, 5)
|
||||||
self.sizer.Add(self.list.list, 0, wx.ALL, 5)
|
self.sizer.Add(self.list.list, 0, wx.ALL, 5)
|
||||||
self.SetSizer(self.sizer)
|
self.SetSizer(self.sizer)
|
||||||
|
@@ -78,6 +78,7 @@ class tweet(textLimited):
|
|||||||
self.shortenButton.Disable()
|
self.shortenButton.Disable()
|
||||||
self.unshortenButton.Disable()
|
self.unshortenButton.Disable()
|
||||||
self.translateButton = wx.Button(self.panel, -1, _(u"Translate..."), size=wx.DefaultSize)
|
self.translateButton = wx.Button(self.panel, -1, _(u"Translate..."), size=wx.DefaultSize)
|
||||||
|
self.translateButton.Enable(False)
|
||||||
self.autocompletionButton = wx.Button(self.panel, -1, _(u"&Autocomplete users"))
|
self.autocompletionButton = wx.Button(self.panel, -1, _(u"&Autocomplete users"))
|
||||||
self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Send"), size=wx.DefaultSize)
|
self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Send"), size=wx.DefaultSize)
|
||||||
self.okButton.SetDefault()
|
self.okButton.SetDefault()
|
||||||
@@ -138,6 +139,7 @@ class retweet(tweet):
|
|||||||
self.shortenButton.Disable()
|
self.shortenButton.Disable()
|
||||||
self.unshortenButton.Disable()
|
self.unshortenButton.Disable()
|
||||||
self.translateButton = wx.Button(self.panel, -1, _(u"Translate message"), size=wx.DefaultSize)
|
self.translateButton = wx.Button(self.panel, -1, _(u"Translate message"), size=wx.DefaultSize)
|
||||||
|
self.translateButton.Enable(False)
|
||||||
self.autocompletionButton = wx.Button(self.panel, -1, _(u"&Autocomplete users"))
|
self.autocompletionButton = wx.Button(self.panel, -1, _(u"&Autocomplete users"))
|
||||||
self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Send"), size=wx.DefaultSize)
|
self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Send"), size=wx.DefaultSize)
|
||||||
self.okButton.SetDefault()
|
self.okButton.SetDefault()
|
||||||
@@ -199,6 +201,7 @@ class dm(textLimited):
|
|||||||
self.shortenButton.Disable()
|
self.shortenButton.Disable()
|
||||||
self.unshortenButton.Disable()
|
self.unshortenButton.Disable()
|
||||||
self.translateButton = wx.Button(self.panel, -1, _(u"Translate message"), size=wx.DefaultSize)
|
self.translateButton = wx.Button(self.panel, -1, _(u"Translate message"), size=wx.DefaultSize)
|
||||||
|
self.translateButton.Enable(False)
|
||||||
self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Send"), size=wx.DefaultSize)
|
self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Send"), size=wx.DefaultSize)
|
||||||
self.okButton.SetDefault()
|
self.okButton.SetDefault()
|
||||||
cancelButton = wx.Button(self.panel, wx.ID_CANCEL, _(u"Close"), size=wx.DefaultSize)
|
cancelButton = wx.Button(self.panel, wx.ID_CANCEL, _(u"Close"), size=wx.DefaultSize)
|
||||||
@@ -278,6 +281,7 @@ class viewTweet(widgetUtils.BaseDialog):
|
|||||||
self.unshortenButton = wx.Button(panel, -1, _(u"Expand URL"), size=wx.DefaultSize)
|
self.unshortenButton = wx.Button(panel, -1, _(u"Expand URL"), size=wx.DefaultSize)
|
||||||
self.unshortenButton.Disable()
|
self.unshortenButton.Disable()
|
||||||
self.translateButton = wx.Button(panel, -1, _(u"Translate message"), size=wx.DefaultSize)
|
self.translateButton = wx.Button(panel, -1, _(u"Translate message"), size=wx.DefaultSize)
|
||||||
|
self.translateButton.Enable(False)
|
||||||
cancelButton = wx.Button(panel, wx.ID_CANCEL, _(u"Close"), size=wx.DefaultSize)
|
cancelButton = wx.Button(panel, wx.ID_CANCEL, _(u"Close"), size=wx.DefaultSize)
|
||||||
cancelButton.SetDefault()
|
cancelButton.SetDefault()
|
||||||
buttonsBox = wx.BoxSizer(wx.HORIZONTAL)
|
buttonsBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
@@ -333,6 +337,7 @@ class viewNonTweet(widgetUtils.BaseDialog):
|
|||||||
self.unshortenButton = wx.Button(panel, -1, _(u"Expand URL"), size=wx.DefaultSize)
|
self.unshortenButton = wx.Button(panel, -1, _(u"Expand URL"), size=wx.DefaultSize)
|
||||||
self.unshortenButton.Disable()
|
self.unshortenButton.Disable()
|
||||||
self.translateButton = wx.Button(panel, -1, _(u"Translate message"), size=wx.DefaultSize)
|
self.translateButton = wx.Button(panel, -1, _(u"Translate message"), size=wx.DefaultSize)
|
||||||
|
self.translateButton.Enable(False)
|
||||||
cancelButton = wx.Button(panel, wx.ID_CANCEL, _(u"Close"), size=wx.DefaultSize)
|
cancelButton = wx.Button(panel, wx.ID_CANCEL, _(u"Close"), size=wx.DefaultSize)
|
||||||
cancelButton.SetDefault()
|
cancelButton.SetDefault()
|
||||||
buttonsBox = wx.BoxSizer(wx.HORIZONTAL)
|
buttonsBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
|
@@ -87,6 +87,8 @@ class peoplePanelMenu(wx.Menu):
|
|||||||
class trendsPanelMenu(wx.Menu):
|
class trendsPanelMenu(wx.Menu):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(trendsPanelMenu, self).__init__()
|
super(trendsPanelMenu, self).__init__()
|
||||||
|
self.search_topic = wx.MenuItem(self, wx.NewId(), _(u"Search topic"))
|
||||||
|
self.AppendItem(self.search_topic)
|
||||||
self.tweetThisTrend = wx.MenuItem(self, wx.NewId(), _(u"&Tweet about this trend"))
|
self.tweetThisTrend = wx.MenuItem(self, wx.NewId(), _(u"&Tweet about this trend"))
|
||||||
self.AppendItem(self.tweetThisTrend)
|
self.AppendItem(self.tweetThisTrend)
|
||||||
self.view = wx.MenuItem(self, wx.NewId(), _(u"&Show item"))
|
self.view = wx.MenuItem(self, wx.NewId(), _(u"&Show item"))
|
||||||
|
@@ -42,7 +42,6 @@ class mainFrame(wx.Frame):
|
|||||||
self.addToList = user.Append(wx.NewId(), _(u"&Add to list"))
|
self.addToList = user.Append(wx.NewId(), _(u"&Add to list"))
|
||||||
self.removeFromList = user.Append(wx.NewId(), _(u"R&emove from list"))
|
self.removeFromList = user.Append(wx.NewId(), _(u"R&emove from list"))
|
||||||
self.viewLists = user.Append(wx.NewId(), _(u"&View lists"))
|
self.viewLists = user.Append(wx.NewId(), _(u"&View lists"))
|
||||||
self.viewLists.Enable(False)
|
|
||||||
self.details = user.Append(wx.NewId(), _(u"Show user &profile"))
|
self.details = user.Append(wx.NewId(), _(u"Show user &profile"))
|
||||||
self.favs = user.Append(wx.NewId(), _(u"V&iew favourites"))
|
self.favs = user.Append(wx.NewId(), _(u"V&iew favourites"))
|
||||||
|
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"POT-Creation-Date: 2015-08-04 13:37+Hora de verano central (M<>xico)\n"
|
"POT-Creation-Date: 2015-09-29 09:37+Hora de verano central (M<>xico)\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
@@ -51,7 +51,7 @@ msgstr ""
|
|||||||
#: ../doc\strings.py:378 ../doc\strings.py:381 ../doc\strings.py:384
|
#: ../doc\strings.py:378 ../doc\strings.py:381 ../doc\strings.py:384
|
||||||
#: ../doc\strings.py:387 ../doc\strings.py:390 ../doc\strings.py:393
|
#: ../doc\strings.py:387 ../doc\strings.py:390 ../doc\strings.py:393
|
||||||
#: ../doc\strings.py:396 ../doc\strings.py:399 ../doc\strings.py:402
|
#: ../doc\strings.py:396 ../doc\strings.py:399 ../doc\strings.py:402
|
||||||
#: ../doc\strings.py:405 ../doc\strings.py:421 ../doc\strings.py:424
|
#: ../doc\strings.py:405 ../doc\strings.py:423 ../doc\strings.py:426
|
||||||
msgid ""
|
msgid ""
|
||||||
"\n"
|
"\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -361,7 +361,7 @@ msgid "* Global settings: Opens a dialogue which lets you configure settings for
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../doc\strings.py:166
|
#: ../doc\strings.py:166
|
||||||
msgid "* Quit: asks whether you want to exit the program. If the answer is yes, it closes the application. If you do not want to be asked for confirmation before exiting, uncheck the checkbox from the global settings dialogue box."
|
msgid "* Exit: asks whether you want to exit the program. If the answer is yes, it closes the application. If you do not want to be asked for confirmation before exiting, uncheck the checkbox from the global settings dialogue box."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../doc\strings.py:169
|
#: ../doc\strings.py:169
|
||||||
@@ -973,7 +973,7 @@ msgid "* English: [Bryner Villalobos](https://twitter.com/Bry_StarkCR) and [Bill
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../doc\strings.py:408
|
#: ../doc\strings.py:408
|
||||||
msgid "* Arabic: Mohammed Al Shara."
|
msgid "* Arabic: [Mohammed Al Shara](https://twitter.com/mohammed0204)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../doc\strings.py:409
|
#: ../doc\strings.py:409
|
||||||
@@ -989,11 +989,11 @@ msgid "* Basque: [Sukil Etxenike](https://twitter.com/sukil2011)."
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../doc\strings.py:412
|
#: ../doc\strings.py:412
|
||||||
msgid "* Finnish: Jani Kinnunen."
|
msgid "* Finnish: [Jani Kinnunen](https://twitter.com/jani_kinnunen)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../doc\strings.py:413
|
#: ../doc\strings.py:413
|
||||||
msgid "* French: R\303\251mi Ruiz."
|
msgid "* French: [R\303\251mi Ruiz](https://twitter.com/blindhelp38)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../doc\strings.py:414
|
#: ../doc\strings.py:414
|
||||||
@@ -1001,38 +1001,46 @@ msgid "* Galician: [Alba Kinteiro](https://twitter.com/albasmileforeve)."
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../doc\strings.py:415
|
#: ../doc\strings.py:415
|
||||||
msgid "* German: Steffen Schultz."
|
msgid "* German: [Steffen Schultz](https://twitter.com/schulle4u)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../doc\strings.py:416
|
#: ../doc\strings.py:416
|
||||||
msgid "* Hungarian: Robert Osztolykan."
|
msgid "* Croatian: [Zvonimir Stane\304\215i\304\207](https://twitter.com/zvonimirek222)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../doc\strings.py:417
|
#: ../doc\strings.py:417
|
||||||
msgid "* Polish: Pawel Masarczyk."
|
msgid "* Hungarian: Robert Osztolykan."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../doc\strings.py:418
|
#: ../doc\strings.py:418
|
||||||
msgid "* Portuguese: Odenilton J\303\272nior Santos."
|
msgid "* Italian: [Christian Leo Mameli](https://twitter.com/llajta2012)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../doc\strings.py:419
|
#: ../doc\strings.py:419
|
||||||
msgid "* Russian: Alexander Jaszyn."
|
msgid "* Polish: Pawel Masarczyk."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../doc\strings.py:420
|
#: ../doc\strings.py:420
|
||||||
msgid "* Turkish: Burak."
|
msgid "* Portuguese: Odenilton J\303\272nior Santos."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../doc\strings.py:423
|
#: ../doc\strings.py:421
|
||||||
|
msgid "* Russian: [\320\220\320\273\320\265\320\272\321\201\320\260\320\275\320\264\321\200 \320\257\321\210\320\270\320\275](https://twitter.com/radovest)."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc\strings.py:422
|
||||||
|
msgid "* Turkish: [Burak Y\303\274ksek](https://twitter.com/burakyuksek)."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc\strings.py:425
|
||||||
msgid "Many thanks also to the people who worked on the documentation. Initially, [Manuel Cortez](https://twitter.com/manuelcortez00) did the documentation in Spanish, and translated to English by [Bryner Villalobos](https://twitter.com/Bry_StarkCR), [Robert Spangler](https://twitter.com/glasscity1837), [Sussan Rey](https://twitter.com/sussanrey17), [Anibal Hernandez](https://twitter.com/anibalmetal), and [Holly Scott-Gardner](https://twitter.com/holly1994). It was updated by [Sukil Etxenike](https://twitter.com/sukil2011), with some valuable corrections by [Brian Hartgen](https://twitter.com/brianhartgen) and [Bill Dengler](https://twitter.com/codeofdusk)."
|
msgid "Many thanks also to the people who worked on the documentation. Initially, [Manuel Cortez](https://twitter.com/manuelcortez00) did the documentation in Spanish, and translated to English by [Bryner Villalobos](https://twitter.com/Bry_StarkCR), [Robert Spangler](https://twitter.com/glasscity1837), [Sussan Rey](https://twitter.com/sussanrey17), [Anibal Hernandez](https://twitter.com/anibalmetal), and [Holly Scott-Gardner](https://twitter.com/holly1994). It was updated by [Sukil Etxenike](https://twitter.com/sukil2011), with some valuable corrections by [Brian Hartgen](https://twitter.com/brianhartgen) and [Bill Dengler](https://twitter.com/codeofdusk)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../doc\strings.py:426
|
#: ../doc\strings.py:428
|
||||||
msgid "---"
|
msgid "---"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../doc\strings.py:427
|
#: ../doc\strings.py:429
|
||||||
msgid "Copyright \302\251 2013-2015. Manuel Cort\303\251z"
|
msgid "Copyright \302\251 2013-2015. Manuel Cort\303\251z"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
5328
tools/twblue.pot
5328
tools/twblue.pot
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user