Наконец-то изменил описание
parent
10609b85f6
commit
dbba38b27d
104
README.md
104
README.md
|
@ -1,108 +1,6 @@
|
|||
script.module.pyrrent2http
|
||||
==========================
|
||||
|
||||
This add-on is binding to [torrent2http](https://github.com/anteo/torrent2http) client.
|
||||
It is bundled with torrent2http binaries for Android ARM, Linux x86/x64/ARM, Windows x86/x64 and Darwin/OSX x64 platforms.
|
||||
You can download it from my [repository](http://bit.ly/184XKjm)
|
||||
This add-on is engine for [plugin.video.torrenter](https://github.com/DiMartinoXBMC/plugin.video.torrenter)
|
||||
|
||||
This add-on can be used to stream media files from torrents without need to download entire files.
|
||||
|
||||
Internally, it runs pre-compiled torrent2http client binary, which starts local HTTP server, presenting contents of torrent.
|
||||
Next, request to HTTP server can be sent to receive list of files or to start streaming of needed file inside of torrent.
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
### Get list of files inside torrent ###
|
||||
|
||||
Getting list of files inside torrent is straightforward:
|
||||
|
||||
```python
|
||||
import xbmc
|
||||
from pyrrent2http 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)
|
||||
```
|
||||
|
||||
### Start streaming ###
|
||||
|
||||
```python
|
||||
import xbmc
|
||||
from pyrrent2http 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
|
||||
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)
|
||||
```
|
||||
|
||||
|
|
Loading…
Reference in New Issue