Перейти к основному содержимому

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, каталоги и статистические сайты могли описывать экземпляр.

Обнаружение NodeInfoGET /.well-known/nodeinfo:

{
"links": [
{
"rel": "http://nodeinfo.diaspora.software/ns/schema/2.0",
"href": "https://owncast.example.com/nodeinfo/2.0"
}
]
}

NodeInfo 2.0GET /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-nodeinfo2GET /.well-known/x-nodeinfo2 предоставляет ту же информацию в альтернативной форме x-nodeinfo2, используемой некоторыми каталогами, включая блок organization (name, contact) и показатель activeWeek пользователя. Здесь services.inbound/services.outbound оба ["activitypub"].

API экземпляра MastodonGET /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 проверяет подпись на каждое действие, доставляемое в его почтовый ящик:

  1. Он разбирает keyId и algorithm из вашего заголовка Signature. keyId должен быть URL-адресом https://.
  2. Он разрешает вашего актора и получает ваш открытый ключ.
  3. Он проверяет, что домен, принадлежащий вашему ключу, не находится в списке заблокированных доменов экземпляра и что сам актер не заблокирован.
  4. Он проверяет подпись, пробуя указанную алгоритм и затем падением на rsa-sha256 и rsa-sha512.
  5. Он проверяет заголовок Digest относительно тела запроса.
  6. If your request carries a parseable Date header, 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 unparseable Date skips the check.

На практике это означает: подписать (request-target) host date digest с RSA-ключом, опубликовать этот ключ в поле publicKey вашего актера, включить SHA-256 Digest и обслуживать вашего актера через HTTPS.

Действия, которые отправляет Owncast (исходящие)

Все исходящие действия исходят от актера сервера и доставляются в почтовые ящики подписчиков (предпочитая sharedInbox, где подписчик это рекламирует). Публичные действия адресуются https://www.w3.org/ns/activitystreams#Public в to, а коллекция подписчиков в cc; в частном режиме они адресованы только коллекции подписчиков.

ДействиеОбъектКогдаОтправлено в
CreateNoteПоток становится живым (сообщение "выхода в эфир"); другие публичные постыПодписчики (+ Публичные)
UpdateServiceПрофиль сервера (имя, аватар, резюме и т.д.) измененияПодписчики
Followактер IRIОператор подписывается на другой сервер Owncast (поток, отмеченный в каталоге)Целевой сервер
OfferURL сервераПериодически во время эфира, как "пинг" потокаПодписчики каталога
Acceptвходящий FollowВ ответ на полученный FollowПодписчик
Rejectinbound FollowКогда оператор удаляет каталог, который указывал на этот серверЭтот каталог
Покинутьserver URLThe stream ends (the offline counterpart to Offer)Directory followers
UndoПодписатьсяAn operator unfeatures an Owncast server they previously followedThe target server
Accept / Rejectinbound QuoteRequestIn response to a received QuoteRequestThe 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 как оффлайн.
UpdatePersonОбновления сохранённых метаданных (имя для отображения, inbox, общий inbox, аватар) для существующего подписчика. Updates with any other object type are ignored.
CreateNoteAccepted 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.
QuoteRequestA 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)

Inbound fediverse posts require Owncast v0.3.0

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)

Quote requests require Owncast v0.3.0

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. Если вы создаете каталог или агрегатор, который хочет участвовать, схема такова:

  1. Send a Follow that sets the ns#directory marker (see the custom namespace) to the Owncast server's actor. Оператор вручную одобряет это, затем ожидайте Принять.
  2. Получайте периодические активности Предложить (с метаданными Owncast), пока сервер в онлайне.
  3. Получите Покинуть, когда поток заканчивается.

Вы в равной мере можете использовать только стандартные сообщения Создать/Запись, если вам не нужны пинги живности в реальном времени.

Пользовательский пространственный именной 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 подписи). Отсюда:

  1. Send a signed Follow that sets https://owncast.online/ns#directory to true (see the custom namespace) to each server's actor. Этот маркер идентифицирует вас как каталог, что и заставляет сервер отправить вам свои пинги потока, и он делает отображение по желанию: сервер Owncast всегда удерживает подписку каталога для одобрения своего оператора вручную, независимо от того, как настроена конфиденциальность федерации сервера. Вы не получите статуса до тех пор, пока оператор не одобрит, поэтому ожидайте, что записи останутся в ожидании, пока каждая из них не согласится. Подписка без маркера обрабатывается как обычная подписка фаната: ее могут автоматически принять, но она никогда не будет получать пинги Предложить/Покинуть.
  2. Во время живого потока сервер отправляет Предложить в ваш inbox примерно каждые 5 минут, неся метаданные пользовательского формата Owncast: статус потока, название, описание, имя сервера, логотип, миниатюра и теги. Создайте или обновите запись каталога этого сервера из этих полей.
  3. Когда поток заканчивается чисто, сервер отправляет Покинуть. Отметьте запись как оффлайн.
  4. Если оператор сервера удаляет ваш каталог с их стороны, сервер отправляет Отклонить вашей оригинальной Подписке. Удалите запись: вы больше не имеете права публиковать этот сервер, и он перестанет присылать вам пинги.

