Проблема
У меня телевизор, который читает файлы с USB-флешки. Флешка отформатирована в FAT32, а значит — максимум 4 ГБ на файл. Типичный вечер выглядит так:
Открыть браузер → найти торрент
Открыть KTorrent → добавить → ждать
Открыть файловый менеджер → скопировать на флешку
Упс, файл 8 ГБ → найти mkvmerge → разбить → скопировать заново
Безопасно извлечь
Пять шагов и три приложения. Мне надоело.
Решение
TorFlash — Linux-приложение на PyQt5, которое объединяет все эти шаги в одно окно:
Поиск по Rutor (с фоллбэком на зеркала), NoNaMe-Club и RuTracker (с логином и прокси)
Скачивание через libtorrent-rasterbar — параллельные загрузки, выбор файлов, возобновление
Копирование на флешку — автоматическое определение USB на
/run/media/$USER/*Умное разбиение для FAT32: MKV через
mkvmerge --split(каждая часть — воспроизводимый файл), остальные форматы — побайтовое разбиение
Как выглядит

Слева — результаты поиска, справа — карточка с постером, скриншотами и mediainfo. Прогресс встроен в карточку: синий — скачивание, зелёный — копирование.
Что ещё умеет
Библиотека и раздача
Всё скачанное остаётся в
~/Storageи раздаётся, пока приложение открытоПри перезапуске раздача восстанавливается через
resume_dataПауза/возобновление/перепроверка для каждого торрента
Детали раздачи
Постер + галерея скриншотов (парсится со страницы торрента)
Mediainfo — кодек, разрешение, аудиодорожки, длительность
График скорости в реальном времени
Статистика за день и за всё время (хранение 90 дней)
Флешка
Вкладка управления: свободное место, список файлов, удаление, открыть в FM
Безопасное извлечение через
udisksctl— показывает процесс, если устройство занято“Отложенное копирование” — если флешка вставлена позже, копирование произойдёт автоматически
Приложение
Светлая/тёмная/авто тема
Русский и английский интерфейс
Автозапуск, сворачивание в трей, лимиты скорости
Автообновление с GitHub Releases
CLI-режим для headless:
torflash_cli.pysearch "запрос"
Технические детали
Стек: Python 3.11, PyQt5, libtorrent-rasterbar, requests
Никаких BeautifulSoup или Scrapy — HTML парсится регулярками. Звучит как антипаттерн, но для конкретных сайтов с фиксированной структурой работает быстро и без лишних зависимостей.
Архитектура:
SearchWorker— скрапит HTML в отдельном потокеSeedSession— единыйlibtorrent.sessionна всё приложение, библиотека в JSONDownloadWorker— добавляет торренты в сессию, следит за прогрессомCopyWorker— стриминговое копирование с разбиениемproviders/— подключаемые провайдеры поиска (легко добавить свой)
Собирается в один бинарник через PyInstaller (~50 МБ). Не требует pip install — только системные Qt5 и glibc.
Установка
# Бинарник (рекомендуется) curl -L -o TorFlash https://github.com/steveast/torflash/releases/latest/download/TorFlash chmod +x TorFlash && ./TorFlash # Из исходников (Arch) sudo pacman -S libtorrent-rasterbar python-pyqt5 python-requests mkvtoolnix-cli git clone https://github.com/steveast/torflash.git && cd torflash python3 src/rutor_search.py