Compare commits

...

136 Commits
v0.80 ... v0.84

Author SHA1 Message Date
14b2189840 Merge branch 'next-gen' of https://github.com/manuelcortez/TWBlue into next-gen 2016-08-02 05:38:34 -05:00
16a94aded1 fixed a typo in the russian translation 2016-08-01 15:54:20 -05:00
Jose Manuel Delicado
d352aaeaac Fixed bugs in galician translation 2016-08-01 16:45:01 +02:00
Jose Manuel Delicado
9250aad80b Updated version to 0.84 2016-07-31 20:55:22 +02:00
Jose Manuel Delicado
6e9be63029 Updated translations and documentation 2016-07-31 18:24:47 +02:00
92d8c7257e Changes in long tweet checkbox are reflected in the title bar 2016-07-28 12:45:06 -05:00
Jose Manuel Delicado
6a265f0203 When posting a tweet or dm, the dialog title bar will be updated if an URL is shortened, the tweet is translated or we apply spell checking 2016-07-28 12:35:28 +02:00
Jose Manuel Delicado
b30a0ac25b Call urllib.quote() in the patched urllib3 function 2016-07-28 00:13:16 +02:00
Jose Manuel Delicado
212f49df08 Patched urllib3 included in requests to avoid encoding audio filenames 2016-07-27 23:26:51 +02:00
2c58645e02 Merge branch 'next-gen' of https://github.com/manuelcortez/TWBlue into next-gen 2016-07-27 12:07:54 -05:00
e11a727a77 Updated translations: Russian, finnish, french, german, italian and romanian 2016-07-27 12:07:27 -05:00
Jose Manuel Delicado
d2123fdab7 Try to fix Audio Uploader when the audio file name contains non-ascii characters 2016-07-27 19:05:35 +02:00
45263732b8 Fixed focus movement in tweets. Needs tests 2016-07-27 11:56:38 -05:00
d50e8e2798 Fixed a bug with URLS in complex tweets 2016-07-25 13:58:05 -05:00
Jose Manuel Delicado
990ddf64f5 Updated version to 0.83. Added romanian documentation 2016-07-24 10:59:41 +02:00
ff529eacb4 Updated russian and turkish updates 2016-07-24 02:51:30 -05:00
Jose Manuel Delicado
238607bbe7 Updated pa.c format specification to version 3.3. Now setup.py collects all documentation, including license.txt 2016-07-24 00:31:45 +02:00
0aa51d9529 Updated contributors list 2016-07-23 16:54:53 -05:00
3815ce0a67 Enter will create a new tweet in trends buffers 2016-07-23 16:40:40 -05:00
5e91808b73 Added russian to documentation translations 2016-07-23 16:39:59 -05:00
08259cdf16 Updated program translations 2016-07-23 16:38:53 -05:00
0bbb3afde0 Now is possible to update a conversation 2016-07-23 16:24:06 -05:00
3c0110528f The documentation optino in the sys tray icon is enabled and working 2016-07-23 15:43:38 -05:00
18b52e8909 Fixed load of new items in the visible timeline with inverted buffers 2016-07-20 04:47:39 -05:00
037cfec91a Fixed some shorcuts for dialogs 2016-07-19 09:30:43 -05:00
695b35031e Fixed a bug with long tweets when posting 2016-07-19 09:06:43 -05:00
f9d869e824 Fixed a few issues with long tweets 2016-07-18 09:56:22 -05:00
c1c001ad96 Merge branch 'next-gen' of http://manuelcortez.net:1337/twblue/twblue into next-gen 2016-07-15 12:41:07 -05:00
d768afc329 Image uploader has been rewritten. Images can have description when uploading 2016-07-15 12:29:48 -05:00
Jose Manuel Delicado
4186f1a3e6 Merge branch 'next-gen' of manuelcortez.net:twblue/twblue into next-gen 2016-07-03 20:58:15 +02:00
Jose Manuel Delicado
2eac158a39 Updated Windows dependencies. 2016-07-03 20:57:24 +02:00
1ee629d731 Improving quoted retweets 2016-06-28 10:41:13 -05:00
5590ab47ee Possibly fixes errors with duplicates and focus change in the list 2016-06-28 10:11:56 -05:00
b555ed736c Modified .gitignore 2016-06-27 20:52:51 -05:00
da39f40048 Changed way of detecting quoted statuses. Parsing improvements in tweet displayer 2016-06-27 09:44:36 -05:00
b1cf1c5590 Fixed some things related to twishort's tweets 2016-06-25 19:48:21 -05:00
48232a6cf8 Added set_description to twython API 2016-06-25 17:42:25 -05:00
3bc92af55f Removed sessions when configuration is malformed 2016-05-13 12:09:38 -05:00
Jose Manuel Delicado
5e9218b072 Updated dependencies. Updated documentation about how to build the pa.c version 2016-05-09 10:17:32 +02:00
Jose Manuel Delicado
65f860ceef Installer: upgraded all version strings to 0.82 2016-05-08 12:34:06 +02:00
Jose Manuel Delicado
b9b8145bca Added function com_path() to paths.py. This function is now used in libloader/com.py. Added winpaths to the easy_install example in readme.md. Updated application.py in doc folder. 2016-05-08 11:54:10 +02:00
Jose Manuel Delicado
7fab6bcf54 setup.py: retrieve cacert.pem from requests package. Create application compressed archive. Added a fix for requests to support cacert.pem in different locations. 2016-05-08 00:08:40 +02:00
Jose Manuel Delicado
7ad5e6fa37 Goodbye, Pycurl. Now TWBlue uses requests and requests-based packages for all http connections. Remember to run git submodule update before submiting any commits 2016-05-07 19:26:40 +02:00
Jose Manuel Delicado
f6fec67d52 Small fix in audio uploader 2016-05-06 18:23:26 +02:00
Jose Manuel Delicado
b3cac85c4e AudioUploader: some code cleaning, optimizations and bug fixes 2016-05-06 17:38:17 +02:00
Jose Manuel Delicado
ff49bd2488 extras/audioUploader/transfer.py: use pycurl.XFERINFOFUNCTION; PROGRESSFUNCTION is deprecated since libcurl 7.32. Only convert_bytes is imported from utils module. 2016-05-06 10:24:01 +02:00
Jose Manuel Delicado
45f23a4c8a To protect users privacy, TwUp has been placed after SNDUp in audio services list 2016-05-05 19:15:13 +02:00
Jose Manuel Delicado
a67a5e6264 Updated Windows dependencies. Remember to run git submodule update before submiting new commits. 2016-05-01 10:35:05 +02:00
8988d63f33 Fixed audio upload dialog 2016-04-30 06:16:16 -05:00
2268619101 some improvements in long tweets 2016-04-28 13:54:06 -05:00
a312b7f63c Integrate check for updates at startup in the general tab 2016-04-27 16:33:51 -05:00
92d803717f Added Tweet deletion based in streaming events 2016-04-16 13:31:37 -05:00
2124f6c60b Merge pull request #70 from TWBlueQS/next-gen
Added version indication on the issue-reporting system
2016-04-16 11:31:23 -05:00
29c87dbd3f Merge pull request #79 from codeofdusk/postabandon1
post-abandonment : stage I
2016-04-16 11:29:05 -05:00
1ea3c5d23b Merge pull request #78 from codeofdusk/next-gen
English cleanup
2016-04-16 11:25:02 -05:00
Bill Dengler
547f9393b9 Post-abandonment stage I (add tab to settings, add option to check for updates on app launch). Fixed #76 2016-04-15 18:08:50 -04:00
Bill Dengler
16b34c827b Update readme.
Clean up readme.

change favorite to like in README.
2016-04-15 16:57:50 -04:00
Bill Dengler
56f0f37f39 Fix soundnotes.
Fix soundnotes.

Fix soundnotes.

Add information to soundnotes.

Fixed soundnotes.
2016-04-15 16:57:40 -04:00
3e9143d607 Display direct message dialog properly. Fixed #75 2016-04-11 08:21:29 -05:00
da07859138 When session mute is enabled, you shouldn't hear tl's and lists' updates 2016-04-02 06:57:50 -06:00
dfc2b605f5 Added audio playback from soundcloud 2016-04-02 03:10:29 -06:00
8badd3987a Storage: Removed clean the local database before being deleted 2016-04-02 02:59:59 -06:00
7139a2bcb3 Conversations: Ignores deleted tweets and 404 errors 2016-04-01 08:55:30 -06:00
c4e2c3b57a Fixed photo upload when posting tweets 2016-03-29 16:09:44 -06:00
ed95270d3b Updated twython 2016-03-29 16:09:09 -06:00
edd45a1adf Image description is shown in the view tweets dialogue if is possible 2016-03-29 15:12:16 -06:00
f24d5fec4e Merge branch 'next-gen' of https://github.com/manuelcortez/TWBlue into next-gen 2016-03-28 17:35:57 -06:00
a9b47bb1a4 Tweets made from Rossiyskaya Gazeta don't break the tweets' viewer anymore 2016-03-28 17:35:00 -06:00
8849ce9039 Removed pocket from configuration 2016-03-28 17:03:36 -06:00
Jose Manuel Delicado
8b4f16ef84 Updated version to 0.82. Stable.json: updated version to 0.81 2016-03-28 13:16:25 +02:00
dbbe6c0600 TWBlue 0.81 has been officially released 2016-03-25 01:24:30 -06:00
3caef5fc81 Updated translations 2016-03-24 22:33:53 -06:00
7cd58708cc Added FightingGames as an official soundpack. @deng90 2016-03-24 22:32:28 -06:00
0814af3bf4 Added notes to the Qwitter soundpack 2016-03-24 22:30:52 -06:00
72ba5a74f5 Minor changes before the next release 2016-03-24 22:18:51 -06:00
cbc301141e Updated translation templates 2016-03-24 22:17:54 -06:00
f466516289 Merge pull request #72 from Oliver2213/next-gen-fork
Fix an error where the geolocate dialog wasn't loading properly
2016-03-23 23:44:01 -06:00
4eef236b1c Merge pull request #73 from Oliver2213/shortcutfix
Fix duplicate shortcut in the reply to tweet dialog
2016-03-23 23:43:24 -06:00
Blake Oliver
ce00083aa2 Fix duplicate shortcut in the reply to tweet dialog
Mention all is now alt+m, translate stays alt+t
2016-03-22 18:35:14 -04:00
Blake Oliver
f92e05ce72 Fix an error where the geolocate dialog wasn't loading properly
For some reason, a standard tweet dialog was being used to display this information, which comes along with spell check, translate, etc; functions a simple geolocate display box doesn't need.
The error was happening because the tweet show dialog was accepting (tweet, tweetList, is_tweet=True) as args, and the call to display the geodata was only providing geodata as tweet, and false as tweetList.
This method signature was erroring out because is_tweet was set to True by default; the False was being accepted as tweetList, which the method later tries to call __str__ which it doesn't have.
I could have just added the is_tweet keyword, but then I would need to change the signature so tweetList is set to none by default, update the method, bla, bla, bla. Too much work.
Instead I added another function in wxUI.commonMessageDialogs called view_geodata, which just accepts the data in question as an argument and displays that in a message box.
2016-03-22 11:21:27 -04:00
c02a11f269 Merge pull request #71 from Oliver2213/next-gen-fork
Add hotkeys for some dialogs, making navigation much faster
2016-03-20 10:47:22 -06:00
Blake Oliver
c79e659b74 Add hotkeys for some dialogs, making navigation much faster 2016-03-20 10:26:05 -04:00
da8009aea0 If a config file is bad formed, it should print errors in logs 2016-03-19 20:59:04 -06:00
2778d2e85d Fixed the chicken nugget keymap 2016-03-19 20:58:14 -06:00
ce9a50903c Changed tokens to the stable version 2016-03-19 20:08:48 -06:00
9a7d39c125 Don'w show relationship status if there is any relationship between user 2016-03-19 20:08:20 -06:00
89759e7d49 Merge branch 'next-gen' of https://github.com/manuelcortez/TWBlue into next-gen 2016-02-20 06:53:02 -06:00
7ca9d42f5f Added a new contributor. Welcome and thanks @ButchullaWoman! 2016-02-20 06:52:39 -06:00
Jose Manuel Delicado
6a6bec880c SessionManager.WXUI: now the dialog title is translatable 2016-02-20 13:51:12 +01:00
7b22c7d0f8 Added relationship information in user details dialogue. 2016-02-20 06:43:56 -06:00
058866831b Fixed an unhandled exception in updater 2016-02-20 06:34:26 -06:00
229f698e72 Added a mirror URL for checking updates if the main URL is not working 2016-02-19 09:15:46 -06:00
32067d3171 Added json files for the updater 2016-02-19 09:08:27 -06:00
a8f7477a1f new snapshot 2016-02-02 09:38:43 -06:00
9b6461e34e Updated translations 2016-02-02 09:37:06 -06:00
eed3f81cb8 Added a changelog html file 2016-02-02 09:30:13 -06:00
e605c750b1 Spell checker: Now it should work with the default language setting 2016-02-02 09:29:35 -06:00
f49be6cfed Merge branch 'next-gen' of https://github.com/manuelcortez/TWBlue into next-gen 2016-02-02 09:09:56 -06:00
696faed007 Fixed a bug in the spell checker 2016-02-02 09:07:40 -06:00
Iván Novegil
70169a2a4a Merge branch 'next-gen' of https://github.com/manuelcortez/twblue into next-gen 2016-01-31 12:18:19 +01:00
Jose Manuel Delicado
46b46c4d6d Some important code fixes 2016-01-30 17:14:41 +01:00
Iván Novegil
0875b7ef92 Merge branch 'next-gen' of https://github.com/manuelcortez/twblue into next-gen 2016-01-22 18:08:11 +01:00
Jose Manuel Delicado
9cdccca5ff Updated Windows dependencies with the new pa.c installer 3.1.1 2016-01-21 14:00:21 +01:00
Iván Novegil
e3e4fa42db Merge branch 'next-gen' of https://github.com/manuelcortez/twblue into next-gen 2016-01-20 21:11:33 +01:00
Iván Novegil
6e0c6de0af Now the application indicates the user's version and if it's snapshot or not when reporting an issue trough the issue-reporter 2016-01-20 21:04:33 +01:00
Jose Manuel Delicado
564bee3850 Updated Windows dependencies. Updated readme with information about the new pywin32 and pycurl releases 2016-01-20 20:52:44 +01:00
Jose Manuel Delicado
79e723f740 Updated windows dependencies. Run git submodule update. 2016-01-20 20:28:54 +01:00
Jose Manuel Delicado
08a2eca98d Main.py: check if Uninstall.exe exists before importing commandline and other modules 2016-01-20 09:18:27 +01:00
Jose Manuel Delicado
c830d4b5b4 The -i and -p switches aren't required anymore on installed and portable versions 2016-01-19 19:52:09 +01:00
112391afeb Merge pull request #68 from masonasons/next-gen
Trimmed the sounds in the soundpack.
2016-01-11 13:41:06 -06:00
masonasons
39e0431b97 Trimmed the beginnings of the sounds in the Default soundpack 2016-01-09 01:01:20 -06:00
071d75926b Opus support for TWBlue. Code by @masonasons 2016-01-09 00:46:33 -06:00
56b64e5c6d Added source in view tweet dialogue. @masonasons 2016-01-09 00:45:52 -06:00
b8cfd60c9e bugfix 2016-01-09 00:25:28 -06:00
691a9ae17d Fixed remove_buffer and load_previous_items for friends and users timelines 2015-12-29 08:31:13 -06:00
214b9a8809 Fixed a bug with the restart_stream function 2015-12-28 09:05:09 -06:00
e85f54e15c Merge pull request #67 from Oliver2213/update-readme
Update the "upgrade all" command to include missing dependencies
2015-12-27 11:09:59 -06:00
blake oliver
d2245c33ce Update the "upgrade all" command to include missing dependencies 2015-12-27 11:43:25 -05:00
ff6695bba3 Added ANY in the language list for tweet searches 2015-12-27 00:03:15 -06:00
cdcdc86627 Changed go_page_up and go_page_down in the win10 default keymap 2015-12-26 23:39:31 -06:00
b4addf9329 Add update buffer option to the menu bar 2015-12-26 23:34:19 -06:00
9d0c9cfdb5 Don't get new items for people buffers 2015-12-26 23:28:46 -06:00
0afba81c71 Update buffers by pressing ctrl+win+shift+u; workaround for dm issues 2015-12-26 09:02:08 -06:00
0882e4707d Removed an unneeded import in translator module 2015-12-23 09:52:32 -06:00
78079e142f Changed handlers for sent direct messages 2015-12-23 09:51:09 -06:00
00a4203e1a Switched to the microsoft translator 2015-12-23 09:48:50 -06:00
c4fae3b70b Windows key is no longer required in keymap editor 2015-12-17 08:28:20 -06:00
b8dfa4a5e8 added audio playback to the keymap editor 2015-12-16 20:16:18 -06:00
1ca1862a08 Merge branch 'next-gen' of https://github.com/manuelcortez/TWBlue into next-gen 2015-12-16 16:40:30 -06:00
ba76c74324 Minor changes in session controller 2015-12-16 16:32:58 -06:00
Jose Manuel Delicado
dda37f0083 Updated windows dependencies. Run git submodule update before submiting new commits. Updated readme.md with information about the portableapps.com format. 2015-12-14 13:46:55 +01:00
65c353450e Improvements in the tweets' searched 2015-12-09 17:25:46 -06:00
2bfb53abe1 Added showing followers and friends timelines 2015-12-09 11:51:37 -06:00
ab08eada81 Fixed TWBlue in non-ascii paths 2015-12-09 10:05:17 -06:00
Jose Manuel Delicado
5fcc1de9a5 Updated windows dependencies, remember to run git submodule update after pulling the repository! Removed wheel information about pycurl in readme and updated download links 2015-11-30 17:38:58 +01:00
Jose Manuel Delicado
baeb0f7ae8 Updated pa.c format to version 0.80, added romanian language to the installer 2015-11-30 11:50:59 +01:00
190 changed files with 21076 additions and 17878 deletions

3
.gitignore vendored
View File

@@ -16,4 +16,5 @@ src/Microsoft.VC90.CRT
src/Microsoft.VC90.MFC
src/launcher.bat
src/sounds/iOs
release-snapshot/
release-snapshot/
src/com_cache/

View File

