Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add WebRTC support to popular torrent clients #369

Open
6 of 9 tasks
feross opened this issue Jul 7, 2015 · 67 comments
Open
6 of 9 tasks

Add WebRTC support to popular torrent clients #369

feross opened this issue Jul 7, 2015 · 67 comments

Comments

@feross
Copy link
Member

feross commented Jul 7, 2015

@gauravsaini
Copy link

👍

@feross feross added the meta label Jul 15, 2015
@Stiveknx
Copy link
Contributor

Hi @feross.

So, how is the progress on this?

@feross
Copy link
Member Author

feross commented Jul 30, 2015

@dcposch has done some exploration of getting webrtc support into libtorrent. It looks like it'll be doable!

@transitive-bullshit
Copy link
Member

@feross seems to me that this should be the most important outstanding issue by far as it is really the only blocker for webtorrent gaining widespread use in the browser and fulfilling the original promise of the project.

@feross @mafintosh One other extremely popular torrent client that isn't listed here would be peerflix, as it still sees ridiculous usage (although hard to quantify) via the various popcorn-time forks. If peerflix were augmented to support webrtc peers, that could potentially allow a popcorn-time in the browser use case to function very well. Product Hunters seem to agree that this would be a great development.

It's also pretty clear that given the synergy between torrent-stream/peerflix and webtorrent in terms of environment and shared dependencies, making peerflix peers hybrid wouldn't be nearly as difficult as integrating webrtc support into the other, non-js-based torrent clients.

@dcposch
Copy link
Contributor

dcposch commented Oct 18, 2015

Interesting...

peerflix peers hybrid wouldn't be nearly as difficult as integrating webrtc support into the other, non-js-based torrent clients

Agreed. @jhiesey & i checked out how hard it would be to add webtorrent support to one of the native torrent libraries, eg libtorrent.

It looks like the biggest hurdle is that there's no libdatachannel or anything like that, no small library with a clean API for using WebRTC data channels. instead, there are two full WebRTC implementations:

@B00tLdr
Copy link

B00tLdr commented Nov 4, 2015

Maybe this project could be helpful: https://github.com/xhs/librtcdc

@dcposch
Copy link
Contributor

dcposch commented Nov 4, 2015

wow, that looks awesome. if i have time later i'll try it out

@jhiesey
Copy link
Contributor

jhiesey commented Nov 4, 2015

@dcposch if it works well I want to look at making node bindings for it as well.

@cathalgarvey
Copy link

Sorry if this is a stupid question, but:

Webtorrent's docs/FAQ suggest that browser-based WebTorrent users can only communicate with other browser based clients and "hybrid" clients. "Hybrid" clients can communicate with either pool, bridging the swarms.

Ultimately we don't want bridges, we want one swarm. But right now, what are the "bridges" or "hybrids"? Node-based WebTorrent users? Or something else?

@rom1504
Copy link
Member

rom1504 commented Nov 24, 2015

@cathalgarvey there is a node hybrid client : see https://github.com/feross/webtorrent-hybrid (also see webtorrent/webtorrent-hybrid#5 (comment))

@devlo
Copy link

devlo commented Jan 18, 2016

@feross
Did you reach to bittorrent inc ? Making webtorrent as extension to Bittorrent protocol would be huge step.
The most important adopters are uTorrent and libtorrent (rtorrent, deluge etc.), rest really doesn't matter.
Another thing, where is documentation of protocol which webtorrent uses with implementation details ?
This is a must for adoption and I do not see any links in github repo or on webtorrent.io. You need to standardize webtorrent or you will see no adoption at all.
If someone would like to implement it in C/C++ then where he should look ? What if he is not familiar with javascript ?
In my opinion this is the main reason why you do not see any adoption besides people using your own lib.

@transitive-bullshit
Copy link
Member

@devlo completely agreed; I know feross is aware of this, but there just hasn't been anyone who's stepped up and been able to make this integration happen. The piece that I'd recommend starting from would be communicating in C from libtorrent to https://github.com/feross/webtorrent-hybrid via webrtc probably using one of the C-based webrtc libraries listed above.

@transitive-bullshit
Copy link
Member

See libtorrent#223 for some continued libtorrent discussion.

@rom1504
Copy link
Member

rom1504 commented Mar 13, 2016

https://wiki.vuze.com/w/WebTorrent it seems vuze has support now !

@voxadam
Copy link

voxadam commented Jul 15, 2016

It seems to me that documenting the protocol adaptations/extensions would be the best way to encourage the developers of other clients to add support to their codebases. Ideally, I suppose this would come in the form of a BEP but even a draft specification would likely be welcomed by many.

@farribeiro
Copy link

farribeiro commented Oct 2, 2016

Add in this issue the link for libtorrent issue on github #223

Duplicated, sorry!

@hex-m
Copy link

hex-m commented Oct 6, 2016

Someone created a ticket for Transmission. It may need some details though.
transmission/transmission#47

@dessalines
Copy link

