Owncast Plugin APIs
Время выполнения плагина Owncast предоставляет один глобальный объект, owncast, с функциями хоста, которые ваш плагин может вызывать. Most methods require the matching permission in your manifest. A call without it never reaches Owncast: the host logs the denial and the call does nothing. What your plugin sees depends on the method. Mutating calls that report an outcome raise an error (moderation, users.register, auth.grantSession, kv.set, videoConfig.write, actions.add, actions.clear, and every sql method), readers return an empty or zero value, and calls that return nothing become silent no-ops. fs.write, fs.delete, and storage.upload are the exceptions: they report failure in their return value rather than raising. A few methods are ambient and need no permission: logging, timers, reading bundled assets, and owncast.config.get.
Plugins require Owncast 0.3.0 or later.
Вызовы показаны для обоих SDK, выберите ваш язык с помощью вкладок. Смотрите JavaScript или Python для настройки. (Имена методов JavaScript используют camelCase, Python использует snake_case, поэтому sendAction становится send_action и так далее.)
Logging
owncast.log.info(message), .warning(message), and .error(message)
Write an operator-visible entry to Owncast's server log. Owncast records the calling plugin's slug and the matching info, warning, or error severity. It replaces control characters with spaces so each entry stays on one line, then truncates messages longer than 4 KiB.
- JavaScript
- Python
owncast.log.info('sync started');
owncast.log.warning('provider response is incomplete');
owncast.log.error('sync failed');
owncast.log.info("sync started")
owncast.log.warning("provider response is incomplete")
owncast.log.error("sync failed")
Атмосферные: разрешение не требуется. See the paired chat-logger examples for JavaScript and Python.
Чат
Строите чат-бота, инструмент модерации или фильтр? Начните с Плагинов чата.
owncast.chat.send(text)
Отправьте сообщение в чате. Отправлено с идентичностью бота вашего плагина (имя отображения из bot.displayName или name в вашем манифесте).
- JavaScript
- Python
owncast.chat.send('hello chat');
owncast.chat.send("hello chat")
Требуется chat.send.
owncast.chat.sendAction(text)
Отправьте сообщение в стиле действия ("/me").
- JavaScript
- Python
owncast.chat.sendAction('is now live');
owncast.chat.send_action("is now live")
Требуется chat.send.
owncast.chat.system(body)
Отправьте сообщение о серверном объявлении. Идентичность бота не прикреплена. Тело отображается встроенным HTML, поэтому используйте это для коротких серверных уведомлений, таких как "стрим начнется через 5 минут". Относитесь к телу как к ненадежному HTML-выходу: не интерполируйте пользовательский ввод без экранирования.
Requires chat.send.
owncast.chat.sendTo(clientId, text)
Отправьте личное сообщение одному подключенному клиенту.
Requires chat.send.
owncast.chat.replyTo(msg, text)
Шепните ответ тому, кто отправил сообщение в чате. Передайте сообщение чата из onChatMessage/filterChatMessage (или простой идентификатор клиента). Возвращает false, если соединение отправителя неизвестно (нет идентификатора клиента), так что вы можете использовать публичный send. Упрощение над sendTo(clientId, text).
- JavaScript
- Python
onChatMessage(msg) {
if (!owncast.chat.replyTo(msg, "got it")) {
owncast.chat.send("got it");
}
}
@plugin.on_chat_message
def handle(msg):
if not owncast.chat.reply_to(msg, "got it"):
owncast.chat.send("got it")
Требуется chat.send.
owncast.chat.history(limit?)
Возвращает самые недавние сообщения чата, каждое с id, user, body и timestamp. limit по умолчанию равен 50.
Требуется chat.history.
owncast.chat.clients()
Return the list of currently-connected chat clients, each with id, userId?, displayName?, connectedAt?, userAgent?, ipAddress?, and messageCount. id — это идентификатор клиента за соединение, используемый chat.kick.
Требуется chat.history.
owncast.chat.deleteMessage(messageId)
Скрывает сообщение чата от зрителей.
Requires chat.moderate.
owncast.chat.kick(clientId)
Отключает клиент чата.
Requires chat.moderate.
Идентичность чата
Каждый плагин имеет точно одну идентичность чата, бота, которую Owncast предоставляет, когда ваш плагин установлен. Имя отображения — это bot.displayName вашего манифеста, если оно установлено, в противном случае его name, с IsBot: true. И send, и sendAction публикуются под этой идентичностью, через обычный чат-пipeline Owncast (фильтры, лимиты по скорости, модерация). Плагины не могут публиковаться под произвольными именами или выдавать себя за реальных пользователей.
Пользователь бота ключевым образом привязан к slug плагина, так что идентичность сохраняется даже после редактирования манифеста для name или bot.displayName. Если вам нужно несколько персон чата, сделайте несколько плагинов.
Пользователи
owncast.users.list() и owncast.users.get(id)
Читать список пользователей чата или одну запись пользователя.
- JavaScript
- Python
const users = owncast.users.list();
const alice = owncast.users.get('u-alice');
users = owncast.users.list()
alice = owncast.users.get("u-alice")
Требует users.read.
owncast.users.setEnabled(id, enabled, reason?)
Включите или отключите пользователя чата.
- JavaScript
- Python
owncast.users.setEnabled('u-spammer', false, 'spam');
owncast.users.set_enabled("u-spammer", False, "spam")
Требует users.moderate.
owncast.users.banIP(ip)
Запретить IP от участия в чате.
- JavaScript
- Python
owncast.users.banIP('203.0.113.42');
owncast.users.ban_ip("203.0.113.42")
Требует users.moderate.
owncast.users.register({ authId, displayName?, scopes?, profileUrl?, handle?, public? })
Find or create an authenticated Owncast user for an external identity and return { userId }. Pass the provider's stable authId without adding your plugin slug. The host stores the slug separately as the identity provider, so plugins cannot collide with or spoof each other's users. displayName seeds a new user's name and is optional: omit it, or pass null, and Owncast generates a display name the same way it does for anonymous viewers. Non-empty scopes such as ["MODERATOR"] are applied on each call.
The optional profileUrl, handle, and public fields describe a verified external identity. profileUrl must be empty or an absolute HTTP(S) URL. handle is the provider's verified label, such as a GitHub login or fediverse handle. Set public to true only after the viewer opts into public display. It defaults to false. These profile fields are captured when the identity is first registered. Later calls with the same authId return the existing user but do not change the stored profile fields.
- JavaScript
- Python
const { userId } = owncast.users.register({
authId: 'github:583231',
displayName: 'octocat',
profileUrl: 'https://github.com/octocat',
handle: 'octocat',
public: false, // Set true only after the viewer opts in.
});
result = owncast.users.register(
"github:583231",
display_name="octocat",
profile_url="https://github.com/octocat",
handle="octocat",
public=False, # Set true only after the viewer opts in.
)
user_id = result.user_id
Требует users.register.
Аутентификация
Эти функции управляют входным контролем зрителей. grantSession и endSession работают только внутри обработчика onHttpRequest, потому что хост прикрепляет куку сессии к текущему HTTP-ответу.
owncast.auth.grantSession({ userId, ttl? })
Выдайте подписанную сессию для уже зарегистрированного пользователя (это userId из owncast.users.register). Хост создает, подписывает и прикрепляет куку сессии к текущему ответу; ваш плагин никогда не видит токен, так что не может подделать или раскрыть его. ttl — это необязательное время жизни в секундах (0/опущено использует значение по умолчанию хоста на 24 часа).
- JavaScript
- Python
const { userId } = owncast.users.register({ authId: 'shared', displayName: 'Guest' });
owncast.auth.grantSession({ userId });
return { status: 302, headers: { Location: returnTo } };
result = owncast.users.register("shared", display_name="Guest")
owncast.auth.grant_session(result.user_id)
return {"status": 302, "headers": {"Location": return_to}}
Требуется auth.gate.
owncast.auth.endSession()
Очистите текущую сессию зрителя в этом ответе, чтобы выйти из системы. Ваш плагин все еще управляет перенаправлением (и может перейти к собственному выходу провайдера).
- JavaScript
- Python
owncast.auth.endSession();
return { status: 302, headers: { Location: '/' } };
owncast.auth.end_session()
return {"status": 302, "headers": {"Location": "/"}}
Требуется auth.gate.
Хранение
owncast.kv.get(key) и owncast.kv.set(key, value)
Пер_PLUGIN ключ/значение, именуемый по slug вашего плагина. Значения — это строки.
Для более сложных типов используйте помощники JSON (getJSON / setJSON, get_json / set_json в Python) вместо того, чтобы разбирать и сериализовать самостоятельно. Получатель JSON возвращает значение по умолчанию, когда ключ не установлен или содержит недопустимый JSON. Плагины не могут читать ключи друг друга.
- JavaScript
- Python
owncast.kv.set('count', '1');
const n = Number(owncast.kv.get('count') ?? '0');
owncast.kv.setJSON('prefs', { theme: 'dark' });
const prefs = owncast.kv.getJSON('prefs', {});
owncast.kv.set("count", "1")
n = int(owncast.kv.get("count") or "0")
owncast.kv.set_json("prefs", {"theme": "dark"})
prefs = owncast.kv.get_json("prefs", {})
Требует storage.kv.
owncast.storage.upload(name, data)
Загрузите файл в общую файловую область Owncast. JavaScript accepts a Uint8Array or string. Python accepts bytes or str. Raw bytes are preserved, while strings are encoded as UTF-8. JavaScript returns { url } or null. Python returns a dict accessed as result["url"], or None.
Требуется storage.upload.
owncast.fs.*
A private, sandboxed filesystem at data/plugin-storage/\<your-slug>/files/. В отличие от owncast.storage.upload, эти файлы остаются на стороне сервера: они никогда не поставляются по HTTP. Пути относительны к корню песочницы. Хост ограничивает каждый путь вашей собственной директории (плагин не может читать файлы другого плагина, и ../ или абсолютные пути сворачиваются обратно внутри песочницы). Родительские директории создаются по мере необходимости при записи.
| JavaScript | Python | Возврат |
|---|---|---|
fs.read(path) | fs.read(path) | Uint8Array / bytes, or null / None if missing |
fs.readText(path) | fs.read_text(path) | UTF-8 string / str, or null / None if missing |
fs.write(path, data) | fs.write(path, data) | { error? } |
fs.list(dir) | fs.list(dir) | имена записей (отсутствующий каталог пуст) |
fs.delete(path) | fs.delete(path) | { error? } for a file or empty directory |
fs.exists(path) | fs.exists(path) | логическое значение |
fs.read preserves the original bytes. fs.readText and fs.read_text decode UTF-8. Python replaces malformed byte sequences when decoding. fs.write preserves a JavaScript Uint8Array or Python bytes, and UTF-8 encodes strings. fs.write and fs.delete return {} on success. If the host rejects the operation, they return { error } with the reason.
- JavaScript
- Python
owncast.fs.write('notes/log.txt', 'hello');
const text = owncast.fs.readText('notes/log.txt');
const data = new Uint8Array([0xff, 0x00, 0x80]);
owncast.fs.write('cache/data.bin', data);
const stored = owncast.fs.read('cache/data.bin');
if (stored) owncast.storage.upload('data.bin', stored);
owncast.fs.write("notes/log.txt", "hello")
text = owncast.fs.read_text("notes/log.txt")
data = bytes((0xFF, 0x00, 0x80))
owncast.fs.write("cache/data.bin", data)
stored = owncast.fs.read("cache/data.bin")
if stored is not None:
owncast.storage.upload("data.bin", stored)
Требуется storage.fs.
owncast.sql.*
One private SQLite database per plugin, at data/plugin-storage/\<your-slug>/db/plugin.db, separate from Owncast's own database and from the storage.fs sandbox. The sandbox is rooted at files/, so db/ is not a path owncast.fs.* refuses but one it cannot express, and the filesystem quota walk covers files/ only, so the two quotas stay independent. Reach for this over storage.kv when you need to sort, filter, or aggregate rather than just remember a value.
| Method | Returns |
|---|---|
sql.exec(sql, params?) | { rowsAffected, lastInsertId } |
sql.query(sql, params?) | rows as objects keyed by column name |
sql.queryRow(sql, params?) | the first row object, or null when nothing matched |
In Python queryRow is query_row, rows come back as dicts, and query_row returns None when nothing matched. An error throws in JavaScript and raises RuntimeError in Python. Parameters are null/None, booleans, numbers, or strings. Anything else is refused.
- JavaScript
- Python
owncast.sql.exec(`CREATE TABLE IF NOT EXISTS chatters (
user_id TEXT PRIMARY KEY,
messages INTEGER NOT NULL DEFAULT 0
)`);
owncast.sql.exec(
`INSERT INTO chatters (user_id, messages) VALUES (?, 1)
ON CONFLICT (user_id) DO UPDATE SET messages = messages + 1`,
[msg.user.id],
);
const top = owncast.sql.query(
'SELECT user_id, messages FROM chatters ORDER BY messages DESC LIMIT ?',
[5],
);
const mine = owncast.sql.queryRow('SELECT messages FROM chatters WHERE user_id = ?', [msg.user.id]);
owncast.sql.exec("""
CREATE TABLE IF NOT EXISTS chatters (
user_id TEXT PRIMARY KEY,
messages INTEGER NOT NULL DEFAULT 0
)
""")
owncast.sql.exec(
"""
INSERT INTO chatters (user_id, messages) VALUES (?, 1)
ON CONFLICT (user_id) DO UPDATE SET messages = messages + 1
""",
[msg.user.id],
)
top = owncast.sql.query(
"SELECT user_id, messages FROM chatters ORDER BY messages DESC LIMIT ?",
[5],
)
mine = owncast.sql.query_row("SELECT messages FROM chatters WHERE user_id = ?", [msg.user.id])
Each exec call runs as one host-owned transaction. A multi-statement batch commits whole or leaves the database untouched, so a schema migration can't half-apply. A plugin cannot leave a transaction open across calls, so there's nothing to clean up either.
query never hands back a silently short result. A query that overruns the row cap or the result budget is an error telling you to add a LIMIT, so write the bound you actually want when a table grows with your audience. queryRow reads a single row, which keeps it cheap on a table query is too big for.
| Limit | Value |
|---|---|
| Encoded request | 64 KiB total JSON |
| Bound parameters | 64 per call |
| Returned column value | 1 MiB |
| Encoded query result | 1 MiB |
| Rows returned | 10000 |
| Call duration | 2 seconds |
| Database size | 128 MiB |
Ordinary SQL is unaffected: DDL, DML, indexes, views, triggers, ORDER BY, recursive CTEs, subqueries, UNION, and the json1 functions all work. Refused in every host: ATTACH, DETACH, every PRAGMA (reads included), temporary-schema DDL both as keywords (CREATE TEMP TABLE / INDEX / TRIGGER / VIEW) and schema-qualified (CREATE TABLE temp.x), load_extension(), VACUUM and VACUUM INTO, and transaction controls (BEGIN, COMMIT, END, ROLLBACK, SAVEPOINT, and RELEASE). exec already owns the transaction around the whole batch.
Parameters and results cross the host boundary as JSON. Python can bind and read exact 64-bit SQLite integers. JavaScript loses unsafe integers before JSON.stringify on writes and during JSON.parse on reads. Store values above Number.MAX_SAFE_INTEGER (2^53 - 1) as TEXT when a JavaScript plugin needs them to remain exact.
Requires storage.sql. For a worked example, the chat-leaderboard plugin covers schema creation in one atomic exec, an ON CONFLICT upsert, a bounded ranked query, and a single-row read, in both JavaScript and Python. It contrasts with message-counter, which keeps the same counts in storage.kv and cannot rank.
Конфигурация
owncast.config.get(key, fallback?)
Чтение одной из настроек обозначенных в манифесте config. Возвращает значение, установленное администратором, если оно присутствует, иначе — объявленное по умолчанию, уже разобранное в его объявленный тип. Для неизвестного ключа (или ключа без значения) возвращает fallback.
- JavaScript
- Python
const cooldownMs = owncast.config.get('cooldownMs', 2000);
cooldown_ms = owncast.config.get("cooldownMs", 2000)
Ambient: no permission required. Предпочтительно использовать это, чем создавать индивидуальную страницу настроек и вводить ключ/значение для простых параметров. (Ключ конфигурации — это то, как вы его назвали в манифесте, и он не переводится на другой язык.)
Сеть
owncast.http.fetch(url, opts?)
Синхронный исходящий HTTP-запрос. opts содержит method, headers и body. Результат — { status, headers, body }. Только хосты, перечисленные в network.allowedHosts вашего манифеста, доступны. Все остальные возвращают ошибку.
- JavaScript
- Python
const res = owncast.http.fetch('https://api.example.com/status');
if (res.status === 200) {
const data = JSON.parse(res.body);
}
import json
res = owncast.http.fetch("https://api.example.com/status")
if res.status == 200:
data = json.loads(res.body)
Требуется network.fetch и соответствующая запись в network.allowedHosts. Используйте это для исходящего HTTP, а не для собственного HTTP-клиента вашего языка (в Python не используйте requests: он не скомпилируется в плагин).
Смотрите Справка по манифесту: сеть для синтаксиса allowlist.
События плагин-к-плагину
owncast.events.emit(eventType, payload)
Emit to a custom hook owned by another plugin. eventType is the fully
qualified \<recipient-slug>.\<hook> target. The host dispatches that exact name
and does not add the emitter's slug. The receiving plugin declares only its
local hook name. See the
handlers reference.
- JavaScript
- Python
owncast.events.emit('announcer.announcement.broadcast', { text: 'We are live' });
owncast.events.emit("announcer.announcement.broadcast", {"text": "We are live"})
Требуется events.emit.
Состояние потока и сервера
owncast.stream.current()
The current live stream state: { online, title?, summary?, viewers, startedAt?, latencyLevel? }.
Requires server.read.
owncast.stream.broadcaster()
Inbound encode telemetry for the current connection: { remoteAddr?, codecs?, resolution?, framerate?, bitrates? }. Только для чтения, и с нулевым значением, когда ничего не подключено. Для изменения видеовыхода смотрите группу конфигурации видео ниже.
Требуется server.read.
owncast.server.info()
Static server info: { name?, url?, summary?, welcomeMessage?, version? }.
- JavaScript
- Python
const name = owncast.server.info().name;
name = owncast.server.info().name
Требуется server.read.
owncast.server.socials()
The streamer's configured social links, each { platform, url, icon? }.
Requires server.read.
owncast.server.emotes()
Пользовательские эмодзи чата сервера: тот же набор, который обслуживает общедоступная конечная точка /api/emoji, каждая { name, url }. Полезно для рендеринга или фильтрации эмодзи :code: на стороне сервера.
Требуется server.read.
owncast.server.federation()
Whether fediverse federation is enabled and under what handle: { enabled, username?, isPrivate? }. username is omitted when unset, and isPrivate is present only when true.
Требуется server.read.
owncast.server.tags()
Настроенные теги стримера в виде списка строк.
Требуется server.read.
Конфигурация видео и транскодирования
owncast.videoConfig.read()
Returns the current VideoConfig.
| Field | Type | Values |
|---|---|---|
latencyLevel | number | 0 through 4 |
codec | string | Configured ffmpeg encoder name |
autoplay | string | off, always, or sound-only |
variants | StreamVariant[] | Configured output renditions |
codec reads can report a legacy value or an encoder added by a newer host. Writes accept libx264, h264_omx, h264_vaapi, h264_qsv, h264_nvenc, h264_v4l2m2m, or h264_videotoolbox. Hardware codecs require the matching encoder in the host's ffmpeg build.
Autoplay off requires the viewer to press play. always starts automatically and may fall back to muted playback. sound-only starts automatically only when the browser allows sound.
Each StreamVariant has these fields:
| Field | Type | Description |
|---|---|---|
width | number | Scaled output width |
height | number | Scaled output height |
framerate | number | Output frames per second |
videoBitrate | number | Video bitrate in kbps |
cpuUsageLevel | number | Processing usage from 0 (lowest) through 4 (highest) |
isPassthrough | boolean | Pass video through without transcoding |
Audio settings are not exposed to plugins. Owncast preserves the existing audio configuration for each variant a plugin updates.
- JavaScript
- Python
const cfg = owncast.videoConfig.read();
cfg = owncast.video_config.read()
Требуется videoconfig.read.
owncast.videoConfig.write(partial)
Update any of the VideoConfig fields above. Передайте частичный объект. Только поля, которые вы включаете, будут изменены. Изменения вступают в силу при следующем запуске потока: хост не перезапускает активную трансляцию.
- JavaScript
- Python
owncast.videoConfig.write({ latencyLevel: 2, autoplay: "sound-only" });
owncast.video_config.write({"latencyLevel": 2, "autoplay": "sound-only"})
Требуется videoconfig.write. Это высоконадежно. Администраторы должны предоставлять это осторожно.
Уведомления
owncast.notifications.discord(text)
Отправьте уведомление в Discord через настроенный вебхук стримера.
Требуется notifications.send.
owncast.notifications.browserPush({ title, body, url? })
Отправка подписанным браузерам.
- JavaScript
- Python
owncast.notifications.browserPush({ title: 'Live now', body: 'Come say hi', url: '/' });
owncast.notifications.browser_push({"title": "Live now", "body": "Come say hi", "url": "/"})
Требуется notifications.send.
owncast.notifications.fediverse({ type, body, image?, link? })
Отправка уведомления в формате fediverse (рендерится как пост для подписчиков).
Требуется notifications.send.
Fediverse
owncast.fediverse.post(text)
Сделайте публичный пост в fediverse из аккаунта Owncast.
Returns { url } on success (currently with an empty url: Owncast publishes the note but does not yet return its URL), or null when the host rejects the call.
Требуется fediverse.post. Высокая степень доверия: пост в fediverse публикуется под именем стримера и не может быть молча отменен. Администраторы должны предоставлять это осторожно.
Кнопки действия (время выполнения)
owncast.actions.add(button | buttons[])
Добавление одной или нескольких кнопок действия в набор манифеста вашего плагина без перезагрузки. Каждая кнопка принимает те же поля, что и запись manifest.actions (title, плюс url/openExternally или встроенный html). Хост проверяет каждую запись по тем же правилам, что и manifest.actions, и сохраняет результат так, чтобы дополнения сохранялись после перезагрузки. A rejected entry throws an error naming the entry and the rule it broke, and the whole batch is rejected, so nothing is added when any entry is invalid.
- JavaScript
- Python
owncast.actions.add({ title: 'Donate', url: '/plugins/my-plugin/donate', openExternally: true });
owncast.actions.add({"title": "Donate", "url": "/plugins/my-plugin/donate", "openExternally": True})
Требуется ui.modify.
owncast.actions.clear()
Удалите все кнопки действий, добавленные во время выполнения. Действия, объявленные в манифесте, остаются.
Требуется ui.modify.
Полное покрытие в UI: Кнопки действия.
Реальное время Push (События, отправляемые сервером)
owncast.sse.send(channel, event, data)
Отправьте событие, отправляемое сервером, в каждый браузер, подключенный к конечной точке вашего плагина /_sse/\<channel> .
channel: к какому потоку отправить. Используйте""для канала по умолчанию.event: имя события, на которое браузер слушает. Используйте""для событияmessageпо умолчанию.data: полезная нагрузка. Строки отправляются как есть. Все остальное будет закодировано в JSON для вас.
- JavaScript
- Python
owncast.sse.send('alerts', 'donation', { from: 'alice', amount: 5 });
owncast.sse.send("alerts", "donation", {"from": "alice", "amount": 5})
Отправьте и забудьте. Вызов возвращается немедленно и никогда не блокирует. Медленные клиенты сбрасывают кадры, а не зависают ваш плагин.
Требуется http.sse.
Полное покрытие в Обслуживании HTTP: Обновления в реальном времени.
Таймеры
Запланируйте отложенные и повторяющиеся задачи. Таймеры являются постоянными, разрешение не требуется, и автоматически очищаются при отключении вашего плагина. (Python: set_timeout, set_interval, clear.)
owncast.timer.setTimeout(fn, ms)
Запустите fn один раз после ms миллисекунд. Возвращает идентификатор.
owncast.timer.setInterval(fn, ms)
Запустите fn повторно каждые ms миллисекунд. Возвращает идентификатор.
owncast.timer.clear(id)
Отмените ожидающий таймаут или интервал по идентификатору, возвращенному вызовом.
Собранные ресурсы
Читать файлы, которые вы отправили в директории assets/ вашего плагина. Постоянное: разрешение не требуется. (Python: read, read_text.)
owncast.assets.read(path) and owncast.assets.readText(path)
Read a file bundled under assets/, relative to that directory. read returns the original bytes as a JavaScript Uint8Array or Python bytes. readText and Python's read_text decode the bytes as UTF-8. Python replaces malformed byte sequences when decoding. Missing files return null in JavaScript or None in Python.
- JavaScript
- Python
const image = owncast.assets.read('badge.png');
const template = owncast.assets.readText('template.html');
image = owncast.assets.read("badge.png")
template = owncast.assets.read_text("template.html")
Полная справка по API
Имена методов ниже - это форма JavaScript (camelCase). Питоновые эквиваленты - snake_case (sendAction → send_action, banIP → ban_ip, videoConfig → video_config и так далее).
| API | Разрешение |
|---|---|
owncast.log.info / .warning / .error | нет (постоянный) |
owncast.chat.send | chat.send |
owncast.chat.sendAction | chat.send |
owncast.chat.sendTo | chat.send |
owncast.chat.system | chat.send |
owncast.chat.replyTo | chat.send |
owncast.chat.history | chat.history |
owncast.chat.clients | chat.history |
owncast.chat.deleteMessage | chat.moderate |
owncast.chat.kick | chat.moderate |
owncast.users.list / .get | users.read |
owncast.users.setEnabled / .banIP | users.moderate |
owncast.users.register | users.register |
owncast.auth.grantSession / .endSession | auth.gate |
owncast.kv.get / .set / .getJSON / .setJSON | storage.kv |
owncast.storage.upload | storage.upload |
owncast.fs.read / .readText / .write / .list / .delete / .exists | storage.fs |
owncast.sql.exec / .query / .queryRow | storage.sql |
owncast.http.fetch | network.fetch |
owncast.events.emit | events.emit |
owncast.stream.current | server.read |
owncast.stream.broadcaster | server.read |
owncast.server.info / .socials / .emotes / .federation / .tags | server.read |
owncast.videoConfig.read | videoconfig.read |
owncast.videoConfig.write | videoconfig.write |
owncast.notifications.discord / .browserPush / .fediverse | notifications.send |
owncast.fediverse.post | fediverse.post |
owncast.actions.add / .clear | ui.modify |
owncast.timer.setTimeout / .setInterval / .clear | нет (постоянный) |
owncast.assets.read / .readText | нет (постоянный) |
owncast.config.get | none (ambient) |
owncast.sse.send | http.sse |
Improve this page
See something missing or incorrect? Edit this page and improve the documentation for everyone.
Gabe Kangas