From 8c8944b822ea26c261669979e9a097d19ade7968 Mon Sep 17 00:00:00 2001 From: Anton Argirov Date: Mon, 2 Feb 2015 16:10:01 +0600 Subject: [PATCH] Updated README.md --- README.md | 64 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 56 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 839bbc9..3fca35d 100644 --- a/README.md +++ b/README.md @@ -42,19 +42,67 @@ Getting list of files inside torrent is straightforward: from torrent2http import State, Engine, MediaType from contextlib import closing + # XBMC addon handle + handle = ... + # Playable list item + listitem = ... # We can know file_id of needed video file on this step, if no, we'll try to detect one. file_id = None + # Flag will set to True when engine is ready to resolve URL to XBMC + ready = False + # Set pre-buffer size to 15Mb. This is a size of file that need to be downloaded before we resolve URL to XMBC + pre_buffer_bytes = 15*1024*1024 engine = Engine(uri="...") - with closing(self.engine): + with closing(engine): # Start engine and instruct torrent2http to begin download first file, # so it can start searching and connecting to peers - self.engine.start(file_id or 0) - while not xbmc.abortRequested: - sleep(self.SLEEP_DELAY) - status = self.engine.status() - self.engine.check_torrent_error(status) - if status.state in [State.DOWNLOADING, State.FINISHED, State.SEEDING]: + engine.start(file_id or 0) + while not xbmc.abortRequested and not ready: + xbmc.sleep(500) + status = engine.status() + # Check if there is loading torrent error and raise exception + engine.check_torrent_error(status) + # Trying to detect file_id + if file_id is None: + # Get torrent files list, filtered by video file type only + files = engine.list(media_types=[MediaType.VIDEO]) + # If torrent metadata is not loaded yet then continue + if files is None: + continue + # Torrent has no video files + if not files: + break + # Select first matching file + file_id = files[0].index + file_status = files[0] + else: + # If we've got file_id already, get file status + file_status = engine.file_status(file_id) + # If torrent metadata is not loaded yet then continue + if not file_status: + continue + if status.state == State.DOWNLOADING: + # Wait until minimum pre_buffer_bytes downloaded before we resolve URL to XBMC + if file_status.download >= pre_buffer_bytes: + ready = True + break + elif status.state in [State.FINISHED, State.SEEDING]: + # We have already downloaded file ready = True break + # Here you can update pre-buffer progress dialog, for example. + # Note that State.CHECKING also need waiting until fully finished, so it better to use resume_file option + # for engine to avoid CHECKING state if possible. + # ... + if ready: + # Resolve URL to XBMC + listitem.SetPath(file_status.url) + xbmcplugin.SetResolvedUrl(handle, True, listitem) + # Wait until playing finished or abort requested + while not xbmc.abortRequested and xbmc.Player().isPlaying(): + xbmc.sleep(500) + +### Fully working example ### -... todo ... \ No newline at end of file +You can look into fully working [example](https://github.com/anteo/plugin.video.okino/blob/master/resources/lib/okino/torrent/stream/t2h_stream.py). This is +excerpt from my plugin using script.module.torrent2http. It rather complicated but it includes error handling, showing progress dialog and other features.