Встроенного механизма запроса сервера Owncast на место в вашем каталоге нет, так что составление списка — это ваша работа. Простой способ позволить операторам согласиться — это разместить форму отправки в вашем каталоге, в которой оператор вводит URL своего сервера. Вы и ваш каталог решаете, какие отправления включать, а какие отклонять. Когда вы принимаете одно, подпишитесь на этот сервер так же, как и выше. Оператор одобряет подписку, что отправитель будет ожидать, и подписка, принятие и поток пинга отображают их поток.

Считайте пинги сердцебиением. Если сервер перестанет отправлять активности Предложить без Покинуть, потому что он упал, потерял соединение или заблокирован, ничего активно не сообщает вам, что он упал. Истечите срок действия любой записи, от которой вы не слышали в течение нескольких интервалов пинга. Собственный каталог Owncast отмечает партнёра как оффлайн после двух пропущенных пингов, примерно через 11 минут, и запускает эту проверку на запоздалость раз в минуту.

Несколько вещей, которые стоит сделать правильно:

  • Поля метаданных поступают с удаленного сервера, поэтому относитесь к ним как к ненадежному вводу. Ограничьте длины и подтвердите, что любой URL является http или https, прежде чем отображать его. Значение, которому вы можете доверять, — это URL-адрес сервера, который вы выбрали для подписки, а не имя для отображения, которое отправляет сервер.
  • URL-адрес миниатюры и логотипа стабильны, поэтому браузер будет кешировать их. Добавьте изменяющий кэш-контрольный запрос, когда обновляете запись, если хотите, чтобы просмотр оставался актуальным.
  • Вам не обязательно использовать пинги вообще. Если вам нужно только знать, что сервер начал работу, а не поддерживать текущий обзор, кто сейчас в эфире, подпишитесь на актера и следите за стандартными публикациями Создать/Запись о начале потока, как любого другого потребителя Fediverse.

Чтобы ваше служебное решение распозналось как каталог, установите https://owncast.online/ns#directory в true на отправленной Подписаться. Сервер, который это видит, удерживает подписку для своего оператора, и, после одобрения, отправляет вам свои пинги потока.

Ссылка на конечную точку

Все пути относительны к базовому URL-адресу сервера. Каждая конечная точка возвращает 405, когда федерация отключена.

ПутьМетодЦель
/.well-known/webfingerGETРазрешить acct: → актера IRI
/.well-known/host-metaGETУказатель XRD на WebFinger
/.well-known/nodeinfoGETДокумент обнаружения NodeInfo
/nodeinfo/2.0GETМетаданные сервера NodeInfo 2.0
/.well-known/x-nodeinfo2GETметаданные сервера x-nodeinfo2
/api/v1/instanceGETОписание совместимого с Mastodon инстанса
/federation/user/{username}GETДокумент актера Служба
/federation/user/{username}/inboxPOSTДоставка активностей на сервер
/federation/user/{username}/outboxGETКоллекция активностей, отправленных сервером
/federation/user/{username}/followersGETПагинированная коллекция подписчиков
/federation/user/{username}/followingGETВсегда 404 (нет списка подписок)
/federation/{object-id}GETПолучить один сохраненный объект ActivityPub

Создание совместимого приложения — контрольный список

Чтобы следовать и использовать поток Owncast из вашего собственного приложения:

  1. Разрешите дескриптор с помощью WebFinger (acct:live@host), чтобы получить IRI актера, затем получите актера с Accept: application/activity+json.
  2. Опубликуйте своего собственного актера с publicKey, доступного по HTTPS, с доступным inbox.
  3. Отправьте подписанный Follow в inbox актера. Подпишите (request-target) host date digest с помощью RSA и включите SHA-256 Digest.
  4. Обработайте Accept, который Owncast отправляет обратно в ваш inbox (публичный режим) — или дождитесь вручную одобрения (приватный режим).
  5. Слушайте публикации о начале трансляции: активности Create/Note, приходящие в ваш inbox, сообщают о начале потока; alternate/application/x-mpegURL ссылка WebFinger предоставляет вам HLS URL для воспроизведения.
  6. При желании действуйте как каталог: установите https://owncast.online/ns#directory в true на вашем Follow, получите одобрение оператора, а затем обрабатывайте Offer/Leave уведомления и метаданные https://owncast.online/ns#* для реального времени и более богатых записей каталога.
  7. Проверьте подпись на всем, что 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.

Contributors to this documentation