summaryrefslogtreecommitdiffstats
path: root/deluge
diff options
context:
space:
mode:
authorCalum Lind <calumlind+deluge@gmail.com>2022-07-10 13:20:41 +0100
committerCalum Lind <calumlind+deluge@gmail.com>2022-07-10 13:20:41 +0100
commit0b5f45b486e8e974ba8a0b1d6e8edcd124fca62a (patch)
tree2929cb3ff93813cd7daa0c78b44f6c3065665478 /deluge
parent20efcfd34583a999e16463c300705c9a5b669f9d (diff)
parent05e13a6b203da41eec41a10c17f2aa987aacd1da (diff)
downloaddeluge-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.py18
-rw-r--r--deluge/core/torrentmanager.py2
-rw-r--r--deluge/tests/test_common.py15
-rw-r--r--deluge/tests/test_core.py7
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)