@@ -1,13 +1,12 @@
TWBlue -
TWBlue -
======
Copyright (C) 2015. [Technow S.L.](https://www.technow.es)
Copyright (C) 2016. [Technow S.L.](https://www.technow.es)
TW Blue is an app designed to use Twitter simply and efficiently while using minimal system resources.
With this app youll have access to twitter features such as:
* Create, reply to, retweet and delete tweets,
* Add and remove tweets from favourites,
* Create, reply to, like, retweet and delete tweets,
* Send and delete direct messages,
* See your friends and followers,
* Follow, unfollow, block and report users as spam,
@@ -18,9 +17,9 @@ With this app youll have access to twitter features such as:
See [TWBlue's webpage](http://twblue.es) for more details.
## Using TWBlue from sources
## Running TWBlue from source
This document describes how to run tw blue from source, and, after that, how to build a binary version, which doesn't need Python and the other dependencies to run.
This document describes how to run tw blue from source and how to build a binary version which doesn't need Python and the other dependencies to run.
### Required dependencies.
@@ -32,12 +31,10 @@ Although most dependencies can be found in the windows-dependencies directory, w
#### Dependencies packaged in windows installers
* [Python,](http://python.org) version 2.7.10
* [Python,](http://python.org) version 2.7.11
If you want to build both x86 and x64 binaries, you can install python x86 to C:\python27 and python x64 to C:\python27x64, for example.
* [wxPython](http://www.wxpython.org) for Python 2.7, version 3.0.2.0
* [Python windows extensions (pywin32)](http://www.sourceforge.net/projects/pywin32/) for python 2.7, build 219
* [Pycurl](http://pycurl.sourceforge.net) 7.19.5.1 for Python 2.7: [32-bit downloads,](https://pypi.python.org/pypi/pycurl/7.19.5.1) [64-bit downloads](http://www.lfd.uci.edu/~gohlke/pythonlibs/)
Note: the x64 version is in wheel format instead of executable installer, so you have to install it using pip. For example: C:\python27x64\scripts\pip install pycurl-7.19.5.1-cp27-none-win_amd64.whl
* [Python windows extensions (pywin32)](http://www.sourceforge.net/projects/pywin32/) for python 2.7, build 220
* [PyEnchant,](http://pythonhosted.org/pyenchant/) version 1.6.6.
x64 version has been built by TWBlue developers, so you only will find it in windows-dependencies folder
@@ -49,7 +46,7 @@ To build a binary version:
#### Dependencies that must be installed using easy_install
setuptools install a script, called easy_install. You can find it in the python scripts directory. To install packages using easy_install, you have to navigate to the scripts directory using a command prompt, for example:
setuptools installs a script, called easy_install. You can find it in the python scripts directory. To install packages using easy_install, you have to navigate to the scripts directory using a command prompt, for example:
cd C:\python27x64\scripts
@@ -65,17 +62,18 @@ setuptools install a script, called easy_install. You can find it in the python
* pypubsub
* configobj
* requests-oauthlib
* requests-toolbelt
* future
* pygeocoder
* suds
* arrow
* goslate
* arrow==0.6
* markdown
* pocket
* winpaths
* microsofttranslator
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:
easy_install -Z --upgrade six configobj goslate markdown future pocket suds requests oauthlib requests-oauthlib pypubsub pygeocoder arrow python-dateutil futures
easy_install -Z --upgrade six configobj goslate markdown future suds requests oauthlib requests-oauthlib requests-toolbelt pypubsub pygeocoder arrow==0.6 python-dateutil futures markdown microsofttranslator winpaths
#### Other dependencies
@@ -90,6 +88,14 @@ This dependency has been built using pure basic 4.61. Its source can be found at
* [NSIS unicode,](http://www.scratchpaper.com/) version 2.46.5
#### Dependencies required to build the portableApps.com format archive
* [NSIS Unicode Portable,](http://portableapps.com/apps/development/nsis_portable) version 2.46.5 rev 3
* [PortableApps.com Launcher,](http://portableapps.com/apps/development/portableapps.com_launcher) version 2.2
* [PortableApps.com Installer,](http://portableapps.com/apps/development/portableapps.com_installer) version 3.1.3
Important! Install these 3 apps into the same folder, otherwise you won't be able to build the pa.c version. For example: D:\portableApps\NSISPortable, D:\PortableApps\PortableApps.com installer, ...
### Running TW Blue from source
Now that you have installed all these packages, you can run TW Blue from source using a command prompt. Navigate to the repo's src directory, and type the following command:
@@ -117,7 +123,7 @@ To build it, run the following command from the src folder:
### Building an installer
If you want to install TWBlue in your computer, you must create the installer first. Follow these steps:
If you want to install TWBlue on your computer, you must create the installer first. Follow these steps:
* Navigate to the src directory, and create a binary version for x86: C:\python27\python setup.py py2exe
* Move the dist directory to the scripts folder in this repo, and rename it to twblue
@@ -129,3 +135,15 @@ If you want to install TWBlue in your computer, you must create the installer fi
### How to generate a translation template
Run the gen_pot.bat file, located in the tools directory. Your python installation must be in your path environment variable. The pot file will appear in the tools directory.
### How to build the portableApps.com archive
If you want to have TWBlue on your PortableApps.com platform, follow these steps:
* Navigate to the src directory, and create a binary version for x86: C:\python27\python setup.py py2exe
* Move the dist directory to the misc\pa.c format\app folder in this repo, and rename it to twblue
* Repeat these steps with Python for x64: C:\python27x64\python setup.py py2exe
* Move the new dist directory to the misc\pa.c format\app folder, and rename it to twblue64
* Run the PortableApps.com Launcher Generator, and follow the wizard. Choose the pa.c format folder and continue to generate the launcher. If the wizard is completed, you will see a file named TWBlue portable.exe inside the pa.c format folder.
* Run the PortableApps.com Installer, and follow the wizard. As in the above step, choose the pa.c format folder. When it completes, you will see a file named TWBluePortable_x.y.paf.exe inside the misc folder, where x.y is the version number.

View File

@@ -34,4 +34,12 @@ Holly Scott-Gardner
Anibal Hernández
Sussan Leiva
Brian Hartgen
PEDRO REINA COLOBON
PEDRO REINA COLOBON
Moora-Moora Arrilla
Blake Oliver
Steffen Schultz
Riku
Burak Yüksek
florian Ionașcu
Christian Leo Mameli
Natalia Hedlund (Наталья Хедлунд)

View File

@@ -2,6 +2,17 @@
name = 'TWBlue'
snapshot = False
if snapshot == False:
version = "0.80"
version = "0.84"
update_url = 'http://twblue.es/updates/twblue_ngen.json'
mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/stable.json'
else:
version = "7"
version = "10.99"
update_url = 'http://twblue.es/updates/snapshots_ngen.json'
mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/snapshots.json'
author = u"Manuel Cortéz"
authorEmail = "manuel@manuelcortez.net"
copyright = u"Copyright (C) 2015, Technow S.L. \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.")
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"
report_bugs_url = "http://twblue.es/bugs/api/soap/mantisconnect.php?wsdl"

View File

@@ -7,7 +7,7 @@ languageHandler.setLanguage("en")
import strings
# the list of supported language codes of TW Blue
languages = ["en", "es", "fr", "de", "it", "gl", "ja"]
languages = ["en", "es", "fr", "de", "it", "gl", "ja", "ru", "ro"]
#"eu", "ar", "ca", "es", "fi", "fr", "gl", "hu", "it", "pl", "pt", "ru", "tr"]
def generate_document(language):

View File

@@ -5,8 +5,8 @@
msgid ""
msgstr ""
"Project-Id-Version: TWBlue Documentation\n"
"POT-Creation-Date: 2015-11-27 08:24+Hora estándar central (México)\n"
"PO-Revision-Date: 2015-11-28 15:57+0100\n"
"POT-Creation-Date: 2016-03-31 16:51+Hora de verano romance\n"
"PO-Revision-Date: 2016-07-31 18:23+0200\n"
"Last-Translator: Steffen Schultz <schulle3o@yahoo.de>\n"
"Language-Team: Steffen Schultz <schulle3o@yahoo.de>\n"
"Language: de\n"
@@ -14,7 +14,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: pygettext.py 1.5\n"
"X-Generator: Poedit 1.8.2\n"
"X-Generator: Poedit 1.8.8\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../doc\languageHandler.py:97

View File

@@ -5,8 +5,8 @@
msgid ""
msgstr ""
"Project-Id-Version: twblue-documentation 0.46\n"
"POT-Creation-Date: 2015-11-27 08:24+Hora estándar central (México)\n"
"PO-Revision-Date: 2015-11-27 08:30-0600\n"
"POT-Creation-Date: 2016-03-31 16:51+Hora de verano romance\n"
"PO-Revision-Date: 2016-07-31 18:23+0200\n"
"Last-Translator: Manuel Cortéz <manuel@manuelcortez.net>\n"
"Language-Team: Spanish <manuel@manuelcortez.net>\n"
"Language: es\n"
@@ -14,7 +14,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: pygettext.py 1.5\n"
"X-Generator: Poedit 1.6.11\n"
"X-Generator: Poedit 1.8.8\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-SourceCharset: UTF-8\n"

View File

@@ -1,184 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta name="generator" content="pandoc" />
<title>Liste des Changements</title>
<style type="text/css">code{white-space: pre;}</style>
</head>
<body>
<div id="header">
<h1 class="title">Liste des Changements</h1>
</div>
<h1 id="attention">Attention !</h1>
<p>Avant de poursuivre l'essai du programme, il est considéré que c'est une version de développement. Plus précisément, la version 0.42. Cela signifie qu'il n'est pas seulement possible de trouver des erreurs, mais que vous les trouverez. L'idée est de signaler le plus d'erreurs possibles afin qu'ils puisse être résolus pour les prochaines alphas.</p>
<p>Voici la liste des changements dans le programme. Si vous voulez lire comment l'utiliser, <a href="manual.html">voir ce document.</a> Si vous voyez un lien avec un signe dièse (#) et un code qui commence par plusieurs numéro, vous voyez une erreur qui a été signalé dans le Système de suivi d'incidences. N'hésitez pas à publier vos propres erreurs et demandes d'améliorations et nouvelles fonctionnalités à travers de cet outils, disponible dans le menu Aide de TW Blue.</p>
<h2 id="changements-ajouter-dans-cette-nouvelle-version">Changements ajouter dans cette nouvelle version</h2>
<ul>
<li>Correction d'une erreur qu'elle ne permettait pas d'afficher les listes avec des accents ou des caractères spéciaux dans un tampon.</li>
<li>Maintenant TW blue ne devrait pas actualiser les Tweets soudainement.</li>
<li>Maintenant TW blue supporte l'option &quot;muet&quot; de Twitter. Lorsque cette option est activée pour un utilisateur, vous ne pouvez pas voir ces tweets ni ces mentions, mais vous le suivez toujours, et vous serez en mesure de être en contact avec lui à travers de message direct. Ceci est différent de la fonction Bloquer ou Ne pas suivre, avec cette option l'utilisateur sera pas au courant que vous avez activée l'option muet. sette option se trouvent dans la boîte de dialogue des actions utilisateur de l'interface invisible, ou dans le menu Utilisateur de l'interface graphique.</li>
<li>Un onglet &quot;Audio&quot; a été ajoutée dans la boîte de dialogue de configuration qui vous permet de sélectionner les périphériques d'entrée et de sortie, régler le volume et activer/ désactiver tous les sons pour TW Blue. D'autres options ont été déplacées depuis l'onglet &quot;Général&quot; vers l'onglet &quot;Audio&quot;.</li>
<li>Le fichier de configuration a été repensé. La plupart des options devront être reconfigurés à nouveau.</li>
<li>Vous pouvez maintenant désactiver SAPI5 afin qu'il n'intervienne pas s'il n'y a aucun lecteur d'écran supporté en cours d'exécution.</li>
<li>Dans l'onglet Général, Vous pouvez modifier manuellement la langue. Tw Blue reqiere redémarré.</li>
<li>Maintenant il y a une nouvelle boîte de dialogue où vous pouvez apprendre les différents sons de TW Blue.</li>
<li>Il est possible maintenant de désactiver le son et notification d'un tampon. Le reste du client fonctionnera correctement. Appuyez sur Contrôle+Windows+Maj+m (interface invisible) ou le sélectionnez depuis le menu &quot;Tampon&quot; (interface visible) pour basculer entre cette fonctionnalité.</li>
<li>Vous pouvez maintenant rechercher par utilisateur et par tweets. Les recherches de tweets sont sauvegardées dans la configuration, tandis que ceux des utilisateurs seront supprimer lors de la fermeture. Appuyez sur Ctrl+Windows+- (tiret) (interface invisible) ou le sélectionnez depuis le menu &quot;Application&quot; (interface visible).</li>
<li>Vous pouvez ouvrir le tampon pour voir les favoris d'un utilisateur dans le menu &quot;Utilisateur&quot;.</li>
<li>Maintenant avec Contrôle+Windows+Maj+Flèche Haut / Bas (dans l'interface graphique) et Contrôle+Windows+Flèche Haut / Bas (dans l'interface invisible), vous pouvez aller au tweet précédent ou suivant dans la conversation. Pour que cela fonctionne les tweets de la conversation doivent être dans la chronologie principale.</li>
<li>Au cours d'un enregistrement audio pour ajouter, maintenant vous pouvez mettre en pause ou reprendre l'enregistrement pour sauter des parties qui peuvent générer un audio très long.</li>
<li>Il est maintenant possible de charger de l'audio vers Dropbox. Pour configurer le service aller dans l'onglet &quot;Services audio&quot; dans la boîte de dialogue de Configuration.</li>
<li>Maintenant que vous pouvez charger de l'audio vers Dropbox, dans la boîte de dialogue pour ajouter un audio vous pouvez sélectionner le service auquelle vous souhaitez charger.</li>
<li>Maintenant il comprend une boîte de dialogue pour la correction orthographique pour les tweets ou messages. Les langues actuellement disponibles sont: Espagnol, Anglais, Portugais, Russe et Polonais. La langue sera sélectionnée automatiquement selon la configuration de TW Blue.</li>
<li>Ajouter la lecture automatique des Tweets pour un tampon. L'activation de cette fonctionnalité peut faire que TW Blue lit automatiquement les tweets lors de l'arrivée dans les tampons qui ont cette option activée. Appuyez sur Contrôle+Windows+e pour basculer entre cette fonction.</li>
<li>Dans la boîte de dialogue de Configuration maintenant vous pouvez spécifiez si vous voulez que TW Blue démarre avec l'interface invisible.</li>
<li>Les URLs s'affiche dans leur version originale. Uniquement les photos de Twitter ils apparaissent toujours comme réduites, et celles qui ont été réduites manuellement avant de les envoyer dans un tweet.</li>
</ul>
<h2 id="changements-ajouter-dans-la-version-0.40">Changements ajouter dans la version 0.40</h2>
<ul>
<li>Vous pouvez changer entre les différents paquets de sons utilisé par TW Blue et de créer vos propres sons. Chaque paquet doit être dans un répertoire par séparé dans le dossier sounds. Pour modifier le paquet de sons vous pouvez le sélectionner dans la boîte de dialogue de configuration.</li>
<li>Les fichiers audio doivent être au format OGG.</li>
<li>TW Blue doit être maintenant en mesure de fermer correctement.</li>
<li>L'heure est écrit tenant en compte le format 12 heures (AM /P M).</li>
<li>L'heure est écrit d'accord au fuseau horaire que vous avez défini dans votre compte Twitter.</li>
<li>Ajout de nouvelles traductions en Portugais, Polonais et Russe. Merci les gars !</li>
<li>TW Blue supprime de la configuration la chronologie de l'utilisateur qui ont changé leur noms ou supprimer leurs comptes Twitter.</li>
<li>Maintenant est gérés la grande majorité des événements dans Twitter avec le tampon des événements.</li>
<li>Il est maintenant possible de voir le texte des événements avec Contrôle+Maj+V (GUI) ou Contrôle+Windows+V (interface invisible).</li>
<li>Gestionnaire de listes: Vous pouvez créer, modifier, supprimer, afficher une liste comme tampon dans TW Blue, ajouter et supprimer des membres d'une liste.</li>
<li>Maintenant, si au démarrage de TW Blue il tente de charger une chronologie qui n'existe pas, automatiquement il la supprime de la configuration et il continue à charger normalement.</li>
<li>Seuls seront chargées jusqu'à 400 following et followers pour éviter les problèmes avec l'API. Elle sera corrigée dans les versions futures.</li>
<li>Pour le mode invisible, il inclus des raccourcis pour réentendre le tweet sur lequel vous êtes (Contrôle+Windows+espace) et pour copier le message dans le presse-papiers (Contrôle+Windows+c).</li>
</ul>
<h2 id="changements-ajouter-dans-la-version-0.38">Changements ajouter dans la version 0.38</h2>
<ul>
<li>Correction d'une erreur qui empêchait en donnant l'ordre de fermer.</li>
<li>Maintenant les tweets ne finissent pas par un point obligatoirement. Si le programme détecte que le tweet se termine par une lettre ou un chiffre, il va placez un point automatiquement. Si ce n'est pas le cas, il va laisser le texte tel qu'il est.</li>
<li>Il est maintenant possible de charger des images aux tweets et réponses. Veuillez noter que la taille des images est mis en place par twitter.</li>
<li>Pour se déplacer vers la gauche ou vers la droite en utilisant le mode invisible, maintenant il s'annonce uniquement des informations de la position dans la liste d'éléments.</li>
<li>TW Blue devrait maintenant fonctionner pour Windows XP au moment de la demande d'autorisation pour l'application.</li>
<li>Ajouté une nouvelle option dans la boîte de dialogue de configuration qui vous permet de revenir à vos tampons. Cela signifie que vous pouvez choisir si vous voulez voir les tweets comme jusqu'à maintenant, ou que les plus nouveaux soit placés vers le haut et les anciens vers le bas.</li>
<li>Maintenant les photos peuvent être chargées aux profil de Twitter, disponible à partir de la boîte de dialogue Mettre à jour votre profil.</li>
<li>Ajouté un tampon d'événements, où ils sont stockés pour le moment quelques événements qui se déroulent dans Twitter, comme suivre ou faire que quelqu'un vous suivent, marquer un favori, que un de vos tweet soit marqué comme favoris, Etc. Vous pouvez activer et désactiver ce tampon de la boîte de dialogue de configuration.</li>
<li>Maintenant, vous pouvez supprimer des chronologies déjà créé qui ne contiennent pas des tweets, et il ne sera pas permit de créer des chronologies pour les utilisateurs sans tweets.</li>
<li>L'interface de l'application est traduisible. Maintenant, n'importe quel utilisateur peut faire leurs propres traductions en différentes langues.</li>
</ul>
<h2 id="changements-ajouter-dans-la-version-0.36">Changements ajouter dans la version 0.36</h2>
<ul>
<li>Les utilisateurs brésiliens pourront voir quelques messages en Portugais. (Usuários brasileiros poderão ver algumas mensagens em Português).</li>
<li>Correction d'une erreur qui fait que quelques sons ils peuvent s'entendre et d'autres non. Maintenant, ils devraient s'entendre tous.</li>
<li>La réconnexion aussi a reçu une correction, parce que parfois, il s'effectué de façon incorrecte et il devait s'ouvrir à nouveau l'application.</li>
<li>Maintenant TW Blue permet de supprimer uniquement les chronologies avec la commande correspondante. Avant il s'affichées la boîte de dialogue peu importe dans quel tampon vous aviez été.</li>
<li>Vous êtes en mesure à nouveau de voir les détails des utilisateurs avec la touche Entrée étant dans le tampon pour les following ou followers.</li>
<li>À partir de cette version, il n'y a pas de support pour les bases de données.</li>
<li>Vous entendrez une notification vocale lorsque quelqu'un marque comme favori un de vos tweets.</li>
<li>Les following et followers sont déjà mis à jour.</li>
<li>lorsque vous suivez quelqu'un, il ne se produit aucune erreur Si ne sont pas affichées les following. C'est la même chose avec les followers.</li>
<li>Vous pouvez effacer un tampon en appuyant sur Maj+Supprimer dans la fenêtre visible, et Contrôle+Windows+Maj+Supprimer dans la fenêtre invisible. Ceci va vider tous les tweets dans le tampon courant.</li>
</ul>
<h2 id="changements-ajouter-dans-la-version-0.35">Changements ajouter dans la version 0.35</h2>
<ul>
<li>Il existe un site Web officiel pour le programme, aller sur <a href="http://twblue.com.mx">twblue.com.mx.</a> Dans cet espace, vous trouverez le système de suivi d'erreurs, le blog avec les dernières nouvelles, et la dernière version disponible.</li>
<li>TW Blue il annonce lorsque vous êtes mentionné, et lorsque vous obtenez un message direct.</li>
<li>Jaws il ne dit pas le raccourci clavier qui est appuyé dans le mode invisible. <a href="http://twblue.a12x.net/errores/view.php?id=11">#11</a></li>
<li>Dans le mode invisible, les commandes Contrôle+Windows+Origine, Contrôle+Windows+Fin, Contrôle+Windows+Page Suivante et Contrôle+Windows+Page Précédente va aller vers le haut de la liste, vers la fin, 20 éléments vers le bas et 20 éléments vers le haut respectivement. <a href="http://twblue.a12x.net/errores/view.php?id=10">#10,</a> <a href="http://twblue.a12x.net/errores/view.php?id=21">#21,</a> <a href="http://twblue.a12x.net/errores/view.php?id=22">#22</a></li>
<li>Maintenant vous pouvez lire l'audios d'Audiobook.</li>
<li>Maintenant, le flux doit être connecté une fois que la machine revient d'une suspension.</li>
<li>Il est possible d'enregistrer de l'audio ou charger fichiers sur SndUp.net. Si vous êtes inscrit dans cette page, vous pouvez mettre dans la configuration votre API Key pour que les fichiers se charge sur votre nom. Vous pouvez charger des fichiers Wav, OGG et MP3. Les fichiers wav ils seront récodifier en OGG.</li>
<li>Si vous n'utilisez aucun lecteur d'écran, quelques actions de TW blue utilisent la synthèse vocale SAPI5.</li>
<li>Il existe une version pour les architectures de 64 Bits. Merci à <span class="citation">[@jmdaweb]</span>(https://twitter.com/jmdaweb) pour prendre le travail de faire fonctionner l'application dans cette architecture et la préparez pour sa distribution.</li>
<li>Changement dans les sons du client. Merci à <span class="citation">[@guilevi_es]</span>(https://twitter.com/guilevi_es) pour la collaboration avec le paquet de sons.</li>
<li>Quelques messages du programme peuvent être traduits. Dans des futures versions la totalité de l'interface sera internationalisé.</li>
<li>Et quelques correction d'erreur en plus (<a href="http://twblue.com.mx/errores/view.php?id=5">#5,</a> <a href="http://twblue.com.mx/errores/view.php?id=7">#7,</a> <a href="http://twblue.com.mx/errores/view.php?id=8">#8,</a> <a href="http://twblue.com.mx/errores/view.php?id=9">#9,</a> <a href="http://twblue.com.mx/errores/view.php?id=12">#12,</a>)</li>
</ul>
<h2 id="changements-ajouter-dans-la-version-0.3">Changements ajouter dans la version 0.3</h2>
<ul>
<li>Maintenant vous pouvez mettre à jour votre profil à partir de TW Blue. <a href="http://twblue.a12x.net/issues/view.php?id=19">#19</a></li>
<li>Maintenant vous pouvez créer les chronologies à nouveau et ils ne donne pas de problèmes. <a href="http://twblue.a12x.net/issues/view.php?id=24">#24</a></li>
<li>Maintenant les fichiers d'erreur sont enregistrés dans le répertoire &quot;logs&quot;.</li>
<li>Lorsque vous créez une chronologie, il sera mis à jour en temps réel dès le début au lieu de le mettre à jour toutes les 2 minutes.</li>
<li>Vous pouvez maintenant demander davantage d'appels à l'API qui fonctionnera pour obtenir 200 tweets chaqu'une. Un appel est équivalent à 200 éléments de la liste principal, mentions, messages directs, favoris et chronologies. Dans le fichier de configuration Vous pouvez modifier l'option dans [twitter]/max_api_calls. Il est recommandé de ne pas demander à Twitter plus de 2 appels à l'API, ou sinon vous arriverez bientôt à la limite des appels autorisés et l'application échouera.</li>
<li>Lorsque vous répondez à un Tweet, c'est envoyé comme réponse au même et pas comme s'il s'agissait d'un nouveau tweet.</li>
<li>L'ancien système de rapport d'erreurs il a dû être changée. À partir de cette version, vous pouvez signaler des erreurs, directement depuis l'application. L'option Signaler une erreur ouvrira une boîte de dialogue qui vous demande des détails sur votre erreur et il va envoyer le rapport automatiquement.</li>
<li>Ils sont déjà supprimées les following lorsque ils ne suivent pas un utilisateur.</li>
<li>Aussi les favoris, au moment de retirer un tweet comme favori, il exécutent le changement.</li>
<li>Ajouté une boîte de dialogue de configuration qui permet de contrôler le nombre d'appels à l'API à exécuter, si oui ou non utiliser des bases de données, et masquer ou afficher les listes de following, followers et favoris.</li>
<li>En mentionnant les tweets, les guillemets qui entourent le message maintenant sont séparés par un espace de la dernière lettre. Il en est ainsi parce qu'avant, lorsque il y avait une URL, il causé que les guillemets facent partie de l'URL en envoyant vers des sites inexistants.</li>
<li>Améliorations avec quelques chronologies. Vous pouvez maintenant enregistrer une chronologie sans problèmes. Il ne devrait pas faire des erreurs.</li>
<li>Maintenant, l'audio est joué seulement avec Contrôle+Entrée, tandis que l'URL s'ouvrira avec la touche Entrée.</li>
<li>Le flux tentera de se reconnecter à l'échec de la connexion internet.</li>
<li>Maintenant depuis les followers et following on peut mentionner un utilisateur.</li>
<li>Maintenant il est fournit un mode &quot;invisible&quot;. Sous le menu &quot;Application&quot;, dans l'option &quot;Masquer la fenêtre&quot; ou en appuyant sur Contrôle+M. Pour afficher la fenêtre à nouveau appuyez sur Contrôle+Windows+M.</li>
</ul>
<h2 id="changements-ajouter-dans-la-version-0.025">Changements ajouter dans la version 0.025</h2>
<p>Veuillez noter que lorsque un utilisateur vous ne sui pas ou vous ne suivez pas quelqu'un d'autre, la liste des following ou des followers il ne sera pas mis à jour pour le moment. Lorsque vous redémarrez le programme, si les informations son correctes ils seront afficher.</p>
<ul>
<li>Correction d'une erreur qui rendait impossible de fermer l'application jusqu'à ce que le programme a annoncé qu'elle était prête. <a href="http://twblue.a12x.net/issues/view.php?id=17">#17</a> y <a href="http://twblue.a12x.net/issues/view.php?id=18">#18</a></li>
<li>Changé la façon d'organiser les chronologies dans la configuration. Il est nécessaire de les recréer.</li>
<li>Maintenant, vous pouvez envoyer un message direct aux following et followers en utilisant le bouton. Cela ne fonctionnait pas dans la version 0.02 et 0.021.</li>
<li>Vous pouvez augmenter et diminuer le volume depuis la liste des followers et following.</li>
<li>Dans la boîte de dialogue pour écrire un tweet peut être maintenant traduit le message à l'aide de Google Traductor. Une boîte de dialogue s'affiche pour demander les langues source et destination.</li>
<li>Le menu fichier contient l'option Sortir.</li>
<li>À partir de cette version ils se jouera uniquement les fichiers de'audio en appuyant sur Entrée s'ils contienne le hashtag #audio.</li>
<li>Vous pouvez essayer de jouer une URL quelconque sans qui comporte le hashtag #audio en appuyant sur Contrôle+Entrée. Cette commande va tenter de reproduire la première URL trouvée.</li>
<li>A été amélioré le moteur de recherche d'URLS, en rendant plus rapide la fonction et maintenant, devrait être capable de détecter toutes les URLS. <a href="http://twblue.a12x.net/issues/view.php?id=21">#21</a></li>
<li>Maintenant, la boîte de dialogue qui s'affiche pour sélectionner l'utilisateur que vous souhaitez afficher les détails permet en plus de le sélectionner dans une liste, écrire le nom de l'utilisateur que vous souhaitez.</li>
</ul>
<h2 id="changements-ajouter-dans-la-version-0.02-et-0.021">Changements ajouter dans la version 0.02 et 0.021</h2>
<ul>
<li>Le message qui se reproduicé lorsque vous suivez un utilisateur maintenant dit &quot;maintenant vous suivez à x utilisateur&quot; en lieu de &quot;maintenant vous ne suivez pas à x utilisateur&quot;. <a href="http://twblue.a12x.net/issues/view.php?id=5">#5</a></li>
<li>Lorsque vous sorter une boîte de dialogue vous demandera si vous voulez le faire. Maintenant vous sorter d'une façon beaucoup plus proprement du programme, empêchant plusieurs erreurs pendant la fermeture.</li>
<li>Changement des sons pour les dm entrant et sortant. Merci à <span class="citation">[@marcedsosa]</span>(https://twitter.com/marcedsosa) pour les nouveaux sons.</li>
<li>Le Nom d'utilisateur de twitter il se lit dans le titre de la fenêtre.</li>
<li>Les sons du programme aussi peuvent lire le volume depuis la configuration. Le module de sons devrait prendre moins de temps pour reproduire plusieurs des sons de l'application.</li>
<li>Les actions d'augmenter et de diminuer le volume ils reproduisent un son indiquant que tant forts ça sonne.</li>
<li>Il n'affichent plus les mentions de personnes qui ne vous suivent pas dans votre chronologie principal. <a href="http://twblue.a12x.net/issues/view.php?id=1">#1</a></li>
<li>Vous pouvez maintenant supprimer les tweets et les messages directs. Vous ne pouvez supprimer que les tweets que vous avez écrit.</li>
<li>Correction d'une erreur qui empêchait de charger correctement les différentes listes si dans quelques une d'elles ils n'y avait aucun tweet, utilisateur ou message direct. Ceci affectant surtout les comptes avec 0 favoris, 0 tweets, 0 envoyés ou 0 messages directes. <a href="http://twblue.a12x.net/issues/view.php?id=2">#2</a></li>
<li>Maintenant à chaque fois qu'une nouvelle version est disponible, vous serez informé de cela. Si vous avez accès pour le télécharger, le programme va télécharger et copier tout ce dont vous avez besoin.</li>
<li>Maintenant, vous pouvez obtenir la liste complète des following et followers.</li>
<li>Ajouter la date du dernier tweet des followers et following.</li>
<li>Les following et followers sont maintenant mis à jour en temps réel. (ToDo: Les following et followers ils ne montrent pas la date de ces dernier tweet lorsque une mise à jour est faite en temps réel. Ils le font lors du rechargement une fois redémarrée l'application).</li>
<li>L'ordre des onglets il a changé. Maintenant ils sont classés en commençant par Principal, Mentions, Messages directs et Envoyés.</li>
<li>Maintenant dans la liste de tweets envoyés les messages directs sont affichés lorsque le flux est chargé pour la première fois. Ceci ne était pas le cas et si l'utilisateur envoyés un DM à partir d'un autre client lorsque Tw Blue n'était pas ouvert, lors de l'ouverture de l'application il ne montré pas la dite DM. <a href="http://twblue.a12x.net/issues/view.php?id=8">#8</a></li>
<li>Con Control+A, se puede seleccionar todo el texto de un mensaje. Funciona con Jaws y NVDA.</li>
<li>Il y a des raccourcis clavier (détaillés dans la <a href="leeme.html">Documentation)</a> pour un grand nombre d'actions qui peut faire le programme.</li>
<li>Maintenant TW Blue détecte plus d'audio dans les URLS qui vienne dans les retweets, et des audio partagé à partir de Dropbox. <a href="http://twblue.a12x.net/issues/view.php?id=3">#3</a></li>
<li>Inclut la documentation pour l'application et les crédits.</li>
<li>Si la connexion internet s'arrête de fonctionner, le flux va essayer de se reconnecter pendant 30 minutes.</li>
<li>On a écrit un document qui détaille comment utiliser le programme.</li>
<li>Il a été ouvert le <a href="http://twblue.a12x.net/issues/">Système de suivi d'incidents</a> où les utilisateurs peuvent signaler des erreurs et si vous le souhaitez, vous pouvez apporter de nouvelles idées pour le développement de l'application. Il existe un accès direct au formulaire réservée au rapport d'incidents dans le menu Aide.</li>
<li>Il y a maintenant des crédits à partir de la version actuelle.</li>
<li>Ajout d'une option dans menu Utilisateur pour afficher les détails. Cela fonctionne également si vous appuyez sur entrer sur un following ou follower.</li>
</ul>
<h2 id="changements-ajouter-dans-la-version-prealpha1">Changements ajouter dans la version Prealpha1</h2>
<p>Veuillez noter que dans cette version les following et les followers ne sont pas mis à jour automatiquement. Cela s'ajoutera à une autre version. Vous ne pouvez pas également supprimer des tweet, ou DM. Tous les tweets, messages directs, mentions, favoris, followers et following lors de la mise à jour seront télécharger un maximum de 200. Bientôt ils s'ajouteront plus à la quantité lors des mises à jour. Ici les changements à partir de la première version.</p>
<ul>
<li>La date il s'affiche bien, selon le fuseau horaire de l'utilisateur.</li>
<li>Maintenant, le curseur est placé au début lorsque vous allez à répondre ou faire un retweet.</li>
<li>Si vous appuyez sur contrôle + E dans les zones d'édition, l'intégralité du message sera sélectionné.</li>
<li>Quelques corrections pour la gestion des chronologies (j'ai besoin d'apporter des améliorations dans la façon de gérer cela).</li>
<li>Les favoris sont mises à jour en temps réel.</li>
<li>Vous entendrez un son lorsque vous passez par un tweet qui pourrait contenir un audio jouable.</li>
<li>Supporte la lecture audio avec le hashtag #audio et une URL. Appuyez sur Entrée pour entendre la chanson. Appuyez sur F5 pour diminuer le volume de 5%, ou f6 pour augmenter d'un 5%. Si vous souhaitez arrêter la lecture, aller où il y a une audio, puis appuyez sur Entrée. Si le programme est incapable de reproduire quelque chose, il vous avertira. Le volume de la musique (pas pour les sons du programme pour l'instant) est enregistré dans la configuration, et le programme va le mémorisé pour la prochaine fois que vous jouez quelque chose.</li>
<li>Vous pouvez voir les 200 premiers following et followers avec leurs noms d'utilisateur, nom réel et un peu d'informations utiles. Dans des futures versions vous pourrez tout voir si vous avez plus de 200. Veuillez noter que il y a des actions que vous ne pouvez pas faire avec ces utilisateurs dans la liste (par exemple, répondre ou retweet, parce qu'ils ne sont pas des tweets, sont utilisateurs), Mais oui, vous pouvez les suivre, ne pas les suivre, et faire presque tout (moins envoyer DM pour l'instant) ce que vous pourriez faire dans le menu Utilisateur.</li>
</ul>
<p>Maintenant, il faut l'utiliser et le tester et lorsque vous trouvez une erreur, s'il vous plaît veuillez regarder dans le dossier de l'application, puis il doit générer un fichier avec le nom du fichier exécutable, mais avec une extension .log à la fin. Eh bien, c'est vital pour moi de savoir où le programme a été cassé, et vous devriez être reconnaissant si vous me l'envoyer ainsi qu'une description de ce qui était plus ou moins ce qu'ils faisaient quand l'application fait ce qu'il avait à faire. Par exemple, « j'ai essayé de m'envoyer un DM, mais la boîte de dialogue de message direct jamais elle a été ouverte&quot;. Si vous pouvez le charger vers un serveur de stockage (comme Dropbox,](https://www.dropbox.com) par exemple), et me l'envoyer soit en mentionnant à <span class="citation">[@tw_blue2]</span>(https://twitter.com/tw_blue2) ou à <span class="citation">[@manuelcortez00,]</span>(https://twitter.com/manuelcortez00) ce serait formidable.</p>
<p>Merci infiniment de l'essayer !</p>
<h2 id="nouveautés-dans-la-version-prealpha-0">Nouveautés dans la version prealpha 0</h2>
<ul>
<li>Faire des tweets, répondre aux tweets des autres, mentionner tous les utilisateurs, lorsque il y a plus d'un dans le tweet, retweet ce qui vous plaît, ajouter ou non un commentaire au retweet et les supprimez.</li>
<li>Ajouter ou supprimer des favoris un tweet.</li>
<li>Réduire et élargir une URL lorsque vous écrivez un tweet ou dm (vous pouvez sélectionner quelle URL vous souhaitez réduire et élargir à partir d'une liste lorsque ils sont plus d'une).</li>
<li>Ouvrir un navigateur Web avec l'URL venant dans le tweet, en appuyant sur Entrée. Lorsque il y a plusieurs URLs, vous verrez une liste où on vous demandera la quelles vous voulez.</li>
<li>Utilisateurs: Vous pouvez Suivre, Ne pas suivre, Signaler comme spam, Bloquer et Envoyer un message direct aux utilisateurs.</li>
<li>Vous pouvez ouvrir et supprimer des chronologies individuels pour chaque utilisateur.</li>
<li>Vous pourrez aussi voir vos favoris.</li>
<li>Et pour l'instant, à moins qu'il m'arrive d'oublier quelque chose, c'est tout.</li>
</ul>
<hr />
<p>Copyright © 2013-2014, Manuel Cortéz</p>
</body>
</html>

View File

@@ -1,178 +0,0 @@
% Liste des Changements
#Attention !
Avant de poursuivre l'essai du programme, il est considéré que c'est une version de développement. Plus précisément, la version 0.42. Cela signifie qu'il n'est pas seulement possible de trouver des erreurs, mais que vous les trouverez. L'idée est de signaler le plus d'erreurs possibles afin qu'ils puisse être résolus pour les prochaines alphas.
Voici la liste des changements dans le programme. Si vous voulez lire comment l'utiliser, [voir ce document.](manual.html) Si vous voyez un lien avec un signe dièse (#) et un code qui commence par plusieurs numéro, vous voyez une erreur qui a été signalé dans le Système de suivi d'incidences. N'hésitez pas à publier vos propres erreurs et demandes d'améliorations et nouvelles fonctionnalités à travers de cet outils, disponible dans le menu Aide de TW Blue.
## Changements ajouter dans cette nouvelle version
* Correction d'une erreur qu'elle ne permettait pas d'afficher les listes avec des accents ou des caractères spéciaux dans un tampon.
* Maintenant TW blue ne devrait pas actualiser les Tweets soudainement.
* Maintenant TW blue supporte l'option "muet" de Twitter. Lorsque cette option est activée pour un utilisateur, vous ne pouvez pas voir ces tweets ni ces mentions, mais vous le suivez toujours, et vous serez en mesure de être en contact avec lui à travers de message direct. Ceci est différent de la fonction Bloquer ou Ne pas suivre, avec cette option l'utilisateur sera pas au courant que vous avez activée l'option muet. sette option se trouvent dans la boîte de dialogue des actions utilisateur de l'interface invisible, ou dans le menu Utilisateur de l'interface graphique.
* Un onglet "Audio" a été ajoutée dans la boîte de dialogue de configuration qui vous permet de sélectionner les périphériques d'entrée et de sortie, régler le volume et activer/ désactiver tous les sons pour TW Blue. D'autres options ont été déplacées depuis l'onglet "Général" vers l'onglet "Audio".
* Le fichier de configuration a été repensé. La plupart des options devront être reconfigurés à nouveau.
* Vous pouvez maintenant désactiver SAPI5 afin qu'il n'intervienne pas s'il n'y a aucun lecteur d'écran supporté en cours d'exécution.
* Dans l'onglet Général, Vous pouvez modifier manuellement la langue. Tw Blue reqiere redémarré.
* Maintenant il y a une nouvelle boîte de dialogue où vous pouvez apprendre les différents sons de TW Blue.
* Il est possible maintenant de désactiver le son et notification d'un tampon. Le reste du client fonctionnera correctement. Appuyez sur Contrôle+Windows+Maj+m (interface invisible) ou le sélectionnez depuis le menu "Tampon" (interface visible) pour basculer entre cette fonctionnalité.
* Vous pouvez maintenant rechercher par utilisateur et par tweets. Les recherches de tweets sont sauvegardées dans la configuration, tandis que ceux des utilisateurs seront supprimer lors de la fermeture. Appuyez sur Ctrl+Windows+- (tiret) (interface invisible) ou le sélectionnez depuis le menu "Application" (interface visible).
* Vous pouvez ouvrir le tampon pour voir les favoris d'un utilisateur dans le menu "Utilisateur".
* Maintenant avec Contrôle+Windows+Maj+Flèche Haut / Bas (dans l'interface graphique) et Contrôle+Windows+Flèche Haut / Bas (dans l'interface invisible), vous pouvez aller au tweet précédent ou suivant dans la conversation. Pour que cela fonctionne les tweets de la conversation doivent être dans la chronologie principale.
* Au cours d'un enregistrement audio pour ajouter, maintenant vous pouvez mettre en pause ou reprendre l'enregistrement pour sauter des parties qui peuvent générer un audio très long.
* Il est maintenant possible de charger de l'audio vers Dropbox. Pour configurer le service aller dans l'onglet "Services audio" dans la boîte de dialogue de Configuration.
* Maintenant que vous pouvez charger de l'audio vers Dropbox, dans la boîte de dialogue pour ajouter un audio vous pouvez sélectionner le service auquelle vous souhaitez charger.
* Maintenant il comprend une boîte de dialogue pour la correction orthographique pour les tweets ou messages. Les langues actuellement disponibles sont: Espagnol, Anglais, Portugais, Russe et Polonais. La langue sera sélectionnée automatiquement selon la configuration de TW Blue.
* Ajouter la lecture automatique des Tweets pour un tampon. L'activation de cette fonctionnalité peut faire que TW Blue lit automatiquement les tweets lors de l'arrivée dans les tampons qui ont cette option activée. Appuyez sur Contrôle+Windows+e pour basculer entre cette fonction.
* Dans la boîte de dialogue de Configuration maintenant vous pouvez spécifiez si vous voulez que TW Blue démarre avec l'interface invisible.
* Les URLs s'affiche dans leur version originale. Uniquement les photos de Twitter ils apparaissent toujours comme réduites, et celles qui ont été réduites manuellement avant de les envoyer dans un tweet.
## Changements ajouter dans la version 0.40
* Vous pouvez changer entre les différents paquets de sons utilisé par TW Blue et de créer vos propres sons. Chaque paquet doit être dans un répertoire par séparé dans le dossier sounds. Pour modifier le paquet de sons vous pouvez le sélectionner dans la boîte de dialogue de configuration.
* Les fichiers audio doivent être au format OGG.
* TW Blue doit être maintenant en mesure de fermer correctement.
* L'heure est écrit tenant en compte le format 12 heures (AM /P M).
* L'heure est écrit d'accord au fuseau horaire que vous avez défini dans votre compte Twitter.
* Ajout de nouvelles traductions en Portugais, Polonais et Russe. Merci les gars !
* TW Blue supprime de la configuration la chronologie de l'utilisateur qui ont changé leur noms ou supprimer leurs comptes Twitter.
* Maintenant est gérés la grande majorité des événements dans Twitter avec le tampon des événements.
* Il est maintenant possible de voir le texte des événements avec Contrôle+Maj+V (GUI) ou Contrôle+Windows+V (interface invisible).
* Gestionnaire de listes: Vous pouvez créer, modifier, supprimer, afficher une liste comme tampon dans TW Blue, ajouter et supprimer des membres d'une liste.
* Maintenant, si au démarrage de TW Blue il tente de charger une chronologie qui n'existe pas, automatiquement il la supprime de la configuration et il continue à charger normalement.
* Seuls seront chargées jusqu'à 400 following et followers pour éviter les problèmes avec l'API. Elle sera corrigée dans les versions futures.
* Pour le mode invisible, il inclus des raccourcis pour réentendre le tweet sur lequel vous êtes (Contrôle+Windows+espace) et pour copier le message dans le presse-papiers (Contrôle+Windows+c).
## Changements ajouter dans la version 0.38
* Correction d'une erreur qui empêchait en donnant l'ordre de fermer.
* Maintenant les tweets ne finissent pas par un point obligatoirement. Si le programme détecte que le tweet se termine par une lettre ou un chiffre, il va placez un point automatiquement. Si ce n'est pas le cas, il va laisser le texte tel qu'il est.
* Il est maintenant possible de charger des images aux tweets et réponses. Veuillez noter que la taille des images est mis en place par twitter.
* Pour se déplacer vers la gauche ou vers la droite en utilisant le mode invisible, maintenant il s'annonce uniquement des informations de la position dans la liste d'éléments.
* TW Blue devrait maintenant fonctionner pour Windows XP au moment de la demande d'autorisation pour l'application.
* Ajouté une nouvelle option dans la boîte de dialogue de configuration qui vous permet de revenir à vos tampons. Cela signifie que vous pouvez choisir si vous voulez voir les tweets comme jusqu'à maintenant, ou que les plus nouveaux soit placés vers le haut et les anciens vers le bas.
* Maintenant les photos peuvent être chargées aux profil de Twitter, disponible à partir de la boîte de dialogue Mettre à jour votre profil.
* Ajouté un tampon d'événements, où ils sont stockés pour le moment quelques événements qui se déroulent dans Twitter, comme suivre ou faire que quelqu'un vous suivent, marquer un favori, que un de vos tweet soit marqué comme favoris, Etc. Vous pouvez activer et désactiver ce tampon de la boîte de dialogue de configuration.
* Maintenant, vous pouvez supprimer des chronologies déjà créé qui ne contiennent pas des tweets, et il ne sera pas permit de créer des chronologies pour les utilisateurs sans tweets.
* L'interface de l'application est traduisible. Maintenant, n'importe quel utilisateur peut faire leurs propres traductions en différentes langues.
## Changements ajouter dans la version 0.36
* Les utilisateurs brésiliens pourront voir quelques messages en Portugais. (Usuários brasileiros poderão ver algumas mensagens em Português).
* Correction d'une erreur qui fait que quelques sons ils peuvent s'entendre et d'autres non. Maintenant, ils devraient s'entendre tous.
* La réconnexion aussi a reçu une correction, parce que parfois, il s'effectué de façon incorrecte et il devait s'ouvrir à nouveau l'application.
* Maintenant TW Blue permet de supprimer uniquement les chronologies avec la commande correspondante. Avant il s'affichées la boîte de dialogue peu importe dans quel tampon vous aviez été.
* Vous êtes en mesure à nouveau de voir les détails des utilisateurs avec la touche Entrée étant dans le tampon pour les following ou followers.
* À partir de cette version, il n'y a pas de support pour les bases de données.
* Vous entendrez une notification vocale lorsque quelqu'un marque comme favori un de vos tweets.
* Les following et followers sont déjà mis à jour.
* lorsque vous suivez quelqu'un, il ne se produit aucune erreur Si ne sont pas affichées les following. C'est la même chose avec les followers.
* Vous pouvez effacer un tampon en appuyant sur Maj+Supprimer dans la fenêtre visible, et Contrôle+Windows+Maj+Supprimer dans la fenêtre invisible. Ceci va vider tous les tweets dans le tampon courant.
## Changements ajouter dans la version 0.35
* Il existe un site Web officiel pour le programme, aller sur [twblue.com.mx.](http://twblue.com.mx) Dans cet espace, vous trouverez le système de suivi d'erreurs, le blog avec les dernières nouvelles, et la dernière version disponible.
* TW Blue il annonce lorsque vous êtes mentionné, et lorsque vous obtenez un message direct.
* Jaws il ne dit pas le raccourci clavier qui est appuyé dans le mode invisible. [#11](http://twblue.a12x.net/errores/view.php?id=11)
* Dans le mode invisible, les commandes Contrôle+Windows+Origine, Contrôle+Windows+Fin, Contrôle+Windows+Page Suivante et Contrôle+Windows+Page Précédente va aller vers le haut de la liste, vers la fin, 20 éléments vers le bas et 20 éléments vers le haut respectivement. [#10,](http://twblue.a12x.net/errores/view.php?id=10) [#21,](http://twblue.a12x.net/errores/view.php?id=21) [#22](http://twblue.a12x.net/errores/view.php?id=22)
* Maintenant vous pouvez lire l'audios d'Audiobook.
* Maintenant, le flux doit être connecté une fois que la machine revient d'une suspension.
* Il est possible d'enregistrer de l'audio ou charger fichiers sur SndUp.net. Si vous êtes inscrit dans cette page, vous pouvez mettre dans la configuration votre API Key pour que les fichiers se charge sur votre nom. Vous pouvez charger des fichiers Wav, OGG et MP3. Les fichiers wav ils seront récodifier en OGG.
* Si vous n'utilisez aucun lecteur d'écran, quelques actions de TW blue utilisent la synthèse vocale SAPI5.
* Il existe une version pour les architectures de 64 Bits. Merci à [@jmdaweb](https://twitter.com/jmdaweb) pour prendre le travail de faire fonctionner l'application dans cette architecture et la préparez pour sa distribution.
* Changement dans les sons du client. Merci à [@guilevi_es](https://twitter.com/guilevi_es) pour la collaboration avec le paquet de sons.
* Quelques messages du programme peuvent être traduits. Dans des futures versions la totalité de l'interface sera internationalisé.
* Et quelques correction d'erreur en plus ([#5,](http://twblue.com.mx/errores/view.php?id=5) [#7,](http://twblue.com.mx/errores/view.php?id=7) [#8,](http://twblue.com.mx/errores/view.php?id=8) [#9,](http://twblue.com.mx/errores/view.php?id=9) [#12,](http://twblue.com.mx/errores/view.php?id=12))
## Changements ajouter dans la version 0.3
* Maintenant vous pouvez mettre à jour votre profil à partir de TW Blue. [#19](http://twblue.a12x.net/issues/view.php?id=19)
* Maintenant vous pouvez créer les chronologies à nouveau et ils ne donne pas de problèmes. [#24](http://twblue.a12x.net/issues/view.php?id=24)
* Maintenant les fichiers d'erreur sont enregistrés dans le répertoire "logs".
* Lorsque vous créez une chronologie, il sera mis à jour en temps réel dès le début au lieu de le mettre à jour toutes les 2 minutes.
* Vous pouvez maintenant demander davantage d'appels à l'API qui fonctionnera pour obtenir 200 tweets chaqu'une. Un appel est équivalent à 200 éléments de la liste principal, mentions, messages directs, favoris et chronologies. Dans le fichier de configuration Vous pouvez modifier l'option dans [twitter]/max_api_calls. Il est recommandé de ne pas demander à Twitter plus de 2 appels à l'API, ou sinon vous arriverez bientôt à la limite des appels autorisés et l'application échouera.
* Lorsque vous répondez à un Tweet, c'est envoyé comme réponse au même et pas comme s'il s'agissait d'un nouveau tweet.
* L'ancien système de rapport d'erreurs il a dû être changée. À partir de cette version, vous pouvez signaler des erreurs, directement depuis l'application. L'option Signaler une erreur ouvrira une boîte de dialogue qui vous demande des détails sur votre erreur et il va envoyer le rapport automatiquement.
* Ils sont déjà supprimées les following lorsque ils ne suivent pas un utilisateur.
* Aussi les favoris, au moment de retirer un tweet comme favori, il exécutent le changement.
* Ajouté une boîte de dialogue de configuration qui permet de contrôler le nombre d'appels à l'API à exécuter, si oui ou non utiliser des bases de données, et masquer ou afficher les listes de following, followers et favoris.
* En mentionnant les tweets, les guillemets qui entourent le message maintenant sont séparés par un espace de la dernière lettre. Il en est ainsi parce qu'avant, lorsque il y avait une URL, il causé que les guillemets facent partie de l'URL en envoyant vers des sites inexistants.
* Améliorations avec quelques chronologies. Vous pouvez maintenant enregistrer une chronologie sans problèmes. Il ne devrait pas faire des erreurs.
* Maintenant, l'audio est joué seulement avec Contrôle+Entrée, tandis que l'URL s'ouvrira avec la touche Entrée.
* Le flux tentera de se reconnecter à l'échec de la connexion internet.
* Maintenant depuis les followers et following on peut mentionner un utilisateur.
* Maintenant il est fournit un mode "invisible". Sous le menu "Application", dans l'option "Masquer la fenêtre" ou en appuyant sur Contrôle+M. Pour afficher la fenêtre à nouveau appuyez sur Contrôle+Windows+M.
## Changements ajouter dans la version 0.025
Veuillez noter que lorsque un utilisateur vous ne sui pas ou vous ne suivez pas quelqu'un d'autre, la liste des following ou des followers il ne sera pas mis à jour pour le moment. Lorsque vous redémarrez le programme, si les informations son correctes ils seront afficher.
* Correction d'une erreur qui rendait impossible de fermer l'application jusqu'à ce que le programme a annoncé qu'elle était prête. [#17](http://twblue.a12x.net/issues/view.php?id=17) y [#18](http://twblue.a12x.net/issues/view.php?id=18)
* Changé la façon d'organiser les chronologies dans la configuration. Il est nécessaire de les recréer.
* Maintenant, vous pouvez envoyer un message direct aux following et followers en utilisant le bouton. Cela ne fonctionnait pas dans la version 0.02 et 0.021.
* Vous pouvez augmenter et diminuer le volume depuis la liste des followers et following.
* Dans la boîte de dialogue pour écrire un tweet peut être maintenant traduit le message à l'aide de Google Traductor. Une boîte de dialogue s'affiche pour demander les langues source et destination.
* Le menu fichier contient l'option Sortir.
* À partir de cette version ils se jouera uniquement les fichiers de'audio en appuyant sur Entrée s'ils contienne le hashtag #audio.
* Vous pouvez essayer de jouer une URL quelconque sans qui comporte le hashtag #audio en appuyant sur Contrôle+Entrée. Cette commande va tenter de reproduire la première URL trouvée.
* A été amélioré le moteur de recherche d'URLS, en rendant plus rapide la fonction et maintenant, devrait être capable de détecter toutes les URLS. [#21](http://twblue.a12x.net/issues/view.php?id=21)
* Maintenant, la boîte de dialogue qui s'affiche pour sélectionner l'utilisateur que vous souhaitez afficher les détails permet en plus de le sélectionner dans une liste, écrire le nom de l'utilisateur que vous souhaitez.
## Changements ajouter dans la version 0.02 et 0.021
* Le message qui se reproduicé lorsque vous suivez un utilisateur maintenant dit "maintenant vous suivez à x utilisateur" en lieu de "maintenant vous ne suivez pas à x utilisateur". [#5](http://twblue.a12x.net/issues/view.php?id=5)
* Lorsque vous sorter une boîte de dialogue vous demandera si vous voulez le faire. Maintenant vous sorter d'une façon beaucoup plus proprement du programme, empêchant plusieurs erreurs pendant la fermeture.
* Changement des sons pour les dm entrant et sortant. Merci à [@marcedsosa](https://twitter.com/marcedsosa) pour les nouveaux sons.
* Le Nom d'utilisateur de twitter il se lit dans le titre de la fenêtre.
* Les sons du programme aussi peuvent lire le volume depuis la configuration. Le module de sons devrait prendre moins de temps pour reproduire plusieurs des sons de l'application.
* Les actions d'augmenter et de diminuer le volume ils reproduisent un son indiquant que tant forts ça sonne.
* Il n'affichent plus les mentions de personnes qui ne vous suivent pas dans votre chronologie principal. [#1](http://twblue.a12x.net/issues/view.php?id=1)
* Vous pouvez maintenant supprimer les tweets et les messages directs. Vous ne pouvez supprimer que les tweets que vous avez écrit.
* Correction d'une erreur qui empêchait de charger correctement les différentes listes si dans quelques une d'elles ils n'y avait aucun tweet, utilisateur ou message direct. Ceci affectant surtout les comptes avec 0 favoris, 0 tweets, 0 envoyés ou 0 messages directes. [#2](http://twblue.a12x.net/issues/view.php?id=2)
* Maintenant à chaque fois qu'une nouvelle version est disponible, vous serez informé de cela. Si vous avez accès pour le télécharger, le programme va télécharger et copier tout ce dont vous avez besoin.
* Maintenant, vous pouvez obtenir la liste complète des following et followers.
* Ajouter la date du dernier tweet des followers et following.
* Les following et followers sont maintenant mis à jour en temps réel. (ToDo: Les following et followers ils ne montrent pas la date de ces dernier tweet lorsque une mise à jour est faite en temps réel. Ils le font lors du rechargement une fois redémarrée l'application).
* L'ordre des onglets il a changé. Maintenant ils sont classés en commençant par Principal, Mentions, Messages directs et Envoyés.
* Maintenant dans la liste de tweets envoyés les messages directs sont affichés lorsque le flux est chargé pour la première fois. Ceci ne était pas le cas et si l'utilisateur envoyés un DM à partir d'un autre client lorsque Tw Blue n'était pas ouvert, lors de l'ouverture de l'application il ne montré pas la dite DM. [#8](http://twblue.a12x.net/issues/view.php?id=8)
* Con Control+A, se puede seleccionar todo el texto de un mensaje. Funciona con Jaws y NVDA.
* Il y a des raccourcis clavier (détaillés dans la [Documentation)](leeme.html) pour un grand nombre d'actions qui peut faire le programme.
* Maintenant TW Blue détecte plus d'audio dans les URLS qui vienne dans les retweets, et des audio partagé à partir de Dropbox. [#3](http://twblue.a12x.net/issues/view.php?id=3)
* Inclut la documentation pour l'application et les crédits.
* Si la connexion internet s'arrête de fonctionner, le flux va essayer de se reconnecter pendant 30 minutes.
* On a écrit un document qui détaille comment utiliser le programme.
* Il a été ouvert le [Système de suivi d'incidents](http://twblue.a12x.net/issues/) où les utilisateurs peuvent signaler des erreurs et si vous le souhaitez, vous pouvez apporter de nouvelles idées pour le développement de l'application. Il existe un accès direct au formulaire réservée au rapport d'incidents dans le menu Aide.
* Il y a maintenant des crédits à partir de la version actuelle.
* Ajout d'une option dans menu Utilisateur pour afficher les détails. Cela fonctionne également si vous appuyez sur entrer sur un following ou follower.
## Changements ajouter dans la version Prealpha1
Veuillez noter que dans cette version les following et les followers ne sont pas mis à jour automatiquement. Cela s'ajoutera à une autre version. Vous ne pouvez pas également supprimer des tweet, ou DM. Tous les tweets, messages directs, mentions, favoris, followers et following lors de la mise à jour seront télécharger un maximum de 200. Bientôt ils s'ajouteront plus à la quantité lors des mises à jour. Ici les changements à partir de la première version.
* La date il s'affiche bien, selon le fuseau horaire de l'utilisateur.
* Maintenant, le curseur est placé au début lorsque vous allez à répondre ou faire un retweet.
* Si vous appuyez sur contrôle + E dans les zones d'édition, l'intégralité du message sera sélectionné.
* Quelques corrections pour la gestion des chronologies (j'ai besoin d'apporter des améliorations dans la façon de gérer cela).
* Les favoris sont mises à jour en temps réel.
* Vous entendrez un son lorsque vous passez par un tweet qui pourrait contenir un audio jouable.
* Supporte la lecture audio avec le hashtag #audio et une URL. Appuyez sur Entrée pour entendre la chanson. Appuyez sur F5 pour diminuer le volume de 5%, ou f6 pour augmenter d'un 5%. Si vous souhaitez arrêter la lecture, aller où il y a une audio, puis appuyez sur Entrée. Si le programme est incapable de reproduire quelque chose, il vous avertira. Le volume de la musique (pas pour les sons du programme pour l'instant) est enregistré dans la configuration, et le programme va le mémorisé pour la prochaine fois que vous jouez quelque chose.
* Vous pouvez voir les 200 premiers following et followers avec leurs noms d'utilisateur, nom réel et un peu d'informations utiles. Dans des futures versions vous pourrez tout voir si vous avez plus de 200. Veuillez noter que il y a des actions que vous ne pouvez pas faire avec ces utilisateurs dans la liste (par exemple, répondre ou retweet, parce qu'ils ne sont pas des tweets, sont utilisateurs), Mais oui, vous pouvez les suivre, ne pas les suivre, et faire presque tout (moins envoyer DM pour l'instant) ce que vous pourriez faire dans le menu Utilisateur.
Maintenant, il faut l'utiliser et le tester et lorsque vous trouvez une erreur, s'il vous plaît veuillez regarder dans le dossier de l'application, puis il doit générer un fichier avec le nom du fichier exécutable, mais avec une extension .log à la fin. Eh bien, c'est vital pour moi de savoir où le programme a été cassé, et vous devriez être reconnaissant si vous me l'envoyer ainsi qu'une description de ce qui était plus ou moins ce qu'ils faisaient quand l'application fait ce qu'il avait à faire. Par exemple, « j'ai essayé de m'envoyer un DM, mais la boîte de dialogue de message direct jamais elle a été ouverte". Si vous pouvez le charger vers un serveur de stockage (comme Dropbox,](https://www.dropbox.com) par exemple), et me l'envoyer soit en mentionnant à [@tw_blue2](https://twitter.com/tw_blue2) ou à [@manuelcortez00,](https://twitter.com/manuelcortez00) ce serait formidable.
Merci infiniment de l'essayer !
## Nouveautés dans la version prealpha 0
* Faire des tweets, répondre aux tweets des autres, mentionner tous les utilisateurs, lorsque il y a plus d'un dans le tweet, retweet ce qui vous plaît, ajouter ou non un commentaire au retweet et les supprimez.
* Ajouter ou supprimer des favoris un tweet.
* Réduire et élargir une URL lorsque vous écrivez un tweet ou dm (vous pouvez sélectionner quelle URL vous souhaitez réduire et élargir à partir d'une liste lorsque ils sont plus d'une).
* Ouvrir un navigateur Web avec l'URL venant dans le tweet, en appuyant sur Entrée. Lorsque il y a plusieurs URLs, vous verrez une liste où on vous demandera la quelles vous voulez.
* Utilisateurs: Vous pouvez Suivre, Ne pas suivre, Signaler comme spam, Bloquer et Envoyer un message direct aux utilisateurs.
* Vous pouvez ouvrir et supprimer des chronologies individuels pour chaque utilisateur.
* Vous pourrez aussi voir vos favoris.
* Et pour l'instant, à moins qu'il m'arrive d'oublier quelque chose, c'est tout.
---
Copyright © 2013-2014, Manuel Cortéz

View File

@@ -5,8 +5,8 @@
msgid ""
msgstr ""
"Project-Id-Version: TW Blue documentation 0.80\n"
"POT-Creation-Date: 2015-11-27 08:24+Hora estándar central (México)\n"
"PO-Revision-Date: 2015-11-27 18:45+0100\n"
"POT-Creation-Date: 2016-03-31 16:51+Hora de verano romance\n"
"PO-Revision-Date: 2016-04-02 18:32+0100\n"
"Last-Translator: Rémy Ruiz <remyruiz@gmail.com>\n"
"Language-Team: Rémy Ruiz <remyruiz@gmail.com>\n"
"Language: fr\n"
@@ -199,7 +199,7 @@ msgstr ""
"que vous aurez besoin de votre nom d'utilisateur et un mot de passe pour "
"donner la permission à TWBlue à utiliser votre compte. Nous vous suggérons "
"que vous choisissez un nom d'utilisateur qui est facile à retenir pour vous "
"et vos futurs folowers."
"et vos futurs abonnés."
#: ../doc\strings.py:51
msgid ""
@@ -410,7 +410,7 @@ msgid ""
"* Followers: when users follow you, you'll be able to see them on this "
"buffer, with some of their account details."
msgstr ""
"* Followers: Lorsque les utilisateurs suivent votre compte, vous les verrez "
"* Abonnés: Lorsque les utilisateurs suivent votre compte, vous les verrez "
"dans cette liste, ainsi que quelques informations sur leur compte Twitter."
#: ../doc\strings.py:100
@@ -418,7 +418,7 @@ msgid ""
"* Friends: the same as the previous buffer, but these are the users you "
"follow."
msgstr ""
"* Following: Même que pour la liste précédente, mais ce sont les "
"* Abonnements: Même que pour la liste précédente, mais ce sont les "
"utilisateurs que vous suivez."
#: ../doc\strings.py:101
@@ -533,7 +533,7 @@ msgstr ""
"utilisateur ou une liste), l'utilisateur qui a envoyé le message direct "
"actuel (s'il est ouvert à partir du tampon de messages directs ou de "
"messages directs envoyés) ou de l'utilisateur actuel (à partir du tampon des "
"following ou de followers). Si une de ces boîtes de dialogue est ouvert "
"abonnements ou des abonnés). Si une de ces boîtes de dialogue est ouvert "
"depuis un tweet et si il y a plus d'un utilisateur mentionné, vous pouvez "
"utiliser les flèches haut/bas pour basculer entre eux. Alternativement, vous "
"pouvez entrer manuellement les utilisateurs de Twitter dans la zone "
@@ -663,8 +663,8 @@ msgstr ""
"l'utilisateur (par exemple: @utilisateur), donc il suffit d'écrire le "
"message que vous souhaitez répondre. Si dans le tweet il y a plus d'un "
"utilisateur mentionné, appuyez sur Maj+Tab et cliquez sur le bouton "
"Mentionner à tous. Lorsque vous êtes dans la liste des following ou "
"followers, ce bouton s'appellera Mention à la place."
"Mentionner à tous. Lorsque vous êtes dans la liste des abonnements ou "
"abonnés, ce bouton s'appellera Mention à la place."
#: ../doc\strings.py:143
msgid ""
@@ -696,7 +696,7 @@ msgstr ""
"chronologie principal, mentions, envoyés, favoris et la chronologie de "
"l'utilisateur vous verrez quatre boutons ; alors que dans la liste des "
"messages directs seulement sera disponible le bouton Message Direct et "
"Tweet, et dans les listes following et followers, s'affichera le bouton "
"Tweet, et dans les listes abonnements et abonnés, s'affichera le bouton "
"Tweet et celle du Message direct à côté de Mention."
#: ../doc\strings.py:149
@@ -848,14 +848,14 @@ msgid ""
"only edit box with the information in the focused item and a close button."
msgstr ""
"* Voir tweet: Ouvre une boîte de dialogue où vous pouvez lire le tweet, "
"message direct, following ou follower sur lequel vous êtes actuellement. "
"message direct, abonnements ou abonnés sur lequel vous êtes actuellement. "
"Vous pouvez lire le texte avec les touches fléchées. C'est une boîte de "
"dialogue très similaire à celle utilisée pour écrire un nouveau tweet, à "
"l'exception que pour cette boîte de dialogue il ne s'affichent pas les "
"paramètres pour la saisie automatique, le chargement de fichiers audio et "
"images. Toutefois, il comprend deux compteurs qui permettent de connaître le "
"nombre de fois où le tweet a été retweeté et marqué comme favori. Si vous "
"êtes dans la liste de followers et following, la boîte de dialogue "
"êtes dans la liste des abonnés et abonnements, la boîte de dialogue "
"seulement affiche les informations de l'utilisateur et d'un bouton pour "
"Fermer."
@@ -906,7 +906,7 @@ msgstr ""
"* Actions: Ouvre une boîte de dialogue où vous pouvez interagir avec un "
"utilisateur. Cette boîte de dialogue vous placera par défaut le nom "
"d'utilisateur du tweet ou message direct sur lequel vous étiez lorsque vous "
"l'avez ouvert ou dans le cas des following et followers, l'utilisateur "
"l'avez ouvert ou dans le cas des abonnements et abonnés, l'utilisateur "
"actuellement sélectionné. Si vous le souhaitez, vous pouvez manuellement "
"modifier l'utilisateur. La boîte de dialogue comporte les options suivantes:"
@@ -1072,7 +1072,7 @@ msgid ""
"buffer."
msgstr ""
"* charger des éléments plus anciens: Cela permet de récupérer plus de "
"tweets, messages directs, following ou followers depuis le tampon actuel."
"tweets, messages directs, abonnements ou abonnés depuis le tampon actuel."
#: ../doc\strings.py:207
msgid ""
@@ -1493,15 +1493,15 @@ msgstr ""
#: ../doc\strings.py:306
msgid "* Control + Windows + G: Get geolocation."
msgstr "* Contrôle+Windows+G: Obtenir la géolocalisation."
msgstr "* Contrôle+Windows+G: Obtenir la localisation géographique."
#: ../doc\strings.py:307
msgid ""
"* Control + Windows + Shift + G: Display the tweet's geolocation in a "
"dialogue."
msgstr ""
"* Contrôle+Windows+Maj+G: Afficher la géolocalisation du tweet dans une "
"boîte de dialogue."
"* Contrôle+Windows+Maj+G: Afficher la localisation géographique du tweet "
"dans une boîte de dialogue."
#: ../doc\strings.py:308
msgid "* Control + Windows + T: Create a trending topics' buffer."
@@ -1544,7 +1544,7 @@ msgstr ""
"comportement de la base de données pour la saisie automatique des "
"utilisateurs. Vous pouvez ajouter des utilisateurs manuellement ou de "
"permettre à TWBlue d'ajouter à tous les utilisateurs qui se trouvent dans "
"votre tampon de followers, following ou les deux."
"votre tampon des abonnés, abonnements ou les deux."
#: ../doc\strings.py:323
msgid ""

View File

@@ -5,9 +5,9 @@
msgid ""
msgstr ""
"Project-Id-Version: tw blue documentation 0.46\n"
"POT-Creation-Date: 2015-11-27 08:24+Hora estándar central (México)\n"
"PO-Revision-Date: 2015-11-27 08:34-0600\n"
"Last-Translator: Manuel Cortéz <manuel@manuelcortez.net>\n"
"POT-Creation-Date: 2016-03-31 16:51+Hora de verano romance\n"
"PO-Revision-Date: 2016-07-13 12:53+0100\n"
"Last-Translator: Juan C. Buño <oprisniki@gmail.com>\n"
"Language-Team: Alba Quinteiro <alba_080695@hotmail.com>\n"
"Language: gl\n"
"MIME-Version: 1.0\n"
@@ -77,9 +77,9 @@ msgid ""
msgstr ""
"Estás lendo documentación producida para un programa en estado de "
"desenvolvemento. A intención deste manual é clarificar algúns detalles sobre "
"o funcionamento do programa. Ten en conta que ó ser activamente desenvolto, "
"o funcionamento do programa. Ten en conta que ao ser activamente desenvolto, "
"o software pode cambiar parte desta documentación nun futuro relativamente "
"cercano, así que é recomendable dar un vistazo de vez en cando para non "
"cercano, así que é recomendable botar unha ollada de vez en cando para non "
"perderte demasiado."
#: ../doc\strings.py:19
@@ -206,7 +206,7 @@ msgstr ""
#: ../doc\strings.py:54
msgid "### Authorising the application"
msgstr "### Autorizando la aplicación"
msgstr "### Autorizando a aplicación"
#: ../doc\strings.py:57
msgid ""
@@ -219,10 +219,10 @@ msgid ""
"like to place a Windows shortcut on your Desktop pointing to this executable "
"file for quick and easy location."
msgstr ""
"Antes de nada, o primeiro que se precisa é autorizar ó programa para que "
"Antes de nada, o primeiro que se precisa é autorizar ao programa para que "
"este poida acceder á túa conta de Twitter, e dende ela realizar o que lle "
"pidas. O proceso de autorización é bastante doado , e en ningún momento o "
"programa poderá ter acceso ós teus datos como usuario e contrasinal. Para "
"programa poderá ter acceso aos teus datos como o usuario e contrasinal. Para "
"autorizar a aplicación, só tes que abrir o arquivo principal do programa, "
"chamado TW Blue.exe (nalgúns PC, só se amosa como TW Blue) se o explorador "
"de Windows non está configurado para amosar as extensións de arquivos). Se "
@@ -257,7 +257,7 @@ msgid ""
"not already logged in, select the authorise button, and press it."
msgstr ""
"A continuación, o teu navegador predeterminado abrirase coa páxina de "
"Twitter solicitándoche autorizar a aplicación. Escribe, se non estás "
"Twitter solicitándoche autorizar a aplicación. Escrebe, se non estás "
"autenticado xa, o teu nome de usuario e contrasinal, logo busca o botón "
"autorizar, e prémeo."
@@ -271,7 +271,7 @@ msgid ""
"The session name will change once you open that session."
msgstr ""
"Unha vez que autorizaras a túa conta de Twitter, Twitter redirixirache cara "
"unha páxina que te notificará que o TWBlue foi correctamente autorizado. "
"unha páxina que che notificará que o TWBlue foi correctamente autorizado. "
"Agora podes pechar o navegador e voltar ó xestor de sesións. Na lista de "
"sesións, poderás ver un novo elemento chamado temporalmente \"Conta "
"autorizada x\", onde x é un número. O nome cambiará unha vez que comeces esa "
@@ -314,7 +314,7 @@ msgid ""
"will be used extensively throughout this manual."
msgstr ""
"Antes de profundizar no uso do TWBlue, é necesario explicar algúns conceptos "
"que serán usados extensivamente ó longo desta guía."
"que se usarán extensivamente ao longo desta guía."
#: ../doc\strings.py:84
msgid "### Buffer"
@@ -357,7 +357,7 @@ msgid ""
"* Mentions: if a user, whether you follow them or not, mentions you on "
"Twitter, you will find it in this list."
msgstr ""
"* Mencións: Se un usuario (o sigas ou non) te menciona en Twitter, veralo "
"* Mencións: Se un usuario (sígalo ou non) menciónate en Twitter, veralo "
"nesta lista."
#: ../doc\strings.py:95
@@ -417,7 +417,7 @@ msgstr ""
"* Liña temporal dun usuario: Estas son listas que ti deberás crear. É unha "
"lista que só contén os chíos dun usuario. Empréganse se algún día precisas "
"ou queres ver os chíos que realizou só unha persoa e non desexas buscar por "
"todo o teu timeline. Podes crear tantas como usuarios precises."
"toda a túa timeline. Podes crear tantas como usuarios precises."
#: ../doc\strings.py:102
msgid ""
@@ -427,11 +427,11 @@ msgid ""
"the program shows the most common ones in the events buffer so that you can "
"easily keep track of what is happening on your account."
msgstr ""
"* Eventos: Un evento en TW Blue é \"algo\" que pase en Twitter. Na liña de "
"eventos, poderás ver rexistrados os eventos máis comunes (p. Ex. comezaron a "
"seguirte, marcaron ou eliminaron un chío teu dos favoritos, subscribícheste "
"a unha lista). Son como pequenas notificacións que envía Twitter e TW Blue "
"organiza para que non te perdas o que pasou coa túa conta."
"* Eventos: Un evento é \"algo\" que pase en Twitter. Na liña de eventos, "
"poderás ver rexistrados os eventos máis comúns (p. Ex. comezaron a seguirte, "
"marcaron ou eliminaron un chío teu dos favoritos, subscribícheste a unha "
"lista). Son como pequenas notificacións que envía Twitter e TW Blue organiza "
"para que non te perdas o que pasou coa túa conta."
#: ../doc\strings.py:103
msgid ""
@@ -445,7 +445,7 @@ msgstr ""
msgid "* Search: A search buffer contains the results of a search operation."
msgstr ""
"* Procura: Un bufer de procura contén os resultados dunha procura feita en "
"TW Blue. As procuras poden ser por chíos, en cuxo caso procuras un termo nos "
"TW Blue. As procuras poden ser por chíos, en tal caso procuras un termo nos "
"chíos relevantes de Twitter, ou por usuarios, onde os resultados son nomes "
"de usuario de Twitter."
@@ -478,13 +478,12 @@ msgid ""
"Windows + G in the invisible interface to retrieve it."
msgstr ""
"Se un chío contén un enderezo web, podes premer intro na interfaz gráfica "
"ou control + Windows + Intro na interfaz invisible para abrilo. Si incluye "
"un archivo de audio, puedes presionar Control + Enter o control + Alt + "
"Windows + Enter para reproducirlo, respectivamente. TWBlue reproducirá un "
"son cando o chío conteña a etiqueta #audio, pero os chíos poderían incluir "
"ficheiros de audio sen esta etiqueta. Finalmente, se o chío inclúe "
"información xeográfica, podes premer Control + G ou Control + Windows + G "
"para vela."
"ou control + Windows + Intro na interfaz invisible para abrilo. Se inclúe un "
"arquivo de audio, podes premer Control + Enter ou control + Alt + Windows + "
"Enter para reproducilo, respectivamente. TWBlue reproducirá un son cando o "
"chío conteña a etiqueta #audio, pero os chíos poderían incluir ficheiros de "
"audio sen esta etiqueta. Finalmente, se o chío inclúe información "
"xeográfica, podes premer Control + G ou Control + Windows + G para vela."
#: ../doc\strings.py:112
msgid "### Username fields"
@@ -515,7 +514,7 @@ msgstr ""
"enviadas) ou do usuario actual (dende o búfer de amigos ou seguidores). Se "
"un destos diálogos se abre dende un chío, e se hai máis de un usuario "
"mencionado, podes usar as frechas de arriba/abaixo para conmutar entre eles. "
"Alternativamente, podes escrebir manualmente o usuario de Twitter no campo "
"Alternativamente, podes escreber manualmente o usuario de Twitter no campo "
"de texto."
#: ../doc\strings.py:116
@@ -552,7 +551,7 @@ msgstr "* Unha lista de elementos"
msgid ""
"* Four buttons in most dialogs: Tweet, retweet , reply and direct message."
msgstr ""
"* Catro botóns, a maioría das veces: chío, rechío, respostar e mensaxe "
"* Catro botóns na maioría dos diálogos: chío, rechío, respostar e mensaxe "
"directa."
#: ../doc\strings.py:131
@@ -589,12 +588,12 @@ msgid ""
"hear a sound confirming it. Otherwise, the screen reader will speak an error "
"message in English describing the problem."
msgstr ""
"* chío: Este botón abre o diálogo para escribir un chío. A mensaxe só debe "
"ter 140 caracteres. Ao escribir o carácter número 141, un son será "
"reproducido para indicarte que te pasaches do límite permitido por Twitter. "
"Ten en conta que o número de caracteres escritos amósase na barra de título. "
"Podes querer acurtar ou desacurtar unha URL se a inclúe o teu chío co fin de "
"ganar máis espazo onde escrebir, para eso están os botóns con eses nomes. "
"* chío: Este botón abre o diálogo para escreber un chío. A mensaxe só debe "
"ter 140 caracteres. Ao escribir o carácter número 141, reproduciráse un son "
"para indicarche que te pasaches do límite permitido por Twitter. Ten en "
"conta que o número de caracteres escritos amósase na barra de título. Podes "
"querer acurtar ou desacurtar un enderezo web se o inclúe o teu chío co fin "
"de ganar máis espazo onde escreber, para eso están os botóns con eses nomes. "
"Podes tamén subir unha foto, un arquivo de audio, revisar a ortografía da "
"túa mensaxe ou traducilo seleccionando un dos diferentes botóns do diálogo. "
"Ademáis, podes autocompletar os nomes de usuarios se premes Alt + A ou o "
@@ -648,7 +647,7 @@ msgid ""
msgstr ""
"* mensaxe directa: Exactamente igual que enviar un chío, pero é unha mensaxe "
"privada que só poderá ver o usuario ao que llo envías. Preme Shift+Tab para "
"ver o destinatario do túa mensaxe. Se no chío onde estabas para enviar a "
"ver o destinatario da túa mensaxe. Se no chío onde estabas para enviar a "
"mensaxe había más dun usuario mencionado, podes navegar coas frechas de "
"arriba e abaixo para selecionar outro, ou escribir ti mesmo o usuario (sen o "
"signo de arroba)."
@@ -685,7 +684,7 @@ msgstr ""
"Visualmente, na parte superior da ventá do programa poderás atopar unha "
"barra de menú que fai as mesmas cousas, e algunhas cantas máis. Á barra de "
"menú accédese premendo a tecla ALT, e conta neste momento con cinco menús "
"para diferentes accións: Aplicación, chío, usuario, Búfer y Axuda. Nesta "
"para diferentes accións: Aplicación, chío, usuario, Búfer e Axuda. Nesta "
"sección descríbense as accións para cada un deles."
#: ../doc\strings.py:155
@@ -710,9 +709,9 @@ msgid ""
"upload a photo to your profile."
msgstr ""
"* Actualizar Perfil: Abre un diálogo dende onde poderás actualizar parte da "
"túa información en Twitter. Nome, ubicación, direción URL e descrición. Se "
"túa información en Twitter. Nome, ubicación, enderezo web e descrición. Se "
"xa tes algún destes campos actualmente no perfil rechearanse automáticamente "
"co que ten a túa configuración de Twitter. Tamén poderás subir unha foto ao "
"co que teña a túa configuración de Twitter. Tamén poderás subir unha foto ao "
"teu perfil."
#: ../doc\strings.py:160
@@ -720,7 +719,7 @@ msgid ""
"* Hide window: turns off the Graphical User Interface. Read the section on "
"the invisible interface for further details."
msgstr ""
"* Esconder xanela: Desactiva a interfaz gráfica. Le o apartado sobre a "
"* Agochar xanela: Desactiva a interfaz gráfica. Le o apartado sobre a "
"interfaz non visible para máis detalles sobre este comportamento."
#: ../doc\strings.py:161
@@ -768,7 +767,6 @@ msgstr ""
"toda a aplicación."
#: ../doc\strings.py:166
#, fuzzy
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 "
@@ -776,7 +774,7 @@ msgid ""
msgstr ""
"* Saír: pregunta se queres saír ou non do programa. Se a resposta é que sí, "
"pecha a aplicación. Se non queres que se che solicite a confirmación antes "
"de saír, desmarca a caixa no cadro de diálogo de configuración global."
"de saír, desmarca a caixa no cadro de diálogo de Opcións globais."
#: ../doc\strings.py:169
msgid "##### Tweet menu"
@@ -1791,9 +1789,8 @@ msgstr ""
"Dengler](https://twitter.com/codeofdusk)."
#: ../doc\strings.py:408
#, fuzzy
msgid "* Arabic: [Mohammed Al Shara](https://twitter.com/mohammed0204)."
msgstr "* Español: [Manuel Cortéz](https://twitter.com/manuelcortez00)."
msgstr "* Árabe: [Mohammed Al Shara](https://twitter.com/mohammed0204)."
#: ../doc\strings.py:409
msgid ""
@@ -1812,75 +1809,64 @@ msgid "* Basque: [Sukil Etxenike](https://twitter.com/sukil2011)."
msgstr "* Basco: [Sukil Etxenike](https://twitter.com/sukil2011)."
#: ../doc\strings.py:412
#, fuzzy
msgid "* Finnish: [Jani Kinnunen](https://twitter.com/jani_kinnunen)."
msgstr "* Español: [Manuel Cortéz](https://twitter.com/manuelcortez00)."
msgstr "* Finés: [Jani Kinnunen](https://twitter.com/jani_kinnunen)."
#: ../doc\strings.py:413
#, fuzzy
msgid "* French: [Rémi Ruiz](https://twitter.com/blindhelp38)."
msgstr "* Español: [Manuel Cortéz](https://twitter.com/manuelcortez00)."
msgstr "* Francés: [Rémi Ruiz](https://twitter.com/blindhelp38)."
#: ../doc\strings.py:414
#, fuzzy
msgid "* Galician: [Juan Buño](https://twitter.com/Quetzatl_)."
msgstr "* Galego: [Alba Kinteiro](https://twitter.com/albasmileforeve)."
msgstr "* Galego: [Juan Buño](https://twitter.com/Quetzatl_)."
#: ../doc\strings.py:415
#, fuzzy
msgid "* German: [Steffen Schultz](https://twitter.com/schulle4u)."
msgstr "* Español: [Manuel Cortéz](https://twitter.com/manuelcortez00)."
msgstr "* Alemán: [Steffen Schultz](https://twitter.com/schulle4u)."
#: ../doc\strings.py:416
#, fuzzy
msgid "* Croatian: [Zvonimir Stanečić](https://twitter.com/zvonimirek222)."
msgstr "* Galego: [Alba Kinteiro](https://twitter.com/albasmileforeve)."
msgstr "* Croata: [Zvonimir Stanečić](https://twitter.com/zvonimirek222)."
#: ../doc\strings.py:417
msgid "* Hungarian: Robert Osztolykan."
msgstr "* Húngaro: Robert Osztolykan."
#: ../doc\strings.py:418
#, fuzzy
msgid "* Italian: [Christian Leo Mameli](https://twitter.com/llajta2012)."
msgstr "* Basco: [Sukil Etxenike](https://twitter.com/sukil2011)."
msgstr "* Italián: [Christian Leo Mameli](https://twitter.com/llajta2012)."
#: ../doc\strings.py:419
#, fuzzy
msgid "* Japanese: [Riku](https://twitter.com/riku_sub001)"
msgstr "* Basco: [Sukil Etxenike](https://twitter.com/sukil2011)."
msgstr "* Xaponés: [Riku](https://twitter.com/riku_sub001)"
#: ../doc\strings.py:420
#, fuzzy
msgid "* Polish: [Pawel Masarczyk.](https://twitter.com/Piciok)"
msgstr "* Español: [Manuel Cortéz](https://twitter.com/manuelcortez00)."
msgstr "* Polonés: [Pawel Masarczyk.](https://twitter.com/Piciok)"
#: ../doc\strings.py:421
msgid "* Portuguese: Odenilton Júnior Santos."
msgstr "* Portugués: Odenilton Júnior Santos."
#: ../doc\strings.py:422
#, fuzzy
msgid ""
"* Romanian: [Florian Ionașcu](https://twitter.com/7ro) and [Răzvan Ciule]"
"(https://twitter.com/pilgrim89)"
msgstr ""
"* Inglés: [Bryner Villalobos](https://twitter.com/Bry_StarkCR) e [Bill "
"Dengler](https://twitter.com/codeofdusk)."
"* Rumano: [Florian Ionașcu](https://twitter.com/7ro) and [Răzvan Ciule]"
"(https://twitter.com/pilgrim89)"
#: ../doc\strings.py:423
msgid "* Russian: [Александр Яшин](https://twitter.com/radovest)."
msgstr ""
msgstr "* Ruso: [Александр Яшин](https://twitter.com/radovest)."
#: ../doc\strings.py:424
#, fuzzy
msgid "* Serbian: [Aleksandar Đurić](https://twitter.com/sokodtreshnje)"
msgstr "* Galego: [Alba Kinteiro](https://twitter.com/albasmileforeve)."
msgstr "* Servio: [Aleksandar Đurić](https://twitter.com/sokodtreshnje)"
#: ../doc\strings.py:425
#, fuzzy
msgid "* Turkish: [Burak Yüksek](https://twitter.com/burakyuksek)."
msgstr "* Basco: [Sukil Etxenike](https://twitter.com/sukil2011)."
msgstr "* Turco: [Burak Yüksek](https://twitter.com/burakyuksek)."
#: ../doc\strings.py:428
msgid ""

View File

@@ -5,16 +5,16 @@
msgid ""
msgstr ""
"Project-Id-Version: TW Blue documentation 0.46\n"
"POT-Creation-Date: 2015-11-27 08:24+Hora estándar central (México)\n"
"PO-Revision-Date: 2015-11-27 08:34-0600\n"
"Last-Translator: Manuel Cortéz <manuel@manuelcortez.net>\n"
"POT-Creation-Date: 2016-03-31 16:51+Hora de verano romance\n"
"PO-Revision-Date: 2016-06-06 14:11+0100\n"
"Last-Translator: Chris Leo Mameli <llajta2012@gmail.com>\n"
"Language-Team: \n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: pygettext.py 1.5\n"
"X-Generator: Poedit 1.6.11\n"
"X-Generator: Poedit 1.6.3\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-SourceCharset: UTF-8\n"
@@ -1796,9 +1796,8 @@ msgid "* French: [Rémi Ruiz](https://twitter.com/blindhelp38)."
msgstr "* Francese: [Rémi Ruiz](https://twitter.com/blindhelp38)."
#: ../doc\strings.py:414
#, fuzzy
msgid "* Galician: [Juan Buño](https://twitter.com/Quetzatl_)."
msgstr "* Galiziano: [Alba Kinteiro](https://twitter.com/albasmileforeve)."
msgstr "* Galiziano: [Juan Buño](https://twitter.com/Quetzatl_)."
#: ../doc\strings.py:415
msgid "* German: [Steffen Schultz](https://twitter.com/schulle4u)."
@@ -1817,36 +1816,32 @@ msgid "* Italian: [Christian Leo Mameli](https://twitter.com/llajta2012)."
msgstr "* Italiano: [Christian Leo Mameli](https://twitter.com/llajta2012)."
#: ../doc\strings.py:419
#, fuzzy
msgid "* Japanese: [Riku](https://twitter.com/riku_sub001)"
msgstr "* Basco: [Sukil Etxenike](https://twitter.com/sukil2011)."
msgstr "* Giapponese: [Riku](https://twitter.com/riku_sub001)"
#: ../doc\strings.py:420
#, fuzzy
msgid "* Polish: [Pawel Masarczyk.](https://twitter.com/Piciok)"
msgstr "* Spagnolo: [Manuel Cortéz](https://twitter.com/manuelcortez00)."
msgstr "* Polacco: [Pawel Masarczyk.](https://twitter.com/Piciok)"
#: ../doc\strings.py:421
msgid "* Portuguese: Odenilton Júnior Santos."
msgstr "* Portoghese: Odenilton Júnior Santos."
#: ../doc\strings.py:422
#, fuzzy
msgid ""
"* Romanian: [Florian Ionașcu](https://twitter.com/7ro) and [Răzvan Ciule]"
"(https://twitter.com/pilgrim89)"
msgstr ""
"* Inglese: [Bryner Villalobos](https://twitter.com/Bry_StarkCR) and [Bill "
"Dengler](https://twitter.com/codeofdusk)."
"* Romeno: [Florian Ionașcu](https://twitter.com/7ro) and [Răzvan Ciule]"
"(https://twitter.com/pilgrim89)"
#: ../doc\strings.py:423
msgid "* Russian: [Александр Яшин](https://twitter.com/radovest)."
msgstr "* Russo: [Александр Яшин](https://twitter.com/radovest)."
#: ../doc\strings.py:424
#, fuzzy
msgid "* Serbian: [Aleksandar Đurić](https://twitter.com/sokodtreshnje)"
msgstr "* Galiziano: [Alba Kinteiro](https://twitter.com/albasmileforeve)."
msgstr "* Serbo: [Aleksandar Đurić](https://twitter.com/sokodtreshnje)"
#: ../doc\strings.py:425
msgid "* Turkish: [Burak Yüksek](https://twitter.com/burakyuksek)."

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

View File

@@ -1,7 +1,7 @@
[Launch]
ProgramExecutable=TWBlue\TWBlue.exe
ProgramExecutable64=TWBlue64\TWBlue.exe
CommandLineArguments=-p -d "%PAL:DataDir%"
CommandLineArguments=-d "%PAL:DataDir%"
SinglePortableAppInstance=true
MinOS=XP
SingleAppInstance=false

View File

@@ -1,11 +1,11 @@
[Format]
Type=PortableApps.comFormat
Version=3.0
Version=3.3
[Details]
Name=TWBlue portable
Name=tw blue portable
AppID=TWBluePortable
Publisher=jmdaweb & TWBlue & PortableApps.com
Publisher=jmdaweb & TW blue & PortableApps.com
Homepage=PortableApps.com/TWBluePortable
Category=Internet
Description=A portable, fast and accessible Twitter client with many options.
@@ -20,8 +20,8 @@ CommercialUse=true
EULAVersion=2
[Version]
PackageVersion=0.80.0.0
DisplayVersion=0.80
PackageVersion=0.84.0.0
DisplayVersion=0.84
[Control]
Icons=1

View File

@@ -8,10 +8,14 @@ FINNISH=true
FRENCH=true
GALICIAN=true
GERMAN=true
CROATIAN=true
HUNGARIAN=true
ITALIAN=true
JAPANESE=true
POLISH=true
PORTUGUESEBR=true
ROMANIAN=true
RUSSIAN=true
SERBIAN=true
SPANISHINTERNATIONAL=true
TURKISH=true
TURKISH=true

View File

@@ -2,7 +2,7 @@
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title>TWBlue Portable Help</title>
<title>tw blue Portable Help</title>
<link rel="alternate" href="http://portableapps.com/feeds/general" type="application/rss+xml" title="PortableApps.com">
<link rel="shortcut icon" href="Other/Help/Images/Favicon.ico">
<style type="text/css">
@@ -125,13 +125,13 @@
<body>
<div class="logo"><a href="http://portableapps.com/"><img src="Other/Help/Images/Help_Logo_Top.png" alt="PortableApps.com - Your Digital Life, Anywhere"></a></div>
<div class="content">
<h1 class="hastagline">TWBlue Portable Help</h1>
<h1 class="hastagline">tw blue Portable Help</h1>
<h2 class="tagline">A powerful and accessible Twitter client</h2>
<p>TWBlue Portable is the TWBlue whatever it is packaged with a PortableApps.com launcher as a <a href="http://portableapps.com/about/what_is_a_portable_app">portable app</a>, so you can view and send tweets on your iPod, USB flash drive, portable hard drive, etc. It has all the same features as TWBlue, plus, it leaves no personal information behind on the machine you run it on, so you can take it with you wherever you go. <a href="http://twblue.es">Learn more about TWBlue...</a></p>
<p>tw blue Portable is the tw blue whatever it is packaged with a PortableApps.com launcher as a <a href="http://portableapps.com/about/what_is_a_portable_app">portable app</a>, so you can view and send tweets on your iPod, USB flash drive, portable hard drive, etc. It has all the same features as tw blue, plus, it leaves no personal information behind on the machine you run it on, so you can take it with you wherever you go. <a href="http://twblue.es">Learn more about tw blue...</a></p>
<p><a href="http://portableapps.com/donate"><img src="Other/Help/Images/Donation_Button.png" style="vertical-align:middle" alt="Make a Donation"></a> - Support PortableApps.com's Hosting and Development</p>
<p><a href="http://portableapps.com/node/*Node ID*">Go to the TWBlue Portable Homepage &gt;&gt;</a></p>
<p><a href="http://portableapps.com/node/*Node ID*">Go to the tw blue Portable Homepage &gt;&gt;</a></p>
<p><a href="http://portableapps.com/">Get more portable apps at PortableApps.com</a></p>
<p>This software is OSI Certified Open Source Software. OSI Certified is a certification mark of the Open Source Initiative.</p>

View File

@@ -12,10 +12,10 @@ SetCompress auto
SetCompressor /solid lzma
SetDatablockOptimize on
VIAddVersionKey ProductName "TWBlue"
VIAddVersionKey LegalCopyright "Copyright 2015 Manuel Cortéz."
VIAddVersionKey ProductVersion "0.80"
VIAddVersionKey FileVersion "0.80"
VIProductVersion "0.80.0.0"
VIAddVersionKey LegalCopyright "Copyright 2016 Manuel Cortéz."
VIAddVersionKey ProductVersion "0.84"
VIAddVersionKey FileVersion "0.84"
VIProductVersion "0.84.0.0"
!insertmacro MUI_PAGE_WELCOME
!define MUI_LICENSEPAGE_RADIOBUTTONS
!insertmacro MUI_PAGE_LICENSE "license.txt"
@@ -26,7 +26,6 @@ var StartMenuFolder
!define MUI_FINISHPAGE_LINK "Visit TWBlue website"
!define MUI_FINISHPAGE_LINK_LOCATION "http://twblue.es"
!define MUI_FINISHPAGE_RUN "$INSTDIR\TWBlue.exe"
!define MUI_FINISHPAGE_RUN_PARAMETERS "-i"
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
@@ -48,6 +47,7 @@ var StartMenuFolder
!insertmacro MUI_LANGUAGE "Croatian"
!insertmacro MUI_LANGUAGE "Japanese"
!insertmacro MUI_LANGUAGE "SerbianLatin"
!insertmacro MUI_LANGUAGE "Romanian"
!insertmacro MUI_RESERVEFILE_LANGDLL
Section
SetShellVarContext All
@@ -57,10 +57,10 @@ File /r TWBlue64\*
${Else}
File /r TWBlue\*
${EndIf}
CreateShortCut "$DESKTOP\TWBlue.lnk" "$INSTDIR\TWBlue.exe" "-i"
CreateShortCut "$DESKTOP\TWBlue.lnk" "$INSTDIR\TWBlue.exe"
!insertmacro MUI_STARTMENU_WRITE_BEGIN startmenu
CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\TWBlue.lnk" "$INSTDIR\TWBlue.exe" "-i"
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\TWBlue.lnk" "$INSTDIR\TWBlue.exe"
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\TWBlue on the web.lnk" "http://twblue.es"
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
!insertmacro MUI_STARTMENU_WRITE_END
@@ -69,10 +69,10 @@ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "D
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "UninstallString" '"$INSTDIR\uninstall.exe"'
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall" "InstallLocation" $INSTDIR
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall" "Publisher" "Manuel Cortéz"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "DisplayVersion" "0.80"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "DisplayVersion" "0.84"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "URLInfoAbout" "http://twblue.es"
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "VersionMajor" 0
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "VersionMinor" 80
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "VersionMinor" 84
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "NoModify" 1
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "NoRepair" 1
SectionEnd

View File

@@ -28,6 +28,8 @@ timelines = list(default=list())
tweet_searches = list(default=list())
lists = list(default=list())
favourites_timelines = list(default=list())
followers_timelines = list(default=list())
friends_timelines = list(default=list())
trending_topic_buffers = list(default=list())
muted_buffers = list(default=list())
autoread_buffers = list(default=list(mentions, direct_messages, events))
@@ -37,6 +39,3 @@ spelling_language = string(default="")
save_followers_in_autocompletion_db = boolean(default=False)
save_friends_in_autocompletion_db = boolean(default=False)
twishort_enabled = boolean(default=False)
[services]
pocket_access_token = string(default="")

View File

@@ -15,6 +15,7 @@ speak_ready_msg = boolean(default=True)
log_level = string(default="error")
load_keymap = string(default="default.keymap")
donation_dialog_displayed = boolean(default=False)
check_for_updates = boolean(default=True)
[proxy]
server = string(default="")

View File

@@ -2,11 +2,13 @@
name = 'TWBlue'
snapshot = False
if snapshot == False:
version = "0.80"
version = "0.84"
update_url = 'http://twblue.es/updates/twblue_ngen.json'
mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/stable.json'
else:
version = "10.97"
version = "10.99"
update_url = 'http://twblue.es/updates/snapshots_ngen.json'
mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/snapshots.json'
author = u"Manuel Cortéz"
authorEmail = "manuel@manuelcortez.net"
copyright = u"Copyright (C) 2015, Technow S.L. \nCopyright (C) 2013-2015, Manuel cortéz."

View File

@@ -10,7 +10,7 @@ def convert_audioboom(url):
audio_id = url.split('.com/')[-1]
return 'https://audioboom.com/%s.mp3' % audio_id
@matches_url ('http://soundcloud.com/')
@matches_url ('https://soundcloud.com/')
def convert_soundcloud (url):
client_id = "df8113ca95c157b6c9731f54b105b473"
permalink = urllib.urlopen ('http://api.soundcloud.com/resolve.json?client_id=%s&url=%s' %(client_id, url))

File diff suppressed because it is too large Load Diff

View File

@@ -6,13 +6,7 @@ import application
log = logging.getLogger("commandlineLauncher")
parser = argparse.ArgumentParser(description=application.name+" command line launcher")
group = parser.add_mutually_exclusive_group()
group.add_argument("-p", "--portable", help="Use " + application.name + " as a portable application.", action="store_true", default=True)
group.add_argument("-i", "--installed", help="Use " + application.name + " as an installed application. Config files will be saved in the user data directory", action="store_true")
parser.add_argument("-d", "--data-directory", action="store", dest="directory", help="Specifies the directory where " + application.name + " saves userdata.")
args = parser.parse_args()
log.debug("Starting " + application.name + " with the following arguments: installed = %s, portable = %s and directory = %s" % (args.installed, args.portable, args.directory))
if args.installed == True: paths.mode = "installed"
elif args.portable == True:
paths.mode = "portable"
if args.directory != None: paths.directory = args.directory
log.debug("Starting " + application.name + " with the following arguments: directory = %s" % (args.directory))
if args.directory != None: paths.directory = args.directory

View File

@@ -3,6 +3,9 @@ from configobj import ConfigObj, ParseError
from validate import Validator, ValidateError
import os
import string
from logging import getLogger
log = getLogger("config_utils")
class ConfigLoadError(Exception): pass
def load_config(config_path, configspec_path=None, *args, **kwargs):
@@ -14,10 +17,12 @@ def load_config(config_path, configspec_path=None, *args, **kwargs):
except ParseError:
raise ConfigLoadError("Unable to load %r" % config_path)
validator = Validator()
validated = config.validate(validator, copy=True)
validated = config.validate(validator, preserve_errors=False, copy=True)
if validated == True:
config.write()
return config
else:
log.exception("Error in config file: {0}".format(validated,))
def is_blank(arg):
"Check if a line is blank."
@@ -25,6 +30,7 @@ def is_blank(arg):
if c not in string.whitespace:
return False
return True
def get_keys(path):
"Gets the keys of a configobj config file."
res=[]

38
src/controller/attach.py Normal file
View File

@@ -0,0 +1,38 @@
# -*- coding: utf-8 -*-
import os
import widgetUtils
import logging
from wxUI.dialogs import attach as gui
log = logging.getLogger("controller.attach")
class attach(object):
def __init__(self):
self.attachments = list()
self.dialog = gui.attachDialog()
widgetUtils.connect_event(self.dialog.photo, widgetUtils.BUTTON_PRESSED, self.upload_image)
widgetUtils.connect_event(self.dialog.remove, widgetUtils.BUTTON_PRESSED, self.remove_attachment)
self.dialog.get_response()
log.debug("Attachments controller started.")
def upload_image(self, *args, **kwargs):
image, description = self.dialog.get_image()
if image != None:
imageInfo = {"type": "photo", "file": image, "description": description}
log.debug("Image data to upload: %r" % (imageInfo,))
self.attachments.append(imageInfo)
info = [_(u"Photo"), description]
self.dialog.attachments.insert_item(False, *info)
self.dialog.remove.Enable(True)
def remove_attachment(self, *args, **kwargs):
current_item = self.dialog.attachments.get_selected()
log.debug("Removing item %d" % (current_item,))
if current_item == -1: current_item = 0
self.attachments.pop(current_item)
self.dialog.attachments.remove_item(current_item)
self.check_remove_status()
log.debug("Removed")
def check_remove_status(self):
if len(self.attachments) == 0 and self.dialog.attachments.get_count() == 0:
self.dialog.remove.Enable(False)

View File

@@ -49,6 +49,7 @@ class bufferController(object):
def get_event(self, ev):
""" Catches key presses in the WX interface and generate the corresponding event names."""
if ev.GetKeyCode() == wx.WXK_RETURN and ev.ControlDown(): event = "audio"
elif ev.GetKeyCode() == wx.WXK_RETURN: event = "url"
elif ev.GetKeyCode() == wx.WXK_F5: event = "volume_down"
@@ -84,7 +85,9 @@ class bufferController(object):
sound.URLPlayer.stream.volume = self.session.settings["sound"]["volume"]
self.session.sound.play("volume_changed.ogg")
def start_stream(self):
def start_stream(self, mandatory=False):
if mandatory == True:
output.speak(_(u"Unable to update this buffer."))
pass
def get_more_items(self):
@@ -97,7 +100,9 @@ class bufferController(object):
return False
def remove_item(self, item):
f = self.buffer.list.get_selected()
self.buffer.list.remove_item(item)
self.buffer.list.select_item(f)
def bind_events(self):
pass
@@ -134,16 +139,25 @@ class bufferController(object):
self.session.settings["mysc"]["twishort_enabled"] = tweet.message.long_tweet.GetValue()
text = tweet.message.get_text()
if len(text) > 140 and tweet.message.get("long_tweet") == True:
if tweet.image == None:
if not hasattr(tweet, "attachments"):
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text)
else:
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text, 1)
if tweet.image == None:
if not hasattr(tweet, "attachments") or len(tweet.attachments) == 0:
call_threaded(self.session.api_call, call_name="update_status", status=text)
else:
call_threaded(self.session.api_call, call_name="update_status_with_media", status=text, media=tweet.image)
call_threaded(self.post_with_media, text=text, attachments=tweet.attachments)
if hasattr(tweet.message, "destroy"): tweet.message.destroy()
def post_with_media(self, text, attachments):
media_ids = []
for i in attachments:
photo = open(i["file"], "rb")
img = self.session.twitter.twitter.upload_media(media=photo)
self.session.twitter.twitter.set_description(media_id=img["media_id"], alt_text=dict(text=i["description"]))
media_ids.append(img["media_id"])
self.session.twitter.twitter.update_status(status=text, media_ids=media_ids)
def save_positions(self):
try:
self.session.db[self.name+"_pos"]=self.buffer.list.get_selected()
@@ -198,7 +212,7 @@ class accountPanel(bufferController):
class emptyPanel(bufferController):
def __init__(self, parent, name, account):
super(emptyPanel, self).__init__(parent, None, name)
super(emptyPanel, self).__init__(parent=parent)
log.debug("Initializing buffer %s, account %s" % (name, account,))
self.buffer = buffers.emptyPanel(parent, name)
self.type = self.buffer.type
@@ -240,11 +254,11 @@ class baseBufferController(bufferController):
tweet = self.get_right_tweet()
tweetsList = []
tweet_id = tweet["id"]
uri = None
if tweet.has_key("long_uri"):
uri = tweet["long_uri"]
message = None
if tweet.has_key("message"):
message = tweet["message"]
try:
tweet = self.session.twitter.twitter.show_status(id=tweet_id)
tweet = self.session.twitter.twitter.show_status(id=tweet_id, include_ext_alt_text=True)
urls = utils.find_urls_in_text(tweet["text"])
for url in range(0, len(urls)):
try: tweet["text"] = tweet["text"].replace(urls[url], tweet["entities"]["urls"][url]["expanded_url"])
@@ -252,14 +266,13 @@ class baseBufferController(bufferController):
except TwythonError as e:
utils.twitter_error(e)
return
if uri != None:
tweet["text"] = twishort.get_full_text(uri)
if message != None:
tweet["message"] = message
l = tweets.is_long(tweet)
while l != False:
tweetsList.append(tweet)
id = tweets.get_id(l)
try:
tweet = self.session.twitter.twitter.show_status(id=id)
tweet = self.session.twitter.twitter.show_status(id=l, include_ext_alt_text=True)
urls = utils.find_urls_in_text(tweet["text"])
for url in range(0, len(urls)):
try: tweet["text"] = tweet["text"].replace(urls[url], tweet["entities"]["urls"][url]["expanded_url"])
@@ -272,10 +285,10 @@ class baseBufferController(bufferController):
tweetsList.append(tweet)
return (tweet, tweetsList)
def start_stream(self):
def start_stream(self, mandatory=False):
# starts stream every 3 minutes.
current_time = time.time()
if self.execution_time == 0 or current_time-self.execution_time >= 180:
if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory==True:
self.execution_time = current_time
log.debug("Starting stream for buffer %s, account %s and type %s" % (self.name, self.account, self.type))
log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs))
@@ -283,9 +296,9 @@ class baseBufferController(bufferController):
number_of_items = self.session.order_buffer(self.name, val)
log.debug("Number of items retrieved: %d" % (number_of_items,))
self.put_items_on_list(number_of_items)
if self.sound == None: return
if number_of_items > 0 and self.name != "sent_tweets" and self.name != "sent_direct_messages":
if number_of_items > 0 and self.name != "sent_tweets" and self.name != "sent_direct_messages" and self.sound != None:
self.session.sound.play(self.sound)
return number_of_items
def get_more_items(self):
elements = []
@@ -298,7 +311,9 @@ class baseBufferController(bufferController):
except TwythonError as e:
output.speak(e.message, True)
for i in items:
if utils.is_allowed(i, self.session.settings["twitter"]["ignored_clients"]) == True:
if utils.is_allowed(i, self.session.settings["twitter"]["ignored_clients"]) == True and utils.find_item(i["id"], self.session.db[self.name]) == None:
i = self.session.check_quoted_status(i)
i = self.session.check_long_tweet(i)
elements.append(i)
if self.session.settings["general"]["reverse_timelines"] == False:
self.session.db[self.name].insert(0, i)
@@ -324,6 +339,7 @@ class baseBufferController(bufferController):
if dlg == widgetUtils.YES:
if self.name[:-9] in self.session.settings["other_buffers"]["timelines"]:
self.session.settings["other_buffers"]["timelines"].remove(self.name[:-9])
self.session.db.pop(self.name)
return True
elif dlg == widgetUtils.NO:
return False
@@ -332,6 +348,7 @@ class baseBufferController(bufferController):
if dlg == widgetUtils.YES:
if self.name[:-9] in self.session.settings["other_buffers"]["favourites_timelines"]:
self.session.settings["other_buffers"]["favourites_timelines"].remove(self.name[:-9])
self.session.db.pop(self.name)
return True
elif dlg == widgetUtils.NO:
return False
@@ -339,7 +356,15 @@ class baseBufferController(bufferController):
output.speak(_(u"This buffer is not a timeline; it can't be deleted."), True)
return False
def remove_tweet(self, id):
if type(self.session.db[self.name]) == dict: return
for i in xrange(0, len(self.session.db[self.name])):
if self.session.db[self.name][i]["id"] == id:
self.session.db[self.name].pop(i)
self.remove_item(i)
def put_items_on_list(self, number_of_items):
if number_of_items == 0: return
log.debug("The list contains %d items " % (self.buffer.list.get_count(),))
log.debug("Putting %d items on the list" % (number_of_items,))
if self.buffer.list.get_count() == 0:
@@ -349,11 +374,14 @@ class baseBufferController(bufferController):
self.buffer.set_position(self.session.settings["general"]["reverse_timelines"])
elif self.buffer.list.get_count() > 0:
if self.session.settings["general"]["reverse_timelines"] == False:
for i in self.session.db[self.name][:number_of_items]:
items = self.session.db[self.name][len(self.session.db[self.name])-number_of_items:]
for i in items:
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"])
self.buffer.list.insert_item(False, *tweet)
else:
for i in self.session.db[self.name][0:number_of_items]:
items = self.session.db[self.name][0:number_of_items]
items.reverse()
for i in items:
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"])
self.buffer.list.insert_item(True, *tweet)
log.debug("Now the list contains %d items " % (self.buffer.list.get_count(),))
@@ -481,7 +509,13 @@ class baseBufferController(bufferController):
users = utils.get_all_users(tweet, self.session.db)
dm = messages.dm(self.session, _(u"Direct message to %s") % (screen_name,), _(u"New direct message"), users)
if dm.message.get_response() == widgetUtils.OK:
call_threaded(self.session.api_call, call_name="send_direct_message", text=dm.message.get_text(), screen_name=dm.message.get("cb"))
val = self.session.api_call(call_name="send_direct_message", text=dm.message.get_text(), screen_name=dm.message.get("cb"))
if val != None:
if self.session.settings["general"]["reverse_timelines"] == False:
self.session.db["sent_direct_messages"].append(val)
else:
self.session.db["sent_direct_messages"].insert(0, val)
pub.sendMessage("sent-dm", data=val, user=self.session.db["user_name"])
if hasattr(dm.message, "destroy"): dm.message.destroy()
@_tweets_exist
@@ -638,9 +672,9 @@ class listBufferController(baseBufferController):
self.list_id = list_id
self.kwargs["list_id"] = list_id
def start_stream(self):
def start_stream(self, mandatory=False):
self.get_user_ids()
super(listBufferController, self).start_stream()
super(listBufferController, self).start_stream(mandatory)
def get_user_ids(self):
self.users = []
@@ -656,6 +690,7 @@ class listBufferController(baseBufferController):
if dlg == widgetUtils.YES:
if self.name[:-5] in self.session.settings["other_buffers"]["lists"]:
self.session.settings["other_buffers"]["lists"].remove(self.name[:-5])
self.session.db.pop(self.name)
return True
elif dlg == widgetUtils.NO:
return False
@@ -714,7 +749,7 @@ class eventsBufferController(bufferController):
class peopleBufferController(baseBufferController):
def __init__(self, parent, function, name, sessionObject, account, bufferType=None, *args, **kwargs):
super(peopleBufferController, self).__init__(parent, function, name, sessionObject, account, bufferType="peoplePanel")
super(peopleBufferController, self).__init__(parent, function, name, sessionObject, account, bufferType="peoplePanel", *args, **kwargs)
log.debug("Initializing buffer %s, account %s" % (name, account,))
self.compose_function = compose.compose_followers_list
log.debug("Compose_function: %s" % (self.compose_function,))
@@ -722,7 +757,27 @@ class peopleBufferController(baseBufferController):
self.url = self.interact
def remove_buffer(self):
return False
if "-followers" in self.name:
dlg = commonMessageDialogs.remove_buffer()
if dlg == widgetUtils.YES:
if self.name[:-10] in self.session.settings["other_buffers"]["followers_timelines"]:
self.session.settings["other_buffers"]["followers_timelines"].remove(self.name[:-10])
self.session.db.pop(self.name)
return True
elif dlg == widgetUtils.NO:
return False
elif "-friends" in self.name:
dlg = commonMessageDialogs.remove_buffer()
if dlg == widgetUtils.YES:
if self.name[:-8] in self.session.settings["other_buffers"]["friends_timelines"]:
self.session.settings["other_buffers"]["friends_timelines"].remove(self.name[:-8])
self.session.db.pop(self.name)
return True
elif dlg == widgetUtils.NO:
return False
else:
output.speak(_(u"This buffer is not a timeline; it can't be deleted."), True)
return False
def onFocus(self, ev):
pass
@@ -744,19 +799,20 @@ class peopleBufferController(baseBufferController):
call_threaded(self.session.api_call, call_name="update_status_with_media", _sound="reply_send.ogg", status=message.message.get_text(), media=message.file)
if hasattr(message.message, "destroy"): message.message.destroy()
def start_stream(self):
def start_stream(self, mandatory=False):
# starts stream every 3 minutes.
current_time = time.time()
if self.execution_time == 0 or current_time-self.execution_time >= 180:
if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory==True:
self.execution_time = current_time
log.debug("Starting stream for %s buffer, %s account" % (self.name, self.account,))
log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs))
val = self.session.get_cursored_stream(self.name, self.function, *self.args, **self.kwargs)
self.put_items_on_list(val)
return val
def get_more_items(self):
try:
items = self.session.get_more_items(self.function, users=True, name=self.name, count=self.session.settings["general"]["max_tweets_per_call"], cursor=self.session.db[self.name]["cursor"])
items = self.session.get_more_items(self.function, users=True, name=self.name, count=self.session.settings["general"]["max_tweets_per_call"], cursor=self.session.db[self.name]["cursor"], *self.args, **self.kwargs)
except TwythonError as e:
output.speak(e.message, True)
return
@@ -792,7 +848,7 @@ class peopleBufferController(baseBufferController):
# self.buffer.set_list_position()
elif self.buffer.list.get_count() > 0:
if self.session.settings["general"]["reverse_timelines"] == False:
for i in self.session.db[self.name]["items"][:number_of_items]:
for i in self.session.db[self.name]["items"][len(self.session.db[self.name]["items"])-number_of_items:]:
tweet = self.compose_function(i, self.session.db)
self.buffer.list.insert_item(False, *tweet)
else:
@@ -841,10 +897,10 @@ class peopleBufferController(baseBufferController):
pub.sendMessage("execute-action", action="user_details")
class searchBufferController(baseBufferController):
def start_stream(self):
def start_stream(self, mandatory=False):
# starts stream every 3 minutes.
current_time = time.time()
if self.execution_time == 0 or current_time-self.execution_time >= 180:
if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory==True:
self.execution_time = current_time
log.debug("Starting stream for %s buffer, %s account and %s type" % (self.name, self.account, self.type))
log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs))
@@ -857,6 +913,7 @@ class searchBufferController(baseBufferController):
self.put_items_on_list(num)
if num > 0:
self.session.sound.play("search_updated.ogg")
return num
def remove_buffer(self):
dlg = commonMessageDialogs.remove_buffer()
@@ -864,6 +921,7 @@ class searchBufferController(baseBufferController):
if self.name[:-11] in self.session.settings["other_buffers"]["tweet_searches"]:
self.session.settings["other_buffers"]["tweet_searches"].remove(self.name[:-11])
self.timer.cancel()
self.session.db.pop(self.name)
return True
elif dlg == widgetUtils.NO:
return False
@@ -879,10 +937,10 @@ class searchPeopleBufferController(peopleBufferController):
self.kwargs = kwargs
self.function = function
def start_stream(self):
def start_stream(self, mandatory=False):
# starts stream every 3 minutes.
current_time = time.time()
if self.execution_time == 0 or current_time-self.execution_time >= 180:
if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory==True:
self.execution_time = current_time
log.debug("starting stream for %s buffer, %s account and %s type" % (self.name, self.account, self.type))
log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs))
@@ -896,6 +954,7 @@ class searchPeopleBufferController(peopleBufferController):
self.put_items_on_list(number_of_items)
if number_of_items > 0:
self.session.sound.play("search_updated.ogg")
return number_of_items
def remove_buffer(self):
dlg = commonMessageDialogs.remove_buffer()
@@ -903,6 +962,7 @@ class searchPeopleBufferController(peopleBufferController):
if self.name[:-11] in self.session.settings["other_buffers"]["tweet_searches"]:
self.session.settings["other_buffers"]["tweet_searches"].remove(self.name[:-11])
self.timer.cancel()
self.session.db.pop(self.name)
return True
elif dlg == widgetUtils.NO:
return False
@@ -926,10 +986,10 @@ class trendsBufferController(bufferController):
self.get_formatted_message = self.get_message
self.reply = self.search_topic
def start_stream(self):
def start_stream(self, mandatory=False):
# starts stream every 3 minutes.
current_time = time.time()
if self.execution_time == 0 or current_time-self.execution_time >= 180:
if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory == True:
self.execution_time = current_time
try:
data = self.session.call_paged("get_place_trends", id=self.trendsFor)
@@ -970,10 +1030,14 @@ class trendsBufferController(bufferController):
if self.name[:-3] in self.session.settings["other_buffers"]["trending_topic_buffers"]:
self.session.settings["other_buffers"]["trending_topic_buffers"].remove(self.name[:-3])
self.timer.cancel()
self.session.db.pop(self.name)
return True
elif dlg == widgetUtils.NO:
return False
def url(self, *args, **kwargs):
self.tweet_about_this_trend()
def search_topic(self, *args, **kwargs):
topic = self.trends[self.buffer.list.get_selected()]["name"]
pub.sendMessage("search", term=topic)
@@ -1023,10 +1087,10 @@ class trendsBufferController(bufferController):
class conversationBufferController(searchBufferController):
def start_stream(self, start=False):
def start_stream(self, start=False, mandatory=False):
# starts stream every 3 minutes.
current_time = time.time()
if self.execution_time == 0 or current_time-self.execution_time >= 180:
if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory == True:
self.execution_time = current_time
if start == True:
self.statuses = []
@@ -1035,7 +1099,10 @@ class conversationBufferController(searchBufferController):
self.ids.append(self.tweet["id"])
tweet = self.tweet
while tweet["in_reply_to_status_id"] != None:
tweet = self.session.twitter.twitter.show_status(id=tweet["in_reply_to_status_id"])
try:
tweet = self.session.twitter.twitter.show_status(id=tweet["in_reply_to_status_id"])
except TwythonError as err:
break
self.statuses.insert(0, tweet)
self.ids.append(tweet["id"])
if tweet["in_reply_to_status_id"] == None:
@@ -1052,13 +1119,14 @@ class conversationBufferController(searchBufferController):
self.put_items_on_list(number_of_items)
if number_of_items > 0:
self.session.sound.play("search_updated.ogg")
return number_of_items
def remove_buffer(self):
dlg = commonMessageDialogs.remove_buffer()
if dlg == widgetUtils.YES:
self.timer.cancel()
return True
elif dlg == WidgetUtils.NO:
elif dlg == widgetUtils.NO:
return False
class pocketBufferController(baseBufferController):

View File

@@ -0,0 +1,7 @@
# -*- coding: utf-8 -*-
from wxUI.dialogs import filters
class filterController(object):
def __init__(self):
self.dialog = filters.filterDialog()
self.dialog.get_response()

View File

@@ -118,6 +118,8 @@ class Controller(object):
pub.subscribe(self.manage_unblocked_user, "unblocked-user")
pub.subscribe(self.manage_item_in_timeline, "item-in-timeline")
pub.subscribe(self.manage_item_in_list, "item-in-list")
pub.subscribe(self.restart_streams_, "restart_streams")
pub.subscribe(self.on_tweet_deleted, "tweet-deleted")
widgetUtils.connect_event(self.view, widgetUtils.CLOSE_EVENT, self.exit_)
def bind_other_events(self):
@@ -177,8 +179,10 @@ class Controller(object):
widgetUtils.connect_event(self.view.nb, widgetUtils.NOTEBOOK_PAGE_CHANGED, self.buffer_changed)
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.report_error, self.view.reportError)
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.view_documentation, self.view.doc)
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.view_changelog, self.view.changelog)
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.add_to_list, self.view.addToList)
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.remove_from_list, self.view.removeFromList)
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.update_buffer, self.view.update_buffer)
def set_systray_icon(self):
self.systrayIcon = sysTrayIcon.SysTrayIcon()
@@ -188,6 +192,7 @@ class Controller(object):
widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.update_profile, menuitem=self.systrayIcon.update_profile)
widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.show_hide, menuitem=self.systrayIcon.show_hide)
widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.check_for_updates, menuitem=self.systrayIcon.check_for_updates)
widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.view_documentation, menuitem=self.systrayIcon.doc)
widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.exit, menuitem=self.systrayIcon.exit)
widgetUtils.connect_event(self.systrayIcon, widgetUtils.TASKBAR_LEFT_CLICK, self.taskbar_left_click)
widgetUtils.connect_event(self.systrayIcon, widgetUtils.TASKBAR_RIGHT_CLICK, self.taskbar_right_click)
@@ -344,6 +349,24 @@ class Controller(object):
self.view.insert_buffer(tl.buffer, name=_(u"Likes for {}").format(i,), pos=self.view.search("favs_timelines", session.db["user_name"]))
tl.timer = RepeatingTimer(300, tl.start_stream)
tl.timer.start()
followers_timelines = buffersController.emptyPanel(self.view.nb, "followers_timelines", session.db["user_name"])
self.buffers.append(followers_timelines)
self.view.insert_buffer(followers_timelines.buffer , name=_(u"Followers' Timelines"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
for i in session.settings["other_buffers"]["followers_timelines"]:
tl = buffersController.peopleBufferController(self.view.nb, "get_followers_list", "%s-followers" % (i,), session, session.db["user_name"], screen_name=i)
self.buffers.append(tl)
self.view.insert_buffer(tl.buffer, name=_(u"Followers for {}").format(i,), pos=self.view.search("favs_timelines", session.db["user_name"]))
tl.timer = RepeatingTimer(300, tl.start_stream)
tl.timer.start()
friends_timelines = buffersController.emptyPanel(self.view.nb, "friends_timelines", session.db["user_name"])
self.buffers.append(friends_timelines)
self.view.insert_buffer(friends_timelines.buffer , name=_(u"Friends' Timelines"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
for i in session.settings["other_buffers"]["friends_timelines"]:
tl = buffersController.peopleBufferController(self.view.nb, "get_friends_list", "%s-friends" % (i,), session, session.db["user_name"], screen_name=i)
self.buffers.append(tl)
self.view.insert_buffer(tl.buffer, name=_(u"Friends for {}").format(i,), pos=self.view.search("favs_timelines", session.db["user_name"]))
tl.timer = RepeatingTimer(300, tl.start_stream)
tl.timer.start()
lists = buffersController.emptyPanel(self.view.nb, "lists", session.db["user_name"])
self.buffers.append(lists)
self.view.insert_buffer(lists.buffer , name=_(u"Lists"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
@@ -410,13 +433,14 @@ class Controller(object):
if dlg.get("tweets") == True:
if term not in buffer.session.settings["other_buffers"]["tweet_searches"]:
buffer.session.settings["other_buffers"]["tweet_searches"].append(term)
search = buffersController.searchBufferController(self.view.nb, "search", "%s-searchterm" % (term,), buffer.session, buffer.session.db["user_name"], bufferType="searchPanel", q=term, count=buffer.session.settings["general"]["max_tweets_per_call"])
args = {"lang": dlg.get_language(), "result_type": dlg.get_result_type()}
search = buffersController.searchBufferController(self.view.nb, "search", "%s-searchterm" % (term,), buffer.session, buffer.session.db["user_name"], bufferType="searchPanel", q=term, count=buffer.session.settings["general"]["max_tweets_per_call"], **args)
else:
log.error("A buffer for the %s search term is already created. You can't create a duplicate buffer." % (term,))
return
elif dlg.get("users") == True:
search = buffersController.searchPeopleBufferController(self.view.nb, "search_users", "%s-searchUser" % (term,), buffer.session, buffer.session.db["user_name"], bufferType=None, q=term)
search.start_stream()
search.start_stream(mandatory=True)
pos=self.view.search("searches", buffer.session.db["user_name"])
self.insert_buffer(search, pos)
self.view.insert_buffer(search.buffer, name=_(u"Search for {}").format(term), pos=pos)
@@ -759,7 +783,8 @@ class Controller(object):
return
answer = commonMessageDialogs.protected_user()
if answer == widgetUtils.NO: return
if dlg.get_action() == "tweets":
tl_type = dlg.get_action()
if tl_type == "tweets":
if usr["statuses_count"] == 0:
commonMessageDialogs.no_tweets()
return
@@ -775,7 +800,7 @@ class Controller(object):
buff.session.settings["other_buffers"]["timelines"].append(dlg.get_user())
pub.sendMessage("restart-streams", streams=["timelinesStream"], session=buff.session)
buff.session.sound.play("create_timeline.ogg")
else:
elif tl_type == "favourites":
if usr["favourites_count"] == 0:
commonMessageDialogs.no_favs()
return
@@ -792,6 +817,40 @@ class Controller(object):
tl.timer.start()
buff.session.settings["other_buffers"]["favourites_timelines"].append(dlg.get_user())
buff.session.sound.play("create_timeline.ogg")
elif tl_type == "followers":
if usr["followers_count"] == 0:
commonMessageDialogs.no_followers()
return
if dlg.get_user() in buff.session.settings["other_buffers"]["followers_timelines"]:
commonMessageDialogs.timeline_exist()
return
tl = buffersController.peopleBufferController(self.view.nb, "get_followers_list", "%s-followers" % (dlg.get_user(),), buff.session, buff.session.db["user_name"], screen_name=dlg.get_user())
pos=self.view.search("followers_timelines", buff.session.db["user_name"])
self.insert_buffer(tl, pos+1)
# self.buffers.insert(pos+1, tl)
self.view.insert_buffer(buffer=tl.buffer, name=_(u"Followers for {}").format(dlg.get_user()), pos=pos)
tl.start_stream()
tl.timer = RepeatingTimer(300, tl.start_stream)
tl.timer.start()
buff.session.settings["other_buffers"]["followers_timelines"].append(dlg.get_user())
buff.session.sound.play("create_timeline.ogg")
elif tl_type == "friends":
if usr["friends_count"] == 0:
commonMessageDialogs.no_friends()
return
if dlg.get_user() in buff.session.settings["other_buffers"]["friends_timelines"]:
commonMessageDialogs.timeline_exist()
return
tl = buffersController.peopleBufferController(self.view.nb, "get_friends_list", "%s-friends" % (dlg.get_user(),), buff.session, buff.session.db["user_name"], screen_name=dlg.get_user())
pos=self.view.search("friends_timelines", buff.session.db["user_name"])
self.insert_buffer(tl, pos+1)
self.view.insert_buffer(buffer=tl.buffer, name=_(u"Friends for {}").format(dlg.get_user()), pos=pos)
tl.start_stream()
tl.timer = RepeatingTimer(300, tl.start_stream)
tl.timer.start()
buff.session.settings["other_buffers"]["friends_timelines"].append(dlg.get_user())
buff.session.sound.play("create_timeline.ogg")
else:
commonMessageDialogs.user_not_exist()
@@ -866,7 +925,7 @@ class Controller(object):
x = tweet["coordinates"]["coordinates"][0]
y = tweet["coordinates"]["coordinates"][1]
address = geocoder.reverse_geocode(y, x)
dlg = messages.viewTweet(address[0].__str__(), False)
dlg = commonMessageDialogs.view_geodata(address[0].__str__())
else:
output.speak(_(u"There are no coordinates in this tweet"))
except GeocoderError:
@@ -1218,7 +1277,7 @@ class Controller(object):
buffer = self.search_buffer("%s-timeline" % (who,), user)
if buffer == None: return
play_sound = "tweet_timeline.ogg"
if "%s-timeline" % (who,) not in buffer.session.settings["other_buffers"]["muted_buffers"]:
if "%s-timeline" % (who,) not in buffer.session.settings["other_buffers"]["muted_buffers"] and buffer.session.settings["sound"]["session_mute"] == False:
self.notify(buffer.session, play_sound=play_sound)
output.speak(_(u"One tweet from %s") % (data["user"]["name"]))
buffer.add_new_item(data)
@@ -1227,7 +1286,7 @@ class Controller(object):
buffer = self.search_buffer("%s" % (where,), user)
if buffer == None: return
play_sound = "list_tweet.ogg"
if "%s" % (where,) not in buffer.session.settings["other_buffers"]["muted_buffers"]:
if "%s" % (where,) not in buffer.session.settings["other_buffers"]["muted_buffers"] and buffer.session.settings["sound"]["session_mute"] == False:
self.notify(buffer.session, play_sound=play_sound)
output.speak(_(u"One tweet from %s") % (data["user"]["name"]))
buffer.add_new_item(data)
@@ -1255,7 +1314,7 @@ class Controller(object):
s.timelinesStream.disconnect()
del s.timelinesStream
s.counter = 0
s.reconnection_function_active = False
# s.reconnection_function_active = False
# for i in self.buffers:
# if i.invisible == True and i.session.session_id == s.session_id and i.type != "people":
# i.start_stream()
@@ -1391,6 +1450,11 @@ class Controller(object):
webbrowser.open("manual.html")
os.chdir("../../")
def view_changelog(self, *args, **kwargs):
os.chdir("documentation")
webbrowser.open("changelog.html")
os.chdir("../")
def insert_buffer(self, buffer, position):
self.buffers.insert(position, buffer)
@@ -1405,5 +1469,27 @@ class Controller(object):
if hasattr(self, action):
getattr(self, action)()
def restart_streams_(self, session):
for i in self.buffers:
if i.session != None and i.session.session_id == session:
i.start_stream()
def __del__(self):
config.app.write()
config.app.write()
def update_buffer(self, *args, **kwargs):
bf = self.get_current_buffer()
if not hasattr(bf, "start_stream"):
output.speak(_(u"Unable to update this buffer."))
return
else:
output.speak(_(u"Updating buffer..."))
n = bf.start_stream(mandatory=True)
if n != None:
output.speak(_(u"{0} items retrieved").format(n,))
def on_tweet_deleted(self, data):
id = data["delete"]["status"]["id"]
for i in self.buffers:
if hasattr(i, "remove_tweet") and hasattr(i, "name"):
i.remove_tweet(id)

View File

@@ -1,5 +1,7 @@
# -*- coding: utf-8 -*-
import re
import platform
import attach
system = platform.system()
import widgetUtils
import output
@@ -27,19 +29,22 @@ class basicTweet(object):
# if system == "Windows":
# if messageType != "dm":
widgetUtils.connect_event(self.message.text, widgetUtils.ENTERED_TEXT, self.text_processor)
self.text_processor()
widgetUtils.connect_event(self.message.shortenButton, widgetUtils.BUTTON_PRESSED, self.shorten)
widgetUtils.connect_event(self.message.unshortenButton, widgetUtils.BUTTON_PRESSED, self.unshorten)
widgetUtils.connect_event(self.message.translateButton, widgetUtils.BUTTON_PRESSED, self.translate)
if hasattr(self.message, "long_tweet"):
widgetUtils.connect_event(self.message.long_tweet, widgetUtils.CHECKBOX, self.text_processor)
self.attachments = []
def translate(self, event=None):
dlg = translator.gui.translateDialog()
if dlg.get_response() == widgetUtils.OK:
text_to_translate = self.message.get_text().encode("utf-8")
text_to_translate = self.message.get_text()
source = [x[0] for x in translator.translator.available_languages()][dlg.get("source_lang")]
dest = [x[0] for x in translator.translator.available_languages()][dlg.get("dest_lang")]
msg = translator.translator.translate(text=text_to_translate, source=source, target=dest)
self.message.set_text(msg)
self.text_processor()
self.message.text_focus()
output.speak(_(u"Translated"))
else:
@@ -53,6 +58,7 @@ class basicTweet(object):
elif len(urls) == 1:
self.message.set_text(self.message.get_text().replace(urls[0], url_shortener.shorten(urls[0])))
output.speak(_(u"URL shortened"))
self.text_processor()
self.message.text_focus()
elif len(urls) > 1:
list_urls = urlList.urlList()
@@ -60,6 +66,7 @@ class basicTweet(object):
if list_urls.get_response() == widgetUtils.OK:
self.message.set_text(self.message.get_text().replace(urls[list_urls.get_item()], url_shortener.shorten(list_urls.get_string())))
output.speak(_(u"URL shortened"))
self.text_processor()
self.message.text_focus()
def unshorten(self, event=None):
@@ -70,6 +77,7 @@ class basicTweet(object):
elif len(urls) == 1:
self.message.set_text(self.message.get_text().replace(urls[0], url_shortener.unshorten(urls[0])))
output.speak(_(u"URL expanded"))
self.text_processor()
self.message.text_focus()
elif len(urls) > 1:
list_urls = urlList.urlList()
@@ -77,6 +85,7 @@ class basicTweet(object):
if list_urls.get_response() == widgetUtils.OK:
self.message.set_text(self.message.get_text().replace(urls[list_urls.get_item()], url_shortener.unshorten(list_urls.get_string())))
output.speak(_(u"URL expanded"))
self.text_processor()
self.message.text_focus()
def text_processor(self, *args, **kwargs):
@@ -98,15 +107,17 @@ class basicTweet(object):
checker = SpellChecker.spellchecker.spellChecker(text, "")
if hasattr(checker, "fixed_text"):
self.message.set_text(checker.fixed_text)
self.text_processor()
self.message.text_focus()
def attach(self, *args, **kwargs):
def completed_callback():
def completed_callback(dlg):
url = dlg.uploaderFunction.get_url()
pub.unsubscribe(dlg.uploaderDialog.update, "uploading")
dlg.uploaderDialog.destroy()
if url != 0:
self.message.set_text(self.message.get_text()+url+" #audio")
self.text_processor()
else:
output.speak(_(u"Unable to upload the audio"))
dlg.cleanup()
@@ -122,18 +133,12 @@ class tweet(basicTweet):
if twishort_enabled == False:
try: self.message.long_tweet.SetValue(False)
except AttributeError: pass
self.text_processor()
def upload_image(self, *args, **kwargs):
if self.message.get("upload_image") == _(u"Discard image"):
del self.image
self.image = None
output.speak(_(u"Discarded"))
self.message.set("upload_image", _(u"Upload a picture"))
else:
self.image = self.message.get_image()
if self.image != None:
self.message.set("upload_image", _(u"Discard image"))
self.message.text_focus()
a = attach.attach()
if len(a.attachments) != 0:
self.attachments = a.attachments
def autocomplete_users(self, *args, **kwargs):
c = autocompletionUsers.completion.autocompletionUsers(self.message, self.session.session_id)
@@ -147,16 +152,19 @@ class reply(tweet):
widgetUtils.connect_event(self.message.mentionAll, widgetUtils.BUTTON_PRESSED, self.mention_all)
self.message.enable_button("mentionAll")
self.message.set_cursor_at_end()
self.text_processor()
def mention_all(self, *args, **kwargs):
self.message.set_text(self.message.get_text()+self.users)
self.message.set_cursor_at_end()
self.message.text_focus()
self.text_processor()
class dm(basicTweet):
def __init__(self, session, title, caption, text):
super(dm, self).__init__(session, title, caption, text, messageType="dm", max=10000)
widgetUtils.connect_event(self.message.autocompletionButton, widgetUtils.BUTTON_PRESSED, self.autocomplete_users)
self.text_processor()
def autocomplete_users(self, *args, **kwargs):
c = autocompletionUsers.completion.autocompletionUsers(self.message, self.session.session_id)
@@ -164,23 +172,56 @@ class dm(basicTweet):
class viewTweet(basicTweet):
def __init__(self, tweet, tweetList, is_tweet=True):
""" This represents a tweet displayer. However it could be used for showing something wich is not a tweet, like a direct message or an event.
param tweet: A dictionary that represents a full tweet or a string for non-tweets.
param tweetList: If is_tweet is set to True, this could be a list of quoted tweets.
param is_tweet: True or false, depending wether the passed object is a tweet or not."""
if is_tweet == True:
image_description = []
text = ""
for i in xrange(0, len(tweetList)):
if tweetList[i].has_key("retweeted_status"):
text = text + "rt @%s: %s\n" % (tweetList[i]["retweeted_status"]["user"]["screen_name"], tweetList[i]["retweeted_status"]["text"])
# tweets with message keys are longer tweets, the message value is the full messaje taken from twishort.
if tweetList[i].has_key("message") and tweetList[i]["is_quote_status"] == False:
value = "message"
else:
text = text + "@%s: %s\n" % (tweetList[i]["user"]["screen_name"], tweetList[i]["text"])
value = "text"
if tweetList[i].has_key("retweeted_status") and tweetList[i]["is_quote_status"] == False:
if tweetList[i].has_key("message") == False:
text = text + "rt @%s: %s\n" % (tweetList[i]["retweeted_status"]["user"]["screen_name"], tweetList[i]["retweeted_status"]["text"])
else:
text = text + "rt @%s: %s\n" % (tweetList[i]["retweeted_status"]["user"]["screen_name"], tweetList[i][value])
else:
text = text + " @%s: %s\n" % (tweetList[i]["user"]["screen_name"], tweetList[i][value])
# tweets with extended_entities could include image descriptions.
if tweetList[i].has_key("extended_entities") and tweetList[i]["extended_entities"].has_key("media"):
for z in tweetList[i]["extended_entities"]["media"]:
if z.has_key("ext_alt_text") and z["ext_alt_text"] != None:
image_description.append(z["ext_alt_text"])
# set rt and likes counters.
rt_count = str(tweet["retweet_count"])
favs_count = str(tweet["favorite_count"])
# Gets the client from where this tweet was made.
source = str(re.sub(r"(?s)<.*?>", "", tweet["source"].encode("utf-8")))
if text == "":
if tweet.has_key("retweeted_status"):
text = "rt @%s: %s" % (tweet["retweeted_status"]["user"]["screen_name"], tweet["retweeted_status"]["text"])
if tweet.has_key("message"):
value = "message"
else:
text = tweet["text"]
value = "text"
if tweet.has_key("retweeted_status"):
if tweet.has_key("message") == False:
text = "rt @%s: %s" % (tweet["retweeted_status"]["user"]["screen_name"], tweet["retweeted_status"]["text"])
else:
text = "rt @%s: %s" % (tweet["retweeted_status"]["user"]["screen_name"], tweet[value])
else:
text = tweet[value]
text = self.clear_text(text)
self.message = message.viewTweet(text, rt_count, favs_count)
if tweet.has_key("extended_entities") and tweet["extended_entities"].has_key("media"):
for z in tweet["extended_entities"]["media"]:
if z.has_key("ext_alt_text") and z["ext_alt_text"] != None:
image_description.append(z["ext_alt_text"])
self.message = message.viewTweet(text, rt_count, favs_count, source.decode("utf-8"))
self.message.set_title(len(text))
[self.message.set_image_description(i) for i in image_description]
else:
text = tweet
self.message = message.viewNonTweet(text)
@@ -200,5 +241,5 @@ class viewTweet(basicTweet):
urls = utils.find_urls_in_text(text)
for i in urls:
if "https://twitter.com/" in i:
text = text.replace(i, "")
text = text.replace(i, "\n")
return text

View File

@@ -64,11 +64,13 @@ 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", "check_for_updates", config.app["app-settings"]["check_for_updates"])
self.dialog.create_proxy()
self.dialog.set_value("proxy", "server", config.app["proxy"]["server"])
self.dialog.set_value("proxy", "port", config.app["proxy"]["port"])
self.dialog.set_value("proxy", "user", config.app["proxy"]["user"])
self.dialog.set_value("proxy", "password", config.app["proxy"]["password"])
self.dialog.realize()
self.response = self.dialog.get_response()
@@ -92,6 +94,7 @@ class globalSettingsController(object):
config.app["app-settings"]["handle_longtweets"] = self.dialog.get_value("general", "handle_longtweets")
config.app["app-settings"]["play_ready_sound"] = self.dialog.get_value("general", "play_ready_sound")
config.app["app-settings"]["speak_ready_msg"] = self.dialog.get_value("general", "speak_ready_msg")
config.app["app-settings"]["check_for_updates"] = self.dialog.get_value("general", "check_for_updates")
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
@@ -261,24 +264,24 @@ class accountSettingsController(globalSettingsController):
if change == True:
self.dialog.buffers.change_selected_item()
def manage_pocket(self, *args, **kwargs):
if self.dialog.services.get_pocket_status() == _(u"Connect your Pocket account"):
self.connect_pocket()
else:
self.disconnect_pocket()
# def manage_pocket(self, *args, **kwargs):
# if self.dialog.services.get_pocket_status() == _(u"Connect your Pocket account"):
# self.connect_pocket()
# else:
# self.disconnect_pocket()
def connect_pocket(self):
dlg = self.dialog.services.show_pocket_dialog()
if dlg == widgetUtils.YES:
request_token = pocket.Pocket.get_request_token(consumer_key=keys.keyring.get("pocket_consumer_key"), redirect_uri="http://127.0.0.1:8080")
auth_url = pocket.Pocket.get_auth_url(code=request_token, redirect_uri="http://127.0.0.1:8080")
webbrowser.open_new_tab(auth_url)
httpd = BaseHTTPServer.HTTPServer(('127.0.0.1', 8080), authorisationHandler.handler)
while authorisationHandler.logged == False:
httpd.handle_request()
user_credentials = pocket.Pocket.get_credentials(consumer_key=keys.keyring.get("pocket_consumer_key"), code=request_token)
self.dialog.services.set_pocket(True)
self.config["services"]["pocket_access_token"] = user_credentials["access_token"]
# def connect_pocket(self):
# dlg = self.dialog.services.show_pocket_dialog()
# if dlg == widgetUtils.YES:
# request_token = pocket.Pocket.get_request_token(consumer_key=keys.keyring.get("pocket_consumer_key"), redirect_uri="http://127.0.0.1:8080")
# auth_url = pocket.Pocket.get_auth_url(code=request_token, redirect_uri="http://127.0.0.1:8080")
# webbrowser.open_new_tab(auth_url)
# httpd = BaseHTTPServer.HTTPServer(('127.0.0.1', 8080), authorisationHandler.handler)
# while authorisationHandler.logged == False:
# httpd.handle_request()
# user_credentials = pocket.Pocket.get_credentials(consumer_key=keys.keyring.get("pocket_consumer_key"), code=request_token)
# self.dialog.services.set_pocket(True)
# self.config["services"]["pocket_access_token"] = user_credentials["access_token"]
def disconnect_dropbox(self):
self.config["services"]["pocket_access_token"] = ""

View File

@@ -31,6 +31,8 @@ class profileController(object):
def get_data(self, screen_name):
self.data = self.session.twitter.twitter.show_user(screen_name=screen_name)
if screen_name != self.session.db["user_name"]:
self.friendship_status = self.session.twitter.twitter.show_friendship(source_screen_name=self.session.db["user_name"], target_screen_name=screen_name)
def fill_profile_fields(self):
self.dialog.set_name(self.data["name"])
@@ -90,6 +92,17 @@ class profileController(object):
if self.data["protected"] == True: protected = _(u"Yes")
else: protected = _(u"No")
string = string+ _(u"Protected: %s\n") % (protected)
if hasattr(self, "friendship_status"):
relation = False
friendship = "Relationship: "
if self.friendship_status["relationship"]["target"]["followed_by"]:
friendship += _(u"You follow {0}. ").format(self.data["name"],)
relation = True
if self.friendship_status["relationship"]["target"]["following"]:
friendship += _(u"{0} is following you.").format(self.data["name"],)
relation = True
if relation == True:
string = string+friendship+"\n"
string = string+_(u"Followers: %s\n Friends: %s\n") % (self.data["followers_count"], self.data["friends_count"])
if self.data["verified"] == True: verified = _(u"Yes")
else: verified = _(u"No")

View File

@@ -57,18 +57,16 @@ class audioUploader(object):
url = base_url + '?apikey=' + self.config['sound']['sndup_api_key']
else:
url = base_url
self.uploaderFunction = transfer.Upload(field='file', url=url, filename=self.file, completed_callback=completed_callback)
elif self.dialog.get("services") == "TwUp":
url = "http://api.twup.me/post.json"
self.uploaderFunction = transfer.Upload(field='file', url=url, filename=self.file, completed_callback=completed_callback)
self.uploaderFunction = transfer.Upload(obj=self, field='file', url=url, filename=self.file, completed_callback=completed_callback)
pub.subscribe(self.uploaderDialog.update, "uploading")
self.uploaderDialog.get_response()
self.uploaderFunction.perform_threaded()
self.uploaderDialog.get_response(self.uploaderFunction.perform_threaded)
def get_available_services(self):
services = []
services.append("TwUp")
services.append("SNDUp")
services.append("TwUp")
return services
def on_pause(self, *args, **kwargs):
@@ -116,8 +114,9 @@ class audioUploader(object):
if self.playing:
self._stop()
if self.recording != None:
self.dialog.disable_control("attach")
self.dialog.disable_control("play")
self.cleanup()
self.dialog.disable_control("attach")
self.dialog.disable_control("play")
self.file = None
self.dialog.enable_control("record")
self.dialog.enable_control("attach_exists")
@@ -174,10 +173,6 @@ class audioUploader(object):
os.remove(self.file)
if hasattr(self, 'wav_file'):
os.remove(self.wav_file)
del(self.wav_file)
if hasattr(self, 'wav_file') and os.path.exists(self.file):
os.remove(self.file)
def on_attach_exists(self, *args, **kwargs):
self.file = self.dialog.get_file()

View File

@@ -1,106 +1,71 @@
# -*- coding: utf-8 -*-
import pycurl
import sys
import threading
import time
import json
import logging
from utils import *
from pubsub import pub
log = logging.getLogger("extra.AudioUploader.transfer")
class Transfer(object):
def __init__(self, url=None, filename=None, follow_location=True, completed_callback=None, verbose=False, *args, **kwargs):
self.url = url
self.filename = filename
log.debug("Uploading audio to %s, filename %s" % (url, filename))
self.curl = pycurl.Curl()
self.start_time = None
self.completed_callback = completed_callback
self.background_thread = None
self.transfer_rate = 0
self.curl.setopt(self.curl.PROGRESSFUNCTION, self.progress_callback)
self.curl.setopt(self.curl.URL, url)
self.curl.setopt(self.curl.NOPROGRESS, 0)
self.curl.setopt(self.curl.HTTP_VERSION, self.curl.CURL_HTTP_VERSION_1_0)
self.curl.setopt(self.curl.FOLLOWLOCATION, int(follow_location))
self.curl.setopt(self.curl.VERBOSE, int(verbose))
super(Transfer, self).__init__(*args, **kwargs)
def elapsed_time(self):
if not self.start_time:
return 0
return time.time() - self.start_time
def progress_callback(self, down_total, down_current, up_total, up_current):
progress = {}
progress["total"] = up_total
progress["current"] = up_current
# else:
# print "Killed function"
# return
if progress["current"] == 0:
progress["percent"] = 0
self.transfer_rate = 0
else:
progress["percent"] = int((float(progress["current"]) / progress["total"]) * 100)
self.transfer_rate = progress["current"] / self.elapsed_time()
progress["speed"] = '%s/s' % convert_bytes(self.transfer_rate)
if self.transfer_rate:
progress["eta"] = (progress["total"] - progress["current"]) / self.transfer_rate
else:
progress["eta"] = 0
pub.sendMessage("uploading", data=progress)
def perform_transfer(self):
log.debug("starting upload...")
self.start_time = time.time()
self.curl.perform()
self.curl.close()
log.debug("Upload finished.")
self.complete_transfer()
def perform_threaded(self):
self.background_thread = threading.Thread(target=self.perform_transfer)
self.background_thread.daemon = True
self.background_thread.start()
def complete_transfer(self):
if callable(self.completed_callback):
self.curl.close()
self.completed_callback()
class Upload(Transfer):
def __init__(self, field=None, filename=None, *args, **kwargs):
super(Upload, self).__init__(filename=filename, *args, **kwargs)
self.response = dict()
self.curl.setopt(self.curl.POST, 1)
if isinstance(filename, unicode):
local_filename = filename.encode(sys.getfilesystemencoding())
else:
local_filename = filename
self.curl.setopt(self.curl.HTTPPOST, [(field, (self.curl.FORM_FILE, local_filename, self.curl.FORM_FILENAME, filename.encode("utf-8")))])
self.curl.setopt(self.curl.HEADERFUNCTION, self.header_callback)
self.curl.setopt(self.curl.WRITEFUNCTION, self.body_callback)
def header_callback(self, content):
self.response['header'] = content
def body_callback(self, content):
self.response['body'] = content
def get_url(self):
return json.loads(self.response['body'])['url']
class Download(Transfer):
def __init__(self, follow_location=True, *args, **kwargs):
super(Download, self).__init__(*args, **kwargs)
self.download_file = open(self.filename, 'wb')
self.curl.setopt(self.curl.WRITEFUNCTION, self.download_file.write)
def complete_transfer(self):
self.download_file.close()
super(DownloadDialog, self).complete_transfer()
# -*- coding: utf-8 -*-
import sys
import threading
import time
import logging
from utils import convert_bytes
from pubsub import pub
log = logging.getLogger("extra.AudioUploader.transfer")
from requests_toolbelt.multipart.encoder import MultipartEncoder, MultipartEncoderMonitor
import requests
import os
class Upload(object):
def __init__(self, field=None, obj=None, url=None, filename=None, follow_location=True, completed_callback=None, verbose=False, *args, **kwargs):
super(Upload, self).__init__(*args, **kwargs)
self.url=url
self.filename=filename
log.debug("Uploading audio to %s, filename %s" % (url, filename))
self.start_time = None
self.completed_callback = completed_callback
self.background_thread = None
self.transfer_rate = 0
self.local_filename=os.path.basename(self.filename)
if isinstance(self.local_filename, unicode):
self.local_filename=self.local_filename.encode(sys.getfilesystemencoding())
self.m = MultipartEncoder(fields={field:(self.local_filename, open(self.filename, 'rb'), "application/octet-stream")})
self.monitor = MultipartEncoderMonitor(self.m, self.progress_callback)
self.response=None
self.obj=obj
self.follow_location=follow_location
#the verbose parameter is deprecated and will be removed soon
def elapsed_time(self):
if not self.start_time:
return 0
return time.time() - self.start_time
def progress_callback(self, monitor):
progress = {}
progress["total"] = monitor.len
progress["current"] = monitor.bytes_read
if progress["current"] == 0:
progress["percent"] = 0
self.transfer_rate = 0
else:
progress["percent"] = int((float(progress["current"]) / progress["total"]) * 100)
self.transfer_rate = progress["current"] / self.elapsed_time()
progress["speed"] = '%s/s' % convert_bytes(self.transfer_rate)
if self.transfer_rate:
progress["eta"] = (progress["total"] - progress["current"]) / self.transfer_rate
else:
progress["eta"] = 0
pub.sendMessage("uploading", data=progress)
def perform_transfer(self):
log.debug("starting upload...")
self.start_time = time.time()
self.response=requests.post(url=self.url, data=self.monitor, headers={"Content-Type":self.m.content_type}, allow_redirects=self.follow_location, stream=True)
log.debug("Upload finished.")
self.complete_transfer()
def perform_threaded(self, *args, **kwargs):
self.background_thread = threading.Thread(target=self.perform_transfer)
self.background_thread.daemon = True
self.background_thread.start()
def complete_transfer(self):
if callable(self.completed_callback):
self.completed_callback(self.obj)
def get_url(self):
return self.response.json()['url']

View File

@@ -3,10 +3,10 @@ import wx
from utils import *
import widgetUtils
class TransferDialog(widgetUtils.BaseDialog):
class UploadDialog(widgetUtils.BaseDialog):
def __init__(self, filename, *args, **kwargs):
super(TransferDialog, self).__init__(parent=None, id=wx.NewId(), *args, **kwargs)
super(UploadDialog, self).__init__(parent=None, id=wx.NewId(), *args, **kwargs)
self.pane = wx.Panel(self)
self.progress_bar = wx.Gauge(parent=self.pane)
fileBox = wx.BoxSizer(wx.HORIZONTAL)
@@ -56,18 +56,6 @@ class TransferDialog(widgetUtils.BaseDialog):
def create_buttons(self):
self.cancel_button = wx.Button(parent=self.pane, id=wx.ID_CANCEL)
def get_response(self):
self.Show()
def destroy(self):
self.Destroy()
class UploadDialog(TransferDialog):
def __init__(self, filename=None, *args, **kwargs):
super(UploadDialog, self).__init__(filename=filename, *args, **kwargs)
class DownloadDialog(TransferDialog):
def __init__(self, *args, **kwargs):
super(Download, self).__init__(*args, **kwargs)
def get_response(self, fn):
wx.CallAfter(fn, 0.01)
self.ShowModal()

View File

@@ -1,153 +1,10 @@
# encoding: utf-8
#
# Copyright (C) 2013 Mesar Hameed <mhameed@src.gnome.org>
# This file is covered by the GNU General Public License.
# -*- coding: utf-8 -*-
from microsofttranslator import Translator
import os
import re
import sys
import threading
from time import sleep
from random import randint
import logging
log = logging.getLogger("translator")
import urllib2
def translate(text="", source="auto", target="en"):
t = Translator("twblue", "4KZA26GYIfmVAqQA/z16Hlucbg64hVSDTIpRjT2FqIU=")
return t.translate(text, target)
# Each group has to be a class of possible breaking points for the writing script.
# Usually this is the major syntax marks, such as:
# full stop, comma, exclaim, question, etc.
arabicBreaks = u'[،؛؟]'
# Thanks to Talori in the NVDA irc room:
# U+3000 to U+303F, U+FE10 to U+FE1F, U+FE30 to U+FE6F, U+FF01 to U+FF60
chineseBreaks = u'[ -〿︐-︟︰-﹯!-⦆]'
latinBreaks = r'[.,!?;:\n]'
splitReg = re.compile(u"{arabic}|{chinese}|{latin}".format(arabic=arabicBreaks, chinese=chineseBreaks, latin=latinBreaks))
def translate(text, source="auto", target="en"):
if source == "": source = "auto"
t = Translator(lang_from=source, lang_to=target, text=text)
t.start()
while t.isAlive():
sleep(0.1)
t.join()
return t.translation
def splitChunks(text, chunksize):
pos = 0
potentialPos = 0
for splitMark in splitReg.finditer(text):
if (splitMark.start() - pos +1) < chunksize:
potentialPos = splitMark.start()
continue
else:
yield text[pos:potentialPos+1]
pos = potentialPos + 1
potentialPos = splitMark.start()
yield text[pos:]
class Translator(threading.Thread):
def __init__(self, lang_from, lang_to, text, lang_swap=None, chunksize=350, *args, **kwargs):
super(Translator, self).__init__(*args, **kwargs)
self._stop = threading.Event()
self.text = text
self.chunksize = chunksize
self.lang_to = lang_to
self.lang_from = lang_from
self.lang_swap = lang_swap
self.translation = ''
self.lang_translated = ''
self.firstChunk = True
def stop(self):
self._stop.set()
def run(self):
for chunk in splitChunks(self.text, self.chunksize):
# Make sure we don't send requests to google too often.
# Try to simulate a human.
if not self.firstChunk:
sleep(randint(1, 10))
req = self.buildRequest(chunk, self.lang_from, self.lang_to)
try:
response = urllib2.urlopen(req)
translation, lang_translated = self.parseData(response)
if self.firstChunk and self.lang_from == "auto" and lang_translated == self.lang_to and self.lang_swap is not None:
self.lang_to = self.lang_swap
self.firstChunk = False
req = self.buildRequest(chunk.encode('utf-8'), self.lang_from, self.lang_to)
response = urllib2.urlopen(req)
translation, lang_translated = self.parseData(response)
except Exception as e:
log.exception("Can not translate text '%s'" %chunk)
# We have probably been blocked, so stop trying to translate.
raise e
self.translation += translation
# some adjustment, better to do on full text
self.translation = self.fixNewlines(self.translation)
self.lang_translated = lang_translated
def buildRequest(self, text, lang_from, lang_to):
"""Build POST request which will be sent to Google."""
urlTemplate = 'http://translate.google.com/translate_a/single?client=t&sl={lang_from}&tl={lang_to}&ie=utf-8&oe=utf-8&dt=t&dt=bd&tk='
url = urlTemplate.format(lang_from=lang_from, lang_to=lang_to)
header = {'User-agent': 'Mozilla/5.0', 'Content-Type': 'application/x-www-form-urlencoded'}
data = 'text=%s' %urllib2.quote(text)
req = urllib2.Request(url, data, header)
return req
def parseData(self, response):
"""Parse unstructured response."""
data = response.readlines()[0]
# get segments with couples ["translation","original text"]
l1, l2 = data.split(']],', 1)
translation = l1[3:]
if l2.startswith('[[\"'):
# get list of synonyms
syn = l2[l2.find(',[')+1:l2.find(']')].split(',')
temp = ', '.join([x.replace('\"', '') for x in syn])
else:
# get a list with each couple as item
sentences = translation.split('],[')
temp = ''
# get translation, removing first char (quote symbol)
for item in sentences:
item = item.split('\",\"', 1)[0][1:]
# join all translations
temp = ' '.join([temp, item])
translation = temp.decode('string-escape').decode('utf-8')
translation = self.fixPunctuation(translation)
# get the language of original text
tempLang = data.partition(']],,\"')[2]
lang = tempLang[:tempLang.find('\"')]
if lang == '':
lang = _("unavailable")
return translation, lang
def fixPunctuation(self, translation):
"""Clean text from space before punctuation symbol."""
# list of potentially positions of spaces to remove
spacePos = []
for puncMark in splitReg.finditer(translation):
spacePos.append(puncMark.start()-1)
if len(spacePos) == 0:
return translation
fixedTranslation = ''
for n in xrange(0,len(translation)):
temp = translation[n]
if n in spacePos and temp == ' ':
continue
else:
fixedTranslation += temp
return fixedTranslation
def fixNewlines(self, translation):
"""Adjust newlines and (subsequent or double) spaces."""
fixes = [('\r\n ', '\r\n'), ('\n ', '\r\n'), (' ', ' ')]
for fix in fixes:
translation = translation.replace(fix[0], fix[1])
# first char is a space, so...
return translation[1:]
languages = {
"af": _(u"Afrikaans"),
@@ -244,8 +101,8 @@ languages = {
}
def available_languages():
l = languages.keys()
d = languages.values()
l.insert(0, '')
d.insert(0, _(u"autodetect"))
return sorted(zip(l, d))
l = languages.keys()
d = languages.values()
l.insert(0, '')
d.insert(0, _(u"autodetect"))
return sorted(zip(l, d))

View File

@@ -4,9 +4,10 @@ import sys
import fix_arrow # A few new locales for Three languages in arrow.
import fix_urllib3_warnings # Avoiding some SSL warnings related to Twython.
import fix_win32com
import fix_requests #fix cacert.pem location for TWBlue binary copies
def setup():
fix_arrow.fix()
if hasattr(sys, "frozen"):
fix_win32com.fix()
fix_requests.fix()
fix_urllib3_warnings.fix()

10
src/fixes/fix_requests.py Normal file
View File

@@ -0,0 +1,10 @@
from requests import certs, utils, adapters
import paths
def patched_where():
return paths.app_path(u"cacert.pem")
def fix():
certs.where=patched_where
utils.DEFAULT_CA_BUNDLE_PATH=patched_where()
adapters.DEFAULT_CA_BUNDLE_PATH=patched_where()

View File

@@ -1,5 +1,24 @@
# -*- coding: utf-8 -*-
from requests.packages import urllib3
from requests.packages.urllib3 import fields
import six
import urllib
def fix():
urllib3.disable_warnings()
urllib3.disable_warnings()
fields.format_header_param=patched_format_header_param
def patched_format_header_param(name, value):
if not any(ch in value for ch in '"\\\r\n'):
result = '%s="%s"' % (name, value)
try:
result.encode('ascii')
except (UnicodeEncodeError, UnicodeDecodeError):
pass
else:
return result
if not six.PY3 and isinstance(value, six.text_type): # Python 2:
value = value.encode('utf-8')
value=urllib.quote(value, safe='')
value = '%s=%s' % (name, value)
return value

View File

@@ -47,7 +47,7 @@ class reportBug(object):
issue.project.name = application.name
issue.project.id = 0
issue.summary = self.dialog.get("summary"),
issue.description = "Reported by @%s\n\n" % (self.user_name) + self.dialog.get("description")
issue.description = "Reported by @%s on version %s (snapshot = %s)\n\n" % (self.user_name, application.version, application.snapshot) + self.dialog.get("description")
# to do: Create getters for category, severity and reproducibility in wx_UI.
issue.category = constants.categories[self.dialog.category.GetSelection()]
issue.reproducibility.name = constants.reproducibilities[self.dialog.reproducibility.GetSelection()]

View File

@@ -17,7 +17,7 @@ send_dm = string(default="control+win+d")
user_details = string(default="control+win+shift+u")
exit = string(default="control+win+q")
open_timeline = string(default="control+win+u")
remove_buffer = string(default="control+win+backspace")
remove_buffer = string(default="control+win+back")
audio = string(default="control+win+return")
url = string(default="control+win+b")
go_home = string(default="control+win+home")
@@ -28,7 +28,8 @@ repeat_item = string(default="control+win+space")
copy_to_clipboard = string(default="control+win+shift+c")
search = string(default="control+win+/")
find = string(default="control+win+shift+/")
check_for_updates = string(default="alt+win+u)
check_for_updates = string(default="alt+win+u")
list_manager = string(default="control+win+shift+l")
configuration = string(default="control+win+o")
accountConfiguration = string(default="control+win+shift+o")
accountConfiguration = string(default="control+win+shift+o")
update_buffer = string(default="control+win+shift+u")

View File

@@ -50,4 +50,5 @@ get_trending_topics = string(default="control+win+shift+t")
check_for_updates = string(default="control+win+u")
list_manager = string(default="control+win+shift+l")
configuration = string(default="control+win+o")
accountConfiguration = string(default="control+win+shift+o")
accountConfiguration = string(default="control+win+shift+o")
update_buffer = string(default="control+win+shift+u")

View File

@@ -30,8 +30,8 @@ volume_up = string(default="alt+win+shift+up")
go_home = string(default="alt+win+home")
volume_down = string(default="alt+win+shift+down")
go_end = string(default="alt+win+end")
go_page_up = string(default="alt+win+pageup")
go_page_down = string(default="alt+win+pagedown")
go_page_up = string(default="control+win+pageup")
go_page_down = string(default="control+win+pagedown")
update_profile = string(default="alt+win+p")
delete = string(default="alt+win+delete")
clear_buffer = string(default="alt+win+shift+delete")
@@ -52,4 +52,5 @@ get_trending_topics = string(default="alt+win+t")
check_for_updates = string(default="alt+win+u")
list_manager = string(default="alt+win+shift+l")
configuration = string(default="control+win+o")
accountConfiguration = string(default="control+win+shift+o")
accountConfiguration = string(default="control+win+shift+o")
update_buffer = string(default="control+alt+shift+u")

View File

@@ -53,4 +53,5 @@ get_trending_topics = string(default="control+win+t")
check_for_updates = string(default="control+win+u")
list_manager = string(default="control+win+shift+l")
configuration = string(default="control+win+o")
accountConfiguration = string(default="control+win+shift+o")
accountConfiguration = string(default="control+win+shift+o")
update_buffer = string(default="control+win+shift+u")

View File

@@ -53,4 +53,5 @@ find = string(default="control+win+{")
check_for_updates = string(default="control+win+u")
list_manager = string(default="control+win+shift+l")
configuration = string(default="control+win+o")
accountConfiguration = string(default="control+win+shift+o")
accountConfiguration = string(default="control+win+shift+o")
update_buffer = string(default="control+win+shift+u")

View File

@@ -5,16 +5,16 @@ import exceptions
from ctypes import c_char_p
from libloader import load_library
import paths
if application.snapshot == True:
if platform.architecture()[0][:2] == "32":
lib = load_library("snapshot_api_keys32", x86_path=paths.app_path("keys/lib"))
else:
lib = load_library("snapshot_api_keys64", x64_path=paths.app_path("keys/lib"))
#if application.snapshot == True:
# if platform.architecture()[0][:2] == "32":
# lib = load_library("snapshot_api_keys32", x86_path=paths.app_path("keys/lib"))
# else:
# lib = load_library("snapshot_api_keys64", x64_path=paths.app_path("keys/lib"))
#else:
if platform.architecture()[0][:2] == "32":
lib = load_library("stable_api_keys32", x86_path=paths.app_path("keys/lib"))
else:
if platform.architecture()[0][:2] == "32":
lib = load_library("stable_api_keys32", x86_path=paths.app_path("keys/lib"))
else:
lib = load_library("stable_api_keys64", x64_path=paths.app_path("keys/lib"))
lib = load_library("stable_api_keys64", x64_path=paths.app_path("keys/lib"))
# import linuxKeys
# lib = linuxKeys

View File

@@ -50,4 +50,6 @@ actions = {
"lists_manager": _(u"Opens the list manager, which allows you to create, edit, delete and open lists in buffers."),
"configuration": _(u"Opens the global settings dialogue"),
"accountConfiguration": _(u"Opens the account settings dialogue"),
"audio": _(u"Try to play an audio file"),
"update_buffer": _(u"Updates the buffer and retrieves possible lost items there."),
}

View File

@@ -37,13 +37,10 @@ class KeystrokeEditor(object):
def get_edited_keystroke(self, dialog):
keys = []
if dialog.get("win") == False:
wx_ui.no_win_message()
return
if dialog.get("control") == True:
keys.append("control")
# if dialog.get("win") == True:
keys.append("win")
if dialog.get("win") == True:
keys.append("win")
if dialog.get("alt") == True:
keys.append("alt")
if dialog.get("shift") == True:

View File

@@ -1,7 +1,7 @@
from pywintypes import com_error
import win32com
import paths
win32com.__gen_path__=paths.data_path(u"com_cache")
win32com.__gen_path__=paths.com_path()
import sys
import os
sys.path.append(os.path.join(win32com.__gen_path__, "."))

View File

@@ -32,7 +32,7 @@ def load_library(library, x86_path='.', x64_path='.', *args, **kwargs):
loaded = _do_load(lib, *args, **kwargs)
if loaded is not None:
return loaded
raise LibraryLoadError('unable to load %r. Provided library path: %r' % (library, path))
raise LibraryLoadError('unable to load %r. Provided library path: %r' % (library, lib))
def _do_load(file, *args, **kwargs):
loader = TYPES[platform.system()]['loader']

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

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

View File

@@ -18,15 +18,10 @@
############################################################
from twitter import utils
def get_id(url):
return url.split("/")[-1]
def is_long(tweet):
long = False
for url in range(0, len(tweet["entities"]["urls"])):
if "twitter.com" in tweet["entities"]["urls"][url]["expanded_url"]:
long = get_id(tweet["entities"]["urls"][url]["expanded_url"])
return long
if tweet.has_key("is_quote_status") and tweet["is_quote_status"] == True and tweet.has_key("quoted_status"):
return tweet["quoted_status_id"]
return False
def clear_url(tweet):
urls = utils.find_urls_in_text(tweet["text"])

View File

@@ -51,5 +51,4 @@ def create_tweet(user_token, user_secret, text, media=0):
"text": text.encode("utf-8"),
"media": media}
response = requests.post(url, data=data)
# print response.json()
return response.json()["text_to_tweet"]

View File

@@ -14,6 +14,9 @@ if system == "Windows":
sys.stderr = open(os.path.join(os.getenv("temp"), "stderr.log"), "w")
import languageHandler
import paths
#check if TWBlue is installed (Windows only)
if os.path.exists(paths.app_path(u"Uninstall.exe")):
paths.mode="installed"
import commandline
import config
import sound
@@ -67,7 +70,8 @@ def setup():
if system == "Windows":
if config.app["app-settings"]["donation_dialog_displayed"] == False:
donation()
updater.do_update()
if config.app['app-settings']['check_for_updates']:
updater.do_update()
sm = sessionManager.sessionManagerController()
sm.fill_list()
if len(sm.sessions) == 0: sm.show()

View File

@@ -7,7 +7,7 @@ from platform_utils import paths as paths_
from functools import wraps
mode = None
mode = "portable"
directory = None
log = logging.getLogger("paths")
@@ -55,7 +55,8 @@ def data_path(app_name='TW blue'):
# data_path = os.path.join(shlobj.SHGetFolderPath(0, shlobj.CSIDL_APPDATA), app_name)
# else:
if platform.system() == "Windows":
data_path = os.path.join(os.getenv("AppData"), app_name)
import winpaths
data_path = os.path.join(winpaths.get_appdata(), app_name)
else:
data_path = os.path.join(os.environ['HOME'], ".%s" % app_name)
if not os.path.exists(data_path):
@@ -68,4 +69,17 @@ def locale_path():
@merge_paths
def sound_path():
return app_path(u"sounds")
return app_path(u"sounds")
@merge_paths
def com_path():
global mode, directory
if mode == "portable":
if directory != None: path = os.path.join(directory, "com_cache")
elif directory == None: path = app_path(u"com_cache")
elif mode == "installed":
path = data_path(u"com_cache")
if not os.path.exists(path):
log.debug("%s path does not exist, creating..." % (path,))
os.mkdir(path)
return path

Some files were not shown because too many files have changed in this diff Show More