If this were done for libtorrent, it would work for deluge, and qbittorrent, the two most popular open source bittorrent clients. Once that's done, you instantly got a lot more seeders.

@dessalines
Copy link

@feross I'm planning on assisting adding this into libtorrent, with a c++ webRTC library, but could you help point me to which files in this codebase show the webRTC communication?

@yciabaud
Copy link
Contributor

Great @dessalines! Cannot wait to see that coming!

If I can give you some pointers:

  1. You will have to connect to the websocket tracker in order to make WebRTC signalling. Basically you will have to add WebRTC offers on announce and manage SDP offers/responses. Here is our implementation: https://github.com/feross/bittorrent-tracker/blob/master/lib/client/websocket-tracker.js
  2. Once a WebRTC connexion is established, the torrent peer protocol is used, so there is nothing special here. This project uses https://github.com/feross/simple-peer to make the connexion then it becomes a "normal" peer. (Except that the connexion is handled upstream: https://github.com/feross/webtorrent/blob/15ed59a0d2c9d32598ab4c98706e6fd8fa200843/lib/peer.js#L16)

There is a BEP we are working on in #881, it should give you some informations but be aware that some fields have been renamed for the future standard and read the comments (or look at the code).
The document is published at https://github.com/yciabaud/webtorrent/blob/486a94d2b651e7aed86ba27b82e679f5d1d1e700/bep_webrtc.rst

I am very interested in making libtorrent support webtorrent so ask if there is anything I can do for it.

@ExE-Boss
Copy link

ExE-Boss commented Aug 4, 2019

Yes, there’s discussion over at arvidn/libtorrent#223 about existing non‑browser WebRTC implementations and their pros and cons.

The most favourable option currently appears to be @lgrahl’s RAWRTC.

@backkem
Copy link

backkem commented Aug 4, 2019

Anyone into Go may be able to pick up anacrolix/torrent#138. pion/webrtc should be in good shape to power a Go implementation.

@dessalines
Copy link

Libtorrent (which is written in C++) is the only one that matters. It powers qbittorrent, deluge, transmission, rtorrent.

@ExE-Boss
Copy link

ExE-Boss commented Aug 4, 2019

rTorrent uses its own BitTorrent implementation, which is also, confusingly, called LibTorrent.

@iagovar
Copy link

iagovar commented Nov 11, 2019

Any update?

I really want to upload my videos to a seedbox and then stream to peertube, bitchute and web players, but it seems odd to have to do it trough a VPS and a freaking browser open. It's just too much bloat because I need to install X and so on.

I don't trust peertube instances to keep hosting.

@transitive-bullshit
Copy link
Member

Really interesting progress on integrating into libtorrent. arvidn/libtorrent#4123

@Allardje
Copy link

