Ровно месяц назад была опубликована статья LiveDC — Быстрый доступ к p2p файлам. Смысл ее в том, что Erty_Hackward написал DC-клиент с возможностью просмотра файлов до их окончательной загрузки. С его помощью можно, например, смотреть фильмы спустя пару минут после начала закачки, перематывать их, смотреть с любого момента. А можно извлечь нужный файл из большого архива, не перекачивая целый архив.
Мне очень понравилась идея этой программы. Но она написана на C#. А хотелось бы использовать ее в линуксе. Поэтому с разрешения автора я с большим удовольствием взялся за создание аналогичной программы для линукса. В результате получился консольный битторрент клиент QLiveBittorrent.
Как оно работает
Расскажу о работе QLiveBittorrent на примере скачивания фильма. Ну, например, мой друг выложил в сеть видеозапись выпускного вечера, недавно прошедшего в нашей школе, а я хочу ее скачать, и еще раз насладиться этим незабываемым зрелищем.
Я начинаю скачивать фильм. Указываю папку, куда его надо подмонтировать. И тут же пытаюсь его открыть. Фильм открывается 1-2 мин — в зависимости от скорости. Начинаю смотреть — лагов, как правило, нет, если скорости хватает. Далее я перематываю фильм на середину. Наблюдаю тормоза ~30 сек, и продолжаю смотреть его с середины.
Происходит примерно следующее. Изначально, в момент открытия фильма в плеере, программа скачивает первые несколько блоков фильма и последний блок, чтоб получить информацию о его продолжительности. Далее она продолжает скачивать фильм с начала. Но в момент перемотки фильма на середину, программа начинает скачивать именно тот блок, который был запрошен плеером.
Кроме скачивания фильмов, программу можно использовать для работы с архивами, iso-образами, для просмотра папок с огромным числом картинок. Это очень удобно — начать качать архив, и с самого начала, не дожидаясь пока он скачается, открыть его, сразу указать, какой файл тебе нужен, и скачать именно его.
Как оно начиналось
После того, как я осознал, что будет проще написать свое, чем пытаться портировать LiveDC на линукс, я сразу же приступил к разработке.
Сначала я думал встроить свой функционал в мой любимый bittorrent клиент. Но после просмотра исходников это желание отпало. Миллионы файлов, везде defin-ы на разные системы, все это в виде простыни, и ничего не понятно. Однако, под впечатлением от qbittorrent, я выбрал тот же инструментарий.
- Qt5
- libtorrent-rasterbar
- FUSE
За день был написан драйвер файловой системы qlive.
Еще за день — графика и скачивание торрентов.
Выглядело это примерно так:
На этом разработка впала в ступор. Программа работала, докачивала необходимые куски, но регулярно получала SIGSEGV (ошибка «программа обратилась не по адресу»). В это же время я грустно смотрел на функционал qbittorrent и utorrent, и до меня медленно доходило, что энтузиазма на месяцы разработки у меня не хватит…
Второе дыхание
Второе дыхание открылось, когда я решил забить на GUI. Кому он нужен? На его поддержку уходит слишком много нервов! Так появился консольный битторрент клиент. А затем появилась интересная идея разделить сидирующие торренты от качающихся.
В результате программа оказалась разделенной на качающую часть, которая умеет монтировать недокачанные файлы, ограничивать скорость скачивания и быть обычным торрент-клиентом и сидирующую часть (seed-manager), которая умеет раздавать то, что скачано, а также ограничивать скорость отдачи.
Интересные моменты разработки
- Иногда, тестируя закачку торрентов, я с удивлением обнаруживал, что скорость скачивания превосходит максимальную скорость моего роутера — 802.11G ~2MБ/с. Она достигала 40-50 МБ/с, что было в принципе невозможно! Я пытался валить все на кеши. Однако, выяснилось, что у меня было запущено 2 клиента на компьютере, которые и обменивались между собой информацией на скорости чтения жесткого диска. Один читает, другой пишет. Впоследствии я использовал это для тестирования.
- Из-за того, что клиент консольный, мне пришлось разбираться с сигналами завершения. Я добавил обработку сигнала SIGTERM (сигнал для запроса завершения процесса). Во время дебага, когда я посылал SIGTERM «руками», он успешно перехватывался и обрабатывался. Однако, на практике, когда я в терминале жал ctrl-c, сигнал не обрабатывался. Оказалось, что терминал посылает не SIGTERM, а SIGINT (сигнал для остановки процесса пользователем с терминала). Это меня поразило. Оказывается, при нажатии ctrl-c идет сигнал не «останови процесс», а «пользователь хочет, чтоб процесс остановился». Наверное, можно придумать глубокий смысл разницы этих процессов, но это было довольно неожиданно и странно.
- Несмотря на то, что клиент консольный, мне хотелось, чтобы какое-то подобие GUI все же оставалось. Но ведь, если приложение консольное, то хочется, чтобы оно запускалось в голой консоли (TTY), а это невозможно при наличии GUI… Или возможно? Для этого надо понимать, как работает графика в линуксе.
А работает она примерно так: есть X-server, есть клиенты. В какой-то момент клиент подключается. Вопрос — когда это происходит? Экспериментальным путем (методом пристального взгляда) я выяснил, что подключение происходит в момент создания QApplication. Соответственно, если нужна графика, то я создаю QApplication, если нет — QCoreApplication. Таким образом, программа может запускаться как в голой консоли, так и с графическим мини-интерефейсом.
- Смешивание Qt и libtorrent — это чистый ад. Мои нервы в конце концов не выдержали, и я начал пытаться переводить все в Qt. К сожалению, libtorrent использует std, поэтому весь мой код увешан QString::fromStdString(string) и QString.toStdString(), а так же конверсиями vector char, QVector char, QByteArray и т.п.
- Во время разработки я столкнулся с неприятной проблемой. В один прекрасный момент к программе подключаются медленные пиры и начинают неторопливо отдавать нужные куски. При этом в среднем скорость закачки хорошая, но задержки из-за них недопустимые. Я пытался с этим бороться. В какой-то степени задачу удалось решить за счет того, что первые 2 минуты программа ищет быстрых пиров, а затем ограничивает их максимальное число пятью пирами. Это позволяет отшивать большинство медленных пиров.
- Для того, чтобы после полуночи не было проблем с вычитанием времени, в программе реализована функция midnight(), которая каждую секунду проверяет, не полночь ли сейчас? В течение 5 секунд после полуночи программу колбасит — она при обновлении информации на экране обнуляет все временные счетчики, игнорируя запросы пользователя. Такой вот редкостный костыль. Я его за 3 минуты до полуночи написал.
Список фич
- Если торрент опубликовали только что, то отношение количества сидеров к личерам слишком маленькое. Это влечет за собой почти полную невозможность скачать такой торрент за разумное время. Поэтому в QLiveBittorrent добавлена возможность «превращения» в обычного торрент-клиента. Для этого надо нажать клавишу ‘a’ (английскую).
- При чтении подмонтированных файлов программы впадают в ступор, пока необходимые куски не будут скачаны. Но они обязательно из него выходят, когда это происходит. Это особенность программы.
- Авторитетные источники утверждают, что на канале 600КБ/с фильм весом 1.45G с внешней звуковой дорожкой и субтитрами проигрывается без лагов.
- Если нажать на клавиатуре ctrl-c (или послать SIGTERM), то программа начнет завершаться — сбрасывать данные на жесткий диск и отправлять информацию трекерам. После сброса данных можно нажать ctrl-c — тогда информация не будет послана трекерам. Это сделано, потому что меня очень расстраивают программы, которые невозможно завершить.
Источники
- Erty_Hackward — оригинальная идея
- ximaera — рассказал про то, как надо парсить параметры из командной строки.
- статья про boost::program_options
- Libtorrent api — хорошая библиотека, но эмоции от одностраничной документации непередаваемы.
- github.com/qbittorrent/qBittorrent — читал исходники, но ничего не понял.
Скачивание
Исходники
ArchLinux (AUR)
linux-x86-64
Для работы требуются библиотеки boost, Qt, libtorrent-rasterbar.
Настройки хранятся по адресу ~/.qlivebittorrent
UPD 00:30
Забыл описать еще две фичи:
- После загрузки торрента, он автоматически добавляется в список сидирования. Если seed-manager уже запущен, то он добавится в список в течение 10 минут.
- Если торрент был удален, то он будет удален из списка сидирования при первом же запросе.
UPD 18:00
DAP-DarkneSS выложил версию под OpenSUSE. Спасибо.
Версия под OpenSUSE
UPD 23:15
В выложенной версии не работало GUI. В чем ошибка я так и не понял, но требуемый костыль найден.
Файлы перезалиты.
UPD +месяц
DAP-DarkneSS выложил версии под Debian, Ubuntu и Fedora. Спасибо.
Debian и Ubuntu
Fedora
WebTorrent CLI
The streaming torrent client. For the command line.
WebTorrent is the first BitTorrent client that works in the browser, but webtorrent-cli
,
i.e. THIS PACKAGE, is for using WebTorrent from the command line.
webtorrent-cli
is a simple torrent client for use in node.js, as a command line app. It
uses TCP, UDP and WebRTC to talk to other torrent clients.
To use WebTorrent in the browser, see webtorrent
.
Features
- Use WebTorrent from the command line!
- Insanely fast
- Streaming
- Stream to AirPlay, Chromecast, VLC player, IINA, and many other devices/players
- Fetches pieces from the network on-demand so seeking is supported (even before torrent is finished)
- Seamlessly switches between sequential and rarest-first piece selection strategy
- Supports advanced torrent client features
- magnet uri support via ut_metadata
- peer discovery via dht,
tracker, and
ut_pex - protocol extension api
for adding new extensions - Check all the supported BEPs here
Install
To install a webtorrent
command line program, run:
npm install webtorrent-cli -g
Usage
$ webtorrent --help _ _ _ __ _____| |__ | |_ ___ _ __ _ __ ___ _ __ | |_ \ \ /\ / / _ \ '_ \| __/ _ \| '__| '__/ _ \ '_ \| __| \ V V / __/ |_) | || (_) | | | | | __/ | | | |_ \_/\_/ \___|_.__/ \__\___/|_| |_| \___|_| |_|\__| Usage: webtorrent [command] <torrent-id> [options] Examples: webtorrent download "magnet:..." --vlc webtorrent "magnet:..." --vlc --player-args="--video-on-top --repeat" Default output location: * when streaming: Temp folder * when downloading: Current directory Specify <torrent-id> as one of: * magnet uri * http url to .torrent file * filesystem path to .torrent file * info hash (hex string) Commands: webtorrent download [torrent-ids...] Download a torrent [default] webtorrent downloadmeta <torrent-ids...> Download metadata of torrent webtorrent seed <inputs...> Seed a file or a folder webtorrent create <input> Create a .torrent file webtorrent info <torrent-id> Show torrent information webtorrent version Show version information webtorrent help Show help information Options (streaming): --airplay Apple TV [boolean] --chromecast Google Chromecast [default: all] --dlna DLNA [boolean] --mplayer MPlayer [boolean] --mpv MPV [boolean] --omx OMX [default: hdmi] --vlc VLC [boolean] --iina IINA [boolean] --smplayer SMPlayer [boolean] --xbmc XBMC [boolean] --stdout Standard out (implies --quiet) [boolean] Options (simple): -o, --out Set download destination [string] -s, --select Select specific file in torrent [default: List files] -i, --interactive-select Interactively select specific file in torrent [boolean] -t, --subtitles Load subtitles file [string] -h, --help Show help information [boolean] -v, --version Show version information [boolean] Options (advanced) -p, --port Change the http server port [number] [default: 8000] -b, --blocklist Load blocklist file/url [string] -a, --announce Tracker URL to announce to [string] -q, --quiet Don't show UI on stdout [boolean] -d, --download-limit Maximum download speed in kb/s [number] [default: unlimited] -u, --upload-limit Maximum upload speed in kb/s [number] [default: unlimited] --pip Enter Picture-in-Picture if supported by the player [boolean] --verbose Show torrent protocol details [boolean] --playlist Open files in a playlist if supported by the player [boolean] --player-args Add player specific arguments (see example) [string] --torrent-port Change the torrent seeding port [number] [default: random] --dht-port Change the dht port [number] [default: random] --not-on-top Don't set "always on top" option in player [boolean] --keep-seeding Don't quit when done downloading [boolean] --no-quit Don't quit when player exits [boolean] --on-done Run script after torrent download is done [string] --on-exit Run script before program exit [string]
To download a torrent:
To stream a torrent to a device like AirPlay or Chromecast, just pass a flag:
$ webtorrent magnet_uri --airplay
In addition to magnet uris, webtorrent supports many ways to specify a torrent:
- magnet uri (string)
- torrent file (buffer)
- info hash (hex string or buffer)
- parsed torrent (from parse-torrent)
- http/https url to a torrent file (string)
- filesystem path to a torrent file (string)
License
MIT. Copyright (c) Feross Aboukhadijeh and WebTorrent, LLC.
01.09.2010 года разработчики популярного BitTorrent-клиента для Windows, по просьбам пользователей, выпустили первую альфа версию µTorrent Server 3.0 для GNU/Linux.
µTorrent Server — это консольный BitTorrent-клиент пока поставляемый в виде сервера и на данный момент не имеет своего пользовательского интерфейса (GUI).
µTorrent Server управляеся через Web-интерфейс (версия с графическим интерфейсом появится позже), для доступа к приложению можно использовать любой современный web-браузер.
Для использования µTorrent, с сайта проекта необходимо скачать архив, распаковать его и запустить «utserver«.
После запуска сервера, открыть любой браузер и перейти по адресу:
http://localhost:8080/gui/
Логин для входа: admin Пароль: "Пустое поле"
В настройках логин/пароль можно изменить.
Конфигурация µTorrent Server находится в файле utserver.conf директории сервера (его «по умолчанию» нет). Он имеет примерно такое содержание:
ut_webui_port 8080 dir_active /home/user/ dir_torrent_files /home/user/torrent bind_port 37455
Более подробно о нём можно узнать в uTorrent_Server.html или uTorrent_Server.pdf находящихся в каталоге «docs«.
µTorrent Server alpha 3.0 основан на кодовой базе оригинального Win-клиента версии 3.0.
В WebUI реализованы практически все возможности доступны в оригинальной версии программы.
Авторами отмечается что µTorrent Server работоспособен и на других дистрибутивах с Linux-ядром версии 2.6.13 и выше, но они официально не поддерживаются.
µTorrent распространяется бесплатно, но его исходный код закрыт.
Домашняя страница
µTorrent Linux (Forum)
Опишу здесь, что бы не забыть, как запустить консольного клиента rtorrent с удаленной консоли, что бы потом можно было в любой момент зайти и посмотреть — что там делается.
Документация по rtorrent лежит тут
Часть информации взята тут
Для того, что бы не вводить в командной строке параметры запуска rtorrent, создаем файл .rtorrent.rc в домашней директории. Вот пример содержания моего файла
# Это пример файла ресурсов для rTorrent. Скопируйте его в # ~/.rtorrent.rc и разрешите/измените опции, как вам будет нужно. # Максимальное и минимальное количество пиров при соединении через torrent. max_peers = 400 #min_peers = 40 # Тоже что и выше, только для seed выкаченных torrents (-1 = same as downloading) #min_peers_seed = 10 #max_peers_seed = 50 # Максимальное количество одновременных закачек per torrent. #max_uploads = 15 # Глобальная скорость закачки и отдачи в KiB. "0" - без ограничений. download_rate = 250 upload_rate = 200 # Директория по умолчанию для сохранения закачиваемых торентов. directory = ~/torrent/download/ # каталог куда будет сохраняться состояние торентов. Здесь, в этом примере, # они сохраняются в папку session session = ~/torrent/session # Каждый день сработает тригер "throttle_1" в 18:00 и установит скорость # скорость закачки в 450kb, а тригер "throttle_2" установит ее в 250kb # в 08:00. Используя это клиент может автоматически регулировать скорость закачки. schedule = throttle_1,18:00:00,24:00:00,download_rate=450 schedule = throttle_2,08:00:00,24:00:00,download_rate=250 # rtorrent каждые 5 секунд проверяет этот каталог на новые *.torrent # файлы и если они есть то ставит их на закачку schedule = watch_directory,5,5,load_start=~/torrent/*.torrent # номер порта (или нескольких портов) который открывает клиент для # обмена данными port_range = 6900-6900 # случайный выбор порта для обмена данными. В данном случае он отключен port_random = no # проверять хэш торрента после закачки check_hash = yes # C версии rtorrent 0.8.7 были заменены некоторые опции # max_open_sockets ⇒ network.max_open_sockets # max_open_files ⇒ network.max_open_files # umask ⇒ system.umask.set # d.save_session ⇒ d.save_full_session system.umask.set = 022 # Из-за ошибки в ядре системы, нужно добавить следующую строку (версии 0.8.7, 0.8.8) session.name.set = "$cat=$system.hostname=,:,$system.pid=" # Следующая строка удалена из опций - закоментируйте ее #session_on_completion = yes session_save = yes #working_directory = ~/torrent/ max_uploads = 100
Вот пример файла из документации | ссылка
Для работы этого клиента, нужно открыть tcp порт 6900 на фаерволе. Тк места в домашней директории не хватало, то закачки будут сохраняться в /var/ftp/torrent/
Внешний вид
В левом нижнем углу написано [Throttle off/off KB]. Это лимиты на
Upload (отдачу) и Download (закачку) соответственно. По умолчанию они выключены.
Их можно изменить кнопками
a/z, s/x, d/c для изменения лимита отдачи вверх/вниз по 1, 5 и 50 кб/с
соответственно, и те же буквы при нажатом
Shift или CapsLock для изменения лимита закачки.
Рассмотрим сам торрент. Сначала идет название, далее написано Rate и
указаны текущие скорости отдачи и скачивания. После этого сколько было отдано с данного торрента. В квадратных скобках идет рейтинг (являющийся соотношением скачанного/отданного.
Если есть слово Inactive
означает, что торрент неактивен (на паузе).
В верхней строке написано View: main. Всего их 7:
переключаемых кнопками 1-7:
- Main — по умолчанию.
- Name — показ торрентов с сортировкой по имени.
- Started — показ только запущенных торрентов.
- Stopped — показ только остановленных торрентов.
- Complete — показ только закачанных на 100% торрентов.
- Incomplete — показ только недокачанных торрентов.
- Hashing — показ только хешируемых торрентов.
В клиенте используется навигация в стиле Lynx. Так называют способ организации
интерфейса, при котором передвижение осуществляется стрелками по правилу:
вверх/вниз — в пределах текущего уровня, влево/вправо — на уровень выше и на
уровень ниже.
Для примера можно выбрать какую-либо из раздач и нажать стрелку
вправо. Мы увидим вот такое меню.
- Peer list — список пиров
- Info — информация о торренте
- File list — список файлов в закачиваемом торренте
- Tracker list — список трекеров
- Chunks seen — просмотреть
- Transfer list — список передаваемых кусков
Выберем стрелками пункт File list и нажмём стрелку вправо. Теперь, выбрав нужный файл, можно с помощью пробела поставить ему высокий приоритет (hig) или вообще отказаться от его закачки (off).
Использование
- Ctrl+ q — отключает программу, повторное нажатие закрывает программу не посылая трэкеру стоп сигнал
- кнопки вниз/вверх — выбор торрента/адреса
- кнопка <- — возвращает на предыдущий экран
- кнопка -> — просмотр состояния загрузки/аплоуда торрента
- a | s | d — увеличть скорость слота аплоуда на 1/5/50 кб.
- A | S | D — увеличть скорость слота загрузки на 1/5/50 кб.
- z | x | c — уменьшить скорость аплоуда на 1/5/50 кб.
- Z | X | C — уменьшить скорость загрузки на 1/5/50 кб.
- 1…8 — переключение вида на различные окна
- Ctrl+S — начать закачку
- Ctrl+D — остановить закачку (повторное нажатие удаляет торент закачку. Сам торрент файл сохраняется)
- Ctrl+K — закрыть торент и его файлы
- Ctrl+R — проверить хэш торрента
- Ctrl+O — изменить директорию на загрузку, торрент должен быть закрыт.
- + | — — увеличить уменьшить приоритет загрузки торрента
- backspace добавить URL или путь к торренту
- l просмотреть лог, чтобы выйти нужно нажать пробел
- Ctrl+P — вызвать комманду или поменять настройку
Запуск и управление программы rtorrent
Входим в удаленную консоль и набираем
~]$screen - ~]$rtorrent [url.torrent]
Далее для выхода ^a + d
Для управления в этом режиме используем
- ^a + q -для выхода из програмы
- ^a + s -для запуска закачки. И тд
- ^a +d — для выхода из консоли, не закрывая программы
Далее закрываем консоль и идем спать.
Если нам надо проверить закачку.
- Входим на удаленную консоль
- Набираем
$screen -r
И попадаем на экран управления rtorrent.
Deluge
для Windows
Deluge — полнофункциональный кросс-платформенный клиент BitTorrent, выпущенный под лицензией GNU GPLv3 +, и в соответствии со стандартами freedesktop, позволяющими работать во многих средах. Активно использует библиотеку libtorrent.
Клиент содержит общие функции для клиентов BitTorrent, таких как шифрование протоколов, DHT, локальное одноранговое обнаружение (LSD), одноранговый обмен (PEX), UPnP, NAT-PMP, поддержка прокси, ограничение скорости потокового трафика.
Программа может быть запущена как обычное автономное настольное приложение, так и в качестве клиент-сервера. В режиме Thin client приложение может работать с пользовательскими интерфейсами, удаленно подключаемыми с любой другой платформы. Существует три основных пользовательских интерфейса (UI):
- Пользовательский интерфейс GTK для рабочего стола.
- Веб-интерфейс для браузера.
- Консольный интерфейс командной строки.
Доступна богатая коллекция плагинов, благодаря которой можно существенно расширить функциональность приложения.
ТОП-сегодня раздела «Торрент клиенты, файловый обмен»
qBittorrent 4.4.5 / 5.0.5
QBittorrent — простой в использовании клиент файлообменной P2P-сети BitTorrent, который предлагает…
uTorrent Web 1.3.0
Удобный инструмент от разработчиков популярного торрент-клиента uTorrent с поддержкой…
MediaGet 3.01.4212
MediaGet — популярная программа для поиска и скачивания любых фильмов, музыки, программ, игр и…
Shareman 102.3.78.235
Shareman — бесплатная и удобная в использовании программа, которая сочетает в себе мощный…
Отзывы о программе Deluge
Max про Deluge 1.3.15 [08-07-2021]
Юзаю BitComet лет 10, всем доволен, а это … оставлю для экспериментов на Win7 и Ubuntu.
Из описания не ясно чем это лучше/хуже других.
11 | 9 | Ответить
Игорь про Deluge 1.3.15 [21-11-2020]
Не работает с Windows XP, минимум семерка!
10 | 15 | Ответить
Андрей Серов про Deluge 1.3.15 [02-07-2017]
Прекрасная стабильная программа, сам пользуюсь и советую другим тоже.
14 | 11 | Ответить