diff --git a/README.md b/README.md index 3fca35d..bca9f54 100644 --- a/README.md +++ b/README.md @@ -17,90 +17,94 @@ Usage Getting list of files inside torrent is straightforward: - import xbmc - from torrent2http import State, Engine, MediaType - from contextlib import closing +```python +import xbmc +from torrent2http import State, Engine, MediaType +from contextlib import closing - # Create instance of Engine - engine = Engine(uri="...") - files = [] - # Ensure we'll close engine on exception - with closing(engine): - # Start engine - engine.start() - # Wait until files received - while not files and not xbmc.abortRequested: - # Will list only video files in torrent - files = engine.list(media_types=[MediaType.VIDEO]) - # Check if there is loading torrent error and raise exception - engine.check_torrent_error() - xbmc.sleep(200) +# Create instance of Engine +engine = Engine(uri="...") +files = [] +# Ensure we'll close engine on exception +with closing(engine): + # Start engine + engine.start() + # Wait until files received + while not files and not xbmc.abortRequested: + # Will list only video files in torrent + files = engine.list(media_types=[MediaType.VIDEO]) + # Check if there is loading torrent error and raise exception + engine.check_torrent_error() + xbmc.sleep(200) +``` ### Start streaming ### - import xbmc - from torrent2http import State, Engine, MediaType - from contextlib import closing +```python +import xbmc +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(engine): - # Start engine and instruct torrent2http to begin download first file, - # so it can start searching and connecting to peers - 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 +# 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(engine): + # Start engine and instruct torrent2http to begin download first file, + # so it can start searching and connecting to peers + 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 - # 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) + 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 ###