The following is a general comparison of BitTorrent clients, which are computer programs designed for peer-to-peer file sharing using the BitTorrent protocol.[1]
The BitTorrent protocol coordinates segmented file transfer among peers connected in a swarm. A BitTorrent client enables a user to exchange data as a peer in one or more swarms. Because BitTorrent is a peer-to-peer communications protocol that doesn't need a server, the BitTorrent definition of client differs from the conventional meaning expressed in the client–server model.[1]
Bram Cohen, author of the BitTorrent protocol, made the first BitTorrent client, which he also called BitTorrent, and published it in July 2001.[2]
Many BitTorrent programs are open-source software; others are freeware, adware or shareware. Some download managers, such as FlashGet and GetRight, are BitTorrent-ready. Opera 12, a web browser, can also transfer files via BitTorrent.
In 2007, four BitTorrent clients were discovered to be Trojan horses that attempt to infect Windows with malware.[3][4][5] Those clients—BitRoll, GetTorrent, Torrent101, and TorrentQ—are excluded from the comparison tables below. In 2013, Thunder Networking Technologies admitted that some of their employees surreptitiously distributed a Trojan horse with certain releases of Xunlei, the company's BitTorrent-ready download manager.[6][7] Xunlei is included in the comparison tables.
Applications
General
-
-
a : The option to disable ads is included in the settings.[8]
Operating system support
BitTorrent client
|
Windows
|
Mac OS X
|
Linux
|
BSD
|
iOS
|
Android
|
Other
|
ABC
|
Yes
|
No
|
Yes
|
No
|
No
|
No
|
No
|
Acquisition
|
No
|
Yes
|
No
|
No
|
No
|
No
|
No
|
BitComet
|
Yes
|
No
|
No
|
No
|
No
|
No
|
No
|
BitLet
|
web
|
web
|
web
|
No
|
No
|
No
|
No
|
BitLord
|
Yes
|
Yes
|
No
|
No
|
No
|
No
|
No
|
BitSpirit
|
Yes
|
No
|
No
|
No
|
No
|
No
|
No
|
BitTornado
|
Yes
|
Yes
|
Yes
|
Yes
|
No
|
No
|
No
|
BitTorrent
|
Yes
|
Yes
|
No
|
No
|
No
|
Yes
|
No
|
BitTyrant
|
Yes
|
Yes
|
Yes
|
Yes
|
No
|
No
|
No
|
Blog Torrent
|
Yes
|
Yes
|
No
|
No
|
No
|
No
|
No
|
Deluge
|
Yes
|
Yes
|
Yes
|
Yes
|
No
|
No
|
Solaris
|
FlashGet
|
Yes
|
No
|
No
|
No
|
No
|
No
|
No
|
Folx
|
No
|
Yes
|
No
|
No
|
No
|
No
|
No
|
Free Download Manager
|
Yes
|
No
|
No
|
No
|
No
|
No
|
No
|
Frostwire
|
Yes[9]
|
Yes[9]
|
Yes[9]
|
Yes[9]
|
No[9]
|
Yes[9]
|
Unix-like,[9] z/OS,[10] Solaris, OS/2, eComStation[11]
|
KGet
|
No
|
No
|
Yes
|
Yes
|
No
|
No
|
No
|
KTorrent
|
No
|
Yes
|
Yes
|
Yes
|
No
|
No
|
No
|
LimeWire
|
Yes
|
Yes
|
Yes
|
Yes
|
No
|
No
|
Yes
|
Meerkat Bittorrent Client
|
Yes
|
No
|
No
|
No
|
No
|
No
|
No
|
Miro
|
Yes
|
Yes
|
Yes
|
Yes
|
No
|
No
|
No
|
MLDonkey
|
Yes
|
Yes
|
Yes
|
Yes
|
No
|
No
|
Solaris, MorphOS
|
µTorrent
|
Yes
|
Yes
|
web
|
No
|
No
|
Yes
|
No
|
OneSwarm
|
Yes
|
Yes
|
Yes
|
No
|
No
|
No
|
No
|
Opera 12
|
Yes[Note 1]
|
Yes
|
Yes[Note 1]
|
Yes[Note 1]
|
No
|
Yes
|
Solaris
|
qBittorrent
|
Yes
|
Yes
|
Yes
|
Yes
|
Yesrequire('Module:No globals')
local p = {}
-- articles in which traditional Chinese preceeds simplified Chinese local t1st = { ["228 Incident"] = true, ["Chinese calendar"] = true, ["Lippo Centre, Hong Kong"] = true, ["Republic of China"] = true, ["Republic of China at the 1924 Summer Olympics"] = true, ["Taiwan"] = true, ["Taiwan (island)"] = true, ["Taiwan Province"] = true, ["Wei Boyang"] = true, }
-- the labels for each part local labels = { ["c"] = "Chinese", ["s"] = "simplified Chinese", ["t"] = "traditional Chinese", ["p"] = "pinyin", ["tp"] = "Tongyong Pinyin", ["w"] = "Wade–Giles", ["j"] = "Jyutping", ["cy"] = "Cantonese Yale", ["poj"] = "Pe̍h-ōe-jī", ["zhu"] = "Zhuyin Fuhao", ["l"] = "literally", }
-- article titles for wikilinks for each part local wlinks = { ["c"] = "Chinese language", ["s"] = "simplified Chinese characters", ["t"] = "traditional Chinese characters", ["p"] = "pinyin", ["tp"] = "Tongyong Pinyin", ["w"] = "Wade–Giles", ["j"] = "Jyutping", ["cy"] = "Yale romanization of Cantonese", ["poj"] = "Pe̍h-ōe-jī", ["zhu"] = "Bopomofo", }
-- for those parts which are to be treated as languages their ISO code local ISOlang = { ["c"] = "zh", ["t"] = "zh-Hant", ["s"] = "zh-Hans", ["p"] = "zh-Latn-pinyin", ["tp"] = "zh-Latn", ["w"] = "zh-Latn-wadegile", ["j"] = "yue-jyutping", ["cy"] = "yue", ["poj"] = "hak", ["zhu"] = "zh-Bopo", }
local italic = { ["p"] = true, ["tp"] = true, ["w"] = true, ["j"] = true, ["cy"] = true, ["poj"] = true, } -- Categories for different kinds of Chinese text local cats = { ["c"] = "", ["s"] = "", ["t"] = "", }
function p.Zh(frame) -- load arguments module to simplify handling of args local getArgs = require('Module:Arguments').getArgs local args = getArgs(frame) return p._Zh(args) end function p._Zh(args) local uselinks = not (args["links"] == "no") -- whether to add links local uselabels = not (args["labels"] == "no") -- whether to have labels local capfirst = args["scase"] ~= nil
local t1 = false -- whether traditional Chinese characters go first
local j1 = false -- whether Cantonese Romanisations go first
local testChar
if (args["first"]) then
for testChar in mw.ustring.gmatch(args["first"], "%a+") do
if (testChar == "t") then
t1 = true
end
if (testChar == "j") then
j1 = true
end
end
end
if (t1 == false) then
local title = mw.title.getCurrentTitle()
t1 = t1st[title.text] == true
end
-- based on setting/preference specify order local orderlist = {"c", "s", "t", "p", "tp", "w", "j", "cy", "poj", "zhu", "l"} if (t1) then orderlist[2] = "t" orderlist[3] = "s" end if (j1) then orderlist[4] = "j" orderlist[5] = "cy" orderlist[6] = "p" orderlist[7] = "tp" orderlist[8] = "w" end -- rename rules. Rules to change parameters and labels based on other parameters if args["hp"] then -- hp an alias for p ([hanyu] pinyin) args["p"] = args["hp"] end if args["tp"] then -- if also Tongyu pinyin use full name for Hanyu pinyin labels["p"] = "Hanyu Pinyin" end if (args["s"] and args["s"] == args["t"]) then -- Treat simplified + traditional as Chinese if they're the same args["c"] = args["s"] args["s"] = nil args["t"] = nil elseif (not (args["s"] and args["t"])) then -- use short label if only one of simplified and traditional labels["s"] = labels["c"] labels["t"] = labels["c"] end local body = "" -- the output string local params -- for creating HTML spans local label -- the label, i.e. the bit preceeding the supplied text local val -- the supplied text -- go through all possible fields in loop, adding them to the output for i, part in ipairs(orderlist) do if (args[part]) then -- build label label = "" if (uselabels) then label = labels[part] if (capfirst) then label = mw.language.getContentLanguage():ucfirst(
|
Yes
|
eComStation
|
rTorrent
|
Yes, through Cygwin[12]
|
Yes
|
Yes
|
Yes
|
No
|
No
|
Solaris
|
Shareaza
|
Yes
|
No
|
No
|
No
|
No
|
No
|
No
|
SymTorrent
|
No
|
No
|
No
|
No
|
No
|
No
|
Symbian
|
Tixati
|
Yes
|
No
|
Yes
|
No
|
No
|
No
|
No
|
Tomato Torrent
|
No
|
Yes
|
No
|
No
|
No
|
No
|
No
|
Tonido
|
Yes
|
Yes
|
Yes
|
Yes
|
No
|
No
|
No
|
TorrentFlux
|
Yes
|
Yes
|
Yes
|
Yes
|
No
|
No
|
No
|
Transmission
|
Yes as an unofficial build[Note 1]
|
Yes
|
Yes
|
Yes
|
Yes, through Cydia
|
No
|
Solaris, OpenWrt
|
Tribler
|
Yes
|
Yes
|
Yes
|
Yes
|
No
|
No
|
No
|
Vuze
|
Yes
|
Yes
|
Yes
|
Yes
|
No
|
Yes
|
No
|
Wyzo
|
Yes
|
Yes
|
No
|
No
|
No
|
No
|
No
|
Name
|
Windows
|
Mac OS X
|
Linux
|
BSD
|
iOS
|
Android
|
Other
|
Interface and programming
BitTorrent client
|
GUI
|
Remote
|
CLI
|
Other
|
Programming language
|
Based on
|
IPv6
|
µTP
|
ABC
|
Yes
|
Yes
|
No
|
No
|
Python
|
BitTornado
|
buggy[Note 2]
|
No
|
Acquisition
|
Yes
|
No
|
No
|
No
|
Objective-C, Cocoa
|
Limewire
|
No
|
No
|
BitComet
|
Yes
|
Yes
|
Partial[13]
|
No
|
C++
|
-
|
No
|
No
|
BitLet
|
No
|
No
|
No
|
Webapp
|
Java Applet
|
-
|
No
|
No
|
BitLord
|
Yes
|
No
|
No
|
No
|
Python, C++
|
libtorrent (Rasterbar)
|
Yes
|
No
|
BitTornado
|
Yes
|
No
|
Partial
|
No
|
Python
|
BitTorrent
|
Yes
|
No
|
BitTorrent 5, Mainline
|
Yes
|
No
|
Partial
|
No
|
Python
|
-
|
No
|
No
|
BitTorrent 6
|
Yes
|
Yes
|
Partial
|
No
|
C++
|
µTorrent
|
Yes
|
Yes
|
BitTyrant
|
Yes
|
Yes
|
Partial
|
Telnet, XML over HTTP remote control API
|
Java, SWT
|
Azureus
|
Yes
|
No
|
Blog Torrent
|
Yes
|
No
|
No
|
No
|
?
|
?
|
No
|
No
|
Deluge
|
Yes
|
Yes
|
Yes
|
Daemon
|
Python, C++
|
libtorrent (Rasterbar)
|
Yes
|
No
|
FlashGet
|
Yes
|
No
|
No
|
No
|
?
|
?
|
No
|
No
|
Free Download Manager
|
Yes
|
Yes
|
Partial
|
No
|
C++
|
libtorrent (Rasterbar)
|
No
|
No
|
Frostwire
|
Yes
|
No
|
No
|
No
|
Java
|
LimeWire
|
No
|
Yes[14]
|
KGet
|
Yes
|
Yes
|
Partial[Note 3]
|
No
|
C++
|
-
|
Yes
|
No
|
KTorrent
|
Yes
|
Yes
|
Partial
|
No
|
C++
|
-
|
Yes
|
Yes[15]
|
LimeWire
|
Yes
|
No
|
No
|
No
|
Java
|
libtorrent (Rasterbar)
|
No
|
No
|
Meerkat Bittorrent Client
|
Yes
|
No
|
No
|
No
|
C++
|
-
|
No
|
No
|
Miro
|
Yes
|
No
|
No
|
No
|
C++
|
libtorrent (Rasterbar)
|
No
|
No
|
MLDonkey
|
Network GUI
|
Yes
|
Partial
|
Telnet
|
OCaml
|
-
|
No
|
No
|
µTorrent
|
Yes
|
Yes
|
No[16]
|
RESTful Web API[17]
|
C++[18]
|
-
|
Yes[19]
|
Yes[20]
|
OneSwarm
|
Partial
|
Yes
|
No-partial
|
No
|
Java
|
Azureus
|
Yes
|
No
|
Opera 12
|
Yes
|
No
|
No
|
No
|
C++
|
-
|
Yes
|
No
|
qBittorrent
|
Qt (toolkit)
|
Yes
|
Partial
|
No
|
C++, Python
|
libtorrent (Rasterbar)
|
Yes
|
Yes[21]
|
rTorrent
|
No
|
Third Party
|
Yes
|
SCGI
|
C++
|
libTorrent (Rakshasa)
|
No[22]
|
No
|
Shareaza
|
Yes
|
Yes
|
Partial
|
No
|
C++
|
-
|
No
|
No
|
SymTorrent
|
Yes
|
No
|
No
|
No
|
?
|
?
|
No
|
No
|
Tixati
|
Yes
|
Yes
|
No
|
No
|
C++
|
-
|
Yes
|
Yes[23]
|
Tomato Torrent
|
Yes
|
No
|
No
|
No
|
Cocoa
|
BitTorrent
|
No
|
No
|
Tonido
|
No
|
Yes
|
No
|
No
|
C++
|
libtorrent (Rasterbar)
|
No
|
No
|
TorrentFlux
|
No
|
Yes
|
No
|
No
|
PHP
|
BitTornado
|
No
|
No
|
Transmission
|
Yes
|
Yes
|
Yes
|
Daemon, JSON-RPC over HTTP remote control API
|
C
|
-
|
Yes
|
Yes[24]
|
Tribler
|
Yes
|
Partial
|
Partial
|
No
|
Python,C++
|
libtorrent (Rasterbar)
|
No
|
Yes
|
Vuze (formerly Azureus)
|
Yes
|
Yes
|
Partial
|
Telnet, XML over HTTP remote control API
|
Java, SWT
|
-
|
Yes
|
Yes[25]
|
BitTorrent client
|
GUI
|
Web
|
CLI
|
Other
|
Programming language
|
Based on
|
IPv6
|
µTP
|
Features I
BitTorrent client
|
Magnet URI
|
Preload Magnet metadata [Note 4]
|
Super-seeding
|
Embedded tracker
|
UPnP [Note 5]
|
NAT Port Mapping Protocol
|
NAT traversal [Note 6]
|
DHT [Note 7]
|
Peer exchange
|
Encryption
|
UDP tracker
|
LPD
|
Proxy server
|
ABC
|
No
|
No
|
No
|
Yes
|
Yes
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
Acquisition
|
No
|
No
|
No
|
No
|
No
|
Yes
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
BitComet
|
Yes
|
No
|
Yes
|
Separate download
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
No
|
HTTP 1.1, SOCKS4-4a-5
|
BitLet
|
No
|
No
|
No
|
No
|
Yes
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
BitLord
|
Yes
|
No
|
No
|
No
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
HTTP 1.1, SOCKS4-4a-5
|
BitTornado
|
No
|
No
|
Yes
|
Yes[Note 8]
|
Yes
|
No
|
No
|
No
|
No
|
Yes
|
No
|
No
|
No
|
BitTorrent 5, Mainline
|
No
|
No
|
No
|
Yes[Note 8]
|
Yes
|
Yes
|
No
|
Yes
|
Yes
|
Yes
|
No
|
No
|
Yes
|
BitTorrent 6
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes[Note 9]
|
Yes
|
Yes
|
Yes
|
HTTP(S), SOCKS4-5
|
BitTyrant
|
No
|
No
|
Yesrequire('Module:No globals')
local p = {}
-- articles in which traditional Chinese preceeds simplified Chinese local t1st = { ["228 Incident"] = true, ["Chinese calendar"] = true, ["Lippo Centre, Hong Kong"] = true, ["Republic of China"] = true, ["Republic of China at the 1924 Summer Olympics"] = true, ["Taiwan"] = true, ["Taiwan (island)"] = true, ["Taiwan Province"] = true, ["Wei Boyang"] = true, }
-- the labels for each part local labels = { ["c"] = "Chinese", ["s"] = "simplified Chinese", ["t"] = "traditional Chinese", ["p"] = "pinyin", ["tp"] = "Tongyong Pinyin", ["w"] = "Wade–Giles", ["j"] = "Jyutping", ["cy"] = "Cantonese Yale", ["poj"] = "Pe̍h-ōe-jī", ["zhu"] = "Zhuyin Fuhao", ["l"] = "literally", }
-- article titles for wikilinks for each part local wlinks = { ["c"] = "Chinese language", ["s"] = "simplified Chinese characters", ["t"] = "traditional Chinese characters", ["p"] = "pinyin", ["tp"] = "Tongyong Pinyin", ["w"] = "Wade–Giles", ["j"] = "Jyutping", ["cy"] = "Yale romanization of Cantonese", ["poj"] = "Pe̍h-ōe-jī", ["zhu"] = "Bopomofo", }
-- for those parts which are to be treated as languages their ISO code local ISOlang = { ["c"] = "zh", ["t"] = "zh-Hant", ["s"] = "zh-Hans", ["p"] = "zh-Latn-pinyin", ["tp"] = "zh-Latn", ["w"] = "zh-Latn-wadegile", ["j"] = "yue-jyutping", ["cy"] = "yue", ["poj"] = "hak", ["zhu"] = "zh-Bopo", }
local italic = { ["p"] = true, ["tp"] = true, ["w"] = true, ["j"] = true, ["cy"] = true, ["poj"] = true, } -- Categories for different kinds of Chinese text local cats = { ["c"] = "", ["s"] = "", ["t"] = "", }
function p.Zh(frame) -- load arguments module to simplify handling of args local getArgs = require('Module:Arguments').getArgs local args = getArgs(frame) return p._Zh(args) end function p._Zh(args) local uselinks = not (args["links"] == "no") -- whether to add links local uselabels = not (args["labels"] == "no") -- whether to have labels local capfirst = args["scase"] ~= nil
local t1 = false -- whether traditional Chinese characters go first
local j1 = false -- whether Cantonese Romanisations go first
local testChar
if (args["first"]) then
for testChar in mw.ustring.gmatch(args["first"], "%a+") do
if (testChar == "t") then
t1 = true
end
if (testChar == "j") then
j1 = true
end
end
end
if (t1 == false) then
local title = mw.title.getCurrentTitle()
t1 = t1st[title.text] == true
end
-- based on setting/preference specify order local orderlist = {"c", "s", "t", "p", "tp", "w", "j", "cy", "poj", "zhu", "l"} if (t1) then orderlist[2] = "t" orderlist[3] = "s" end if (j1) then orderlist[4] = "j" orderlist[5] = "cy" orderlist[6] = "p" orderlist[7] = "tp" orderlist[8] = "w" end -- rename rules. Rules to change parameters and labels based on other parameters if args["hp"] then -- hp an alias for p ([hanyu] pinyin) args["p"] = args["hp"] end if args["tp"] then -- if also Tongyu pinyin use full name for Hanyu pinyin labels["p"] = "Hanyu Pinyin" end if (args["s"] and args["s"] == args["t"]) then -- Treat simplified + traditional as Chinese if they're the same args["c"] = args["s"] args["s"] = nil args["t"] = nil elseif (not (args["s"] and args["t"])) then -- use short label if only one of simplified and traditional labels["s"] = labels["c"] labels["t"] = labels["c"] end local body = "" -- the output string local params -- for creating HTML spans local label -- the label, i.e. the bit preceeding the supplied text local val -- the supplied text -- go through all possible fields in loop, adding them to the output for i, part in ipairs(orderlist) do if (args[part]) then -- build label label = "" if (uselabels) then label = labels[part] if (capfirst) then label = mw.language.getContentLanguage():ucfirst(
|
Yes
|
Yes
|
Yes
|
Yes[Note 10]
|
Yes[Note 11]
|
Yes
|
Yes
|
No
|
No
|
No
|
Blog Torrent
|
No
|
No
|
No
|
Yes
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
Deluge
|
Yes
|
No
|
No
|
No
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
HTTP(S), SOCKS4-5
|
FlashGet
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
Yes
|
No
|
Yes
|
No
|
No
|
No
|
Free Download Manager
|
Yes
|
No
|
No
|
No
|
No
|
No
|
No
|
Yes
|
Yes
|
No
|
No
|
No
|
No
|
KTorrent
|
Yes
|
Yes
|
Yes
|
No
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Partial
|
HTTP, SOCKS4-5
|
LimeWire
|
Partial
|
No
|
Yes
|
Yes
|
Yes
|
Yes
|
No
|
Yes
|
Yes
|
Yes
|
Yes
|
No
|
No
|
Meerkat Bittorrent Client
|
No
|
No
|
Yes
|
No
|
Yes
|
Yes
|
Yes
|
Yes
|
No
|
Yes
|
No
|
No
|
No
|
MLDonkey
|
Yes[26]
|
No
|
No
|
Yes
|
Yes
|
Yes
|
No
|
Yes
|
No
|
No
|
Yes
|
No
|
No
|
µTorrent
|
Yes
|
Yes
|
Yes[27]
|
Yes[28]
|
Yes[29]
|
Yes
|
Yes[30]
|
Yes[Note 12]
|
Yes[Note 9]
|
Yes[31]
|
Yes
|
Yes[32]
|
HTTP(S), SOCKS4-5
|
OneSwarm
|
No
|
No
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
No
|
No
|
Opera 12
|
No
|
No
|
No
|
Yes[33]
|
No
|
No
|
No
|
No
|
Yes[34]
|
No
|
No
|
No
|
No
|
qBittorrent
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
HTTP(S), SOCKS4-5
|
rTorrent
|
Yes[35]
|
No
|
Yes
|
No
|
No
|
No
|
No
|
Yes
|
Yes
|
Yes
|
Yes
|
No[36]
|
No
|
Shareaza
|
Yes
|
No
|
No
|
No
|
Yes
|
Yes
|
No
|
Yes[Note 13]
|
Yes
|
No
|
Yes[Note 14]
|
No
|
No
|
SymTorrent
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
Tixati
|
Yes
|
Yes
|
Yes
|
No
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Tomato Torrent
|
No
|
No
|
No
|
Yes
|
No
|
No
|
No
|
Yes
|
No
|
No
|
No
|
No
|
No
|
Tonido
|
No
|
No
|
No
|
No
|
Yes
|
Yes
|
Yes
|
Yes
|
No
|
No
|
No
|
No
|
No
|
TorrentFlux
|
No
|
No
|
Yes
|
No
|
Yes
|
No
|
No
|
No
|
No
|
Yes
|
No
|
No
|
No
|
Transmission
|
Yes
|
No
|
No
|
No
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes[Note 15]
|
Yes
|
Yes
|
Yes
|
No[37]
|
Tribler
|
Yes
|
No
|
No
|
Yes
|
Yes
|
Yes
|
No
|
Yes
|
Yes
|
Yes
|
No
|
No
|
Uses P2P onion routing to provide anonymity.
|
Vuze (formerly Azureus)
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes[Note 16]
|
Yes[Note 11]
|
Yes
|
Yes
|
Yes
|
Plugin
|
HTTP(S)?, SOCKS4-4a-5
|
BitTorrent client
|
Magnet URI
|
Preload Magnet metadata
|
Super-seeding
|
Embedded tracker
|
UPnP
|
NAT Port Mapping Protocol
|
NAT traversal
|
DHT
|
Peer exchange
|
Encryption
|
UDP tracker
|
LPD
|
Proxy server
|
Features II
BitTorrent client
|
Cache [Note 17]
|
Web seeding [Note 18]
|
Broad-catching (RSS)
|
Prioritization
|
Selective downloads
|
Sequential downloading
|
SOCKS
|
Tracker exchange [38]
|
Remote control via web
|
Search engine
|
Auto updates
|
Reviews and Comments
|
Notes
|
ABC
|
No
|
Yes
|
No
|
Yes
|
No
|
No
|
No
|
No
|
Yes
|
Separate download
|
No
|
No
|
|
Acquisition
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
3 torrents max, infinity when registered
|
BitComet
|
Yes
|
Yes[39]
|
|
Yes
|
Yes
|
Yes[Note 19]
|
Yes
|
No
|
Yes
|
Built-in Web browser
|
Yes
|
No
|
Portable version available
|
BitLet
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
Yes
|
No
|
|
BitLord
|
Yes
|
No
|
Yes
|
Yes
|
Yes
|
No
|
Yes
|
No
|
No
|
Built-in Web browser
|
Yes
|
No
|
|
BitTornado
|
Yes
|
Yes
|
No
|
Yes
|
Yes
|
No
|
No
|
No
|
No
|
No
|
via PMS
|
No
|
|
BitTorrent 5, Mainline
|
No
|
Yes
|
No
|
Yes
|
Yes
|
No
|
No
|
No
|
No
|
Yes
|
Yes
|
No
|
|
BitTorrent 6
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
No
|
Yes
|
Yes
|
Yes
|
Yes
|
|
BitTyrant
|
Yes
|
Yes[40]
|
Plugin
|
Yes
|
Yes
|
No
|
Yes
|
No
|
Plugin[Note 20]
|
3rd party plugins
|
Yes
|
No
|
Upload priority optimized according to a series of research papers
|
Blog Torrent
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
|
Deluge
|
Yes
|
No
|
Plugin
|
Yes
|
Yes
|
No
|
Yes
|
No
|
Yes
|
No
|
via PMS
|
No
|
|
FlashGet
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
FlashGet (standalone application) is not FlashGot (Firefox Addon)
|
Free Download Manager
|
No
|
No
|
No
|
Yes
|
Yes
|
No
|
No
|
No
|
Yes
|
No
|
|
No
|
|
KTorrent
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
No
|
Yes
|
Built-in Web browser
|
via PMS
|
No
|
|
LimeWire
|
Yes
|
Yes
|
No
|
Yes
|
Yes
|
No
|
Yes
|
No
|
No
|
No
|
Yes
|
No
|
|
Meerkat Bittorrent Client
|
Yes
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
|
MLDonkey
|
Yes
|
No
|
3rd party bash script
|
Yes
|
No
|
No
|
No[41]
|
No
|
Yes
|
Built-in Web browser
|
via PMS
|
No
|
|
µTorrent
|
Yes
|
Yes[42]
|
Yes[43]
|
Yes[44]
|
Yes
|
Yes[Note 21]
|
Yes
|
No
|
Yes
|
Yes
|
Yes
|
Yes
|
|
OneSwarm
|
Yes
|
Yes
|
No
|
Yes
|
Yes
|
No
|
Yes
|
No
|
No
|
No
|
Yes
|
No
|
has all BitTyrant features
|
Opera 12
|
No
|
No
|
Yes
|
No
|
No
|
No
|
No
|
No
|
No
|
built-into Web browser
|
Windows and Mac OS X only; via PMS on Linux
|
No
|
Web browser
|
qBittorrent
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
via PMS
|
No
|
|
rTorrent
|
Partial
|
No
|
3rd party utility
|
Yes
|
Yes
|
No
|
No
|
No
|
Yes
|
No
|
via PMS
|
No
|
No built-in disk cache but a delayed sync
|
Shareaza
|
Yes
|
Yes
|
No
|
Yes
|
Yes[Note 23]
|
in mod client
|
No
|
Yes
[Note 24][46][Note 25]
|
Yes
|
Yes
|
Yes
|
No
|
[Note 26]
|
SymTorrent
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
BitTorrent client for cell phones
|
Tixati
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
No
|
Yes
|
No
|
lightweight client, Portable version available
|
Tomato Torrent
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
No
|
supports AppleScript
|
Tonido
|
No
|
No
|
No
|
Yes
|
Yes
|
No
|
No
|
No
|
Yes
|
No
|
Yes
|
No
|
|
TorrentFlux
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
No
|
No
|
No
|
Yes
|
Yes
|
No
|
No
|
|
Transmission
|
Yes
|
Yes
|
No
|
Yes
|
Yes
|
No
|
No
|
No
|
Yes
|
No
|
Yes
|
No
|
|
Tribler
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
No
|
No
|
No
|
Partial
|
Yes
|
Yes
|
No
|
Fully distributed keyword search; integrated anti-spam measures[47]
|
Vuze (formerly Azureus)
|
Yes
|
Yes[40]
|
Yes
|
Yes
|
Yes
|
in paid version [48]
|
Yes
|
No
|
Plugin[Note 20]
|
Yes
|
Yes
|
Yes[49]
|
|
Xunlei
|
|
|
|
|
|
In v0.1.0.0
|
|
|
|
|
|
No
|
|
BitTorrent client
|
Cache
|
Web seeding
|
Broad-catching (RSS)
|
Prioritization
|
Selective downloads
|
Sequential downloading
|
SOCKS
|
Tracker exchange
|
Remote control via web
|
Search engine
|
Auto updates
|
Reviews and Comments
|
Notes
|
-- Module:Hatnote -- -- -- -- This module produces hatnote links and links to related articles. It -- -- implements the and meta-templates and includes -- -- helper functions for other Lua hatnote modules. --
local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local mArguments -- lazily initialise Module:Arguments local yesno -- lazily initialise Module:Yesno
local p = {}
-- Helper functions
local function getArgs(frame) -- Fetches the arguments from the parent frame. Whitespace is trimmed and -- blanks are removed. mArguments = require('Module:Arguments') return mArguments.getArgs(frame, {parentOnly = true}) end
local function removeInitialColon(s) -- Removes the initial colon from a string, if present. return s:match('^:?(.*)') end
function p.findNamespaceId(link, removeColon) -- Finds the namespace id (namespace number) of a link or a pagename. This -- function will not work if the link is enclosed in double brackets. Colons -- are trimmed from the start of the link by default. To skip colon -- trimming, set the removeColon parameter to true. checkType('findNamespaceId', 1, link, 'string') checkType('findNamespaceId', 2, removeColon, 'boolean', true) if removeColon ~= false then link = removeInitialColon(link) end local namespace = link:match('^(.-):') if namespace then local nsTable = mw.site.namespaces[namespace] if nsTable then return nsTable.id end end return 0 end
function p.formatPages(...) -- Formats a list of pages using formatLink and returns it as an array. Nil -- values are not allowed. local pages = {...} local ret = {} for i, page in ipairs(pages) do ret[i] = p._formatLink(page) end return ret end
function p.formatPageTables(...) -- Takes a list of page/display tables and returns it as a list of -- formatted links. Nil values are not allowed. local pages = {...} local links = {} for i, t in ipairs(pages) do checkType('formatPageTables', i, t, 'table') local link = t[1] local display = t[2] links[i] = p._formatLink(link, display) end return links end
function p.makeWikitextError(msg, helpLink, addTrackingCategory) -- Formats an error message to be returned to wikitext. If -- addTrackingCategory is not false after being returned from -- Module:Yesno, and if we are not on a talk page, a tracking category -- is added. checkType('makeWikitextError', 1, msg, 'string') checkType('makeWikitextError', 2, helpLink, 'string', true) yesno = require('Module:Yesno') local title = mw.title.getCurrentTitle() -- Make the help link text. local helpText if helpLink then helpText = ' (help)' else helpText = end -- Make the category text. local category if not title.isTalkPage and yesno(addTrackingCategory) ~= false then category = 'Hatnote templates with errors' category = string.format( '%s:%s', mw.site.namespaces[14].name, category ) else category = end return string.format( '%s', msg, helpText, category ) end
-- Format link -- -- Makes a wikilink from the given link and display values. Links are escaped -- with colons if necessary, and links to sections are detected and displayed -- with " § " as a separator rather than the standard MediaWiki "#". Used in -- the template.
function p.formatLink(frame) local args = getArgs(frame) local link = args[1] local display = args[2] if not link then return p.makeWikitextError( 'no link specified', 'Template:Format hatnote link#Errors', args.category ) end return p._formatLink(link, display) end
function p._formatLink(link, display) -- Find whether we need to use the colon trick or not. We need to use the -- colon trick for categories and files, as otherwise category links -- categorise the page and file links display the file. checkType('_formatLink', 1, link, 'string') checkType('_formatLink', 2, display, 'string', true) link = removeInitialColon(link) local namespace = p.findNamespaceId(link, false) local colon if namespace == 6 or namespace == 14 then colon = ':' else colon = end -- Find whether a faux display value has been added with the | magic -- word. if not display then local prePipe, postPipe = link:match('^(.-)|(.*)$') link = prePipe or link display = postPipe end -- Find the display value. if not display then local page, section = link:match('^(.-)#(.*)$') if page then display = page .. ' § ' .. section end end -- Assemble the link. if display then return string.format('%s', colon, link, display) else return string.format('%s%s', colon, link) end end
-- Hatnote -- -- Produces standard hatnote text. Implements the template.
function p.hatnote(frame) local args = getArgs(frame) local s = args[1] local options = {} if not s then return p.makeWikitextError( 'no text specified', 'Template:Hatnote#Errors', args.category ) end options.extraclasses = args.extraclasses options.selfref = args.selfref return p._hatnote(s, options) end
function p._hatnote(s, options) checkType('_hatnote', 1, s, 'string') checkType('_hatnote', 2, options, 'table', true) local classes = {'hatnote'} local extraclasses = options.extraclasses local selfref = options.selfref if type(extraclasses) == 'string' then classes[#classes + 1] = extraclasses end if selfref then classes[#classes + 1] = 'selfref' end return string.format( '
%s
', table.concat(classes, ' '), s )
end
return p-------------------------------------------------------------------------------- -- Module:Hatnote -- -- -- -- This module produces hatnote links and links to related articles. It -- -- implements the and meta-templates and includes -- -- helper functions for other Lua hatnote modules. --
local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local mArguments -- lazily initialise Module:Arguments local yesno -- lazily initialise Module:Yesno
local p = {}
-- Helper functions
local function getArgs(frame) -- Fetches the arguments from the parent frame. Whitespace is trimmed and -- blanks are removed. mArguments = require('Module:Arguments') return mArguments.getArgs(frame, {parentOnly = true}) end
local function removeInitialColon(s) -- Removes the initial colon from a string, if present. return s:match('^:?(.*)') end
function p.findNamespaceId(link, removeColon) -- Finds the namespace id (namespace number) of a link or a pagename. This -- function will not work if the link is enclosed in double brackets. Colons -- are trimmed from the start of the link by default. To skip colon -- trimming, set the removeColon parameter to true. checkType('findNamespaceId', 1, link, 'string') checkType('findNamespaceId', 2, removeColon, 'boolean', true) if removeColon ~= false then link = removeInitialColon(link) end local namespace = link:match('^(.-):') if namespace then local nsTable = mw.site.namespaces[namespace] if nsTable then return nsTable.id end end return 0 end
function p.formatPages(...) -- Formats a list of pages using formatLink and returns it as an array. Nil -- values are not allowed. local pages = {...} local ret = {} for i, page in ipairs(pages) do ret[i] = p._formatLink(page) end return ret end
function p.formatPageTables(...) -- Takes a list of page/display tables and returns it as a list of -- formatted links. Nil values are not allowed. local pages = {...} local links = {} for i, t in ipairs(pages) do checkType('formatPageTables', i, t, 'table') local link = t[1] local display = t[2] links[i] = p._formatLink(link, display) end return links end
function p.makeWikitextError(msg, helpLink, addTrackingCategory) -- Formats an error message to be returned to wikitext. If -- addTrackingCategory is not false after being returned from -- Module:Yesno, and if we are not on a talk page, a tracking category -- is added. checkType('makeWikitextError', 1, msg, 'string') checkType('makeWikitextError', 2, helpLink, 'string', true) yesno = require('Module:Yesno') local title = mw.title.getCurrentTitle() -- Make the help link text. local helpText if helpLink then helpText = ' (help)' else helpText = end -- Make the category text. local category if not title.isTalkPage and yesno(addTrackingCategory) ~= false then category = 'Hatnote templates with errors' category = string.format( '%s:%s', mw.site.namespaces[14].name, category ) else category = end return string.format( '%s', msg, helpText, category ) end
-- Format link -- -- Makes a wikilink from the given link and display values. Links are escaped -- with colons if necessary, and links to sections are detected and displayed -- with " § " as a separator rather than the standard MediaWiki "#". Used in -- the template.
function p.formatLink(frame) local args = getArgs(frame) local link = args[1] local display = args[2] if not link then return p.makeWikitextError( 'no link specified', 'Template:Format hatnote link#Errors', args.category ) end return p._formatLink(link, display) end
function p._formatLink(link, display) -- Find whether we need to use the colon trick or not. We need to use the -- colon trick for categories and files, as otherwise category links -- categorise the page and file links display the file. checkType('_formatLink', 1, link, 'string') checkType('_formatLink', 2, display, 'string', true) link = removeInitialColon(link) local namespace = p.findNamespaceId(link, false) local colon if namespace == 6 or namespace == 14 then colon = ':' else colon = end -- Find whether a faux display value has been added with the | magic -- word. if not display then local prePipe, postPipe = link:match('^(.-)|(.*)$') link = prePipe or link display = postPipe end -- Find the display value. if not display then local page, section = link:match('^(.-)#(.*)$') if page then display = page .. ' § ' .. section end end -- Assemble the link. if display then return string.format('%s', colon, link, display) else return string.format('%s%s', colon, link) end end
-- Hatnote -- -- Produces standard hatnote text. Implements the template.
function p.hatnote(frame) local args = getArgs(frame) local s = args[1] local options = {} if not s then return p.makeWikitextError( 'no text specified', 'Template:Hatnote#Errors', args.category ) end options.extraclasses = args.extraclasses options.selfref = args.selfref return p._hatnote(s, options) end
function p._hatnote(s, options) checkType('_hatnote', 1, s, 'string') checkType('_hatnote', 2, options, 'table', true) local classes = {'hatnote'} local extraclasses = options.extraclasses local selfref = options.selfref if type(extraclasses) == 'string' then classes[#classes + 1] = extraclasses end if selfref then classes[#classes + 1] = 'selfref' end return string.format( '
%s
', table.concat(classes, ' '), s )
end
return p
-
^ a b c d x86-32 and x86-64builds available.
-
^ Announcements to the tracker are made via IPv6 if possible, but the client doesn't listen on the respective port.
-
^ Qdbus interface
-
^ For a torrent added from a Magnet link, obtain the list of files (and other metadata) before prompting the user for a download location.
-
^ Automatically configure port forwarding (requires Router with UPnP support)
-
^ Many clients claim to support this, but just UPnP calls for opening a TCP port is not effective and disabled by factory default in most new hardware. "UDP NAT Traversal" is the proper working solution, supported by just a few.
-
^ DHT permits use of trackerless torrents (with supporting clients) to resume normal torrents when their tracker is down. However, some trackers that register their users for keeping tabs on fair usage (such as a ratio of bytes downloaded to uploaded) may not reliably measure and update usage for users employing DHT.
-
^ a b Tracker included with Linux binaries and with source, but not with Windows binary.
-
^ a b Exchanging with BT 6 and µTorrent clients (and now MooPolice).
-
^ It's UDP based, an experimental feature and only supported by other Azureus based clients.
-
^ a b Has its own DHT, a mainline-DHT compatible implementation is available as plugin.
-
^ µTorrent's DHT implementation is the same as Mainline and BitComet's, but unfortunately this is incompatible with Azureus's implementation.
-
^ Since Shareaza v2.6.0.0, Shareaza includes Mainline DHT support. Also, Shareaza can use the Gnutella2 network to find other Gnutella2 clients sharing the same torrent. This also includes clients who do not actively seed the torrent in question anymore, as long as file hashes (such as sha1 for example) are known.
-
^ Since Shareaza v2.5.5.1 r9064.
-
^ Exchanges with µTorrent and Azureus peers.
-
^ Since version 2.5.0.2. It's UDP based, an experimental feature and only supported by other Azureus clients.
-
^ Reduces disk usage, file fragmentation (in case it is not preallocated) and latencies via larger written blocks and cached data for hash checking finished pieces.
-
^ Recently implemented (unofficial) web seeding feature, see HTTP-Based Seeding Specification
-
^ Called "preview mode"
-
^ a b Provides a Java-based and a simple HTML/JS based WebUI.
-
^ From version 3.0 this feature is called "Streaming mode". The number of pieces to download sequentially is configurable
-
^ Since Shareaza v2.4.0.2 r7924.
-
^ Since Shareaza v2.5.3.1.
-
^ Shareaza also uses G2 to transmit download metadata, such as BitTorrent trackers to other G2 clients.
-
^ Maximum active torrent number depends on respective user settings and is limited to 31.
Vulnerabilities
This comparison of unpatched publicly known vulnerabilities in latest stable version clients is based on vulnerabilities reports by SecurityFocus and Secunia. See
computer security for more details about the importance of unpatched known flaws.
BitTorrent client
|
Known unpatched vulnerabilities
|
Secunia
|
SecurityFocus
|
Extremely critical
(number / oldest)
|
Highly critical
(number / oldest)
|
Moderately critical
(number / oldest)
|
Less critical
(number / oldest)
|
Not critical
(number / oldest)
|
Total
(number / oldest)
|
BitComet
|
0
|
0
|
0
|
0
|
0
|
0
|
BitLord
|
0
|
0
|
0
|
0
|
0
|
Unknown
|
BitTornado
|
0
|
0
|
0
|
0
|
0
|
Unknown
|
BitTorrent
|
0
|
0
|
0
|
0
|
0
|
0
|
BitTorrent DNA
|
0
|
0
|
0
|
0
|
0
|
0
|
BitTyrant
|
0
|
0
|
0
|
0
|
0
|
Unknown
|
Deluge
|
0
|
0
|
0
|
0
|
0
|
0
|
FlashGet
|
0
|
0
|
0
|
0
|
0
|
1
(2008-08-13) 13 August 2008
|
Free Download Manager
|
0
|
0
|
0
|
0
|
0
|
0
|
FrostWire
|
0
|
0
|
0
|
0
|
0
|
Unknown
|
KTorrent
|
0
|
0
|
0
|
0
|
0
|
0
|
Libtorrent (Rasterbar)
|
0
|
0
|
0
|
0
|
0
|
0
|
LimeWire
|
0
|
0
|
0
|
0
|
0
|
0
|
Miro
|
0
|
0
|
0
|
0
|
0
|
1
(2008-02-26) 26 February 2008
|
MLDonkey
|
0
|
0
|
0
|
0
|
1
(2003-11-05) 5 November 2003
|
1
(2009-02-23) 23 February 2009
|
µTorrent for Mac
|
0
|
0
|
0
|
0
|
0
|
0
|
µTorrent for Windows
|
0
|
0
|
0
|
0
|
0
|
0
|
Opera 12
|
0
|
0
|
0
|
0
|
0
|
0
|
Shareaza
|
0
|
0
|
0
|
0
|
0
|
0
|
Tixati
|
0
|
0
|
0
|
0
|
0
|
Unknown
|
Tomato Torrent
|
0
|
0
|
0
|
0
|
0
|
Unknown
|
TorrentFlux
|
0
|
0
|
1
(2008-04-23) 23 April 2008
|
0
|
0
|
2
(2008-04-18) 18 April 2008
|
Transmission
|
0
|
0
|
0
|
0
|
0
|
0
|
Vuze (formerly Azureus)
|
0
|
0
|
0
|
0
|
0
|
1
(2006-06-22) 22 June 2006
|
Wyzo
|
0
|
0
|
0
|
0
|
0
|
Unknown
|
Xunlei
|
0
|
2
(2007-09-28) 28 September 2007
|
0
|
0
|
0
|
1
(2007-11-17) 17 November 2007
|
BitTorrent client
|
Extremely critical
(number / oldest)
|
Highly critical
(number / oldest)
|
Moderately critical
(number / oldest)
|
Less critical
(number / oldest)
|
Not critical
(number / oldest)
|
Total
(number / oldest)
|
Secunia
|
SecurityFocus
|
Known unpatched vulnerabilities
|
Libraries
-
General
BitTorrent library
|
First public release date
|
Latest stable
|
Software license
|
libtorrent (Rasterbar)
|
8 September 2005 (2005-09-08)[50]
|
|
Free software
|
MonoTorrent
|
September 2006 (2006-09)
|
|
Free software
|
rTorrent (libTorrent Rakshasa)
|
15 July 2004 (2004-07-15)[51]
|
rTorrent 0.9.6 / libTorrent 0.13.6 (September 3, 2015 (2015-09-03)) [52]
|
Free software
|
BitTorrent library
|
First public release date
|
Latest stable
|
Software license
|
-
Operating system support and programming language
-
Supported features 1
-
Supported features 2
BitTorrent library
|
Cache[Note 4]
|
Web seeding [Note 5]
|
Broadcatching (RSS)
|
Prioritization
|
Selective downloads
|
SOCKS
|
Remote control via web
|
Engine
|
Notes
|
libtorrent (Rasterbar)
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
?
|
|
MonoTorrent
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
No
|
Yes
|
No
|
|
rTorrent (libTorrent Rakshasa)
|
Partial
|
No
|
No
|
Yes
|
Yes
|
No
|
Yes
|
No
|
No built-in cache-disk cache but a delayed sync
|
BitTorrent library
|
Cache
|
Web seeding
|
Broadcatching (RSS)
|
Prioritization
|
Selective downloads
|
SOCKS
|
Remote control via web
|
Engine
|
Notes
|
Notes
-- Module:Hatnote -- -- -- -- This module produces hatnote links and links to related articles. It -- -- implements the and meta-templates and includes -- -- helper functions for other Lua hatnote modules. --
local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local mArguments -- lazily initialise Module:Arguments local yesno -- lazily initialise Module:Yesno
local p = {}
-- Helper functions
local function getArgs(frame) -- Fetches the arguments from the parent frame. Whitespace is trimmed and -- blanks are removed. mArguments = require('Module:Arguments') return mArguments.getArgs(frame, {parentOnly = true}) end
local function removeInitialColon(s) -- Removes the initial colon from a string, if present. return s:match('^:?(.*)') end
function p.findNamespaceId(link, removeColon) -- Finds the namespace id (namespace number) of a link or a pagename. This -- function will not work if the link is enclosed in double brackets. Colons -- are trimmed from the start of the link by default. To skip colon -- trimming, set the removeColon parameter to true. checkType('findNamespaceId', 1, link, 'string') checkType('findNamespaceId', 2, removeColon, 'boolean', true) if removeColon ~= false then link = removeInitialColon(link) end local namespace = link:match('^(.-):') if namespace then local nsTable = mw.site.namespaces[namespace] if nsTable then return nsTable.id end end return 0 end
function p.formatPages(...) -- Formats a list of pages using formatLink and returns it as an array. Nil -- values are not allowed. local pages = {...} local ret = {} for i, page in ipairs(pages) do ret[i] = p._formatLink(page) end return ret end
function p.formatPageTables(...) -- Takes a list of page/display tables and returns it as a list of -- formatted links. Nil values are not allowed. local pages = {...} local links = {} for i, t in ipairs(pages) do checkType('formatPageTables', i, t, 'table') local link = t[1] local display = t[2] links[i] = p._formatLink(link, display) end return links end
function p.makeWikitextError(msg, helpLink, addTrackingCategory) -- Formats an error message to be returned to wikitext. If -- addTrackingCategory is not false after being returned from -- Module:Yesno, and if we are not on a talk page, a tracking category -- is added. checkType('makeWikitextError', 1, msg, 'string') checkType('makeWikitextError', 2, helpLink, 'string', true) yesno = require('Module:Yesno') local title = mw.title.getCurrentTitle() -- Make the help link text. local helpText if helpLink then helpText = ' (help)' else helpText = end -- Make the category text. local category if not title.isTalkPage and yesno(addTrackingCategory) ~= false then category = 'Hatnote templates with errors' category = string.format( '%s:%s', mw.site.namespaces[14].name, category ) else category = end return string.format( '%s', msg, helpText, category ) end
-- Format link -- -- Makes a wikilink from the given link and display values. Links are escaped -- with colons if necessary, and links to sections are detected and displayed -- with " § " as a separator rather than the standard MediaWiki "#". Used in -- the template.
function p.formatLink(frame) local args = getArgs(frame) local link = args[1] local display = args[2] if not link then return p.makeWikitextError( 'no link specified', 'Template:Format hatnote link#Errors', args.category ) end return p._formatLink(link, display) end
function p._formatLink(link, display) -- Find whether we need to use the colon trick or not. We need to use the -- colon trick for categories and files, as otherwise category links -- categorise the page and file links display the file. checkType('_formatLink', 1, link, 'string') checkType('_formatLink', 2, display, 'string', true) link = removeInitialColon(link) local namespace = p.findNamespaceId(link, false) local colon if namespace == 6 or namespace == 14 then colon = ':' else colon = end -- Find whether a faux display value has been added with the | magic -- word. if not display then local prePipe, postPipe = link:match('^(.-)|(.*)$') link = prePipe or link display = postPipe end -- Find the display value. if not display then local page, section = link:match('^(.-)#(.*)$') if page then display = page .. ' § ' .. section end end -- Assemble the link. if display then return string.format('%s', colon, link, display) else return string.format('%s%s', colon, link) end end
-- Hatnote -- -- Produces standard hatnote text. Implements the template.
function p.hatnote(frame) local args = getArgs(frame) local s = args[1] local options = {} if not s then return p.makeWikitextError( 'no text specified', 'Template:Hatnote#Errors', args.category ) end options.extraclasses = args.extraclasses options.selfref = args.selfref return p._hatnote(s, options) end
function p._hatnote(s, options) checkType('_hatnote', 1, s, 'string') checkType('_hatnote', 2, options, 'table', true) local classes = {'hatnote'} local extraclasses = options.extraclasses local selfref = options.selfref if type(extraclasses) == 'string' then classes[#classes + 1] = extraclasses end if selfref then classes[#classes + 1] = 'selfref' end return string.format( '
%s
', table.concat(classes, ' '), s )
end
return p-------------------------------------------------------------------------------- -- Module:Hatnote -- -- -- -- This module produces hatnote links and links to related articles. It -- -- implements the and meta-templates and includes -- -- helper functions for other Lua hatnote modules. --
local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local mArguments -- lazily initialise Module:Arguments local yesno -- lazily initialise Module:Yesno
local p = {}
-- Helper functions
local function getArgs(frame) -- Fetches the arguments from the parent frame. Whitespace is trimmed and -- blanks are removed. mArguments = require('Module:Arguments') return mArguments.getArgs(frame, {parentOnly = true}) end
local function removeInitialColon(s) -- Removes the initial colon from a string, if present. return s:match('^:?(.*)') end
function p.findNamespaceId(link, removeColon) -- Finds the namespace id (namespace number) of a link or a pagename. This -- function will not work if the link is enclosed in double brackets. Colons -- are trimmed from the start of the link by default. To skip colon -- trimming, set the removeColon parameter to true. checkType('findNamespaceId', 1, link, 'string') checkType('findNamespaceId', 2, removeColon, 'boolean', true) if removeColon ~= false then link = removeInitialColon(link) end local namespace = link:match('^(.-):') if namespace then local nsTable = mw.site.namespaces[namespace] if nsTable then return nsTable.id end end return 0 end
function p.formatPages(...) -- Formats a list of pages using formatLink and returns it as an array. Nil -- values are not allowed. local pages = {...} local ret = {} for i, page in ipairs(pages) do ret[i] = p._formatLink(page) end return ret end
function p.formatPageTables(...) -- Takes a list of page/display tables and returns it as a list of -- formatted links. Nil values are not allowed. local pages = {...} local links = {} for i, t in ipairs(pages) do checkType('formatPageTables', i, t, 'table') local link = t[1] local display = t[2] links[i] = p._formatLink(link, display) end return links end
function p.makeWikitextError(msg, helpLink, addTrackingCategory) -- Formats an error message to be returned to wikitext. If -- addTrackingCategory is not false after being returned from -- Module:Yesno, and if we are not on a talk page, a tracking category -- is added. checkType('makeWikitextError', 1, msg, 'string') checkType('makeWikitextError', 2, helpLink, 'string', true) yesno = require('Module:Yesno') local title = mw.title.getCurrentTitle() -- Make the help link text. local helpText if helpLink then helpText = ' (help)' else helpText = end -- Make the category text. local category if not title.isTalkPage and yesno(addTrackingCategory) ~= false then category = 'Hatnote templates with errors' category = string.format( '%s:%s', mw.site.namespaces[14].name, category ) else category = end return string.format( '%s', msg, helpText, category ) end
-- Format link -- -- Makes a wikilink from the given link and display values. Links are escaped -- with colons if necessary, and links to sections are detected and displayed -- with " § " as a separator rather than the standard MediaWiki "#". Used in -- the template.
function p.formatLink(frame) local args = getArgs(frame) local link = args[1] local display = args[2] if not link then return p.makeWikitextError( 'no link specified', 'Template:Format hatnote link#Errors', args.category ) end return p._formatLink(link, display) end
function p._formatLink(link, display) -- Find whether we need to use the colon trick or not. We need to use the -- colon trick for categories and files, as otherwise category links -- categorise the page and file links display the file. checkType('_formatLink', 1, link, 'string') checkType('_formatLink', 2, display, 'string', true) link = removeInitialColon(link) local namespace = p.findNamespaceId(link, false) local colon if namespace == 6 or namespace == 14 then colon = ':' else colon = end -- Find whether a faux display value has been added with the | magic -- word. if not display then local prePipe, postPipe = link:match('^(.-)|(.*)$') link = prePipe or link display = postPipe end -- Find the display value. if not display then local page, section = link:match('^(.-)#(.*)$') if page then display = page .. ' § ' .. section end end -- Assemble the link. if display then return string.format('%s', colon, link, display) else return string.format('%s%s', colon, link) end end
-- Hatnote -- -- Produces standard hatnote text. Implements the template.
function p.hatnote(frame) local args = getArgs(frame) local s = args[1] local options = {} if not s then return p.makeWikitextError( 'no text specified', 'Template:Hatnote#Errors', args.category ) end options.extraclasses = args.extraclasses options.selfref = args.selfref return p._hatnote(s, options) end
function p._hatnote(s, options) checkType('_hatnote', 1, s, 'string') checkType('_hatnote', 2, options, 'table', true) local classes = {'hatnote'} local extraclasses = options.extraclasses local selfref = options.selfref if type(extraclasses) == 'string' then classes[#classes + 1] = extraclasses end if selfref then classes[#classes + 1] = 'selfref' end return string.format( '
%s
', table.concat(classes, ' '), s )
end
return p
-
^
-
^
-
^
-
^ Reduces disk usage, file fragmentation (in case it is not preallocated) and latencies due to larger written blocks and cached data for hash checking finished pieces.
-
^
See also
References
-- Module:Hatnote -- -- -- -- This module produces hatnote links and links to related articles. It -- -- implements the and meta-templates and includes -- -- helper functions for other Lua hatnote modules. --
local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local mArguments -- lazily initialise Module:Arguments local yesno -- lazily initialise Module:Yesno
local p = {}
-- Helper functions
local function getArgs(frame) -- Fetches the arguments from the parent frame. Whitespace is trimmed and -- blanks are removed. mArguments = require('Module:Arguments') return mArguments.getArgs(frame, {parentOnly = true}) end
local function removeInitialColon(s) -- Removes the initial colon from a string, if present. return s:match('^:?(.*)') end
function p.findNamespaceId(link, removeColon) -- Finds the namespace id (namespace number) of a link or a pagename. This -- function will not work if the link is enclosed in double brackets. Colons -- are trimmed from the start of the link by default. To skip colon -- trimming, set the removeColon parameter to true. checkType('findNamespaceId', 1, link, 'string') checkType('findNamespaceId', 2, removeColon, 'boolean', true) if removeColon ~= false then link = removeInitialColon(link) end local namespace = link:match('^(.-):') if namespace then local nsTable = mw.site.namespaces[namespace] if nsTable then return nsTable.id end end return 0 end
function p.formatPages(...) -- Formats a list of pages using formatLink and returns it as an array. Nil -- values are not allowed. local pages = {...} local ret = {} for i, page in ipairs(pages) do ret[i] = p._formatLink(page) end return ret end
function p.formatPageTables(...) -- Takes a list of page/display tables and returns it as a list of -- formatted links. Nil values are not allowed. local pages = {...} local links = {} for i, t in ipairs(pages) do checkType('formatPageTables', i, t, 'table') local link = t[1] local display = t[2] links[i] = p._formatLink(link, display) end return links end
function p.makeWikitextError(msg, helpLink, addTrackingCategory) -- Formats an error message to be returned to wikitext. If -- addTrackingCategory is not false after being returned from -- Module:Yesno, and if we are not on a talk page, a tracking category -- is added. checkType('makeWikitextError', 1, msg, 'string') checkType('makeWikitextError', 2, helpLink, 'string', true) yesno = require('Module:Yesno') local title = mw.title.getCurrentTitle() -- Make the help link text. local helpText if helpLink then helpText = ' (help)' else helpText = end -- Make the category text. local category if not title.isTalkPage and yesno(addTrackingCategory) ~= false then category = 'Hatnote templates with errors' category = string.format( '%s:%s', mw.site.namespaces[14].name, category ) else category = end return string.format( '%s', msg, helpText, category ) end
-- Format link -- -- Makes a wikilink from the given link and display values. Links are escaped -- with colons if necessary, and links to sections are detected and displayed -- with " § " as a separator rather than the standard MediaWiki "#". Used in -- the template.
function p.formatLink(frame) local args = getArgs(frame) local link = args[1] local display = args[2] if not link then return p.makeWikitextError( 'no link specified', 'Template:Format hatnote link#Errors', args.category ) end return p._formatLink(link, display) end
function p._formatLink(link, display) -- Find whether we need to use the colon trick or not. We need to use the -- colon trick for categories and files, as otherwise category links -- categorise the page and file links display the file. checkType('_formatLink', 1, link, 'string') checkType('_formatLink', 2, display, 'string', true) link = removeInitialColon(link) local namespace = p.findNamespaceId(link, false) local colon if namespace == 6 or namespace == 14 then colon = ':' else colon = end -- Find whether a faux display value has been added with the | magic -- word. if not display then local prePipe, postPipe = link:match('^(.-)|(.*)$') link = prePipe or link display = postPipe end -- Find the display value. if not display then local page, section = link:match('^(.-)#(.*)$') if page then display = page .. ' § ' .. section end end -- Assemble the link. if display then return string.format('%s', colon, link, display) else return string.format('%s%s', colon, link) end end
-- Hatnote -- -- Produces standard hatnote text. Implements the template.
function p.hatnote(frame) local args = getArgs(frame) local s = args[1] local options = {} if not s then return p.makeWikitextError( 'no text specified', 'Template:Hatnote#Errors', args.category ) end options.extraclasses = args.extraclasses options.selfref = args.selfref return p._hatnote(s, options) end
function p._hatnote(s, options) checkType('_hatnote', 1, s, 'string') checkType('_hatnote', 2, options, 'table', true) local classes = {'hatnote'} local extraclasses = options.extraclasses local selfref = options.selfref if type(extraclasses) == 'string' then classes[#classes + 1] = extraclasses end if selfref then classes[#classes + 1] = 'selfref' end return string.format( '
%s
', table.concat(classes, ' '), s )
end
return p-------------------------------------------------------------------------------- -- Module:Hatnote -- -- -- -- This module produces hatnote links and links to related articles. It -- -- implements the and meta-templates and includes -- -- helper functions for other Lua hatnote modules. --
local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local mArguments -- lazily initialise Module:Arguments local yesno -- lazily initialise Module:Yesno
local p = {}
-- Helper functions
local function getArgs(frame) -- Fetches the arguments from the parent frame. Whitespace is trimmed and -- blanks are removed. mArguments = require('Module:Arguments') return mArguments.getArgs(frame, {parentOnly = true}) end
local function removeInitialColon(s) -- Removes the initial colon from a string, if present. return s:match('^:?(.*)') end
function p.findNamespaceId(link, removeColon) -- Finds the namespace id (namespace number) of a link or a pagename. This -- function will not work if the link is enclosed in double brackets. Colons -- are trimmed from the start of the link by default. To skip colon -- trimming, set the removeColon parameter to true. checkType('findNamespaceId', 1, link, 'string') checkType('findNamespaceId', 2, removeColon, 'boolean', true) if removeColon ~= false then link = removeInitialColon(link) end local namespace = link:match('^(.-):') if namespace then local nsTable = mw.site.namespaces[namespace] if nsTable then return nsTable.id end end return 0 end
function p.formatPages(...) -- Formats a list of pages using formatLink and returns it as an array. Nil -- values are not allowed. local pages = {...} local ret = {} for i, page in ipairs(pages) do ret[i] = p._formatLink(page) end return ret end
function p.formatPageTables(...) -- Takes a list of page/display tables and returns it as a list of -- formatted links. Nil values are not allowed. local pages = {...} local links = {} for i, t in ipairs(pages) do checkType('formatPageTables', i, t, 'table') local link = t[1] local display = t[2] links[i] = p._formatLink(link, display) end return links end
function p.makeWikitextError(msg, helpLink, addTrackingCategory) -- Formats an error message to be returned to wikitext. If -- addTrackingCategory is not false after being returned from -- Module:Yesno, and if we are not on a talk page, a tracking category -- is added. checkType('makeWikitextError', 1, msg, 'string') checkType('makeWikitextError', 2, helpLink, 'string', true) yesno = require('Module:Yesno') local title = mw.title.getCurrentTitle() -- Make the help link text. local helpText if helpLink then helpText = ' (help)' else helpText = end -- Make the category text. local category if not title.isTalkPage and yesno(addTrackingCategory) ~= false then category = 'Hatnote templates with errors' category = string.format( '%s:%s', mw.site.namespaces[14].name, category ) else category = end return string.format( '%s', msg, helpText, category ) end
-- Format link -- -- Makes a wikilink from the given link and display values. Links are escaped -- with colons if necessary, and links to sections are detected and displayed -- with " § " as a separator rather than the standard MediaWiki "#". Used in -- the template.
function p.formatLink(frame) local args = getArgs(frame) local link = args[1] local display = args[2] if not link then return p.makeWikitextError( 'no link specified', 'Template:Format hatnote link#Errors', args.category ) end return p._formatLink(link, display) end
function p._formatLink(link, display) -- Find whether we need to use the colon trick or not. We need to use the -- colon trick for categories and files, as otherwise category links -- categorise the page and file links display the file. checkType('_formatLink', 1, link, 'string') checkType('_formatLink', 2, display, 'string', true) link = removeInitialColon(link) local namespace = p.findNamespaceId(link, false) local colon if namespace == 6 or namespace == 14 then colon = ':' else colon = end -- Find whether a faux display value has been added with the | magic -- word. if not display then local prePipe, postPipe = link:match('^(.-)|(.*)$') link = prePipe or link display = postPipe end -- Find the display value. if not display then local page, section = link:match('^(.-)#(.*)$') if page then display = page .. ' § ' .. section end end -- Assemble the link. if display then return string.format('%s', colon, link, display) else return string.format('%s%s', colon, link) end end
-- Hatnote -- -- Produces standard hatnote text. Implements the template.
function p.hatnote(frame) local args = getArgs(frame) local s = args[1] local options = {} if not s then return p.makeWikitextError( 'no text specified', 'Template:Hatnote#Errors', args.category ) end options.extraclasses = args.extraclasses options.selfref = args.selfref return p._hatnote(s, options) end
function p._hatnote(s, options) checkType('_hatnote', 1, s, 'string') checkType('_hatnote', 2, options, 'table', true) local classes = {'hatnote'} local extraclasses = options.extraclasses local selfref = options.selfref if type(extraclasses) == 'string' then classes[#classes + 1] = extraclasses end if selfref then classes[#classes + 1] = 'selfref' end return string.format( '
%s
', table.concat(classes, ' '), s )
end
return p
-
^ a b
-
^
-
^
-
^
-
^
-
^
-
^
-
^
-
^ a b c d e f g
-
^
-
^
-
^
-
^ BitComet command line interface see BitComet Command Line – BitComet Wiki
-
^
-
^
-
^
-
^
-
^
-
^
-
^
-
^
-
^
-
^
-
^
-
^
-
^
-
^
-
^
-
^
-
^
-
^
-
^
-
^
-
^
-
^ Aided with a shell script documented in
-
^
-
^ Proxy support was removed in version 2.12:
-
^ Tracker exchange spec: BEP 28
-
^ Supports the Getright Webseeding spec since v1.14, see BitComet Wiki
-
^ a b Supports the Getright Webseeding spec in addition to the Bittornado spec [1]
-
^ See task #4401 SOCKS proxy; however, http proxy is supported.
-
^
-
^
-
^
-
^
-
^
-
^ http://www.vuze.com/features/playnow Play Now feature on official page
-
^ http://wiki.vuze.com/w/Additional_Vuze_Features Additional Vuze Features on VuzeWiki
-
^
-
^
-
^
-
^
-
^
External links
-
User-ranked list of bittorrent clients
-
BitTorrent at DMOZ
-
Article suggesting that a BitTorrent client is installed on more than 13% of Windows desktop PCs
This article was sourced from Creative Commons Attribution-ShareAlike License; additional terms may apply. World Heritage Encyclopedia content is assembled from numerous content providers, Open Access Publishing, and in compliance with The Fair Access to Science and Technology Research Act (FASTR), Wikimedia Foundation, Inc., Public Library of Science, The Encyclopedia of Life, Open Book Publishers (OBP), PubMed, U.S. National Library of Medicine, National Center for Biotechnology Information, U.S. National Library of Medicine, National Institutes of Health (NIH), U.S. Department of Health & Human Services, and USA.gov, which sources content from all federal, state, local, tribal, and territorial government publication portals (.gov, .mil, .edu). Funding for USA.gov and content contributors is made possible from the U.S. Congress, E-Government Act of 2002.
Crowd sourced content that is contributed to World Heritage Encyclopedia is peer reviewed and edited by our editorial staff to ensure quality scholarly research articles.
By using this site, you agree to the Terms of Use and Privacy Policy. World Heritage Encyclopedia™ is a registered trademark of the World Public Library Association, a non-profit organization.