惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
宝玉的分享
宝玉的分享
Jina AI
Jina AI
IT之家
IT之家
博客园 - Franky
MyScale Blog
MyScale Blog
Y
Y Combinator Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
I
InfoQ
雷峰网
雷峰网
WordPress大学
WordPress大学
Microsoft Security Blog
Microsoft Security Blog
Google DeepMind News
Google DeepMind News
美团技术团队
S
SegmentFault 最新的问题
罗磊的独立博客
博客园 - 聂微东
大猫的无限游戏
大猫的无限游戏
H
Help Net Security
D
Docker
博客园 - 司徒正美
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
阮一峰的网络日志
阮一峰的网络日志
M
MIT News - Artificial intelligence

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания
TorFlash — приложение для Linux: поиск торрентов, скачива...
Stepan · 2026-05-26 · via Все публикации подряд на Хабре

2 мин

9.5K

Проблема

У меня телевизор, который читает файлы с USB-флешки. Флешка отформатирована в FAT32, а значит — максимум 4 ГБ на файл. Типичный вечер выглядит так:

  1. Открыть браузер → найти торрент

  2. Открыть KTorrent → добавить → ждать

  3. Открыть файловый менеджер → скопировать на флешку

  4. Упс, файл 8 ГБ → найти mkvmerge → разбить → скопировать заново

  5. Безопасно извлечь

Пять шагов и три приложения. Мне надоело.

Решение

TorFlash — Linux-приложение на PyQt5, которое объединяет все эти шаги в одно окно:

  • Поиск по Rutor (с фоллбэком на зеркала), NoNaMe-Club и RuTracker (с логином и прокси)

  • Скачивание через libtorrent-rasterbar — параллельные загрузки, выбор файлов, возобновление

  • Копирование на флешку — автоматическое определение USB на /run/media/$USER/*

  • Умное разбиение для FAT32: MKV через mkvmerge --split (каждая часть — воспроизводимый файл), остальные форматы — побайтовое разбиение

Как выглядит

screenshot

screenshot

Слева — результаты поиска, справа — карточка с постером, скриншотами и mediainfo. Прогресс встроен в карточку: синий — скачивание, зелёный — копирование.

Что ещё умеет

Библиотека и раздача

  • Всё скачанное остаётся в ~/Storage и раздаётся, пока приложение открыто

  • При перезапуске раздача восстанавливается через resume_data

  • Пауза/возобновление/перепроверка для каждого торрента

Детали раздачи

  • Постер + галерея скриншотов (парсится со страницы торрента)

  • Mediainfo — кодек, разрешение, аудиодорожки, длительность

  • График скорости в реальном времени

  • Статистика за день и за всё время (хранение 90 дней)

Флешка

  • Вкладка управления: свободное место, список файлов, удаление, открыть в FM

  • Безопасное извлечение через udisksctl — показывает процесс, если устройство занято

  • “Отложенное копирование” — если флешка вставлена позже, копирование произойдёт автоматически

Приложение

  • Светлая/тёмная/авто тема

  • Русский и английский интерфейс

  • Автозапуск, сворачивание в трей, лимиты скорости

  • Автообновление с GitHub Releases

  • CLI-режим для headless: torflash_cli.py search "запрос"

Технические детали

Стек: Python 3.11, PyQt5, libtorrent-rasterbar, requests

Никаких BeautifulSoup или Scrapy — HTML парсится регулярками. Звучит как антипаттерн, но для конкретных сайтов с фиксированной структурой работает быстро и без лишних зависимостей.

Архитектура:

  • SearchWorker — скрапит HTML в отдельном потоке

  • SeedSession — единый libtorrent.session на всё приложение, библиотека в JSON

  • DownloadWorker — добавляет торренты в сессию, следит за прогрессом

  • 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