Qlivebittorrent — Консольный Битторрент-Клиент Для Просмотра Файлов Перед Скачиванием

Статья опубликована ровно месяц назад LiveDC – Быстрый доступ к p2p-файлам .

Его смысл в том, что Эрти_Хаквард написал клиент DC с возможностью просмотра файлов до их окончательной загрузки.

С его помощью можно, например, смотреть фильмы через пару минут после начала загрузки, перематывать их назад или смотреть с любого момента.

Или вы можете извлечь нужный файл из большого архива, не скачивая весь архив.

Мне очень понравилась идея этой программы.

Но он написан на C#.

Я хотел бы использовать его в Linux. Поэтому, с разрешения автора, я с большим удовольствием создал подобную программу для Linux. В результате получается консольный битторрент-клиент QLiveBittorrent.

QLiveBittorrent — консольный битторрент-клиент для просмотра файлов перед скачиванием

Как это работает О том, как работает QLiveBittorrent, я расскажу на примере загрузки фильма.

Ну, например, мой друг выложил в сеть видео выпускного вечера, который недавно прошел в нашей школе, и мне хочется скачать его и еще раз насладиться этим незабываемым зрелищем.

Я начинаю скачивать фильм.

Указываю папку, куда его следует смонтировать.

И тогда я пытаюсь его открыть.

Фильм открывается через 1-2 минуты, в зависимости от скорости.

Начинаю смотреть - лагов как правило нет, если скорость достаточная.

Далее я перематываю фильм на середину.

Я наблюдаю за тормозами ~30 секунд и продолжаю смотреть с середины.

Происходит нечто подобное.

Изначально, когда фильм открывается в плеере, программа загружает несколько первых блоков фильма и последний блок, чтобы получить информацию о его продолжительности.

Затем она продолжает загрузку фильма с самого начала.

Но в момент перемотки фильма на середину программа начинает скачивать именно тот блок, который был запрошен плеером.

Помимо скачивания фильмов, программу можно использовать для работы с архивами, iso-образами, а также для просмотра папок с огромным количеством картинок.

Очень удобно начать скачивание архива и с самого начала, не дожидаясь его скачивания, открыть его, сразу указать, какой файл вам нужен, и скачать его.

Как все началось После того, как я понял, что проще написать свой, чем пытаться портировать LiveDC на Linux, я сразу приступил к разработке.

Сначала я думал о том, чтобы встроить свою функциональность в мой любимый битторрент-клиент .

Но после просмотра исходников это желание пропало.

Миллионы файлов, повсюду определения для разных систем, все в виде листа, и ничего не понятно.

Однако, вдохновившись qbittorrent, я выбрал тот же набор инструментов.

  1. Qt5
  2. libtorrent-rasterbar
  3. ПРЕДОХРАНИТЕЛЬ
Драйвер файловой системы был написан за день qlive .

Очередной день - графика и скачивание торрентов.

Это выглядело примерно так:

QLiveBittorrent — консольный битторрент-клиент для просмотра файлов перед скачиванием

На этом этапе развитие застопорилось.

Программа работала, скачивала нужные куски, но регулярно получала SIGSEGV (ошибка «программа обратилась не по тому адресу»).

При этом я с грустью посмотрел на функционал qbittorrent И uTorrent , и до меня постепенно дошло, что мне не хватает энтузиазма на месяцы разработки.

Второе дыхание Второе дыхание открылось, когда я решил отказаться от графического интерфейса.

Кому это нужно? Чтобы поддержать его, нужно слишком много нервов! Так появился консольный битторрент-клиент. И тут появилась интересная идея отделить раздачу торрентов от скачивания.

В результате программа оказалась разделена на скачивающую часть, которая умеет монтировать нескачанные файлы, ограничивать скорость скачивания и выступать в роли обычного торрент-клиента, и раздающую часть (сид-менеджер), которая может раздавать то, что было загружено, а также ограничить скорость загрузки.



QLiveBittorrent — консольный битторрент-клиент для просмотра файлов перед скачиванием

