World Library  
Flag as Inappropriate
Email this Article

Comparison of BitTorrent clients

Article Id: WHEBN0009160497
Reproduction Date:

Title: Comparison of BitTorrent clients  
Author: World Heritage Encyclopedia
Language: English
Subject: Usage share of BitTorrent clients, Glossary of BitTorrent terms, YourBittorrent, Ashwin Navin, FrostWire
Collection:
Publisher: World Heritage Encyclopedia
Publication
Date:
 

Comparison of BitTorrent clients

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

Name Developer Software license Latest stable software release Year (not dynamic, but easier for sorting)
ABC various Python Software Foundation License 2005
Acquisition Acquisition 2010
BitComet BitComet Development Group Proprietary 2015
BitLet various Proprietary ? ?
BitLord House of Life GPL

installs WhenU adware

2015
BitSpirit ByteLinker Inc. Proprietary 2010
BitTornado John Hoffman MIT 2006
BitTorrent Bram Cohen Proprietary, Adware 2015
BitTyrant University of Washington GPL 2007
Blog Torrent Downhill Battle GPL 2005
Deluge various GPL 2015
FlashGet Trend Media Proprietary 2012
Folx Eltima Software Proprietary 2015
Free Download Manager alervd GPL 2015
FrostWire The FrostWire Project GPL
Optionally installs Ask.com toolbar
2015
KGet KDE GPL 2014
KTorrent Joris Guisson, Ivan Vasić GPL 2013
Lftp Alexander V. Lukya GPL 2015
LimeWire Lime Wire LLC GPL 2010
Meerkat Bittorrent Client 47 Software Proprietary 2011
Miro Participatory Culture Foundation GPL 2013
MLDonkey MLDonkey Project GPL 2014
µTorrent Ludvig Strigeus Proprietary, Adware [a] 2015
OneSwarm University of Washington GPL 2011
Opera 12 Opera Software Proprietary Windows (Presto) – 12.17
Linux, FreeBSD, MacOS X – 12.16
2015
qBittorrent Christophe Dumez GPL 2015
rTorrent Jari Sundell GPL 2015
Shareaza Shareaza Development Team GPL 2015
SymTorrent Imre Kelényi GPL 2011
Tixati Kevin Hearn Proprietary 2015
Tomato Torrent Sarwat Khan BitTorrent Open Source License 2007
Tonido CodeLathe Proprietary 2012
TorrentFlux various GPL 2008
Transmission various GPL/MIT 2014
Tribler The Tribler Team LGPL 2015
Vuze (formerly Azureus) Vuze Proprietary (platform), GPL (core engine), Adware 2015
Wyzo Radical Software Proprietary 2010
Xunlei Thunder Networking Technologies Proprietary 2013
Name Developer Software license Latest stable software release Year
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[Note 22] 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 [45] 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
  1. ^ a b c d x86-32 and x86-64builds available.
  2. ^ Announcements to the tracker are made via IPv6 if possible, but the client doesn't listen on the respective port.
  3. ^ Qdbus interface
  4. ^ For a torrent added from a Magnet link, obtain the list of files (and other metadata) before prompting the user for a download location.
  5. ^ Automatically configure port forwarding (requires Router with UPnP support)
  6. ^ 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.
  7. ^ 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.
  8. ^ a b Tracker included with Linux binaries and with source, but not with Windows binary.
  9. ^ a b Exchanging with BT 6 and µTorrent clients (and now MooPolice).
  10. ^ It's UDP based, an experimental feature and only supported by other Azureus based clients.
  11. ^ a b Has its own DHT, a mainline-DHT compatible implementation is available as plugin.
  12. ^ µTorrent's DHT implementation is the same as Mainline and BitComet's, but unfortunately this is incompatible with Azureus's implementation.
  13. ^ 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.
  14. ^ Since Shareaza v2.5.5.1 r9064.
  15. ^ Exchanges with µTorrent and Azureus peers.
  16. ^ Since version 2.5.0.2. It's UDP based, an experimental feature and only supported by other Azureus clients.
  17. ^ 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.
  18. ^ Recently implemented (unofficial) web seeding feature, see HTTP-Based Seeding Specification
  19. ^ Called "preview mode"
  20. ^ a b Provides a Java-based and a simple HTML/JS based WebUI.
  21. ^ From version 3.0 this feature is called "Streaming mode". The number of pieces to download sequentially is configurable
  22. ^ Opera has a feed aggregator that displays feeds like emails.
  23. ^ Since Shareaza v2.4.0.2 r7924.
  24. ^ Since Shareaza v2.5.3.1.
  25. ^ Shareaza also uses G2 to transmit download metadata, such as BitTorrent trackers to other G2 clients.
  26. ^ 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
BitTorrent library Linux/Unix Windows OS X API Programming language
libtorrent (Rasterbar) Yes Yes Yes Yes C++
MonoTorrent Yes Yes Yes Yes C#
rTorrent (libTorrent Rakshasa) Yes No Yes Yes C++
BitTorrent library Linux/Unix Windows OS X API Programming language
Supported features 1
BitTorrent library Super-seeding Tracker UPnP [Note 1] NAT Port Mapping Protocol NAT traversal [Note 2] DHT [Note 3] Peer exchange Encryption UDP tracker LPD Fast extensions Magnet URI µTP
libtorrent (Rasterbar) Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes[53] Yes Yes Yes[54]
MonoTorrent Yes Yes Yes Yes No Yes Yes Yes Yes Yes Yes Yes No
rTorrent (libTorrent Rakshasa) Yes Yes No ? ? Yes Yes Yes Yes ? No Yes No
BitTorrent library Super-seeding Tracker UPnP NAT Port Mapping Protocol NAT traversal DHT Peer exchange Encryption UDP tracker LPD Fast extensions Magnet URI µTP
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
  1. ^
  2. ^
  3. ^
  4. ^ 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.
  5. ^

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
  1. ^ a b
  2. ^
  3. ^
  4. ^
  5. ^
  6. ^
  7. ^
  8. ^
  9. ^ a b c d e f g
  10. ^
  11. ^
  12. ^
  13. ^ BitComet command line interface see BitComet Command Line – BitComet Wiki
  14. ^
  15. ^
  16. ^
  17. ^
  18. ^
  19. ^
  20. ^
  21. ^
  22. ^
  23. ^
  24. ^
  25. ^
  26. ^
  27. ^
  28. ^
  29. ^
  30. ^
  31. ^
  32. ^
  33. ^
  34. ^
  35. ^ Aided with a shell script documented in
  36. ^
  37. ^ Proxy support was removed in version 2.12:
  38. ^ Tracker exchange spec: BEP 28
  39. ^ Supports the Getright Webseeding spec since v1.14, see BitComet Wiki
  40. ^ a b Supports the Getright Webseeding spec in addition to the Bittornado spec [1]
  41. ^ See task #4401 SOCKS proxy; however, http proxy is supported.
  42. ^
  43. ^
  44. ^
  45. ^ 3rd party utility RSSDler
  46. ^
  47. ^
  48. ^ http://www.vuze.com/features/playnow Play Now feature on official page
  49. ^ http://wiki.vuze.com/w/Additional_Vuze_Features Additional Vuze Features on VuzeWiki
  50. ^
  51. ^
  52. ^
  53. ^
  54. ^

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.
 


Copyright © World Library Foundation. All rights reserved. eBooks from Project Gutenberg are sponsored by the World Library Foundation,
a 501c(4) Member's Support Non-Profit Organization, and is NOT affiliated with any governmental agency or department.