I really hope this is still on-going. I would love to see something like rTorrent adopting WebRTC support. This will be a game changer. Been following this for a very long time but it seems no new clients added WebRTC for years :(.

@kropple
Copy link

kropple commented Mar 27, 2020

is there by now any high-performance torrent client which i can use to seed a huge amount of files?
i saw there is some movement at libtorrent but nothing usable until now.

@backkem
Copy link

backkem commented Apr 16, 2020

anacrolix/torrent just landed initial WebTorrent support in anacrolix/torrent#393. I guess this marks the first port to another language, Go in this case.

@PeterTheOne
Copy link

The Wikipedia Article comparing BitTorrent clients is missing WebTorrent clients and also a column on WebTorrent/WebRTC as a supported feature. That would also be a good place to track support, I hope this is on topic here.

@farribeiro
Copy link

libtorrent (arvidn/libtorrent#223, #241) implementation finshed, awaiting review to go/ready

@artemmolotov
Copy link

artemmolotov commented Jul 1, 2020

PR arvidn/libtorrent#4123 is merged!

@modbender
Copy link

modbender commented Sep 6, 2020

Please add this too: https://github.com/Novik/ruTorrent
seedboxes from seedbox.io use them

@zero77
Copy link

zero77 commented Sep 7, 2020

@modbender
I think rtorrent is what you are after as ruTorrent is just the php browser interface.

@modbender
Copy link

modbender commented Sep 7, 2020

Oh right. Didn't read about it fully, Thank you.

@fmohican
Copy link

Is there any guide to compile rtorrent with webrtc support?

//sorry for offtopic.

@ThaUnknown
Copy link
Member

ThaUnknown commented Aug 14, 2021

@feross I think bringing WRTC to JSTorrent will be hard for the same reasons why the brave webtorrent extension doesn't have WRTC, also libtorrent has WRTC support, but doesn't support webtorrent yet, it wants to do it tho

@farribeiro
Copy link

farribeiro commented Oct 20, 2021

Is there any guide to compile rtorrent with webrtc support?

//sorry for offtopic.

I think isn't have any movement to turn hybrid the rtorrent (rakshasa/rtorrent#717)

btw... I commented on @vbakc issue, i liked the TUI of client

@stokito
Copy link

stokito commented Jul 9, 2022

I'm not familiar with the Torrent but from what I understood it would be better to focus on Web Seeding with plain HTTP instead of WebRTC.
We already have many files in the existing Torrent network but they just aren't accessible by a browser. The WebRTC allows a browser to seed files but for most users they just need to get a content and they even may want not to seed anything, especially from a mobile phone.

I briefly read the spec BEP 19: WebSeed - HTTP/FTP Seeding in GetRight style and as far I understood the Web Seeding was intended to make a file downloaded by clients via HTTP and then they may seed it over the torrent network as usual.
It would be great if the clients can seed it too over HTTP to increase seeders swarm.

A Torrent tracker just stores part ranges with hashes and list of seeders.

Also this may allow us to use just a router as a web server. Both OpenWrt uhttpd and BusyBox httpd supports the Accept-Range header. Also a router then can use just a simple wget to download torrents. This would be extremely great to download package updates.

I think that for a simplicity a tracker may be replaced with some Dynamic DNS proxy that receives a magnet hash as a subdomain, performs a DHT lookup and returns an IP of a seeder. Then to download a file it should be enough to write a simple shell script with for loop that calls wget and checks hash sum.

P.S. Just found a zsync tool which does the same but without a tracker which is also a very useful.

Please correct me if I wrong because I asked a very strange questions.
I working on a YurtPage homepage engine for small routers and I need to implement a content distribution over Torrent so that routers can handle photo and video hosting.
In the same time the content must be backed up or distributed between routers of friends and followers. So the router must also act as client itself.

UPD here is the dedicated issue for this #1492

@Alch-Emi
Copy link

With respect, I feel like your proposal, as I understand it, does not reflect the usecases of many Bittorrent and WebTorrent users. Putting aside some of your recommendations for infrastructure changes for a moment, and just examining the sugguestion of moving to advocacy for increased Web seeding in torrenting ecosystems rather than advocacy for WebTorrent support, which I believe is the argument you make in the first part of your message.

The key flaw I see is that Web Seeds are selected at torrent creation, and cannot be changed at any point after. This introduces two key issues:

  • This is a central point of failure. If a swarm is dependent on a small selection of webservers, the loss of a few of these will degrade torrent performance, and the loss of all of them could jeporadize or even kill the swarm.
  • This undermines the core appeal of BitTorrent/WebTorrent, which is consumers as providers. Using torrents, it is trivially easy, automatic often, for a user who downloads some content to then provide that content (both in terms of disk space / availability over time and in terms of bandwidth) to the swarm. This resiliancy and performance is a key appeal of WebTorrent. WebSeeds remove this relation, as consumers have no way to offer the data the downloaded or any of their bandwidth to the swarm. Of course, they can seed it over the normal BitTorrent protocol or WebTorrent protocol, but this divides the swarm and impairs resiliancy and performance if these two protocols can't co-operate, hence this issue.

On the topic of some of the infrastructure changes you proposed, I don't believe that very many members of bittorrent/webtorrent communities operate using routers as their main avenue for retrieving torrents, instead prefering desktop applications or web applications. Many of these users do not have the technical knowledge to set up dynamic DNS on an ICANN-recognized domain, although to be honest, I may just be misunderstanding this part of your proposal, as I admit I had a little trouble following.

Reading through your usecase, it sounds like you already have an idea of what peers you want to be sharing/receiving files from. It might be a good idea to not use trackers in favor of manually adding peers, which I belive you only need a ip/port pair for. If you would like to use trackers, hosting a tracker on the sharing router might also be worthwhile?

Although full disclaimer, I'm not a WebTorrent developer, so someone else might be more qualified to chip in

@stokito
Copy link

stokito commented Jul 11, 2022

@Alch-Emi thank you for your comment. My main idea is to make torrent working on HTTP in addition to mTP. The HTTP protocol can be directly used from a browser. The main advantage would be that instead of a big WebRTC library a torrent client and server can have just a basic HTTP client and server.

The WebSeeds looks like implements a server part only. So probably it's already possible to download a torrent from a browser without WS and WebRTC.

As an advantage of the HTTP is that any existing web server, including smallest one on routers can handle this. And this also allows to make torrent daemon smaller and reuse a HTTP daemon.

@ThaUnknown
Copy link
Member

theory is nice, practice isnt!
BT is made in a way where data is consumed in chunks, HTTP doesn't like that very much, and currently there's no way of actually control incoming data streams.
I made this: #2192
but to say its... bad would be an understatement, this is partially an issue with how webtorrent handles webseeds, and partially the fault of the browser.
WebRTC libs aren't that big, for example libdatachannel is just 500KB, which isn't that big.

Overall I think this is insanely off-topic as the main idea is to help WebTorrent download from existing peers, rather than create new peers and new implementations to connect to those peers. WebTorrent supports webseeds [but not get-right style]

@stokito
Copy link

stokito commented Jul 11, 2022

@ThaUnknown thank you for the explanation. I still didn't fully understood what's wrong with HTTP but I believe you.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests