If the primary clipboard was empty the fallback resulted in an unhandled
error due to missing arguments.
Fixed by using SELECTION_PRIMARY as fallback clipboard
Users were complaining about logs being flooded with `Session status key not valid`
which was a result of the Stats plugin using the wrong status keys.
Fixed by changing to debug log level since not useful in warning level
if spamming.
Since libtorrent 1.2.10 magnets save resume_data even with metadata not
yet downloaded. Unfortunately when using the deprecated
add_torrent_params key resume_data results in an error "missing
info-hash from URI"
The problem is due to lt session requiring an info_hash in
add_torrent_params but resume_data does not set or override this key and
resume_data overrides the add_torrent_params.url with an empty string.
The workaround is to specify the info_hash in add_torrent_params. We
require sha1_hash object or bytes and use of bytearray to maintain
python2 compatability.
https://dev.deluge-torrent.org/ticket/3478
The console tests are still failing on Windows due to an issue where the
sys args are not being correctly replaced in the tests so the pytest
args are being passed to console.
Fix user reported error:
Notification failure using email:
[Failure instance: Traceback: <class 'KeyError'>: 'name'
This was due to using empty dict used with get_status where a list of
keys is now required or the all_keys parameter is used.
Fixes: #3303
* Added required dependency setuptools to install_requires
* Remove optional dependency ipaddress from install_requires
* Created extras_require in setup.py. The optional dependencies should
not be included in install_requires so that users can either install
forked dependencies or remove problematic ones. Updated documentation to
detail how to install these optional dependencies.
* Fixed README badge
Refs:
* https://dev.deluge-torrent.org/ticket/3470
* https://dev.deluge-torrent.org/ticket/3282
* https://dev.deluge-torrent.org/ticket/3353
The modification of Python logging _findCaller args in Python 3.8 raises
TypeError in our custom Twisted Logger with Twisted <= 19 versions.
The actual issue for the custom logger was fixed in 18.9 so added a
version check to avoid usage.
Refs:
- https://twistedmatrix.com/trac/ticket/7927
- 6b894744e4
Due to new limitations for open-source projects on Travis we are
switching to GitHub actions.
* Notes about system site-packages
We had many problems with accessing system python packages on Travis for
libtorrent and GTK and the problems are harder on Github since there is
no more access. For now copying the python libtorrent binary into the
deluge source is the workaround. There is a pip package that could be
used in future.
Fixed failing tests with libtorrent 1.2 which required a non-zero length
file in torrent and workarounds for async alert delay.
Properly fix adding magnets, first attempted in previous commit 2e466101fc
add_torrent_magnet does not return a deferred so wrap in maybeDeferred.
Fixed broken test due to new deluge website icon
The autoadd function does not apply labels to torrents that are added via magnet files.
Those magnet files are also renamed ".Magnet.Invalid".
Here are two threads discussing the issue, which still exists.
https://forum.deluge-torrent.org/viewtopic.php?t=55539https://dev.deluge-torrent.org/ticket/3295
Here is what Deluged.log shows when the problem occurs:
21:51:38 [ERROR ][deluge_autoadd.core :333 ] Cannot Autoadd magnet: /Torrents/TorrentFiles/FileName.magnet: Torrent already in session (e1e0f33b656cb74532dcddc04f2ec52771ef1c26).
21:56:38 [ERROR ][deluge_autoadd.core :333 ] Cannot Autoadd magnet: /Torrents/TorrentFiles/FileName2.magnet: Torrent already in session (ef839d84d113cc35719b6fd616a4d8e220de7d32).
After looking at the code, what appears to be happening is the magnet link is added, but then a second scan of the folder occurs. Since the magnet file was never renamed, it will attempt to add it again, error out, then rename the file "magnet.invalid".
The only difference between the torrents working properly and magnets having the issue is the two lines I copy-pasted into the magnet IF statement. This should resolve the issue.
libtorrent 1.2 added endpoint struct to each tracker, to prevent false
updates we will need to verify that at least one endpoint to the errored
tracker is working. if there is at least one working, it will not set
the tracker status to
error and set it to `Announce OK`. otherwise, it will use the error
message from the alert.
Refs: https://dev.deluge-torrent.org/ticket/3384
Some torrent files built with py3createtorrent fail to produce a
file listing in the WebUI when uploading them.
This made it impossible to add such files.
Specifically this is caused by the additional metadata when using
py3createtorrent with the `--md5` flag.
* Added APPDATA to tox passenv so it is available to common module.
* Fixed windows path issue in httpdownloader tests
* Skipped torrentmanager test due to the following error from loading a
Linux pickled state file with a different line ending.
ModuleNotFoundError: No module named 'deluge.core.torrentmanager\r'
* Removed appveyor build
Torrent downloads from rutracker responds with the header:
Content-Type: application/x-bittorrent; charset=Windows-1251
The problem is that httpdownloader was using the charset to re-encode
the downloaded file, corrupting the binary torrent file download.
Fixed by only re-encoding text content types, since it is very rare
that non-text content types would actually have a non-utf8 codeset and
if there is a requirement we would need to determine it on a type by
type basis.
The GTKUI tests were failing and the saved config for the tab bar
position was not being restored.
Fixed by moving the setting of notebook.tabs_pos to TorrentDetail init.
Replaced more deprecated methods that were showing up in tests.
The tabs placement for the torrentdetails notebook might not be to
everyone's liking so add a menu item to configure it.
Default the position back to top.
Notifications plugin uses pygame for sound notifications however pygame
show a console message "Hello from the pygame community." whenever
starting deluge from console.
Refs: https://stackoverflow.com/a/55769463/175584
Users were encountering the following error while attempting to delete
magnet torrents and had the config 'Delete copy of torrent file'
enabled. This was due to removing a magnet before the metadata was
downloaded and the torrent.filename was still set to None so raises
exceptions when string operations are performed with it.
File "/usr/lib/python3/dist-packages/deluge/core/torrent.py", line 1317, in delete_torrentfile
os.path.join(self.config['torrentfiles_location'], self.filename)
...
TypeError: join() argument must be str or bytes, not 'NoneType'
Fixed by both setting a default empty string for self.filename and only
deleting the torrent file copy if filename is set.
The tests in ConsoleUIWithDaemonBaseTestCase could fail to the hard coded
port 58900 being busy.
Fix by using the proper port found in self.listen_port
Also convert unnecessary use of assertTrue where more appropriate
assert functions should be used, such as assertEqual and assertIn
Encoutering an error when webui attempts to download tracker icon:
Error occurred downloading file from "http://b'acg.rip'/": invalid
hostname: b'acg.rip'
Fixed by ensuring the request.tracker_name is decoded from bytes before
looking up the icon name.
* Fixed black hook requiring Py3.6 to installed locally. Will now assume
Py3.6+ in installed.
* Added isort traceback in pre-commit flake8 hook fails
* Updated versions of Black, Prettier and isort
* Keep Flake8 at 3.7.9 due to E402 issue: https://gitlab.com/pycqa/flake8/-/issues/638
* New pyproject config for isort v5 with fixes for Python 2 imports.
* Fixed travis config to run Python 3.6 for lint run. Replaced the
virtualenv with_system_site_packages config with Travis specific Python
config value so lint run doesn't attempt to append with_system_site_packages
to Python 3.6 command.
Comparisons on Python 3 are much stricter resulting in the following
error comparing with None:
TypeError: '>' not supported between instances of 'NoneType' and 'str'
Fix this by getting the type of the other value and getting it's default
value.
If a host in hostlist failed DNS lookup or other issue it was returning
a tuple instead of deferred. Fix this in hostlist by returning a
defer.succeed.
A race condition with BaseMode was also encountered when
update_hosts_status calls update_select_host_popup and
ConnectionManager does not have a rows attribute. Fix this by init
BaseMode before update_hosts_status and remove already called
update_select_host_popup.
Python3 has stricter type checking and passing a port as string results
in libtorrent raising a TypeError.
Fixed by casting port to int, along with refactoring to ensure ipv6 is
correctly parsing and a useful error is output to user with invalid ip
or port details.
https://dev.deluge-torrent.org/ticket/3348
If a password or other string contained a double-quote then the config
would fail to be loaded on startup and reset.
This occurred due to fixing a similar issue with curly braces for #3079
in commit 33e9545cd4 and the checking for double-quotes had unforseen
consequences.
To resolve both these issues the code to check for json objects in
config files was simplified and utilises the json module raw_decode
method to ensure the extracted string indexes are json objects.
Commit b32c5d824 changed the logged message in deluge/core/daemon_entry.py
when libtorrent fails to listen on the given port, without updating the
trigger expression in deluge/tests/common.py:start_core to match the new output.
Fix by updating the trigger match expressions to match the new log output
Accessing pytest.config is deprecated and produces:
PytestDeprecationWarning: the pytest.config global is deprecated. Please use
request.config or pytest_configure (if you're a pytest plugin) instead.
Fix by using a pytest.fixture
Currently, the dialog window is displayed until after the callback has returned.
The result is that if a new dialog is opened from the callback, the first dialog
is still displayed until the new dialog is destroyed.
Fix by destroying the dialog before running the callback.