Skip to content

Commit b2788eb

Browse files
authored
Refactor streaming (#8438)
2 parents aab459b + f4743fd commit b2788eb

File tree

19 files changed

+2852
-875
lines changed

19 files changed

+2852
-875
lines changed

Diff for: src/tribler/core/libtorrent/download_manager/download.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -811,7 +811,7 @@ def stop(self, user_stopped: bool | None = None) -> Awaitable[None]:
811811
"""
812812
self._logger.debug("Stopping %s", self.tdef.get_name())
813813
if self.stream is not None:
814-
self.stream.disable()
814+
self.stream.close()
815815
if user_stopped is not None:
816816
self.config.set_user_stopped(user_stopped)
817817
if self.handle and self.handle.is_valid():

Diff for: src/tribler/core/libtorrent/download_manager/download_manager.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -872,7 +872,7 @@ async def remove_download(self, download: Download, remove_content: bool = False
872872
if handle:
873873
if handle.is_valid():
874874
if download.stream is not None:
875-
download.stream.disable()
875+
download.stream.close()
876876
logger.debug("Removing handle %s", hexlify(infohash))
877877
(await self.get_session(download.config.get_hops())).remove_torrent(handle, int(remove_content))
878878
else:

Diff for: src/tribler/core/libtorrent/download_manager/stream.py

+201-505
Large diffs are not rendered by default.

Diff for: src/tribler/core/libtorrent/restapi/downloads_endpoint.py

+7-19
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from __future__ import annotations
22

33
import mimetypes
4-
from asyncio import get_event_loop, shield, wait_for
4+
from asyncio import get_event_loop, shield
55
from binascii import hexlify, unhexlify
66
from pathlib import Path, PurePosixPath
77
from typing import TYPE_CHECKING, Any, Optional, TypedDict, cast
@@ -19,7 +19,7 @@
1919
from tribler.core.libtorrent.download_manager.download_config import DownloadConfig
2020
from tribler.core.libtorrent.download_manager.download_manager import DownloadManager
2121
from tribler.core.libtorrent.download_manager.download_state import DOWNLOAD, UPLOAD, DownloadStatus
22-
from tribler.core.libtorrent.download_manager.stream import Stream, StreamChunk
22+
from tribler.core.libtorrent.download_manager.stream import Stream, StreamReader
2323
from tribler.core.libtorrent.torrentdef import TorrentDef
2424
from tribler.core.restapi.rest_endpoint import (
2525
HTTP_BAD_REQUEST,
@@ -249,8 +249,6 @@ def get_files_info_json_paged(download: Download, view_start: Path, view_size: i
249249
"availability": Float,
250250
"peers": String,
251251
"total_pieces": Integer,
252-
"vod_prebuffering_progress": Float,
253-
"vod_prebuffering_progress_consec": Float,
254252
"error": String,
255253
"time_added": Integer
256254
}),
@@ -336,16 +334,9 @@ async def get_downloads(self, request: Request) -> RESTResponse: # noqa: C901
336334
"completed_dir": download.config.get_completed_dir(),
337335
"total_pieces": tdef.get_nr_pieces(),
338336
"error": repr(state.get_error()) if state.get_error() else "",
339-
"time_added": download.config.get_time_added()
337+
"time_added": download.config.get_time_added(),
338+
"streamable": bool(tdef and tdef.get_files_with_length({'mp4', 'm4v', 'mov', 'mkv'}))
340339
}
341-
if download.stream:
342-
info.update({
343-
"vod_prebuffering_progress": download.stream.prebuffprogress,
344-
"vod_prebuffering_progress_consec": download.stream.prebuffprogress_consec,
345-
"vod_header_progress": download.stream.headerprogress,
346-
"vod_footer_progress": download.stream.footerprogress,
347-
348-
})
349340

350341
if unfiltered or params.get("infohash") == info["infohash"]:
351342
# Add peers information if requested
@@ -1137,11 +1128,8 @@ async def prepare(self, request: BaseRequest) -> AbstractStreamWriter | None:
11371128
stream = self._download.stream
11381129

11391130
start = start or 0
1140-
if not stream.enabled or stream.fileindex != self._file_index:
1141-
await wait_for(stream.enable(self._file_index, start), 10)
1142-
await stream.updateprios()
1143-
1144-
reader = StreamChunk(self._download.stream, start)
1131+
await stream.enable(self._file_index)
1132+
reader = StreamReader(stream, start)
11451133
await reader.open()
11461134
try:
11471135
writer = await super().prepare(request)
@@ -1153,7 +1141,7 @@ async def prepare(self, request: BaseRequest) -> AbstractStreamWriter | None:
11531141
while data:
11541142
await writer.write(data[:todo])
11551143
todo -= len(data)
1156-
if todo <= 0:
1144+
if todo <= 0 or len(data) == 0:
11571145
break
11581146
data = await reader.read()
11591147

Diff for: src/tribler/core/libtorrent/torrents.py

-19
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
from pathlib import Path
1616

1717
from tribler.core.libtorrent.download_manager.download import Download
18-
from tribler.core.libtorrent.download_manager.stream import Stream
1918
from tribler.core.libtorrent.torrentdef import InfoDict
2019

2120
logger = logging.getLogger(__name__)
@@ -84,24 +83,6 @@ def done_cb(fut: Future[lt.torrent_handle]) -> None:
8483
return invoke_func
8584

8685

87-
def check_vod(default: WrappedReturn) -> Wrapped:
88-
"""
89-
Check if torrent is vod mode, else return default.
90-
"""
91-
92-
def wrap(f: Wrapped) -> Wrapped:
93-
def invoke_func(self: Stream,
94-
*args: WrappedParams.args, **kwargs: WrappedParams.kwargs # type: ignore[valid-type]
95-
) -> WrappedReturn:
96-
if self.enabled:
97-
return f(self, *args, **kwargs)
98-
return default
99-
100-
return invoke_func
101-
102-
return wrap
103-
104-
10586
def common_prefix(paths_list: list[Path]) -> Path:
10687
"""
10788
Get the path prefixes component-wise.

0 commit comments

Comments
 (0)