Интересные точки развития

  1. Иногда, тестируя загрузку торрентов, я с удивлением обнаруживал, что скорость загрузки превышала максимальную скорость моего роутера — 802.11G ~2МБ/с.

    Она достигала 40-50 МБ/с, что было в принципе невозможно! Я пытался свалить все на тайники.

    Однако оказалось, что у меня на компьютере было запущено 2 клиента, которые обменивались между собой информацией со скоростью чтения жесткого диска.

    Один читает, другой пишет. Впоследствии я использовал это для тестирования.

  2. В связи с тем, что клиент консольный, пришлось разобраться с сигналами завершения.

    Я добавил обработку сигнала SIGTERM (сигнал запроса завершения процесса).

    Во время отладки, когда я отправил SIGTERM вручную, он был успешно перехвачен и обработан.

    Однако на практике, когда я нажимал в терминале ctrl-c, сигнал не обрабатывался.

    Оказалось, что терминал отправлял не SIGTERM, а SIGINT (сигнал пользователю на остановку процесса с терминала).

    Это меня поразило.

    Оказывается, при нажатии ctrl-c сигнал не «остановить процесс», а «пользователь хочет, чтобы процесс остановился».

    Вероятно, можно было придумать более глубокий смысл различия этих процессов, но он был весьма неожиданным и странным.

  3. Несмотря на то, что клиент консольный, хотелось, чтобы какое-то подобие GUI осталось.

    Но если приложение консольное, то вы хотите, чтобы оно запускалось в голой консоли (TTY), а с GUI это невозможно.

    Или можно? Для этого вам нужно понять, как работает графика в Linux. А работает это примерно так: есть X-сервер, есть клиенты.

    В какой-то момент клиент подключается.

    Вопрос – когда это произойдет? ?Экспериментальным путем (присмотревшись) я выяснил, что подключение происходит в момент создания QПриложение .

    Соответственно, если нужна графика, то я создаю QПриложение , если не - QCoreПриложение .

    Таким образом, программу можно запустить как в голой консоли, так и с мини графическим интерфейсом.

  4. Смешивать Qt и libtorrent — это настоящий ад. Нервы мои наконец сдали и я начал пытаться перевести всё на Qt. К сожалению, libtorrent использует std, поэтому весь мой код покрыт QString::fromStdString(string) и QString.toStdString(), а также преобразованиями векторного символа, QVector char, QByteArray и т. д.
  5. Во время разработки я столкнулся с досадной проблемой.

    В какой-то момент к программе подключаются медленные пиры и потихоньку начинают отдавать нужные куски.

    При этом в среднем скорость загрузки хорошая, но задержки из-за них недопустимы.

    Я пытался с этим бороться.

    В какой-то степени проблема решилась за счет того, что программа ищет быстрые пиры первые 2 минуты, а затем ограничивает их максимальное количество пятью пирами.

    Это позволяет вам отключить большинство медленных узлов.

  6. Чтобы избежать проблем с вычитанием времени после полуночи, в программе реализована функция Midnight(), которая каждую секунду проверяет, наступила ли полночь? В течение 5 секунд после полуночи программа выходит из строя - при обновлении информации на экране она сбрасывает все счетчики времени, игнорируя запросы пользователей.

    Это такой редкий костыль.

    Я написал это за 3 минуты до полуночи.

Список функций
  1. Если торрент только что опубликован, то соотношение количества сидеров и личеров слишком мало.

    Это влечет за собой практически полную невозможность скачать такой торрент за разумное время.

    Поэтому в QLiveBittorrent добавлена возможность «превращаться» в обычный торрент-клиент. Для этого нажмите клавишу «а» (английская).

  2. При чтении смонтированных файлов программы впадают в ступор, пока не скачаются нужные куски.

    Но они обязательно выходят из этого, когда это происходит. Это особенность программы.

  3. Авторитетные источники утверждают, что на канале 600Кб/с фильм 1.45G с внешней звуковой дорожкой и субтитрами воспроизводится без лагов.

  4. Если нажать ctrl-c на клавиатуре (или отправить SIGTERM), программа начнет завершать работу — сбрасывать данные на жесткий диск и отправлять информацию трекерам.

    После сброса данных можно нажать ctrl-c — тогда информация не будет отправляться на трекеры.

    Это сделано потому, что меня очень расстраивают программы, которые невозможно завершить.

Источники
  1. Эрти_Хаквард - оригинальная идея
  2. ксимера — рассказал о том, как парсить параметры из командной строки.

  3. статья о boost::program_options
  4. API libtorrent — хорошая библиотека, но эмоции от одностраничной документации неописуемые.

  5. github.com/qbittorrent/qBittorrent — Я прочитал исходный код, но ничего не понял.

Скачать Источники АрхЛинукс (АУР) Linux-x86-64 Для работы требуются библиотеки повышение, Qt, libtorrent-rasterbar .

Настройки хранятся по адресу ~/.

qlivebittorrent УПД 00:30 Забыл описать еще две особенности:

  1. После скачивания торрента он автоматически добавляется в список раздачи.

    Если сид-менеджер уже запущен, он будет добавлен в список в течение 10 минут.

  2. Если торрент был удален, он будет удален из списка раздачи по первому запросу.

УПД 18:00 DAP-Тьма Я выложил версию для OpenSUSE. Спасибо.

Версия OpenSUSE УПД 23:15 В опубликованной версии графический интерфейс не работал.

Я так и не понял в чем ошибка, но нужный костыль нашелся.

Файлы были перезагружены.

UPD + месяц DAP-Тьма опубликовал версии для Debian, Ubuntu и Fedora. Спасибо.

Дебиан и Убунту Федора Теги: #BitTorrent #P2P #linux #Qt #консоль #Qt

Вместе с данным постом часто просматривают: