День рождения 41
Продолжаем традицию ежегодных заметок.
Самое важное событие этого года - я разобрался с финансами и могу работать по найму только половину дня, другую половину посвящая семье и отдыху. И своим проектам, конечно.
Про личное писать нечего, там всё стабильно хорошо - домашние сыты, довольны, шёрстка лоснится. А рассказать хочется про новый личный проект.
Называется он Орбита и будет self-hosted системой для публикации своего творчества и получения денег от подписчиков. Да-да, как Boosty или Patreon, только свой личный, на собственном сервере.
Такой подход позволяет решить массу вопросов:
- Автор сам владеет всем своим контентом, никто не может его заблокировать или удалить
- Автор может выкладывать любой контент, никто его не модерирует (пока он соблюдает закон)
- Автор не платит комиссию площадке, но зато оплачивает свой сервер любой мощности
- Автор будет получать оплату на свой счёт в банке, без посредников
- Автор сам разбирается со своими налогами
А я могу релизовать все свои программистские хотелки: новейшие версии PHP, Node, Vue, Nuxt, поддержка Typescript, Socket.io и т.д. и т.п. Всё это в Docker, конечно же, чтобы можно было запустить одной командой. Заодно обновляю и тестирую vesp-core и vesp-frontend.
Самый большой вопрос, который меня беспокоил - это работа с видео.
- Файлы могут быть на много гигабайт, так что нужно грузить их частями
- Загрузка может прерываться по разным причинам - нужно уметь догружать
- Ну и скорость должна быть на уровне
Это я реализовал с помощью протокола Tus.io
После загрузки видео нужно подготовить для стриминга, и тут я провозился больше всего. Пробовал разные форматы, настройки, разбивал файлы на мелкие части, склеивал, и в итоге пришёл к самой удобной для меня схеме:
- Файл грузится во временную директорию на сервере
- Через cron запускается транскодирование через FFMPEG в разные форматы, от меньшего разрешения к большему
- Версии кодируются в формат h264, контейнер mp4, одним файлом. К ним генерируется m3u8 манифест (плейлист) в котором прописаны части видео с битрейтом
- После кодирования файлы могут быть перемещены в облако на долгосрочное хранение
- При показе файл в нужном разрешении читается не сразу весь, а кусками из манифеста, по 10 секунд
- Все запросы на показ видео проходят через API, так что можно проверять права доступа
Это, получается, формат стриминга HLS. Есть и предзагрузка, и смена потоков, и сохранение настроек проигрывания: громкость, скорость, время. На мой взгляд, работает уже лучше Boosty.
Обновление статуса кодирования, кстати, сделано через Socket.io. Фронтенд подписывается на разные события, типа изменения статуса видео, PHP отправляет обновления, и фронт их отрисовывает.
Подобным способом можно на лету обновлять что угодно сразу у всех пользователей онлайн, например, настройки сайта.
В общем, самое сложное и непонятное в проекте я уже реализовал, дальше всё по обычной схеме: создание постов, комментарии, подписки и платежи.
Проект бесплатный, надеюсь опубликовать в Open Source уже до конца года более-менее работающую версию. Ну а там дорабатывать, если будет какой-то интерес и отзывы.
Вот такой анонс на день рождения, следите за новостями!
Обновлено 09.12.2023
Орбита запущена на собственном сайте, можно щупать.
2
👍
👎
❤️
🔥
😮
😢
😀
😡
694
24.10.2023 09:23:29