ActivityPub и протокол Fediverse
Эта страница документирует реализацию ActivityPub внутри Owncast на уровне протокола: какие действия сервер отправляет, какие он принимает, как он идентифицирует себя и как он подписывает и проверяет запросы. Это предназначено для разработчиков, которые хотят создать приложение Fediverse, которое взаимодействует с Owncast, независимо от того, означает ли это следование за сервером Owncast с другой платформы, получение его уведомлений в реальном времени или создание инструментов, которые понимают пользовательские расширения Owncast.
Если вы оператор Owncast и просто хотите включить федерацию, посмотрите на Федиверс и Включение социальных функций вместо этого. Эта страница предполагает знакомство с ActivityPub, ActivityStreams 2.0, JSON-LD и HTTP-подписями.
Ментальная модель
Сервер Owncast федеративируется как один актер типа Service. На каждый сервер существует одна учетная запись (имя пользователя по умолчанию live), и она представляет собой сам поток, а не человека. По сравнению с универсальным социальным сервером, модель намеренно узкая:
- Актер отправляет посты своим подписчикам (в первую очередь, уведомление о "выходе в эфир") и периодическое "пинг" потока.
- The actor receives follows, likes, boosts (announces), replies and mentions, quote requests, and a handful of server-to-server activities. Inbound posts are only surfaced to the operator and plugins: they are never added to a timeline and never re-federated.
- Существует ровно один пользователь, нет открытой регистрации, и коллекция
followingвсегда пуста.
Все конечные точки федерации возвращают 405 Method Not Allowed, когда федерация отключена, поэтому сначала проверьте это, если сервер кажется недоступным.
Обнаружение
Удаленное приложение находит и описывает актера Owncast через стандартные механизмы обнаружения well-known.
WebFinger
GET /.well-known/webfinger?resource=acct:{username}@{host}
resource должен быть acct: URI, хост которого совпадает с запланированным хостом сервера (в противном случае запрос отклоняется с 501/400). Ответ предоставляется в виде application/jrd+json:
{
"subject": "acct:live@owncast.example.com",
"aliases": ["https://owncast.example.com/federation/user/live"],
"links": [
{
"rel": "self",
"type": "application/activity+json",
"href": "https://owncast.example.com/federation/user/live"
},
{
"rel": "http://webfinger.net/rel/profile-page",
"type": "text/html",
"href": "https://owncast.example.com/federation/user/live"
},
{
"rel": "http://webfinger.net/rel/avatar",
"type": "image/png",
"href": "https://owncast.example.com/logo/external"
},
{
"rel": "alternate",
"type": "application/x-mpegURL",
"href": "https://owncast.example.com/hls/stream.m3u8"
}
]
}
Ссылка self является каноническим актором IRI. Обратите внимание на специфическую для Owncast ссылку alternate типа application/x-mpegURL: она указывает напрямую на плейлист HLS для потока, что позволяет клиентам обнаруживать живое видео без сканирования веб-интерфейса.
host-meta
GET /.well-known/host-meta
Возвращает документ XRD, указывающий назад на конечную точку WebFinger, для клиентов, которые загружаются из host-meta:
<?xml version="1.0" encoding="UTF-8"?>
<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
<Link rel="lrdd" type="application/json"
template="https://owncast.example.com/.well-known/webfinger?resource={uri}"/>
</XRD>
NodeInfo
Owncast предоставляет метаданные на уровне сервера через NodeInfo, чтобы краулеры Fediverse, каталоги и статистические сайты могли описывать экземпляр.
Обнаружение NodeInfo — GET /.well-known/nodeinfo:
{
"links": [
{
"rel": "http://nodeinfo.diaspora.software/ns/schema/2.0",
"href": "https://owncast.example.com/nodeinfo/2.0"
}
]
}
NodeInfo 2.0 — GET /nodeinfo/2.0:
{
"version": "2.0",
"software": {
"name": "owncast",
"version": "0.2.x"
},
"protocols": ["activitypub"],
"services": {
"inbound": [],
"outbound": []
},
"usage": {
"users": {
"total": 1,
"activeMonth": 1,
"activeHalfyear": 1
},
"localPosts": 42
},
"openRegistrations": false,
"metadata": {
"chat_enabled": true,
"federation": {
"username": "live",
"featured_streams": 1
}
}
}
Большая часть этого является стандартным NodeInfo, с несколькими специфическими для Owncast сигналами, которые стоит назвать:
software.nameвсегдаowncast. Это самый надежный способ определить, что вы общаетесь с сервером Owncast.usage.users.totalвсегда1, аopenRegistrationsвсегдаfalse— экземпляр Owncast является сервером с одним актером, а не много пользовательной общиной.usage.localPostsэто количество действий, которые сервер отправил (уведомления о выходе в эфир и другие публичные сообщения), что является полезным индикатором активности потока.metadata.chat_enabledотражает, включен ли встроенный чат Owncast.metadata.federationэто специфический для Owncast блок:username— это предпочтительное имя актера (по умолчаниюlive). В сочетании с хостом это дает вамacct:ручку без дополнительных запросов WebFinger.featured_streamsуказывает на участие в потоке отмеченных потоков / мини-каталоге (см. Потоковые пинги ниже). Значение1означает, что сервер сообщает о своем живом статусе подписчикам через периодические действияOffer.
x-nodeinfo2 — GET /.well-known/x-nodeinfo2 предоставляет ту же информацию в альтернативной форме x-nodeinfo2, используемой некоторыми каталогами, включая блок organization (name, contact) и показатель activeWeek пользователя. Здесь services.inbound/services.outbound оба ["activitypub"].
API экземпляра Mastodon — GET /api/v1/instance возвращает описание совместимого с Mastodon экземпляра (uri, title, short_description, description, version, thumbnail, stats и флаги регистрации), чтобы инструменты, осведомленные о Mastodon, могли отобразить знакомую карточку экземпляра. stats.user_count это 1, stats.status_count это количество локальных постов, а регистрации/одобрения/приглашения все отключены.
Актер
GET /federation/user/{username}
Accept: application/activity+json
Запрос актера IRI с заголовком Accept ActivityStreams возвращает документ актера. Owncast представляет себя как Service (а не как Person). Форма:
{
"@context": [
"https://www.w3.org/ns/activitystreams",
"https://w3id.org/security/v1"
],
"type": "Service",
"id": "https://owncast.example.com/federation/user/live",
"preferredUsername": "live",
"name": "My Owncast Server",
"summary": "Server description / bio",
"url": "https://owncast.example.com/federation/user/live",
"published": "2023-01-01T00:00:00Z",
"manuallyApprovesFollowers": false,
"discoverable": true,
"inbox": "https://owncast.example.com/federation/user/live/inbox",
"outbox": "https://owncast.example.com/federation/user/live/outbox",
"followers": "https://owncast.example.com/federation/user/live/followers",
"icon": {
"type": "Image",
"mediaType": "image/png",
"url": "https://owncast.example.com/logo/external?uc=..."
},
"image": {
"type": "Image",
"url": "https://owncast.example.com/logo/external?uc=..."
},
"tag": [
{
"type": "Hashtag",
"name": "#owncast",
"href": "https://owncast.directory/tags/owncast"
}
],
"attachment": [
{
"type": "PropertyValue",
"name": "Website",
"value": "<a href=\"...\">...</a>"
}
],
"publicKey": {
"id": "https://owncast.example.com/federation/user/live#main-key",
"owner": "https://owncast.example.com/federation/user/live",
"publicKeyPem": "-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----"
}
}
Ключевые моменты для совместимого внедрения:
- Макет IRI актера — это
{server}/федерация/user/{username}, а коллекции привязаны к нему:{actor}/inbox,{actor}/outbox,{actor}/followers. followingзапрашивается по адресу{actor}/following, но всегда возвращает404— Owncast никогда не раскрывает список подписок.manuallyApprovesFollowersотражает, находится ли сервер в режиме приватной федерации. Еслиtrue, подписки не принимаются автоматически.discoverableвсегдаtrue(с использованием семантики пространства именtoot:).- Общедоступный ключ находится по адресу
{actor}#main-key, является RSA-2048 ключом в формате PEM (PKIX) и используется для проверки HTTP-подписей сервера.
HTTP-подписи
Owncast как подписывает свои исходящие запросы, так и проверяет входящие с использованием схемы заголовков "Signature" HTTP (draft-cavage HTTP signatures, как используется по всему Fediverse).
Проверка запросов, которые Owncast отправляет вам
Когда Owncast POST отправляет действие в ваш почтовый ящик, оно включает:
- Заголовок
SignatureсkeyId="{actor}#main-key",algorithm="rsa-sha256"и списком подписанныхheaders. - Подписанные заголовки охватывают
(request-target),host,dateиdigest. - Заголовок
Digest, содержащий SHA-256 дайджест тела запроса. Content-Type: application/activity+jsonиUser-Agentформата{version}; https://owncast.online.
Чтобы проверить: получите актера по keyId, прочитайте publicKey.publicKeyPem и проверьте как подпись, так и дайджест тела.
Подписывание запросов, которые вы отправляете Owncast
Owncast проверяет подпись на каждое действие, доставляемое в его почтовый ящик:
- Он разбирает
keyIdиalgorithmиз вашего заголовкаSignature.keyIdдолжен быть URL-адресомhttps://. - Он разрешает вашего актора и получает ваш открытый ключ.
- Он проверяет, что домен, принадлежащий вашему ключу, не находится в списке заблокированных доменов экземпляра и что сам актер не заблокирован.
- Он проверяет подпись, пробуя указанную алгоритм и затем падением на
rsa-sha256иrsa-sha512. - Он проверяет заголовок
Digestотносительно тела запроса. - If your request carries a parseable
Dateheader, it must be close to the server's clock: a date more than 1 hour in the past or more than 1 hour in the future is rejected. This bounds replay of captured, validly-signed requests. A missing or unparseableDateskips the check.
На практике это означает: подписать (request-target) host date digest с RSA-ключом, опубликовать этот ключ в поле publicKey вашего актера, включить SHA-256 Digest и обслуживать вашего актера через HTTPS.
Действия, которые отправляет Owncast (исходящие)
Все исходящие действия исходят от актера сервера и доставляются в почтовые ящики подписчиков (предпочитая sharedInbox, где подписчик это рекламирует). Публичные действия адресуются https://www.w3.org/ns/activitystreams#Public в to, а коллекция подписчиков в cc; в частном режиме они адресованы только коллекции подписчиков.
| Действие | Объект | Когда | Отправлено в |
|---|---|---|---|
Create | Note | Поток становится живым (сообщение "выхода в эфир"); другие публичные посты | Подписчики (+ Публичные) |
Update | Service | Профиль сервера (имя, аватар, резюме и т.д.) изменения | Подписчики |
Follow | актер IRI | Оператор подписывается на другой сервер Owncast (поток, отмеченный в каталоге) | Целевой сервер |
Offer | URL сервера | Периодически во время эфира, как "пинг" потока | Подписчики каталога |
Accept | входящий Follow | В ответ на полученный Follow | Подписчик |
Reject | inbound Follow | Когда оператор удаляет каталог, который указывал на этот сервер | Этот каталог |
Покинуть | server URL | The stream ends (the offline counterpart to Offer) | Directory followers |
Undo | Подписаться | An operator unfeatures an Owncast server they previously followed | The target server |
Accept / Reject | inbound QuoteRequest | In response to a received QuoteRequest | The requester |
Создать / Заметка — выход в эфир
Самая важная деятельность. Когда поток становится живым, Owncast отправляет Create, обернув его в Note. Note содержит HTML content (настраиваемое сообщение при выходе в эфир, название потока, ссылки на хэштеги и ссылку обратно на сервер), теги Hashtag и — когда это доступно — вложение Image с предпросмотром потока (preview.gif или thumbnail.jpg). Если сервер отмечен NSFW, заметка содержит sensitive: true. Хэштеги ссылаются на https://owncast.directory/tags/{tag}, а хэштег #owncast всегда добавляется.
Это действие, о котором больше всего заботятся потребители: подписывайтесь, следуя за актером, а затем наблюдайте за входящим потоком Create/Note, чтобы узнать, когда начинается поток.
Предложение / поток пинг (исходящий)
Это расширение Owncast, которое поддерживает функцию отмеченных потоков / мини-каталога. Во время эфира сервер периодически отправляет деятельность Offer, объектом которой является URL сервера, неся пользовательские метаданные Owncast (статус потока, заголовок, описание, имя сервера, логотип, теги). Это позволяет получающему каталогу поддерживать свой список живых потоков свежим без опроса. The matching offline signal is the Leave activity, sent when the stream ends. Owncast отправляет Offer и Leave только подписчикам, которые идентифицировали себя как каталог (см. пользовательское пространство имен), никогда обычным фан-подписчикам.
Обновление, Подписка, Принять
UpdateактораServiceотправляется подписчикам, когда метаданные профиля сервера изменяются, чтобы удаленные кэши обновлялись.Followотправляется, когда оператор подписывается на другой сервер Owncast. Сервер затем ожидаетAccept(илиReject) обратной связи.Принятьотправляется автоматически в ответ на входящийПодписаться, когда сервер находится в общедоступном (авто-одобрение) режиме.
События, которые получает Owncast (входящие)
Доставьте их, отправив подписанную активность в inbox актера. The inbox returns 202 Accepted immediately and processes the activity asynchronously, so a 202 only means the activity was queued, not that it was acted on. Owncast signature-verifies and dispatches each one from that queue.
| Активность | Обработка |
|---|---|
Follow | Сохраняет подписчика; автоматически одобряет и возвращает Принять в общедоступном режиме (задерживается на одобрение в частном режиме). Подписка, несущая маркер ns#directory, всегда ожидает ручного одобрения независимо от режима и не генерирует событие подписки. В противном случае генерирует событие FediverseEngagementFollow. |
Отменить → Подписаться | Удаляет подписчика. |
Нравится | Записывает вовлеченность в локальный объект. Генерирует FediverseEngagementLike. |
Объявить | Повышает/перепостивает локальный объект. Записывает вовлеченность и генерирует FediverseEngagementRepost. |
Принять → Подписаться | Отмечает удалённый сервер Owncast, за которым мы следим, как принятый (поток рекомендуемых). |
Отклонить → Подписаться | Отмечает нашу подписку на удалённый сервер как отклонённую. |
Предложить | Пинг потока с другого сервера Owncast. Если он несёт streamStatus: "live", Owncast помечает этот сервер как онлайн в своей таблице федерации и сохраняет метаданные потока. |
Leave | Оффлайн аналог Предложить: помечает поток удалённого сервера Owncast как оффлайн. |
Update → Person | Обновления сохранённых метаданных (имя для отображения, inbox, общий inbox, аватар) для существующего подписчика. Updates with any other object type are ignored. |
Create → Note | Accepted when the object is a single Note attributed to the signing actor and the note is either a reply to a post this server published or addressed to the actor (a mention). Raised as an event for the operator and plugins, not added to any timeline. See inbound posts. |
QuoteRequest | A FEP-044f request to quote one of the server's posts. Accepted only for locally authored posts while federation is public and quotes are enabled. Answered with Accept or Reject. See quote requests. |
Два важных условия:
- Возраст вовлеченности. Активности
НравитсяиОбъявитьзаписываются только если привязанный объект не старше 36 часов. Старая вовлеченность игнорируется. Это помогает связать уведомления о вовлечении с недавними потоками. - Блокировка и SSRF. Входящие активности от заблокированных доменов/актеров отклоняются во время проверки подписи. Исходящие доставки отклоняют URL-адреса inbox, не соответствующие HTTPS и внутренние/обратные.
Inbound posts (Create)
Earlier releases rejected every inbound Create. Owncast 0.3.0 accepts the narrow cases described here.
Owncast accepts a Create whose object is exactly one Note attributed to the same actor that sent it. It keeps two kinds of notes: replies to a post the server itself published, and notes that address the actor directly (mentions). Everything else is ignored. An accepted post is raised as a reply or mention event for the operator's integrations and plugins. It is not added to a timeline, is not shown to viewers, and is never re-federated, so there is still no public conversation surface on an Owncast server.
Quote requests (FEP-044f)
QuoteRequest handling is new in Owncast 0.3.0.
A remote user asking permission to quote one of the server's posts sends a FEP-044f QuoteRequest whose object is the post being quoted and whose instrument is the quote post itself. Owncast accepts the request only when the quoted object is a post this server authored, federation is in public mode, and the operator has quoting enabled. On accept it stores a QuoteAuthorization stamp as a dereferenceable object and replies with an Accept whose result is the stamp's IRI, so any server can fetch the stamp to verify the quote was approved. Every other case gets a Reject, which clears the pending quote on the remote end.
Серверные активности
Предложить, Покинуть, Принять и Отклонить вместе образуют протокол «рекомендуемых потоков» Owncast. Если вы создаете каталог или агрегатор, который хочет участвовать, схема такова:
- Send a
Followthat sets thens#directorymarker (see the custom namespace) to the Owncast server's actor. Оператор вручную одобряет это, затем ожидайтеПринять. - Получайте периодические активности
Предложить(с метаданными Owncast), пока сервер в онлайне. - Получите
Покинуть, когда поток заканчивается.
Вы в равной мере можете использовать только стандартные сообщения Создать/Запись, если вам не нужны пинги живности в реальном времени.
Пользовательский пространственный именной Owncast
Owncast добавляет небольшой набор свойств JSON-LD с префиксом https://owncast.online/ns#. Свойства метаданных потока появляются как дополнительные верхние уровни полей в активностях Предложить (и связанных с сервером) и позволяют получателю заполнять запись каталога из одной активности. Маркер ns#directory появляется на Подписаться и идентифицирует отправителя как каталог. Все они являются необязательными и безопасными для игнорирования, если вам интересен только стандарт ActivityPub.
| Свойство | Тип | Значение |
|---|---|---|
https://owncast.online/ns#streamStatus | строка | "live" или "offline". Всегда присутствует при серверных активностях. |
https://owncast.online/ns#streamTitle | строка | Текущее название потока, когда установлено. |
https://owncast.online/ns#streamDescription | строка | Резюме / описание сервера. |
https://owncast.online/ns#serverName | строка | Читаемое имя сервера. |
https://owncast.online/ns#logoUrl | строка | Абсолютный URL-адрес логотипа сервера. |
https://owncast.online/ns#thumbnailUrl | строка | Абсолютный URL-адрес миниатюры текущего потока. |
https://owncast.online/ns#streamTags | массив строк | Теги метаданных сервера. |
https://owncast.online/ns#directory | логический | Установлено в true на Подписаться, чтобы идентифицировать отправителя как каталог. |
Каталог сам идентифицирует себя, устанавливая ns#directory в true на отправленном Подписаться. Этот маркер и только этот маркер заставляет Owncast рассматривать подписку как каталог: он удерживает подписку для одобрения оператора, и после одобрения отправляет Предложить и Покинуть пинги потока этому подписчику. Поля метаданных потока выше носят описательный характер и сами по себе не идентифицируют каталог.
Создание каталога потоков Owncast
Серверные активности, которые поддерживают собственную функцию рекомендуемых потоков Owncast, открыты для вас. Если вы хотите запустить каталог или агрегатор, который отслеживает, какие серверы Owncast в онлайне, вы следуете за каждым сервером, как это делает любой актер Fediverse, а затем реагируете на сигналы живности, которые он отправляет.
Для полного рабочего примера обратитесь к репозиторию owncast-directory-example. Это небольшое приложение на Python, которое реализует все в этом разделе: опубликованный актер, подписка ns#directory, обработка Предложить/Покинуть/Отклонить, и веб-страница, на которой перечислены живые серверы. Считайте его отправной точкой, а не производственной службой.
Вам нужен опубликованный актер и подписанные запросы, так же как и любому подписчику (см. HTTP подписи). Отсюда:
- Send a signed
Followthat setshttps://owncast.online/ns#directorytotrue(see the custom namespace) to each server's actor. Этот маркер идентифицирует вас как каталог, что и заставляет сервер отправить вам свои пинги потока, и он делает отображение по желанию: сервер Owncast всегда удерживает подписку каталога для одобрения своего оператора вручную, независимо от того, как настроена конфиденциальность федерации сервера. Вы не получите статуса до тех пор, пока оператор не одобрит, поэтому ожидайте, что записи останутся в ожидании, пока каждая из них не согласится. Подписка без маркера обрабатывается как обычная подписка фаната: ее могут автоматически принять, но она никогда не будет получать пингиПредложить/Покинуть. - Во время живого потока сервер отправляет
Предложитьв ваш inbox примерно каждые 5 минут, неся метаданные пользовательского формата Owncast: статус потока, название, описание, имя сервера, логотип, миниатюра и теги. Создайте или обновите запись каталога этого сервера из этих полей. - Когда поток заканчивается чисто, сервер отправляет
Покинуть. Отметьте запись как оффлайн. - Если оператор сервера удаляет ваш каталог с их стороны, сервер отправляет
Отклонитьвашей оригинальнойПодписке. Удалите запись: вы больше не имеете права публиковать этот сервер, и он перестанет присылать вам пинги.
Встроенного механизма запроса сервера Owncast на место в вашем каталоге нет, так что составление списка — это ваша работа. Простой способ позволить операторам согласиться — это разместить форму отправки в вашем каталоге, в которой оператор вводит URL своего сервера. Вы и ваш каталог решаете, какие отправления включать, а какие отклонять. Когда вы принимаете одно, подпишитесь на этот сервер так же, как и выше. Оператор одобряет подписку, что отправитель будет ожидать, и подписка, принятие и поток пинга отображают их поток.
Считайте пинги сердцебиением. Если сервер перестанет отправлять активности Предложить без Покинуть, потому что он упал, потерял соединение или заблокирован, ничего активно не сообщает вам, что он упал. Истечите срок действия любой записи, от которой вы не слышали в течение нескольких интервалов пинга. Собственный каталог Owncast отмечает партнёра как оффлайн после двух пропущенных пингов, примерно через 11 минут, и запускает эту проверку на запоздалость раз в минуту.
Несколько вещей, которые стоит сделать правильно:
- Поля метаданных поступают с удаленного сервера, поэтому относитесь к ним как к ненадежному вводу. Ограничьте длины и подтвердите, что любой URL является
httpилиhttps, прежде чем отображать его. Значение, которому вы можете доверять, — это URL-адрес сервера, который вы выбрали для подписки, а не имя для отображения, которое отправляет сервер. - URL-адрес миниатюры и логотипа стабильны, поэтому браузер будет кешировать их. Добавьте изменяющий кэш-контрольный запрос, когда обновляете запись, если хотите, чтобы просмотр оставался актуальным.
- Вам не обязательно использовать пинги вообще. Если вам нужно только знать, что сервер начал работу, а не поддерживать текущий обзор, кто сейчас в эфире, подпишитесь на актера и следите за стандартными публикациями
Создать/Записьо начале потока, как любого другого потребителя Fediverse.
Чтобы ваше служебное решение распозналось как каталог, установите https://owncast.online/ns#directory в true на отправленной Подписаться. Сервер, который это видит, удерживает подписку для своего оператора, и, после одобрения, отправляет вам свои пинги потока.
Ссылка на конечную точку
Все пути относительны к базовому URL-адресу сервера. Каждая конечная точка возвращает 405, когда федерация отключена.
| Путь | Метод | Цель |
|---|---|---|
/.well-known/webfinger | GET | Разрешить acct: → актера IRI |
/.well-known/host-meta | GET | Указатель XRD на WebFinger |
/.well-known/nodeinfo | GET | Документ обнаружения NodeInfo |
/nodeinfo/2.0 | GET | Метаданные сервера NodeInfo 2.0 |
/.well-known/x-nodeinfo2 | GET | метаданные сервера x-nodeinfo2 |
/api/v1/instance | GET | Описание совместимого с Mastodon инстанса |
/federation/user/{username} | GET | Документ актера Служба |
/federation/user/{username}/inbox | POST | Доставка активностей на сервер |
/federation/user/{username}/outbox | GET | Коллекция активностей, отправленных сервером |
/federation/user/{username}/followers | GET | Пагинированная коллекция подписчиков |
/federation/user/{username}/following | GET | Всегда 404 (нет списка подписок) |
/federation/{object-id} | GET | Получить один сохраненный объект ActivityPub |
Создание совместимого приложения — контрольный список
Чтобы следовать и использовать поток Owncast из вашего собственного приложения:
- Разрешите дескриптор с помощью WebFinger (
acct:live@host), чтобы получить IRI актера, затем получите актера сAccept: application/activity+json. - Опубликуйте своего собственного актера с
publicKey, доступного по HTTPS, с доступнымinbox. - Отправьте подписанный
Followвinboxактера. Подпишите(request-target) host date digestс помощью RSA и включите SHA-256Digest. - Обработайте
Accept, который Owncast отправляет обратно в вашinbox(публичный режим) — или дождитесь вручную одобрения (приватный режим). - Слушайте публикации о начале трансляции: активности
Create/Note, приходящие в вашinbox, сообщают о начале потока;alternate/application/x-mpegURLссылка WebFinger предоставляет вам HLS URL для воспроизведения. - При желании действуйте как каталог: установите
https://owncast.online/ns#directoryвtrueна вашемFollow, получите одобрение оператора, а затем обрабатывайтеOffer/Leaveуведомления и метаданныеhttps://owncast.online/ns#*для реального времени и более богатых записей каталога. - Проверьте подпись на всем, что Owncast отправляет вам, по сравнению с
#main-keyактера.
Owncast accepts replies and mentions only as notifications for the operator and plugins: they are never threaded, displayed, or re-federated, and the server exposes no following list. Design your integration around following + notifications + likes/boosts rather than two-way conversation.
Improve this page
See something missing or incorrect? Edit this page and improve the documentation for everyone.
