Skip to content

Commit

Permalink
[Core] Make create_torrent return a deferred
Browse files Browse the repository at this point in the history
This allows to create a torrent file on the remote server
and get its content in one call.
  • Loading branch information
Radu Carpa committed Aug 28, 2023
1 parent 12cbebd commit 46f2679
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 18 deletions.
32 changes: 15 additions & 17 deletions deluge/core/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
import os
import shutil
import tempfile
import threading
from base64 import b64decode, b64encode
from typing import Any, Dict, List, Optional, Tuple, Union
from urllib.request import URLError, urlopen
Expand Down Expand Up @@ -1001,21 +1000,19 @@ def create_torrent(
add_to_session=False,
):
log.debug('creating torrent..')
threading.Thread(
target=self._create_torrent_thread,
args=(
path,
tracker,
piece_length,
comment,
target,
webseeds,
private,
created_by,
trackers,
add_to_session,
),
).start()
return threads.deferToThread(
self._create_torrent_thread,
path,
tracker,
piece_length,
comment=comment,
target=target,
webseeds=webseeds,
private=private,
created_by=created_by,
trackers=trackers,
add_to_session=add_to_session,
)

def _create_torrent_thread(
self,
Expand Down Expand Up @@ -1055,12 +1052,13 @@ def _create_torrent_thread(
with open(target, 'wb') as _file:
_file.write(filecontent)

filedump = b64encode(filecontent)
log.debug('torrent created!')
if add_to_session:
options = {}
options['download_location'] = os.path.split(path)[0]
filedump = b64encode(filecontent)
self.add_torrent_file(filename, filedump, options)
return filename, filedump

@export
def upload_plugin(self, filename: str, filedump: Union[str, bytes]) -> None:
Expand Down
32 changes: 31 additions & 1 deletion deluge/tests/test_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@
# the additional special exception to link portions of this program with the OpenSSL library.
# See LICENSE for more details.
#

import base64
import os
from base64 import b64encode
from hashlib import sha1 as sha

import libtorrent
import pytest
import pytest_twisted
from twisted.internet import defer, reactor, task
Expand Down Expand Up @@ -483,3 +484,32 @@ def test__create_peer_id(self):
assert self.core._create_peer_id('2.0.1rc1') == '-DE201r-'
assert self.core._create_peer_id('2.11.0b2') == '-DE2B0b-'
assert self.core._create_peer_id('2.4.12b2.dev3') == '-DE24CD-'

@pytest.mark.parametrize(
'path',
[
common.get_test_data_file('deluge.png'),
os.path.dirname(common.get_test_data_file('deluge.png')),
],
)
@pytest.mark.parametrize('piece_length', [2**14, 2**16])
def test_create_torrent(self, path, tmp_path, piece_length):
target = tmp_path / 'test.torrent'

def check_torrent_ok(result):
filename, filedump = result
filecontent = base64.b64decode(filedump)

with open(target, 'rb') as f:
assert f.read() == filecontent

libtorrent.torrent_info(filecontent)

d = self.core.create_torrent(
path=path,
tracker=None,
piece_length=piece_length,
target=target,
add_to_session=False,
)
return d.addCallback(check_torrent_ok)

0 comments on commit 46f2679

Please sign in to comment.