Нативное приложение macOS для поиска тредов, скачивания вложений и наблюдения за новыми файлами. SwiftUI отвечает за окно, отдельный Python-процесс — за сеть, очередь и базу. Терминальный интерфейс 6.0 также поддерживается.
Источник данных — 4chan. Threadgoon — независимое приложение. JSON API использует общую очередь с интервалом не менее секунды, условными запросами и обработкой ограничений сервера.
Первая тестовая сборка: Apple Silicon, macOS 14+.
- Распакуйте
dist/Threadgoon-6.1.0-arm64.zipили откройтеdist/Threadgoon.app. - Выберите рабочую папку. На текущем компьютере можно выбрать существующую папку проекта
threadgoon, чтобы продолжить работу с данными 6.0. - Выберите доски, введите запрос и нажмите «Найти».
- Выберите треды (⌘ и ⇧ для нескольких), нажмите «Скачать выбранное», подтвердите количество файлов и объём.
Python встроен в .app; устанавливать Python, зависимости или исходники на другом Mac не нужно. Приложение можно перенести независимо от исходного проекта. Рабочую папку переносите отдельно, если нужны история и незавершённые загрузки.
Тестовая сборка имеет локальную ad hoc подпись, без Developer ID и нотарификации. macOS может запросить разрешение на открытие. Публичная подпись и нотарификация — отдельный этап выпуска. Сборка проверяется на текущей macOS 26; совместимость с macOS 14 требует отдельного запуска на этой версии.
Для публичного распространения потребуется участие в Apple Developer Program, сертификат Developer ID Application, подпись встроенных исполняемых файлов и библиотек, Hardened Runtime, отправка сборки на нотарификацию и прикрепление полученного ticket. После этого нужны проверка Gatekeeper на другом Mac и отдельная проверка macOS 14. Требования описаны в документации Apple; текущий скрипт выпускает только тестовую сборку.
- Быстрый поиск читает только каталоги и ищет по доске, ID, названию и описанию.
- Точный поиск включается в фильтрах и проверяет посты и вложения каждого треда. Результаты появляются постепенно; доступны пауза, продолжение и отмена.
- Несколько ключевых слов через запятую означают совпадение хотя бы одного слова.
- Фильтры расширений, размеров и области ключевых слов применяются при уточнении и подготовке скачивания. В быстром режиме они не отсекают строки каталога.
- Ссылку на тред можно вставить в строку поиска. Вложения уточняются при выборе треда.
- Размер из каталога неизвестен; оценка количества файлов явно подписана. Сохранённые данные при отсутствии сети также отмечены. Подготовка скачивания требует подтверждения состава файлов через сеть.
- Миниатюры появляются по мере просмотра строк и кэшируются в рабочей папке. Spoiler-изображения скрыты. Скачанные файлы открываются обычными приложениями macOS или показываются в Finder.
Раздел «Загрузки» содержит текущую очередь и фильтры завершённых заданий/ошибок. Загрузка запускается после подтверждения. Пауза и продолжение объединены; отмена действует на выбранные задания. Ошибки можно повторить, новые найденные файлы без автозагрузки — подтвердить отдельно.
Загрузка использует .part, HTTP Range и проверку размера. При выходе незавершённые задания сохраняются; после запуска нажмите «Продолжить». Повторное добавление активных заданий не создаёт дублирующую загрузку.
Наблюдение работает, пока приложение запущено, в том числе при закрытом главном окне. ⌘Q завершает движок и останавливает наблюдение. Автозагрузка по умолчанию выключена и включается отдельно для каждого наблюдения. Завершённые/недоступные треды не опрашиваются бесконечно.
Настройки открываются через меню Threadgoon → Settings… / ⌘,, справка и диагностика — через Help. Поддерживаются системная, светлая и тёмная темы. Смена рабочей папки и основных настроек доступна после остановки операций.
.threadgoon/config.toml
.threadgoon/state.sqlite3
.threadgoon/state.lock
.threadgoon/backups/
.threadgoon/cache/
.threadgoon/logs/
.threadgoon/tmp/
output/
Все рабочие данные находятся внутри выбранной папки. Исходники и pyproject.toml для этой папки не требуются. macOS запоминает только путь к последней выбранной папке в системных preferences приложения.
Перед обновлением схемы базы 6.0 сохраняются резервные копии SQLite и config.toml в .threadgoon/backups/. История, наблюдения, скачанные файлы и .part сохраняются на месте. Блокировка не позволяет двум движкам одновременно открыть одну рабочую папку. Пути за пределами рабочей папки, включая выход через символические ссылки, отклоняются.
Данные со схемой 6.1 нельзя открывать старым движком 6.0. Для возврата сохраните текущие данные отдельно и восстановите пару базы/конфигурации из резервной копии при закрытом приложении.
Нужны Python 3.11+, Swift 6 с Command Line Tools (или Xcode) и Apple Silicon Mac. Xcode для сборки окна не обязателен.
python3 -m venv .venv
.venv/bin/python -m pip install -e '.[dev]' -r packaging/requirements-build.txt
.venv/bin/python scripts/build_macos.pyСкрипт собирает SwiftUI, замораживает Python с PyInstaller в режиме onedir, вкладывает движок и сертификаты HTTPS в .app, подписывает тестовую сборку и создаёт ZIP. Кэши сборки находятся в .build/. Внешние данные из рабочей папки в .app не включаются.
Формат упаковки описан в документации PyInstaller. Лимиты API и условные запросы соответствуют правилам 4chan API.
Для запуска из исходников:
THREADGOON_DEV_ROOT="$PWD" .build/native/debug/ThreadgoonПеременная THREADGOON_DEV_ROOT используется только при разработке. Собранный .app находит движок относительно собственного bundle и не зависит от .venv.
.venv/bin/python -m pytest
.venv/bin/python scripts/test_native.py
.venv/bin/python scripts/smoke_bundle.pytest_native.py вызывает swift test, включая проверку реального обмена Swift/Python. Он находит Swift Testing как в Xcode, так и в Command Line Tools. smoke_bundle.py переносит .app в временную папку с пробелами и проверяет запуск замороженного движка при отсутствующих PYTHONHOME и PYTHONPATH.
Автоматические тесты не обращаются к живому API и не скачивают реальные медиа. Для ручного тестирования очереди есть отдельная disposable-папка и сервер на loopback:
.venv/bin/python scripts/ui_fixture.py --workspace "$PWD/.build/manual-fixture"Не выбирайте существующую рабочую папку для fixture. Опция --live дополнительно читает список досок, один каталог /po/ и один тред для проверки миниатюр и деталей; массовой загрузки медиа она не выполняет. После проверки завершите приложение и сервер через Ctrl+C.
Терминальный запуск сохранён:
.venv/bin/threadgoon
.venv/bin/threadgoon https://boards.4chan.org/gif/thread/123456
.venv/bin/threadgoon --versionПротокол движка описан в docs/protocol.md.
MIT. См. LICENSE.