mirror of
https://github.com/MCV-Software/TWBlue.git
synced 2025-08-26 18:09:21 +00:00
Compare commits
364 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
52f27c87b9 | ||
3f5ef28a48 | |||
4ec1e08606 | |||
f2cea695ee | |||
e4a6ead606 | |||
dc536c45de | |||
95fcbe6ba4 | |||
60f55940b7 | |||
655331d405 | |||
4381992718 | |||
eb87d924c2 | |||
1cebb29bdc | |||
27c1ec990a | |||
d40b816c48 | |||
ac5daec462 | |||
0835a34c71 | |||
babbc0a08d | |||
04ac629b51 | |||
![]() |
3920435eb7 | ||
2f0b20558e | |||
9ca6e15a20 | |||
9c2dba7cf8 | |||
318b6caf5f | |||
![]() |
83612b6a3c | ||
![]() |
f4e20f8ed4 | ||
![]() |
7883413210 | ||
![]() |
ad54134c86 | ||
![]() |
ef0d3a9eae | ||
ea48733cef | |||
6893d923a3 | |||
d94b133e63 | |||
28b6d554e2 | |||
931cadfffa | |||
232d876c8f | |||
c7f4fd2926 | |||
6b43ff1c0e | |||
5b5d762759 | |||
b4020d0f95 | |||
d8da78e22d | |||
c82bb4125b | |||
7b5e6477d3 | |||
41582a3770 | |||
e9cbe0d825 | |||
dc563523bc | |||
b15eed9697 | |||
019e83c55b | |||
7dad22189a | |||
eebaf94cbf | |||
1726d5882c | |||
64d843d98a | |||
610f18dcb6 | |||
cea638b680 | |||
e1e0a4e092 | |||
bc4a8bcba1 | |||
3db13062ed | |||
9559f07013 | |||
dee30385cc | |||
49ce469c12 | |||
59e1299a0b | |||
ab2667529f | |||
![]() |
a7fd88b4be | ||
a2cb4ba889 | |||
9847f7ad01 | |||
c2d81279fe | |||
77489cab1e | |||
7d35dbc752 | |||
f2ea4136c0 | |||
537d011b40 | |||
8af1e650b7 | |||
e3cbd8be87 | |||
7099875bc7 | |||
4a15fe1602 | |||
7478edd454 | |||
da4658c220 | |||
6768bf85d5 | |||
199a06c6e5 | |||
b967c32393 | |||
e9797ce6ac | |||
861de1f354 | |||
6f838d12e9 | |||
010c0011aa | |||
b1c5ddbca8 | |||
a16f16d36d | |||
e5196f0aad | |||
b8df56dcbb | |||
612f4ffadf | |||
652d3c7ff8 | |||
b6d49bb851 | |||
cb6f90a027 | |||
fff215fcdb | |||
8e9743cae1 | |||
0e41fabbe6 | |||
5ff5a4a6d2 | |||
d4dadfcdc7 | |||
fac228dec1 | |||
79490f8346 | |||
635b467394 | |||
e886090830 | |||
80cb5567d5 | |||
3c0824aad4 | |||
0bbbb3f1b6 | |||
![]() |
51c5820719 | ||
![]() |
d6f47259a6 | ||
2457fcf8f3 | |||
87a6290f74 | |||
7109d904a2 | |||
435ffef6fd | |||
![]() |
2fb88924fd | ||
![]() |
6ba1fe9eac | ||
b184bed1a8 | |||
53deb869fc | |||
f9db4d6d51 | |||
7861f42d26 | |||
e8a692a061 | |||
c5a5b187ec | |||
ab18445338 | |||
4d6b589086 | |||
5a03cc80ca | |||
fd17d824be | |||
a0fe62a227 | |||
00db4ff806 | |||
45430e036c | |||
29c3f1d194 | |||
e10e3b3c49 | |||
d9a9adef1f | |||
02538322c6 | |||
efc5b481f8 | |||
2c1bd6a8c8 | |||
4d1732b3aa | |||
a0e41a4450 | |||
2ee3e315b6 | |||
29df2e44b4 | |||
8836cb2bda | |||
2d9124c336 | |||
b832e36c7d | |||
98cf02ee98 | |||
519d096f29 | |||
34e9b8b89f | |||
beb75ff6d1 | |||
9fd7c14e32 | |||
e303d914fe | |||
5f7f176892 | |||
8928a64a12 | |||
6a3b498d52 | |||
682ee82aa8 | |||
1e22ebce61 | |||
c2413489e5 | |||
094325cbf0 | |||
a5e1686af6 | |||
54cb099007 | |||
636c21df94 | |||
cdad6ff600 | |||
68efc86536 | |||
e06ccacda1 | |||
da6eb34500 | |||
0f31a776ff | |||
efc6843ee2 | |||
a13dd756b1 | |||
1b62eece13 | |||
e23ef1ded2 | |||
066de25f95 | |||
cd128b8e69 | |||
![]() |
9e17abf517 | ||
cbd3126a4f | |||
0d0aed0490 | |||
ed7c9802d1 | |||
68ea029fe3 | |||
3a465f2314 | |||
ef2d672b35 | |||
![]() |
b3c8de9a1f | ||
![]() |
4d75f2db34 | ||
![]() |
f69e4283cd | ||
![]() |
cbbf1e475d | ||
![]() |
851f711357 | ||
![]() |
11703f50fe | ||
![]() |
11ca3a2190 | ||
![]() |
a1381008d7 | ||
59504cca57 | |||
da06c568c5 | |||
d333b5f5c3 | |||
348b8da619 | |||
904226cfd4 | |||
2cf5caa90d | |||
![]() |
ff05c9cb23 | ||
![]() |
f18a03d4a1 | ||
![]() |
24756e73d3 | ||
![]() |
feb16d9773 | ||
5b47e8806a | |||
a073a5caaa | |||
a69a26e107 | |||
76582c6313 | |||
5a249ba942 | |||
![]() |
696b6aa11d | ||
![]() |
44187c69de | ||
![]() |
efb8cac079 | ||
![]() |
7997f23f9c | ||
20d4023e58 | |||
![]() |
b62f99bc5a | ||
![]() |
70bba44da7 | ||
![]() |
d25ace8f98 | ||
![]() |
eb19417263 | ||
![]() |
982fd41ae3 | ||
cf19e644e4 | |||
02c5b40315 | |||
825a896414 | |||
![]() |
dabb3a01b8 | ||
![]() |
5d68d1f1cb | ||
![]() |
85613da33a | ||
268a123449 | |||
4c22c29241 | |||
![]() |
7a7634833a | ||
![]() |
d70b5703d2 | ||
![]() |
21d6471bb2 | ||
![]() |
a492baf486 | ||
![]() |
0163314e36 | ||
![]() |
1d7d376ca1 | ||
868002c78b | |||
c3b19f42d5 | |||
ee234995f5 | |||
![]() |
0472592991 | ||
![]() |
5b8c28dd73 | ||
![]() |
a8f854cbc5 | ||
80f2e8f984 | |||
d4b410cafd | |||
![]() |
af04bcfe3f | ||
![]() |
7349e3b3f3 | ||
bf4c09d0bb | |||
adc45ae767 | |||
2618e0ac90 | |||
3feeb568d8 | |||
fb977a70c2 | |||
c4a06a7bc0 | |||
df5967079c | |||
0a3219d12a | |||
77baa06fc3 | |||
160d168c63 | |||
713ac0251b | |||
c655c76196 | |||
3cf6ac5c06 | |||
43bdb358dd | |||
6f622bdeba | |||
7e6103473f | |||
![]() |
caa051abae | ||
fbe6eb6250 | |||
b9d8e13bdf | |||
16a6fa2896 | |||
![]() |
089eea4c07 | ||
![]() |
37e3af1c59 | ||
562759f57e | |||
a9dc188c4b | |||
cced182063 | |||
66774174ae | |||
d9e972115b | |||
2d7c8e59dd | |||
![]() |
802c879795 | ||
![]() |
34f92b8af9 | ||
![]() |
a72e8dd6a4 | ||
4793aaf5e6 | |||
c136c50afc | |||
![]() |
3a4b34972d | ||
![]() |
607da14355 | ||
![]() |
17ccc30d9b | ||
3855407f52 | |||
03415f6b24 | |||
![]() |
1061967adc | ||
b165d564e0 | |||
20c2f844f5 | |||
ad9f2452b2 | |||
a86a6f52d6 | |||
4d82ecc8f2 | |||
023e0979c6 | |||
ca6e78cd4d | |||
8f4b1f9695 | |||
20aaa39bc9 | |||
![]() |
8197f0c0d9 | ||
![]() |
aa1a3542e5 | ||
05c0fefc01 | |||
1fd90be4cb | |||
05a4e9b6e4 | |||
![]() |
9d07fe38b8 | ||
fedf153252 | |||
80f9125511 | |||
25c88cea3b | |||
c9161cd772 | |||
f7c334ad96 | |||
59f6cf13ad | |||
3684ec2783 | |||
6baf417d35 | |||
db52e8d851 | |||
0bf630d8c0 | |||
![]() |
4bd9a2b899 | ||
7daacfa809 | |||
![]() |
b586b0729c | ||
d384ad9dd3 | |||
e7aac6c805 | |||
e34c84697e | |||
a639604179 | |||
7b5022da09 | |||
![]() |
620ee23edb | ||
![]() |
f19d7b0535 | ||
![]() |
a5acc3ef56 | ||
![]() |
40fc175185 | ||
![]() |
67dee3e1c1 | ||
![]() |
dab8be7c12 | ||
![]() |
b7dd6d43fe | ||
![]() |
8a701c450e | ||
![]() |
2370c39c15 | ||
![]() |
0851dc23d8 | ||
![]() |
232d39e0b3 | ||
2c27a1968f | |||
4d5de6ca69 | |||
![]() |
fb349fc7b4 | ||
![]() |
1a4d0d5b9a | ||
![]() |
5eff1b77fe | ||
6bb534d250 | |||
2d8c706cde | |||
4e702c5428 | |||
![]() |
6717cb5154 | ||
590f59ca63 | |||
6bad20b784 | |||
146667144a | |||
cc60235503 | |||
31a149b022 | |||
ec58d02bb3 | |||
516acb501a | |||
88a706dd7d | |||
6d887d5762 | |||
cd7fb6d36f | |||
![]() |
020148ac0a | ||
9d0558468a | |||
7d188a40b2 | |||
0c3d956d96 | |||
44ca5a7f83 | |||
![]() |
cdedd41101 | ||
![]() |
87c113986d | ||
![]() |
b0a6634e20 | ||
53388696b6 | |||
fe7a69f490 | |||
1351712db4 | |||
ca0f00e27d | |||
![]() |
6290815a0c | ||
4a1162005d | |||
72b4873dce | |||
a1ccdd6bf4 | |||
2cad567537 | |||
![]() |
bb0af61483 | ||
7a2e51ef03 | |||
b3451e229d | |||
32dd232350 | |||
![]() |
656b031c5c | ||
![]() |
0f2bd2a9e1 | ||
![]() |
12f47b85af | ||
30c0a8249e | |||
62e51ad14b | |||
d076ed1f56 | |||
9bbe325517 | |||
6f5ef6d3f1 | |||
378d277a98 | |||
![]() |
2fdbcbc152 | ||
![]() |
ef7ba0fe40 | ||
![]() |
2497d01bd6 | ||
![]() |
a57c44d566 | ||
![]() |
6a056749af | ||
![]() |
99bdaca6f0 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -18,4 +18,5 @@ src/launcher.bat
|
|||||||
src/sounds/iOs
|
src/sounds/iOs
|
||||||
release-snapshot/
|
release-snapshot/
|
||||||
src/com_cache/
|
src/com_cache/
|
||||||
doc/strings.py
|
doc/strings.py
|
||||||
|
doc/changelog.py
|
2
COPYING
2
COPYING
@@ -1,5 +1,5 @@
|
|||||||
Tw Blue is free software, licensed under the GNU GPL license, either version 2 or, at your option, any later version. You can view the license in the file named license.txt, or online at http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
|
Tw Blue is free software, licensed under the GNU GPL license, either version 2 or, at your option, any later version. You can view the license in the file named license.txt, or online at http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
|
||||||
Copyright © 2013-2015. Manuel Cortéz
|
Copyright © 2013-2018. Manuel Cortéz
|
||||||
|
|
||||||
Documentation is written by Sukil Etxenike, Brian Hartgen and Bill Dengler, covered by the Creative Commons Attribution-NonCommercial-ShareAlike 2.5 license. You can read the license at https://creativecommons.org/licenses/by-nc-sa/2.5/
|
Documentation is written by Sukil Etxenike, Brian Hartgen and Bill Dengler, covered by the Creative Commons Attribution-NonCommercial-ShareAlike 2.5 license. You can read the license at https://creativecommons.org/licenses/by-nc-sa/2.5/
|
||||||
|
|
||||||
|
69
README.md
69
README.md
@@ -1,9 +1,7 @@
|
|||||||
TWBlue -
|
TWBlue -
|
||||||
======
|
======
|
||||||
|
|
||||||
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.
|
||||||
|
|
||||||
TW Blue is an app designed to use Twitter simply and efficiently while using minimal system resources.
|
|
||||||
With this app you’ll have access to twitter features such as:
|
With this app you’ll have access to twitter features such as:
|
||||||
|
|
||||||
* Create, reply to, like, retweet and delete tweets,
|
* Create, reply to, like, retweet and delete tweets,
|
||||||
@@ -31,49 +29,39 @@ Although most dependencies can be found in the windows-dependencies directory, w
|
|||||||
|
|
||||||
#### Dependencies packaged in windows installers
|
#### Dependencies packaged in windows installers
|
||||||
|
|
||||||
* [Python,](http://python.org) version 2.7.11
|
* [Python,](http://python.org) version 2.7.15
|
||||||
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.
|
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 223
|
||||||
* [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.
|
* [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
|
x64 version has been built by TWBlue developers, so you only will find it in windows-dependencies folder
|
||||||
|
|
||||||
The windows installers are available only in the windows-dependencies folder
|
The windows installers are available only in the windows-dependencies folder.
|
||||||
|
|
||||||
To build a binary version:
|
To build a binary version:
|
||||||
|
|
||||||
* [Py2exe](http://www.sourceforge.net/projects/py2exe/) for Python 2.7, version 0.6.9
|
* [Py2exe](http://www.sourceforge.net/projects/py2exe/) for Python 2.7, version 0.6.9
|
||||||
|
|
||||||
#### Dependencies that must be installed using easy_install
|
#### Dependencies that must be installed using pip
|
||||||
|
|
||||||
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:
|
Python installs a tool called Pip that allows to install packages in a simple way. You can find it in the python scripts directory. To install packages using Pip, you have to navigate to the scripts directory using a command prompt, for example:
|
||||||
|
|
||||||
cd C:\python27x64\scripts
|
cd C:\python27x64\scripts
|
||||||
|
|
||||||
You can also add the scripts folder to your path environment variable.
|
You can also add the scripts folder to your path environment variable or choose the corresponding option when installing Python.
|
||||||
Note: pip and setuptools are included in the Python installer since version 2.7.9.
|
Note: pip and setuptools are included in the Python installer since version 2.7.9.
|
||||||
|
|
||||||
After that, run the following command to install a package, replacing packagename with the names listed below:
|
Pip is able to install packages listed in a special text file, called the requirements file. To install all remaining dependencies, perform the following command:
|
||||||
|
|
||||||
easy_install -Z package
|
pip install -r requirements.txt
|
||||||
|
|
||||||
The -z switch unzips the package, instead of installing it compressed. If you add the --upgrade switch, you can upgrade a package to its latest version. The following packages need to be installed:
|
Note that if you perform the command from the path where Pip is located, you need to specify the path to your Tw Blue root folder where the requirements file is located, for example:
|
||||||
|
|
||||||
* pypubsub
|
pip install -r D:\repos\TwBlue\requirements.txt
|
||||||
* configobj
|
|
||||||
* requests-oauthlib
|
|
||||||
* requests-toolbelt
|
|
||||||
* future
|
|
||||||
* pygeocoder
|
|
||||||
* suds
|
|
||||||
* arrow==0.6
|
|
||||||
* markdown
|
|
||||||
* winpaths
|
|
||||||
* microsofttranslator
|
|
||||||
|
|
||||||
easy_install will automatically get the additional libraries that these packages need to work properly.
|
Pip will automatically get the additional libraries that the listed packages need to work properly.
|
||||||
Run the following command to quickly install and upgrade all packages and their dependencies:
|
If you need to update your dependencies, perform the following command:
|
||||||
easy_install -Z --upgrade six configobj goslate markdown future suds requests oauthlib requests-oauthlib requests-toolbelt pypubsub pygeocoder arrow==0.6 python-dateutil futures microsofttranslator winpaths
|
|
||||||
|
pip install --upgrade -r requirements.txt
|
||||||
|
|
||||||
#### Other dependencies
|
#### Other dependencies
|
||||||
|
|
||||||
@@ -83,34 +71,41 @@ These dependencies are located in the windows-dependencies directory. You don't
|
|||||||
This dependency has been built using pure basic 4.61. Its source can be found at http://hg.q-continuum.net/updater
|
This dependency has been built using pure basic 4.61. Its source can be found at http://hg.q-continuum.net/updater
|
||||||
* [oggenc2.exe,](http://www.rarewares.org/ogg-oggenc.php) version 2.87
|
* [oggenc2.exe,](http://www.rarewares.org/ogg-oggenc.php) version 2.87
|
||||||
* Microsoft Visual c++ 2008 redistributable dlls.
|
* Microsoft Visual c++ 2008 redistributable dlls.
|
||||||
|
* VLC plugins and DLL libraries.
|
||||||
|
|
||||||
#### Dependencies required to build the installer
|
#### Dependencies required to build the installer
|
||||||
|
|
||||||
* [NSIS unicode,](http://www.scratchpaper.com/) version 2.46.5
|
* [NSIS,](http://nsis.sourceforge.net/) version 3.03
|
||||||
|
|
||||||
#### Dependencies required to build the portableApps.com format archive
|
#### 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
|
* [NSIS Portable,](http://portableapps.com/apps/development/nsis_portable) version 3.03
|
||||||
* [PortableApps.com Launcher,](http://portableapps.com/apps/development/portableapps.com_launcher) version 2.2
|
* [PortableApps.com Launcher,](http://portableapps.com/apps/development/portableapps.com_launcher) version 2.2.1
|
||||||
* [PortableApps.com Installer,](http://portableapps.com/apps/development/portableapps.com_installer) version 3.4.2
|
* [PortableApps.com Installer,](http://portableapps.com/apps/development/portableapps.com_installer) version 3.5.8
|
||||||
|
|
||||||
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, ...
|
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, ...
|
||||||
|
|
||||||
|
#### Dependencies to make the spell checker multilingual ####
|
||||||
|
|
||||||
|
In order to add the support for spell checking in more languages than english you need to add some additional dictionaries to pyenchant. These are located on the dictionaries folder under windows-dependencies. Simply copy them to the share/enchant/myspell folder located in your enchant installation. They will be automatically copied when building a binary version.
|
||||||
|
|
||||||
### Running TW Blue from source
|
### 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:
|
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:
|
||||||
|
|
||||||
python main.py
|
python main.py
|
||||||
|
|
||||||
If necessary, change the first part of the command to reflect the location of your python executable. You can run TW Blue using python x86 and x64
|
If necessary, change the first part of the command to reflect the location of your python executable. You can run TW Blue using python x86 and x64.
|
||||||
|
|
||||||
### Generating the documentation
|
### Generating the documentation
|
||||||
|
|
||||||
To generate the documentation in html format, navigate to the doc folder inside this repo. After that, run these commands:
|
To generate the documentation in html format, navigate to the doc folder inside this repo. After that, run these commands:
|
||||||
python document_importer.py
|
|
||||||
python generator.py
|
python document_importer.py
|
||||||
The documentation will be generated, placing each language in a separate folder in the doc directory. Move these folders (for example de, en, es, fr, it, ...) to src/documentation, creating the directory if necesary.
|
python generator.py
|
||||||
Also, copy the license.txt located in the root of the repo to the documentation folder.
|
|
||||||
|
The documentation will be generated, placing each language in a separate folder in the doc directory. Move these folders (for example `de`, `en`, `es`, `fr`, `it`, ...) to `src/documentation`, creating the directory if necessary.
|
||||||
|
Also, copy the `license.txt` file located in the root of the repo to the documentation folder.
|
||||||
|
|
||||||
### Building a binary version
|
### Building a binary version
|
||||||
|
|
||||||
|
@@ -1,12 +1,8 @@
|
|||||||
Manuel E. Cortéz
|
Manuel E. Cortéz
|
||||||
Bill Dengler
|
Bill Dengler
|
||||||
Johana Hidrobo
|
|
||||||
Marcelo Sosa
|
|
||||||
Isabel del Castillo
|
|
||||||
José Manuel Delicado
|
José Manuel Delicado
|
||||||
David Picón
|
David Picón
|
||||||
Vicente Llopis
|
Vicente Llopis
|
||||||
Javier Dorado
|
|
||||||
Guillem León
|
Guillem León
|
||||||
Marco Serrano
|
Marco Serrano
|
||||||
Bryner Villalobos
|
Bryner Villalobos
|
||||||
@@ -35,11 +31,11 @@ Anibal Hernández
|
|||||||
Sussan Leiva
|
Sussan Leiva
|
||||||
Brian Hartgen
|
Brian Hartgen
|
||||||
PEDRO REINA COLOBON
|
PEDRO REINA COLOBON
|
||||||
Moora-Moora Arrilla
|
|
||||||
Blake Oliver
|
Blake Oliver
|
||||||
Steffen Schultz
|
Steffen Schultz
|
||||||
Riku
|
Riku
|
||||||
Burak Yüksek
|
Burak Yüksek
|
||||||
florian Ionașcu
|
florian Ionașcu
|
||||||
Christian Leo Mameli
|
Christian Leo Mameli
|
||||||
Natalia Hedlund (Наталья Хедлунд)
|
Natalia Hedlund (Наталья Хедлунд)
|
||||||
|
Valeria (Валерия)
|
@@ -2,7 +2,7 @@
|
|||||||
name = 'TWBlue'
|
name = 'TWBlue'
|
||||||
snapshot = False
|
snapshot = False
|
||||||
if snapshot == False:
|
if snapshot == False:
|
||||||
version = "0.86"
|
version = "0.94"
|
||||||
update_url = 'http://twblue.es/updates/twblue_ngen.json'
|
update_url = 'http://twblue.es/updates/twblue_ngen.json'
|
||||||
mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/stable.json'
|
mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/stable.json'
|
||||||
else:
|
else:
|
||||||
@@ -11,7 +11,7 @@ else:
|
|||||||
mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/snapshots.json'
|
mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/snapshots.json'
|
||||||
author = u"Manuel Cortéz"
|
author = u"Manuel Cortéz"
|
||||||
authorEmail = "manuel@manuelcortez.net"
|
authorEmail = "manuel@manuelcortez.net"
|
||||||
copyright = u"Copyright (C) 2015, Technow S.L. \nCopyright (C) 2013-2015, Manuel cortéz."
|
copyright = u"Copyright (C) 2013-2016, Manuel cortéz."
|
||||||
description = unicode(name+" is an app designed to use Twitter simply and efficiently while using minimal system resources. This app provides access to most Twitter features.")
|
description = unicode(name+" is an app designed to use Twitter simply and efficiently while using minimal system resources. This app provides access to most Twitter features.")
|
||||||
translators = [u"Bryner Villalobos, Bill Dengler (English)", u"Mohammed Al Shara (Arabic)", u"Joan Rabat, Juan Carlos Rivilla (Catalan)", u"Manuel cortéz (Spanish)", u"Sukil Etxenike Arizaleta (Basque)", u"Jani Kinnunen (finnish)", u"Rémy Ruiz (French)", u"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)"]
|
translators = [u"Bryner Villalobos, Bill Dengler (English)", u"Mohammed Al Shara (Arabic)", u"Joan Rabat, Juan Carlos Rivilla (Catalan)", u"Manuel cortéz (Spanish)", u"Sukil Etxenike Arizaleta (Basque)", u"Jani Kinnunen (finnish)", u"Rémy Ruiz (French)", u"Juan Buño (Galician)", u"Steffen Schultz (German)", u"Robert Osztolykan (Hungarian)", u"Paweł Masarczyk (Polish)", u"Odenilton Júnior Santos (Portuguese)", u"Alexander Jaszyn (Russian)", u"Burak (Turkish)"]
|
||||||
url = u"http://twblue.es"
|
url = u"http://twblue.es"
|
||||||
|
174
doc/changelog.md
Normal file
174
doc/changelog.md
Normal file
@@ -0,0 +1,174 @@
|
|||||||
|
TWBlue Changelog
|
||||||
|
|
||||||
|
## changes in this version
|
||||||
|
|
||||||
|
* Added an option in the global settings dialog to disable the Streaming features of TWBlue. TWBlue will remove all Streaming features after August 16, so this option will give people an idea about how it will be. ([#219](https://github.com/manuelcortez/TWBlue/issues/219))
|
||||||
|
* Due to Twitter API changes, Switched authorisation method to Pin-code based authorisation. When you add new accounts to TWBlue, you will be required to paste a code displayed in the Twitter website in order to grant access to TWBlue. ([#216](https://github.com/manuelcortez/TWBlue/issues/216))
|
||||||
|
* In order to comply with latest Twitter changes, TWBlue has switched to the new method used to send and receive direct messages, according to issue [#215.](https://github.com/manuelcortez/twblue/issues/215)
|
||||||
|
* The new method does not allow direct messages to be processed in real time. Direct messages will be updated periodically.
|
||||||
|
* After august 16 or when streaming is disabled, the events buffer will no longer be created in TWBlue.
|
||||||
|
* You can configure frequency for buffer updates in TWBlue. By default, TWBlue will update all buffers every 2 minutes, but you can change this setting in the global settings dialog. ([#223](https://github.com/manuelcortez/TWBlue/issues/223))
|
||||||
|
* Added a new tab called feedback, in the account settings dialog. This tab allows you to control wether automatic speech or Braille feedbak in certain events (mentions and direct messages received) is enabled. Take into account that this option will take preference over automatic reading of buffers and any kind of automatic output. ([#203](https://github.com/manuelcortez/TWBlue/issues/203))
|
||||||
|
* The spell checking dialog now has access keys defined for the most important actions. ([#211](https://github.com/manuelcortez/TWBlue/issues/211))
|
||||||
|
* TWBlue now Uses WXPython 4.0.1. This will allow us to migrate all important components to Python 3 in the future. ([#207](https://github.com/manuelcortez/TWBlue/issues/207))
|
||||||
|
* When you quote a Tweet, if the original tweet was posted with Twishort, TWBlue should display properly the quoted tweet. Before it was displaying the original tweet only. ([#206](https://github.com/manuelcortez/TWBlue/issues/206))
|
||||||
|
* It is possible to filter by retweets, quotes and replies when creating a new filter.
|
||||||
|
* Added support for playing youtube Links directly from the client. ([#94](https://github.com/manuelcortez/TWBlue/issues/94))
|
||||||
|
* Replaced Bass with libVLC for playing URL streams.
|
||||||
|
* the checkbox for indicating wether TWBlue will include everyone in a reply or not, will be unchecked by default.
|
||||||
|
* You can request TWBlue to save the state for two checkboxes: Long tweet and mention all, from the global settings dialogue.
|
||||||
|
* For windows 10 users, some keystrokes in the invisible user interface have been changed or merged:
|
||||||
|
* control+Windows+alt+F will be used for toggling between adding and removing a tweet to user's likes. This function will execute the needed action based in the current status for the focused tweet.
|
||||||
|
* TWBlue will show an error if something goes wrong in an audio upload.
|
||||||
|
* And more. ([#171,](https://github.com/manuelcortez/TWBlue/issues/171)
|
||||||
|
|
||||||
|
## Changes in version 0.93
|
||||||
|
|
||||||
|
* A new soundpack has been added to TWBlue. Thanks to [@ValeriaK305](https://twitter.com/ValeriaK305)
|
||||||
|
* In the Windows 10 keymap, we have changed some default keystrokes as windows now uses some previously assigned shortcuts:
|
||||||
|
* For liking a tweet, press Control+Windows+alt+f
|
||||||
|
* for opening a trends buffer, press control+Windows+T
|
||||||
|
* TWBlue has received improvements in some functions for handling extended tweets, long tweets and quoted retweets. It should render some tweets in a better way.
|
||||||
|
* In the spell checker module, there is a new button that will allow you to add your own words to your personal dictionary so the module won't mark them as mispelled the next time you will check spelling.
|
||||||
|
* Added filtering capabilities to TWBlue. ([#102](https://github.com/manuelcortez/TWBlue/issues/102))
|
||||||
|
* You can create a filter for the current buffer from the buffer menu in the menu bar. At this moment, invisible interface does not have any shorcut for this.
|
||||||
|
* You can create filters by word or languages.
|
||||||
|
* For deleting already created filters, you can go to the filter manager in the buffer menu and delete the filters you won't need.
|
||||||
|
* Links should be opened properly in quoted tweets ([#167,](https://github.com/manuelcortez/TWBlue/issues/167) [#184](https://github.com/manuelcortez/TWBlue/issues/184))
|
||||||
|
* Increased display name limit up to 50 characters in update profile dialog.
|
||||||
|
* When authorising an account, you will see a dialogue with a cancel button, in case you want to abort the process. Also, NVDA will not be blocked when the process starts. ([#101](https://github.com/manuelcortez/TWBlue/issues/101))
|
||||||
|
* In the translator module, the list of available languages is fetched automatically from the provider. That means all of these languages will work and there will not be inconsistencies. Also we've removed the first combo box, because the language is detected automatically by Yandex'S API. ([#153](https://github.com/manuelcortez/TWBlue/issues/153))
|
||||||
|
* Trending topics, searches and conversation buffers will use mute settings set for the session in wich they were opened. ([#157](https://github.com/manuelcortez/TWBlue/issues/157))
|
||||||
|
* The Tweet limit is now 280 characters lenght instead 140. It means you can tweet longer tweets. ([#172](https://github.com/manuelcortez/TWBlue/issues/172))
|
||||||
|
* Per popular request, Status for mention to all and long tweet checkboxes will not be saved in settings. ([#170](https://github.com/manuelcortez/TWBlue/issues/170))
|
||||||
|
* Fixed a problem that was making TWBlue unable to start if it was being ran in Windows with Serbian language. ([#175](https://github.com/manuelcortez/TWBlue/issues/175))
|
||||||
|
* Added Danish translation.
|
||||||
|
* And more. ([#156,](https://github.com/manuelcortez/TWBlue/issues/156) [#163,](https://github.com/manuelcortez/TWBlue/issues/163) [#159,](https://github.com/manuelcortez/TWBlue/issues/159) [#173,](https://github.com/manuelcortez/TWBlue/issues/173) [#174,](https://github.com/manuelcortez/TWBlue/issues/174) [#176,](https://github.com/manuelcortez/TWBlue/issues/176))
|
||||||
|
|
||||||
|
## changes in version 0.91 and 0.92
|
||||||
|
|
||||||
|
* Fixed incorrect unicode handling when copying tweet to clipboard. ([#150](https://github.com/manuelcortez/TWBlue/issues/150))
|
||||||
|
* TWBlue will show an error when trying to open a timeline for a suspended user. ([#128](https://github.com/manuelcortez/TWBlue/issues/128))
|
||||||
|
* Removed TwUp as service as it no longer exists. ([#112](https://github.com/manuelcortez/TWBlue/issues/112))
|
||||||
|
* Release audio files after uploading them. ([#130](https://github.com/manuelcortez/TWBlue/issues/130))
|
||||||
|
* Now TWBlue will use Yandex's translation services instead microsoft translator. ([#132](https://github.com/manuelcortez/TWBlue/issues/132))
|
||||||
|
* SndUp users will be able to upload audio in their account by using their API Key again. ([#134](https://github.com/manuelcortez/TWBlue/issues/134))
|
||||||
|
* old tweets shouldn't be added as new items in buffers. ([#116,](https://github.com/manuelcortez/TWBlue/issues/116)) ([#133](https://github.com/manuelcortez/TWBlue/issues/133))
|
||||||
|
* All mentionned users should be displayed correctly in Twishort's long tweets. ([#116,](https://github.com/manuelcortez/TWBlue/issues/116)) ([#135](https://github.com/manuelcortez/TWBlue/issues/135))
|
||||||
|
* It is possible to select a language for OCR service from the extras panel, in the account settings dialogue. You can, however, set this to detect automatically. OCR should work better in languages with special characters or non-english symbols. ([#107](https://github.com/manuelcortez/TWBlue/issues/107))
|
||||||
|
* Fixed a problem with JAWS for Windows and TWBlue. Now JAWS will work normally in this update. [#100](https://github.com/manuelcortez/twblue/issues/100)
|
||||||
|
* And more ([#136,](https://github.com/manuelcortez/TWBlue/issues/136))
|
||||||
|
|
||||||
|
## Changes in version 0.90
|
||||||
|
|
||||||
|
* Fixed a bug in long tweet parsing that was making TWBlue to disconnect the streaming API. ([#103](https://github.com/manuelcortez/TWBlue/issues/103))
|
||||||
|
* Now OCR will work in images from retweets. It fixes a bug where TWBlue was detecting images but couldn't apply OCR on them. ([#105](https://github.com/manuelcortez/TWBlue/issues/105))
|
||||||
|
* TWBlue won't try to load tweets already deleted, made with Twishort. Before, if someone posted a long tweet but deleted it in the Twishort's site, TWBlue was trying to load the tweet and it was causing problems in all the client. ([#113](https://github.com/manuelcortez/TWBlue/issues/113))
|
||||||
|
* TWBlue shows an error message when you try to view the profile of an user that does not exist or has been suspended. ([#114,](https://github.com/manuelcortez/TWBlue/issues/114) [#115](https://github.com/manuelcortez/TWBlue/issues/115))
|
||||||
|
* The spellchecker module should select the right language when is set to "user default". ([#117](https://github.com/manuelcortez/TWBlue/issues/117))
|
||||||
|
* Image description will be displayed in retweets too. ([#119](https://github.com/manuelcortez/TWBlue/issues/119))
|
||||||
|
* When reading a long tweet, you shouldn't read strange entities anymore. ([#118](https://github.com/manuelcortez/twblue/issues/118))
|
||||||
|
* TWBlue will not try to load timelines if the user is blocking you. ([#125](https://github.com/manuelcortez/twblue/issues/125))
|
||||||
|
|
||||||
|
## Changes in version 0.88 and 0.89
|
||||||
|
|
||||||
|
* Fixed more issues with streams and reconnections.
|
||||||
|
* newer updates will indicate the release date in the updater.
|
||||||
|
* Changes to keystrokes are reflected in keystroke editor automatically.
|
||||||
|
* In replies with multiple users, if the mention to all checkbox is unchecked, you will see a checkbox per user so you will be able to control who will be mentioned in the reply.
|
||||||
|
* Fixed a bug that caused duplicated user mentions in replies when the tweet was made with Twishort.
|
||||||
|
* Retweets should be displayed normally again when the originating tweet is a Twishort's long tweet.
|
||||||
|
* Changed the way TWBlue saves user timelines in configuration. Now it uses user IDS instead usernames. With user IDS, if an user changes the username, TWBlue still will create his/her timeline. This was not possible by using usernames.
|
||||||
|
* Added a new setting in the account settings dialogue that makes TWBlue to show twitter usernames instead the full name.
|
||||||
|
* Added OCR in twitter pictures. There is a new item in the tweet menu that allows you to extract and display text in images. Also the keystroke alt+Win+o has been added for the same purpose from the invisible interface.
|
||||||
|
* Now TWBlue will play a sound when the focused tweet contains images.
|
||||||
|
* Your own quoted tweets will not appear in the mentions buffer anymore.
|
||||||
|
* The config file is saved in a different way, it should fix the bug where TWBlue needs to be restarted after the config folder is deleted.
|
||||||
|
* Mentioning people from friends or followers buffers works again.
|
||||||
|
* Support for proxy servers has been improved. Now TWBlue supports http, https, socks4 and socks5 proxies, with and without autentication.
|
||||||
|
|
||||||
|
## Changes in version 0.87
|
||||||
|
|
||||||
|
* Fixed stream connection errors.
|
||||||
|
* Now TWBlue can handle properly a reply to the sender without including all other mentioned users.
|
||||||
|
* Updated translations.
|
||||||
|
* The status of the mention to all checkbox will be remembered the next time you reply to multiple users.
|
||||||
|
|
||||||
|
## Changes in version 0.86
|
||||||
|
|
||||||
|
* Fixed a very important security issue. Now TWBlue will send tweets to twishort without using any other server.
|
||||||
|
* When you add a comment to a tweet, it will be sent as a quoted tweet, even if your reply plus the original tweet is not exceeding 140 characters.
|
||||||
|
* Updated windows 10 keymap for reflecting changes made in the last windows 10 build.
|
||||||
|
* Added last changes in the twitter API.
|
||||||
|
* When replying, it will not show the twitter username in the text box. When you send the tweet, the username will be added automatically.
|
||||||
|
* When replying to multiple users, you'll have a checkbox instead a button for mentioning all people. If this is checked, twitter usernames will be added automatically when you send your reply.
|
||||||
|
|
||||||
|
## Changes in version 0.85
|
||||||
|
|
||||||
|
* Long and quoted tweets should be displayed properly In lists.
|
||||||
|
* The connection should be more stable.
|
||||||
|
* Added an autostart option in the global settings dialogue.
|
||||||
|
* Updated translation.
|
||||||
|
* Updated russian documentation.
|
||||||
|
* Tweets in cached database should be loaded properly.
|
||||||
|
* Added some missed dictionaries for spelling correction.
|
||||||
|
* Timelines, lists and other buffer should be created in the right order at startup.
|
||||||
|
|
||||||
|
## Changes in version 0.84
|
||||||
|
|
||||||
|
* More improvements in quoted and long tweets.
|
||||||
|
* Updated translations: Russian, Italian, French, Romanian, Galician and Finnish.
|
||||||
|
* Improvements in the audio uploader module: Now it can handle audio with non-english characters.
|
||||||
|
* the title of the window should be updated properly when spellcheck, translate or shorten/unshorten URL buttons are pressed.
|
||||||
|
* the bug that changes the selected tweet in the home timeline shouldn't be happening so often.
|
||||||
|
|
||||||
|
## Changes in version 0.82 and 0.83
|
||||||
|
|
||||||
|
* If the tweet source (client) is an application with unicode characters (example: российская газета) it will not break the tweet displayer.
|
||||||
|
* Added a new field for image description in tweet displayer. When available, it will show description for images posted in tweets.
|
||||||
|
* users can add image descriptions to their photos. When uploading an image, a dialog will show for asking a description.
|
||||||
|
* Redesigned upload image dialog.
|
||||||
|
* Fixed photo uploads when posting tweets.
|
||||||
|
* When getting tweets for a conversation, ignores deleted tweets or some errors, now TWBlue will try to get as much tweets as possible, even if some of these are no longer available.
|
||||||
|
* Added audio playback from soundcloud.
|
||||||
|
* Now the session mute option don't makes the screen reader speaks.
|
||||||
|
* Fixed the direct message dialog. Now it should be displayed properly.
|
||||||
|
* when a tweet is deleted in twitter, TWBlue should reflect this change and delete that tweet in every buffer it is displayed.
|
||||||
|
* If your session is broken, TWBlue will be able to remove it automatically instead just crashing.
|
||||||
|
* audio uploader should display the current progress.
|
||||||
|
* users can disable the check for updates feature at startup from the general tab, in the global settings dialogue.
|
||||||
|
* The invisible interface and the window should be synchronized when the client reconnects.
|
||||||
|
* The documentation option in the systray icon should be enabled.
|
||||||
|
* In trending buffers, you can press enter for posting a tweet about the focused trend.
|
||||||
|
* Updated russian documentation and main program interface (thanks to Natalia Hedlund (Наталья Хедлунд), [@lifestar_n](https://twitter.com/lifestar_n) in twitter)
|
||||||
|
* updated translations.
|
||||||
|
|
||||||
|
## Changes in Version 0.81
|
||||||
|
|
||||||
|
* Updated translations
|
||||||
|
* The updater module has received some improvements. Now it includes a Mirror URL for checking updates if the main URL is not available at the moment. If something is wrong and both locations don't work, the program will start anyway.
|
||||||
|
* some GUI elements now use keyboard shortcuts for common actions.
|
||||||
|
* fixed a bug in the geolocation dialog.
|
||||||
|
* the chicken nugget keymap should work properly.
|
||||||
|
* Added a new soundpack to the default installation of TWBlue, thanks to [@Deng90](https://twitter.com/deng90)
|
||||||
|
* Now the changelog is written in an html File.
|
||||||
|
* Added some missed dictionaries in last version for the spell checking feature.
|
||||||
|
* Trimmed the beginnings of the sounds in the default soundpack. Thanks to [@masonasons](https://github.com/masonasons)
|
||||||
|
* Added Opus support for sound playback in TWBlue. Thanks to [@masonasons](https://github.com/masonasons)
|
||||||
|
* Added a source field in view tweet dialogue. Thanks to [@masonasons](https://github.com/masonasons)
|
||||||
|
* You can load previous items in followers and friend buffers for others.
|
||||||
|
* The Spell Checker dialogue should not display an error message when you have set "default language" in the global settings dialogue if your language is supported [#168](http://twblue.es/bugs/view.php?id=168)
|
||||||
|
* Updated romanian translation.
|
||||||
|
* Some code cleanups.
|
||||||
|
* The bug reports feature is fully operational again.
|
||||||
|
* TWBlue should work again for users that contains special characters in windows usernames.
|
||||||
|
* Added more options for the tweet searches.
|
||||||
|
* Added play_audio to the keymap editor.
|
||||||
|
* Windows key is no longer required in the keymap editor
|
||||||
|
* Switched to the Microsoft translator.
|
||||||
|
* You can update the current buffer by pressing ctrl+win+shift+u in the default keymap or in the buffer menu.
|
||||||
|
* Changed some keystrokes in the windows 10 default keymap
|
||||||
|
* New followers and friends buffer for user timelines.
|
||||||
|
|
||||||
|
---
|
||||||
|
Copyright © 2014-2017, Manuel Cortez.
|
@@ -2,7 +2,7 @@
|
|||||||
""" This script converts the hold documentation (saved in markdown files) in a python file with a list of strings to translate it using gettext."""
|
""" This script converts the hold documentation (saved in markdown files) in a python file with a list of strings to translate it using gettext."""
|
||||||
|
|
||||||
def prepare_documentation_in_file(fileSource, fileDest):
|
def prepare_documentation_in_file(fileSource, fileDest):
|
||||||
""" This takes documentation written in a markdown file and put all the contents in a python file, to create a internationalized documentation.
|
""" This takes documentation written in a markdown file and put all the contents in a python file, to create a translatable documentation.
|
||||||
@fileSource str: A markdown(.md) file.
|
@fileSource str: A markdown(.md) file.
|
||||||
@fileDest str: A file where this will put the new strings"""
|
@fileDest str: A file where this will put the new strings"""
|
||||||
|
|
||||||
@@ -18,11 +18,11 @@ def prepare_documentation_in_file(fileSource, fileDest):
|
|||||||
newvar = "_(u\"\"\"%s\"\"\"),\n" % (i[:-1])
|
newvar = "_(u\"\"\"%s\"\"\"),\n" % (i[:-1])
|
||||||
else:
|
else:
|
||||||
newvar = "_(u\"\"\"%s\"\"\"),\n" % (i)
|
newvar = "_(u\"\"\"%s\"\"\"),\n" % (i)
|
||||||
# print i[-1:]
|
|
||||||
f2.write(newvar)
|
f2.write(newvar)
|
||||||
f1.close()
|
f1.close()
|
||||||
f2.write("]")
|
f2.write("]")
|
||||||
f2.close()
|
f2.close()
|
||||||
|
|
||||||
|
|
||||||
prepare_documentation_in_file("manual.md", "strings.py")
|
prepare_documentation_in_file("manual.md", "strings.py")
|
||||||
|
prepare_documentation_in_file("changelog.md", "changelog.py")
|
@@ -5,16 +5,28 @@ from codecs import open as _open
|
|||||||
import languageHandler
|
import languageHandler
|
||||||
languageHandler.setLanguage("en")
|
languageHandler.setLanguage("en")
|
||||||
import strings
|
import strings
|
||||||
|
import changelog
|
||||||
|
|
||||||
# the list of supported language codes of TW Blue
|
# the list of supported language codes of TW Blue
|
||||||
languages = ["en", "es", "fr", "de", "it", "gl", "ja", "ru", "ro"]
|
languages = ["en", "es", "fr", "de", "it", "gl", "ja", "ru", "ro", "eu", "ca", "da"]
|
||||||
#"eu", "ar", "ca", "es", "fi", "fr", "gl", "hu", "it", "pl", "pt", "ru", "tr"]
|
#"eu", "ar", "ca", "es", "fi", "fr", "gl", "hu", "it", "pl", "pt", "ru", "tr"]
|
||||||
|
|
||||||
def generate_document(language):
|
def generate_document(language, document_type="documentation"):
|
||||||
reload(languageHandler)
|
reload(languageHandler)
|
||||||
languageHandler.setLanguage(language)
|
if document_type == "documentation":
|
||||||
reload(strings)
|
translation_file = "twblue-documentation"
|
||||||
markdown_file = markdown.markdown("\n".join(strings.documentation[1:]), extensions=["markdown.extensions.toc"])
|
languageHandler.setLanguage(language, translation_file)
|
||||||
|
reload(strings)
|
||||||
|
markdown_file = markdown.markdown("\n".join(strings.documentation[1:]), extensions=["markdown.extensions.toc"])
|
||||||
|
title = strings.documentation[0]
|
||||||
|
filename = "manual.html"
|
||||||
|
elif document_type == "changelog":
|
||||||
|
translation_file = "twblue-changelog"
|
||||||
|
languageHandler.setLanguage(language, translation_file)
|
||||||
|
reload(changelog)
|
||||||
|
markdown_file = markdown.markdown("\n".join(changelog.documentation[1:]), extensions=["markdown.extensions.toc"])
|
||||||
|
title = changelog.documentation[0]
|
||||||
|
filename = "changelog.html"
|
||||||
first_html_block = """<!doctype html>
|
first_html_block = """<!doctype html>
|
||||||
<html lang="%s">
|
<html lang="%s">
|
||||||
<head>
|
<head>
|
||||||
@@ -23,12 +35,12 @@ def generate_document(language):
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<header><h1>%s</h1></header>
|
<header><h1>%s</h1></header>
|
||||||
""" % (language, strings.documentation[0], strings.documentation[0])
|
""" % (language, title, title)
|
||||||
first_html_block = first_html_block+ markdown_file
|
first_html_block = first_html_block+ markdown_file
|
||||||
first_html_block = first_html_block + "\n</body>\n</html>"
|
first_html_block = first_html_block + "\n</body>\n</html>"
|
||||||
if not os.path.exists(language):
|
if not os.path.exists(language):
|
||||||
os.mkdir(language)
|
os.mkdir(language)
|
||||||
mdfile = _open("%s/manual.html" % language, "w", encoding="utf-8")
|
mdfile = _open("%s/%s" % (language, filename), "w", encoding="utf-8")
|
||||||
mdfile.write(first_html_block)
|
mdfile.write(first_html_block)
|
||||||
mdfile.close()
|
mdfile.close()
|
||||||
|
|
||||||
@@ -37,6 +49,7 @@ def create_documentation():
|
|||||||
for i in languages:
|
for i in languages:
|
||||||
print("Creating documentation for: %s" % (i,))
|
print("Creating documentation for: %s" % (i,))
|
||||||
generate_document(i)
|
generate_document(i)
|
||||||
|
generate_document(i, "changelog")
|
||||||
print("Done")
|
print("Done")
|
||||||
|
|
||||||
create_documentation()
|
create_documentation()
|
@@ -117,7 +117,7 @@ def makePgettext(translations):
|
|||||||
return unicode(message)
|
return unicode(message)
|
||||||
return pgettext
|
return pgettext
|
||||||
|
|
||||||
def setLanguage(lang):
|
def setLanguage(lang, translation_file="twblue-documentation"):
|
||||||
system = platform.system()
|
system = platform.system()
|
||||||
global curLang
|
global curLang
|
||||||
try:
|
try:
|
||||||
@@ -127,10 +127,10 @@ def setLanguage(lang):
|
|||||||
localeName=locale.windows_locale[windowsLCID]
|
localeName=locale.windows_locale[windowsLCID]
|
||||||
else:
|
else:
|
||||||
localeName=locale.getlocale()[0]
|
localeName=locale.getlocale()[0]
|
||||||
trans=gettext.translation('twblue-documentation', localedir="locales", languages=[localeName])
|
trans=gettext.translation(translation_file, localedir="locales", languages=[localeName])
|
||||||
curLang=localeName
|
curLang=localeName
|
||||||
else:
|
else:
|
||||||
trans=gettext.translation("twblue-documentation", localedir="locales", languages=[lang])
|
trans=gettext.translation(translation_file, localedir="locales", languages=[lang])
|
||||||
curLang=lang
|
curLang=lang
|
||||||
localeChanged=False
|
localeChanged=False
|
||||||
#Try setting Python's locale to lang
|
#Try setting Python's locale to lang
|
||||||
@@ -150,7 +150,7 @@ def setLanguage(lang):
|
|||||||
LCID=localeNameToWindowsLCID(lang)
|
LCID=localeNameToWindowsLCID(lang)
|
||||||
ctypes.windll.kernel32.SetThreadLocale(LCID)
|
ctypes.windll.kernel32.SetThreadLocale(LCID)
|
||||||
except IOError:
|
except IOError:
|
||||||
trans=gettext.translation("twblue-documentation",fallback=True)
|
trans=gettext.translation(translation_file,fallback=True)
|
||||||
curLang="en"
|
curLang="en"
|
||||||
trans.install(unicode=True)
|
trans.install(unicode=True)
|
||||||
# Install our pgettext function.
|
# Install our pgettext function.
|
||||||
|
BIN
doc/locales/ca/lc_messages/twblue-changelog.mo
Normal file
BIN
doc/locales/ca/lc_messages/twblue-changelog.mo
Normal file
Binary file not shown.
1111
doc/locales/ca/lc_messages/twblue-changelog.po
Normal file
1111
doc/locales/ca/lc_messages/twblue-changelog.po
Normal file
File diff suppressed because it is too large
Load Diff
BIN
doc/locales/ca/lc_messages/twblue-documentation.mo
Normal file
BIN
doc/locales/ca/lc_messages/twblue-documentation.mo
Normal file
Binary file not shown.
2659
doc/locales/ca/lc_messages/twblue-documentation.po
Normal file
2659
doc/locales/ca/lc_messages/twblue-documentation.po
Normal file
File diff suppressed because it is too large
Load Diff
BIN
doc/locales/da/LC_MESSAGES/twblue-documentation.mo
Normal file
BIN
doc/locales/da/LC_MESSAGES/twblue-documentation.mo
Normal file
Binary file not shown.
1932
doc/locales/da/LC_MESSAGES/twblue-documentation.po
Normal file
1932
doc/locales/da/LC_MESSAGES/twblue-documentation.po
Normal file
File diff suppressed because it is too large
Load Diff
BIN
doc/locales/de/lc_messages/twblue-changelog.mo
Normal file
BIN
doc/locales/de/lc_messages/twblue-changelog.mo
Normal file
Binary file not shown.
1182
doc/locales/de/lc_messages/twblue-changelog.po
Normal file
1182
doc/locales/de/lc_messages/twblue-changelog.po
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
BIN
doc/locales/es/LC_MESSAGES/twblue-changelog.mo
Normal file
BIN
doc/locales/es/LC_MESSAGES/twblue-changelog.mo
Normal file
Binary file not shown.
1162
doc/locales/es/LC_MESSAGES/twblue-changelog.po
Normal file
1162
doc/locales/es/LC_MESSAGES/twblue-changelog.po
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
BIN
doc/locales/eu/lc_messages/twblue-changelog.mo
Normal file
BIN
doc/locales/eu/lc_messages/twblue-changelog.mo
Normal file
Binary file not shown.
1048
doc/locales/eu/lc_messages/twblue-changelog.po
Normal file
1048
doc/locales/eu/lc_messages/twblue-changelog.po
Normal file
File diff suppressed because it is too large
Load Diff
635
doc/locales/eu/lc_messages/twblue-changelog.temp.temp.po
Normal file
635
doc/locales/eu/lc_messages/twblue-changelog.temp.temp.po
Normal file
@@ -0,0 +1,635 @@
|
|||||||
|
# SOME DESCRIPTIVE TITLE.
|
||||||
|
# Copyright (C) YEAR ORGANIZATION
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: \n"
|
||||||
|
"POT-Creation-Date: 2017-07-08 16:25+Hora de verano central (Mxico)\n"
|
||||||
|
"PO-Revision-Date: 2017-07-15 19:44+0200\n"
|
||||||
|
"Last-Translator: Sukil Etxenike <sukiletxe@yahoo.es>\n"
|
||||||
|
"Language-Team: \n"
|
||||||
|
"Language: eu\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 2.0.1\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:3
|
||||||
|
msgid "TWBlue Changelog"
|
||||||
|
msgstr "TwBlueren aldaketak"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:4
|
||||||
|
msgid "## changes in this version"
|
||||||
|
msgstr "## Aldaketak bertsio honetan"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:5
|
||||||
|
msgid ""
|
||||||
|
"* TWBlue will show an error when trying to open a timeline for a suspended "
|
||||||
|
"user. ([#128](https://github.com/manuelcortez/TWBlue/issues/128))"
|
||||||
|
msgstr ""
|
||||||
|
"* TWBluek errore bat erakutsiko du ezabatutako erabiltzaile batn denbora "
|
||||||
|
"lerro bat irekitzen saiatzean . ([#128](https://github.com/manuelcortez/"
|
||||||
|
"TWBlue/issues/128))"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:6
|
||||||
|
msgid ""
|
||||||
|
"* Removed TwUp as service as it no longer exists. ([#112](https://github.com/"
|
||||||
|
"manuelcortez/TWBlue/issues/112))"
|
||||||
|
msgstr ""
|
||||||
|
"* TwUp zerbitzua kendu da, jada ez delako existitzen. ([#112](https://github."
|
||||||
|
"com/manuelcortez/TWBlue/issues/112)) "
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:7
|
||||||
|
msgid ""
|
||||||
|
"* Release audio files after uploading them. ([#130](https://github.com/"
|
||||||
|
"manuelcortez/TWBlue/issues/130))"
|
||||||
|
msgstr ""
|
||||||
|
"* Orain audio fitxategiak askatzen dira igo ondoren. ([#130](https://github."
|
||||||
|
"com/manuelcortez/TWBlue/issues/130))"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:8
|
||||||
|
msgid ""
|
||||||
|
"* Now TWBlue will use Yandex's translation services instead microsoft "
|
||||||
|
"translator. ([#132](https://github.com/manuelcortez/TWBlue/issues/132))"
|
||||||
|
msgstr ""
|
||||||
|
"* Orain TWBluek Yandexen itzultzailea erabiltzen du Microsoften "
|
||||||
|
"itzultzailearen ordez. ([#132](https://github.com/manuelcortez/TWBlue/"
|
||||||
|
"issues/132))"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:9
|
||||||
|
msgid ""
|
||||||
|
"* SndUp users will be able to upload audio in their account by using their "
|
||||||
|
"API Key again. ([#134](https://github.com/manuelcortez/TWBlue/issues/134))"
|
||||||
|
msgstr ""
|
||||||
|
"* SndUp-en erabiltzaileek orain audioak igo ditzakete haien API kodea "
|
||||||
|
"erabilita. ([#134](https://github.com/manuelcortez/TWBlue/issues/134))"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:10
|
||||||
|
msgid ""
|
||||||
|
"* old tweets shouldn't be added as new items in buffers. ([#116,](https://"
|
||||||
|
"github.com/manuelcortez/TWBlue/issues/116)) ([#133](https://github.com/"
|
||||||
|
"manuelcortez/TWBlue/issues/133))"
|
||||||
|
msgstr ""
|
||||||
|
"* Txio zaharrak ez lirateke buferretan elementu berri gisa agertu behar. "
|
||||||
|
"([#116,](https://github.com/manuelcortez/TWBlue/issues/116)) ([#133](https://"
|
||||||
|
"github.com/manuelcortez/TWBlue/issues/133))"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:11
|
||||||
|
msgid ""
|
||||||
|
"* All mentionned users should be displayed correctly in Twishort's long "
|
||||||
|
"tweets. ([#116,](https://github.com/manuelcortez/TWBlue/issues/116)) ([#135]"
|
||||||
|
"(https://github.com/manuelcortez/TWBlue/issues/135))"
|
||||||
|
msgstr ""
|
||||||
|
"* Aipatutako erabiltzaile guztiak ondo agertu beharko lirateke Tuishort-en "
|
||||||
|
"txio luzeetan. ([#116,](https://github.com/manuelcortez/TWBlue/issues/116)) "
|
||||||
|
"([#135](https://github.com/manuelcortez/TWBlue/issues/135))"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:12
|
||||||
|
msgid ""
|
||||||
|
"* It is possible to select a language for OCR service from the extras panel, "
|
||||||
|
"in the account settings dialogue. You can, however, set this to detect "
|
||||||
|
"automatically. OCR should work better in languages with special characters "
|
||||||
|
"or non-english symbols. ([#107](https://github.com/manuelcortez/TWBlue/"
|
||||||
|
"issues/107))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:13
|
||||||
|
msgid ""
|
||||||
|
"* Fixed a problem with JAWS for Windows and TWBlue. Now JAWS will work "
|
||||||
|
"normally in this update. [#100](https://github.com/manuelcortez/twblue/"
|
||||||
|
"issues/100)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:14
|
||||||
|
msgid "* And more ([#136,](https://github.com/manuelcortez/TWBlue/issues/136))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:15
|
||||||
|
msgid "## Changes in version 0.90"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:16
|
||||||
|
msgid ""
|
||||||
|
"* Fixed a bug in long tweet parsing that was making TWBlue to disconnect the "
|
||||||
|
"streaming API. ([#103](https://github.com/manuelcortez/TWBlue/issues/103))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:17
|
||||||
|
msgid ""
|
||||||
|
"* Now OCR will work in images from retweets. It fixes a bug where TWBlue was "
|
||||||
|
"detecting images but couldn't apply OCR on them. ([#105](https://github.com/"
|
||||||
|
"manuelcortez/TWBlue/issues/105))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:18
|
||||||
|
msgid ""
|
||||||
|
"* TWBlue won't try to load tweets already deleted, made with Twishort. "
|
||||||
|
"Before, if someone posted a long tweet but deleted it in the Twishort's "
|
||||||
|
"site, TWBlue was trying to load the tweet and it was causing problems in all "
|
||||||
|
"the client. ([#113](https://github.com/manuelcortez/TWBlue/issues/113))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:19
|
||||||
|
msgid ""
|
||||||
|
"* TWBlue shows an error message when you try to view the profile of an user "
|
||||||
|
"that does not exist or has been suspended. ([#114,](https://github.com/"
|
||||||
|
"manuelcortez/TWBlue/issues/114) [#115](https://github.com/manuelcortez/"
|
||||||
|
"TWBlue/issues/115))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:20
|
||||||
|
msgid ""
|
||||||
|
"* The spellchecker module should select the right language when is set to "
|
||||||
|
"\"user default\". ([#117](https://github.com/manuelcortez/TWBlue/issues/117))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:21
|
||||||
|
msgid ""
|
||||||
|
"* Image description will be displayed in retweets too. ([#119](https://"
|
||||||
|
"github.com/manuelcortez/TWBlue/issues/119))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:22
|
||||||
|
msgid ""
|
||||||
|
"* When reading a long tweet, you shouldn't read strange entities anymore. "
|
||||||
|
"([#118](https://github.com/manuelcortez/twblue/issues/118))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:23
|
||||||
|
msgid ""
|
||||||
|
"* TWBlue will not try to load timelines if the user is blocking you. ([#125]"
|
||||||
|
"(https://github.com/manuelcortez/twblue/issues/125))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:24
|
||||||
|
msgid "## Changes in version 0.88 and 0.89"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:25
|
||||||
|
msgid "* Fixed more issues with streams and reconnections."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:26
|
||||||
|
msgid "* newer updates will indicate the release date in the updater."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:27
|
||||||
|
msgid ""
|
||||||
|
"* Changes to keystrokes are reflected in keystroke editor automatically."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:28
|
||||||
|
msgid ""
|
||||||
|
"* In replies with multiple users, if the mention to all checkbox is "
|
||||||
|
"unchecked, you will see a checkbox per user so you will be able to control "
|
||||||
|
"who will be mentioned in the reply."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:29
|
||||||
|
msgid ""
|
||||||
|
"* Fixed a bug that caused duplicated user mentions in replies when the tweet "
|
||||||
|
"was made with Twishort."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:30
|
||||||
|
msgid ""
|
||||||
|
"* Retweets should be displayed normally again when the originating tweet is "
|
||||||
|
"a Twishort's long tweet."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:31
|
||||||
|
msgid ""
|
||||||
|
"* Changed the way TWBlue saves user timelines in configuration. Now it uses "
|
||||||
|
"user IDS instead usernames. With user IDS, if an user changes the username, "
|
||||||
|
"TWBlue still will create his/her timeline. This was not possible by using "
|
||||||
|
"usernames."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:32
|
||||||
|
msgid ""
|
||||||
|
"* Added a new setting in the account settings dialogue that makes TWBlue to "
|
||||||
|
"show twitter usernames instead the full name."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:33
|
||||||
|
msgid ""
|
||||||
|
"* Added OCR in twitter pictures. There is a new item in the tweet menu that "
|
||||||
|
"allows you to extract and display text in images. Also the keystroke alt+Win"
|
||||||
|
"+o has been added for the same purpose from the invisible interface."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:34
|
||||||
|
msgid "* Now TWBlue will play a sound when the focused tweet contains images."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:35
|
||||||
|
msgid ""
|
||||||
|
"* Your own quoted tweets will not appear in the mentions buffer anymore."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:36
|
||||||
|
msgid ""
|
||||||
|
"* The config file is saved in a different way, it should fix the bug where "
|
||||||
|
"TWBlue needs to be restarted after the config folder is deleted."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:37
|
||||||
|
msgid "* Mentioning people from friends or followers buffers works again."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:38
|
||||||
|
msgid ""
|
||||||
|
"* Support for proxy servers has been improved. Now TWBlue supports http, "
|
||||||
|
"https, socks4 and socks5 proxies, with and without autentication."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:39
|
||||||
|
msgid "## Changes in version 0.87"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:40
|
||||||
|
msgid "* Fixed stream connection errors."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:41
|
||||||
|
msgid ""
|
||||||
|
"* Now TWBlue can handle properly a reply to the sender without including all "
|
||||||
|
"other mentioned users."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:42
|
||||||
|
msgid "* Updated translations."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:43
|
||||||
|
msgid ""
|
||||||
|
"* The status of the mention to all checkbox will be remembered the next time "
|
||||||
|
"you reply to multiple users."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:44
|
||||||
|
msgid "## Changes in version 0.86"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:45
|
||||||
|
msgid ""
|
||||||
|
"* Fixed a very important security issue. Now TWBlue will send tweets to "
|
||||||
|
"twishort without using any other server."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:46
|
||||||
|
msgid ""
|
||||||
|
"* When you add a comment to a tweet, it will be sent as a quoted tweet, even "
|
||||||
|
"if your reply plus the original tweet is not exceeding 140 characters."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:47
|
||||||
|
msgid ""
|
||||||
|
"* Updated windows 10 keymap for reflecting changes made in the last windows "
|
||||||
|
"10 build."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:48
|
||||||
|
msgid "* Added last changes in the twitter API."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:49
|
||||||
|
msgid ""
|
||||||
|
"* When replying, it will not show the twitter username in the text box. When "
|
||||||
|
"you send the tweet, the username will be added automatically."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:50
|
||||||
|
msgid ""
|
||||||
|
"* When replying to multiple users, you'll have a checkbox instead a button "
|
||||||
|
"for mentioning all people. If this is checked, twitter usernames will be "
|
||||||
|
"added automatically when you send your reply."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:51
|
||||||
|
msgid "## Changes in version 0.85"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:52
|
||||||
|
msgid "* Long and quoted tweets should be displayed properly In lists."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:53
|
||||||
|
msgid "* The connection should be more stable."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:54
|
||||||
|
msgid "* Added an autostart option in the global settings dialogue."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:55
|
||||||
|
msgid "* Updated translation."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:56
|
||||||
|
msgid "* Updated russian documentation."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:57
|
||||||
|
msgid "* Tweets in cached database should be loaded properly."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:58
|
||||||
|
msgid "* Added some missed dictionaries for spelling correction."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:59
|
||||||
|
msgid ""
|
||||||
|
"* Timelines, lists and other buffer should be created in the right order at "
|
||||||
|
"startup."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:60
|
||||||
|
msgid "## Changes in version 0.84 "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:61
|
||||||
|
msgid "* More improvements in quoted and long tweets."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:62
|
||||||
|
msgid ""
|
||||||
|
"* Updated translations: Russian, Italian, French, Romanian, Galician and "
|
||||||
|
"Finnish."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:63
|
||||||
|
msgid ""
|
||||||
|
"* Improvements in the audio uploader module: Now it can handle audio with "
|
||||||
|
"non-english characters."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:64
|
||||||
|
msgid ""
|
||||||
|
"* the title of the window should be updated properly when spellcheck, "
|
||||||
|
"translate or shorten/unshorten URL buttons are pressed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:65
|
||||||
|
msgid ""
|
||||||
|
"* the bug that changes the selected tweet in the home timeline shouldn't be "
|
||||||
|
"happening so often."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:66
|
||||||
|
msgid "## Changes in version 0.82 and 0.83"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:67
|
||||||
|
msgid ""
|
||||||
|
"* If the tweet source (client) is an application with unicode characters "
|
||||||
|
"(example: российская газета) it will not break the tweet displayer."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:68
|
||||||
|
msgid ""
|
||||||
|
"* Added a new field for image description in tweet displayer. When "
|
||||||
|
"available, it will show description for images posted in tweets."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:69
|
||||||
|
msgid ""
|
||||||
|
"* users can add image descriptions to their photos. When uploading an image, "
|
||||||
|
"a dialog will show for asking a description."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:70
|
||||||
|
msgid "* Redesigned upload image dialog."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:71
|
||||||
|
msgid "* Fixed photo uploads when posting tweets."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:72
|
||||||
|
msgid ""
|
||||||
|
"* When getting tweets for a conversation, ignores deleted tweets or some "
|
||||||
|
"errors, now TWBlue will try to get as much tweets as possible, even if some "
|
||||||
|
"of these are no longer available."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:73
|
||||||
|
msgid "* Added audio playback from soundcloud."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:74
|
||||||
|
msgid "* Now the session mute option don't makes the screen reader speaks."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:75
|
||||||
|
msgid "* Fixed the direct message dialog. Now it should be displayed properly."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:76
|
||||||
|
msgid ""
|
||||||
|
"* when a tweet is deleted in twitter, TWBlue should reflect this change and "
|
||||||
|
"delete that tweet in every buffer it is displayed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:77
|
||||||
|
msgid ""
|
||||||
|
"* If your session is broken, TWBlue will be able to remove it automatically "
|
||||||
|
"instead just crashing."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:78
|
||||||
|
msgid "* audio uploader should display the current progress."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:79
|
||||||
|
msgid ""
|
||||||
|
"* users can disable the check for updates feature at startup from the "
|
||||||
|
"general tab, in the global settings dialogue."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:80
|
||||||
|
msgid ""
|
||||||
|
"* The invisible interface and the window should be synchronized when the "
|
||||||
|
"client reconnects."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:81
|
||||||
|
msgid "* The documentation option in the systray icon should be enabled."
|
||||||
|
msgstr ""
|
||||||
|
"* Sistemaren ikonoetako dokumentazioa ikusteko aukera erabilgarria egon "
|
||||||
|
"beharko litzateke."
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:82
|
||||||
|
msgid ""
|
||||||
|
"* In trending buffers, you can press enter for posting a tweet about the "
|
||||||
|
"focused trend."
|
||||||
|
msgstr ""
|
||||||
|
"* Tendentzien buferretan, enter saka dezakezu enfokatutako tendentziari "
|
||||||
|
"buruz txio bat argitaratzeko."
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:83
|
||||||
|
msgid ""
|
||||||
|
"* Updated russian documentation and main program interface (thanks to "
|
||||||
|
"Natalia Hedlund (Наталья Хедлунд), [@lifestar_n](https://twitter.com/"
|
||||||
|
"lifestar_n) in twitter)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:84
|
||||||
|
msgid "* updated translations."
|
||||||
|
msgstr "* Itzulpenak eguneratuak izan dira."
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:85
|
||||||
|
msgid "## Changes in Version 0.81"
|
||||||
|
msgstr "## 0.81bertsioaren aldaketak"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:86
|
||||||
|
msgid "* Updated translations"
|
||||||
|
msgstr "* Itzulpenak eguneratuak izan dira"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:87
|
||||||
|
msgid ""
|
||||||
|
"* The updater module has received some improvements. Now it includes a "
|
||||||
|
"Mirror URL for checking updates if the main URL is not available at the "
|
||||||
|
"moment. If something is wrong and both locations don't work, the program "
|
||||||
|
"will start anyway."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:88
|
||||||
|
msgid "* some GUI elements now use keyboard shortcuts for common actions."
|
||||||
|
msgstr ""
|
||||||
|
"* Interfaze grafikoko elementu batzuek lasterbide teklak dituzte ohiko "
|
||||||
|
"ekintzetarako."
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:89
|
||||||
|
msgid "* fixed a bug in the geolocation dialog."
|
||||||
|
msgstr "* Errore bat konpondu da geottxioen elkarrizketa-koadroan."
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:90
|
||||||
|
msgid "* the chicken nugget keymap should work properly."
|
||||||
|
msgstr "* Chicken Nuggetaren teklatu-mapak ondo funtzionatu beharko luke."
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:91
|
||||||
|
msgid ""
|
||||||
|
"* Added a new soundpack to the default installation of TWBlue, thanks to "
|
||||||
|
"[@Deng90](https://twitter.com/deng90)"
|
||||||
|
msgstr ""
|
||||||
|
"* Soinu pakete berri bat gehitu zaio TWBlueren lehenetsitako instalazioari, "
|
||||||
|
"eskerrak [@Deng90](https://twitter.com/deng90)"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:92
|
||||||
|
msgid "* Now the changelog is written in an html File."
|
||||||
|
msgstr "* Orain aldaketen fitxategia html fitxategi bat da."
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:93
|
||||||
|
msgid ""
|
||||||
|
"* Added some missed dictionaries in last version for the spell checking "
|
||||||
|
"feature."
|
||||||
|
msgstr ""
|
||||||
|
"* Aurreko bertsioan falta ziren hiztegi batzuk gehitu dira, zuzentzaleak "
|
||||||
|
"erabiltzen dituenak."
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:94
|
||||||
|
msgid ""
|
||||||
|
"* Trimmed the beginnings of the sounds in the default soundpack. Thanks to "
|
||||||
|
"[@masonasons](https://github.com/masonasons)"
|
||||||
|
msgstr ""
|
||||||
|
"* ehenetsitako soiinu paketearen soinuen hasierak moztu dira. Eskerrak "
|
||||||
|
"[@masonasons-i.](https://github.com/masonasons)"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:95
|
||||||
|
msgid ""
|
||||||
|
"* Added Opus support for sound playback in TWBlue. Thanks to [@masonasons]"
|
||||||
|
"(https://github.com/masonasons)"
|
||||||
|
msgstr ""
|
||||||
|
"* Opus formatua erreproduzi daiteke, eskerrak [@masonasons-i.](https://"
|
||||||
|
"github.com/masonasons)."
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:96
|
||||||
|
msgid ""
|
||||||
|
"* Added a source field in view tweet dialogue. Thanks to [@masonasons]"
|
||||||
|
"(https://github.com/masonasons)"
|
||||||
|
msgstr ""
|
||||||
|
"* \"Iturria\" gehitu zaio txioa erakusteko elkarrizketa koadroari. Eskerrak "
|
||||||
|
"[@masonasons-i.](https://github.com/masonasons)"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:97
|
||||||
|
msgid ""
|
||||||
|
"* You can load previous items in followers and friend buffers for others."
|
||||||
|
msgstr ""
|
||||||
|
"* Aurreko elementuak karga ditzakezu besteen jarraitzaile eta lagunen "
|
||||||
|
"buferretan."
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:98
|
||||||
|
msgid ""
|
||||||
|
"* The Spell Checker dialogue should not display an error message when you "
|
||||||
|
"have set \"default language\" in the global settings dialogue if your "
|
||||||
|
"language is supported [#168](http://twblue.es/bugs/view.php?id=168)"
|
||||||
|
msgstr ""
|
||||||
|
"* Zuzentzailearen elkarrizketa-koadroak ez luke errorerik erakutsi behar "
|
||||||
|
"aukera globaletan \"Lehenetsitako hizkuntza\" aukeratua dagoenean eta zure "
|
||||||
|
"hizkuntza erabilgarria denean [#168](http://twblue.es/bugs/view.php?id=168)"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:99
|
||||||
|
msgid "* Updated romanian translation."
|
||||||
|
msgstr "* Errumaniera itzulpena eguneratua izan da."
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:100
|
||||||
|
msgid "* Some code cleanups."
|
||||||
|
msgstr "* Kode garbiketa batzuk."
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:101
|
||||||
|
msgid "* The bug reports feature is fully operational again."
|
||||||
|
msgstr "* Arazoez informatzeko ezaugarriak berriz funtzionaten du"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:102
|
||||||
|
msgid ""
|
||||||
|
"* TWBlue should work again for users that contains special characters in "
|
||||||
|
"windows usernames."
|
||||||
|
msgstr ""
|
||||||
|
"* TWBluek berriz funtzionatu beharko luke haien Windows erabiltzaile-"
|
||||||
|
"izenetan karaktere bereziak dituzten erabiltzaileentzat."
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:103
|
||||||
|
msgid "* Added more options for the tweet searches."
|
||||||
|
msgstr "* Txioen bilaketarako aukera gehiago gehitu dira."
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:104
|
||||||
|
msgid "* Added play_audio to the keymap editor."
|
||||||
|
msgstr "* play_audio teklatu-mapen editorera gehitua izan da."
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:105
|
||||||
|
msgid "* Windows key is no longer required in the keymap editor"
|
||||||
|
msgstr "* Windows tekla ez da jada bearrezkoa teklatu-mapen editorean."
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:106
|
||||||
|
msgid "* Switched to the Microsoft translator."
|
||||||
|
msgstr "* Microsoften itzultzailera aldatu gara."
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:107
|
||||||
|
msgid ""
|
||||||
|
"* You can update the current buffer by pressing ctrl+win+shift+u in the "
|
||||||
|
"default keymap or in the buffer menu."
|
||||||
|
msgstr ""
|
||||||
|
"* Enfokatutako uferra ktrl+shift+win+u sakatuta (lehenetsitako teklatu-"
|
||||||
|
"mapak) edo menuan eguneratu daitezke."
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:108
|
||||||
|
msgid "* Changed some keystrokes in the windows 10 default keymap"
|
||||||
|
msgstr ""
|
||||||
|
"* Lasterbide-tekla batzuk aldatuak izan dira Windows 10erako teklatu-mapan."
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:109
|
||||||
|
msgid "* New followers and friends buffer for user timelines."
|
||||||
|
msgstr ""
|
||||||
|
"* Jarraitzaileen eta lagunen bufer berria erabiltzaileen denbora-lerroentzat."
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:110
|
||||||
|
msgid "---"
|
||||||
|
msgstr "---"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:111
|
||||||
|
msgid "Copyright © 2014-2017, Manuel Cortez."
|
||||||
|
msgstr "Copyright © 2014-2017, Manuel Cortez."
|
BIN
doc/locales/eu/lc_messages/twblue-documentation.mo
Normal file
BIN
doc/locales/eu/lc_messages/twblue-documentation.mo
Normal file
Binary file not shown.
1879
doc/locales/eu/lc_messages/twblue-documentation.po
Normal file
1879
doc/locales/eu/lc_messages/twblue-documentation.po
Normal file
File diff suppressed because it is too large
Load Diff
BIN
doc/locales/fr/lc_messages/twblue-changelog.mo
Normal file
BIN
doc/locales/fr/lc_messages/twblue-changelog.mo
Normal file
Binary file not shown.
1232
doc/locales/fr/lc_messages/twblue-changelog.po
Normal file
1232
doc/locales/fr/lc_messages/twblue-changelog.po
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
BIN
doc/locales/gl/lc_messages/twblue-changelog.mo
Normal file
BIN
doc/locales/gl/lc_messages/twblue-changelog.mo
Normal file
Binary file not shown.
1150
doc/locales/gl/lc_messages/twblue-changelog.po
Normal file
1150
doc/locales/gl/lc_messages/twblue-changelog.po
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
BIN
doc/locales/ja/lc_messages/twblue-changelog.mo
Normal file
BIN
doc/locales/ja/lc_messages/twblue-changelog.mo
Normal file
Binary file not shown.
946
doc/locales/ja/lc_messages/twblue-changelog.po
Normal file
946
doc/locales/ja/lc_messages/twblue-changelog.po
Normal file
@@ -0,0 +1,946 @@
|
|||||||
|
# SOME DESCRIPTIVE TITLE.
|
||||||
|
# Copyright (C) YEAR ORGANIZATION
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: \n"
|
||||||
|
"POT-Creation-Date: 2018-08-07 13:19+Hora de verano central (Mexico)\n"
|
||||||
|
"PO-Revision-Date: 2018-08-08 19:52+0900\n"
|
||||||
|
"Last-Translator: \n"
|
||||||
|
"Language-Team: \n"
|
||||||
|
"Language: ja\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 2.1.1\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:3
|
||||||
|
msgid "TWBlue Changelog"
|
||||||
|
msgstr "TWBlue 更新履歴"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:4
|
||||||
|
msgid "## changes in this version"
|
||||||
|
msgstr "## changes in this version"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:5
|
||||||
|
msgid ""
|
||||||
|
"* Added an option in the global settings dialog to disable the Streaming "
|
||||||
|
"features of TWBlue. TWBlue will remove all Streaming features after August "
|
||||||
|
"16, so this option will give people an idea about how it will be. ([#219]"
|
||||||
|
"(https://github.com/manuelcortez/TWBlue/issues/219))"
|
||||||
|
msgstr ""
|
||||||
|
"* TWBlueのストリーミング機能を無効化するオプションを全般設定ダイアログに追"
|
||||||
|
"加。TWBlueは8月16日以降にすべてのストリーミング機能を削除するため、このオプ"
|
||||||
|
"ションは、その後どのようになるかを提供します。([#219](https://github.com/"
|
||||||
|
"manuelcortez/TWBlue/issues/219))"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:6
|
||||||
|
msgid ""
|
||||||
|
"* Due to Twitter API changes, Switched authorisation method to Pin-code "
|
||||||
|
"based authorisation. When you add new accounts to TWBlue, you will be "
|
||||||
|
"required to paste a code displayed in the Twitter website in order to grant "
|
||||||
|
"access to TWBlue. ([#216](https://github.com/manuelcortez/TWBlue/issues/216))"
|
||||||
|
msgstr ""
|
||||||
|
"* Twitter APIの変更により、PINコードベースでの認証に切り替え。TWBlueに新しい"
|
||||||
|
"アカウントを追加すると、TWBlueへのアクセスを許可するために、Twitterウェブサイ"
|
||||||
|
"トに表示されたコードを貼り付ける必要があります。 ([#216](https://github.com/"
|
||||||
|
"manuelcortez/TWBlue/issues/216))"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:7
|
||||||
|
msgid ""
|
||||||
|
"* In order to comply with latest Twitter changes, TWBlue has switched to the "
|
||||||
|
"new method used to send and receive direct messages, according to issue "
|
||||||
|
"[#215.](https://github.com/manuelcortez/twblue/issues/215)"
|
||||||
|
msgstr ""
|
||||||
|
"* Twitterの最新の変更に遵守するため、ダイレクトメッセージの送受信を新しい方法"
|
||||||
|
"に切り替え。( [#215.](https://github.com/manuelcortez/twblue/issues/215))"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:8
|
||||||
|
msgid ""
|
||||||
|
" * The sent direct messages buffer has been removed. All direct messages "
|
||||||
|
"will be placed in one buffer only. "
|
||||||
|
msgstr ""
|
||||||
|
" * 送信済みのダイレクトメッセージバッファは削除されました。すべてのダイレ"
|
||||||
|
"クトメッセージは、1つのバッファに表示されます。"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:9
|
||||||
|
msgid ""
|
||||||
|
" * The new method does not allow direct messages to be processed in real "
|
||||||
|
"time. Direct messages will be updated periodically."
|
||||||
|
msgstr ""
|
||||||
|
" * 新方式では、ダイレクトメッセージをリアルタイムで処理することはできませ"
|
||||||
|
"ん。ダイレクトメッセージは定期的に更新されます。"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:10
|
||||||
|
msgid ""
|
||||||
|
" * When sending a direct message, you will hear a sound if the message "
|
||||||
|
"has been sent properly, but the direct message will not be added to the "
|
||||||
|
"buffer inmediately."
|
||||||
|
msgstr ""
|
||||||
|
" * ダイレクトメッセージを送信するときは、メッセージが正しく送信されていれ"
|
||||||
|
"ばサウンドが聞こえますが、ダイレクトメッセージはすぐにバッファに追加されませ"
|
||||||
|
"ん。"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:11
|
||||||
|
msgid ""
|
||||||
|
"* After august 16 or when streaming is disabled, the events buffer will no "
|
||||||
|
"longer be created in TWBlue."
|
||||||
|
msgstr ""
|
||||||
|
"* 8月16日以降、またはストリーミングが無効になっていると、イベントバッファは"
|
||||||
|
"TWBlueで作成されなくなるように変更。"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:12
|
||||||
|
msgid ""
|
||||||
|
"* You can configure frequency for buffer updates in TWBlue. By default, "
|
||||||
|
"TWBlue will update all buffers every 2 minutes, but you can change this "
|
||||||
|
"setting in the global settings dialog. ([#223](https://github.com/"
|
||||||
|
"manuelcortez/TWBlue/issues/223))"
|
||||||
|
msgstr ""
|
||||||
|
"* TWBlueのバッファの更新の頻度を設定できるようにした。初期設定では、TWBlueは"
|
||||||
|
"すべてのバッファを2分ごとに更新しますが、全般設定ダイアログでこの設定を変更で"
|
||||||
|
"きます。([#223](https://github.com/manuelcortez/TWBlue/issues/223))"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:13
|
||||||
|
msgid ""
|
||||||
|
"* Added a new tab called feedback, in the account settings dialog. This tab "
|
||||||
|
"allows you to control wether automatic speech or Braille feedbak in certain "
|
||||||
|
"events (mentions and direct messages received) is enabled. Take into account "
|
||||||
|
"that this option will take preference over automatic reading of buffers and "
|
||||||
|
"any kind of automatic output. ([#203](https://github.com/manuelcortez/TWBlue/"
|
||||||
|
"issues/203))"
|
||||||
|
msgstr ""
|
||||||
|
"* アカウント設定ダイアログに新しく「フィードバック」タブを追加。このタブで"
|
||||||
|
"は、特定のイベント(受信したメンションとダイレクトメッセージ)の自動読み上げ"
|
||||||
|
"または点字でのフィードバックを有効化することができます。このオプションは、"
|
||||||
|
"バッファの自動読み上げとあらゆる種類の自動出力より優先されることを考慮してく"
|
||||||
|
"ださい。 ([#203](https://github.com/manuelcortez/TWBlue/issues/203))"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:14
|
||||||
|
msgid ""
|
||||||
|
"* The spell checking dialog now has access keys defined for the most "
|
||||||
|
"important actions. ([#211](https://github.com/manuelcortez/TWBlue/"
|
||||||
|
"issues/211))"
|
||||||
|
msgstr ""
|
||||||
|
"* スペルチェックダイアログに最も重要な動作のためのアクセスキーを追加。([#211]"
|
||||||
|
"(https://github.com/manuelcortez/TWBlue/issues/211))"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:15
|
||||||
|
msgid ""
|
||||||
|
"* TWBlue now Uses WXPython 4.0.1. This will allow us to migrate all "
|
||||||
|
"important components to Python 3 in the future. ([#207](https://github.com/"
|
||||||
|
"manuelcortez/TWBlue/issues/207))"
|
||||||
|
msgstr ""
|
||||||
|
"* TWBlueは、WXPython4.0.1を使用するようにした。これにより、将来すべての重要な"
|
||||||
|
"コンポーネントをPython 3に移行できます。([#207](https://github.com/"
|
||||||
|
"manuelcortez/TWBlue/issues/207))"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:16
|
||||||
|
msgid ""
|
||||||
|
"* When you quote a Tweet, if the original tweet was posted with Twishort, "
|
||||||
|
"TWBlue should display properly the quoted tweet. Before it was displaying "
|
||||||
|
"the original tweet only. ([#206](https://github.com/manuelcortez/TWBlue/"
|
||||||
|
"issues/206))"
|
||||||
|
msgstr ""
|
||||||
|
"* ツイートを引用すると、オリジナルのツイートがTwishortで投稿された場合、"
|
||||||
|
"TWBlueは引用されたツイートを適切に表示するようになった。([#206](https://"
|
||||||
|
"github.com/manuelcortez/TWBlue/issues/206))"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:17
|
||||||
|
msgid ""
|
||||||
|
"* It is possible to filter by retweets, quotes and replies when creating a "
|
||||||
|
"new filter."
|
||||||
|
msgstr ""
|
||||||
|
"* 新しいフィルタを作成する際、リツイートや引用、リプライでフィルタ出来るよう"
|
||||||
|
"になった。"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:18
|
||||||
|
msgid ""
|
||||||
|
"* Added support for playing youtube Links directly from the client. ([#94]"
|
||||||
|
"(https://github.com/manuelcortez/TWBlue/issues/94))"
|
||||||
|
msgstr ""
|
||||||
|
"* クライアントでYouTubeのリンクを直接再生することをサポートした。([#94]"
|
||||||
|
"(https://github.com/manuelcortez/TWBlue/issues/94))"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:19
|
||||||
|
msgid "* Replaced Bass with libVLC for playing URL streams."
|
||||||
|
msgstr "* URLストリームを再生するために、BassをlibVLCに置き換え。"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:20
|
||||||
|
msgid ""
|
||||||
|
"* the checkbox for indicating wether TWBlue will include everyone in a reply "
|
||||||
|
"or not, will be unchecked by default."
|
||||||
|
msgstr ""
|
||||||
|
"* TWBlueで全員にリプライするかどうかのチェックボックスを初期設定でチェックな"
|
||||||
|
"しにした。"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:21
|
||||||
|
msgid ""
|
||||||
|
"* You can request TWBlue to save the state for two checkboxes: Long tweet "
|
||||||
|
"and mention all, from the global settings dialogue."
|
||||||
|
msgstr ""
|
||||||
|
"* 「全員にリプライ」および「ツイートを短縮して投稿」のチェック状態を保持する"
|
||||||
|
"かどうかを全般設定ダイアログから変更できるようにした。"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:22
|
||||||
|
msgid ""
|
||||||
|
"* For windows 10 users, some keystrokes in the invisible user interface have "
|
||||||
|
"been changed or merged:"
|
||||||
|
msgstr ""
|
||||||
|
"* Windows10のユーザー向けにGUI非標示インターフェースでのキーストロークを変"
|
||||||
|
"更・マージ。"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:23
|
||||||
|
msgid ""
|
||||||
|
" * control+Windows+alt+F will be used for toggling between adding and "
|
||||||
|
"removing a tweet to user's likes. This function will execute the needed "
|
||||||
|
"action based in the current status for the focused tweet."
|
||||||
|
msgstr ""
|
||||||
|
" * Ctrl+Windows+Alt+Fは、ユーザーのツイートをいいね・いいね解除するために"
|
||||||
|
"利用されます。この機能は、フォーカスされたツイートの現在のステータスに基づい"
|
||||||
|
"て適切な動作を実行します。"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:24
|
||||||
|
msgid "* TWBlue will show an error if something goes wrong in an audio upload."
|
||||||
|
msgstr ""
|
||||||
|
"* 音声のアップロードで何か問題が生じた場合、TWBlueはエラーを表示するように"
|
||||||
|
"なった。"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:25
|
||||||
|
msgid ""
|
||||||
|
"* And more. ([#171,](https://github.com/manuelcortez/TWBlue/issues/171) "
|
||||||
|
msgstr "* など。([#171,](https://github.com/manuelcortez/TWBlue/issues/171) "
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:26
|
||||||
|
#, fuzzy
|
||||||
|
msgid "## Changes in version 0.93"
|
||||||
|
msgstr "## バージョン0.87での変更点"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:27
|
||||||
|
msgid ""
|
||||||
|
"* A new soundpack has been added to TWBlue. Thanks to [@ValeriaK305](https://"
|
||||||
|
"twitter.com/ValeriaK305)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:28
|
||||||
|
msgid ""
|
||||||
|
"* In the Windows 10 keymap, we have changed some default keystrokes as "
|
||||||
|
"windows now uses some previously assigned shortcuts:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:29
|
||||||
|
msgid " * For liking a tweet, press Control+Windows+alt+f"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:30
|
||||||
|
msgid " * for opening a trends buffer, press control+Windows+T"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:31
|
||||||
|
msgid ""
|
||||||
|
"* TWBlue has received improvements in some functions for handling extended "
|
||||||
|
"tweets, long tweets and quoted retweets. It should render some tweets in a "
|
||||||
|
"better way."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:32
|
||||||
|
msgid ""
|
||||||
|
"* In the spell checker module, there is a new button that will allow you to "
|
||||||
|
"add your own words to your personal dictionary so the module won't mark them "
|
||||||
|
"as mispelled the next time you will check spelling."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:33
|
||||||
|
msgid ""
|
||||||
|
"* Added filtering capabilities to TWBlue. ([#102](https://github.com/"
|
||||||
|
"manuelcortez/TWBlue/issues/102))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:34
|
||||||
|
msgid ""
|
||||||
|
" * You can create a filter for the current buffer from the buffer menu in "
|
||||||
|
"the menu bar. At this moment, invisible interface does not have any shorcut "
|
||||||
|
"for this."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:35
|
||||||
|
msgid " * You can create filters by word or languages."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:36
|
||||||
|
msgid ""
|
||||||
|
" * For deleting already created filters, you can go to the filter manager "
|
||||||
|
"in the buffer menu and delete the filters you won't need."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:37
|
||||||
|
msgid ""
|
||||||
|
"* Links should be opened properly in quoted tweets ([#167,](https://github."
|
||||||
|
"com/manuelcortez/TWBlue/issues/167) [#184](https://github.com/manuelcortez/"
|
||||||
|
"TWBlue/issues/184))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:38
|
||||||
|
msgid ""
|
||||||
|
"* Increased display name limit up to 50 characters in update profile dialog."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:39
|
||||||
|
msgid ""
|
||||||
|
"* When authorising an account, you will see a dialogue with a cancel button, "
|
||||||
|
"in case you want to abort the process. Also, NVDA will not be blocked when "
|
||||||
|
"the process starts. ([#101](https://github.com/manuelcortez/TWBlue/"
|
||||||
|
"issues/101))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:40
|
||||||
|
msgid ""
|
||||||
|
"* In the translator module, the list of available languages is fetched "
|
||||||
|
"automatically from the provider. That means all of these languages will work "
|
||||||
|
"and there will not be inconsistencies. Also we've removed the first combo "
|
||||||
|
"box, because the language is detected automatically by Yandex'S API. ([#153]"
|
||||||
|
"(https://github.com/manuelcortez/TWBlue/issues/153))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:41
|
||||||
|
msgid ""
|
||||||
|
"* Trending topics, searches and conversation buffers will use mute settings "
|
||||||
|
"set for the session in wich they were opened. ([#157](https://github.com/"
|
||||||
|
"manuelcortez/TWBlue/issues/157))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:42
|
||||||
|
msgid ""
|
||||||
|
"* The Tweet limit is now 280 characters lenght instead 140. It means you can "
|
||||||
|
"tweet longer tweets. ([#172](https://github.com/manuelcortez/TWBlue/"
|
||||||
|
"issues/172))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:43
|
||||||
|
msgid ""
|
||||||
|
"* Per popular request, Status for mention to all and long tweet checkboxes "
|
||||||
|
"will not be saved in settings. ([#170](https://github.com/manuelcortez/"
|
||||||
|
"TWBlue/issues/170))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:44
|
||||||
|
msgid ""
|
||||||
|
"* Fixed a problem that was making TWBlue unable to start if it was being ran "
|
||||||
|
"in Windows with Serbian language. ([#175](https://github.com/manuelcortez/"
|
||||||
|
"TWBlue/issues/175))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:45
|
||||||
|
#, fuzzy
|
||||||
|
msgid "* Added Danish translation."
|
||||||
|
msgstr "* 翻訳を更新。"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:46
|
||||||
|
msgid ""
|
||||||
|
"* And more. ([#156,](https://github.com/manuelcortez/TWBlue/issues/156) "
|
||||||
|
"[#163,](https://github.com/manuelcortez/TWBlue/issues/163) [#159,](https://"
|
||||||
|
"github.com/manuelcortez/TWBlue/issues/159) [#173,](https://github.com/"
|
||||||
|
"manuelcortez/TWBlue/issues/173) [#174,](https://github.com/manuelcortez/"
|
||||||
|
"TWBlue/issues/174) [#176,](https://github.com/manuelcortez/TWBlue/"
|
||||||
|
"issues/176))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:47
|
||||||
|
#, fuzzy
|
||||||
|
msgid "## changes in version 0.91 and 0.92"
|
||||||
|
msgstr "## バージョン0.82および0.83での変更点"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:48
|
||||||
|
msgid ""
|
||||||
|
"* Fixed incorrect unicode handling when copying tweet to clipboard. ([#150]"
|
||||||
|
"(https://github.com/manuelcortez/TWBlue/issues/150))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:49
|
||||||
|
msgid ""
|
||||||
|
"* TWBlue will show an error when trying to open a timeline for a suspended "
|
||||||
|
"user. ([#128](https://github.com/manuelcortez/TWBlue/issues/128))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:50
|
||||||
|
msgid ""
|
||||||
|
"* Removed TwUp as service as it no longer exists. ([#112](https://github.com/"
|
||||||
|
"manuelcortez/TWBlue/issues/112))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:51
|
||||||
|
msgid ""
|
||||||
|
"* Release audio files after uploading them. ([#130](https://github.com/"
|
||||||
|
"manuelcortez/TWBlue/issues/130))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:52
|
||||||
|
msgid ""
|
||||||
|
"* Now TWBlue will use Yandex's translation services instead microsoft "
|
||||||
|
"translator. ([#132](https://github.com/manuelcortez/TWBlue/issues/132))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:53
|
||||||
|
msgid ""
|
||||||
|
"* SndUp users will be able to upload audio in their account by using their "
|
||||||
|
"API Key again. ([#134](https://github.com/manuelcortez/TWBlue/issues/134))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:54
|
||||||
|
msgid ""
|
||||||
|
"* old tweets shouldn't be added as new items in buffers. ([#116,](https://"
|
||||||
|
"github.com/manuelcortez/TWBlue/issues/116)) ([#133](https://github.com/"
|
||||||
|
"manuelcortez/TWBlue/issues/133))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:55
|
||||||
|
msgid ""
|
||||||
|
"* All mentionned users should be displayed correctly in Twishort's long "
|
||||||
|
"tweets. ([#116,](https://github.com/manuelcortez/TWBlue/issues/116)) ([#135]"
|
||||||
|
"(https://github.com/manuelcortez/TWBlue/issues/135))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:56
|
||||||
|
msgid ""
|
||||||
|
"* It is possible to select a language for OCR service from the extras panel, "
|
||||||
|
"in the account settings dialogue. You can, however, set this to detect "
|
||||||
|
"automatically. OCR should work better in languages with special characters "
|
||||||
|
"or non-english symbols. ([#107](https://github.com/manuelcortez/TWBlue/"
|
||||||
|
"issues/107))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:57
|
||||||
|
msgid ""
|
||||||
|
"* Fixed a problem with JAWS for Windows and TWBlue. Now JAWS will work "
|
||||||
|
"normally in this update. [#100](https://github.com/manuelcortez/twblue/"
|
||||||
|
"issues/100)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:58
|
||||||
|
msgid "* And more ([#136,](https://github.com/manuelcortez/TWBlue/issues/136))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:59
|
||||||
|
#, fuzzy
|
||||||
|
msgid "## Changes in version 0.90"
|
||||||
|
msgstr "## バージョン0.87での変更点"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:60
|
||||||
|
msgid ""
|
||||||
|
"* Fixed a bug in long tweet parsing that was making TWBlue to disconnect the "
|
||||||
|
"streaming API. ([#103](https://github.com/manuelcortez/TWBlue/issues/103))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:61
|
||||||
|
msgid ""
|
||||||
|
"* Now OCR will work in images from retweets. It fixes a bug where TWBlue was "
|
||||||
|
"detecting images but couldn't apply OCR on them. ([#105](https://github.com/"
|
||||||
|
"manuelcortez/TWBlue/issues/105))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:62
|
||||||
|
msgid ""
|
||||||
|
"* TWBlue won't try to load tweets already deleted, made with Twishort. "
|
||||||
|
"Before, if someone posted a long tweet but deleted it in the Twishort's "
|
||||||
|
"site, TWBlue was trying to load the tweet and it was causing problems in all "
|
||||||
|
"the client. ([#113](https://github.com/manuelcortez/TWBlue/issues/113))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:63
|
||||||
|
msgid ""
|
||||||
|
"* TWBlue shows an error message when you try to view the profile of an user "
|
||||||
|
"that does not exist or has been suspended. ([#114,](https://github.com/"
|
||||||
|
"manuelcortez/TWBlue/issues/114) [#115](https://github.com/manuelcortez/"
|
||||||
|
"TWBlue/issues/115))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:64
|
||||||
|
msgid ""
|
||||||
|
"* The spellchecker module should select the right language when is set to "
|
||||||
|
"\"user default\". ([#117](https://github.com/manuelcortez/TWBlue/issues/117))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:65
|
||||||
|
msgid ""
|
||||||
|
"* Image description will be displayed in retweets too. ([#119](https://"
|
||||||
|
"github.com/manuelcortez/TWBlue/issues/119))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:66
|
||||||
|
msgid ""
|
||||||
|
"* When reading a long tweet, you shouldn't read strange entities anymore. "
|
||||||
|
"([#118](https://github.com/manuelcortez/twblue/issues/118))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:67
|
||||||
|
msgid ""
|
||||||
|
"* TWBlue will not try to load timelines if the user is blocking you. ([#125]"
|
||||||
|
"(https://github.com/manuelcortez/twblue/issues/125))"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:68
|
||||||
|
#, fuzzy
|
||||||
|
msgid "## Changes in version 0.88 and 0.89"
|
||||||
|
msgstr "## バージョン0.82および0.83での変更点"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:69
|
||||||
|
msgid "* Fixed more issues with streams and reconnections."
|
||||||
|
msgstr "* ストリームと再接続に関するその他の問題を修正。"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:70
|
||||||
|
msgid "* newer updates will indicate the release date in the updater."
|
||||||
|
msgstr "* アップデータでリリース日を通知するように変更。"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:71
|
||||||
|
msgid ""
|
||||||
|
"* Changes to keystrokes are reflected in keystroke editor automatically."
|
||||||
|
msgstr ""
|
||||||
|
"* 変更したキーストロークがキーストロークエディタに反映されるように変更。"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:72
|
||||||
|
msgid ""
|
||||||
|
"* In replies with multiple users, if the mention to all checkbox is "
|
||||||
|
"unchecked, you will see a checkbox per user so you will be able to control "
|
||||||
|
"who will be mentioned in the reply."
|
||||||
|
msgstr ""
|
||||||
|
"* リプライに複数のユーザーが含まれている場合に、「全員にメンション」がチェッ"
|
||||||
|
"クされていないとき、ユーザーごとにチェックボックスを表示し、誰に返信するか制"
|
||||||
|
"御できるようにした。"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:73
|
||||||
|
msgid ""
|
||||||
|
"* Fixed a bug that caused duplicated user mentions in replies when the tweet "
|
||||||
|
"was made with Twishort."
|
||||||
|
msgstr ""
|
||||||
|
"* 返信時にTwishortを利用してツイートを作成した際に、ユーザーが重複していたバ"
|
||||||
|
"グを修正。"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:74
|
||||||
|
msgid ""
|
||||||
|
"* Retweets should be displayed normally again when the originating tweet is "
|
||||||
|
"a Twishort's long tweet."
|
||||||
|
msgstr ""
|
||||||
|
"* 元のツイートがTwishortで作成した長いツイートのとき、リツイートが正常に表示"
|
||||||
|
"されるように修正。"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:75
|
||||||
|
msgid ""
|
||||||
|
"* Changed the way TWBlue saves user timelines in configuration. Now it uses "
|
||||||
|
"user IDS instead usernames. With user IDS, if an user changes the username, "
|
||||||
|
"TWBlue still will create his/her timeline. This was not possible by using "
|
||||||
|
"usernames."
|
||||||
|
msgstr ""
|
||||||
|
"* ユーザータイムラインの設定の保存方法を変更。ユーザー名の代わりにユーザーID"
|
||||||
|
"を利用しています。ユーザーIDで保存することにより、ユーザー名を変えてもタイム"
|
||||||
|
"ラインを作成することができます。ユーザー名を利用した場合は、これはできません"
|
||||||
|
"でした。"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:76
|
||||||
|
msgid ""
|
||||||
|
"* Added a new setting in the account settings dialogue that makes TWBlue to "
|
||||||
|
"show twitter usernames instead the full name."
|
||||||
|
msgstr ""
|
||||||
|
"* アカウント設定ダイアログにTWBlueが表示名の代わりにユーザー名を表示する項目"
|
||||||
|
"を追加。"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:77
|
||||||
|
msgid ""
|
||||||
|
"* Added OCR in twitter pictures. There is a new item in the tweet menu that "
|
||||||
|
"allows you to extract and display text in images. Also the keystroke alt+Win"
|
||||||
|
"+o has been added for the same purpose from the invisible interface."
|
||||||
|
msgstr ""
|
||||||
|
"* ツイートに添付された画像をOCRする機能を追加。ツイートメニュー内に画像内のテ"
|
||||||
|
"キストを抽出して表示する項目を追加しました。また、GUI非表示インターフェイス"
|
||||||
|
"で、ALT + Windows + Oでもこの機能を実行することができます。"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:78
|
||||||
|
msgid "* Now TWBlue will play a sound when the focused tweet contains images."
|
||||||
|
msgstr "* 画像付きツイートを音声で通知するようにした。"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:79
|
||||||
|
msgid ""
|
||||||
|
"* Your own quoted tweets will not appear in the mentions buffer anymore."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:80
|
||||||
|
msgid ""
|
||||||
|
"* The config file is saved in a different way, it should fix the bug where "
|
||||||
|
"TWBlue needs to be restarted after the config folder is deleted."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:81
|
||||||
|
msgid "* Mentioning people from friends or followers buffers works again."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:82
|
||||||
|
msgid ""
|
||||||
|
"* Support for proxy servers has been improved. Now TWBlue supports http, "
|
||||||
|
"https, socks4 and socks5 proxies, with and without autentication."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:83
|
||||||
|
msgid "## Changes in version 0.87"
|
||||||
|
msgstr "## バージョン0.87での変更点"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:84
|
||||||
|
msgid "* Fixed stream connection errors."
|
||||||
|
msgstr "* ストリーム接続時のエラーを修正。"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:85
|
||||||
|
msgid ""
|
||||||
|
"* Now TWBlue can handle properly a reply to the sender without including all "
|
||||||
|
"other mentioned users."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:86
|
||||||
|
msgid "* Updated translations."
|
||||||
|
msgstr "* 翻訳を更新。"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:87
|
||||||
|
msgid ""
|
||||||
|
"* The status of the mention to all checkbox will be remembered the next time "
|
||||||
|
"you reply to multiple users."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:88
|
||||||
|
msgid "## Changes in version 0.86"
|
||||||
|
msgstr "## バージョン0.86での変更点"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:89
|
||||||
|
msgid ""
|
||||||
|
"* Fixed a very important security issue. Now TWBlue will send tweets to "
|
||||||
|
"twishort without using any other server."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:90
|
||||||
|
msgid ""
|
||||||
|
"* When you add a comment to a tweet, it will be sent as a quoted tweet, even "
|
||||||
|
"if your reply plus the original tweet is not exceeding 140 characters."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:91
|
||||||
|
msgid ""
|
||||||
|
"* Updated windows 10 keymap for reflecting changes made in the last windows "
|
||||||
|
"10 build."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:92
|
||||||
|
msgid "* Added last changes in the twitter API."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:93
|
||||||
|
msgid ""
|
||||||
|
"* When replying, it will not show the twitter username in the text box. When "
|
||||||
|
"you send the tweet, the username will be added automatically."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:94
|
||||||
|
msgid ""
|
||||||
|
"* When replying to multiple users, you'll have a checkbox instead a button "
|
||||||
|
"for mentioning all people. If this is checked, twitter usernames will be "
|
||||||
|
"added automatically when you send your reply."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:95
|
||||||
|
msgid "## Changes in version 0.85"
|
||||||
|
msgstr "## バージョン0.85での変更点"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:96
|
||||||
|
msgid "* Long and quoted tweets should be displayed properly In lists."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:97
|
||||||
|
msgid "* The connection should be more stable."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:98
|
||||||
|
msgid "* Added an autostart option in the global settings dialogue."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:99
|
||||||
|
msgid "* Updated translation."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:100
|
||||||
|
msgid "* Updated russian documentation."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:101
|
||||||
|
msgid "* Tweets in cached database should be loaded properly."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:102
|
||||||
|
msgid "* Added some missed dictionaries for spelling correction."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:103
|
||||||
|
msgid ""
|
||||||
|
"* Timelines, lists and other buffer should be created in the right order at "
|
||||||
|
"startup."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:104
|
||||||
|
msgid "## Changes in version 0.84 "
|
||||||
|
msgstr "## バージョン0.84での変更点"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:105
|
||||||
|
msgid "* More improvements in quoted and long tweets."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:106
|
||||||
|
msgid ""
|
||||||
|
"* Updated translations: Russian, Italian, French, Romanian, Galician and "
|
||||||
|
"Finnish."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:107
|
||||||
|
msgid ""
|
||||||
|
"* Improvements in the audio uploader module: Now it can handle audio with "
|
||||||
|
"non-english characters."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:108
|
||||||
|
msgid ""
|
||||||
|
"* the title of the window should be updated properly when spellcheck, "
|
||||||
|
"translate or shorten/unshorten URL buttons are pressed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:109
|
||||||
|
msgid ""
|
||||||
|
"* the bug that changes the selected tweet in the home timeline shouldn't be "
|
||||||
|
"happening so often."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:110
|
||||||
|
msgid "## Changes in version 0.82 and 0.83"
|
||||||
|
msgstr "## バージョン0.82および0.83での変更点"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:111
|
||||||
|
msgid ""
|
||||||
|
"* If the tweet source (client) is an application with unicode characters "
|
||||||
|
"(example: российская газета) it will not break the tweet displayer."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:112
|
||||||
|
msgid ""
|
||||||
|
"* Added a new field for image description in tweet displayer. When "
|
||||||
|
"available, it will show description for images posted in tweets."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:113
|
||||||
|
msgid ""
|
||||||
|
"* users can add image descriptions to their photos. When uploading an image, "
|
||||||
|
"a dialog will show for asking a description."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:114
|
||||||
|
msgid "* Redesigned upload image dialog."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:115
|
||||||
|
msgid "* Fixed photo uploads when posting tweets."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:116
|
||||||
|
msgid ""
|
||||||
|
"* When getting tweets for a conversation, ignores deleted tweets or some "
|
||||||
|
"errors, now TWBlue will try to get as much tweets as possible, even if some "
|
||||||
|
"of these are no longer available."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:117
|
||||||
|
msgid "* Added audio playback from soundcloud."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:118
|
||||||
|
msgid "* Now the session mute option don't makes the screen reader speaks."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:119
|
||||||
|
msgid "* Fixed the direct message dialog. Now it should be displayed properly."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:120
|
||||||
|
msgid ""
|
||||||
|
"* when a tweet is deleted in twitter, TWBlue should reflect this change and "
|
||||||
|
"delete that tweet in every buffer it is displayed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:121
|
||||||
|
msgid ""
|
||||||
|
"* If your session is broken, TWBlue will be able to remove it automatically "
|
||||||
|
"instead just crashing."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:122
|
||||||
|
msgid "* audio uploader should display the current progress."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:123
|
||||||
|
msgid ""
|
||||||
|
"* users can disable the check for updates feature at startup from the "
|
||||||
|
"general tab, in the global settings dialogue."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:124
|
||||||
|
msgid ""
|
||||||
|
"* The invisible interface and the window should be synchronized when the "
|
||||||
|
"client reconnects."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:125
|
||||||
|
msgid "* The documentation option in the systray icon should be enabled."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:126
|
||||||
|
msgid ""
|
||||||
|
"* In trending buffers, you can press enter for posting a tweet about the "
|
||||||
|
"focused trend."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:127
|
||||||
|
msgid ""
|
||||||
|
"* Updated russian documentation and main program interface (thanks to "
|
||||||
|
"Natalia Hedlund (Наталья Хедлунд), [@lifestar_n](https://twitter.com/"
|
||||||
|
"lifestar_n) in twitter)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:128
|
||||||
|
msgid "* updated translations."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:129
|
||||||
|
msgid "## Changes in Version 0.81"
|
||||||
|
msgstr "## バージョン0.81での変更点"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:130
|
||||||
|
msgid "* Updated translations"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:131
|
||||||
|
msgid ""
|
||||||
|
"* The updater module has received some improvements. Now it includes a "
|
||||||
|
"Mirror URL for checking updates if the main URL is not available at the "
|
||||||
|
"moment. If something is wrong and both locations don't work, the program "
|
||||||
|
"will start anyway."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:132
|
||||||
|
msgid "* some GUI elements now use keyboard shortcuts for common actions."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:133
|
||||||
|
msgid "* fixed a bug in the geolocation dialog."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:134
|
||||||
|
msgid "* the chicken nugget keymap should work properly."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:135
|
||||||
|
msgid ""
|
||||||
|
"* Added a new soundpack to the default installation of TWBlue, thanks to "
|
||||||
|
"[@Deng90](https://twitter.com/deng90)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:136
|
||||||
|
msgid "* Now the changelog is written in an html File."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:137
|
||||||
|
msgid ""
|
||||||
|
"* Added some missed dictionaries in last version for the spell checking "
|
||||||
|
"feature."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:138
|
||||||
|
msgid ""
|
||||||
|
"* Trimmed the beginnings of the sounds in the default soundpack. Thanks to "
|
||||||
|
"[@masonasons](https://github.com/masonasons)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:139
|
||||||
|
msgid ""
|
||||||
|
"* Added Opus support for sound playback in TWBlue. Thanks to [@masonasons]"
|
||||||
|
"(https://github.com/masonasons)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:140
|
||||||
|
msgid ""
|
||||||
|
"* Added a source field in view tweet dialogue. Thanks to [@masonasons]"
|
||||||
|
"(https://github.com/masonasons)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:141
|
||||||
|
msgid ""
|
||||||
|
"* You can load previous items in followers and friend buffers for others."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:142
|
||||||
|
msgid ""
|
||||||
|
"* The Spell Checker dialogue should not display an error message when you "
|
||||||
|
"have set \"default language\" in the global settings dialogue if your "
|
||||||
|
"language is supported [#168](http://twblue.es/bugs/view.php?id=168)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:143
|
||||||
|
msgid "* Updated romanian translation."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:144
|
||||||
|
msgid "* Some code cleanups."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:145
|
||||||
|
msgid "* The bug reports feature is fully operational again."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:146
|
||||||
|
msgid ""
|
||||||
|
"* TWBlue should work again for users that contains special characters in "
|
||||||
|
"windows usernames."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:147
|
||||||
|
msgid "* Added more options for the tweet searches."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:148
|
||||||
|
msgid "* Added play_audio to the keymap editor."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:149
|
||||||
|
msgid "* Windows key is no longer required in the keymap editor"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:150
|
||||||
|
msgid "* Switched to the Microsoft translator."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:151
|
||||||
|
msgid ""
|
||||||
|
"* You can update the current buffer by pressing ctrl+win+shift+u in the "
|
||||||
|
"default keymap or in the buffer menu."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:152
|
||||||
|
msgid "* Changed some keystrokes in the windows 10 default keymap"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:153
|
||||||
|
msgid "* New followers and friends buffer for user timelines."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:154
|
||||||
|
msgid "---"
|
||||||
|
msgstr "---"
|
||||||
|
|
||||||
|
#: ../doc/changelog.py:155
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Copyright © 2014-2017, Manuel Cortez."
|
||||||
|
msgstr "Copyright © 2014-2016, Manuel Cortez."
|
||||||
|
|
||||||
|
#~ msgid "\\357\\273\\277TWBlue Changelog"
|
||||||
|
#~ msgstr "\\357\\273\\277TWBlue 更新履歴"
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
BIN
doc/locales/ro/LC_MESSAGES/twblue-changelog.mo
Normal file
BIN
doc/locales/ro/LC_MESSAGES/twblue-changelog.mo
Normal file
Binary file not shown.
1145
doc/locales/ro/LC_MESSAGES/twblue-changelog.po
Normal file
1145
doc/locales/ro/LC_MESSAGES/twblue-changelog.po
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
BIN
doc/locales/ru/lc_messages/twblue-changelog.mo
Normal file
BIN
doc/locales/ru/lc_messages/twblue-changelog.mo
Normal file
Binary file not shown.
1140
doc/locales/ru/lc_messages/twblue-changelog.po
Normal file
1140
doc/locales/ru/lc_messages/twblue-changelog.po
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,4 @@
|
|||||||
Documentation for TWBlue - 0.84
|
Documentation for TWBlue - 0.88
|
||||||
|
|
||||||
## Table of contents
|
## Table of contents
|
||||||
|
|
||||||
@@ -15,7 +15,7 @@ If you want to see what has changed from the previous version, [read the list of
|
|||||||
TWBlue is an application to make Twitter simple and fast, while using as few resources as possible. With TWBlue, you can do things like the following:
|
TWBlue is an application to make Twitter simple and fast, while using as few resources as possible. With TWBlue, you can do things like the following:
|
||||||
|
|
||||||
* Tweet, reply to, retweet and delete tweets,
|
* Tweet, reply to, retweet and delete tweets,
|
||||||
* Mark and unmark a tweet as favourite,
|
* Like and unlike a tweet,
|
||||||
* Send and delete direct messages,
|
* Send and delete direct messages,
|
||||||
* See your friends and followers,
|
* See your friends and followers,
|
||||||
* Follow, unfollow, report and block a user,
|
* Follow, unfollow, report and block a user,
|
||||||
@@ -26,7 +26,7 @@ TWBlue is an application to make Twitter simple and fast, while using as few res
|
|||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
Twitter is a social networking or micro-blogging tool which allows you to compose short status updates of your activities in 140 characters or less. Twitter is a way for friends, family and co-workers to communicate and stay connected through the exchange of quick, frequent messages. You can restrict delivery of updates to those in your circle of friends or, by default, allow anyone to access them.
|
Twitter is a social networking or micro-blogging tool which allows you to compose short status updates of your activities in 280 characters or less. Twitter is a way for friends, family and co-workers to communicate and stay connected through the exchange of quick, frequent messages. You can restrict delivery of updates to those in your circle of friends or, by default, allow anyone to access them.
|
||||||
|
|
||||||
You can monitor the status of updates from your friends, family or co-workers (known as following), and they in turn can read any updates you create, (known as followers). The updates are referred to as Tweets. The Tweets are posted to your Twitter profile or Blog and are searchable using Twitter Search.
|
You can monitor the status of updates from your friends, family or co-workers (known as following), and they in turn can read any updates you create, (known as followers). The updates are referred to as Tweets. The Tweets are posted to your Twitter profile or Blog and are searchable using Twitter Search.
|
||||||
|
|
||||||
@@ -65,14 +65,14 @@ The following is a description for every one of TWBlue's buffers and the kind of
|
|||||||
* Direct messages: here you will find the private direct messages you exchange with users who follow you , or with any user, if you allow direct messages from everyone (this setting is configurable from Twitter). This list only shows received messages.
|
* Direct messages: here you will find the private direct messages you exchange with users who follow you , or with any user, if you allow direct messages from everyone (this setting is configurable from Twitter). This list only shows received messages.
|
||||||
* Sent direct messages: this buffer shows all the direct messages sent from your account.
|
* Sent direct messages: this buffer shows all the direct messages sent from your account.
|
||||||
* Sent tweets: this shows all the tweets sent from your account.
|
* Sent tweets: this shows all the tweets sent from your account.
|
||||||
* Favourites: here you will see all the tweets you have favourited.
|
* Likes: here you will see all the tweets you have liked.
|
||||||
* Followers: when users follow you, you'll be able to see them on this buffer, with some of their account details.
|
* Followers: when users follow you, you'll be able to see them on this buffer, with some of their account details.
|
||||||
* Friends: the same as the previous buffer, but these are the users you follow.
|
* Friends: the same as the previous buffer, but these are the users you follow.
|
||||||
* User timelines: these are buffers you may create. They contain only the tweets by a specific user. They're used so you can see the tweets by a single person and you don't want to look all over your timeline. You may create as many as you like.
|
* User timelines: these are buffers you may create. They contain only the tweets by a specific user. They're used so you can see the tweets by a single person and you don't want to look all over your timeline. You may create as many as you like.
|
||||||
* Events: An event is anything that happens on Twitter, such as when someone follows you, when someone adds or removes one of your tweets from their favourites list, or when you subscribe to a list. There are many more, but 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.
|
* Events: An event is anything that happens on Twitter, such as when someone follows you, when someone adds or removes one of your tweets from their likes list, or when you subscribe to a list. There are many more, but 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.
|
||||||
* Lists: A list is similar to a user timeline, except that you can configure it to contain tweets from multiple users.
|
* Lists: A list is similar to a user timeline, except that you can configure it to contain tweets from multiple users.
|
||||||
* Search: A search buffer contains the results of a search operation.
|
* Search: A search buffer contains the results of a search operation.
|
||||||
* User favourites: You can have the program create a buffer containing tweets favourited by a particular user.
|
* User likes: You can have the program create a buffer containing tweets liked by a particular user.
|
||||||
* Trending Topics: a trend buffer shows the top ten most used terms in a geographical region. This region may be a country or a city. Trends are updated every five minutes.
|
* Trending Topics: a trend buffer shows the top ten most used terms in a geographical region. This region may be a country or a city. Trends are updated every five minutes.
|
||||||
|
|
||||||
If a tweet contains a URL, you can press enter in the GUI or Control + Windows + Enter in the invisible interface to open it. If it contains audio, you can press Control + Enter or Control + Windows + Alt + Enter to play it, respectively. TWBlue will play a sound if the tweet contains the \#audio hashtag, but there may be tweets which contain audio without this. Finally, if a tweet contains geographical information, you can press Control + Windows + G in the invisible interface to retrieve it.
|
If a tweet contains a URL, you can press enter in the GUI or Control + Windows + Enter in the invisible interface to open it. If it contains audio, you can press Control + Enter or Control + Windows + Alt + Enter to play it, respectively. TWBlue will play a sound if the tweet contains the \#audio hashtag, but there may be tweets which contain audio without this. Finally, if a tweet contains geographical information, you can press Control + Windows + G in the invisible interface to retrieve it.
|
||||||
@@ -87,7 +87,7 @@ These fields accept a Twitter username (without the at sign) as the input. They
|
|||||||
|
|
||||||
The graphical user interface of TWBlue consists of a window containing:
|
The graphical user interface of TWBlue consists of a window containing:
|
||||||
|
|
||||||
* a menu bar accomodating five menus (application, tweet, user, buffer and help);
|
* a menu bar accomodating six menus (application, tweet, user, buffer, audio and help);
|
||||||
* One tree view,
|
* One tree view,
|
||||||
* One list of items
|
* One list of items
|
||||||
* Four buttons in most dialogs: Tweet, retweet , reply and direct message.
|
* Four buttons in most dialogs: Tweet, retweet , reply and direct message.
|
||||||
@@ -98,16 +98,16 @@ In summary, the GUI contains two core components. These are the controls you wil
|
|||||||
|
|
||||||
#### Buttons in the application
|
#### Buttons in the application
|
||||||
|
|
||||||
* Tweet: this button opens up a dialogue box to write your tweet. The message must not exceed 140 characters. If you write past this limit, a sound will play to warn you. Note that the character count is displayed in the title bar. You may use the shorten and expand URL buttons to comply with the character limit. You can upload a picture, check spelling, attach audio or translate your message by selecting one of the available buttons in the dialogue box. In addition, you can autocomplete the entering of users by pressing Alt + A or the button for that purpose if you have the database of users configured. Press enter to send the tweet. If all goes well, you'll hear a sound confirming it. Otherwise, the screen reader will speak an error message in English describing the problem.
|
* Tweet: this button opens up a dialogue box to write your tweet. Normal tweets must not exceed 280 characters. However you can press the long tweet checkbox and your tweet will be posted throught Twishort, wich will allow you to write longer tweets (10000 characters). If you write past this limit, a sound will play to warn you. Note that the character count is displayed in the title bar. You may use the shorten and expand URL buttons to comply with the character limit. You can upload a picture, check spelling, attach audio or translate your message by selecting one of the available buttons in the dialogue box. In addition, you can autocomplete the entering of users by pressing Alt + C or the button for that purpose if you have the database of users configured. Press enter to send the tweet. If all goes well, you'll hear a sound confirming it. Otherwise, the screen reader will speak an error message in English describing the problem.
|
||||||
* Retweet: this button retweets the message you're reading. After you press it, if you haven't configured the application not to do so, you'll be asked if you want to add a comment or simply send it as written. If you choose to add a comment, and if the original tweet plus the comment exceeds 140 characters, you will be asked if you want to post it as a comment with a mention to the original user and a link to the originating tweet.
|
* Retweet: this button retweets the message you're reading. After you press it, if you haven't configured the application not to do so, you'll be asked if you want to add a comment or simply send it as written. If you choose to add a comment, it will post a quoted tweet, that is, the comment with a link to the originating tweet.
|
||||||
* Reply: when you're viewing a tweet, you can reply to the user who sent it by pressing this button. A dialogue will open up similar to the one for tweeting, but with the name of the user already filled in (for example @user) so you only need to write your message. If there are more users referred to in the tweet, you can press shift-tab and activate the mention all users button. When you're on the friends or followers lists, the button will be called mention instead.
|
* Reply: when you're viewing a tweet, you can reply to the user who sent it by pressing this button. A dialogue will open up similar to the one for tweeting. If there are more users referred to in the tweet, you can press tab and activate the mention to all checkbox, or enabling checkbox for the users you want to mention separately. When you're on the friends or followers lists, the button will be called mention instead.
|
||||||
* Direct message: exactly like sending a tweet, but it's a private message which can only be read by the user you send it to. Press shift-tab to see the recipient. If there were other users mentioned in the tweet you were reading, you can arrow up or down to choose which one to send it to, or write the username yourself without the at sign.
|
* Direct message: exactly like sending a tweet, but it's a private message which can only be read by the user you send it to. Press shift-tab twice to see the recipient. If there were other users mentioned in the tweet you were reading, you can arrow up or down to choose which one to send it to, or write the username yourself without the at sign. In addition, you can autocomplete the entering of users by pressing Alt + C or the button for that purpose if you have the database of users configured.
|
||||||
|
|
||||||
Bear in mind that buttons will appear according to which actions are possible on the list you are browsing. For example, on the home timeline, mentions, sent, favourites and user timelines you will see the four buttons, while on the direct messages list you'll only get the direct message and tweet buttons, and on friends and followers lists the direct message, tweet, and mention buttons will be available.
|
Bear in mind that buttons will appear according to which actions are possible on the list you are browsing. For example, on the home timeline, mentions, sent, likes and user timelines you will see the four buttons, while on the direct messages list you'll only get the direct message and tweet buttons, and on friends and followers lists the direct message, tweet, and mention buttons will be available.
|
||||||
|
|
||||||
#### Menus
|
#### Menus
|
||||||
|
|
||||||
Visually, Towards the top of the main application window, can be found a menu bar which contains many of the same functions as listed in the previous section, together with some additional items. To access the menu bar, press the alt key. You will find five menus listed: application, tweet, user, buffer and help. This section describes the items on each one of them.
|
Visually, Towards the top of the main application window, can be found a menu bar which contains many of the same functions as listed in the previous section, together with some additional items. To access the menu bar, press the alt key. You will find six menus listed: application, tweet, user, buffer, audio and help. This section describes the items on each one of them.
|
||||||
|
|
||||||
##### Application menu
|
##### Application menu
|
||||||
|
|
||||||
@@ -124,11 +124,12 @@ Visually, Towards the top of the main application window, can be found a menu ba
|
|||||||
##### Tweet menu
|
##### Tweet menu
|
||||||
|
|
||||||
* You will first find the items to tweet, reply and retweet, which are equivalent to the buttons with the same name.
|
* You will first find the items to tweet, reply and retweet, which are equivalent to the buttons with the same name.
|
||||||
* Add to favourites: marks the tweet you're viewing as a favourite.
|
* Like: Adds the tweet you're viewing to your likes list.
|
||||||
* Remove from favourites: removes the tweet from your favourites, but not from Twitter.
|
* Unlike: removes the tweet from your likes, but not from Twitter.
|
||||||
* Show tweet: opens up a dialogue box where you can read the tweet, direct message, friend or follower which has focus. You can read the text with the arrow keys. It's a similar dialog box as used for composing tweets, without the ability to send the tweet, file attachment and autocompleting capabilities. It does however include a retweets and favourites count. If you are in the followers or the friends list, it will only contain a read-only edit box with the information in the focused item and a close button.
|
* Show tweet: opens up a dialogue box where you can read the tweet, direct message, friend or follower which has focus. You can read the text with the arrow keys. It's a similar dialog box as used for composing tweets, without the ability to send the tweet, file attachment and autocompleting capabilities. It does however include a retweets and likes count. If you are in the followers or the friends list, it will only contain a read-only edit box with the information in the focused item and a close button.
|
||||||
* View address: If the selected tweet has geographical information, TWBlue may display a dialogue box where you can read the tweet address. This address is retrieved by sending the geographical coordinates of the tweet to Google maps.
|
* View address: If the selected tweet has geographical information, TWBlue may display a dialogue box where you can read the tweet address. This address is retrieved by sending the geographical coordinates of the tweet to Google maps.
|
||||||
* View conversation: If you are focusing a tweet with a mention, it opens a buffer where you can view the whole conversation.
|
* View conversation: If you are focusing a tweet with a mention, it opens a buffer where you can view the whole conversation.
|
||||||
|
* Read text in pictures: Attempt to apply OCR technology to the image attached to the tweet. The result will be displayed in another dialog.
|
||||||
* Delete: permanently removes the tweet or direct message which has focus from Twitter and from your lists. Bear in mind that Twitter only allows you to delete tweets you have posted yourself.
|
* Delete: permanently removes the tweet or direct message which has focus from Twitter and from your lists. Bear in mind that Twitter only allows you to delete tweets you have posted yourself.
|
||||||
|
|
||||||
##### User menu
|
##### User menu
|
||||||
@@ -148,7 +149,7 @@ Visually, Towards the top of the main application window, can be found a menu ba
|
|||||||
* Remove from list: lets you remove a user from a list.
|
* Remove from list: lets you remove a user from a list.
|
||||||
* View lists: Shows the lists created by a specified user.
|
* View lists: Shows the lists created by a specified user.
|
||||||
* Show user profile: opens a dialogue with the profile of the specified user.
|
* Show user profile: opens a dialogue with the profile of the specified user.
|
||||||
* View favourites: Opens a buffer where you can see the tweets which have been favourited by a particular user.
|
* View likes: Opens a buffer where you can see the tweets which have been liked by a particular user.
|
||||||
|
|
||||||
##### Buffer menu
|
##### Buffer menu
|
||||||
|
|
||||||
@@ -159,13 +160,18 @@ Visually, Towards the top of the main application window, can be found a menu ba
|
|||||||
* Clear buffer: Deletes all items from the buffer.
|
* Clear buffer: Deletes all items from the buffer.
|
||||||
* Destroy: dismisses the list you're on.
|
* Destroy: dismisses the list you're on.
|
||||||
|
|
||||||
|
##### Audio menu
|
||||||
|
|
||||||
|
* Play/pause: try to play audio for the selected item (if available), or stop the currently played audio.
|
||||||
|
* Seek back 5 seconds: If an audio is being played, seek 5 seconds back in the playback. This will work only in audio files. This feature cannot be used in radio stations or other streamed files.
|
||||||
|
* Seek forward 5 seconds: If an audio is being played, seek 5 seconds forward in the playback. This feature cannot be used in radio stations or other streamed files.
|
||||||
|
|
||||||
##### Help menu
|
##### Help menu
|
||||||
|
|
||||||
* Documentation: opens up this file, where you can read some useful program concepts.
|
* Documentation: opens up this file, where you can read some useful program concepts.
|
||||||
* Sounds tutorial: Opens a dialog box where you can familiarize yourself with the different sounds of the program.
|
* Sounds tutorial: Opens a dialog box where you can familiarize yourself with the different sounds of the program.
|
||||||
* What's new in this version?: opens up a document with the list of changes from the current version to the earliest.
|
* What's new in this version?: opens up a document with the list of changes from the current version to the earliest.
|
||||||
* Check for updates: every time you open the program it automatically checks for new versions. If an update is available, it will ask you if you want to download the update. If you accept, the updating process will commence. When complete, TWBlue will be restarted. This item checks for new updates without having to restart the application.
|
* Check for updates: every time you open the program it automatically checks for new versions. If an update is available, it will ask you if you want to download the update. If you accept, the updating process will commence. When complete, TWBlue will be restarted. This item checks for new updates without having to restart the application.
|
||||||
* Report an error: opens up a dialogue box to report a bug by completing a small number of fields. Pressing enter will send the report. If the operation doesn't succeed the program will display a warning.
|
|
||||||
* TWBlue's website: visit our [home page](http://twblue.es) where you can find all relevant information and downloads for TWBlue and become a part of the community.
|
* TWBlue's website: visit our [home page](http://twblue.es) where you can find all relevant information and downloads for TWBlue and become a part of the community.
|
||||||
* About TWBlue: shows the credits of the program.
|
* About TWBlue: shows the credits of the program.
|
||||||
|
|
||||||
@@ -186,8 +192,8 @@ The next section contains a list of keyboard shortcuts for both interfaces. Bear
|
|||||||
* Control + R: Reply / mention.
|
* Control + R: Reply / mention.
|
||||||
* Control + Shift + R: Retweet.
|
* Control + Shift + R: Retweet.
|
||||||
* Control + D: Send a direct message.
|
* Control + D: Send a direct message.
|
||||||
* control + F: Add tweet to favourites.
|
* control + F: Add tweet to likes.
|
||||||
* Control + Shift + F: Remove a tweet from favourites.
|
* Control + Shift + F: Remove a tweet from likes.
|
||||||
* Control + S: Open the user actions dialogue.
|
* Control + S: Open the user actions dialogue.
|
||||||
* Control + Shift + V: Show tweet.
|
* Control + Shift + V: Show tweet.
|
||||||
* Control + Q: Quit this program.
|
* Control + Q: Quit this program.
|
||||||
@@ -201,6 +207,8 @@ The next section contains a list of keyboard shortcuts for both interfaces. Bear
|
|||||||
|
|
||||||
### Shortcuts of the invisible interface (default keymap)
|
### Shortcuts of the invisible interface (default keymap)
|
||||||
|
|
||||||
|
The invisible interface of TWBlue can be customised by using a keymap. Every keymap defines a set of keystrokes to be used along with the invisible interface. You can change the keymap in the global settings dialogue, under the application menu in the menu bar, and check or edit keystrokes for the selected keymap in the keystroke editor, also available in the application menu.
|
||||||
|
|
||||||
* Control + Windows + Up Arrow: moves to the previous item in the buffer.
|
* Control + Windows + Up Arrow: moves to the previous item in the buffer.
|
||||||
* Control + Windows + Down Arrow: moves to the next item in the buffer.
|
* Control + Windows + Down Arrow: moves to the next item in the buffer.
|
||||||
* Control + Windows + Left Arrow: Move to the previous buffer.
|
* Control + Windows + Left Arrow: Move to the previous buffer.
|
||||||
@@ -247,6 +255,7 @@ The next section contains a list of keyboard shortcuts for both interfaces. Bear
|
|||||||
* Control + Windows + Shift + G: Display the tweet's geolocation in a dialogue.
|
* Control + Windows + Shift + G: Display the tweet's geolocation in a dialogue.
|
||||||
* Control + Windows + T: Create a trending topics' buffer.
|
* Control + Windows + T: Create a trending topics' buffer.
|
||||||
* Control + Windows + {: Find a string in the current buffer.
|
* Control + Windows + {: Find a string in the current buffer.
|
||||||
|
* Alt + Windows + O: Extracts text from the picture and display the result in a dialog.
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
@@ -266,7 +275,7 @@ As described above, this application has two configuration dialogues, the global
|
|||||||
|
|
||||||
#### buffers tab
|
#### buffers tab
|
||||||
|
|
||||||
This tab displays a list for each buffer you have available in TWBlue, except for searches, timelines, favourites' timelines and lists. You can show, hide and move them.
|
This tab displays a list for each buffer you have available in TWBlue, except for searches, timelines, likes' timelines and lists. You can show, hide and move them.
|
||||||
|
|
||||||
#### The ignored clients tab
|
#### The ignored clients tab
|
||||||
|
|
||||||
@@ -297,7 +306,7 @@ This dialogue allows you to configure some settings which will affect the entire
|
|||||||
|
|
||||||
#### Proxi tab
|
#### Proxi tab
|
||||||
|
|
||||||
In this tab you can configure TWBlue to use a Proxy server by completing the fields displayed (server, port, user and password).
|
In this tab you can configure TWBlue to use a Proxy server by completing the fields displayed (type, server, port, user and password).
|
||||||
|
|
||||||
## License, source code and donations
|
## License, source code and donations
|
||||||
|
|
||||||
@@ -305,40 +314,40 @@ Tw Blue is free software, licensed under the GNU GPL license, either version 2 o
|
|||||||
|
|
||||||
The source code of the program is available on GitHub at <https://www.github.com/manuelcortez/twblue>.
|
The source code of the program is available on GitHub at <https://www.github.com/manuelcortez/twblue>.
|
||||||
|
|
||||||
If you want to donate to the project, you can do so at <http://twblue.es/?q=node/3&language=en>. Thank you for your support!
|
If you want to donate to the project, you can do so at <https://twblue.es/donate>. Thank you for your support!
|
||||||
|
|
||||||
## Contact
|
## Contact
|
||||||
|
|
||||||
If you still have questions after reading this document, if you wish to collaborate to the project in some other way, or if you simply want to get in touch with the application developer, follow the Twitter account [@tw\_blue2](https://twitter.com/tw_blue2) or [@manuelcortez00.](https://twitter.com/manuelcortez00) You can also visit [our website](http://twblue.es)
|
If you still have questions after reading this document, if you wish to collaborate to the project in some other way, or if you simply want to get in touch with the application developer, follow the Twitter account [@tw\_blue2](https://twitter.com/tw_blue2) or [@manuelcortez00.](https://twitter.com/manuelcortez00) You can also visit [our website](https://twblue.es)
|
||||||
|
|
||||||
## Credits
|
## Credits
|
||||||
|
|
||||||
TWBlue is developed and mantained by [Manuel Cortéz](https://twitter.com/manuelcortez00) and [José Manuel Delicado](https://twitter.com/jmdaweb). It's supported and sponsored by [Technow S. L.](https://twitter.com/technow)
|
TWBlue is developed and maintained by [Manuel Cortéz](https://twitter.com/manuelcortez00) and [José Manuel Delicado](https://twitter.com/jmdaweb).
|
||||||
|
|
||||||
We would also like to thank the translators of TWBlue, who have allowed the spreading of the application.
|
We would also like to thank the translators of TWBlue, who have allowed the spreading of the application.
|
||||||
|
|
||||||
* English: [Manuel Cortéz](https://twitter.com/manuelcortez00).
|
* Arabic: [Mohammed Al Shara,](https://twitter.com/mohammed0204) [Hatoun Felemban](https://twitter.com/HatounFelemban)
|
||||||
* Arabic: [Mohammed Al Shara](https://twitter.com/mohammed0204).
|
|
||||||
* Catalan: [Francisco Torres](https://twitter.com/ftgalleg)
|
|
||||||
* Spanish: [Manuel Cortéz](https://twitter.com/manuelcortez00).
|
|
||||||
* Basque: [Sukil Etxenike](https://twitter.com/sukil2011).
|
* Basque: [Sukil Etxenike](https://twitter.com/sukil2011).
|
||||||
|
* Catalan: [Francisco Torres](https://twitter.com/ftgalleg)
|
||||||
|
* Croatian: [Zvonimir Stanečić](https://twitter.com/zvonimirek222).
|
||||||
|
* English: [Manuel Cortéz](https://twitter.com/manuelcortez00).
|
||||||
* Finnish: [Jani Kinnunen](https://twitter.com/jani_kinnunen).
|
* Finnish: [Jani Kinnunen](https://twitter.com/jani_kinnunen).
|
||||||
* French: [Rémi Ruiz](https://twitter.com/blindhelp38).
|
* French: [Rémy Ruiz](https://twitter.com/blindhelp38).
|
||||||
* Galician: [Juan Buño](https://twitter.com/Quetzatl_).
|
* Galician: [Juan Buño](https://twitter.com/Quetzatl_).
|
||||||
* German: [Steffen Schultz](https://twitter.com/schulle4u).
|
* German: [Steffen Schultz](https://twitter.com/schulle4u).
|
||||||
* Croatian: [Zvonimir Stanečić](https://twitter.com/zvonimirek222).
|
|
||||||
* Hungarian: Robert Osztolykan.
|
* Hungarian: Robert Osztolykan.
|
||||||
* Italian: [Christian Leo Mameli](https://twitter.com/llajta2012).
|
* Italian: [Christian Leo Mameli](https://twitter.com/llajta2012).
|
||||||
* Japanese: [Riku](https://twitter.com/riku_sub001)
|
* Japanese: [Riku](https://twitter.com/_riku02)
|
||||||
* Polish: [Pawel Masarczyk.](https://twitter.com/Piciok)
|
* Polish: [Pawel Masarczyk.](https://twitter.com/Piciok)
|
||||||
* Portuguese: Odenilton Júnior Santos.
|
* Portuguese: [Odenilton Júnior Santos.](https://twitter.com/romaleif)
|
||||||
* Romanian: [Florian Ionașcu](https://twitter.com/7ro) and [Răzvan Ciule](https://twitter.com/pilgrim89)
|
* Romanian: [Florian Ionașcu](https://twitter.com/florianionascu7) and [Nicușor Untilă](https://twitter.com/dj_storm2001)
|
||||||
* Russian: [Наталья Хедлунд](https://twitter.com/Lifestar_n).
|
* Russian: [Наталья Хедлунд](https://twitter.com/Lifestar_n) and [Валерия Кузнецова](https://twitter.com/ValeriaK305).
|
||||||
* Serbian: [Aleksandar Đurić](https://twitter.com/sokodtreshnje)
|
* Serbian: [Aleksandar Đurić](https://twitter.com/sokodtreshnje)
|
||||||
|
* Spanish: [Manuel Cortéz](https://twitter.com/manuelcortez00).
|
||||||
* Turkish: [Burak Yüksek](https://twitter.com/burakyuksek).
|
* Turkish: [Burak Yüksek](https://twitter.com/burakyuksek).
|
||||||
|
|
||||||
Many thanks also to the people who worked on the documentation. Initially, [Manuel Cortez](https://twitter.com/manuelcortez00) did the documentation in Spanish, and translated to English by [Bryner Villalobos](https://twitter.com/Bry_StarkCR), [Robert Spangler](https://twitter.com/glasscity1837), [Sussan Rey](https://twitter.com/sussanrey17), [Anibal Hernandez](https://twitter.com/anibalmetal), and [Holly Scott-Gardner](https://twitter.com/holly1994). It was updated by [Sukil Etxenike](https://twitter.com/sukil2011), with some valuable corrections by [Brian Hartgen](https://twitter.com/brianhartgen) and [Bill Dengler](https://twitter.com/codeofdusk).
|
Many thanks also to the people who worked on the documentation. Initially, [Manuel Cortez](https://twitter.com/manuelcortez00) did the documentation in Spanish, and translated to English by [Bryner Villalobos](https://twitter.com/Bry_StarkCR), [Robert Spangler](https://twitter.com/glasscity1837), [Sussan Rey](https://twitter.com/sussanrey17), [Anibal Hernandez](https://twitter.com/AnimalMetal), and [Holly Scott-Gardner](https://twitter.com/CatchTheseWords). It was updated by [Sukil Etxenike](https://twitter.com/sukil2011), with some valuable corrections by [Brian Hartgen](https://twitter.com/brianhartgen) and [Bill Dengler](https://twitter.com/codeofdusk).
|
||||||
|
|
||||||
------------------------------------------------------------------------
|
------------------------------------------------------------------------
|
||||||
|
|
||||||
Copyright © 2013-2016. Manuel Cortéz
|
Copyright © 2013-2017. Manuel Cortéz
|
@@ -1,6 +1,6 @@
|
|||||||
[Format]
|
[Format]
|
||||||
Type=PortableApps.comFormat
|
Type=PortableApps.comFormat
|
||||||
Version=3.4
|
Version=3.5
|
||||||
|
|
||||||
[Details]
|
[Details]
|
||||||
Name=tw blue portable
|
Name=tw blue portable
|
||||||
@@ -20,8 +20,8 @@ CommercialUse=true
|
|||||||
EULAVersion=2
|
EULAVersion=2
|
||||||
|
|
||||||
[Version]
|
[Version]
|
||||||
PackageVersion=0.86.0.0
|
PackageVersion=0.94.0.0
|
||||||
DisplayVersion=0.86
|
DisplayVersion=0.94
|
||||||
|
|
||||||
[Control]
|
[Control]
|
||||||
Icons=1
|
Icons=1
|
||||||
|
23
requirements.txt
Normal file
23
requirements.txt
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
wxpython
|
||||||
|
six
|
||||||
|
configobj
|
||||||
|
markdown
|
||||||
|
future
|
||||||
|
requests
|
||||||
|
oauthlib
|
||||||
|
requests-oauthlib
|
||||||
|
requests-toolbelt
|
||||||
|
pypubsub==3.3.0
|
||||||
|
pygeocoder
|
||||||
|
arrow
|
||||||
|
python-dateutil
|
||||||
|
futures
|
||||||
|
winpaths
|
||||||
|
PySocks
|
||||||
|
win_inet_pton
|
||||||
|
yandex.translate
|
||||||
|
idna
|
||||||
|
chardet
|
||||||
|
urllib3
|
||||||
|
youtube-dl
|
||||||
|
python-vlc
|
@@ -1,7 +1,9 @@
|
|||||||
!include "MUI2.nsh"
|
!include "MUI2.nsh"
|
||||||
!include "LogicLib.nsh"
|
!include "LogicLib.nsh"
|
||||||
!include "x64.nsh"
|
!include "x64.nsh"
|
||||||
|
Unicode true
|
||||||
CRCCheck on
|
CRCCheck on
|
||||||
|
ManifestSupportedOS all
|
||||||
XPStyle on
|
XPStyle on
|
||||||
Name "TWBlue"
|
Name "TWBlue"
|
||||||
OutFile "TWBlue_setup.exe"
|
OutFile "TWBlue_setup.exe"
|
||||||
@@ -12,10 +14,11 @@ SetCompress auto
|
|||||||
SetCompressor /solid lzma
|
SetCompressor /solid lzma
|
||||||
SetDatablockOptimize on
|
SetDatablockOptimize on
|
||||||
VIAddVersionKey ProductName "TWBlue"
|
VIAddVersionKey ProductName "TWBlue"
|
||||||
VIAddVersionKey LegalCopyright "Copyright 2016 Manuel Cortéz."
|
VIAddVersionKey LegalCopyright "Copyright 2018 Manuel Cortéz."
|
||||||
VIAddVersionKey ProductVersion "0.86"
|
VIAddVersionKey ProductVersion "0.94"
|
||||||
VIAddVersionKey FileVersion "0.86"
|
VIAddVersionKey FileVersion "0.94"
|
||||||
VIProductVersion "0.86.0.0"
|
VIProductVersion "0.94.0.0"
|
||||||
|
VIFileVersion "0.94.0.0"
|
||||||
!insertmacro MUI_PAGE_WELCOME
|
!insertmacro MUI_PAGE_WELCOME
|
||||||
!define MUI_LICENSEPAGE_RADIOBUTTONS
|
!define MUI_LICENSEPAGE_RADIOBUTTONS
|
||||||
!insertmacro MUI_PAGE_LICENSE "license.txt"
|
!insertmacro MUI_PAGE_LICENSE "license.txt"
|
||||||
@@ -69,10 +72,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\twblue" "UninstallString" '"$INSTDIR\uninstall.exe"'
|
||||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall" "InstallLocation" $INSTDIR
|
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" "Publisher" "Manuel Cortéz"
|
||||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "DisplayVersion" "0.86"
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "DisplayVersion" "0.94"
|
||||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "URLInfoAbout" "http://twblue.es"
|
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" "VersionMajor" 0
|
||||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "VersionMinor" 86
|
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "VersionMinor" 94
|
||||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "NoModify" 1
|
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "NoModify" 1
|
||||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "NoRepair" 1
|
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "NoRepair" 1
|
||||||
SectionEnd
|
SectionEnd
|
||||||
|
@@ -9,11 +9,11 @@ relative_times = boolean(default=True)
|
|||||||
max_api_calls = integer(default=1)
|
max_api_calls = integer(default=1)
|
||||||
max_tweets_per_call = integer(default=100)
|
max_tweets_per_call = integer(default=100)
|
||||||
reverse_timelines = boolean(default=False)
|
reverse_timelines = boolean(default=False)
|
||||||
time_to_check_streams = integer(default=30)
|
|
||||||
announce_stream_status = boolean(default=True)
|
announce_stream_status = boolean(default=True)
|
||||||
retweet_mode = string(default="ask")
|
retweet_mode = string(default="ask")
|
||||||
persist_size = integer(default=0)
|
persist_size = integer(default=0)
|
||||||
buffer_order = list(default=list('home','mentions','dm','sent_dm','sent_tweets','favorites','followers','friends','blocks','muted','events'))
|
show_screen_names = boolean(default=False)
|
||||||
|
buffer_order = list(default=list('home','mentions', 'dm', 'sent_dm', 'sent_tweets','favorites','followers','friends','blocks','muted','events'))
|
||||||
|
|
||||||
[sound]
|
[sound]
|
||||||
volume = float(default=1.0)
|
volume = float(default=1.0)
|
||||||
@@ -21,6 +21,9 @@ input_device = string(default="Default")
|
|||||||
output_device = string(default="Default")
|
output_device = string(default="Default")
|
||||||
session_mute = boolean(default=False)
|
session_mute = boolean(default=False)
|
||||||
current_soundpack = string(default="default")
|
current_soundpack = string(default="default")
|
||||||
|
indicate_audio = boolean(default=True)
|
||||||
|
indicate_geo = boolean(default=True)
|
||||||
|
indicate_img = boolean(default=True)
|
||||||
sndup_api_key = string(default="")
|
sndup_api_key = string(default="")
|
||||||
|
|
||||||
[other_buffers]
|
[other_buffers]
|
||||||
@@ -38,4 +41,10 @@ autoread_buffers = list(default=list(mentions, direct_messages, events))
|
|||||||
spelling_language = string(default="")
|
spelling_language = string(default="")
|
||||||
save_followers_in_autocompletion_db = boolean(default=False)
|
save_followers_in_autocompletion_db = boolean(default=False)
|
||||||
save_friends_in_autocompletion_db = boolean(default=False)
|
save_friends_in_autocompletion_db = boolean(default=False)
|
||||||
twishort_enabled = boolean(default=False)
|
ocr_language = string(default="")
|
||||||
|
|
||||||
|
[reporting]
|
||||||
|
braille_reporting = boolean(default=True)
|
||||||
|
speech_reporting = boolean(default=True)
|
||||||
|
|
||||||
|
[filters]
|
||||||
|
@@ -9,8 +9,9 @@ class Auto(Output):
|
|||||||
self.outputs = []
|
self.outputs = []
|
||||||
for output in output_classes:
|
for output in output_classes:
|
||||||
try:
|
try:
|
||||||
self.outputs.append(output())
|
a=output()
|
||||||
except OutputError:
|
self.outputs.append(a)
|
||||||
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def get_first_available_output(self):
|
def get_first_available_output(self):
|
||||||
@@ -33,6 +34,7 @@ class Auto(Output):
|
|||||||
output = self.get_first_available_output()
|
output = self.get_first_available_output()
|
||||||
if output:
|
if output:
|
||||||
output.speak(*args, **kwargs)
|
output.speak(*args, **kwargs)
|
||||||
|
output.braille(*args, **kwargs)
|
||||||
|
|
||||||
def is_system_output(self):
|
def is_system_output(self):
|
||||||
output = self.get_first_available_output()
|
output = self.get_first_available_output()
|
||||||
|
@@ -5,6 +5,7 @@ ignored_sessions = list(default=list())
|
|||||||
|
|
||||||
[app-settings]
|
[app-settings]
|
||||||
language = string(default="system")
|
language = string(default="system")
|
||||||
|
update_period = integer(default=2)
|
||||||
hide_gui = boolean(default=False)
|
hide_gui = boolean(default=False)
|
||||||
voice_enabled = boolean(default=False)
|
voice_enabled = boolean(default=False)
|
||||||
ask_at_exit = boolean(default=True)
|
ask_at_exit = boolean(default=True)
|
||||||
@@ -17,8 +18,13 @@ log_level = string(default="error")
|
|||||||
load_keymap = string(default="default.keymap")
|
load_keymap = string(default="default.keymap")
|
||||||
donation_dialog_displayed = boolean(default=False)
|
donation_dialog_displayed = boolean(default=False)
|
||||||
check_for_updates = boolean(default=True)
|
check_for_updates = boolean(default=True)
|
||||||
|
remember_mention_and_longtweet = boolean(default=False)
|
||||||
|
longtweet = boolean(default=false)
|
||||||
|
mention_all = boolean(default=False)
|
||||||
|
no_streaming = boolean(default=False)
|
||||||
|
|
||||||
[proxy]
|
[proxy]
|
||||||
|
type = string(default="Direct connection")
|
||||||
server = string(default="")
|
server = string(default="")
|
||||||
port = string(default="")
|
port = string(default="")
|
||||||
user = string(default="")
|
user = string(default="")
|
||||||
|
@@ -1,18 +1,35 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
import datetime
|
||||||
|
|
||||||
name = 'TWBlue'
|
name = 'TWBlue'
|
||||||
snapshot = False
|
snapshot = False
|
||||||
if snapshot == False:
|
if snapshot == False:
|
||||||
version = "0.86"
|
version = "0.94"
|
||||||
update_url = 'http://twblue.es/updates/twblue_ngen.json'
|
update_url = 'https://twblue.es/updates/stable.php'
|
||||||
mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/stable.json'
|
mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/stable.json'
|
||||||
else:
|
else:
|
||||||
version = "10.99"
|
version = "8"
|
||||||
update_url = 'http://twblue.es/updates/snapshots_ngen.json'
|
update_url = 'https://twblue.es/updates/snapshot.php'
|
||||||
mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/snapshots.json'
|
mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/snapshots.json'
|
||||||
author = u"Manuel Cortéz"
|
authors = [u"Manuel Cortéz", u"José Manuel Delicado"]
|
||||||
authorEmail = "manuel@manuelcortez.net"
|
authorEmail = "manuel@manuelcortez.net"
|
||||||
copyright = u"Copyright (C) 2015, Technow S.L. \nCopyright (C) 2013-2015, Manuel cortéz."
|
copyright = u"Copyright (C) 2013-2018, Manuel cortéz."
|
||||||
description = unicode(name+" is an app designed to use Twitter simply and efficiently while using minimal system resources. This app provides access to most Twitter features.")
|
description = unicode(name+" is an app designed to use Twitter simply and efficiently while using minimal system resources. This app provides access to most Twitter features.")
|
||||||
translators = [u"Bryner Villalobos, Bill Dengler (English)", u"Mohammed Al Shara (Arabic)", u"Joan Rabat, Juan Carlos Rivilla (Catalan)", u"Manuel cortéz (Spanish)", u"Sukil Etxenike Arizaleta (Basque)", u"Jani Kinnunen (finnish)", u"Rémy Ruiz (French)", u"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)"]
|
translators = [u"Manuel Cortéz (English)", u"Mohammed Al Shara, Hatoun Felemban (Arabic)", u"Francisco Torres (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"Zvonimir Stanečić (Croatian)", u"Robert Osztolykan (Hungarian)", u"Christian Leo Mameli (Italian)", u"Riku (Japanese)", u"Paweł Masarczyk (Polish)", u"Odenilton Júnior Santos (Portuguese)", u"Florian Ionașcu, Nicușor Untilă (Romanian)", u"Natalia Hedlund, Valeria Kuznetsova (Russian)", u"Aleksandar Đurić (Serbian)", u"Burak Yüksek (Turkish)"]
|
||||||
url = u"http://twblue.es"
|
url = u"https://twblue.es"
|
||||||
report_bugs_url = "http://twblue.es/bugs/api/soap/mantisconnect.php?wsdl"
|
report_bugs_url = "https://github.com/manuelcortez/twblue/issues"
|
||||||
|
supported_languages = []
|
||||||
|
|
||||||
|
def streaming_lives():
|
||||||
|
""" Check if we are in August 16.
|
||||||
|
ToDo: This method should be removed after deadline==True"""
|
||||||
|
# Let's import config here so we will avoid breaking things when setup.py is going to be used.
|
||||||
|
# Check if user has disabled the streaming API things from settings.
|
||||||
|
import config
|
||||||
|
if config.app != None:
|
||||||
|
no_streaming = config.app["app-settings"]["no_streaming"]
|
||||||
|
if no_streaming == True:
|
||||||
|
return False
|
||||||
|
deadline = datetime.date(2018, 8, 16)
|
||||||
|
now = datetime.datetime.now().date()
|
||||||
|
return deadline>now
|
@@ -2,6 +2,7 @@ from audio_services import matches_url
|
|||||||
import json
|
import json
|
||||||
import re
|
import re
|
||||||
import urllib
|
import urllib
|
||||||
|
import youtube_utils
|
||||||
|
|
||||||
@matches_url('https://audioboom.com')
|
@matches_url('https://audioboom.com')
|
||||||
def convert_audioboom(url):
|
def convert_audioboom(url):
|
||||||
@@ -28,21 +29,9 @@ def convert_soundcloud (url):
|
|||||||
else:
|
else:
|
||||||
raise TypeError('%r is not streamable' % url)
|
raise TypeError('%r is not streamable' % url)
|
||||||
|
|
||||||
@matches_url('http://twup.me')
|
@matches_url ('https://www.youtube.com/watch')
|
||||||
def convert_twup(url):
|
def convert_youtube_long (url):
|
||||||
result = re.match("^http://twup.me/(?P<audio_id>[A-Za-z0-9]+/?)$", url, re.I)
|
return youtube_utils.get_video_url(url)
|
||||||
if not result or result.group("audio_id") is None:
|
|
||||||
raise TypeError('%r is not a valid URL' % url)
|
|
||||||
audio_id = result.group("audio_id")
|
|
||||||
return 'http://twup.me/%s' % audio_id
|
|
||||||
|
|
||||||
#@matches_url('http://sndup.net')
|
|
||||||
#def convert_sndup(url):
|
|
||||||
# result = re.match("^http://sndup.net/(?P<audio_id>[a-z0-9]+/?)(|d|l|a)/?$", url, re.I)
|
|
||||||
# if not result or result.group("audio_id") is None:
|
|
||||||
# raise TypeError('%r is not a valid URL' % url)
|
|
||||||
# audio_id = result.group("audio_id")
|
|
||||||
# return 'http://sndup.net/%s/a' % audio_id
|
|
||||||
|
|
||||||
def convert_generic_audio(url):
|
def convert_generic_audio(url):
|
||||||
return url
|
return url
|
||||||
|
@@ -8,7 +8,7 @@ log = logging.getLogger("config")
|
|||||||
|
|
||||||
MAINFILE = "twblue.conf"
|
MAINFILE = "twblue.conf"
|
||||||
MAINSPEC = "app-configuration.defaults"
|
MAINSPEC = "app-configuration.defaults"
|
||||||
|
proxyTypes=[u"http", u"https", u"socks4", u"socks5"]
|
||||||
app = None
|
app = None
|
||||||
keymap=None
|
keymap=None
|
||||||
changed_keymap = False
|
changed_keymap = False
|
||||||
@@ -24,4 +24,4 @@ def setup ():
|
|||||||
app.write()
|
app.write()
|
||||||
global changed_keymap
|
global changed_keymap
|
||||||
changed_keymap = True
|
changed_keymap = True
|
||||||
keymap = config_utils.load_config(paths.config_path("keymap.keymap"), paths.app_path("keymaps/"+app['app-settings']['load_keymap']))
|
keymap = config_utils.load_config(paths.config_path("keymap.keymap"), paths.app_path("keymaps/"+app['app-settings']['load_keymap']), copy=False)
|
||||||
|
@@ -8,16 +8,14 @@ log = getLogger("config_utils")
|
|||||||
|
|
||||||
class ConfigLoadError(Exception): pass
|
class ConfigLoadError(Exception): pass
|
||||||
|
|
||||||
def load_config(config_path, configspec_path=None, *args, **kwargs):
|
def load_config(config_path, configspec_path=None, copy=True, *args, **kwargs):
|
||||||
if os.path.exists(config_path):
|
|
||||||
clean_config(config_path)
|
|
||||||
spec = ConfigObj(configspec_path, encoding='UTF8', list_values=False, _inspec=True)
|
spec = ConfigObj(configspec_path, encoding='UTF8', list_values=False, _inspec=True)
|
||||||
try:
|
try:
|
||||||
config = ConfigObj(infile=config_path, configspec=spec, create_empty=True, encoding='UTF8', *args, **kwargs)
|
config = ConfigObj(infile=config_path, configspec=spec, create_empty=True, encoding='UTF8', *args, **kwargs)
|
||||||
except ParseError:
|
except ParseError:
|
||||||
raise ConfigLoadError("Unable to load %r" % config_path)
|
raise ConfigLoadError("Unable to load %r" % config_path)
|
||||||
validator = Validator()
|
validator = Validator()
|
||||||
validated = config.validate(validator, preserve_errors=False, copy=True)
|
validated = config.validate(validator, preserve_errors=False, copy=copy)
|
||||||
if validated == True:
|
if validated == True:
|
||||||
config.write()
|
config.write()
|
||||||
return config
|
return config
|
||||||
|
@@ -17,6 +17,7 @@ import config
|
|||||||
import sound
|
import sound
|
||||||
import languageHandler
|
import languageHandler
|
||||||
import logging
|
import logging
|
||||||
|
import youtube_utils
|
||||||
from twitter import compose, utils
|
from twitter import compose, utils
|
||||||
from mysc.thread_utils import call_threaded
|
from mysc.thread_utils import call_threaded
|
||||||
from twython import TwythonError
|
from twython import TwythonError
|
||||||
@@ -33,21 +34,36 @@ def _tweets_exist(function):
|
|||||||
return function_
|
return function_
|
||||||
|
|
||||||
class bufferController(object):
|
class bufferController(object):
|
||||||
|
""" A basic buffer object. This should be the base class for all other derived buffers."""
|
||||||
|
|
||||||
def __init__(self, parent=None, function=None, session=None, *args, **kwargs):
|
def __init__(self, parent=None, function=None, session=None, *args, **kwargs):
|
||||||
|
"""Inits the main controller for this buffer:
|
||||||
|
@ parent wx.Treebook object: Container where we will put this buffer.
|
||||||
|
@ function str or None: function to be called periodically and update items on this buffer.
|
||||||
|
@ session sessionmanager.session object or None: Session handler for settings, database and Twitter access.
|
||||||
|
"""
|
||||||
super(bufferController, self).__init__()
|
super(bufferController, self).__init__()
|
||||||
self.function = function
|
self.function = function
|
||||||
|
# Compose_function will be used to render an object on this buffer. Normally, signature is as follows:
|
||||||
|
# compose_function(item, db, relative_times, show_screen_names=False, session=None)
|
||||||
|
# Compose functions will be defined in every buffer if items are different than tweets.
|
||||||
|
# Read more about compose functions in twitter/compose.py.
|
||||||
self.compose_function = None
|
self.compose_function = None
|
||||||
self.args = args
|
self.args = args
|
||||||
self.kwargs = kwargs
|
self.kwargs = kwargs
|
||||||
|
# This will be used as a reference to the wx.Panel object wich stores the buffer GUI.
|
||||||
self.buffer = None
|
self.buffer = None
|
||||||
|
# This should countains the account associated to this buffer.
|
||||||
self.account = ""
|
self.account = ""
|
||||||
|
# This controls wether the start_stream function should be called when starting the program.
|
||||||
self.needs_init = True
|
self.needs_init = True
|
||||||
self.invisible = False # False if the buffer will be ignored on the invisible interface.
|
# if this is set to False, the buffer will be ignored on the invisible interface.
|
||||||
|
self.invisible = False
|
||||||
|
# Control variable, used to track time of execution for calls to start_stream.
|
||||||
self.execution_time = 0
|
self.execution_time = 0
|
||||||
|
|
||||||
def clear_list(self): pass
|
def clear_list(self): pass
|
||||||
|
|
||||||
|
|
||||||
def get_event(self, ev):
|
def get_event(self, ev):
|
||||||
""" Catches key presses in the WX interface and generate the corresponding event names."""
|
""" Catches key presses in the WX interface and generate the corresponding event names."""
|
||||||
if ev.GetKeyCode() == wx.WXK_RETURN and ev.ControlDown(): event = "audio"
|
if ev.GetKeyCode() == wx.WXK_RETURN and ev.ControlDown(): event = "audio"
|
||||||
@@ -71,9 +87,9 @@ class bufferController(object):
|
|||||||
self.session.settings["sound"]["volume"] = 0.0
|
self.session.settings["sound"]["volume"] = 0.0
|
||||||
else:
|
else:
|
||||||
self.session.settings["sound"]["volume"] -=0.05
|
self.session.settings["sound"]["volume"] -=0.05
|
||||||
if hasattr(sound.URLPlayer, "stream"):
|
sound.URLPlayer.player.audio_set_volume(int(self.session.settings["sound"]["volume"]*100.0))
|
||||||
sound.URLPlayer.stream.volume = self.session.settings["sound"]["volume"]
|
|
||||||
self.session.sound.play("volume_changed.ogg")
|
self.session.sound.play("volume_changed.ogg")
|
||||||
|
self.session.settings.write()
|
||||||
|
|
||||||
def volume_up(self):
|
def volume_up(self):
|
||||||
if self.session.settings["sound"]["volume"] < 1.0:
|
if self.session.settings["sound"]["volume"] < 1.0:
|
||||||
@@ -81,13 +97,13 @@ class bufferController(object):
|
|||||||
self.session.settings["sound"]["volume"] = 1.0
|
self.session.settings["sound"]["volume"] = 1.0
|
||||||
else:
|
else:
|
||||||
self.session.settings["sound"]["volume"] +=0.05
|
self.session.settings["sound"]["volume"] +=0.05
|
||||||
if hasattr(sound.URLPlayer, "stream"):
|
sound.URLPlayer.player.audio_set_volume(int(self.session.settings["sound"]["volume"]*100))
|
||||||
sound.URLPlayer.stream.volume = self.session.settings["sound"]["volume"]
|
|
||||||
self.session.sound.play("volume_changed.ogg")
|
self.session.sound.play("volume_changed.ogg")
|
||||||
|
self.session.settings.write()
|
||||||
|
|
||||||
def start_stream(self, mandatory=False):
|
def start_stream(self, mandatory=False, play_sound=True):
|
||||||
if mandatory == True:
|
# if mandatory == True:
|
||||||
output.speak(_(u"Unable to update this buffer."))
|
# output.speak(_(u"Unable to update this buffer."))
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def get_more_items(self):
|
def get_more_items(self):
|
||||||
@@ -134,27 +150,30 @@ class bufferController(object):
|
|||||||
def post_tweet(self, *args, **kwargs):
|
def post_tweet(self, *args, **kwargs):
|
||||||
title = _(u"Tweet")
|
title = _(u"Tweet")
|
||||||
caption = _(u"Write the tweet here")
|
caption = _(u"Write the tweet here")
|
||||||
tweet = messages.tweet(self.session, title, caption, "", twishort_enabled=self.session.settings["mysc"]["twishort_enabled"])
|
tweet = messages.tweet(self.session, title, caption, "")
|
||||||
if tweet.message.get_response() == widgetUtils.OK:
|
if tweet.message.get_response() == widgetUtils.OK:
|
||||||
self.session.settings["mysc"]["twishort_enabled"] = tweet.message.long_tweet.GetValue()
|
if config.app["app-settings"]["remember_mention_and_longtweet"]:
|
||||||
|
config.app["app-settings"]["longtweet"] = tweet.message.long_tweet.GetValue()
|
||||||
|
config.app.write()
|
||||||
text = tweet.message.get_text()
|
text = tweet.message.get_text()
|
||||||
if len(text) > 140 and tweet.message.get("long_tweet") == True:
|
if len(text) > 280 and tweet.message.get("long_tweet") == True:
|
||||||
if not hasattr(tweet, "attachments"):
|
if not hasattr(tweet, "attachments"):
|
||||||
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text)
|
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text)
|
||||||
else:
|
else:
|
||||||
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text, 1)
|
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text, 1)
|
||||||
if not hasattr(tweet, "attachments") or len(tweet.attachments) == 0:
|
if not hasattr(tweet, "attachments") or len(tweet.attachments) == 0:
|
||||||
call_threaded(self.session.api_call, call_name="update_status", status=text)
|
call_threaded(self.session.api_call, call_name="update_status", status=text, _sound="tweet_send.ogg")
|
||||||
else:
|
else:
|
||||||
call_threaded(self.post_with_media, text=text, attachments=tweet.attachments)
|
call_threaded(self.post_with_media, text=text, attachments=tweet.attachments, _sound="tweet_send.ogg")
|
||||||
if hasattr(tweet.message, "destroy"): tweet.message.destroy()
|
if hasattr(tweet.message, "destroy"): tweet.message.destroy()
|
||||||
|
self.session.settings.write()
|
||||||
|
|
||||||
def post_with_media(self, text, attachments):
|
def post_with_media(self, text, attachments):
|
||||||
media_ids = []
|
media_ids = []
|
||||||
for i in attachments:
|
for i in attachments:
|
||||||
photo = open(i["file"], "rb")
|
photo = open(i["file"], "rb")
|
||||||
img = self.session.twitter.twitter.upload_media(media=photo)
|
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"]))
|
self.session.twitter.twitter.create_metadata(media_id=img["media_id"], alt_text=dict(text=i["description"]))
|
||||||
media_ids.append(img["media_id"])
|
media_ids.append(img["media_id"])
|
||||||
self.session.twitter.twitter.update_status(status=text, media_ids=media_ids)
|
self.session.twitter.twitter.update_status(status=text, media_ids=media_ids)
|
||||||
|
|
||||||
@@ -164,7 +183,6 @@ class bufferController(object):
|
|||||||
except AttributeError:
|
except AttributeError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class accountPanel(bufferController):
|
class accountPanel(bufferController):
|
||||||
def __init__(self, parent, name, account, account_id):
|
def __init__(self, parent, name, account, account_id):
|
||||||
super(accountPanel, self).__init__(parent, None, name)
|
super(accountPanel, self).__init__(parent, None, name)
|
||||||
@@ -209,6 +227,7 @@ class accountPanel(bufferController):
|
|||||||
else:
|
else:
|
||||||
self.buffer.change_autostart(False)
|
self.buffer.change_autostart(False)
|
||||||
config.app["sessions"]["ignored_sessions"].append(self.account_id)
|
config.app["sessions"]["ignored_sessions"].append(self.account_id)
|
||||||
|
config.app.write()
|
||||||
|
|
||||||
class emptyPanel(bufferController):
|
class emptyPanel(bufferController):
|
||||||
def __init__(self, parent, name, account):
|
def __init__(self, parent, name, account):
|
||||||
@@ -241,14 +260,25 @@ class baseBufferController(bufferController):
|
|||||||
self.buffer.account = account
|
self.buffer.account = account
|
||||||
self.bind_events()
|
self.bind_events()
|
||||||
self.sound = sound
|
self.sound = sound
|
||||||
|
if "-timeline" in self.name or "-favorite" in self.name:
|
||||||
|
self.finished_timeline = False
|
||||||
|
# Add a compatibility layer for username based timelines from config.
|
||||||
|
# ToDo: Remove this in some new versions of the client, when user ID timelines become mandatory.
|
||||||
|
try:
|
||||||
|
int(self.kwargs["user_id"])
|
||||||
|
except ValueError:
|
||||||
|
self.is_screen_name = True
|
||||||
|
self.kwargs["screen_name"] = self.kwargs["user_id"]
|
||||||
|
self.kwargs.pop("user_id")
|
||||||
|
|
||||||
def get_formatted_message(self):
|
def get_formatted_message(self):
|
||||||
if self.type == "dm" or self.name == "sent_tweets" or self.name == "sent_direct_messages": return self.compose_function(self.get_right_tweet(), self.session.db, self.session.settings["general"]["relative_times"])[1]
|
if self.type == "dm" or self.name == "direct_messages":
|
||||||
|
return self.compose_function(self.get_right_tweet(), self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session)[1]
|
||||||
return self.get_message()
|
return self.get_message()
|
||||||
|
|
||||||
def get_message(self):
|
def get_message(self):
|
||||||
tweet = self.get_right_tweet()
|
tweet = self.get_right_tweet()
|
||||||
return " ".join(self.compose_function(tweet, self.session.db, self.session.settings["general"]["relative_times"]))
|
return " ".join(self.compose_function(tweet, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session))
|
||||||
|
|
||||||
def get_full_tweet(self):
|
def get_full_tweet(self):
|
||||||
tweet = self.get_right_tweet()
|
tweet = self.get_right_tweet()
|
||||||
@@ -285,18 +315,27 @@ class baseBufferController(bufferController):
|
|||||||
tweetsList.append(tweet)
|
tweetsList.append(tweet)
|
||||||
return (tweet, tweetsList)
|
return (tweet, tweetsList)
|
||||||
|
|
||||||
def start_stream(self, mandatory=False):
|
def start_stream(self, mandatory=False, play_sound=True):
|
||||||
# starts stream every 3 minutes.
|
# starts stream every 3 minutes.
|
||||||
current_time = time.time()
|
current_time = time.time()
|
||||||
if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory==True:
|
if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory==True:
|
||||||
self.execution_time = current_time
|
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("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))
|
log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs))
|
||||||
val = self.session.call_paged(self.function, *self.args, **self.kwargs)
|
if self.name == "direct_messages":
|
||||||
number_of_items = self.session.order_buffer(self.name, val)
|
number_of_items = self.session.get_cursored_stream(self.name, self.function, *self.args, **self.kwargs)
|
||||||
log.debug("Number of items retrieved: %d" % (number_of_items,))
|
else:
|
||||||
|
val = self.session.call_paged(self.function, *self.args, **self.kwargs)
|
||||||
|
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)
|
self.put_items_on_list(number_of_items)
|
||||||
if number_of_items > 0 and self.name != "sent_tweets" and self.name != "sent_direct_messages" and self.sound != None:
|
if hasattr(self, "finished_timeline") and self.finished_timeline == False:
|
||||||
|
if "-timeline" in self.name:
|
||||||
|
self.username = val[0]["user"]["screen_name"]
|
||||||
|
elif "-favorite" in self.name:
|
||||||
|
self.username = self.session.api_call("show_user", **self.kwargs)["screen_name"]
|
||||||
|
self.finished_timeline = True
|
||||||
|
if number_of_items > 0 and self.name != "sent_tweets" and self.name != "sent_direct_messages" and self.sound != None and self.session.settings["sound"]["session_mute"] == False and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and play_sound == True:
|
||||||
self.session.sound.play(self.sound)
|
self.session.sound.play(self.sound)
|
||||||
return number_of_items
|
return number_of_items
|
||||||
|
|
||||||
@@ -311,7 +350,7 @@ class baseBufferController(bufferController):
|
|||||||
except TwythonError as e:
|
except TwythonError as e:
|
||||||
output.speak(e.message, True)
|
output.speak(e.message, True)
|
||||||
for i in items:
|
for i in items:
|
||||||
if utils.is_allowed(i, self.session.settings["twitter"]["ignored_clients"]) == True and utils.find_item(i["id"], self.session.db[self.name]) == None:
|
if utils.is_allowed(i, self.session.settings, self.name) == True and utils.find_item(i["id"], self.session.db[self.name]) == None:
|
||||||
i = self.session.check_quoted_status(i)
|
i = self.session.check_quoted_status(i)
|
||||||
i = self.session.check_long_tweet(i)
|
i = self.session.check_long_tweet(i)
|
||||||
elements.append(i)
|
elements.append(i)
|
||||||
@@ -322,33 +361,43 @@ class baseBufferController(bufferController):
|
|||||||
selection = self.buffer.list.get_selected()
|
selection = self.buffer.list.get_selected()
|
||||||
if self.session.settings["general"]["reverse_timelines"] == False:
|
if self.session.settings["general"]["reverse_timelines"] == False:
|
||||||
for i in elements:
|
for i in elements:
|
||||||
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"])
|
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session)
|
||||||
self.buffer.list.insert_item(True, *tweet)
|
self.buffer.list.insert_item(True, *tweet)
|
||||||
else:
|
else:
|
||||||
for i in items:
|
for i in items:
|
||||||
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"])
|
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session)
|
||||||
self.buffer.list.insert_item(False, *tweet)
|
self.buffer.list.insert_item(False, *tweet)
|
||||||
# self.buffer.list.select_item(selection+elements)
|
# self.buffer.list.select_item(selection+elements)
|
||||||
# else:
|
# else:
|
||||||
self.buffer.list.select_item(selection)
|
self.buffer.list.select_item(selection)
|
||||||
output.speak(_(u"%s items retrieved") % (str(len(elements))), True)
|
output.speak(_(u"%s items retrieved") % (str(len(elements))), True)
|
||||||
|
|
||||||
def remove_buffer(self):
|
def remove_buffer(self, force=False):
|
||||||
if "-timeline" in self.name:
|
if "-timeline" in self.name:
|
||||||
dlg = commonMessageDialogs.remove_buffer()
|
if force == False:
|
||||||
|
dlg = commonMessageDialogs.remove_buffer()
|
||||||
|
else:
|
||||||
|
dlg = widgetUtils.YES
|
||||||
if dlg == widgetUtils.YES:
|
if dlg == widgetUtils.YES:
|
||||||
if self.name[:-9] in self.session.settings["other_buffers"]["timelines"]:
|
if self.name[:-9] in self.session.settings["other_buffers"]["timelines"]:
|
||||||
self.session.settings["other_buffers"]["timelines"].remove(self.name[:-9])
|
self.session.settings["other_buffers"]["timelines"].remove(self.name[:-9])
|
||||||
self.session.db.pop(self.name)
|
self.session.settings.write()
|
||||||
|
if self.session.db.has_key(self.name):
|
||||||
|
self.session.db.pop(self.name)
|
||||||
return True
|
return True
|
||||||
elif dlg == widgetUtils.NO:
|
elif dlg == widgetUtils.NO:
|
||||||
return False
|
return False
|
||||||
elif "favorite" in self.name:
|
elif "favorite" in self.name:
|
||||||
dlg = commonMessageDialogs.remove_buffer()
|
if force == False:
|
||||||
|
dlg = commonMessageDialogs.remove_buffer()
|
||||||
|
else:
|
||||||
|
dlg = widgetUtils.YES
|
||||||
if dlg == widgetUtils.YES:
|
if dlg == widgetUtils.YES:
|
||||||
if self.name[:-9] in self.session.settings["other_buffers"]["favourites_timelines"]:
|
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.settings["other_buffers"]["favourites_timelines"].remove(self.name[:-9])
|
||||||
self.session.db.pop(self.name)
|
if self.session.db.has_key(self.name):
|
||||||
|
self.session.db.pop(self.name)
|
||||||
|
self.session.settings.write()
|
||||||
return True
|
return True
|
||||||
elif dlg == widgetUtils.NO:
|
elif dlg == widgetUtils.NO:
|
||||||
return False
|
return False
|
||||||
@@ -364,36 +413,41 @@ class baseBufferController(bufferController):
|
|||||||
self.remove_item(i)
|
self.remove_item(i)
|
||||||
|
|
||||||
def put_items_on_list(self, number_of_items):
|
def put_items_on_list(self, number_of_items):
|
||||||
|
# Define the list we're going to use as cursored stuff are a bit different.
|
||||||
|
if self.name != "direct_messages" and self.name != "sent_direct_messages":
|
||||||
|
list_to_use = self.session.db[self.name]
|
||||||
|
else:
|
||||||
|
list_to_use = self.session.db[self.name]["items"]
|
||||||
if number_of_items == 0 and self.session.settings["general"]["persist_size"] == 0: return
|
if number_of_items == 0 and self.session.settings["general"]["persist_size"] == 0: return
|
||||||
log.debug("The list contains %d items " % (self.buffer.list.get_count(),))
|
log.debug("The list contains %d items " % (self.buffer.list.get_count(),))
|
||||||
log.debug("Putting %d items on the list" % (number_of_items,))
|
log.debug("Putting %d items on the list" % (number_of_items,))
|
||||||
if self.buffer.list.get_count() == 0:
|
if self.buffer.list.get_count() == 0:
|
||||||
for i in self.session.db[self.name]:
|
for i in list_to_use:
|
||||||
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"])
|
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session)
|
||||||
self.buffer.list.insert_item(False, *tweet)
|
self.buffer.list.insert_item(False, *tweet)
|
||||||
self.buffer.set_position(self.session.settings["general"]["reverse_timelines"])
|
self.buffer.set_position(self.session.settings["general"]["reverse_timelines"])
|
||||||
elif self.buffer.list.get_count() > 0 and number_of_items > 0:
|
elif self.buffer.list.get_count() > 0 and number_of_items > 0:
|
||||||
if self.session.settings["general"]["reverse_timelines"] == False:
|
if self.session.settings["general"]["reverse_timelines"] == False:
|
||||||
items = self.session.db[self.name][len(self.session.db[self.name])-number_of_items:]
|
items = list_to_use[len(list_to_use)-number_of_items:]
|
||||||
for i in items:
|
for i in items:
|
||||||
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"])
|
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session)
|
||||||
self.buffer.list.insert_item(False, *tweet)
|
self.buffer.list.insert_item(False, *tweet)
|
||||||
else:
|
else:
|
||||||
items = self.session.db[self.name][0:number_of_items]
|
items = list_to_use[0:number_of_items]
|
||||||
items.reverse()
|
items.reverse()
|
||||||
for i in items:
|
for i in items:
|
||||||
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"])
|
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session)
|
||||||
self.buffer.list.insert_item(True, *tweet)
|
self.buffer.list.insert_item(True, *tweet)
|
||||||
log.debug("Now the list contains %d items " % (self.buffer.list.get_count(),))
|
log.debug("Now the list contains %d items " % (self.buffer.list.get_count(),))
|
||||||
|
|
||||||
def add_new_item(self, item):
|
def add_new_item(self, item):
|
||||||
tweet = self.compose_function(item, self.session.db, self.session.settings["general"]["relative_times"])
|
tweet = self.compose_function(item, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session)
|
||||||
if self.session.settings["general"]["reverse_timelines"] == False:
|
if self.session.settings["general"]["reverse_timelines"] == False:
|
||||||
self.buffer.list.insert_item(False, *tweet)
|
self.buffer.list.insert_item(False, *tweet)
|
||||||
else:
|
else:
|
||||||
self.buffer.list.insert_item(True, *tweet)
|
self.buffer.list.insert_item(True, *tweet)
|
||||||
if self.name in self.session.settings["other_buffers"]["autoread_buffers"] and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and self.session.settings["sound"]["session_mute"] == False:
|
if self.name in self.session.settings["other_buffers"]["autoread_buffers"] and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and self.session.settings["sound"]["session_mute"] == False:
|
||||||
output.speak(" ".join(tweet[:2]))
|
output.speak(" ".join(tweet[:2]), speech=self.session.settings["reporting"]["speech_reporting"], braille=self.session.settings["reporting"]["braille_reporting"])
|
||||||
#Improve performance on Windows
|
#Improve performance on Windows
|
||||||
# if platform.system() == "Windows":
|
# if platform.system() == "Windows":
|
||||||
# call_threaded(utils.is_audio,item)
|
# call_threaded(utils.is_audio,item)
|
||||||
@@ -413,7 +467,7 @@ class baseBufferController(bufferController):
|
|||||||
|
|
||||||
def show_menu(self, ev, pos=0, *args, **kwargs):
|
def show_menu(self, ev, pos=0, *args, **kwargs):
|
||||||
if self.buffer.list.get_count() == 0: return
|
if self.buffer.list.get_count() == 0: return
|
||||||
if self.name == "sent_tweets" or self.name == "sent_direct_messages":
|
if self.name == "sent_tweets" or self.name == "direct_messages":
|
||||||
menu = menus.sentPanelMenu()
|
menu = menus.sentPanelMenu()
|
||||||
elif self.name == "direct_messages":
|
elif self.name == "direct_messages":
|
||||||
menu = menus.dmPanelMenu()
|
menu = menus.dmPanelMenu()
|
||||||
@@ -479,28 +533,51 @@ class baseBufferController(bufferController):
|
|||||||
tweet = self.get_right_tweet()
|
tweet = self.get_right_tweet()
|
||||||
screen_name = tweet["user"]["screen_name"]
|
screen_name = tweet["user"]["screen_name"]
|
||||||
id = tweet["id"]
|
id = tweet["id"]
|
||||||
users = len(utils.get_all_mentioned(tweet, self.session.db))
|
twishort_enabled = tweet.has_key("twishort")
|
||||||
message = messages.reply(self.session, _(u"Reply"), _(u"Reply to %s") % (screen_name,), "", twishort_enabled=self.session.settings["mysc"]["twishort_enabled"], users=users)
|
users = utils.get_all_mentioned(tweet, self.session.db, field="screen_name")
|
||||||
|
ids = utils.get_all_mentioned(tweet, self.session.db, field="id_str")
|
||||||
|
# Build the window title
|
||||||
|
if len(users) < 1:
|
||||||
|
title=_("Reply to {arg0}").format(arg0=screen_name)
|
||||||
|
else:
|
||||||
|
title=_("Reply")
|
||||||
|
message = messages.reply(self.session, title, _(u"Reply to %s") % (screen_name,), "", users=users, ids=ids)
|
||||||
if message.message.get_response() == widgetUtils.OK:
|
if message.message.get_response() == widgetUtils.OK:
|
||||||
self.session.settings["mysc"]["twishort_enabled"] = message.message.long_tweet.GetValue()
|
if config.app["app-settings"]["remember_mention_and_longtweet"]:
|
||||||
|
config.app["app-settings"]["longtweet"] = message.message.long_tweet.GetValue()
|
||||||
|
if len(users) > 0:
|
||||||
|
config.app["app-settings"]["mention_all"] = message.message.mentionAll.GetValue()
|
||||||
|
config.app.write()
|
||||||
|
params = {"_sound": "reply_send.ogg", "in_reply_to_status_id": id,}
|
||||||
text = message.message.get_text()
|
text = message.message.get_text()
|
||||||
if len(text) > 140 and message.message.get("long_tweet") == True:
|
if twishort_enabled == False:
|
||||||
|
excluded_ids = message.get_ids()
|
||||||
|
params["exclude_reply_user_ids"] =excluded_ids
|
||||||
|
params["auto_populate_reply_metadata"] =True
|
||||||
|
else:
|
||||||
|
mentioned_people = message.get_people()
|
||||||
|
text = "@"+screen_name+" "+mentioned_people+u" "+text
|
||||||
|
if len(text) > 280 and message.message.get("long_tweet") == True:
|
||||||
if message.image == None:
|
if message.image == None:
|
||||||
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text)
|
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text)
|
||||||
else:
|
else:
|
||||||
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text, 1)
|
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text, 1)
|
||||||
|
params["status"] = text
|
||||||
if message.image == None:
|
if message.image == None:
|
||||||
call_threaded(self.session.api_call, call_name="update_status", _sound="reply_send.ogg", in_reply_to_status_id=id, status=text, auto_populate_reply_metadata=message.message.mentionAll.GetValue())
|
params["call_name"] = "update_status"
|
||||||
else:
|
else:
|
||||||
call_threaded(self.session.api_call, call_name="update_status_with_media", _sound="reply_send.ogg", in_reply_to_status_id=id, status=text, media=message.file, auto_populate_reply_metadata=message.message.mentionAll.GetValue())
|
params["call_name"] = "update_status_with_media"
|
||||||
|
params["media"] = message.file
|
||||||
|
call_threaded(self.session.api_call, **params)
|
||||||
if hasattr(message.message, "destroy"): message.message.destroy()
|
if hasattr(message.message, "destroy"): message.message.destroy()
|
||||||
|
self.session.settings.write()
|
||||||
|
|
||||||
@_tweets_exist
|
@_tweets_exist
|
||||||
def direct_message(self, *args, **kwargs):
|
def direct_message(self, *args, **kwargs):
|
||||||
tweet = self.get_right_tweet()
|
tweet = self.get_right_tweet()
|
||||||
if self.type == "dm":
|
if self.type == "dm":
|
||||||
screen_name = tweet["sender"]["screen_name"]
|
screen_name = self.session.get_user(tweet["message_create"]["sender_id"])["screen_name"]
|
||||||
users = utils.get_all_users(tweet, self.session.db)
|
users = [screen_name]
|
||||||
elif self.type == "people":
|
elif self.type == "people":
|
||||||
screen_name = tweet["screen_name"]
|
screen_name = tweet["screen_name"]
|
||||||
users = [screen_name]
|
users = [screen_name]
|
||||||
@@ -509,13 +586,28 @@ class baseBufferController(bufferController):
|
|||||||
users = utils.get_all_users(tweet, self.session.db)
|
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)
|
dm = messages.dm(self.session, _(u"Direct message to %s") % (screen_name,), _(u"New direct message"), users)
|
||||||
if dm.message.get_response() == widgetUtils.OK:
|
if dm.message.get_response() == widgetUtils.OK:
|
||||||
val = self.session.api_call(call_name="send_direct_message", text=dm.message.get_text(), screen_name=dm.message.get("cb"))
|
screen_name = dm.message.get("cb")
|
||||||
|
user = self.session.get_user_by_screen_name(screen_name)
|
||||||
|
event_data = {
|
||||||
|
'event': {
|
||||||
|
'type': 'message_create',
|
||||||
|
'message_create': {
|
||||||
|
'target': {
|
||||||
|
'recipient_id': user,
|
||||||
|
},
|
||||||
|
'message_data': {
|
||||||
|
'text': dm.message.get_text(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val = self.session.api_call(call_name="send_direct_message", **event_data)
|
||||||
if val != None:
|
if val != None:
|
||||||
if self.session.settings["general"]["reverse_timelines"] == False:
|
if self.session.settings["general"]["reverse_timelines"] == False:
|
||||||
self.session.db["sent_direct_messages"].append(val)
|
self.session.db["sent_direct_messages"]["items"].append(val["event"])
|
||||||
else:
|
else:
|
||||||
self.session.db["sent_direct_messages"].insert(0, val)
|
self.session.db["sent_direct_messages"]["items"].insert(0, val["event"])
|
||||||
pub.sendMessage("sent-dm", data=val, user=self.session.db["user_name"])
|
pub.sendMessage("sent-dm", data=val["event"], user=self.session.db["user_name"])
|
||||||
if hasattr(dm.message, "destroy"): dm.message.destroy()
|
if hasattr(dm.message, "destroy"): dm.message.destroy()
|
||||||
|
|
||||||
@_tweets_exist
|
@_tweets_exist
|
||||||
@@ -538,7 +630,7 @@ class baseBufferController(bufferController):
|
|||||||
comments = tweet["full_text"]
|
comments = tweet["full_text"]
|
||||||
else:
|
else:
|
||||||
comments = tweet["text"]
|
comments = tweet["text"]
|
||||||
retweet = messages.tweet(self.session, _(u"Quote"), _(u"Add your comment to the tweet"), u"“@%s: %s ”" % (tweet["user"]["screen_name"], comments), max=116, messageType="retweet", twishort_enabled=self.session.settings["mysc"]["twishort_enabled"])
|
retweet = messages.tweet(self.session, _(u"Quote"), _(u"Add your comment to the tweet"), u"“@%s: %s ”" % (tweet["user"]["screen_name"], comments), max=256, messageType="retweet")
|
||||||
if comment != '':
|
if comment != '':
|
||||||
retweet.message.set_text(comment)
|
retweet.message.set_text(comment)
|
||||||
if retweet.message.get_response() == widgetUtils.OK:
|
if retweet.message.get_response() == widgetUtils.OK:
|
||||||
@@ -559,16 +651,17 @@ class baseBufferController(bufferController):
|
|||||||
# fix this:
|
# fix this:
|
||||||
original_date = arrow.get(self.session.db[self.name][self.buffer.list.get_selected()]["created_at"], "ddd MMM D H:m:s Z YYYY", locale="en")
|
original_date = arrow.get(self.session.db[self.name][self.buffer.list.get_selected()]["created_at"], "ddd MMM D H:m:s Z YYYY", locale="en")
|
||||||
ts = original_date.humanize(locale=languageHandler.getLanguage())
|
ts = original_date.humanize(locale=languageHandler.getLanguage())
|
||||||
self.buffer.list.list.SetStringItem(self.buffer.list.get_selected(), 2, ts)
|
self.buffer.list.list.SetItem(self.buffer.list.get_selected(), 2, ts)
|
||||||
if utils.is_audio(tweet):
|
if self.session.settings['sound']['indicate_audio'] and utils.is_audio(tweet):
|
||||||
self.session.sound.play("audio.ogg")
|
self.session.sound.play("audio.ogg")
|
||||||
if utils.is_geocoded(tweet):
|
if self.session.settings['sound']['indicate_geo'] and utils.is_geocoded(tweet):
|
||||||
self.session.sound.play("geo.ogg")
|
self.session.sound.play("geo.ogg")
|
||||||
|
if self.session.settings['sound']['indicate_img'] and utils.is_media(tweet):
|
||||||
|
self.session.sound.play("image.ogg")
|
||||||
|
|
||||||
# @_tweets_exist
|
|
||||||
def audio(self, url='', *args, **kwargs):
|
def audio(self, url='', *args, **kwargs):
|
||||||
if hasattr(sound.URLPlayer,'stream') and sound.URLPlayer.stream.is_playing == True:
|
if sound.URLPlayer.player.is_playing():
|
||||||
return sound.URLPlayer.stop_audio(delete=True)
|
return sound.URLPlayer.stop_audio()
|
||||||
tweet = self.get_tweet()
|
tweet = self.get_tweet()
|
||||||
if tweet == None: return
|
if tweet == None: return
|
||||||
urls = utils.find_urls(tweet)
|
urls = utils.find_urls(tweet)
|
||||||
@@ -619,19 +712,20 @@ class baseBufferController(bufferController):
|
|||||||
try:
|
try:
|
||||||
if self.name == "direct_messages" or self.name == "sent_direct_messages":
|
if self.name == "direct_messages" or self.name == "sent_direct_messages":
|
||||||
self.session.twitter.twitter.destroy_direct_message(id=self.get_right_tweet()["id"])
|
self.session.twitter.twitter.destroy_direct_message(id=self.get_right_tweet()["id"])
|
||||||
|
self.session.db[self.name]["items"].pop(index)
|
||||||
else:
|
else:
|
||||||
self.session.twitter.twitter.destroy_status(id=self.get_right_tweet()["id"])
|
self.session.twitter.twitter.destroy_status(id=self.get_right_tweet()["id"])
|
||||||
self.session.db[self.name].pop(index)
|
self.session.db[self.name].pop(index)
|
||||||
self.buffer.list.remove_item(index)
|
self.buffer.list.remove_item(index)
|
||||||
# if index > 0:
|
# if index > 0:
|
||||||
except TwythonError:
|
except TwythonError:
|
||||||
self.session.sound.play("error")
|
self.session.sound.play("error.ogg")
|
||||||
|
|
||||||
@_tweets_exist
|
@_tweets_exist
|
||||||
def user_details(self):
|
def user_details(self):
|
||||||
tweet = self.get_right_tweet()
|
tweet = self.get_right_tweet()
|
||||||
if self.type == "dm":
|
if self.type == "dm":
|
||||||
users = utils.get_all_users(tweet, self.session.db)
|
users = [self.session.get_user(tweet["message_create"]["sender_id"])["screen_name"]]
|
||||||
elif self.type == "people":
|
elif self.type == "people":
|
||||||
users = [tweet["screen_name"]]
|
users = [tweet["screen_name"]]
|
||||||
else:
|
else:
|
||||||
@@ -661,6 +755,106 @@ class baseBufferController(bufferController):
|
|||||||
except IndexError: pass
|
except IndexError: pass
|
||||||
return compose.compose_quoted_tweet(quoted_tweet, original_tweet, self.session.db, self.session.settings["general"]["relative_times"])
|
return compose.compose_quoted_tweet(quoted_tweet, original_tweet, self.session.db, self.session.settings["general"]["relative_times"])
|
||||||
|
|
||||||
|
class directMessagesController(baseBufferController):
|
||||||
|
|
||||||
|
def get_more_items(self):
|
||||||
|
try:
|
||||||
|
items = self.session.get_more_items(self.function, dm=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
|
||||||
|
sent = []
|
||||||
|
for i in items:
|
||||||
|
if i["message_create"]["sender_id"] == self.session.db["user_id"]:
|
||||||
|
if self.session.settings["general"]["reverse_timelines"] == False:
|
||||||
|
self.session.db["sent_direct_messages"]["items"].insert(0, i)
|
||||||
|
else:
|
||||||
|
self.session.db["sent_direct_messages"]["items"].append(i)
|
||||||
|
sent.append(i)
|
||||||
|
else:
|
||||||
|
if self.session.settings["general"]["reverse_timelines"] == False:
|
||||||
|
self.session.db[self.name]["items"].insert(0, i)
|
||||||
|
else:
|
||||||
|
self.session.db[self.name]["items"].append(i)
|
||||||
|
pub.sendMessage("more-sent-dms", data=sent, account=self.session.db["user_name"])
|
||||||
|
selected = self.buffer.list.get_selected()
|
||||||
|
if self.session.settings["general"]["reverse_timelines"] == True:
|
||||||
|
for i in items:
|
||||||
|
if i["message_create"]["sender_id"] == self.session.db["user_id"]:
|
||||||
|
continue
|
||||||
|
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session)
|
||||||
|
self.buffer.list.insert_item(True, *tweet)
|
||||||
|
self.buffer.list.select_item(selected)
|
||||||
|
else:
|
||||||
|
for i in items:
|
||||||
|
if i["message_create"]["sender_id"] == self.session.db["user_id"]:
|
||||||
|
continue
|
||||||
|
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session)
|
||||||
|
self.buffer.list.insert_item(True, *tweet)
|
||||||
|
output.speak(_(u"%s items retrieved") % (len(items)), True)
|
||||||
|
|
||||||
|
def get_tweet(self):
|
||||||
|
tweet = self.session.db[self.name]["items"][self.buffer.list.get_selected()]
|
||||||
|
return tweet
|
||||||
|
|
||||||
|
get_right_tweet = get_tweet
|
||||||
|
|
||||||
|
@_tweets_exist
|
||||||
|
def reply(self, *args, **kwargs):
|
||||||
|
tweet = self.get_right_tweet()
|
||||||
|
screen_name = self.session.get_user(tweet["message_create"]["sender_id"])["screen_name"]
|
||||||
|
message = messages.reply(self.session, _(u"Mention"), _(u"Mention to %s") % (screen_name,), "@%s " % (screen_name,), [screen_name,])
|
||||||
|
if message.message.get_response() == widgetUtils.OK:
|
||||||
|
if config.app["app-settings"]["remember_mention_and_longtweet"]:
|
||||||
|
config.app["app-settings"]["longtweet"] = message.message.long_tweet.GetValue()
|
||||||
|
config.app.write()
|
||||||
|
if message.image == None:
|
||||||
|
call_threaded(self.session.api_call, call_name="update_status", _sound="reply_send.ogg", status=message.message.get_text())
|
||||||
|
else:
|
||||||
|
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 onFocus(self, *args, **kwargs):
|
||||||
|
tweet = self.get_tweet()
|
||||||
|
if platform.system() == "Windows" and self.session.settings["general"]["relative_times"] == True:
|
||||||
|
# fix this:
|
||||||
|
original_date = arrow.get(tweet["created_timestamp"][:-3])
|
||||||
|
ts = original_date.humanize(locale=languageHandler.getLanguage())
|
||||||
|
self.buffer.list.list.SetItem(self.buffer.list.get_selected(), 2, ts)
|
||||||
|
if self.session.settings['sound']['indicate_audio'] and utils.is_audio(tweet):
|
||||||
|
self.session.sound.play("audio.ogg")
|
||||||
|
if self.session.settings['sound']['indicate_img'] and utils.is_media(tweet):
|
||||||
|
self.session.sound.play("image.ogg")
|
||||||
|
|
||||||
|
def clear_list(self):
|
||||||
|
dlg = commonMessageDialogs.clear_list()
|
||||||
|
if dlg == widgetUtils.YES:
|
||||||
|
self.session.db[self.name]["items"] = []
|
||||||
|
self.buffer.list.clear()
|
||||||
|
|
||||||
|
class sentDirectMessagesController(directMessagesController):
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(sentDirectMessagesController, self).__init__(*args, **kwargs)
|
||||||
|
if self.session.db.has_key("sent_direct_messages") == False:
|
||||||
|
self.session.db["sent_direct_messages"] = {"items": []}
|
||||||
|
|
||||||
|
def get_more_items(self):
|
||||||
|
output.speak(_(u"Getting more items cannot be done in this buffer. Use the direct messages buffer instead."))
|
||||||
|
|
||||||
|
def start_stream(self, *args, **kwargs):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def put_more_items(self, items):
|
||||||
|
if self.session.settings["general"]["reverse_timelines"] == True:
|
||||||
|
for i in items:
|
||||||
|
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session)
|
||||||
|
self.buffer.list.insert_item(True, *tweet)
|
||||||
|
else:
|
||||||
|
for i in items:
|
||||||
|
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session)
|
||||||
|
self.buffer.list.insert_item(True, *tweet)
|
||||||
|
|
||||||
class listBufferController(baseBufferController):
|
class listBufferController(baseBufferController):
|
||||||
def __init__(self, parent, function, name, sessionObject, account, sound=None, bufferType=None, list_id=None, *args, **kwargs):
|
def __init__(self, parent, function, name, sessionObject, account, sound=None, bufferType=None, list_id=None, *args, **kwargs):
|
||||||
super(listBufferController, self).__init__(parent, function, name, sessionObject, account, sound=None, bufferType=None, *args, **kwargs)
|
super(listBufferController, self).__init__(parent, function, name, sessionObject, account, sound=None, bufferType=None, *args, **kwargs)
|
||||||
@@ -668,25 +862,30 @@ class listBufferController(baseBufferController):
|
|||||||
self.list_id = list_id
|
self.list_id = list_id
|
||||||
self.kwargs["list_id"] = list_id
|
self.kwargs["list_id"] = list_id
|
||||||
|
|
||||||
def start_stream(self, mandatory=False):
|
def start_stream(self, mandatory=False, play_sound=True):
|
||||||
self.get_user_ids()
|
self.get_user_ids()
|
||||||
super(listBufferController, self).start_stream(mandatory)
|
super(listBufferController, self).start_stream(mandatory, play_sound)
|
||||||
|
|
||||||
def get_user_ids(self):
|
def get_user_ids(self):
|
||||||
self.users = []
|
|
||||||
next_cursor = -1
|
next_cursor = -1
|
||||||
while(next_cursor):
|
while(next_cursor):
|
||||||
users = self.session.twitter.twitter.get_list_members(list_id=self.list_id, cursor=next_cursor, include_entities=False, skip_status=True)
|
users = self.session.twitter.twitter.get_list_members(list_id=self.list_id, cursor=next_cursor, include_entities=False, skip_status=True)
|
||||||
for i in users['users']:
|
for i in users['users']:
|
||||||
self.users.append(i["id"])
|
if i["id"] not in self.users:
|
||||||
|
self.users.append(i["id"])
|
||||||
next_cursor = users["next_cursor"]
|
next_cursor = users["next_cursor"]
|
||||||
|
|
||||||
def remove_buffer(self):
|
def remove_buffer(self, force=False):
|
||||||
dlg = commonMessageDialogs.remove_buffer()
|
if force == False:
|
||||||
|
dlg = commonMessageDialogs.remove_buffer()
|
||||||
|
else:
|
||||||
|
dlg = widgetUtils.YES
|
||||||
if dlg == widgetUtils.YES:
|
if dlg == widgetUtils.YES:
|
||||||
if self.name[:-5] in self.session.settings["other_buffers"]["lists"]:
|
if self.name[:-5] in self.session.settings["other_buffers"]["lists"]:
|
||||||
self.session.settings["other_buffers"]["lists"].remove(self.name[:-5])
|
self.session.settings["other_buffers"]["lists"].remove(self.name[:-5])
|
||||||
self.session.db.pop(self.name)
|
if self.session.db.has_key(self.name):
|
||||||
|
self.session.db.pop(self.name)
|
||||||
|
self.session.settings.write()
|
||||||
return True
|
return True
|
||||||
elif dlg == widgetUtils.NO:
|
elif dlg == widgetUtils.NO:
|
||||||
return False
|
return False
|
||||||
@@ -711,13 +910,13 @@ class eventsBufferController(bufferController):
|
|||||||
return "%s. %s" % (self.buffer.list.list.GetItemText(self.buffer.list.get_selected()), self.buffer.list.list.GetItemText(self.buffer.list.get_selected(), 1))
|
return "%s. %s" % (self.buffer.list.list.GetItemText(self.buffer.list.get_selected()), self.buffer.list.list.GetItemText(self.buffer.list.get_selected(), 1))
|
||||||
|
|
||||||
def add_new_item(self, item):
|
def add_new_item(self, item):
|
||||||
tweet = self.compose_function(item, self.session.db["user_name"])
|
tweet = self.compose_function(item, self.session.db["user_name"], self.session.settings["general"]["show_screen_names"])
|
||||||
if self.session.settings["general"]["reverse_timelines"] == False:
|
if self.session.settings["general"]["reverse_timelines"] == False:
|
||||||
self.buffer.list.insert_item(False, *tweet)
|
self.buffer.list.insert_item(False, *tweet)
|
||||||
else:
|
else:
|
||||||
self.buffer.list.insert_item(True, *tweet)
|
self.buffer.list.insert_item(True, *tweet)
|
||||||
if self.name in self.session.settings["other_buffers"]["autoread_buffers"] and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and self.session.settings["sound"]["session_mute"] == False:
|
if self.name in self.session.settings["other_buffers"]["autoread_buffers"] and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and self.session.settings["sound"]["session_mute"] == False:
|
||||||
output.speak(" ".join(tweet))
|
output.speak(" ".join(tweet), speech=self.session.settings["reporting"]["speech_reporting"], braille=self.session.settings["reporting"]["braille_reporting"])
|
||||||
if self.buffer.list.get_count() == 1:
|
if self.buffer.list.get_count() == 1:
|
||||||
self.buffer.list.select_item(0)
|
self.buffer.list.select_item(0)
|
||||||
|
|
||||||
@@ -751,23 +950,43 @@ class peopleBufferController(baseBufferController):
|
|||||||
log.debug("Compose_function: %s" % (self.compose_function,))
|
log.debug("Compose_function: %s" % (self.compose_function,))
|
||||||
self.get_tweet = self.get_right_tweet
|
self.get_tweet = self.get_right_tweet
|
||||||
self.url = self.interact
|
self.url = self.interact
|
||||||
|
if "-followers" in self.name or "-friends" in self.name:
|
||||||
|
self.finished_timeline = False
|
||||||
|
# Add a compatibility layer for username based timelines from config.
|
||||||
|
# ToDo: Remove this in some new versions of the client, when user ID timelines become mandatory.
|
||||||
|
try:
|
||||||
|
int(self.kwargs["user_id"])
|
||||||
|
except ValueError:
|
||||||
|
self.is_screen_name = True
|
||||||
|
self.kwargs["screen_name"] = self.kwargs["user_id"]
|
||||||
|
self.kwargs.pop("user_id")
|
||||||
|
|
||||||
def remove_buffer(self):
|
def remove_buffer(self, force=True):
|
||||||
if "-followers" in self.name:
|
if "-followers" in self.name:
|
||||||
dlg = commonMessageDialogs.remove_buffer()
|
if force == False:
|
||||||
|
dlg = commonMessageDialogs.remove_buffer()
|
||||||
|
else:
|
||||||
|
dlg = widgetUtils.YES
|
||||||
if dlg == widgetUtils.YES:
|
if dlg == widgetUtils.YES:
|
||||||
if self.name[:-10] in self.session.settings["other_buffers"]["followers_timelines"]:
|
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.settings["other_buffers"]["followers_timelines"].remove(self.name[:-10])
|
||||||
self.session.db.pop(self.name)
|
if self.session.db.has_key(self.name):
|
||||||
|
self.session.db.pop(self.name)
|
||||||
|
self.session.settings.write()
|
||||||
return True
|
return True
|
||||||
elif dlg == widgetUtils.NO:
|
elif dlg == widgetUtils.NO:
|
||||||
return False
|
return False
|
||||||
elif "-friends" in self.name:
|
elif "-friends" in self.name:
|
||||||
dlg = commonMessageDialogs.remove_buffer()
|
if force == False:
|
||||||
|
dlg = commonMessageDialogs.remove_buffer()
|
||||||
|
else:
|
||||||
|
dlg = widgetUtils.YES
|
||||||
if dlg == widgetUtils.YES:
|
if dlg == widgetUtils.YES:
|
||||||
if self.name[:-8] in self.session.settings["other_buffers"]["friends_timelines"]:
|
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.settings["other_buffers"]["friends_timelines"].remove(self.name[:-8])
|
||||||
self.session.db.pop(self.name)
|
if self.session.db.has_key(self.name):
|
||||||
|
self.session.db.pop(self.name)
|
||||||
|
self.session.settings.write()
|
||||||
return True
|
return True
|
||||||
elif dlg == widgetUtils.NO:
|
elif dlg == widgetUtils.NO:
|
||||||
return False
|
return False
|
||||||
@@ -779,7 +998,7 @@ class peopleBufferController(baseBufferController):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def get_message(self):
|
def get_message(self):
|
||||||
return " ".join(self.compose_function(self.get_tweet(), self.session.db, self.session.settings["general"]["relative_times"]))
|
return " ".join(self.compose_function(self.get_tweet(), self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session))
|
||||||
|
|
||||||
def delete_item(self): pass
|
def delete_item(self): pass
|
||||||
|
|
||||||
@@ -789,13 +1008,16 @@ class peopleBufferController(baseBufferController):
|
|||||||
screen_name = tweet["screen_name"]
|
screen_name = tweet["screen_name"]
|
||||||
message = messages.reply(self.session, _(u"Mention"), _(u"Mention to %s") % (screen_name,), "@%s " % (screen_name,), [screen_name,])
|
message = messages.reply(self.session, _(u"Mention"), _(u"Mention to %s") % (screen_name,), "@%s " % (screen_name,), [screen_name,])
|
||||||
if message.message.get_response() == widgetUtils.OK:
|
if message.message.get_response() == widgetUtils.OK:
|
||||||
|
if config.app["app-settings"]["remember_mention_and_longtweet"]:
|
||||||
|
config.app["app-settings"]["longtweet"] = message.message.long_tweet.GetValue()
|
||||||
|
config.app.write()
|
||||||
if message.image == None:
|
if message.image == None:
|
||||||
call_threaded(self.session.api_call, call_name="update_status", _sound="reply_send.ogg", status=message.message.get_text())
|
call_threaded(self.session.api_call, call_name="update_status", _sound="reply_send.ogg", status=message.message.get_text())
|
||||||
else:
|
else:
|
||||||
call_threaded(self.session.api_call, call_name="update_status_with_media", _sound="reply_send.ogg", status=message.message.get_text(), media=message.file)
|
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()
|
if hasattr(message.message, "destroy"): message.message.destroy()
|
||||||
|
|
||||||
def start_stream(self, mandatory=False):
|
def start_stream(self, mandatory=False, play_sound=True):
|
||||||
# starts stream every 3 minutes.
|
# starts stream every 3 minutes.
|
||||||
current_time = time.time()
|
current_time = time.time()
|
||||||
if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory==True:
|
if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory==True:
|
||||||
@@ -804,6 +1026,11 @@ class peopleBufferController(baseBufferController):
|
|||||||
log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs))
|
log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs))
|
||||||
val = self.session.get_cursored_stream(self.name, self.function, *self.args, **self.kwargs)
|
val = self.session.get_cursored_stream(self.name, self.function, *self.args, **self.kwargs)
|
||||||
self.put_items_on_list(val)
|
self.put_items_on_list(val)
|
||||||
|
if hasattr(self, "finished_timeline") and self.finished_timeline == False:
|
||||||
|
self.username = self.session.api_call("show_user", **self.kwargs)["screen_name"]
|
||||||
|
self.finished_timeline = True
|
||||||
|
if val > 0 and self.sound != None and self.session.settings["sound"]["session_mute"] == False and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and play_sound == True:
|
||||||
|
self.session.sound.play(self.sound)
|
||||||
return val
|
return val
|
||||||
|
|
||||||
def get_more_items(self):
|
def get_more_items(self):
|
||||||
@@ -818,19 +1045,15 @@ class peopleBufferController(baseBufferController):
|
|||||||
else:
|
else:
|
||||||
self.session.db[self.name]["items"].append(i)
|
self.session.db[self.name]["items"].append(i)
|
||||||
selected = self.buffer.list.get_selected()
|
selected = self.buffer.list.get_selected()
|
||||||
# self.put_items_on_list(len(items))
|
|
||||||
if self.session.settings["general"]["reverse_timelines"] == True:
|
if self.session.settings["general"]["reverse_timelines"] == True:
|
||||||
for i in items:
|
for i in items:
|
||||||
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"])
|
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session)
|
||||||
self.buffer.list.insert_item(True, *tweet)
|
self.buffer.list.insert_item(True, *tweet)
|
||||||
self.buffer.list.select_item(selected)
|
self.buffer.list.select_item(selected)
|
||||||
else:
|
else:
|
||||||
for i in items:
|
for i in items:
|
||||||
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"])
|
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session)
|
||||||
self.buffer.list.insert_item(True, *tweet)
|
self.buffer.list.insert_item(True, *tweet)
|
||||||
# self.buffer.list.select_item(selection)
|
|
||||||
# else:
|
|
||||||
# self.buffer.list.select_item(selection-elements)
|
|
||||||
output.speak(_(u"%s items retrieved") % (len(items)), True)
|
output.speak(_(u"%s items retrieved") % (len(items)), True)
|
||||||
|
|
||||||
def put_items_on_list(self, number_of_items):
|
def put_items_on_list(self, number_of_items):
|
||||||
@@ -838,7 +1061,7 @@ class peopleBufferController(baseBufferController):
|
|||||||
# log.debug("Putting %d items on the list..." % (number_of_items,))
|
# log.debug("Putting %d items on the list..." % (number_of_items,))
|
||||||
if self.buffer.list.get_count() == 0:
|
if self.buffer.list.get_count() == 0:
|
||||||
for i in self.session.db[self.name]["items"]:
|
for i in self.session.db[self.name]["items"]:
|
||||||
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"])
|
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session)
|
||||||
self.buffer.list.insert_item(False, *tweet)
|
self.buffer.list.insert_item(False, *tweet)
|
||||||
self.buffer.set_position(self.session.settings["general"]["reverse_timelines"])
|
self.buffer.set_position(self.session.settings["general"]["reverse_timelines"])
|
||||||
# self.buffer.set_list_position()
|
# self.buffer.set_list_position()
|
||||||
@@ -848,7 +1071,9 @@ class peopleBufferController(baseBufferController):
|
|||||||
tweet = self.compose_function(i, self.session.db)
|
tweet = self.compose_function(i, self.session.db)
|
||||||
self.buffer.list.insert_item(False, *tweet)
|
self.buffer.list.insert_item(False, *tweet)
|
||||||
else:
|
else:
|
||||||
for i in self.session.db[self.name]["items"][0:number_of_items]:
|
items = self.session.db[self.name]["items"][0:number_of_items]
|
||||||
|
items.reverse()
|
||||||
|
for i in items:
|
||||||
tweet = self.compose_function(i, self.session.db)
|
tweet = self.compose_function(i, self.session.db)
|
||||||
self.buffer.list.insert_item(True, *tweet)
|
self.buffer.list.insert_item(True, *tweet)
|
||||||
log.debug("now the list contains %d items" % (self.buffer.list.get_count(),))
|
log.debug("now the list contains %d items" % (self.buffer.list.get_count(),))
|
||||||
@@ -858,7 +1083,7 @@ class peopleBufferController(baseBufferController):
|
|||||||
return tweet
|
return tweet
|
||||||
|
|
||||||
def add_new_item(self, item):
|
def add_new_item(self, item):
|
||||||
tweet = self.compose_function(item, self.session.db, self.session.settings["general"]["relative_times"])
|
tweet = self.compose_function(item, self.session.db, self.session.settings["general"]["relative_times"], self.session)
|
||||||
if self.session.settings["general"]["reverse_timelines"] == False:
|
if self.session.settings["general"]["reverse_timelines"] == False:
|
||||||
self.buffer.list.insert_item(False, *tweet)
|
self.buffer.list.insert_item(False, *tweet)
|
||||||
else:
|
else:
|
||||||
@@ -893,7 +1118,7 @@ class peopleBufferController(baseBufferController):
|
|||||||
pub.sendMessage("execute-action", action="user_details")
|
pub.sendMessage("execute-action", action="user_details")
|
||||||
|
|
||||||
class searchBufferController(baseBufferController):
|
class searchBufferController(baseBufferController):
|
||||||
def start_stream(self, mandatory=False):
|
def start_stream(self, mandatory=False, play_sound=True):
|
||||||
# starts stream every 3 minutes.
|
# starts stream every 3 minutes.
|
||||||
current_time = time.time()
|
current_time = time.time()
|
||||||
if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory==True:
|
if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory==True:
|
||||||
@@ -902,26 +1127,63 @@ class searchBufferController(baseBufferController):
|
|||||||
log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs))
|
log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs))
|
||||||
log.debug("Function: %s" % (self.function,))
|
log.debug("Function: %s" % (self.function,))
|
||||||
# try:
|
# try:
|
||||||
val = self.session.search(self.name, *self.args, **self.kwargs)
|
val = self.session.search(self.name, count=self.session.settings["general"]["max_tweets_per_call"], *self.args, **self.kwargs)
|
||||||
# except:
|
# except:
|
||||||
# return None
|
# return None
|
||||||
num = self.session.order_buffer(self.name, val)
|
num = self.session.order_buffer(self.name, val)
|
||||||
self.put_items_on_list(num)
|
self.put_items_on_list(num)
|
||||||
if num > 0:
|
if num > 0 and self.sound != None and self.session.settings["sound"]["session_mute"] == False and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and play_sound == True:
|
||||||
self.session.sound.play("search_updated.ogg")
|
self.session.sound.play(self.sound)
|
||||||
return num
|
return num
|
||||||
|
|
||||||
def remove_buffer(self):
|
def remove_buffer(self, force=False):
|
||||||
dlg = commonMessageDialogs.remove_buffer()
|
if force == False:
|
||||||
|
dlg = commonMessageDialogs.remove_buffer()
|
||||||
|
else:
|
||||||
|
dlg = widgetUtils.YES
|
||||||
if dlg == widgetUtils.YES:
|
if dlg == widgetUtils.YES:
|
||||||
if self.name[:-11] in self.session.settings["other_buffers"]["tweet_searches"]:
|
if self.name[:-11] in self.session.settings["other_buffers"]["tweet_searches"]:
|
||||||
self.session.settings["other_buffers"]["tweet_searches"].remove(self.name[:-11])
|
self.session.settings["other_buffers"]["tweet_searches"].remove(self.name[:-11])
|
||||||
self.timer.cancel()
|
self.session.settings.write()
|
||||||
self.session.db.pop(self.name)
|
if self.session.db.has_key(self.name):
|
||||||
|
self.session.db.pop(self.name)
|
||||||
return True
|
return True
|
||||||
elif dlg == widgetUtils.NO:
|
elif dlg == widgetUtils.NO:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def get_more_items(self):
|
||||||
|
elements = []
|
||||||
|
if self.session.settings["general"]["reverse_timelines"] == False:
|
||||||
|
last_id = self.session.db[self.name][0]["id"]
|
||||||
|
else:
|
||||||
|
last_id = self.session.db[self.name][-1]["id"]
|
||||||
|
try:
|
||||||
|
items = self.session.search(self.name, count=self.session.settings["general"]["max_tweets_per_call"], max_id=last_id, *self.args, **self.kwargs)
|
||||||
|
except TwythonError as e:
|
||||||
|
output.speak(e.message, True)
|
||||||
|
for i in items:
|
||||||
|
if utils.is_allowed(i, self.session.settings, self.name) == 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)
|
||||||
|
else:
|
||||||
|
self.session.db[self.name].append(i)
|
||||||
|
selection = self.buffer.list.get_selected()
|
||||||
|
if self.session.settings["general"]["reverse_timelines"] == False:
|
||||||
|
for i in elements:
|
||||||
|
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session)
|
||||||
|
self.buffer.list.insert_item(True, *tweet)
|
||||||
|
else:
|
||||||
|
for i in items:
|
||||||
|
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session)
|
||||||
|
self.buffer.list.insert_item(False, *tweet)
|
||||||
|
# self.buffer.list.select_item(selection+elements)
|
||||||
|
# else:
|
||||||
|
self.buffer.list.select_item(selection)
|
||||||
|
output.speak(_(u"%s items retrieved") % (str(len(elements))), True)
|
||||||
|
|
||||||
class searchPeopleBufferController(peopleBufferController):
|
class searchPeopleBufferController(peopleBufferController):
|
||||||
|
|
||||||
def __init__(self, parent, function, name, sessionObject, account, bufferType="peoplePanel", *args, **kwargs):
|
def __init__(self, parent, function, name, sessionObject, account, bufferType="peoplePanel", *args, **kwargs):
|
||||||
@@ -932,8 +1194,10 @@ class searchPeopleBufferController(peopleBufferController):
|
|||||||
self.args = args
|
self.args = args
|
||||||
self.kwargs = kwargs
|
self.kwargs = kwargs
|
||||||
self.function = function
|
self.function = function
|
||||||
|
if self.kwargs.has_key("page") == False:
|
||||||
|
self.kwargs["page"] = 1
|
||||||
|
|
||||||
def start_stream(self, mandatory=False):
|
def start_stream(self, mandatory=False, play_sound=True):
|
||||||
# starts stream every 3 minutes.
|
# starts stream every 3 minutes.
|
||||||
current_time = time.time()
|
current_time = time.time()
|
||||||
if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory==True:
|
if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory==True:
|
||||||
@@ -948,17 +1212,49 @@ class searchPeopleBufferController(peopleBufferController):
|
|||||||
number_of_items = self.session.order_cursored_buffer(self.name, val)
|
number_of_items = self.session.order_cursored_buffer(self.name, val)
|
||||||
log.debug("Number of items retrieved: %d" % (number_of_items,))
|
log.debug("Number of items retrieved: %d" % (number_of_items,))
|
||||||
self.put_items_on_list(number_of_items)
|
self.put_items_on_list(number_of_items)
|
||||||
if number_of_items > 0:
|
if number_of_items > 0 and self.sound != None and self.session.settings["sound"]["session_mute"] == False and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and play_sound == True:
|
||||||
self.session.sound.play("search_updated.ogg")
|
self.session.sound.play(self.sound)
|
||||||
return number_of_items
|
return number_of_items
|
||||||
|
|
||||||
def remove_buffer(self):
|
def get_more_items(self, *args, **kwargs):
|
||||||
dlg = commonMessageDialogs.remove_buffer()
|
self.kwargs["page"] += 1
|
||||||
|
try:
|
||||||
|
items = self.session.get_more_items(self.function, users=True, name=self.name, count=self.session.settings["general"]["max_tweets_per_call"], *self.args, **self.kwargs)
|
||||||
|
except TwythonError as e:
|
||||||
|
output.speak(e.message, True)
|
||||||
|
return
|
||||||
|
for i in items:
|
||||||
|
if self.session.settings["general"]["reverse_timelines"] == False:
|
||||||
|
self.session.db[self.name]["items"].insert(0, i)
|
||||||
|
else:
|
||||||
|
self.session.db[self.name]["items"].append(i)
|
||||||
|
selected = self.buffer.list.get_selected()
|
||||||
|
# self.put_items_on_list(len(items))
|
||||||
|
if self.session.settings["general"]["reverse_timelines"] == True:
|
||||||
|
for i in items:
|
||||||
|
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session)
|
||||||
|
self.buffer.list.insert_item(True, *tweet)
|
||||||
|
self.buffer.list.select_item(selected)
|
||||||
|
else:
|
||||||
|
for i in items:
|
||||||
|
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session)
|
||||||
|
self.buffer.list.insert_item(True, *tweet)
|
||||||
|
# self.buffer.list.select_item(selection)
|
||||||
|
# else:
|
||||||
|
# self.buffer.list.select_item(selection-elements)
|
||||||
|
output.speak(_(u"%s items retrieved") % (len(items)), True)
|
||||||
|
|
||||||
|
def remove_buffer(self, force=False):
|
||||||
|
if force == False:
|
||||||
|
dlg = commonMessageDialogs.remove_buffer()
|
||||||
|
else:
|
||||||
|
dlg = widgetUtils.YES
|
||||||
if dlg == widgetUtils.YES:
|
if dlg == widgetUtils.YES:
|
||||||
if self.name[:-11] in self.session.settings["other_buffers"]["tweet_searches"]:
|
if self.name[:-11] in self.session.settings["other_buffers"]["tweet_searches"]:
|
||||||
self.session.settings["other_buffers"]["tweet_searches"].remove(self.name[:-11])
|
self.session.settings["other_buffers"]["tweet_searches"].remove(self.name[:-11])
|
||||||
self.timer.cancel()
|
self.session.settings.write()
|
||||||
self.session.db.pop(self.name)
|
if self.session.db.has_key(self.name):
|
||||||
|
self.session.db.pop(self.name)
|
||||||
return True
|
return True
|
||||||
elif dlg == widgetUtils.NO:
|
elif dlg == widgetUtils.NO:
|
||||||
return False
|
return False
|
||||||
@@ -982,7 +1278,7 @@ class trendsBufferController(bufferController):
|
|||||||
self.get_formatted_message = self.get_message
|
self.get_formatted_message = self.get_message
|
||||||
self.reply = self.search_topic
|
self.reply = self.search_topic
|
||||||
|
|
||||||
def start_stream(self, mandatory=False):
|
def start_stream(self, mandatory=False, play_sound=True):
|
||||||
# starts stream every 3 minutes.
|
# starts stream every 3 minutes.
|
||||||
current_time = time.time()
|
current_time = time.time()
|
||||||
if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory == True:
|
if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory == True:
|
||||||
@@ -995,7 +1291,8 @@ class trendsBufferController(bufferController):
|
|||||||
self.name_ = data[0]["locations"][0]["name"]
|
self.name_ = data[0]["locations"][0]["name"]
|
||||||
self.trends = data[0]["trends"]
|
self.trends = data[0]["trends"]
|
||||||
self.put_items_on_the_list()
|
self.put_items_on_the_list()
|
||||||
self.session.sound.play(self.sound)
|
if self.sound != None and self.session.settings["sound"]["session_mute"] == False and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and play_sound == True:
|
||||||
|
self.session.sound.play(self.sound)
|
||||||
|
|
||||||
def put_items_on_the_list(self):
|
def put_items_on_the_list(self):
|
||||||
selected_item = self.buffer.list.get_selected()
|
selected_item = self.buffer.list.get_selected()
|
||||||
@@ -1020,13 +1317,17 @@ class trendsBufferController(bufferController):
|
|||||||
def get_message(self):
|
def get_message(self):
|
||||||
return self.compose_function(self.trends[self.buffer.list.get_selected()])[0]
|
return self.compose_function(self.trends[self.buffer.list.get_selected()])[0]
|
||||||
|
|
||||||
def remove_buffer(self):
|
def remove_buffer(self, force=False):
|
||||||
dlg = commonMessageDialogs.remove_buffer()
|
if force == False:
|
||||||
|
dlg = commonMessageDialogs.remove_buffer()
|
||||||
|
else:
|
||||||
|
dlg = widgetUtils.YES
|
||||||
if dlg == widgetUtils.YES:
|
if dlg == widgetUtils.YES:
|
||||||
if self.name[:-3] in self.session.settings["other_buffers"]["trending_topic_buffers"]:
|
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.session.settings["other_buffers"]["trending_topic_buffers"].remove(self.name[:-3])
|
||||||
self.timer.cancel()
|
self.session.settings.write()
|
||||||
self.session.db.pop(self.name)
|
if self.session.db.has_key(self.name):
|
||||||
|
self.session.db.pop(self.name)
|
||||||
return True
|
return True
|
||||||
elif dlg == widgetUtils.NO:
|
elif dlg == widgetUtils.NO:
|
||||||
return False
|
return False
|
||||||
@@ -1059,12 +1360,11 @@ class trendsBufferController(bufferController):
|
|||||||
if self.buffer.list.get_count() == 0: return
|
if self.buffer.list.get_count() == 0: return
|
||||||
title = _(u"Tweet")
|
title = _(u"Tweet")
|
||||||
caption = _(u"Write the tweet here")
|
caption = _(u"Write the tweet here")
|
||||||
tweet = messages.tweet(self.session, title, caption, self.get_message()+ " ", twishort_enabled=self.session.settings["mysc"]["twishort_enabled"])
|
tweet = messages.tweet(self.session, title, caption, self.get_message()+ " ")
|
||||||
tweet.message.set_cursor_at_end()
|
tweet.message.set_cursor_at_end()
|
||||||
if tweet.message.get_response() == widgetUtils.OK:
|
if tweet.message.get_response() == widgetUtils.OK:
|
||||||
self.session.settings["mysc"]["twishort_enabled"] = tweet.message.long_tweet.GetValue()
|
|
||||||
text = tweet.message.get_text()
|
text = tweet.message.get_text()
|
||||||
if len(text) > 140 and tweet.message.get("long_tweet") == True:
|
if len(text) > 280 and tweet.message.get("long_tweet") == True:
|
||||||
if tweet.image == None:
|
if tweet.image == None:
|
||||||
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text)
|
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text)
|
||||||
else:
|
else:
|
||||||
@@ -1083,7 +1383,7 @@ class trendsBufferController(bufferController):
|
|||||||
|
|
||||||
class conversationBufferController(searchBufferController):
|
class conversationBufferController(searchBufferController):
|
||||||
|
|
||||||
def start_stream(self, start=False, mandatory=False):
|
def start_stream(self, start=False, mandatory=False, play_sound=True):
|
||||||
# starts stream every 3 minutes.
|
# starts stream every 3 minutes.
|
||||||
current_time = time.time()
|
current_time = time.time()
|
||||||
if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory == True:
|
if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory == True:
|
||||||
@@ -1113,14 +1413,18 @@ class conversationBufferController(searchBufferController):
|
|||||||
number_of_items = self.session.order_buffer(self.name, self.statuses)
|
number_of_items = self.session.order_buffer(self.name, self.statuses)
|
||||||
log.debug("Number of items retrieved: %d" % (number_of_items,))
|
log.debug("Number of items retrieved: %d" % (number_of_items,))
|
||||||
self.put_items_on_list(number_of_items)
|
self.put_items_on_list(number_of_items)
|
||||||
if number_of_items > 0:
|
if number_of_items > 0 and self.sound != None and self.session.settings["sound"]["session_mute"] == False and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and play_sound == True:
|
||||||
self.session.sound.play("search_updated.ogg")
|
self.session.sound.play(self.sound)
|
||||||
return number_of_items
|
return number_of_items
|
||||||
|
|
||||||
def remove_buffer(self):
|
def remove_buffer(self, force=False):
|
||||||
dlg = commonMessageDialogs.remove_buffer()
|
if force == False:
|
||||||
|
dlg = commonMessageDialogs.remove_buffer()
|
||||||
|
else:
|
||||||
|
dlg = widgetUtils.YES
|
||||||
if dlg == widgetUtils.YES:
|
if dlg == widgetUtils.YES:
|
||||||
self.timer.cancel()
|
if self.session.db.has_key(self.name):
|
||||||
|
self.session.db.pop(self.name)
|
||||||
return True
|
return True
|
||||||
elif dlg == widgetUtils.NO:
|
elif dlg == widgetUtils.NO:
|
||||||
return False
|
return False
|
||||||
|
76
src/controller/filterController.py
Normal file
76
src/controller/filterController.py
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import time
|
||||||
|
import widgetUtils
|
||||||
|
import application
|
||||||
|
from wxUI.dialogs import filterDialogs
|
||||||
|
from wxUI import commonMessageDialogs
|
||||||
|
|
||||||
|
class filter(object):
|
||||||
|
def __init__(self, buffer, filter_title=None, if_word_exists=None, in_lang=None, regexp=None, word=None, in_buffer=None):
|
||||||
|
self.buffer = buffer
|
||||||
|
self.dialog = filterDialogs.filterDialog(languages=[i["name"] for i in application.supported_languages])
|
||||||
|
if self.dialog.get_response() == widgetUtils.OK:
|
||||||
|
title = self.dialog.get("title")
|
||||||
|
contains = self.dialog.get("contains")
|
||||||
|
term = self.dialog.get("term")
|
||||||
|
regexp = self.dialog.get("regexp")
|
||||||
|
allow_rts = self.dialog.get("allow_rts")
|
||||||
|
allow_quotes = self.dialog.get("allow_quotes")
|
||||||
|
allow_replies = self.dialog.get("allow_replies")
|
||||||
|
load_language = self.dialog.get("load_language")
|
||||||
|
ignore_language = self.dialog.get("ignore_language")
|
||||||
|
lang_option = None
|
||||||
|
if ignore_language:
|
||||||
|
lang_option = False
|
||||||
|
elif load_language:
|
||||||
|
lang_option = True
|
||||||
|
langs = self.dialog.get_selected_langs()
|
||||||
|
langcodes = []
|
||||||
|
for i in application.supported_languages:
|
||||||
|
if i["name"] in langs:
|
||||||
|
langcodes.append(i["code"])
|
||||||
|
d = dict(in_buffer=self.buffer.name, word=term, regexp=regexp, in_lang=lang_option, languages=langcodes, if_word_exists=contains, allow_rts=allow_rts, allow_quotes=allow_quotes, allow_replies=allow_replies)
|
||||||
|
if self.buffer.session.settings["filters"].has_key(title):
|
||||||
|
return commonMessageDialogs.existing_filter()
|
||||||
|
self.buffer.session.settings["filters"][title] = d
|
||||||
|
self.buffer.session.settings.write()
|
||||||
|
|
||||||
|
class filterManager(object):
|
||||||
|
|
||||||
|
def __init__(self, session):
|
||||||
|
self.session = session
|
||||||
|
self.dialog = filterDialogs.filterManagerDialog()
|
||||||
|
self.insert_filters(self.session.settings["filters"])
|
||||||
|
if self.dialog.filters.get_count() == 0:
|
||||||
|
self.dialog.edit.Enable(False)
|
||||||
|
self.dialog.delete.Enable(False)
|
||||||
|
else:
|
||||||
|
widgetUtils.connect_event(self.dialog.edit, widgetUtils.BUTTON_PRESSED, self.edit_filter)
|
||||||
|
widgetUtils.connect_event(self.dialog.delete, widgetUtils.BUTTON_PRESSED, self.delete_filter)
|
||||||
|
response = self.dialog.get_response()
|
||||||
|
|
||||||
|
def insert_filters(self, filters):
|
||||||
|
self.dialog.filters.clear()
|
||||||
|
for f in filters.keys():
|
||||||
|
filterName = f
|
||||||
|
buffer = filters[f]["in_buffer"]
|
||||||
|
if filters[f]["if_word_exists"] == "True" and filters[f]["word"] != "":
|
||||||
|
filter_by_word = "True"
|
||||||
|
else:
|
||||||
|
filter_by_word = "False"
|
||||||
|
filter_by_lang = ""
|
||||||
|
if filters[f]["in_lang"] != "None":
|
||||||
|
filter_by_lang = "True"
|
||||||
|
b = [f, buffer, filter_by_word, filter_by_lang]
|
||||||
|
self.dialog.filters.insert_item(False, *b)
|
||||||
|
|
||||||
|
def edit_filter(self, *args, **kwargs):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def delete_filter(self, *args, **kwargs):
|
||||||
|
filter_title = self.dialog.filters.get_text_column(self.dialog.filters.get_selected(), 0)
|
||||||
|
response = commonMessageDialogs.delete_filter()
|
||||||
|
if response == widgetUtils.YES:
|
||||||
|
self.session.settings["filters"].pop(filter_title)
|
||||||
|
self.session.settings.write()
|
||||||
|
self.insert_filters(self.session.settings["filters"])
|
@@ -1,7 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
from wxUI.dialogs import filters
|
|
||||||
|
|
||||||
class filterController(object):
|
|
||||||
def __init__(self):
|
|
||||||
self.dialog = filters.filterDialog()
|
|
||||||
self.dialog.get_response()
|
|
File diff suppressed because it is too large
Load Diff
@@ -7,9 +7,12 @@ import widgetUtils
|
|||||||
import output
|
import output
|
||||||
import url_shortener
|
import url_shortener
|
||||||
import sound
|
import sound
|
||||||
|
import config
|
||||||
from pubsub import pub
|
from pubsub import pub
|
||||||
if system == "Windows":
|
if system == "Windows":
|
||||||
from wxUI.dialogs import message, urlList
|
from wxUI.dialogs import message, urlList
|
||||||
|
from wxUI import commonMessageDialogs
|
||||||
|
|
||||||
from extra import translator, SpellChecker, autocompletionUsers
|
from extra import translator, SpellChecker, autocompletionUsers
|
||||||
from extra.AudioUploader import audioUploader
|
from extra.AudioUploader import audioUploader
|
||||||
elif system == "Linux":
|
elif system == "Linux":
|
||||||
@@ -18,31 +21,30 @@ from twitter import utils
|
|||||||
|
|
||||||
class basicTweet(object):
|
class basicTweet(object):
|
||||||
""" This class handles the tweet main features. Other classes should derive from this class."""
|
""" This class handles the tweet main features. Other classes should derive from this class."""
|
||||||
def __init__(self, session, title, caption, text, messageType="tweet", max=140):
|
def __init__(self, session, title, caption, text, messageType="tweet", max=280, *args, **kwargs):
|
||||||
super(basicTweet, self).__init__()
|
super(basicTweet, self).__init__()
|
||||||
self.max = max
|
self.max = max
|
||||||
self.title = title
|
self.title = title
|
||||||
self.session = session
|
self.session = session
|
||||||
self.message = getattr(message, messageType)(title, caption, text)
|
self.message = getattr(message, messageType)(title, caption, text, *args, **kwargs)
|
||||||
widgetUtils.connect_event(self.message.spellcheck, widgetUtils.BUTTON_PRESSED, self.spellcheck)
|
widgetUtils.connect_event(self.message.spellcheck, widgetUtils.BUTTON_PRESSED, self.spellcheck)
|
||||||
widgetUtils.connect_event(self.message.attach, widgetUtils.BUTTON_PRESSED, self.attach)
|
widgetUtils.connect_event(self.message.attach, widgetUtils.BUTTON_PRESSED, self.attach)
|
||||||
# if system == "Windows":
|
|
||||||
# if messageType != "dm":
|
|
||||||
widgetUtils.connect_event(self.message.text, widgetUtils.ENTERED_TEXT, self.text_processor)
|
widgetUtils.connect_event(self.message.text, widgetUtils.ENTERED_TEXT, self.text_processor)
|
||||||
widgetUtils.connect_event(self.message.shortenButton, widgetUtils.BUTTON_PRESSED, self.shorten)
|
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.unshortenButton, widgetUtils.BUTTON_PRESSED, self.unshorten)
|
||||||
widgetUtils.connect_event(self.message.translateButton, widgetUtils.BUTTON_PRESSED, self.translate)
|
widgetUtils.connect_event(self.message.translateButton, widgetUtils.BUTTON_PRESSED, self.translate)
|
||||||
if hasattr(self.message, "long_tweet"):
|
if hasattr(self.message, "long_tweet"):
|
||||||
widgetUtils.connect_event(self.message.long_tweet, widgetUtils.CHECKBOX, self.text_processor)
|
widgetUtils.connect_event(self.message.long_tweet, widgetUtils.CHECKBOX, self.text_processor)
|
||||||
|
if config.app["app-settings"]["remember_mention_and_longtweet"]:
|
||||||
|
self.message.long_tweet.SetValue(config.app["app-settings"]["longtweet"])
|
||||||
self.attachments = []
|
self.attachments = []
|
||||||
|
|
||||||
def translate(self, event=None):
|
def translate(self, event=None):
|
||||||
dlg = translator.gui.translateDialog()
|
dlg = translator.gui.translateDialog()
|
||||||
if dlg.get_response() == widgetUtils.OK:
|
if dlg.get_response() == widgetUtils.OK:
|
||||||
text_to_translate = self.message.get_text()
|
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")]
|
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)
|
msg = translator.translator.translate(text=text_to_translate, target=dest)
|
||||||
self.message.set_text(msg)
|
self.message.set_text(msg)
|
||||||
self.text_processor()
|
self.text_processor()
|
||||||
self.message.text_focus()
|
self.message.text_focus()
|
||||||
@@ -115,24 +117,22 @@ class basicTweet(object):
|
|||||||
url = dlg.uploaderFunction.get_url()
|
url = dlg.uploaderFunction.get_url()
|
||||||
pub.unsubscribe(dlg.uploaderDialog.update, "uploading")
|
pub.unsubscribe(dlg.uploaderDialog.update, "uploading")
|
||||||
dlg.uploaderDialog.destroy()
|
dlg.uploaderDialog.destroy()
|
||||||
if url != 0:
|
if "sndup.net/" in url:
|
||||||
self.message.set_text(self.message.get_text()+url+" #audio")
|
self.message.set_text(self.message.get_text()+url+" #audio")
|
||||||
self.text_processor()
|
self.text_processor()
|
||||||
else:
|
else:
|
||||||
output.speak(_(u"Unable to upload the audio"))
|
commonMessageDialogs.common_error(url)
|
||||||
|
|
||||||
dlg.cleanup()
|
dlg.cleanup()
|
||||||
dlg = audioUploader.audioUploader(self.session.settings, completed_callback)
|
dlg = audioUploader.audioUploader(self.session.settings, completed_callback)
|
||||||
self.message.text_focus()
|
self.message.text_focus()
|
||||||
|
|
||||||
class tweet(basicTweet):
|
class tweet(basicTweet):
|
||||||
def __init__(self, session, title, caption, text, twishort_enabled, messageType="tweet", max=140):
|
def __init__(self, session, title, caption, text, max=280, messageType="tweet", *args, **kwargs):
|
||||||
super(tweet, self).__init__(session, title, caption, text, messageType, max)
|
super(tweet, self).__init__(session, title, caption, text, messageType, max, *args, **kwargs)
|
||||||
self.image = None
|
self.image = None
|
||||||
widgetUtils.connect_event(self.message.upload_image, widgetUtils.BUTTON_PRESSED, self.upload_image)
|
widgetUtils.connect_event(self.message.upload_image, widgetUtils.BUTTON_PRESSED, self.upload_image)
|
||||||
widgetUtils.connect_event(self.message.autocompletionButton, widgetUtils.BUTTON_PRESSED, self.autocomplete_users)
|
widgetUtils.connect_event(self.message.autocompletionButton, widgetUtils.BUTTON_PRESSED, self.autocomplete_users)
|
||||||
if twishort_enabled == False:
|
|
||||||
try: self.message.long_tweet.SetValue(False)
|
|
||||||
except AttributeError: pass
|
|
||||||
self.text_processor()
|
self.text_processor()
|
||||||
|
|
||||||
def upload_image(self, *args, **kwargs):
|
def upload_image(self, *args, **kwargs):
|
||||||
@@ -145,21 +145,42 @@ class tweet(basicTweet):
|
|||||||
c.show_menu()
|
c.show_menu()
|
||||||
|
|
||||||
class reply(tweet):
|
class reply(tweet):
|
||||||
def __init__(self, session, title, caption, text, twishort_enabled, users=None):
|
def __init__(self, session, title, caption, text, users=[], ids=[]):
|
||||||
super(reply, self).__init__(session, title, caption, text, twishort_enabled, messageType="reply")
|
super(reply, self).__init__(session, title, caption, text, messageType="reply", users=users)
|
||||||
self.message.mentionAll.SetValue(True)
|
self.ids = ids
|
||||||
if users > 1:
|
self.users = users
|
||||||
# widgetUtils.connect_event(self.message.mentionAll, widgetUtils.CHECKBOX, self.mention_all)
|
if len(users) > 0:
|
||||||
|
widgetUtils.connect_event(self.message.mentionAll, widgetUtils.CHECKBOX, self.mention_all)
|
||||||
self.message.enable_button("mentionAll")
|
self.message.enable_button("mentionAll")
|
||||||
self.message.mentionAll.SetValue(False)
|
if config.app["app-settings"]["remember_mention_and_longtweet"]:
|
||||||
|
self.message.mentionAll.SetValue(config.app["app-settings"]["mention_all"])
|
||||||
|
self.mention_all()
|
||||||
self.message.set_cursor_at_end()
|
self.message.set_cursor_at_end()
|
||||||
self.text_processor()
|
self.text_processor()
|
||||||
|
|
||||||
def mention_all(self, *args, **kwargs):
|
def mention_all(self, *args, **kwargs):
|
||||||
self.message.set_text(self.message.get_text()+self.users)
|
if self.message.mentionAll.GetValue() == True:
|
||||||
self.message.set_cursor_at_end()
|
for i in self.message.checkboxes:
|
||||||
self.message.text_focus()
|
i.SetValue(True)
|
||||||
self.text_processor()
|
i.Hide()
|
||||||
|
else:
|
||||||
|
for i in self.message.checkboxes:
|
||||||
|
i.SetValue(False)
|
||||||
|
i.Show()
|
||||||
|
|
||||||
|
def get_ids(self):
|
||||||
|
excluded_ids = ""
|
||||||
|
for i in xrange(0, len(self.message.checkboxes)):
|
||||||
|
if self.message.checkboxes[i].GetValue() == False:
|
||||||
|
excluded_ids = excluded_ids + "{0},".format(self.ids[i],)
|
||||||
|
return excluded_ids
|
||||||
|
|
||||||
|
def get_people(self):
|
||||||
|
people = ""
|
||||||
|
for i in xrange(0, len(self.message.checkboxes)):
|
||||||
|
if self.message.checkboxes[i].GetValue() == True:
|
||||||
|
people = people + "{0} ".format(self.message.checkboxes[i].GetLabel(),)
|
||||||
|
return people
|
||||||
|
|
||||||
class dm(basicTweet):
|
class dm(basicTweet):
|
||||||
def __init__(self, session, title, caption, text):
|
def __init__(self, session, title, caption, text):
|
||||||
@@ -178,6 +199,7 @@ class viewTweet(basicTweet):
|
|||||||
param tweetList: If is_tweet is set to True, this could be a list of quoted 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."""
|
param is_tweet: True or false, depending wether the passed object is a tweet or not."""
|
||||||
if is_tweet == True:
|
if is_tweet == True:
|
||||||
|
self.title = _(u"Tweet")
|
||||||
image_description = []
|
image_description = []
|
||||||
text = ""
|
text = ""
|
||||||
for i in xrange(0, len(tweetList)):
|
for i in xrange(0, len(tweetList)):
|
||||||
@@ -198,6 +220,10 @@ class viewTweet(basicTweet):
|
|||||||
for z in tweetList[i]["extended_entities"]["media"]:
|
for z in tweetList[i]["extended_entities"]["media"]:
|
||||||
if z.has_key("ext_alt_text") and z["ext_alt_text"] != None:
|
if z.has_key("ext_alt_text") and z["ext_alt_text"] != None:
|
||||||
image_description.append(z["ext_alt_text"])
|
image_description.append(z["ext_alt_text"])
|
||||||
|
if tweetList[i].has_key("retweeted_status") and tweetList[i]["retweeted_status"].has_key("extended_entities") and tweetList[i]["retweeted_status"]["extended_entities"].has_key("media"):
|
||||||
|
for z in tweetList[i]["retweeted_status"]["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.
|
# set rt and likes counters.
|
||||||
rt_count = str(tweet["retweet_count"])
|
rt_count = str(tweet["retweet_count"])
|
||||||
favs_count = str(tweet["favorite_count"])
|
favs_count = str(tweet["favorite_count"])
|
||||||
@@ -220,10 +246,15 @@ class viewTweet(basicTweet):
|
|||||||
for z in tweet["extended_entities"]["media"]:
|
for z in tweet["extended_entities"]["media"]:
|
||||||
if z.has_key("ext_alt_text") and z["ext_alt_text"] != None:
|
if z.has_key("ext_alt_text") and z["ext_alt_text"] != None:
|
||||||
image_description.append(z["ext_alt_text"])
|
image_description.append(z["ext_alt_text"])
|
||||||
|
if tweet.has_key("retweeted_status") and tweet["retweeted_status"].has_key("extended_entities") and tweet["retweeted_status"]["extended_entities"].has_key("media"):
|
||||||
|
for z in tweet["retweeted_status"]["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 = message.viewTweet(text, rt_count, favs_count, source.decode("utf-8"))
|
||||||
self.message.set_title(len(text))
|
self.message.set_title(len(text))
|
||||||
[self.message.set_image_description(i) for i in image_description]
|
[self.message.set_image_description(i) for i in image_description]
|
||||||
else:
|
else:
|
||||||
|
self.title = _(u"View item")
|
||||||
text = tweet
|
text = tweet
|
||||||
self.message = message.viewNonTweet(text)
|
self.message = message.viewNonTweet(text)
|
||||||
widgetUtils.connect_event(self.message.spellcheck, widgetUtils.BUTTON_PRESSED, self.spellcheck)
|
widgetUtils.connect_event(self.message.spellcheck, widgetUtils.BUTTON_PRESSED, self.spellcheck)
|
||||||
|
@@ -11,6 +11,7 @@ import application
|
|||||||
from wxUI.dialogs import configuration
|
from wxUI.dialogs import configuration
|
||||||
from wxUI import commonMessageDialogs
|
from wxUI import commonMessageDialogs
|
||||||
from extra.autocompletionUsers import settings
|
from extra.autocompletionUsers import settings
|
||||||
|
from extra.ocr import OCRSpace
|
||||||
from pubsub import pub
|
from pubsub import pub
|
||||||
import logging
|
import logging
|
||||||
import config_utils
|
import config_utils
|
||||||
@@ -60,14 +61,22 @@ class globalSettingsController(object):
|
|||||||
else:
|
else:
|
||||||
self.dialog.general.autostart.Enable(False)
|
self.dialog.general.autostart.Enable(False)
|
||||||
self.dialog.set_value("general", "ask_at_exit", config.app["app-settings"]["ask_at_exit"])
|
self.dialog.set_value("general", "ask_at_exit", config.app["app-settings"]["ask_at_exit"])
|
||||||
|
self.dialog.set_value("general", "no_streaming", config.app["app-settings"]["no_streaming"])
|
||||||
self.dialog.set_value("general", "play_ready_sound", config.app["app-settings"]["play_ready_sound"])
|
self.dialog.set_value("general", "play_ready_sound", config.app["app-settings"]["play_ready_sound"])
|
||||||
self.dialog.set_value("general", "speak_ready_msg", config.app["app-settings"]["speak_ready_msg"])
|
self.dialog.set_value("general", "speak_ready_msg", config.app["app-settings"]["speak_ready_msg"])
|
||||||
self.dialog.set_value("general", "handle_longtweets", config.app["app-settings"]["handle_longtweets"])
|
self.dialog.set_value("general", "handle_longtweets", config.app["app-settings"]["handle_longtweets"])
|
||||||
self.dialog.set_value("general", "use_invisible_shorcuts", config.app["app-settings"]["use_invisible_keyboard_shorcuts"])
|
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", "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", "hide_gui", config.app["app-settings"]["hide_gui"])
|
||||||
|
self.dialog.set_value("general", "update_period", config.app["app-settings"]["update_period"])
|
||||||
self.dialog.set_value("general", "check_for_updates", config.app["app-settings"]["check_for_updates"])
|
self.dialog.set_value("general", "check_for_updates", config.app["app-settings"]["check_for_updates"])
|
||||||
self.dialog.create_proxy()
|
self.dialog.set_value("general", "remember_mention_and_longtweet", config.app["app-settings"]["remember_mention_and_longtweet"])
|
||||||
|
proxyTypes=config.proxyTypes
|
||||||
|
self.dialog.create_proxy([_(u"Direct connection")]+proxyTypes)
|
||||||
|
if config.app["proxy"]["type"] not in proxyTypes:
|
||||||
|
self.dialog.proxy.type.SetSelection(0)
|
||||||
|
else:
|
||||||
|
self.dialog.proxy.type.SetSelection(proxyTypes.index(config.app["proxy"]["type"])+1)
|
||||||
self.dialog.set_value("proxy", "server", config.app["proxy"]["server"])
|
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", "port", config.app["proxy"]["port"])
|
||||||
self.dialog.set_value("proxy", "user", config.app["proxy"]["user"])
|
self.dialog.set_value("proxy", "user", config.app["proxy"]["user"])
|
||||||
@@ -86,13 +95,18 @@ class globalSettingsController(object):
|
|||||||
kmFile = open(paths.config_path("keymap.keymap"), "w")
|
kmFile = open(paths.config_path("keymap.keymap"), "w")
|
||||||
kmFile.close()
|
kmFile.close()
|
||||||
self.needs_restart = True
|
self.needs_restart = True
|
||||||
|
|
||||||
if config.app["app-settings"]["autostart"] != self.dialog.get_value("general", "autostart") and paths.mode == "installed":
|
if config.app["app-settings"]["autostart"] != self.dialog.get_value("general", "autostart") and paths.mode == "installed":
|
||||||
config.app["app-settings"]["autostart"] = self.dialog.get_value("general", "autostart")
|
config.app["app-settings"]["autostart"] = self.dialog.get_value("general", "autostart")
|
||||||
autostart_windows.setAutoStart(application.name, enable=self.dialog.get_value("general", "autostart"))
|
autostart_windows.setAutoStart(application.name, enable=self.dialog.get_value("general", "autostart"))
|
||||||
if config.app["app-settings"]["use_invisible_keyboard_shorcuts"] != self.dialog.get_value("general", "use_invisible_shorcuts"):
|
if config.app["app-settings"]["use_invisible_keyboard_shorcuts"] != self.dialog.get_value("general", "use_invisible_shorcuts"):
|
||||||
config.app["app-settings"]["use_invisible_keyboard_shorcuts"] = self.dialog.get_value("general", "use_invisible_shorcuts")
|
config.app["app-settings"]["use_invisible_keyboard_shorcuts"] = self.dialog.get_value("general", "use_invisible_shorcuts")
|
||||||
pub.sendMessage("invisible-shorcuts-changed", registered=self.dialog.get_value("general", "use_invisible_shorcuts"))
|
pub.sendMessage("invisible-shorcuts-changed", registered=self.dialog.get_value("general", "use_invisible_shorcuts"))
|
||||||
|
if config.app["app-settings"]["no_streaming"] != self.dialog.get_value("general", "no_streaming"):
|
||||||
|
config.app["app-settings"]["no_streaming"] = self.dialog.get_value("general", "no_streaming")
|
||||||
|
self.needs_restart = True
|
||||||
|
if config.app["app-settings"]["update_period"] != self.dialog.get_value("general", "update_period"):
|
||||||
|
config.app["app-settings"]["update_period"] = self.dialog.get_value("general", "update_period")
|
||||||
|
self.needs_restart = True
|
||||||
config.app["app-settings"]["voice_enabled"] = self.dialog.get_value("general", "disable_sapi5")
|
config.app["app-settings"]["voice_enabled"] = self.dialog.get_value("general", "disable_sapi5")
|
||||||
config.app["app-settings"]["hide_gui"] = self.dialog.get_value("general", "hide_gui")
|
config.app["app-settings"]["hide_gui"] = self.dialog.get_value("general", "hide_gui")
|
||||||
config.app["app-settings"]["ask_at_exit"] = self.dialog.get_value("general", "ask_at_exit")
|
config.app["app-settings"]["ask_at_exit"] = self.dialog.get_value("general", "ask_at_exit")
|
||||||
@@ -100,9 +114,11 @@ class globalSettingsController(object):
|
|||||||
config.app["app-settings"]["play_ready_sound"] = self.dialog.get_value("general", "play_ready_sound")
|
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"]["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")
|
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"):
|
config.app["app-settings"]["remember_mention_and_longtweet"] = self.dialog.get_value("general", "remember_mention_and_longtweet")
|
||||||
|
if config.app["proxy"]["type"]!=self.dialog.get_value("proxy", "type") or 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:
|
if self.is_started == True:
|
||||||
self.needs_restart = True
|
self.needs_restart = True
|
||||||
|
config.app["proxy"]["type"]=self.dialog.get_value("proxy", "type")
|
||||||
config.app["proxy"]["server"] = self.dialog.get_value("proxy", "server")
|
config.app["proxy"]["server"] = self.dialog.get_value("proxy", "server")
|
||||||
config.app["proxy"]["port"] = self.dialog.get_value("proxy", "port")
|
config.app["proxy"]["port"] = self.dialog.get_value("proxy", "port")
|
||||||
config.app["proxy"]["user"] = self.dialog.get_value("proxy", "user")
|
config.app["proxy"]["user"] = self.dialog.get_value("proxy", "user")
|
||||||
@@ -121,7 +137,9 @@ class accountSettingsController(globalSettingsController):
|
|||||||
self.dialog.create_general_account()
|
self.dialog.create_general_account()
|
||||||
widgetUtils.connect_event(self.dialog.general.au, widgetUtils.BUTTON_PRESSED, self.manage_autocomplete)
|
widgetUtils.connect_event(self.dialog.general.au, widgetUtils.BUTTON_PRESSED, self.manage_autocomplete)
|
||||||
self.dialog.set_value("general", "relative_time", self.config["general"]["relative_times"])
|
self.dialog.set_value("general", "relative_time", self.config["general"]["relative_times"])
|
||||||
self.dialog.set_value("general", "apiCalls", self.config["general"]["max_api_calls"])
|
self.dialog.set_value("general", "show_screen_names", self.config["general"]["show_screen_names"])
|
||||||
|
if application.streaming_lives():
|
||||||
|
self.dialog.set_value("general", "apiCalls", self.config["general"]["max_api_calls"])
|
||||||
self.dialog.set_value("general", "itemsPerApiCall", self.config["general"]["max_tweets_per_call"])
|
self.dialog.set_value("general", "itemsPerApiCall", self.config["general"]["max_tweets_per_call"])
|
||||||
self.dialog.set_value("general", "reverse_timelines", self.config["general"]["reverse_timelines"])
|
self.dialog.set_value("general", "reverse_timelines", self.config["general"]["reverse_timelines"])
|
||||||
rt = self.config["general"]["retweet_mode"]
|
rt = self.config["general"]["retweet_mode"]
|
||||||
@@ -132,6 +150,9 @@ class accountSettingsController(globalSettingsController):
|
|||||||
else:
|
else:
|
||||||
self.dialog.set_value("general", "retweet_mode", _(u"Retweet with comments"))
|
self.dialog.set_value("general", "retweet_mode", _(u"Retweet with comments"))
|
||||||
self.dialog.set_value("general", "persist_size", str(self.config["general"]["persist_size"]))
|
self.dialog.set_value("general", "persist_size", str(self.config["general"]["persist_size"]))
|
||||||
|
self.dialog.create_reporting()
|
||||||
|
self.dialog.set_value("reporting", "speech_reporting", self.config["reporting"]["speech_reporting"])
|
||||||
|
self.dialog.set_value("reporting", "braille_reporting", self.config["reporting"]["braille_reporting"])
|
||||||
self.dialog.create_other_buffers()
|
self.dialog.create_other_buffers()
|
||||||
buffer_values = self.get_buffers_list()
|
buffer_values = self.get_buffers_list()
|
||||||
self.dialog.buffers.insert_buffers(buffer_values)
|
self.dialog.buffers.insert_buffers(buffer_values)
|
||||||
@@ -154,13 +175,13 @@ class accountSettingsController(globalSettingsController):
|
|||||||
self.dialog.set_value("sound", "output", self.config["sound"]["output_device"])
|
self.dialog.set_value("sound", "output", self.config["sound"]["output_device"])
|
||||||
self.dialog.set_value("sound", "session_mute", self.config["sound"]["session_mute"])
|
self.dialog.set_value("sound", "session_mute", self.config["sound"]["session_mute"])
|
||||||
self.dialog.set_value("sound", "soundpack", self.config["sound"]["current_soundpack"])
|
self.dialog.set_value("sound", "soundpack", self.config["sound"]["current_soundpack"])
|
||||||
self.dialog.create_services()
|
self.dialog.set_value("sound", "indicate_audio", self.config["sound"]["indicate_audio"])
|
||||||
# if self.config["services"]["pocket_access_token"] == "":
|
self.dialog.set_value("sound", "indicate_geo", self.config["sound"]["indicate_geo"])
|
||||||
# self.dialog.services.set_pocket(False)
|
self.dialog.set_value("sound", "indicate_img", self.config["sound"]["indicate_img"])
|
||||||
# else:
|
self.dialog.create_extras(OCRSpace.translatable_langs)
|
||||||
# self.dialog.services.set_pocket(True)
|
self.dialog.set_value("extras", "sndup_apiKey", self.config["sound"]["sndup_api_key"])
|
||||||
# widgetUtils.connect_event(self.dialog.services.pocketBtn, widgetUtils.BUTTON_PRESSED, self.manage_pocket)
|
language_index = OCRSpace.OcrLangs.index(self.config["mysc"]["ocr_language"])
|
||||||
self.dialog.set_value("services", "apiKey", self.config["sound"]["sndup_api_key"])
|
self.dialog.extras.ocr_lang.SetSelection(language_index)
|
||||||
self.dialog.realize()
|
self.dialog.realize()
|
||||||
self.dialog.set_title(_(u"Account settings for %s") % (self.user,))
|
self.dialog.set_title(_(u"Account settings for %s") % (self.user,))
|
||||||
self.response = self.dialog.get_response()
|
self.response = self.dialog.get_response()
|
||||||
@@ -169,7 +190,9 @@ class accountSettingsController(globalSettingsController):
|
|||||||
if self.config["general"]["relative_times"] != self.dialog.get_value("general", "relative_time"):
|
if self.config["general"]["relative_times"] != self.dialog.get_value("general", "relative_time"):
|
||||||
self.needs_restart = True
|
self.needs_restart = True
|
||||||
self.config["general"]["relative_times"] = self.dialog.get_value("general", "relative_time")
|
self.config["general"]["relative_times"] = self.dialog.get_value("general", "relative_time")
|
||||||
self.config["general"]["max_api_calls"] = self.dialog.get_value("general", "apiCalls")
|
self.config["general"]["show_screen_names"] = self.dialog.get_value("general", "show_screen_names")
|
||||||
|
if application.streaming_lives():
|
||||||
|
self.config["general"]["max_api_calls"] = self.dialog.get_value("general", "apiCalls")
|
||||||
self.config["general"]["max_tweets_per_call"] = self.dialog.get_value("general", "itemsPerApiCall")
|
self.config["general"]["max_tweets_per_call"] = self.dialog.get_value("general", "itemsPerApiCall")
|
||||||
if self.config["general"]["persist_size"] != self.dialog.get_value("general", "persist_size"):
|
if self.config["general"]["persist_size"] != self.dialog.get_value("general", "persist_size"):
|
||||||
if self.dialog.get_value("general", "persist_size") == '':
|
if self.dialog.get_value("general", "persist_size") == '':
|
||||||
@@ -195,7 +218,9 @@ class accountSettingsController(globalSettingsController):
|
|||||||
if set(self.config["general"]["buffer_order"]) != set(buffers_list) or buffers_list != self.config["general"]["buffer_order"]:
|
if set(self.config["general"]["buffer_order"]) != set(buffers_list) or buffers_list != self.config["general"]["buffer_order"]:
|
||||||
self.needs_restart = True
|
self.needs_restart = True
|
||||||
self.config["general"]["buffer_order"] = buffers_list
|
self.config["general"]["buffer_order"] = buffers_list
|
||||||
|
self.config["reporting"]["speech_reporting"] = self.dialog.get_value("reporting", "speech_reporting")
|
||||||
|
self.config["reporting"]["braille_reporting"] = self.dialog.get_value("reporting", "braille_reporting")
|
||||||
|
self.config["mysc"]["ocr_language"] = OCRSpace.OcrLangs[self.dialog.extras.ocr_lang.GetSelection()]
|
||||||
# if self.config["other_buffers"]["show_followers"] != self.dialog.get_value("buffers", "followers"):
|
# if self.config["other_buffers"]["show_followers"] != self.dialog.get_value("buffers", "followers"):
|
||||||
# self.config["other_buffers"]["show_followers"] = self.dialog.get_value("buffers", "followers")
|
# self.config["other_buffers"]["show_followers"] = self.dialog.get_value("buffers", "followers")
|
||||||
# pub.sendMessage("create-new-buffer", buffer="followers", account=self.user, create=self.config["other_buffers"]["show_followers"])
|
# pub.sendMessage("create-new-buffer", buffer="followers", account=self.user, create=self.config["other_buffers"]["show_followers"])
|
||||||
@@ -229,9 +254,13 @@ class accountSettingsController(globalSettingsController):
|
|||||||
self.config["sound"]["volume"] = self.dialog.get_value("sound", "volumeCtrl")/100.0
|
self.config["sound"]["volume"] = self.dialog.get_value("sound", "volumeCtrl")/100.0
|
||||||
self.config["sound"]["session_mute"] = self.dialog.get_value("sound", "session_mute")
|
self.config["sound"]["session_mute"] = self.dialog.get_value("sound", "session_mute")
|
||||||
self.config["sound"]["current_soundpack"] = self.dialog.sound.get("soundpack")
|
self.config["sound"]["current_soundpack"] = self.dialog.sound.get("soundpack")
|
||||||
|
self.config["sound"]["indicate_audio"] = self.dialog.get_value("sound", "indicate_audio")
|
||||||
|
self.config["sound"]["indicate_geo"] = self.dialog.get_value("sound", "indicate_geo")
|
||||||
|
self.config["sound"]["indicate_img"] = self.dialog.get_value("sound", "indicate_img")
|
||||||
|
self.config["sound"]["sndup_api_key"] = self.dialog.get_value("extras", "sndup_apiKey")
|
||||||
self.buffer.session.sound.config = self.config["sound"]
|
self.buffer.session.sound.config = self.config["sound"]
|
||||||
self.buffer.session.sound.check_soundpack()
|
self.buffer.session.sound.check_soundpack()
|
||||||
self.config["sound"]["sndup_api_key"] = self.dialog.get_value("services", "apiKey")
|
self.config.write()
|
||||||
|
|
||||||
def toggle_state(self,*args,**kwargs):
|
def toggle_state(self,*args,**kwargs):
|
||||||
return self.dialog.buffers.change_selected_item()
|
return self.dialog.buffers.change_selected_item()
|
||||||
@@ -264,7 +293,8 @@ class accountSettingsController(globalSettingsController):
|
|||||||
all_buffers['friends']=_(u"Friends")
|
all_buffers['friends']=_(u"Friends")
|
||||||
all_buffers['blocks']=_(u"Blocked users")
|
all_buffers['blocks']=_(u"Blocked users")
|
||||||
all_buffers['muted']=_(u"Muted users")
|
all_buffers['muted']=_(u"Muted users")
|
||||||
all_buffers['events']=_(u"Events")
|
if application.streaming_lives():
|
||||||
|
all_buffers['events']=_(u"Events")
|
||||||
list_buffers = []
|
list_buffers = []
|
||||||
hidden_buffers=[]
|
hidden_buffers=[]
|
||||||
for i in all_buffers.keys():
|
for i in all_buffers.keys():
|
||||||
@@ -278,27 +308,4 @@ class accountSettingsController(globalSettingsController):
|
|||||||
def toggle_buffer_active(self, ev):
|
def toggle_buffer_active(self, ev):
|
||||||
change = self.dialog.buffers.get_event(ev)
|
change = self.dialog.buffers.get_event(ev)
|
||||||
if change == True:
|
if change == True:
|
||||||
self.dialog.buffers.change_selected_item()
|
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 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"] = ""
|
|
||||||
self.dialog.services.set_pocket(False)
|
|
@@ -1,8 +1,11 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
import wx
|
||||||
import webbrowser
|
import webbrowser
|
||||||
import widgetUtils
|
import widgetUtils
|
||||||
import output
|
import output
|
||||||
from wxUI.dialogs import update_profile, show_user
|
from wxUI.dialogs import update_profile, show_user
|
||||||
|
import logging
|
||||||
|
log = logging.getLogger("controller.user")
|
||||||
from twython import TwythonError
|
from twython import TwythonError
|
||||||
|
|
||||||
class profileController(object):
|
class profileController(object):
|
||||||
@@ -12,14 +15,22 @@ class profileController(object):
|
|||||||
self.session = session
|
self.session = session
|
||||||
self.user = user
|
self.user = user
|
||||||
if user == None:
|
if user == None:
|
||||||
self.dialog = update_profile.updateProfileDialog()
|
|
||||||
self.get_data(screen_name=self.session.db["user_name"])
|
self.get_data(screen_name=self.session.db["user_name"])
|
||||||
|
self.dialog = update_profile.updateProfileDialog()
|
||||||
self.fill_profile_fields()
|
self.fill_profile_fields()
|
||||||
self.uploaded = False
|
self.uploaded = False
|
||||||
widgetUtils.connect_event(self.dialog.upload_image, widgetUtils.BUTTON_PRESSED, self.upload_image)
|
widgetUtils.connect_event(self.dialog.upload_image, widgetUtils.BUTTON_PRESSED, self.upload_image)
|
||||||
else:
|
else:
|
||||||
|
try:
|
||||||
|
self.get_data(screen_name=self.user)
|
||||||
|
except TwythonError as err:
|
||||||
|
if err.error_code == 404:
|
||||||
|
wx.MessageDialog(None, _(u"That user does not exist"), _(u"Error"), wx.ICON_ERROR).ShowModal()
|
||||||
|
if err.error_code == 403:
|
||||||
|
wx.MessageDialog(None, _(u"User has been suspended"), _(u"Error"), wx.ICON_ERROR).ShowModal()
|
||||||
|
log.error("error %d: %s" % (err.error_code, err.msg))
|
||||||
|
return
|
||||||
self.dialog = show_user.showUserProfile()
|
self.dialog = show_user.showUserProfile()
|
||||||
self.get_data(screen_name=self.user)
|
|
||||||
string = self.get_user_info()
|
string = self.get_user_info()
|
||||||
self.dialog.set("text", string)
|
self.dialog.set("text", string)
|
||||||
self.dialog.set_title(_(u"Information for %s") % (self.data["screen_name"]))
|
self.dialog.set_title(_(u"Information for %s") % (self.data["screen_name"]))
|
||||||
|
@@ -76,4 +76,5 @@ class userActionsController(object):
|
|||||||
return
|
return
|
||||||
client = re.sub(r"(?s)<.*?>", "", tweet["source"])
|
client = re.sub(r"(?s)<.*?>", "", tweet["source"])
|
||||||
if client not in self.session.settings["twitter"]["ignored_clients"]:
|
if client not in self.session.settings["twitter"]["ignored_clients"]:
|
||||||
self.session.settings["twitter"]["ignored_clients"].append(client)
|
self.session.settings["twitter"]["ignored_clients"].append(client)
|
||||||
|
self.session.settings.write()
|
@@ -52,13 +52,11 @@ class audioUploader(object):
|
|||||||
self.uploaderDialog = wx_transfer_dialogs.UploadDialog(self.file)
|
self.uploaderDialog = wx_transfer_dialogs.UploadDialog(self.file)
|
||||||
output.speak(_(u"Attaching..."))
|
output.speak(_(u"Attaching..."))
|
||||||
if self.dialog.get("services") == "SNDUp":
|
if self.dialog.get("services") == "SNDUp":
|
||||||
base_url = "http://sndup.net/post.php"
|
base_url = "https://sndup.net/post.php"
|
||||||
if len(self.config["sound"]["sndup_api_key"]) > 0:
|
if len(self.config["sound"]["sndup_api_key"]) > 0:
|
||||||
url = base_url + '?apikey=' + self.config['sound']['sndup_api_key']
|
url = base_url + '?apikey=' + self.config['sound']['sndup_api_key']
|
||||||
else:
|
else:
|
||||||
url = base_url
|
url = base_url
|
||||||
elif self.dialog.get("services") == "TwUp":
|
|
||||||
url = "http://api.twup.me/post.json"
|
|
||||||
self.uploaderFunction = transfer.Upload(obj=self, 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")
|
pub.subscribe(self.uploaderDialog.update, "uploading")
|
||||||
self.uploaderDialog.get_response(self.uploaderFunction.perform_threaded)
|
self.uploaderDialog.get_response(self.uploaderFunction.perform_threaded)
|
||||||
@@ -66,7 +64,6 @@ class audioUploader(object):
|
|||||||
def get_available_services(self):
|
def get_available_services(self):
|
||||||
services = []
|
services = []
|
||||||
services.append("SNDUp")
|
services.append("SNDUp")
|
||||||
services.append("TwUp")
|
|
||||||
return services
|
return services
|
||||||
|
|
||||||
def on_pause(self, *args, **kwargs):
|
def on_pause(self, *args, **kwargs):
|
||||||
|
@@ -22,7 +22,8 @@ class Upload(object):
|
|||||||
self.local_filename=os.path.basename(self.filename)
|
self.local_filename=os.path.basename(self.filename)
|
||||||
if isinstance(self.local_filename, unicode):
|
if isinstance(self.local_filename, unicode):
|
||||||
self.local_filename=self.local_filename.encode(sys.getfilesystemencoding())
|
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.fin=open(self.filename, 'rb')
|
||||||
|
self.m = MultipartEncoder(fields={field:(self.local_filename, self.fin, "application/octet-stream")})
|
||||||
self.monitor = MultipartEncoderMonitor(self.m, self.progress_callback)
|
self.monitor = MultipartEncoderMonitor(self.m, self.progress_callback)
|
||||||
self.response=None
|
self.response=None
|
||||||
self.obj=obj
|
self.obj=obj
|
||||||
@@ -66,6 +67,17 @@ class Upload(object):
|
|||||||
def complete_transfer(self):
|
def complete_transfer(self):
|
||||||
if callable(self.completed_callback):
|
if callable(self.completed_callback):
|
||||||
self.completed_callback(self.obj)
|
self.completed_callback(self.obj)
|
||||||
|
if hasattr(self,'fin') and callable(self.fin.close):
|
||||||
|
self.fin.close()
|
||||||
|
|
||||||
def get_url(self):
|
def get_url(self):
|
||||||
return self.response.json()['url']
|
try:
|
||||||
|
data = self.response.json()
|
||||||
|
except:
|
||||||
|
return _("Error in file upload: {0}").format(self.data.content,)
|
||||||
|
if data.has_key("url") and data["url"] != "0":
|
||||||
|
return data["url"]
|
||||||
|
elif data.has_key("error") and data["error"] != "0":
|
||||||
|
return data["error"]
|
||||||
|
else:
|
||||||
|
return _("Error in file upload: {0}").format(self.data.content,)
|
@@ -6,7 +6,7 @@ import widgetUtils
|
|||||||
class UploadDialog(widgetUtils.BaseDialog):
|
class UploadDialog(widgetUtils.BaseDialog):
|
||||||
|
|
||||||
def __init__(self, filename, *args, **kwargs):
|
def __init__(self, filename, *args, **kwargs):
|
||||||
super(UploadDialog, self).__init__(parent=None, id=wx.NewId(), *args, **kwargs)
|
super(UploadDialog, self).__init__(parent=None, id=wx.ID_ANY, *args, **kwargs)
|
||||||
self.pane = wx.Panel(self)
|
self.pane = wx.Panel(self)
|
||||||
self.progress_bar = wx.Gauge(parent=self.pane)
|
self.progress_bar = wx.Gauge(parent=self.pane)
|
||||||
fileBox = wx.BoxSizer(wx.HORIZONTAL)
|
fileBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
|
@@ -10,6 +10,7 @@ actions = reverse_sort.reverse_sort([ ("audio", _(u"Audio tweet.")),
|
|||||||
("favourite", _(u"Tweet liked.")),
|
("favourite", _(u"Tweet liked.")),
|
||||||
("favourites_timeline_updated", _(u"Likes buffer updated.")),
|
("favourites_timeline_updated", _(u"Likes buffer updated.")),
|
||||||
("geo", _(u"Geotweet.")),
|
("geo", _(u"Geotweet.")),
|
||||||
|
("image", _("Tweet contains one or more images")),
|
||||||
("limit", _(u"Boundary reached.")),
|
("limit", _(u"Boundary reached.")),
|
||||||
("list_tweet", _(u"List updated.")),
|
("list_tweet", _(u"List updated.")),
|
||||||
("max_length", _(u"Too many characters.")),
|
("max_length", _(u"Too many characters.")),
|
||||||
@@ -24,4 +25,4 @@ actions = reverse_sort.reverse_sort([ ("audio", _(u"Audio tweet.")),
|
|||||||
("trends_updated", _(u"Trending topics buffer updated.")),
|
("trends_updated", _(u"Trending topics buffer updated.")),
|
||||||
("tweet_timeline", _(u"New tweet in user timeline buffer.")),
|
("tweet_timeline", _(u"New tweet in user timeline buffer.")),
|
||||||
("update_followers", _(u"New follower.")),
|
("update_followers", _(u"New follower.")),
|
||||||
("volume_changed", _(u"Volume changed."))])
|
("volume_changed", _(u"Volume changed."))])
|
||||||
|
@@ -1,33 +1,43 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
import os
|
||||||
import logging
|
import logging
|
||||||
log = logging.getLogger("extra.SpellChecker.spellChecker")
|
|
||||||
import wx_ui
|
import wx_ui
|
||||||
import widgetUtils
|
import widgetUtils
|
||||||
import output
|
import output
|
||||||
import config
|
import config
|
||||||
import languageHandler
|
import languageHandler
|
||||||
|
import enchant
|
||||||
|
import paths
|
||||||
|
import twitterFilter
|
||||||
from enchant.checker import SpellChecker
|
from enchant.checker import SpellChecker
|
||||||
from enchant.errors import DictNotFoundError
|
from enchant.errors import DictNotFoundError
|
||||||
from enchant import tokenize
|
from enchant import tokenize
|
||||||
import twitterFilter
|
log = logging.getLogger("extra.SpellChecker.spellChecker")
|
||||||
|
|
||||||
class spellChecker(object):
|
class spellChecker(object):
|
||||||
def __init__(self, text, dictionary):
|
def __init__(self, text, dictionary):
|
||||||
super(spellChecker, self).__init__()
|
super(spellChecker, self).__init__()
|
||||||
|
# Set Dictionary path if not set in a previous call to this method.
|
||||||
|
# Dictionary path will be located in user config, see https://github.com/manuelcortez/twblue/issues/208
|
||||||
|
dict_path = enchant.get_param("enchant.myspell.dictionary.path")
|
||||||
|
if dict_path == None:
|
||||||
|
enchant.set_param("enchant.myspell.dictionary.path", os.path.join(paths.config_path(), "dicts"))
|
||||||
|
log.debug("Dictionary path set to %s" % (os.path.join(paths.config_path(), "dicts"),))
|
||||||
log.debug("Creating the SpellChecker object. Dictionary: %s" % (dictionary,))
|
log.debug("Creating the SpellChecker object. Dictionary: %s" % (dictionary,))
|
||||||
self.active = True
|
self.active = True
|
||||||
try:
|
try:
|
||||||
if config.app["app-settings"]["language"] == "system":
|
if config.app["app-settings"]["language"] == "system":
|
||||||
log.debug("Using the system language")
|
log.debug("Using the system language")
|
||||||
self.checker = SpellChecker(filters=[twitterFilter.TwitterFilter, tokenize.EmailFilter, tokenize.URLFilter])
|
self.dict = enchant.DictWithPWL(languageHandler.curLang[:2], paths.config_path("wordlist.dict"))
|
||||||
else:
|
else:
|
||||||
log.debug("Using language: %s" % (languageHandler.getLanguage(),))
|
log.debug("Using language: %s" % (languageHandler.getLanguage(),))
|
||||||
self.checker = SpellChecker(languageHandler.getLanguage(), filters=[twitterFilter.TwitterFilter, tokenize.EmailFilter, tokenize.URLFilter])
|
self.dict = enchant.DictWithPWL(languageHandler.getLanguage()[:2], paths.config_path("wordlist.dict"))
|
||||||
self.checker.set_text(text)
|
|
||||||
except DictNotFoundError:
|
except DictNotFoundError:
|
||||||
log.exception("Dictionary for language %s not found." % (dictionary,))
|
log.exception("Dictionary for language %s not found." % (dictionary,))
|
||||||
wx_ui.dict_not_found_error()
|
wx_ui.dict_not_found_error()
|
||||||
self.active = False
|
self.active = False
|
||||||
|
self.checker = SpellChecker(self.dict, filters=[twitterFilter.TwitterFilter, tokenize.EmailFilter, tokenize.URLFilter])
|
||||||
|
self.checker.set_text(text)
|
||||||
if self.active == True:
|
if self.active == True:
|
||||||
log.debug("Creating dialog...")
|
log.debug("Creating dialog...")
|
||||||
self.dialog = wx_ui.spellCheckerDialog()
|
self.dialog = wx_ui.spellCheckerDialog()
|
||||||
@@ -35,6 +45,7 @@ class spellChecker(object):
|
|||||||
widgetUtils.connect_event(self.dialog.ignoreAll, widgetUtils.BUTTON_PRESSED, self.ignoreAll)
|
widgetUtils.connect_event(self.dialog.ignoreAll, widgetUtils.BUTTON_PRESSED, self.ignoreAll)
|
||||||
widgetUtils.connect_event(self.dialog.replace, widgetUtils.BUTTON_PRESSED, self.replace)
|
widgetUtils.connect_event(self.dialog.replace, widgetUtils.BUTTON_PRESSED, self.replace)
|
||||||
widgetUtils.connect_event(self.dialog.replaceAll, widgetUtils.BUTTON_PRESSED, self.replaceAll)
|
widgetUtils.connect_event(self.dialog.replaceAll, widgetUtils.BUTTON_PRESSED, self.replaceAll)
|
||||||
|
widgetUtils.connect_event(self.dialog.add, widgetUtils.BUTTON_PRESSED, self.add)
|
||||||
self.check()
|
self.check()
|
||||||
self.dialog.get_response()
|
self.dialog.get_response()
|
||||||
self.fixed_text = self.checker.get_text()
|
self.fixed_text = self.checker.get_text()
|
||||||
@@ -51,8 +62,6 @@ class spellChecker(object):
|
|||||||
log.debug("Process finished.")
|
log.debug("Process finished.")
|
||||||
wx_ui.finished()
|
wx_ui.finished()
|
||||||
self.dialog.Destroy()
|
self.dialog.Destroy()
|
||||||
# except AttributeError:
|
|
||||||
# pass
|
|
||||||
|
|
||||||
def ignore(self, ev):
|
def ignore(self, ev):
|
||||||
self.check()
|
self.check()
|
||||||
@@ -67,4 +76,8 @@ class spellChecker(object):
|
|||||||
|
|
||||||
def replaceAll(self, ev):
|
def replaceAll(self, ev):
|
||||||
self.checker.replace_always(self.dialog.get_selected_suggestion())
|
self.checker.replace_always(self.dialog.get_selected_suggestion())
|
||||||
self.check()
|
self.check()
|
||||||
|
|
||||||
|
def add(self, ev):
|
||||||
|
self.checker.add()
|
||||||
|
self.check()
|
||||||
|
@@ -18,6 +18,7 @@
|
|||||||
############################################################
|
############################################################
|
||||||
import wx
|
import wx
|
||||||
import application
|
import application
|
||||||
|
|
||||||
class spellCheckerDialog(wx.Dialog):
|
class spellCheckerDialog(wx.Dialog):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(spellCheckerDialog, self).__init__(None, 1)
|
super(spellCheckerDialog, self).__init__(None, 1)
|
||||||
@@ -38,16 +39,18 @@ class spellCheckerDialog(wx.Dialog):
|
|||||||
suggestionsBox = wx.BoxSizer(wx.HORIZONTAL)
|
suggestionsBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
suggestionsBox.Add(suggest, 0, wx.ALL, 5)
|
suggestionsBox.Add(suggest, 0, wx.ALL, 5)
|
||||||
suggestionsBox.Add(self.suggestions, 0, wx.ALL, 5)
|
suggestionsBox.Add(self.suggestions, 0, wx.ALL, 5)
|
||||||
self.ignore = wx.Button(panel, -1, _(u"Ignore"))
|
self.ignore = wx.Button(panel, -1, _(u"&Ignore"))
|
||||||
self.ignoreAll = wx.Button(panel, -1, _(u"Ignore all"))
|
self.ignoreAll = wx.Button(panel, -1, _(u"I&gnore all"))
|
||||||
self.replace = wx.Button(panel, -1, _(u"Replace"))
|
self.replace = wx.Button(panel, -1, _(u"&Replace"))
|
||||||
self.replaceAll = wx.Button(panel, -1, _(u"Replace all"))
|
self.replaceAll = wx.Button(panel, -1, _(u"R&eplace all"))
|
||||||
|
self.add = wx.Button(panel, -1, _(u"&Add to personal dictionary"))
|
||||||
close = wx.Button(panel, wx.ID_CANCEL)
|
close = wx.Button(panel, wx.ID_CANCEL)
|
||||||
btnBox = wx.BoxSizer(wx.HORIZONTAL)
|
btnBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
btnBox.Add(self.ignore, 0, wx.ALL, 5)
|
btnBox.Add(self.ignore, 0, wx.ALL, 5)
|
||||||
btnBox.Add(self.ignoreAll, 0, wx.ALL, 5)
|
btnBox.Add(self.ignoreAll, 0, wx.ALL, 5)
|
||||||
btnBox.Add(self.replace, 0, wx.ALL, 5)
|
btnBox.Add(self.replace, 0, wx.ALL, 5)
|
||||||
btnBox.Add(self.replaceAll, 0, wx.ALL, 5)
|
btnBox.Add(self.replaceAll, 0, wx.ALL, 5)
|
||||||
|
btnBox.Add(self.add, 0, wx.ALL, 5)
|
||||||
btnBox.Add(close, 0, wx.ALL, 5)
|
btnBox.Add(close, 0, wx.ALL, 5)
|
||||||
sizer.Add(wordBox, 0, wx.ALL, 5)
|
sizer.Add(wordBox, 0, wx.ALL, 5)
|
||||||
sizer.Add(contextBox, 0, wx.ALL, 5)
|
sizer.Add(contextBox, 0, wx.ALL, 5)
|
||||||
|
@@ -10,7 +10,7 @@ class menu(wx.Menu):
|
|||||||
|
|
||||||
def append_options(self, options):
|
def append_options(self, options):
|
||||||
for i in options:
|
for i in options:
|
||||||
item = wx.MenuItem(self, wx.NewId(), "%s (@%s)" % (i[1], i[0]))
|
item = wx.MenuItem(self, wx.ID_ANY, "%s (@%s)" % (i[1], i[0]))
|
||||||
self.AppendItem(item)
|
self.AppendItem(item)
|
||||||
self.Bind(wx.EVT_MENU, lambda evt, temp=i[0]: self.select_text(evt, temp), item)
|
self.Bind(wx.EVT_MENU, lambda evt, temp=i[0]: self.select_text(evt, temp), item)
|
||||||
|
|
||||||
|
43
src/extra/ocr/OCRSpace.py
Normal file
43
src/extra/ocr/OCRSpace.py
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
""" original module taken and modified from https://github.com/ctoth/cloudOCR"""
|
||||||
|
import requests
|
||||||
|
|
||||||
|
translatable_langs = [_(u"Detect automatically"), _(u"Danish"), _(u"Dutch"), _(u"English"), _(u"Finnish"), _(u"French"), _(u"German"), _(u"Hungarian"), _(u"Korean"), _(u"Italian"), _(u"Japanese"), _(u"Polish"), _(u"Portuguese"), _(u"Russian"), _(u"Spanish"), _(u"Turkish")]
|
||||||
|
short_langs = ["", "da", "du", "en", "fi", "fr", "de", "hu", "ko", "it", "ja", "pl", "pt", "ru", "es", "tr"]
|
||||||
|
OcrLangs = ["", "dan", "dut", "eng", "fin", "fre", "ger", "hun", "kor", "ita", "jpn", "pol", "por", "rus", "spa", "tur"]
|
||||||
|
|
||||||
|
class APIError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class OCRSpaceAPI(object):
|
||||||
|
|
||||||
|
def __init__(self, key="4e72ae996f88957", url='https://api.ocr.space/parse/image'):
|
||||||
|
self.key = key
|
||||||
|
self.url = url
|
||||||
|
|
||||||
|
def OCR_URL(self, url, overlay=False, lang=None):
|
||||||
|
payload = {
|
||||||
|
'url': url,
|
||||||
|
'isOverlayRequired': overlay,
|
||||||
|
'apikey': self.key,
|
||||||
|
}
|
||||||
|
if lang != None:
|
||||||
|
payload.update(language=lang)
|
||||||
|
r = requests.post(self.url, data=payload)
|
||||||
|
result = r.json()['ParsedResults'][0]
|
||||||
|
if result['ErrorMessage']:
|
||||||
|
raise APIError(result['ErrorMessage'])
|
||||||
|
return result
|
||||||
|
|
||||||
|
def OCR_file(self, fileobj, overlay=False):
|
||||||
|
payload = {
|
||||||
|
'isOverlayRequired': overlay,
|
||||||
|
'apikey': self.key,
|
||||||
|
'lang': 'es',
|
||||||
|
}
|
||||||
|
r = requests.post(self.url, data=payload, files={'file': fileobj})
|
||||||
|
results = r.json()['ParsedResults']
|
||||||
|
if results[0]['ErrorMessage']:
|
||||||
|
raise APIError(results[0]['ErrorMessage'])
|
||||||
|
return results
|
||||||
|
|
@@ -1 +1,2 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
import OCRSpace
|
@@ -1,11 +1,13 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from microsofttranslator import Translator
|
from yandex_translate import YandexTranslate
|
||||||
|
|
||||||
def translate(text="", source="auto", target="en"):
|
|
||||||
t = Translator("twblue", "4KZA26GYIfmVAqQA/z16Hlucbg64hVSDTIpRjT2FqIU=")
|
|
||||||
return t.translate(text, target)
|
|
||||||
|
|
||||||
|
def translate(text="", target="en"):
|
||||||
|
t = YandexTranslate("trnsl.1.1.20161012T134532Z.d01b9c75fc39aa74.7d1be75a5166a80583eeb020e10f584168da6bf7")
|
||||||
|
vars = dict(text=text, lang=target)
|
||||||
|
return t.translate(**vars)["text"][0]
|
||||||
|
|
||||||
|
supported_langs = None
|
||||||
|
d = None
|
||||||
languages = {
|
languages = {
|
||||||
"af": _(u"Afrikaans"),
|
"af": _(u"Afrikaans"),
|
||||||
"sq": _(u"Albanian"),
|
"sq": _(u"Albanian"),
|
||||||
@@ -71,7 +73,7 @@ languages = {
|
|||||||
"ps": _(u"Pashto"),
|
"ps": _(u"Pashto"),
|
||||||
"fa": _(u"Persian"),
|
"fa": _(u"Persian"),
|
||||||
"pl": _(u"Polish"),
|
"pl": _(u"Polish"),
|
||||||
"pt-PT": _(u"Portuguese"),
|
"pt": _(u"Portuguese"),
|
||||||
"pa": _(u"Punjabi"),
|
"pa": _(u"Punjabi"),
|
||||||
"ro": _(u"Romanian"),
|
"ro": _(u"Romanian"),
|
||||||
"ru": _(u"Russian"),
|
"ru": _(u"Russian"),
|
||||||
@@ -101,8 +103,11 @@ languages = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
def available_languages():
|
def available_languages():
|
||||||
l = languages.keys()
|
global supported_langs, d
|
||||||
d = languages.values()
|
if supported_langs == None and d == None:
|
||||||
l.insert(0, '')
|
t = YandexTranslate("trnsl.1.1.20161012T134532Z.d01b9c75fc39aa74.7d1be75a5166a80583eeb020e10f584168da6bf7")
|
||||||
d.insert(0, _(u"autodetect"))
|
supported_langs = t.langs
|
||||||
return sorted(zip(l, d))
|
d = []
|
||||||
|
for i in supported_langs:
|
||||||
|
d.append(languages[i])
|
||||||
|
return sorted(zip(supported_langs, d))
|
||||||
|
@@ -25,15 +25,11 @@ class translateDialog(baseDialog.BaseWXDialog):
|
|||||||
super(translateDialog, self).__init__(None, -1, title=_(u"Translate message"))
|
super(translateDialog, self).__init__(None, -1, title=_(u"Translate message"))
|
||||||
panel = wx.Panel(self)
|
panel = wx.Panel(self)
|
||||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
sizer = wx.BoxSizer(wx.VERTICAL)
|
||||||
staticSource = wx.StaticText(panel, -1, _(u"Source language"))
|
|
||||||
self.source_lang = wx.ComboBox(panel, -1, choices=[x[1] for x in translator.available_languages()], style = wx.CB_READONLY)
|
|
||||||
self.source_lang.SetFocus()
|
|
||||||
staticDest = wx.StaticText(panel, -1, _(u"Target language"))
|
staticDest = wx.StaticText(panel, -1, _(u"Target language"))
|
||||||
self.source_lang.SetSelection(0)
|
|
||||||
self.dest_lang = wx.ComboBox(panel, -1, choices=[x[1] for x in translator.available_languages()], style = wx.CB_READONLY)
|
self.dest_lang = wx.ComboBox(panel, -1, choices=[x[1] for x in translator.available_languages()], style = wx.CB_READONLY)
|
||||||
|
self.dest_lang.SetFocus()
|
||||||
|
self.dest_lang.SetSelection(0)
|
||||||
listSizer = wx.BoxSizer(wx.HORIZONTAL)
|
listSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
listSizer.Add(staticSource)
|
|
||||||
listSizer.Add(self.source_lang)
|
|
||||||
listSizer.Add(staticDest)
|
listSizer.Add(staticDest)
|
||||||
listSizer.Add(self.dest_lang)
|
listSizer.Add(self.dest_lang)
|
||||||
ok = wx.Button(panel, wx.ID_OK)
|
ok = wx.Button(panel, wx.ID_OK)
|
||||||
|
@@ -9,5 +9,7 @@ def setup():
|
|||||||
fix_arrow.fix()
|
fix_arrow.fix()
|
||||||
if hasattr(sys, "frozen"):
|
if hasattr(sys, "frozen"):
|
||||||
fix_win32com.fix()
|
fix_win32com.fix()
|
||||||
fix_requests.fix()
|
fix_requests.fix(True)
|
||||||
|
else:
|
||||||
|
fix_requests.fix(False)
|
||||||
fix_urllib3_warnings.fix()
|
fix_urllib3_warnings.fix()
|
@@ -3,23 +3,16 @@ from arrow import locales
|
|||||||
from arrow.locales import Locale
|
from arrow.locales import Locale
|
||||||
|
|
||||||
def fix():
|
def fix():
|
||||||
''' This function adds the Catala, Basque and galician locales to the list of locales supported in Arrow.
|
|
||||||
it also fixes capitalizations in names from turkish and arabian locales.
|
|
||||||
see https://github.com/crsmithdev/arrow/pull/207 for following the pull request.'''
|
|
||||||
locales.CatalaLocale = CatalaLocale
|
|
||||||
locales.GalicianLocale = GalicianLocale
|
|
||||||
locales.BasqueLocale = BasqueLocale
|
|
||||||
locales.TurkishLocale.names[-1] = "tr_tr"
|
|
||||||
locales.ArabicLocale.names[-1] = "ar_eg"
|
|
||||||
# insert a modified function so if there is no language available in arrow, returns English locale.
|
# insert a modified function so if there is no language available in arrow, returns English locale.
|
||||||
locales.get_locale = get_locale
|
locales.get_locale = get_locale
|
||||||
# We need to reassign the locales list for updating the list with our new contents.
|
|
||||||
locales._locales = locales._map_locales()
|
|
||||||
|
|
||||||
def get_locale(name):
|
def get_locale(name):
|
||||||
locale_cls = locales._locales.get(name.lower())
|
locale_cls = locales._locales.get(name.lower())
|
||||||
if locale_cls is None:
|
if locale_cls is None:
|
||||||
return locales.EnglishLocale()
|
name = name[:2]
|
||||||
|
locale_cls = locales._locales.get(name.lower())
|
||||||
|
if locale_cls == None:
|
||||||
|
return locales.EnglishLocale()
|
||||||
return locale_cls()
|
return locale_cls()
|
||||||
|
|
||||||
class CatalaLocale(Locale):
|
class CatalaLocale(Locale):
|
||||||
|
@@ -1,10 +1,26 @@
|
|||||||
from requests import certs, utils, adapters
|
from requests import certs, utils, adapters
|
||||||
import paths
|
import paths
|
||||||
|
import config
|
||||||
|
import requests.sessions
|
||||||
|
orig_session_init=requests.sessions.Session.__init__
|
||||||
|
|
||||||
def patched_where():
|
def patched_where():
|
||||||
return paths.app_path(u"cacert.pem")
|
return paths.app_path(u"cacert.pem")
|
||||||
|
|
||||||
def fix():
|
def fix(frozen):
|
||||||
certs.where=patched_where
|
if frozen==True:
|
||||||
utils.DEFAULT_CA_BUNDLE_PATH=patched_where()
|
certs.where=patched_where
|
||||||
adapters.DEFAULT_CA_BUNDLE_PATH=patched_where()
|
utils.DEFAULT_CA_BUNDLE_PATH=patched_where()
|
||||||
|
adapters.DEFAULT_CA_BUNDLE_PATH=patched_where()
|
||||||
|
requests.sessions.Session.__init__=patched_session_init
|
||||||
|
requests.Session.__init__=patched_session_init
|
||||||
|
requests.session.__init__=patched_session_init
|
||||||
|
|
||||||
|
def patched_session_init(self):
|
||||||
|
orig_session_init(self)
|
||||||
|
if config.app["proxy"]["server"] != "" and config.app["proxy"]["port"] != "" and config.app["proxy"]["type"] in config.proxyTypes:
|
||||||
|
self.proxies={"http":"{0}://{1}:{2}/".format(config.app["proxy"]["type"], config.app["proxy"]["server"], config.app["proxy"]["port"]),
|
||||||
|
"https": "{0}://{1}:{2}/".format(config.app["proxy"]["type"], config.app["proxy"]["server"], config.app["proxy"]["port"])}
|
||||||
|
if config.app["proxy"]["user"] != "" and config.app["proxy"]["password"] != "":
|
||||||
|
self.proxies={"http": "{0}://{1}:{2}@{3}:{4}/".format(config.app["proxy"]["type"], config.app["proxy"]["user"], config.app["proxy"]["password"], config.app["proxy"]["server"], config.app["proxy"]["port"]),
|
||||||
|
"https": "{0}://{1}:{2}@{3}:{4}/".format(config.app["proxy"]["type"], config.app["proxy"]["user"], config.app["proxy"]["password"], config.app["proxy"]["server"], config.app["proxy"]["port"])}
|
||||||
|
@@ -32,4 +32,5 @@ check_for_updates = string(default="alt+win+u")
|
|||||||
list_manager = string(default="control+win+shift+l")
|
list_manager = string(default="control+win+shift+l")
|
||||||
configuration = string(default="control+win+o")
|
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")
|
update_buffer = string(default="control+win+shift+u")
|
||||||
|
ocr_image = string(default="win+alt+o")
|
@@ -51,4 +51,5 @@ check_for_updates = string(default="control+win+u")
|
|||||||
list_manager = string(default="control+win+shift+l")
|
list_manager = string(default="control+win+shift+l")
|
||||||
configuration = string(default="control+win+o")
|
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")
|
update_buffer = string(default="control+win+shift+u")
|
||||||
|
ocr_image = string(default="win+alt+o")
|
@@ -11,14 +11,13 @@ right = string(default="alt+win+right")
|
|||||||
next_account = string(default="alt+win+shift+right")
|
next_account = string(default="alt+win+shift+right")
|
||||||
previous_account = string(default="alt+win+shift+left")
|
previous_account = string(default="alt+win+shift+left")
|
||||||
open_conversation = string(default="alt+win+c")
|
open_conversation = string(default="alt+win+c")
|
||||||
show_hide = string(default="alt+win+w")
|
show_hide = string(default="control+win+w")
|
||||||
post_tweet = string(default="alt+win+n")
|
post_tweet = string(default="alt+win+n")
|
||||||
post_reply = string(default="control+win+r")
|
post_reply = string(default="control+win+r")
|
||||||
post_retweet = string(default="alt+win+shift+r")
|
post_retweet = string(default="alt+win+shift+r")
|
||||||
send_dm = string(default="alt+win+shift+d")
|
send_dm = string(default="alt+win+shift+d")
|
||||||
add_to_favourites = string(default="alt+win+f")
|
toggle_like = string(default="control+alt+win+f")
|
||||||
remove_from_favourites = string(default="alt+shift+win+f")
|
follow = string(default="alt+win+shift+s")
|
||||||
follow = string(default="alt+win+s")
|
|
||||||
user_details = string(default="alt+win+shift+n")
|
user_details = string(default="alt+win+shift+n")
|
||||||
view_item = string(default="alt+win+v")
|
view_item = string(default="alt+win+v")
|
||||||
exit = string(default="alt+win+f4")
|
exit = string(default="alt+win+f4")
|
||||||
@@ -48,9 +47,10 @@ view_user_lists = string(default="alt+win+l")
|
|||||||
get_more_items = string(default="alt+win+pageup")
|
get_more_items = string(default="alt+win+pageup")
|
||||||
reverse_geocode = string(default="alt+win+g")
|
reverse_geocode = string(default="alt+win+g")
|
||||||
view_reverse_geocode = string(default="alt+win+shift+g")
|
view_reverse_geocode = string(default="alt+win+shift+g")
|
||||||
get_trending_topics = string(default="alt+win+t")
|
get_trending_topics = string(default="control+win+t")
|
||||||
check_for_updates = string(default="alt+win+u")
|
check_for_updates = string(default="alt+win+u")
|
||||||
list_manager = string(default="alt+win+shift+l")
|
list_manager = string(default="alt+win+shift+l")
|
||||||
configuration = string(default="control+win+o")
|
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")
|
update_buffer = string(default="control+alt+shift+u")
|
||||||
|
ocr_image = string(default="win+alt+o")
|
@@ -54,4 +54,5 @@ check_for_updates = string(default="control+win+u")
|
|||||||
list_manager = string(default="control+win+shift+l")
|
list_manager = string(default="control+win+shift+l")
|
||||||
configuration = string(default="control+win+o")
|
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")
|
update_buffer = string(default="control+win+shift+u")
|
||||||
|
ocr_image = string(default="win+alt+o")
|
@@ -12,6 +12,7 @@ actions = {
|
|||||||
"post_retweet": _(u"Retweet"),
|
"post_retweet": _(u"Retweet"),
|
||||||
"send_dm": _(u"Send direct message"),
|
"send_dm": _(u"Send direct message"),
|
||||||
"add_to_favourites": _(u"Like a tweet"),
|
"add_to_favourites": _(u"Like a tweet"),
|
||||||
|
"toggle_like": _(u"Like/unlike a tweet"),
|
||||||
"remove_from_favourites": _(u"Unlike a tweet"),
|
"remove_from_favourites": _(u"Unlike a tweet"),
|
||||||
"follow": _(u"Open the user actions dialogue"),
|
"follow": _(u"Open the user actions dialogue"),
|
||||||
"user_details": _(u"See user details"),
|
"user_details": _(u"See user details"),
|
||||||
@@ -52,4 +53,5 @@ actions = {
|
|||||||
"accountConfiguration": _(u"Opens the account settings dialogue"),
|
"accountConfiguration": _(u"Opens the account settings dialogue"),
|
||||||
"audio": _(u"Try to play an audio file"),
|
"audio": _(u"Try to play an audio file"),
|
||||||
"update_buffer": _(u"Updates the buffer and retrieves possible lost items there."),
|
"update_buffer": _(u"Updates the buffer and retrieves possible lost items there."),
|
||||||
|
"ocr_image": _(u"Extracts the text from a picture and displays the result in a dialog."),
|
||||||
}
|
}
|
@@ -28,6 +28,7 @@ class KeystrokeEditor(object):
|
|||||||
if new_keystroke != self.map[action]:
|
if new_keystroke != self.map[action]:
|
||||||
self.changed = True
|
self.changed = True
|
||||||
self.map[action] = new_keystroke
|
self.map[action] = new_keystroke
|
||||||
|
self.dialog.put_keystrokes(constants.actions, self.map)
|
||||||
|
|
||||||
def set_keystroke(self, keystroke, dialog):
|
def set_keystroke(self, keystroke, dialog):
|
||||||
for i in keystroke.split("+"):
|
for i in keystroke.split("+"):
|
||||||
|
@@ -29,6 +29,8 @@ class keystrokeEditorDialog(baseDialog.BaseWXDialog):
|
|||||||
self.SetClientSize(sizer.CalcMin())
|
self.SetClientSize(sizer.CalcMin())
|
||||||
|
|
||||||
def put_keystrokes(self, actions, keystrokes):
|
def put_keystrokes(self, actions, keystrokes):
|
||||||
|
selection = self.keys.get_selected()
|
||||||
|
self.keys.clear()
|
||||||
for i in keystrokes:
|
for i in keystrokes:
|
||||||
if actions.has_key(i) == False:
|
if actions.has_key(i) == False:
|
||||||
continue
|
continue
|
||||||
@@ -36,6 +38,7 @@ class keystrokeEditorDialog(baseDialog.BaseWXDialog):
|
|||||||
self.actions.append(i)
|
self.actions.append(i)
|
||||||
keystroke = keystrokes[i]
|
keystroke = keystrokes[i]
|
||||||
self.keys.insert_item(False, *[action, keystroke])
|
self.keys.insert_item(False, *[action, keystroke])
|
||||||
|
self.keys.select_item(selection)
|
||||||
|
|
||||||
def get_action(self):
|
def get_action(self):
|
||||||
return self.keys.get_selected()
|
return self.keys.get_selected()
|
||||||
|
@@ -3,6 +3,8 @@ import os
|
|||||||
import sys
|
import sys
|
||||||
import ctypes
|
import ctypes
|
||||||
import locale
|
import locale
|
||||||
|
# add mapping for Serbian (latin) language
|
||||||
|
locale.windows_locale[9242]='sr_RS'
|
||||||
import gettext
|
import gettext
|
||||||
import paths
|
import paths
|
||||||
import platform
|
import platform
|
||||||
@@ -190,7 +192,8 @@ def langToWindowsLocale(lang):
|
|||||||
languages = {"en": "eng",
|
languages = {"en": "eng",
|
||||||
"ar": "ara",
|
"ar": "ara",
|
||||||
"ca": "cat",
|
"ca": "cat",
|
||||||
"de": "deu",
|
"da": "dan",
|
||||||
|
"de": "deu",
|
||||||
"es": "esp",
|
"es": "esp",
|
||||||
"fi": "fin",
|
"fi": "fin",
|
||||||
"fr": "fre_FRA",
|
"fr": "fre_FRA",
|
||||||
|
@@ -20,6 +20,7 @@ def load_com(*names):
|
|||||||
global fixed
|
global fixed
|
||||||
if fixed==False:
|
if fixed==False:
|
||||||
gencache._GetModule=patched_getmodule
|
gencache._GetModule=patched_getmodule
|
||||||
|
prepare_gencache()
|
||||||
fixed=True
|
fixed=True
|
||||||
result = None
|
result = None
|
||||||
for name in names:
|
for name in names:
|
||||||
|
@@ -29,7 +29,7 @@ class LibraryLoadError(OSError): pass
|
|||||||
|
|
||||||
def load_library(library, x86_path='.', x64_path='.', *args, **kwargs):
|
def load_library(library, x86_path='.', x64_path='.', *args, **kwargs):
|
||||||
lib = find_library_path(library, x86_path=x86_path, x64_path=x64_path)
|
lib = find_library_path(library, x86_path=x86_path, x64_path=x64_path)
|
||||||
loaded = _do_load(lib, *args, **kwargs)
|
loaded = _do_load(str(lib), *args, **kwargs)
|
||||||
if loaded is not None:
|
if loaded is not None:
|
||||||
return loaded
|
return loaded
|
||||||
raise LibraryLoadError('unable to load %r. Provided library path: %r' % (library, lib))
|
raise LibraryLoadError('unable to load %r. Provided library path: %r' % (library, lib))
|
||||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
BIN
src/locales/da/LC_MESSAGES/twblue.mo
Normal file
BIN
src/locales/da/LC_MESSAGES/twblue.mo
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user