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 authored and cas-- committed Nov 20, 2023
1 parent b63699c commit 4088e13
Show file tree
Hide file tree
Showing 2 changed files with 42 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
28 changes: 27 additions & 1 deletion deluge/tests/test_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# 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
Expand Down Expand Up @@ -483,3 +483,29 @@ 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])
@pytest_twisted.inlineCallbacks
def test_create_torrent(self, path, tmp_path, piece_length):
target = tmp_path / 'test.torrent'

filename, filedump = yield self.core.create_torrent(
path=path,
tracker=None,
piece_length=piece_length,
target=target,
add_to_session=False,
)
filecontent = base64.b64decode(filedump)

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

lt.torrent_info(filecontent)

0 comments on commit 4088e13

Please sign in to comment.