Снова появились запросы от пользователей с указанием на существование новой версии 3.2.3 движка AceStream. Но чем новее движок (engine), который только и пилят разработчики для Linux систем, то тем больше пропасть между ним и плеером. Но обо всём по порядку в статье.
Представьте на дворе 2017 год. Я нашёл проект AceStream и, как уверенный снапкрафтер, который уже потренировался на кошках, решил представить его в удобном snap формате. Почему удобном? А уже тогда было видно что разработчики AceStream что-то вяло обращают внимание на Linux системы и более-менее нормально будет с движком, но не с плеером на базе патченного VLC 2.
Бодрый и динамичный мир разработки софта в Linux экосистеме очень суров и беспощаден к сторонним разработчикам. Чтобы через механизм репозиториев им представить своё детище, они обязаны отслеживать и актуализировать зависимости своего программного продукта. Вчера в условном Debian были Python2, GTK2, Qt4, а сегодня Python3, GTK3 и Qt5.
Рекомендую прочесть статью про активный драйв в мире Линукс - Разработчики GTK хотят разрушить Linux desktop. Обратная совместимость? Поддержка на 30 лет нескольких альтернативных версий? Нет, не слышали - это к Microsoft.
Snap из-за своей самодостаточности и независимости от наличия чего-либо в операционной системе Linux (не обязательно Ubuntu), может предложить способ упаковки программы вместе с её зависимостями. Пройдут годы, сменятся версии библиотек, тулкитов, фреймворков, но программа будет работать.
В те годы сама технология snap делала первые шаги и только на горизонте маячили идеи, как быть с тяжёлыми по размеру фреймворками, библиотеками, рантаймом и т.д. Тащить их внутрь snap пакета с программой, радости мало. Элегантный выход был найден и это коннекты между snap пакетами.
Но это было позже того как я сел паковать acestream в snap. То есть в те далёкие года мне безальтернативно пришлось упаковать две программы (плеер и движок версии 3.0.х) вместе с необходимым им в едином snap пакете.
Официальный скриншот программы AceStreamPlayer в Ubuntu Store. Бородатые годы выдаёт графическая среда Unity.
Шли годы. Движок развивался, а плеер, как заброшенное дитя, стал похож на якорь, который забыли поднять со дна перед выходом в море. Люди просили представить новую версию AceStreamPlayer в snap. Обновил версию движка, добавил третьего игрока в лице MPV, возможность использовать ALSA напрямую, навёл визуальный лоск для всё стареющего плеера на базе VLC 2 (qt4) в различных графических рабочих средах типа KDE (мир современного Qt), Xfce (GTK2), GNOME (мир эталонного GTK) и т.д. Через API AceStream для удобства пользователя формируется плейлист playlist_acestream.m3u с различными каналами (~2800 шт.).
В данный период была предпринята нужная, но сложная процедура внедрения механизма аппаратного ускорения с помощью GPU хоста внутри snap пакета, где программы работают в изоляции под присмотром обязательных профилей AppArmor.
Требовалось тщательное тестирование, а у меня нет технической возможности создать многочисленные аппаратные стенды из всех сочетаний основных игроков на рынке видеокарт, их свободных/закрытых видеодрайверов, актуальных архитектур и т.д. Кое как проверил работу аппаратного ускорения на доступных мне видеокартах Intel, NVidia, AMD не-помню-ни-названия-ни-версии. В целом, это решение было тяжёлое, но его нужно было принять. Разрешение в пикселях медиаконтента традиционно ползёт только вверх. Джинна всё равно нужно было выпускать из бутылки.
С 2019 года именно эта версия 3.1.x была основной рабочей лошадкой.
На момент написания статьи доступно на официальном сайте два тарбола: acestream_3.2.3_ubuntu_22.04_x86_64_py3.10.tar.gz и acestream_3.2.3_ubuntu_18.04_x86_64_py3.8.tar.gz.
Я немного обрадовался версии с Ubuntu 18.04, так как текущая упаковка основана на core18 и для плеера меньше хлопот собрать необходимое ему в загробной жизни для нормальной работы. Но жизнь частенько приподносит сюрпризы. Анализ файлов install_dependencies_gui.sh, install_dependencies.sh, requirements.txt внутри тарболов вроде ясно объяснял какие именно пакеты нужны для работы движка и что нужно установить через pip.
Для работы GUI движка нужен пакет python3-gi, но при старте движка выводится сообщение об ошибке:
ImportError: _gi.cpython-38-x86_64-linux-gnu.so: undefined symbol: g_assertion_message_cmpint
Я не настолько спец по Питону, гуглёж проблемы ни к чему внятному не приводил. Выяснил что системный пакет python3-gi и PyGObject через pip это одно и тоже. Попробовал пойти путём установки через pip вместо системного пакета python3-gi, но получил ошибку от GUI движка что не найден gi.
Убив достаточно времени, плюнул на всё и решил попробовать собрать версию из тарбола acestream_3.2.3_ubuntu_22.04_x86_64_py3.10.tar.gz. Оказалось что использование core22 вместо core18 заставляет использовать топовую версию инструмента упаковки snapcraft 8. Но на удивление проблемы с запуском GUI движка не было!
Так как движок использует современные версии Python, то хотелось бы максимально ускорить его работу. Напомню что snap пакет - это архив в формате squashfs, который просто монтируют без распаковки в систему. Поэтому любая программа внутри snap не может чисто технически ничего записать туда, откуда она стартует. Другими словами и ещё раз - откуда стартуем, то нам доступно только на чтение (readonly).
Python по умолчанию при первом старте программы пытается создать для последующего ускорения *.pyc файлы с байт-кодом в том каталоге где находится программа, а туда писать невозможно! С версии питона 3.8 появилась переменная PYTHONPYCACHEPREFIX, с помощью которой можно указать доступную на запись папку. В моём стартовом run.sh скрипте, который вы можете изучить по адресу /snap/acestreamplayer/current/bin/run.sh, есть строка
export PYTHONPYCACHEPREFIX="$SNAP_USER_COMMON/.cache/"
Переменная $SNAP_USER_COMMON указывает на ~/snap/acestreamplayer/common/ и там после первого старта программы вы сможете найти *.pyc в подпапках .cache/Python-Eggs/ и .cache/usr/
Движок на современном Python быстр настолько, насколько это возможно!
Впереди была трудная задача организовать работу старого плеера VLC 2 в такой резко обновлённой среде для него как Ubuntu 22.04.
Поставил в виртуальной среде Ubuntu 22.04 и наваял bash скрипт, который, вызывая в цикле команду LANG=C apt show "^${name_pkg}$" 2>&1 | grep -F 'Maintainer'`
, проверил огромный список требуемых deb пакетов для VLC 2 на предмет доступности в официальных репозиториях 22.04. На выходе получил списки: good.txt и bad.txt.
Имена deb пакетов из good.txt, ещё доступные в Ubuntu 22.04, были просто добавлены в stage-packages, чтобы snapcraft их упаковал сам при сборке. Требуемые deb пакеты из bad.txt ещё одним bash скриптом были выкачены из официального репозитория в виртуальной машине с Ubuntu 18.04 и распакованы, чтобы стать частью той папки где обитает плеер на сборочном сервере. С помощью такой-то матери удалось слепить для старого VLC 2 в новой среде всё что ему нужно для работы. Я был приятно удивлён что плеер вообще запустился в новой среде.
Рад что удалось перейти на использование core22, как фундамента на долгие годы. Не знаю планов Canonical и сроков поддержки ими всех своих snap пакетов с рантаймом core* (Runtime environment based on Ubuntu *), но, учитывая что до сих пор активно обновляется core18, думаю что до 2030 года точно не стоит беспокоиться за устаревание core22 и за работоспособность AceStreamPlayer.
Ниже в цифрах вы увидите что эпопея с упаковкой AceStream в snap началась 7 лет назад в 2017 году. Не устану повторять что можно не любить snap, но если автор программы активно не обновляет программу вслед за изменениями в репозиториях основных линус дистрибутивов, то мало что ещё может спасти программу от забвения. Согласен, что старенький плеер с поддержкой торрентов (AceStream Content ID) лучше и безопаснее не становится на фоне движка и ещё одного плеера MPV, но он худо-бедно работает!
Знаковые вехи
Если у вас Убунту, то вам сразу доступна в графических установщиках и/или через CLI - sudo snap install acestreamplayer
возможность поставить пакет без лишних телодвижений.
Если у вас дистрибутив Linux, который поддерживает установку snapd, то на сайте проекта snapcraft.io вы можете ознакомиться с мини-инструкцией для вашего дистрибутива как поставить нужное.
Например, следующие команды для установки AceStream в Fedora из инструкции https://snapcraft.io/install/acestreamplayer/fedora
sudo dnf install snapd
sudo reboot
sudo ln -s /var/lib/snapd/snap /snap
sudo snap install acestreamplayer
acestreamplayer.engine --client-console
acestreamplayer -v
MPV не обладает возможностями в GUI по аналогии с патченным VLC, но в Терминале вы сможете указывать как InfoHash, так и AceStream CID - acestreamplayer.mpv [infohash] or [acestream://CID]
Более подробно acestreamplayer.mpv --help
Дополнительные материалы:
Мои snap пакеты.
Мои статьи о технологии snap и её конкурентах.
AceStreamPlayer в snap.
Новая версия AceStreamPlayer в snap.