diff options
author | Calum Lind <calumlind+deluge@gmail.com> | 2022-07-10 13:20:41 +0100 |
---|---|---|
committer | Calum Lind <calumlind+deluge@gmail.com> | 2022-07-10 13:20:41 +0100 |
commit | 0b5f45b486e8e974ba8a0b1d6e8edcd124fca62a (patch) | |
tree | 2929cb3ff93813cd7daa0c78b44f6c3065665478 /deluge | |
parent | 20efcfd34583a999e16463c300705c9a5b669f9d (diff) | |
parent | 05e13a6b203da41eec41a10c17f2aa987aacd1da (diff) | |
download | deluge-master.tar.gz deluge-master.tar.bz2 deluge-master.zip |
Merge branch 'release-2.1.1'deluge-2.1.1master
Diffstat (limited to 'deluge')
-rw-r--r-- | deluge/common.py | 18 | ||||
-rw-r--r-- | deluge/core/torrentmanager.py | 2 | ||||
-rw-r--r-- | deluge/tests/test_common.py | 15 | ||||
-rw-r--r-- | deluge/tests/test_core.py | 7 |
4 files changed, 32 insertions, 10 deletions
diff --git a/deluge/common.py b/deluge/common.py index 77573ffd7..ecf90a390 100644 --- a/deluge/common.py +++ b/deluge/common.py @@ -734,6 +734,8 @@ MAGNET_SCHEME = 'magnet:?' XT_BTIH_PARAM = 'xt=urn:btih:' DN_PARAM = 'dn=' TR_PARAM = 'tr=' +TR_TIER_PARAM = 'tr.' +TR_TIER_REGEX = re.compile(r'^tr.(\d+)=(\S+)') def is_magnet(uri): @@ -776,8 +778,6 @@ def get_magnet_info(uri): """ - tr0_param = 'tr.' - tr0_param_regex = re.compile(r'^tr.(\d+)=(\S+)') if not uri.startswith(MAGNET_SCHEME): return {} @@ -805,12 +805,14 @@ def get_magnet_info(uri): tracker = unquote_plus(param[len(TR_PARAM) :]) trackers[tracker] = tier tier += 1 - elif param.startswith(tr0_param): - try: - tier, tracker = re.match(tr0_param_regex, param).groups() - trackers[tracker] = tier - except AttributeError: - pass + elif param.startswith(TR_TIER_PARAM): + tracker_match = re.match(TR_TIER_REGEX, param) + if not tracker_match: + continue + + tier, tracker = tracker_match.groups() + tracker = unquote_plus(tracker) + trackers[tracker] = int(tier) if info_hash: if not name: diff --git a/deluge/core/torrentmanager.py b/deluge/core/torrentmanager.py index 4904e94ed..5609df4bd 100644 --- a/deluge/core/torrentmanager.py +++ b/deluge/core/torrentmanager.py @@ -436,8 +436,8 @@ class TorrentManager(component.Component): magnet_info = get_magnet_info(magnet) if magnet_info: add_torrent_params['name'] = magnet_info['name'] + add_torrent_params['trackers'] = list(magnet_info['trackers']) torrent_id = magnet_info['info_hash'] - # Workaround lt 1.2 bug for magnet resume data with no metadata add_torrent_params['info_hash'] = bytes(bytearray.fromhex(torrent_id)) else: raise AddTorrentError( diff --git a/deluge/tests/test_common.py b/deluge/tests/test_common.py index e5027ebca..780d368ef 100644 --- a/deluge/tests/test_common.py +++ b/deluge/tests/test_common.py @@ -7,6 +7,7 @@ import os import sys import tarfile +from urllib.parse import quote_plus import pytest @@ -19,6 +20,7 @@ from deluge.common import ( fsize, fspeed, ftime, + get_magnet_info, get_path_size, is_infohash, is_interface, @@ -209,3 +211,16 @@ class TestCommon: if tar_info.name == 'archive_message.txt': result = tar.extractfile(tar_info).read().decode() assert result == 'test' + + def test_get_magnet_info_tiers(self): + tracker1 = 'udp://tracker1.example.com' + tracker2 = 'udp://tracker2.example.com' + magnet = ( + 'magnet:?xt=urn:btih:SU5225URMTUEQLDXQWRB2EQWN6KLTYKN' + f'&tr.1={quote_plus(tracker1)}' + f'&tr.2={quote_plus(tracker2)}' + ) + result = get_magnet_info(magnet) + assert result['info_hash'] == '953bad769164e8482c7785a21d12166f94b9e14d' + assert result['trackers'][tracker1] == 1 + assert result['trackers'][tracker2] == 2 diff --git a/deluge/tests/test_core.py b/deluge/tests/test_core.py index f1c2e3be8..6a3fb9506 100644 --- a/deluge/tests/test_core.py +++ b/deluge/tests/test_core.py @@ -222,10 +222,15 @@ class TestCore(BaseTestCase): @pytest_twisted.inlineCallbacks def test_add_torrent_magnet(self): info_hash = '60d5d82328b4547511fdeac9bf4d0112daa0ce00' - uri = deluge.common.create_magnet_uri(info_hash) + tracker = 'udp://tracker.example.com' + name = 'test magnet' + uri = deluge.common.create_magnet_uri(info_hash, name=name, trackers=[tracker]) options = {} torrent_id = yield self.core.add_torrent_magnet(uri, options) assert torrent_id == info_hash + torrent_status = self.core.get_torrent_status(torrent_id, ['name', 'trackers']) + assert torrent_status['trackers'][0]['url'] == tracker + assert torrent_status['name'] == name def test_resume_torrent(self): tid1 = self.add_torrent('test.torrent', paused=True) |