每个命令以相同方式运行
screenrig [--json | --human] [--api-url URL] [--config PATH] [--request-id ID]
[--project-id ID] [--idempotency-key KEY] [--timeout MS] [--beta-key KEY] <command> [args]全局标志
| 标记 | 类型 | 默认 | 备注 |
|---|---|---|---|
--json | boolean | 操作的 JSON | 显式 JSON 输出,保留兼容性。也选择结构化帮助。不可与 --human 组合。 |
--human | boolean | 关闭 | 选择可读的操作输出。不能与 --json 组合使用。 |
--project-id ID | string | last-used project | 修复此调用至缓存项目,且不更改选择。每个命令在整个运行期间保持其目标和恢复状态。 |
--api-url URL | string | https://api.screenrig.ai | 控制平面来源。SCREENRIG_API_URL 设置相同内容。 |
--config PATH | 路径 | 用户配置文件 | 使用特定配置文件。SCREENRIG_CONFIG 设置相同内容。 |
--request-id ID | string | 每次运行生成 | 你自己的请求 ID,作为request_id回显。保留在报告中。 |
--idempotency-key KEY | string | 每次写入派生 | 使用相同密钥重试模糊写入。服务器在 24 小时内返回原始结果;同一密钥下不同的响应体为 idempotency_mismatch。 |
--timeout MS | integer | 每请求 30000 | 限制每个 HTTP 请求。在等待操作的命令中,此为等待截止时间,默认值为 120000。 |
--beta-key KEY | string | 未设置 | 仅在控制平面请求时发送。SCREENRIG_BETA_KEY 设置相同内容。 |
--help, -h | boolean | 关闭 | 打印命令或组的重点帮助并退出。添加 --json 以获取结构化帮助。 |
--version, -V | boolean | 关闭 | 打印捆绑的 CLI 版本并退出。等同于 version 命令。 |
环境
| 变量 | 效果 |
|---|---|
SCREENRIG_API_URL | 控制平面来源,覆盖存储的配置。 |
SCREENRIG_CONFIG | 配置文件路径。 |
XDG_CONFIG_HOME | 配置目录的基础。否则Windows上为%APPDATA%\screenrig,或为~/.config/screenrig。 |
SCREENRIG_BETA_KEY | 控制平面请求时的Beta密钥。 |
SCREENRIG_FFMPEG | ffmpeg 的绝对路径,当 media upload 不应从 PATH 获取时。 |
SCREENRIG_FFPROBE | ffprobe 的绝对路径。 |
SCREENRIG_CWEBP | 到 cwebp 的绝对路径,备用仍为编码器。 |
SCREENRIG_CLIENT_ID | 以此 服务客户端 (scl_…) 身份运行,且必须选择以下两个之一。 |
SCREENRIG_CLIENT_KEY_FILE | 服务客户端的私钥文件,JWK 或 PEM,签入 private_key_jwt 断言。 |
SCREENRIG_CLIENT_SECRET | 服务客户端的秘密,随 HTTP Basic 发送。 |
无令牌标志和令牌环境变量。CLI 读取插件为此安装存储的会话,存于用户私有文件,升级插件时保留,并自动续期。设置 SCREENRIG_CLIENT_ID 后,改为以该服务客户端身份登录,令牌保存在内存中,且不读写存储配置。
输出
操作命令默认将 JSON 写入 stdout,包括错误。单个结果包含一个信封:ok,然后是成功时的 data、request_id、operation_id 和 warnings[],失败时为 error。进度、安全 URL 和人工备注写入 stderr。events follow 输出 NDJSON:每个事件一行一个 JSON 信封。重定向 stdout 不改变格式。
用于手动检查时使用 --human。事件命令随后每个事件打印一行 logfmt。帮助和裸命令组默认保持可读文本;使用 screenrig --json playlist --help 进行结构化发现。--json 和 --human 不能组合使用。
旧插件包可能需要显式使用 --json 来获取操作结果。使用旧包时请查看已安装 CLI 的帮助。播放列表创作文件仍为 JSON 文档;命令结果封装不是可编辑的播放列表文档。
错误信封包含 error.status、稳定的 error.code,通常还有 error.next.command,精确指明下一步执行内容。根据这些分支而非文本处理。
等待人员审核的更改视为成功,而非错误:ok: true,退出 0,data.status: pending_review 带有 review,一个 pending_review 警告显示审核 URL,和 data.next 指向 reviews show ID。对审核中的已批准媒体重新标记为 ok,退出 0,警告为 media_review_pending:其审核将在几秒内显示于 reviews list。参见 审核。
退出代码
| 代码 | 含义 |
|---|---|
0 | 成功。 |
1 | 意外失败。 |
2 | 使用错误。未发送任何内容。 |
3 | 凭据问题。此安装无法认证。 |
4 | 未找到。 |
5 | 冲突。 |
6 | 先决条件失败,包括revision_conflict:--expect-rev版本已过时。 |
7 | 限速。遵守 Retry-After,显示为 retry_after_seconds。 |
8 | 其他客户端拒绝。 |
9 | 服务器错误。 |
10 | 网络故障。 |
11 | 超时。 |
12 | 配置错误。 |
13 | 操作本身失败。 |
信封中的常见问题代码:
| 代码 | 含义 | 下一步 |
|---|---|---|
not_enrolled | 此安装尚无项目凭证。 | 使用 screenrig agent enroll --email ADDRESS --organization NAME 创建项目,或使用 screenrig login 登录你所属的项目。 |
session_ended | 登录已被撤销、过期或结束。 | screenrig login,经控制台中的人员批准。 |
insufficient_access | 会话访问级别无法执行此操作:只读不更改,提议不能删除、控制屏幕或消费。 | screenrig agent status 显示 effective_access。当 access_limited_by 指定 project 或 person 时,项目所有者更改评审设置;否则 screenrig login --access manage,由人员批准。 |
approver_required | 仅项目所有者或有审批权限的成员可执行此操作,如授予智能体管理权限。 | 请求项目所有者开启“可批准”,或选择只读或提议。 |
playlist_not_approved | 播放列表尚无已批准版本,因此无法在任何屏幕上显示。 | 等待其审查(screenrig reviews show ID),或选择已批准的播放列表。 |
review_not_pending | 审核已被决定、撤回或替换。 | screenrig reviews show ID 用于其状态。 |
login_denied, login_expired | 该人员拒绝登录,或其 24 小时代码已过期。 | 再次运行 screenrig login。 |
client_auth_failed | 服务客户端的密钥、secret 或 id 被拒绝。 | 将配置登录时使用的私钥文件或密钥文件(login --client-id ID --client-key-file FILE 或 --client-secret-file FILE)与 screenrig service-client show ID 的结果核对。 |
capability_required | 项目缺少执行此命令所需的权限,例如 screens 或 advertiser。 | screenrig project capabilities,然后选择匹配的 --intent 创建新项目或更改项目目的。 |
rate_limited | 当前窗口请求过多。 | 等待 retry_after_seconds,然后重试。 |
free_organization_limit | 该人员已拥有其免费 Standard 组织,因此project create无法启动另一个。 | 将项目添加到详情中指定的组织:screenrig project create NAME --organization-id ID。其他组织需要通过 https://screenrig.ai/contact#message 联系表单申请Plus、Premium或Enterprise。 |
organization_plan_required | 组织在未支付计划前不允许新增屏幕。 | 所有者使用screenrig project moves和screenrig project move --organization-id ID移动项目,或组织通过 https://screenrig.ai/contact#message 联系表单申请Plus、Premium或Enterprise。 |
修订和重试
修订保护是可选的。省略 --expect-rev 可在无先前修订读取的情况下写入当前资源。提供已知的 revision 可拒绝过时写入。在 revision_conflict 上,重新获取资源,重新应用更改,并使用返回的修订重试。遇到模糊传输失败时,使用相同的 --idempotency-key 重试;控制平面返回原始结果而非重复写入。
额度
控制平面对每个计费的已认证命令计量一个额度,对每个计费的项目流事件计量一个额度。这些控制平面命令不扣减额度且在零额度时仍可工作:project show、agent status、notes list、notes show、screen reload、screen toast 和 screen screenshot。打开 events follow 计费一个额度作为订阅,断线重连后的重放免费。舰队命令 screen assign、screen reload、screen toast 或 screen tag(带多个屏幕 ID)或 --tag 是一次计费操作,无屏幕数量上限,包括所有续作,因此舰队重载或提示即使单个免费也计费。screen screenshot --tag 跟随所有列表页面,每页计费,用于解析标记的屏幕;捕获本身免费。通知邮件和屏幕状态提醒免费。项目事件的每次 webhook 交付尝试计量为计费的监听流事件。每个 playback plays 或 playback list 的 JSON 页面计费一次请求,播放 CSV 导出计费一次请求覆盖其整个范围。
捆绑的 CLI 界面
命令名称和发现
使用 show 检查资源,list 检查集合,kv get / kv set 检查值。使用 --name 显示名称,--screen-id、--app-id、--playlist-id 和 --release-id 选择资源,--expect-rev 用于修订保护,--after 用于事件游标。组为 app;“application”为资源名。注释保留 comment ACTION screen|playlist ID。
使用 screenrig help --all 获取完整库存,或 screenrig playlist init
--help 获取重点帮助。添加 --json 获取参数元数据、选项、默认值、示例、别名和选项关系。exactlyOne、atLeastOne 和 together 组在配置或网络访问前检查;requires 表示第一个选项需要所有剩余选项。仅当命令帮助明确支持 - 时读取标准输入。
创建新项目
screenrig agent enroll --email ADDRESS --organization "Screens"
agent enroll 创建身份、组织、Screens 项目和成员资格,并将身份和项目凭据私密存储。可复用已提供的组织名称,或直接使用 Screens,无需选择提示。--organization 为必填项;--name 单独指定智能体名称。请使用成员真实的联系电子邮件。注册时会向项目成员发送邀请邮件;不会透露该地址是否已注册。成员打开邀请后,可用通行密钥创建登录,或登录后将项目添加到现有账户。接受邀请后,项目会归入成员已验证邮箱域名所属的组织,否则归入其已持有的免费 Standard 组织,若名称冲突则自动重命名。
为购买广告而非配对屏幕的项目添加 --intent advertising。--force 在有意创建另一个项目时替换此安装的注册或待连接状态。
agent enroll --email ADDRESS --organization NAME [--name NAME]
[--intent signage|advertising] [--force]
使用 AgentID 登录
带有 AgentID 的智能体在 https://api.screenrig.ai/agentid/start, 登录,接收声明码,安装官方插件,并运行 screenrig agent enroll --agentid-claim CODE --organization NAME。所有者的已验证邮箱会收到仪表盘邀请。
登录到现有账户
screenrig loginlogin 将此安装登录到已存在的账户。打印控制台地址和代码,然后等待最多 24 小时。人员打开地址,携带代码,检查匹配,调整项目、只读、提议 或 管理,或所需权限区域,点击连接一次;最近一小时内的控制台登录作为凭证,无需第二次通行密钥提示。CLI 存储会话,选择批准的项目并返回带项目、组织和 access 的 status: signed_in。
login [--project ID] [--access read|propose|manage] [--name NAME] [--no-wait] [--resume ID]
logout--access 需要指定一个级别;默认值为 manage,由成员自行决定。--project 建议项目。--no-wait 返回 status: pending,包含 verification_uri_complete、user_code 以及一个不包含任何机密信息的 login_ 句柄;login --resume ID 稍后等待审批。在已登录的安装环境中再次运行 login 可添加其他项目,或将“只读”或“建议项目”权限提升为“管理”。
每个会话包含能力领域:screens、content、playlists、advertising、reports 和 project。会话只调用其领域内的命令;reports 也可以读取任意领域。超出领域的命令会返回 403 forbidden,详细信息为 This agent credential lacks the <name> capability.。只读会话仅能列出和读取。提议会话还可上传媒体、写备注并提议媒体、播放列表和屏幕变更,这些变更需等待成员审核。超出会话级别的变更会返回 403 insufficient_access。
logout 撤销服务器上的登录并移除存储的令牌。可能未到达服务器的失败保留令牌,因此重新运行 logout 是安全的。doctor 显示会话结束时间:最后使用后 90 天,最多登录后 1 年。详见 身份验证。
项目和组织生命周期
当前项目是最后使用的项目。每个 JSON 信封包含组织和项目上下文;人工输出同时命名两者。身份凭证受所选项目成员资格限制。重试状态按项目分开。
project list
project use ID
project create NAME [--organization-id ID | --organization NAME]
project moves
project move --organization-id ID
project transfer-owner --user-id ID
project deletion-preview
project delete --name NAME --revision N --yes
organization list
organization rename ID NAME
agent revoke-identity --yesproject list 验证可访问的成员资格。project use 选择一个。创建时名称在其组织内唯一,默认当前项目组织,再默认你管理的组织;无名称时,持有所有者验证邮箱域的组织优先。负责人成为所有者。每个套餐限制组织可持有的项目数;每人有一个免费 Standard 组织,第二个需 Plus、Premium 或 Enterprise。无当前项目且无组织名称时,服务器以相同方式放置项目。--organization NAME 仅为无免费组织的人员启动新组织;否则拒绝创建并返回 free_organization_limit,其中详细说明使用的组织。注册受速率限制管理。
所有者可以移动到project moves返回的目标,或转让所有权给现有的已验证成员。移动携带屏幕;目标组织若已拥有其套餐允许数量的项目,则会以 project_limit_reached 拒绝。删除使用其预览中的确切当前名称和正修订版本。要求无非归档屏幕,无自身计划,无钱包义务且无活跃广告。会发送邮件给成员并保留墓碑记录。
组织名称可重复;重命名你管理的组织时请使用显式 ID。组织有指定管理员和主组织成员;管理员通过仪表板以电子邮件邀请其他管理员和成员。organization list 标记 free 和 plan_required 组织并报告 new_organization_allowed。其项目列表不授予项目内容访问权限。组织负责支付:其资金和津贴由其项目共享;使用情况仍归属于项目,历史费用保留原付款方。
login --project ID 针对同一身份请求该项目。只有明确批准此请求,才会授予成员资格。agent disconnect --yes 撤销一个成员资格;agent revoke-identity --yes 单独撤销该身份及其所有成员资格。响应不明确时,会保留本地凭据和重试状态以便后续协调。
广告报告保留事件保留期之外的结算事实。请阅读其覆盖元数据:缺失的历史播放或未知的批准时长均为未知,绝非零。报告可能具有完整的财务总计但播放结果历史不完整。
项目、邀请和诊断
项目命令包括列出成员、选择项目、创建项目,以及管理项目名称、所有者、迁移和删除。邀请可将人员加入项目或广告网络。
project show#
读取项目记录及其剩余额度。
project show
无参数。
screenrig project show
data.credit_remaining 是整数额度。低于 1000 时信封可能带有 credits_low 警告。2027 年 1 月 1 日前,合理范围内的使用免费,因此剩余额度只是智能体可读取的整数计量,而不是停用指令。
project rename#
设置人们在仪表板项目切换器中看到的名称。
project rename NAME
project capabilities#
读取项目计划、独立的 screens 和 advertiser 功能标志及有效能力集。路由拒绝优先于过时的能力读取。
project capabilities
project uptime#
读取项目在 UTC 天数上的每日屏幕可用性。
project uptime [--day-from YYYY-MM-DD] [--day-to YYYY-MM-DD]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--day-from YYYY-MM-DD | string | 否 | 提前 29 天 --day-to | 首个 UTC 天(含)。 |
--day-to YYYY-MM-DD | string | 否 | 今天 | 最后的UTC日,含当日。最多为--day-from后366天。 |
screenrig project uptime
screenrig project uptime --day-from 2026-09-01 --day-to 2026-09-30范围和默认值与 screen uptime 相同。data.items 按 UTC 天列出一行,最旧在前:online_s 和 offline_s 汇总当天有记录状态的屏幕,availability、coverage(这些屏幕当天有记录状态的时间份额)和 screens(有记录状态的屏幕数量)。当天行覆盖已结束的区间;screen list 显示当前在线人员。
project health-trend#
按 UTC 小时读取机群健康状况:报告的屏幕、热点、显示器断开、崩溃。
project health-trend [--from TIME] [--to TIME]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--from TIME | string | 否 | 提前 24 小时 --to | 小时的包含起点:带秒和偏移(归一化为 UTC)的 RFC 3339 时间点,now,或类似 7d、12h 或 30m 的时长。 |
--to TIME | string | 否 | 现在 | 独占结束,形式相同。最多在 --from 后93天内。 |
screenrig project health-trend
screenrig project health-trend --from 7ddata.items 按 UTC 小时列出车队健康状况:hour、screens_reporting、hot(峰值温度达到或超过 80 °C)、display_disconnected 和 crashing(24 小时内 3 次或以上崩溃)。CLI 跟踪 next_cursor 至结束,并每小时响应 next_cursor null。小时报告最多延迟约 5 分钟。
invitations#
创建、列出或撤销项目成员和广告买家邀请。
invitations create --email ADDRESS[,ADDRESS] [--kind member|ad-buyer]
invitations create --link
[--screen-id ID] [--slot-id ID] [--policy trusted|review_required]
invitations list [--kind member|ad-buyer] [--status STATUS]
invitations revoke ID
--kind 默认为 member。电子邮件发送为默认方式,七天后过期。--email 支持逗号分隔的收件人,每次最多五十个。--link 仅限成员,需指定一位收件人,返回一次性有效 24 小时的邀请链接用于直接转交。请勿将该链接写入日志、备注或共享记录。列表操作不会返回该链接。
广告买家仅使用电子邮件,需要拥有屏幕或广告位权限(或两者)。--screen-id 和 --slot-id 接受逗号分隔的 ID;--policy 选择 trusted 或 review_required。状态筛选器包括 queued、sent、issued、accepted、revoked、expired 和 failed。
screenrig invitations create --email teammate@example.com
screenrig invitations create --kind ad-buyer --email buyer@example.com --screen-id scr_LOBBY --policy review_required
智能体不接受邀请。被邀请者打开邮件,登录或创建通行密钥,并在控制台接受。链接注册先验证其邮箱。撤销已接受的邀请不会取消成员身份;请使用买家成员控制撤销广告访问权限。
agent status#
报告此安装是否持有可用凭证。
agent status
无参数。
screenrig agent status
只读。永不更改本地或服务器状态,且无任何费用。结果包含会话的 access、其 effective_access,以及当项目审核设置或无审批权限成员持有较低权限时的 access_limited_by(project 或 person)。
login#
在控制台中获得某人批准后,将此安装登录到现有账户。
login [--project ID] [--access read|propose|manage] [--name NAME] [--no-wait] [--resume ID]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--project ID | string | 否 | 无 | 建议用户批准的项目。 |
--access LEVEL | string | 否 | 管理 | read,propose 或 manage。该人员做出最终选择。 |
--name NAME | string | 否 | 无 | 为此安装命名,最多 80 个字符。 |
--no-wait | boolean | 否 | 关闭 | 返回 status: pending,包含地址、代码和一个 login_ 句柄。 |
--resume ID | string | 否 | 无 | 等待 --no-wait 启动的待处理登录。 |
screenrig login --access read打印控制台地址和一个八字母代码到标准错误,然后等待最长 24 小时。人员检查代码是否匹配,并按一次连接,最近一小时内登录控制台后无第二次通行密钥提示。信封报告 status: signed_in、项目、组织和 access。在已登录安装上再次运行会添加项目或将只读或提议项目提升为管理。拒绝为 login_denied,过期为 login_expired。
logout#
结束此安装的登录并移除其令牌。
logout无参数。
screenrig logout撤销服务器上的登录,然后移除存储的令牌并报告 status: signed_out。可能未到达服务器的失败将保留令牌,因此重新运行是安全的。运行 screenrig login 重新登录。
dashboard#
打开普通控制台 URL。此命令不生成登录链接、不创建会话,也不需要智能体凭证。
dashboard [open]
screenrig dashboard
控制台在登录后显示该人的项目。浏览器项目选择不更改绑定到智能体的项目。
dashboard reset-sign-in#
请求无代理凭证的登录重置邮件。
dashboard reset-sign-in --email ADDRESS
确认不会透露电子邮件是否有登录。邮件重置一小时后过期;用户创建新通行密钥。完成后替换登录凭据并撤销其他会话。
doctor#
检查此安装并按名称报告每次检查。
doctor [--repair-config]
| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--repair-config |
boolean | 否 | 关闭 | 收紧对现有配置文件的权限,该文件对组或其他用户可读。 |
screenrig doctor
data.checks 命名每个检查及其状态:Node 运行时、解析的配置路径及其权限、控制平面来源及其服务路由、公布的 feedback 能力,以及可选的媒体工具链(ffmpeg、ffprobe、encoder_libx264、encoder_libx265、encoder_libwebp、cwebp、filter_hdr_tonemap)。
任何失败的检查都会使doctor非零退出,因此在调用安装为不健康之前请读取各个名称。缺失的媒体工具链仅影响media upload。
version#
打印捆绑的 CLI 版本及其协议适配器。
version
无参数。
screenrig version
会话中先运行此命令。成功的信封证明启动器已解析捆绑的 CLI。--version 和 -V 可在命令行任何位置执行相同操作。
服务客户端
服务客户端是项目拥有的服务器、脚本或 CI 任务,使用自己的密钥或 secret 登录,无需人员批准。要创建或更改客户端,智能体需要带有 identity 作用域的身份管理权限、自身在目标项目中获授的包含 project 能力的管理权限,以及一名已验证且管理该项目所属组织的负责人。服务客户端不能管理其他客户端。要以客户端身份运行命令,请设置 SCREENRIG_CLIENT_ID,并配合 SCREENRIG_CLIENT_KEY_FILE 或 SCREENRIG_CLIENT_SECRET 使用。请参阅服务客户端。
service-client list#
列出该项目的服务客户端,包括有效和已撤销的,及其密钥、秘密 ID 和使用情况。
service-client list无参数。
screenrig service-client list永不返回秘密。
service-client show#
显示一个服务客户端。
service-client show ID| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
ID | string | 是 | 无 | 客户端 ID,scl_…。 |
screenrig service-client show scl_ID列出每个密钥的 kid 和每个秘密的 css_ ID 以便轮换。
service-client create#
创建此项目拥有的服务客户端。
service-client create --name NAME [--capability NAME]... [--access read|propose|manage] [--key-file PATH] [--secret-file PATH]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--name NAME | string | 是 | 无 | 最多 80 个字符。 |
--capability NAME | string | 否 | 全部六个 | 可重复:screens、content、playlists、advertising、reports、project,均在你的范围内。 |
--access LEVEL | string | 否 | 读取 | read,propose 或 manage。propose 将播放列表和屏幕更改发送给某人的 审核。 |
--key-file PATH | 路径 | 以下之一 | 无 | 一个 JWK 或 PEM:Ed25519、EC P-256 或至少 2048 位的 RSA。仅发送公钥部分。 |
--secret-file PATH | 路径 | 以下之一 | 无 | 生成密钥并写入此新的 0600 文件。仅显示一次。 |
screenrig service-client create --name "Nightly report" --access read --capability reports --key-file screenrig-client.pem需要上述身份、项目和组织管理员权限。每个组织跨其所有项目最多有 50 个有效客户端。没有自身 kid 的密钥通过其 RFC 7638 指纹识别。
service-client add-key#
注册第二个公钥以实现无停机轮换。
service-client add-key ID --key-file PATH| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
ID | string | 是 | 无 | 客户端 ID。 |
--key-file PATH | 路径 | 是 | 无 | 新公钥,JWK或PEM格式。 |
screenrig service-client add-key scl_ID --key-file new.pem客户端最多持有两个密钥。
service-client add-secret#
生成第二个密钥以实现无停机轮换。
service-client add-secret ID --secret-file PATH| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
ID | string | 是 | 无 | 客户端 ID。 |
--secret-file PATH | 路径 | 是 | 无 | 一个新的 0600 文件接收密钥。 |
screenrig service-client add-secret scl_ID --secret-file new-secret客户端最多持有两个密钥。当前密钥在移除前持续有效。
service-client remove-key#
移除密钥;使用该密钥签发的令牌将在几秒内失效。
service-client remove-key ID --kid KID| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
ID | string | 是 | 无 | 客户端 ID。 |
--kid KID | string | 是 | 无 | 来自 service-client show 的键ID。 |
screenrig service-client remove-key scl_ID --kid KID客户端至少保留一个密钥或密钥。
service-client remove-secret#
移除密钥秘密;使用该秘密签发的令牌将在几秒内失效。
service-client remove-secret ID --secret-id css_ID| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
ID | string | 是 | 无 | 客户端 ID。 |
--secret-id ID | string | 是 | 无 | 来自 service-client show 的 css_ 密钥 ID。 |
screenrig service-client remove-secret scl_ID --secret-id css_IDservice-client revoke#
永久撤销服务客户端。
service-client revoke ID --yes| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
ID | string | 是 | 无 | 客户端 ID。 |
--yes | boolean | 是 | 关闭 | 确认永久撤销。 |
screenrig service-client revoke scl_ID --yes删除其密钥和秘密;其令牌在几秒内停止工作。记录保留以供审计。
媒体
媒体对象是一张静态图、一段剪辑或一条 MP3 音轨,存储为一个版本。无设备级回退,因此 media upload 或 media generate 存储的即为所有屏幕必须解码的内容。
媒体文件夹组织库。文件夹 ID 以 mfd_ 开头,文件 ID 以 med_ 开头。上传默认存放在库根目录,除非 --folder 指定文件夹,media move 和 media folder update 重新排列树结构,播放列表 by:folder 选择器仅播放某文件夹内的文件,不包括子文件夹。组织跨其所有项目最多包含 1000 个文件夹,嵌套深度最多 10 层,名称长度为 1 到 100 个字符。
文件更改后,媒体保留其 ID:media replace 就地替换文件,因此使用它的每个播放列表和日程都会播放新文件,media versions 会列出该条目曾有的所有文件。
media generate#
生成可展示的整页静态图像并存储到项目媒体库。
media generate --prompt TEXT [--aspect-ratio RATIO] [--quality low|medium|high] [--tag TAG]
[--no-progress]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--prompt TEXT | string | 是 | 无 | 1 到 4000 个字符。将所有事实和文案放入提示中,以便图像模型排版。 |
--aspect-ratio RATIO | string | 否 | 16:9 | 1:1,16:9,9:16,4:3,3:4,3:2,或 2:3。 |
--quality | string | 否 | medium | low、medium 或 high。影响静态图像细节。 |
--tag TAG | string | 否 | 无 | 与上传相同的 1 到 32 个字母或数字标签。 |
--no-progress | boolean | 否 | 关闭 | 抑制 stderr 启动行。 |
screenrig media generate --prompt "A 16:9 restaurant menu poster for North Lobby Cafe. Dark walnut, gold type. Title NORTH LOBBY CAFE. Items: Espresso $4, Cortado $4.50, House Blend $3. Footer Open 7am to 7pm. Typeset every line of copy in the image." --aspect-ratio 16:9 --quality high --tag LobbyMenu命令将有损 WebP 存储在项目媒体库并返回 data.media_id(med_…)。请勿重新上传字节。切勿打印像素或提示。创作树和提示合同保存在 Compose。
media upload#
将本地文件转换为传输字节,上传并等待对象准备就绪。
media upload <file> [--content-type TYPE] [--tag TAG] [--folder ID] [--no-wait] [--poll-ms MS]
[--timeout MS] [--no-transcode] [--codec h264|hevc] [--max-fps N]
[--max-edge PIXELS] [--webp-quality 1-100] [--no-progress]
[--preset signage-1080p30|signage-4k30] [--no-audio]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<file> | 路径 | 是 | 无 | 源静态图像、剪辑或音轨。文件名成为列表、播放列表和播放报告中的人类可读标识,请根据内容命名。 |
--content-type TYPE | string | 否 | 从上传的字节检测 | 自行声明媒体类型,而不是让 CLI 检测。 |
--tag TAG | string | 否 | 无 | 一到 32 个字母或数字,匹配 ^[A-Za-z0-9]{1,32}$。不接受连字符。标签使 media list --tag TAG 成为可靠的文件名到 ID 映射。 |
--folder ID | string | 否 | 库根目录 | 一个现有的mfd_媒体文件夹,在任何工作开始前检查。准备好的上传文件会移动到该文件夹中,并由data.folder_id报告。因媒体ID尚不存在而被拒绝,返回--no-wait(usage_error,退出码2);对象准备好后请运行media move。 |
--no-wait | boolean | 否 | 关闭 | 提交被接受后立即返回。对象尚未准备好;请使用 operations wait 完成。 |
--poll-ms MS | integer | 否 | 1000 | 等待时操作轮询间隔。 |
--timeout MS | integer | 否 | 120000 | 等待的截止时间。它也限制每个底层请求。 |
--no-transcode | boolean | 否 | 关闭 | 上传源字节,不做更改。ffmpeg、ffprobe 和 cwebp 不会运行。无损 WebP 仍被拒绝。 |
--codec | string | 否 | h264 | h264 或 hevc;avc 和 h265 被接受为别名。仅当所有播放剪辑的屏幕都是原生播放器时使用 hevc。 |
--max-fps N | number | 否 | 30 | 恒定输出帧率。每个视频无论源帧率如何,均以此速率编码,确保连续剪辑帧率不变。大于 0,最多 240。 |
--max-edge PIXELS | integer | 否 | 3840 | 对每条边设置范围,范围为 16 到 3840。保持宽高比,不会对较小的源进行放大。 |
--webp-quality | integer | 否 | 90 | WebP 编码的静态质量,范围从 1 到 100。 |
--preset | string | 否 | 未设置 | signage-1080p30 或 signage-4k30。支持方向感知视频尺寸和恒定 30 fps。--max-edge 和 --max-fps 可收紧预设但不能放大。仅限视频;不能与 --no-transcode 结合。 |
--no-audio | boolean | 否 | 关闭 | 视频传输时省略音轨。仅视频;不能与 --no-transcode 组合。 |
--no-progress | boolean | 否 | 关闭 | 不输出进度信息。进度始终输出到 stderr;stdout 仅保留用于单个结果封装。 |
screenrig media upload ./lobby-welcome-loop.mp4 --tag LobbyLoop视频默认转为 MP4:H.264 高级配置文件 4.2,或带 --codec hevc 的 H.265,标记为 yuv420p Rec. 709。HDR 源映射至 Rec. 709。音频(若有)为 AAC,192 kbit/s,48 kHz,立体声。
静态图像在质量 90 时变为有损 WebP,保留源图像的透明通道。动画源无限循环。已符合大小限制的 WebP 直接传递,不重新编码。
音频变为播放列表配乐的 MP3。MP3 源保持不变上传;WAV、AAC、M4A、OGG 和 FLAC 源转换为 128 kb/s MP3,需带 libmp3lame 的 ffmpeg 构建。曲目时长 1 秒至 3 小时。playlist init 将音频输入变为配乐曲目而非页面。准备好的对象是带时长的 audio 媒体对象。不能放置在页面上;在播放列表中命名为 audio 配乐。
准备就绪的对象 ID 是 data.media_id。相同的值是 data.id 和 data.operation.result.media_id。该 ID 是播放列表选择器使用的。
低信息量文件名如 video.mp4 会在信封中添加建议性 generic_filename 警告。上传仍成功,CLI 不会重命名文件;请在运行命令前选择名称。
转换运行 ffmpeg 和 ffprobe,来源于 PATH,或来自 SCREENRIG_FFMPEG 和 SCREENRIG_FFPROBE 中的绝对路径。静态图像优先使用 ffmpeg libwebp 编码器,遇 PATH 或 SCREENRIG_CWEBP 时回退到 cwebp。会话首次上传前运行 doctor。
--preset signage-1080p30 将长边限制为 1920,短边限制为 1080,帧率恒定为 30 fps。signage-4k30 将长边限制为 3840,短边限制为 2160,帧率恒定为 30 fps。两者均支持横屏、竖屏和方形内容。--no-audio 对静音片段不进行音频编码。这些选项仅适用于视频。
screenrig media upload ./lobby.mov --preset signage-1080p30 --no-audioscreenrig media upload ./menu.png --folder mfd_01EXAMPLEFOLDER000000000上传文件先到达库根目录,准备好后移入文件夹。media upload-batch --folder 同样处理每个上传项。
在提议访问权限下,或项目要求审核代理更改时,新上传内容需等待人工审核后,标签、文件夹或all选择器才能播放;详见审核。
media upload-batch#
从清单上传多个本地文件,可从所需状态文件恢复。
media upload-batch <manifest.json> [--state FILE] [--concurrency N] [--tag TAG] [--folder ID]
[--poll-ms MS] [--timeout MS] [--no-transcode] [--codec h264|hevc]
[--max-fps N] [--max-edge PIXELS] [--webp-quality 1-100] [--no-progress]
[--preset signage-1080p30|signage-4k30] [--no-audio]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<manifest.json> | 路径 | 是 | 无 | { "items": [ { "path": "./a.png", "tag"?: "Lobby", "content_type"?: "image/png" } ] },包含 1 到 1000 个项目。路径相对于清单文件。 |
--state FILE | 路径 | 否 | 配置旁的私有文件 | 一个以每个源文件本地字节的 SHA-256 为键的 0600 JSON 文件。已存在的项目用 media_id 报告为 resumed。不要在项目间共享同一个状态文件。 |
--concurrency N | integer | 否 | CLI 默认值 | 并行上传。 |
--no-transcode | boolean | 否 | 关闭 | 上传源字节,不做更改,如 media upload 所示。 |
--poll-ms MS | integer | 否 | 1000 | 等待时操作轮询间隔。 |
--timeout MS | integer | 否 | 120000 | 等待的截止时间。它也限制每个底层请求。 |
--codec | string | 否 | h264 | h264 或 hevc;avc 和 h265 被接受为别名。仅当所有播放剪辑的屏幕都是原生播放器时使用 hevc。 |
--max-fps N | number | 否 | 30 | 恒定输出帧率。每个视频无论源帧率如何,均以此速率编码,确保连续剪辑帧率不变。大于 0,最多 240。 |
--max-edge PIXELS | integer | 否 | 3840 | 对每条边设置范围,范围为 16 到 3840。保持宽高比,不会对较小的源进行放大。 |
--webp-quality | integer | 否 | 90 | WebP 编码的静态质量,范围从 1 到 100。 |
--preset | string | 否 | 未设置 | signage-1080p30 或 signage-4k30。支持方向感知视频尺寸和恒定 30 fps。--max-edge 和 --max-fps 可收紧预设但不能放大。仅限视频;不能与 --no-transcode 结合。 |
--no-audio | boolean | 否 | 关闭 | 视频传输时省略音轨。仅视频;不能与 --no-transcode 组合。 |
--tag TAG | string | 否 | 无 | 当项目省略自身标签时应用。 |
--folder ID | string | 否 | 库根目录 | 一个现有的mfd_媒体文件夹。每个上传的项目在上传后都会移动到该文件夹中,并由data.folder_id报告。 |
--no-progress | boolean | 否 | 关闭 | 不输出进度信息。 |
screenrig media upload-batch ./images.json --state ./upload-state.json信封按清单顺序携带 data.items[],每个包含 path、source_filename、sha256、outcome(accepted 或 resumed)和 media_id。data.failed[] 携带未落地的项目。
media replace#
就地替换媒体的文件。其 ID、播放列表和日程继续有效。
media replace <id> <file> [--expect-rev REVISION] [--note TEXT] [--content-type TYPE] [--no-wait]
[--poll-ms MS] [--timeout MS] [--no-transcode] [--codec h264|hevc] [--max-fps N]
[--max-edge PIXELS] [--webp-quality 1-100] [--no-progress]
[--preset signage-1080p30|signage-4k30] [--no-audio]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | med_ 对象 ID。 |
<file> | 路径 | 是 | 无 | 新的静态图片、视频片段或音频轨道。它必须与媒体种类相同:图片对图片、视频对视频、音频对音频。在开始任何工作之前检查(usage_error,退出码 2)。 |
--expect-rev REVISION | string | 否 | 无 | 可选的修订前提条件。提供的过期值为 revision_conflict,并且已声明的上传会被取消:请读取 media show ID 后再次运行命令。 |
--note TEXT | string | 否 | 无 | 与新版本一同保存,并显示给审核者。最多 280 个字符。 |
--content-type TYPE | string | 否 | 从上传的字节检测 | 自行声明媒体类型,而不是让 CLI 检测。 |
--no-wait | boolean | 否 | 关闭 | 替换被接受后立即返回。新文件尚未投入使用;请使用 operations wait 完成。 |
--poll-ms MS | integer | 否 | 1000 | 等待时操作轮询间隔。 |
--timeout MS | integer | 否 | 120000 | 等待的截止时间。它也限制每个底层请求。 |
--no-transcode | boolean | 否 | 关闭 | 上传源字节,不做更改。ffmpeg、ffprobe 和 cwebp 不会运行。无损 WebP 仍被拒绝。 |
--codec | string | 否 | h264 | h264 或 hevc;avc 和 h265 被接受为别名。仅当所有播放剪辑的屏幕都是原生播放器时使用 hevc。 |
--max-fps N | number | 否 | 30 | 恒定输出帧率。每个视频无论源帧率如何,均以此速率编码,确保连续剪辑帧率不变。大于 0,最多 240。 |
--max-edge PIXELS | integer | 否 | 3840 | 对每条边设置范围,范围为 16 到 3840。保持宽高比,不会对较小的源进行放大。 |
--webp-quality | integer | 否 | 90 | WebP 编码的静态质量,范围从 1 到 100。 |
--preset | string | 否 | 未设置 | signage-1080p30 或 signage-4k30。支持方向感知视频尺寸和恒定 30 fps。--max-edge 和 --max-fps 可收紧预设但不能放大。仅限视频;不能与 --no-transcode 结合。 |
--no-audio | boolean | 否 | 关闭 | 视频传输时省略音轨。仅视频;不能与 --no-transcode 组合。 |
--no-progress | boolean | 否 | 关闭 | 不输出进度信息。进度始终输出到 stderr;stdout 仅保留用于单个结果封装。 |
screenrig media replace med_01EXAMPLEIMAGE0000000000 ./menu-v2.png
screenrig media replace med_01EXAMPLEVIDEO0000000000 ./intro.mp4 --expect-rev 3 --note "Spring cut"媒体保留其 ID、标签和文件夹,因此引用它的每个播放列表和日程会在下一个清单中播放新文件,标签、文件夹和 all 选择器也会随之更新。无需重新安排任何内容。该命令执行与 media upload 相同的步骤(转换、套餐的视频字节上限、尺寸上限、存储额度、签名传输),然后进行替换而不是添加新媒体。它不接受 --tag 或 --folder。
默认情况下,命令会等待处理完成。data.media_id 和 data.id 是媒体 ID,data.version 是新文件在 media versions 中的编号,data.revision 是媒体的新修订。data.warnings、data.operation、data.upload、data.transcode 和耗时的报告方式与 media upload 相同,操作 ID 位于信封中。使用 --no-wait 时,data.operation 是已接受的操作,data.version 和 data.warnings 不会出现。
允许更改宽高比。信封中带有 aspect_ratio_changed 警告,data.warnings[].playlists 会列出使用该媒体的播放列表,请检查它们的显示效果。与当前文件字节相同的文件会被拒绝,返回 resource_conflict(退出码 13)。
每个先前的文件都保留在媒体的历史记录中,并计入已存储字节,直到其版本被删除;参见 media versions。
在 Propose 访问权限下,或项目要求对代理更改进行审核时,替换会等待人工审核,命令成功返回(退出码 0):data.status 为 pending_review,data.review_id 指明审核,警告 pending_review 给出其 URL,data.next 为 screenrig reviews show ID。在有人批准之前,媒体继续播放其当前文件,因此请告知对方它正在等待,且不要重复写入。同一媒体较新的替换会取代正在等待的那个。参见审核。
media versions#
列出媒体曾有的文件,当前使用的文件排在最前。
media versions <id> [--limit N] [--cursor CURSOR]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | med_ 对象 ID。 |
--limit N | integer | 否 | 每一页 | 读取包含此数量版本的一页,范围为 1 到 100。 |
--cursor CURSOR | string | 否 | 无 | 读取上一页 data.next_cursor 之后的那一页。 |
screenrig media versions med_01EXAMPLEIMAGE0000000000data.items 为媒体曾有的每个文件提供一个条目:number、current、filename、content_type、sha256、bytes、width、height、duration_ms、codecs、source(upload、replace、sync 或 restore)、note、by(种类为 person、agent、client 或 sync,含 ID 和名称)以及 restored_from。当前使用的文件排在最前(current: true),其余按从新到旧排列。版本 1 是首次上传;每次替换、恢复或媒体同步更改都会增加下一个编号。
不带 --limit 和 --cursor 时会读取所有页面,且 data.next_cursor 为 null。带其中任意一个时只读取一页:只要 data.next_cursor 是字符串,就用设为该值的 --cursor 再次运行命令。只读访问权限即可。过去版本的字节会一直保存并计入项目的已存储字节,直到 media version delete 将其删除;保留的版本数量没有限制,超出套餐免费存储的已存储字节与其他存储一样计费。
media restore#
将过去的版本作为新版本重新投入使用。
media restore <id> --number N [--expect-rev REVISION] [--note TEXT]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | med_ 对象 ID。 |
--number N | integer | 是 | 无 | 要重新投入使用的版本号,与 media versions 所列相同。 |
--expect-rev REVISION | string | 否 | 无 | 可选的修订前提条件。提供的过期值为 revision_conflict:请读取 media show ID 后再次运行命令。 |
--note TEXT | string | 否 | 无 | 与新版本一同保存,并显示给审核者。最多 280 个字符。 |
screenrig media restore med_01EXAMPLEIMAGE0000000000 --number 2
screenrig media restore med_01EXAMPLEIMAGE0000000000 --number 2 --expect-rev 5 --note "Back to the winter menu"媒体保留其 ID 并进入新的修订,引用它的每个播放列表和日程都会再次播放该文件。被复制的版本仍保留在历史记录中并共用其字节;新版本与其他版本一样计入已存储字节。data.media 是媒体,当恢复的文件宽高比不同时,data.warnings 带有 aspect_ratio_changed,列出使用该媒体的播放列表。
当前使用的版本不能恢复(resource_conflict,退出码 5),未知版本为 not_found(退出码 4)。在 Propose 访问权限下,或项目要求对代理更改进行审核时,恢复会等待人工审核,命令成功返回(退出码 0):data.status 为 pending_review,并带有 data.review,警告 pending_review 给出其 URL,data.next 为 screenrig reviews show ID。在有人批准之前,媒体继续播放其当前文件,因此请勿重复写入。
media version delete#
删除过去的版本及其已存储的字节。
media version delete <id> --number N| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | med_ 对象 ID。 |
--number N | integer | 是 | 无 | 要删除的版本号,与 media versions 所列相同。 |
screenrig media version delete med_01EXAMPLEIMAGE0000000000 --number 2该版本的记录被删除,其字节立即从项目的已存储字节中扣除。已存储的对象在 24 小时后被移除,除非另一个版本或当前使用的文件持有同一文件。已删除的版本无法恢复。当前使用的版本不能被删除,并且在媒体的替换等待审核期间,任何版本都不能被删除;这两种情况均为 resource_conflict(退出码 5),media versions ID 会显示哪个版本正在使用。未知版本为 not_found(退出码 4)。删除需要 Manage 访问权限:Propose 凭据会被拒绝并返回 insufficient_access,删除操作绝不会被提交审核。
media show#
读取一个媒体对象,包括其当前版本。
media show <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | med_ 对象 ID。 |
screenrig media show med_01EXAMPLEIMAGE0000000000media download#
写入存储的渲染文件以供检查。切勿打印字节。
media download <id> [--output FILE]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | med_ 对象 ID。 |
--output FILE | 路径 | 否 | ./<id>.<ext> 位于当前目录 | 文件路径,不是目录。现有文件将被覆盖。扩展名遵循内容类型。 |
screenrig media download med_01EXAMPLEIMAGE0000000000 --output ./lobby.webp信封报告 media_id、path、bytes、sha256、content_type、primitive、filename,可选 source_filename,以及 width / height。它从不携带像素。用于在生成静态图像上屏前进行校验。
media list#
列出媒体对象,可按标签和原始类型筛选。
media list [--tag TAG] [--primitive image|video|audio] [--folder ID|root] [--library]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--tag TAG | string | 否 | 无 | 匹配 ^[A-Za-z0-9]{1,32}$。存在此筛选器时,未标记对象将被省略。 |
--primitive | string | 否 | 全部 | image,video,或 audio。限制列表仅显示静态图像、剪辑或配乐轨道。 |
--folder ID|root | string | 否 | 每个文件夹 | 仅此 mfd_ 文件夹内的文件,不含子文件夹,或带 root 时仅库根目录文件。API 应用筛选。 |
--library | boolean | 否 | 关闭 | 改为以只读方式列出组织媒体库的媒体:每行带有 library: true。可在播放列表页面中使用它们的 ID;只能在媒体库项目中修改它们。 |
screenrig media list --tag LobbyLoop --primitive video
screenrig media list --folder mfd_01EXAMPLEFOLDER000000000
screenrig media list --library每一行都包含 folder_id,但在库根目录下没有。
media update#
更改或清除单个对象的标签。其可用性规则通过 media availability 设置。
media update <id> (--tag TAG | --tags TAG1,TAG2 | --clear-tag) [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | med_ 对象 ID。 |
--tag TAG | string | 两者之一 | 无 | 替换标签,1 到 32 个字母或数字。 |
--clear-tag | boolean | 两者之一 | 关闭 | 发送 null 并保持对象未标记。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig media update med_01EXAMPLEIMAGE0000000000 --tag LobbyLoop在提议访问权限下,或项目要求审核代理更改时,重新标记已批准的媒体会以警告media_review_pending回应ok:屏幕继续使用其已批准的标签播放,直到人工批准更改,拒绝则恢复标签。审核结果几秒内显示在reviews list;未更改任何已批准播放列表或待审核播放列表的重新标记自动生效。详见审核。
media availability#
设置或清除动态选择器何时可以选取某个文件。
media availability <id> (--file FILE | --clear) [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | med_ 对象 ID。 |
--file FILE | string | 两者之一 | 无 | 一条 JSON 可用性规则。 |
--clear | boolean | 两者之一 | 关闭 | 移除规则;文件始终可用。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig media availability med_01EXAMPLEIMAGE0000000000 --file rule.json规则的成员和行为见媒体可用性。
media delete#
删除一个媒体对象。
media delete <id> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | med_ 对象 ID。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig media delete med_01EXAMPLEIMAGE0000000000media move#
将媒体文件和文件夹移动到某个文件夹,或移回库根目录。
media move <id>... (--folder ID | --root)| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id>... | string | 是 | 无 | 一个或多个 med_ 文件 ID 和 mfd_ 文件夹 ID,总数最多 1000 个。 |
--folder ID | string | 两者之一 | 无 | 目标 mfd_ 文件夹。 |
--root | boolean | 两者之一 | 关闭 | 移动到库根目录。 |
screenrig media move med_01EXAMPLEIMAGE0000000000 med_01EXAMPLEVIDEO0000000000 --folder mfd_01EXAMPLEFOLDER000000000
screenrig media move mfd_01EXAMPLEFOLDER000000000 --root移动为全有或全无请求。文件夹不能移动到自身或其内部文件夹,文件夹最多嵌套10层。目标中已有项保持不变。data.media 和 data.folders 统计移动数量。
移动文件会改变其旧文件夹和新文件夹的 by:folder 选择器的播放内容,从每个屏幕的下一个选择器解析开始;移动文件夹不会改变任何文件夹自身的文件。在 Propose access 下,或当项目需要代理变更审核时,每个移动的文件需等待人工审核(reviews list),已批准的播放列表继续按批准时所在文件夹播放;详见 审核。
media folder list#
列出项目的媒体文件夹。
media folder list [--library]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--library | boolean | 否 | 关闭 | 改为以只读方式列出组织媒体库的文件夹:每行带有 library: true,by:folder 选择器可以指定其中一个来播放其中的文件。 |
screenrig media folder list
screenrig media folder list --library返回项目的所有文件夹,最多 1000 个,按名称排序:data.items 包含 id、name、parent_id(null 位于库根目录)和 revision。从 parent_id 构建树。文件的文件夹在 media list 上的 folder_id 和 media show;在库根目录则不存在。
media folder show#
读取一个媒体文件夹。
media folder show <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | mfd_ 文件夹 ID。 |
screenrig media folder show mfd_01EXAMPLEFOLDER000000000信封携带文件夹的 name、parent_id 和 revision。
media folder create#
在库根目录或另一个文件夹内创建媒体文件夹。
media folder create --name NAME [--parent ID]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--name NAME | string | 是 | 无 | 1 到 100 个字符,修剪。名称可重复。 |
--parent ID | string | 否 | 库根目录 | 创建它的 mfd_ 文件夹。 |
screenrig media folder create --name Menus
screenrig media folder create --name Lunch --parent mfd_01EXAMPLEFOLDER000000000组织跨其所有项目最多持有 1000 个文件夹,嵌套深度最多 10 级。播放列表通过 by:folder 选择器播放文件夹中的文件。
media folder update#
重命名媒体文件夹,或将其连同内部所有内容移动到另一个文件夹。
media folder update <id> [--name NAME] [--parent ID | --root] [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | mfd_ 文件夹 ID。 |
--name NAME | string | 至少包含 --name、--parent、--root 之一 | 未更改 | 新名称,1至100字符。 |
--parent ID | string | 至少包含 --name、--parent、--root 之一 | 未更改 | 将文件夹及其所有内容移动到此 mfd_ 文件夹。不支持 --root。 |
--root | boolean | 至少包含 --name、--parent、--root 之一 | 关闭 | 将文件夹移动到库根目录。不支持 --parent。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig media folder update mfd_01EXAMPLEFOLDER000000000 --name Archive
screenrig media folder update mfd_01EXAMPLEFOLDER000000000 --root文件夹不能移动到自身或其内部的文件夹,且移动必须保持所有文件夹层级不超过 10 级。发送当前值为无操作。
media folder delete#
删除媒体文件夹。其文件和文件夹上移一级。
media folder delete <id> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | mfd_ 文件夹 ID。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig media folder delete mfd_01EXAMPLEFOLDER000000000仅删除文件夹。其文件和文件夹上移至其父级,或无父级时上移至库根目录。命名该文件夹的 by:folder 选择器将不匹配任何内容,请先重新指向这些播放列表。
媒体同步
媒体同步使媒体文件夹与 SharePoint、OneDrive for work、Dropbox 或 Google Drive 文件夹保持同步。每次运行都会导入来源文件夹内直接包含的图片(png、jpeg、webp、gif)、视频(mp4、webm)和音频(mp3);子文件夹会被忽略。已更改的文件会在相同的媒体 ID 下替换其字节,因此播放它的每个播放列表都会更新;在来源处被删除或移出的文件会退出播放:其媒体会被删除,或者在仍有屏幕显示它时,移到 Removed 子文件夹,并在没有任何内容持有它时删除。其他文件会连同原因列为已跳过:请在播放列表中用文档链接显示 Office 文件或 PDF,并把 MOV 等格式导出为 MP4 H.264。播放列表通过 by:folder 选择器播放该文件夹。
每个同步都通过项目的一个账户读取。账户 ID 以 msa_ 开头,同步 ID 以 msy_ 开头。media sync account add microsoft365 保存您自己的 Microsoft Entra 应用,或指定项目的一个 Microsoft 连接;media sync account add dropbox 为 Dropbox 账户的所有者打印一次性链接;media sync account add google-drive 读取与服务账号地址(screenRIG 的或您自己的)共享的文件夹。先测试账户,再根据文件夹的地址创建同步:它立即到期。
用 --secret-file FILE 提供客户端密钥,用 --key-file FILE 提供 Google Drive 密钥,或用 - 从标准输入读取,绝不作为参数传入。密钥在服务器上加密封存,只会显示为 data.secret {set, hint}。读取需要 Read 访问权限,所有更改都需要 Manage 访问权限。
media sync account add microsoft365#
添加您自己的 Microsoft Entra 应用,或项目的 Microsoft 连接,以便同步可以读取 SharePoint 或 OneDrive for work 文件夹。
media sync account add microsoft365 --name NAME
(--tenant-id TENANT --client-id ID --secret-file FILE | --connection-id ID)| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--name NAME | string | 是 | 无 | 1 到 80 个字符。 |
--tenant-id TENANT | string | 没有 --connection-id | 无 | 您组织的目录(租户)ID,或其主域名,例如 contoso.onmicrosoft.com;绝不能是 common、organizations 或 consumers。需与 --client-id 和 --secret-file 一起使用。 |
--client-id ID | string | 没有 --connection-id | 无 | 应用注册的应用程序(客户端)ID,一个 GUID。 |
--secret-file FILE | string | 没有 --connection-id | 无 | 从此文件读取客户端密钥的值,或用 - 从标准输入读取(绝不作为参数传入);文件中只包含该值。 |
--connection-id ID | string | 没有 --tenant-id | 无 | 通过项目的 Microsoft 连接(pcn_…)登录(两种模式均可),以代替 --tenant-id、--client-id 和 --secret-file。不能与它们一起使用。 |
screenrig media sync account add microsoft365 --name Contoso --tenant-id contoso.onmicrosoft.com --client-id 0b1d2f3a-4c5e-4f60-8a7b-9c0d1e2f3a4b --secret-file secret.txt
screenrig media sync account add microsoft365 --name Contoso --connection-id pcn_01EXAMPLECONNECTION0000在 Microsoft Entra 管理中心注册一个不带重定向 URI 的单租户应用,添加客户端密钥(复制其值,而不是密钥 ID),添加 Microsoft Graph 应用程序权限 Sites.Selected(然后授予该应用对每个站点的读取权限)或 Files.Read.All,并授予管理员同意。该应用属于此项目。接着运行 media sync account test。
media sync account add dropbox#
添加 Dropbox 账户,并打印其所有者在登录 Dropbox 后打开以完成连接的一次性链接。
media sync account add dropbox --name NAME [--app-key KEY]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--name NAME | string | 是 | 无 | 1 到 80 个字符。 |
--app-key KEY | string | 否 | screenRIG 的 Dropbox 应用 | 您自己的 Dropbox 应用的 app key:1 到 64 个字母和数字,绝不是其 app secret。 |
screenrig media sync account add dropbox --name "Marketing Dropbox"
screenrig media sync account add dropbox --name "Marketing Dropbox" --app-key YOURAPPKEYdata.authorize_url 是链接,data.authorize_expires_at 是其到期时间。CLI 绝不会打开浏览器:请把链接发给 Dropbox 账户的所有者,由其允许只读访问(files.metadata.read、files.content.read、account_info.read)。运行 media sync account show,直到 data.state 变为 ready(初始为 pending_consent),然后运行 media sync create dropbox。您自己的 Dropbox 应用需要启用这些权限,并添加输出中打印的重定向 URI。
media sync account add google-drive#
添加 Google Drive 账户,立即可用,并打印用于共享文件夹的服务账号地址。
media sync account add google-drive --name NAME [--key-file FILE]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--name NAME | string | 是 | 无 | 1 到 80 个字符。 |
--key-file FILE | string | 否 | screenRIG 的服务账号 | 从此文件读取您自己的 Google Cloud 服务账号的 JSON 密钥,或用 - 从标准输入读取(绝不作为参数传入)。 |
screenrig media sync account add google-drive --name "Marketing Drive"
screenrig media sync account add google-drive --name "Marketing Drive" --key-file key.jsondata.config.service_account_email 是要与每个文件夹共享的地址;Viewer 权限即可。通过 screenRIG 的服务账号,只有当此项目中邮箱已验证的成员共享或拥有该文件夹时,它才会同步(否则为 media_sync_sharer_not_member)。使用您自己的密钥时,任何与该服务账号共享的文件夹都会同步。
media sync account list#
列出此项目的媒体同步账户,并显示其类型、状态和最近一次测试;不会返回任何密钥。
media sync account list无参数。
screenrig media sync account listmedia sync account show#
查看一个账户:其租户和客户端 ID、状态、屏蔽后的密钥和最近一次测试。
media sync account show <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 账户(msa_…)。 |
screenrig media sync account show msa_01EXAMPLEACCOUNT0000000Dropbox 账户还会显示是谁连接了它以及其 app_key;Google Drive 账户显示其 service_account_email。
media sync account update#
重命名账户,更改 Microsoft 应用的租户、应用程序 ID 或客户端密钥,或替换 Google Drive 账户自己的密钥。
media sync account update <id> [--name NAME] [--tenant-id TENANT] [--client-id ID]
[--secret-file FILE | --key-file FILE] [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 账户(msa_…)。 |
--name NAME | string | 否 | 未更改 | 重命名账户。 |
--tenant-id TENANT | string | 否 | 未更改 | 租户的目录 ID 或主域名。 |
--client-id ID | string | 否 | 未更改 | 应用注册的应用程序(客户端)ID。 |
--secret-file FILE | string | 否 | 未更改 | 从此文件读取新的客户端密钥的值,或用 - 从标准输入读取;它会替换已存储的密钥。省略的密钥会保留。 |
--key-file FILE | string | 否 | 未更改 | 从此文件读取 Google Drive 账户自己的 JSON 密钥,或用 - 从标准输入读取;它必须属于同一个服务账号。不适用于 --secret-file。 |
--expect-rev REVISION | integer | 否 | 无 | 除非账户处于此修订版本(revision_conflict,退出码 6),否则拒绝更改。 |
screenrig media sync account update msa_01EXAMPLEACCOUNT0000000 --secret-file new-secret.txt
screenrig media sync account update msa_01EXAMPLEACCOUNT0000000 --name "Contoso tenant" --expect-rev 2至少需要一项更改。更改凭据会清除 last_test:请重新测试该账户。Entra 客户端密钥会过期,因此请在其过期之前在此替换密钥。
media sync account connect#
生成新的一次性链接,用于连接或重新连接 Dropbox 账户。
media sync account connect <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 账户(msa_…)。 |
screenrig media sync account connect msa_01EXAMPLEACCOUNT0000000data.authorize_url 和 data.authorize_expires_at 带有该链接,它会取代之前的链接。把它发给 Dropbox 账户的所有者。当对方没有完成授权,或账户为 reconnect_required(Dropbox 不再认可该连接)时使用。已连接的账户在新的授权完成之前保持连接,而另一个 Dropbox 账户登录后会接管该连接。
media sync account test#
检查账户:Microsoft 应用的登录和 Graph 权限,或 Dropbox 或 Google Drive 账户的连接或密钥。
media sync account test <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 账户(msa_…)。 |
screenrig media sync account test msa_01EXAMPLEACCOUNT0000000响应存储为 last_test。对于 Microsoft 应用,它报告 credentials(Microsoft 已签发令牌;被拒绝时会带有其 AADSTS 代码,例如密钥是 ID 而不是值时的 AADSTS7000215)和 permissions(令牌带有的 Graph 应用程序权限)。仅有 Sites.Selected 则为警告:每个站点仍然需要单独授予,共享链接则需要 Files.Read.All。该测试不判定站点的授权或某个文件夹:media sync create 会读取您指定的文件夹。检查失败时,data.ok 为 false,退出码为 0。
media sync account delete#
删除没有任何同步使用的账户。
media sync account delete <id> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 账户(msa_…)。 |
--expect-rev REVISION | integer | 否 | 无 | 除非账户处于此修订版本(revision_conflict,退出码 6),否则拒绝删除。 |
screenrig media sync account delete msa_01EXAMPLEACCOUNT0000000只要有同步使用该账户,响应就是 resource_conflict(退出码 5),并指明它们:请先删除这些同步。
media sync create dropbox#
将 Dropbox 文件夹同步到媒体文件夹。
media sync create dropbox --account-id ID --url URL|PATH [--folder-id ID] [--every DURATION] [--name NAME]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--account-id ID | string | 是 | 无 | 用于读取的已连接 Dropbox 账户(msa_…)。 |
--url URL | string | 是 | 无 | 文件夹的 Dropbox 地址(https://www.dropbox.com/home/...)、账户已添加到其 Dropbox 的共享文件夹链接,或以 / 开头的路径。团队空间中的文件夹从团队根目录读取。 |
--folder-id ID | string | 否 | 以来源文件夹命名的新媒体文件夹 | 文件所放入的媒体文件夹(mfd_…)。 |
--every DURATION | string | 否 | 15m | 检查变更的频率,5 分钟到 24 小时:15m、1h、6h,或纯秒数(300 到 86400)。 |
--name NAME | string | 否 | 来源文件夹的名称 | 1 到 80 个字符。 |
screenrig media sync create dropbox --account-id msa_01EXAMPLEACCOUNT0000000 --url https://www.dropbox.com/home/Marketing/Lobby%20Signs
screenrig media sync create dropbox --account-id msa_01EXAMPLEACCOUNT0000000 --url /Marketing/Lobby --folder-id mfd_01EXAMPLEFOLDER000000000 --every 1h --name "Lobby signs"每次运行都从 Dropbox 在该文件夹中保存的位置继续,只读取发生变化的内容。账户无法打开的文件夹为 media_sync_source_refused,Dropbox 不再认可的连接为 dropbox_reconnect_required(media sync account connect):两者的退出码均为 5,不存储任何内容。
media sync create google-drive#
将与账户的服务账号共享的 Google Drive 文件夹同步到媒体文件夹。
media sync create google-drive --account-id ID --url URL|ID [--folder-id ID] [--every DURATION] [--name NAME]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--account-id ID | string | 是 | 无 | 用于读取的 Google Drive 账户(msa_…)。 |
--url URL | string | 是 | 无 | 文件夹的地址(https://drive.google.com/drive/folders/ID)或其 ID。请先把文件夹共享给账户的 service_account_email;Viewer 权限即可。 |
--folder-id ID | string | 否 | 以来源文件夹命名的新媒体文件夹 | 文件所放入的媒体文件夹(mfd_…)。 |
--every DURATION | string | 否 | 15m | 检查变更的频率,5 分钟到 24 小时:15m、1h、6h,或纯秒数(300 到 86400)。 |
--name NAME | string | 否 | 来源文件夹的名称 | 1 到 80 个字符。 |
screenrig media sync create google-drive --account-id msa_01EXAMPLEACCOUNT0000000 --url https://drive.google.com/drive/folders/1AbCdEfGhIjKlMnOpQrStUvWxYz --folder-id mfd_01EXAMPLEFOLDER000000000 --every 1h
screenrig media sync create google-drive --account-id msa_01EXAMPLEACCOUNT0000000 --url 1AbCdEfGhIjKlMnOpQrStUvWxYz通过 screenRIG 的服务账号,只有当此项目中邮箱已验证的成员共享或拥有该文件夹时,它才会同步(media_sync_sharer_not_member,退出码 3,不存储任何内容)。每次运行都会重新检查这一点,失去这样的共享者的文件夹会使同步停在 error 状态,并保留其媒体:请从成员的 Google 账号重新共享,然后运行 media sync update ID --resume。Google Docs、Sheets 和 Slides 文件会作为 unsupported_type 被跳过。地址无法打开的文件夹为 media_sync_source_refused(退出码 5):请将其共享给该服务账号。
media sync list#
列出此项目的媒体同步,并显示其媒体文件夹、频率、状态和最近一次运行的状态。
media sync list无参数。
screenrig media sync listmedia sync show#
查看一个同步及其最近一次运行的摘要。
media sync show <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 同步(msy_…)。 |
screenrig media sync show msy_01EXAMPLESYNC000000000data.last_run 带有 status(ok、partial 或 error)、added、updated、removed、pending_delete(屏幕仍持有的已移除文件,在 Removed 文件夹中等待)以及 skipped(附每个文件的原因:unsupported_type、too_large、storage、subfolder、download_failed、unreadable、in_use);失败的运行带有 error,其中的 code 和 detail 会指明修复方法。data.source 为 Dropbox 增加 path,为 Google Drive 增加 shared_by。
状态为 error 的同步需要修复。其媒体文件夹已被删除:用 media sync update --folder-id 将其指向另一个文件夹。其来源文件夹已被删除或移动:删除该同步并创建一个新的。对于通过 screenRIG 服务账号使用的 Google Drive,该文件夹失去了已验证的共享者(sharer_not_member):请从项目成员的 Google 账号重新共享,然后运行 media sync update ID --resume。当 Dropbox 不再认可该连接(media sync account connect)时,Dropbox 运行会以 reconnect_required 失败。
media sync update#
更改同步的名称、频率或媒体文件夹,或暂停和恢复它。
media sync update <id> [--name NAME] [--every DURATION] [--folder-id ID]
[--pause | --resume] [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 同步(msy_…)。 |
--name NAME | string | 否 | 未更改 | 重命名同步。 |
--every DURATION | string | 否 | 未更改 | 检查变更的频率,5 分钟到 24 小时。 |
--folder-id ID | string | 否 | 未更改 | 改为填充此媒体文件夹(mfd_…)。下一次运行会重新读取整个来源,并把每个已同步的文件放入其中。 |
--pause | boolean | 否 | 关闭 | 停止运行,直到恢复。不适用于 --resume。 |
--resume | boolean | 否 | 关闭 | 恢复运行;也会重新启动因错误而停止的同步。不适用于 --pause。 |
--expect-rev REVISION | integer | 否 | 无 | 除非同步处于此修订版本(revision_conflict,退出码 6),否则拒绝更改。 |
screenrig media sync update msy_01EXAMPLESYNC000000000 --every 1h
screenrig media sync update msy_01EXAMPLESYNC000000000 --pause
screenrig media sync update msy_01EXAMPLESYNC000000000 --folder-id mfd_01EXAMPLEFOLDER000000000 --expect-rev 3至少需要一项更改。
media sync run#
立即运行同步,而不是等到下一次运行时间。
media sync run <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 同步(msy_…)。 |
screenrig media sync run msy_01EXAMPLESYNC000000000同步会在大约 30 秒内运行,之后 media sync show 会显示其最近一次运行。已暂停的同步必须先恢复。
media sync delete#
停止同步;其媒体和文件夹会保留。
media sync delete <id> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 同步(msy_…)。 |
--expect-rev REVISION | integer | 否 | 无 | 除非同步处于此修订版本(revision_conflict,退出码 6),否则拒绝删除。 |
screenrig media sync delete msy_01EXAMPLESYNC000000000同步会忘记哪个来源文件对应哪个媒体。已导入的媒体和媒体文件夹会保留,不会移除任何内容。
应用
应用是一个已构建的静态目录,根目录为 index.html。打包器在 _screenrig/runtime.js 注入浏览器 SDK 并添加其脚本标签,因此应用无需构建步骤即可访问 window.screenrig,且无需添加依赖。目录中无任何内容在打包时构建或执行。
app pack#
将静态目录打包成确定性归档,无需上传。
app pack <directory> [--output FILE]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<directory> | 路径 | 是 | 无 | 构建的静态目录。需要根 index.html。 |
--output FILE | 路径 | 否 | 无内容 | 还将归档写入此路径。未指定时,命令报告归档并保留在内存中。 |
screenrig app pack ./lobby-board --output ./lobby-board.tgz信封报告 sha256、compressed_bytes、expanded_bytes、file_count、条目列表,以及 SDK 运行时是否被注入。app upload 打包目录本身,仅在想先检查归档时使用此命令。
应用运行在阻止内联代码的内容安全策略下。打包会将内联样式和脚本块移入 _screenrig/inline/ 下的文件并链接。内联事件处理器如 onclick= 和 javascript: URL 无法移动;打包拒绝它们并标明文件和行号。
app upload#
打包目录,发布为新应用版本,等待发布成功。
app upload <directory> [--name NAME] [--no-wait] [--poll-ms MS] [--timeout MS]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<directory> | 路径 | 是 | 无 | 构建的静态目录。 |
--name NAME | string | 否 | 无 | 应用名称,最多 120 个字符。 |
--no-wait | boolean | 否 | 关闭 | 在发布操作完成前返回。发布前运行 operations wait,将版本固定到播放列表。 |
--poll-ms MS | integer | 否 | 1000 | 等待时操作轮询间隔。 |
--timeout MS | integer | 否 | 120000 | 等待的截止时间。它也限制每个底层请求。 |
screenrig app upload ./lobby-board --name "Lobby board"读取三个字段:data.operation.state 是 succeeded,data.application.release_id 是 rel_ ID,一个 application 原语引脚,data.application.id 是 app_ ID,kv 命令使用。成功操作(非单独的发布 ID)表示发布可用。
每个 app upload 创建一个新应用和第一个不可变版本。发布同一应用的后续版本,使用 app update。播放列表保持提供已固定的版本,直到编辑该原始版本。
app update#
发布现有应用的新版本,保留身份、名称和应用 K/V。
app update <id> <directory> [--expect-rev REVISION] [--no-wait] [--poll-ms MS]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | app_ 应用 ID。 |
<directory> | 路径 | 是 | 无 | 构建的静态目录。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
--no-wait | boolean | 否 | 关闭 | 在发布操作完成前返回。发布前运行 operations wait,将版本固定到播放列表。 |
--poll-ms MS | integer | 否 | 1000 | 等待时操作轮询间隔。 |
screenrig app update app_01EXAMPLEAPP00000000000 ./lobby-board等待 data.operation.state: "succeeded",然后使用 playlist replace-release 审查确切的页面、原语、新版本和受影响的屏幕。使用返回的影响令牌和可选的修订保护(如 播放列表工作流 中所述)进行应用。现有播放列表固定保持不变直到应用。遇到修订冲突时,重新读取应用后再决定是否重试;不要为了绕过冲突而创建替代应用。
app list#
列出项目的应用程序。
app list无参数。
screenrig app listapp show#
读取一个应用。
app show <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | app_ 应用 ID。 |
screenrig app show app_01EXAMPLEAPP00000000000latest_ready_release 在首次发布达到就绪前不会出现。发布状态属于操作和发布版本,不属于应用。
app delete#
删除一个应用及其所有版本。
app delete <id> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | app_ 应用 ID。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig app delete app_01EXAMPLEAPP00000000000无单独的发布删除。当屏幕显示应用的某个发布时,删除返回 application_in_use:请先给这些屏幕其他内容。删除不检查固定发布但未显示的播放列表,因此也需更新或删除这些播放列表。
应用键值
键值存储属于一个应用且支持二进制安全。每个命令使用--app-id和来自app upload的app_ID,绝不使用发布ID。每次写入仅使用一种值模式。
kv list#
列出为一个应用程序存储的密钥。
kv list --app-id ID| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--app-id ID | string | 是 | 无 | app_ 应用 ID。 |
screenrig kv list --app-id app_01EXAMPLEAPP00000000000kv get#
读取一个密钥。
kv get --app-id ID <key>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--app-id ID | string | 是 | 无 | app_ 应用 ID。 |
<key> | string | 是 | 无 | 要读取的键。 |
screenrig kv get --app-id app_01EXAMPLEAPP00000000000 menukv set#
从 JSON、文件或 base64 字节写入一个密钥。
kv set --app-id ID <key> --json-value JSON [--expect-rev REVISION]
kv set --app-id ID <key> --file FILE [--content-type TYPE] [--expect-rev REVISION]
kv set --app-id ID <key> --value-base64 BASE64 [--content-type TYPE] [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--app-id ID | string | 是 | 无 | app_ 应用 ID。 |
<key> | string | 是 | 无 | 要写入的键。 |
--json-value JSON | string | 单一模式 | 无 | 一个 JSON 值,发送前规范化,始终存储为 application/json。也接受显式的 application/json 内容类型。 |
--file FILE | 路径 | 单一模式 | 无 | 从文件或使用 - 读取值字节,默认为 application/octet-stream。 |
--value-base64 BASE64 | string | 单一模式 | 无 | 规范填充的标准 base64,无空白,最多 1,398,104 字符。默认值为 application/octet-stream。 |
--content-type TYPE | string | 否 | 字节的 application/octet-stream | 一到 127 个字符。 |
--expect-rev REVISION | string | 否 | 无 | 仅当存储条目仍处于此版本时写入。 |
screenrig kv set --app-id app_01EXAMPLEAPP00000000000 menu --json-value '{"soup":"lentil"}'kv delete#
删除一个键。
kv delete --app-id ID <key> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--app-id ID | string | 是 | 无 | app_ 应用 ID。 |
<key> | string | 是 | 无 | 要删除的键。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig kv delete --app-id app_01EXAMPLEAPP00000000000 menu键值webhook
键值 webhook 是一个 URL,写入一个应用的一个键,因此任何外部系统,如 销售点、电子表格脚本或定时任务,都可通过一次 HTTP POST 向屏幕推送数据。订阅 kv.onChange 的应用会在运行该应用的每个屏幕上几秒内更新。每个应用最多有 20 个 webhook。
发送方使用 webhook 的秘密 srkw_… 进行身份验证,作为 Authorization: Bearer <secret>,或使用 HTTP Basic,用户名为 webhook id,密码为秘密;URL 或查询字符串中的秘密不被接受。原始主体最大 1 MiB,成为键的值,Content-Type 为其内容类型。每次 POST 计为一次计费 API 请求,计量并计入存储,如 kv set,提升版本,响应键的新元数据,绝不返回值。可选 Idempotency-Key 头用于 24 小时内去重发送方重试。单个 webhook 最多每分钟 120 次 POST,缺失或错误的秘密或未知 webhook 返回 401。从其他系统推送数据 有 curl 示例。
秘密仅由 kv webhook create 和 kv webhook rotate-secret 显示。URL 非秘密。创建、轮换和删除 webhook 会在项目事件日志中追加 kv_webhook.created、kv_webhook.secret_rotated 和 kv_webhook.deleted,每次 POST 像任何写入一样追加 kv.updated。
| 问题代码 | 退出 | 含义 |
|---|---|---|
kv_webhook_limit_reached | 5 | 应用已达到 20 个 webhook 上限。未创建新项。请先删除一个。 |
not_found | 4 | 应用不属于此项目,或无此 ID 的 webhook。 |
kv webhook create#
创建一个写入单个密钥的 webhook,并一次性获取其 URL 和密钥。
kv webhook create <key> --app-id ID [--description TEXT]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<key> | string | 是 | 无 | 每个帖子写入的键,长度为1至256字符:首字符为字母或数字,后续为字母、数字、.、_、:、/或-。键可不存在。 |
--app-id ID | string | 是 | 无 | app_ 应用 ID。 |
--description TEXT | string | 否 | 无 | 发送给它的内容,最多 200 字符。不得包含凭证。 |
screenrig kv webhook create menu --app-id app_01EXAMPLEAPP00000000000 --description "Point of sale menu feed"信封是 webhook:data.id(kvw_…)、data.key、data.url(https://api.screenrig.ai/api/applications/<app_id>/kv-webhooks/<id>/write)和 data.secret(srkw_…)。请立即在发送系统中输入 URL 和密钥。后续命令不会再次显示该密钥。
kv webhook list#
列出应用程序的 webhook,最旧优先。
kv webhook list --app-id ID| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--app-id ID | string | 是 | 无 | app_ 应用 ID。 |
screenrig kv webhook list --app-id app_01EXAMPLEAPP00000000000每个项目都有 id、key、description、url、created_at,写入后还有 last_used_at。列表从不包含密钥。
kv webhook delete#
删除 Webhook。其 URL 立即停止工作,且密钥保持其值。
kv webhook delete <webhook_id> --app-id ID| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<webhook_id> | string | 是 | 无 | kvw_ Webhook ID。 |
--app-id ID | string | 是 | 无 | app_ 应用 ID。 |
screenrig kv webhook delete kvw_01EXAMPLEWEBHOOK00000 --app-id app_01EXAMPLEAPP00000000000kv webhook rotate-secret#
替换Webhook密钥并仅接收一次新密钥。
kv webhook rotate-secret <webhook_id> --app-id ID| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<webhook_id> | string | 是 | 无 | kvw_ Webhook ID。 |
--app-id ID | string | 是 | 无 | app_ 应用 ID。 |
screenrig kv webhook rotate-secret kvw_01EXAMPLEWEBHOOK00000 --app-id app_01EXAMPLEAPP00000000000信封在 data.secret 中携带新密钥。旧密钥立即失效,请在发送系统中输入新密钥。
卡片 webhook
卡片 webhook 是写入一张卡片数据文档的 URL,因此 CMS、销售点或脚本等外部系统只需一次 HTTP POST 即可向卡片推送数据。kv webhook create、list、rotate-secret 和 delete 用 --card CARD_ID 代替 --app-id;下方的 update 和 deliveries 仅适用于卡片。每张卡片最多有 20 个 webhook。
kv webhook create --card CARD_ID [--description TEXT] [--map FILE|-] [--signing]
kv webhook list --card CARD_ID
kv webhook rotate-secret <webhook_id> --card CARD_ID [--signing]
kv webhook delete <webhook_id> --card CARD_ID创建卡片 webhook 不需要键。--map FILE(或用于 stdin 的 -)是映射,--signing 开启签名。响应包含 data.secret,如果 webhook 签名,还包含 data.signing_secret,各仅显示一次。
发送方的认证方式与应用 webhook 相同:使用 srkw_… 密钥的 Authorization: Bearer <secret>,或以 webhook ID 为用户名的 HTTP Basic,因此 https://kvw_ID:srkw_…@api.screenrig.ai/… 适合只能填写 URL 的发送方。请求体最大 1 MiB,为 JSON 或 application/x-www-form-urlencoded;重复的表单名会变成数组。没有映射时,发送的对象就是卡片的数据文档。
映射是一个 JSON 模板,用于根据请求体构建文档。包含占位符(如 {{body.alert.title}} 或 {{body.items[0].name}})的字符串是文本,恰好只有一个占位符的字符串会保留值的类型。路径以 body 或 query(URL 的查询参数)开头,不含任何内容的路径在文本中为空,单独出现时会省略该值。$each 映射数组,并提供 item 和 index,$group 配合 $by 按首次出现的顺序分组,$number 读取 1,234.50、$3.50、3,50 € 或 12%(逗号作小数点时添加 "$decimal": ","),$bool 读取 true、yes、y、1 和 x,$text 配合 $max 截断文本。模板在保存时检查:invalid_request 会指出失败的位置。
{
"title": "{{body.alert.title}}",
"body": "{{body.alert.message}}",
"items": { "$each": "{{body.items}}", "$limit": 20, "$template": { "text": "{{item.name}}" } }
}curl https://api.screenrig.ai/api/cards/crd_01EXAMPLEBOARD0000000000/kv-webhooks/kvw_01EXAMPLEWEBHOOK00000/write \
-H "Authorization: Bearer $CARD_WEBHOOK_SECRET" \
-H "Content-Type: application/json" \
--data '{"alert":{"title":"Fire drill","message":"Leave by the east door"},"items":[{"name":"Floor 2"}]}'每次发送都按卡片自身的数据进行检查:card_data_invalid 会指出路径,且不会写入任何内容。与卡片当前文档相同的文档会返回 unchanged 且不写入任何内容,因此不会唤醒任何屏幕。被接受的发送算一次计费的 API 请求,每个 webhook 每分钟最多接受 120 次发送,Idempotency-Key 标头会对发送方 24 小时内的重试去重。
错误的地址、错误或缺失的密钥、已停用的 webhook、缺失或错误的签名以及每个 GET 都得到相同的 404 响应,因此链接预览或猜测不会泄露任何信息。kv webhook deliveries 会说明原因。
使用 --signing 时,每次发送还必须携带 ScreenRig-Signature: t=<unix seconds>,v1=<hex>,其中 v1 是 t、一个点和原始请求体在签名密钥 whsec_… 下的 HMAC-SHA256,且 t 必须在服务器时钟的五分钟以内。这是 screenRIG 自身 webhook 签名的格式。
服务商签名和握手
服务商各自用自己的方式给请求签名,有些根本无法发送您的密钥。卡片 webhook 可以用服务商的签名代替密钥来验证,并响应服务商的设置握手,因此 GitHub、Stripe、Shopify、Slack、Linear、Vercel、Asana、Microsoft Graph、monday.com、Trello 和 Azure Event Grid 可以直接向它发送,无需中转。其他任何用 HMAC 签名的发送方同样可用。创建或更改 webhook 时,通过 API 设置 verify 和 handshake(POST /api/cards/{id}/kv-webhooks,然后是 PATCH /api/cards/{id}/kv-webhooks/{webhook_id})。
verify是{vendor, secret},对于generic_hmac还有header、encoding(hex或base64)、timestamp_header和tolerance_seconds(默认 300)。带有服务商有效签名的请求会被接受,无需 webhook 自己的srkw_密钥,该密钥仍可并行使用。服务商密钥加密封存,只显示为set及其最后四个字符。发送verify但不带secret的更改,在服务商不变时会保留已存储的密钥,verify: null会移除验证。verify和--signing互相排斥。handshake是microsoft_graph、monday、trello或azure_event_grid,null会将其移除。Slack 和 Asana 通过verify.vendor响应各自的握手。
verify.vendor | 标题 | 签名的内容 | 时间戳 |
|---|---|---|---|
github | X-Hub-Signature-256 | 正文的 HMAC-SHA256 | 无 |
stripe | Stripe-Signature | 时间戳、一个点和正文的 HMAC-SHA256;任何一个 v1 匹配即可 | 5 分钟 |
shopify | X-Shopify-Hmac-Sha256 | 正文的 HMAC-SHA256,base64 编码 | 无 |
slack | X-Slack-Signature | v0:、时间戳、一个冒号和正文的 HMAC-SHA256 | X-Slack-Request-Timestamp,5 分钟 |
linear | Linear-Signature | 正文的 HMAC-SHA256 | 正文中的 webhookTimestamp,1 分钟 |
vercel | x-vercel-signature | 正文的 HMAC-SHA1 | 无 |
asana | X-Hook-Signature | 以握手的 X-Hook-Secret 为密钥的正文 HMAC-SHA256 | 无 |
generic_hmac | 您指定的 header | 正文的 HMAC-SHA256;设置了 timestamp_header 时则是时间戳、一个点和正文的 HMAC-SHA256 | tolerance_seconds |
每个 HMAC 的密钥都是服务商所显示的密钥文本(Stripe 的包含 whsec_)。签名按正文到达时的原样以恒定时间验证,并在请求消耗写入额度之前完成,而且先于其时间戳进行判断:timestamp_stale 始终表示密钥是正确的。正文可以是 JSON、表单或 multipart/form-data,其中文本字段为 body.FIELD,文件只计数、不读取。
| 服务商 | screenRIG 的响应 | 后续请求 |
|---|---|---|
Slack(verify.vendor slack) | 带有其 challenge 的已签名 url_verification;用 curl 测试的人可以改为发送 webhook 的密钥 | 用签名密钥签名 |
Asana(asana) | 握手的 X-Hook-Secret,它会加密封存并作为每个 X-Hook-Signature 的密钥。再次收到相同的密钥视为重试;不同的密钥会被拒绝,并返回 handshake_invalid | X-Hook-Signature |
Microsoft Graph(microsoft_graph) | 将解码后的 ?validationToken= 作为 text/plain 返回 | 携带 webhook 的密钥 |
monday.com(monday) | 它发送的 challenge,以 JSON 原样返回 | 携带 webhook 的密钥 |
Trello(trello) | HEAD 检查仅针对此 webhook,返回 200 且不带正文 | 携带 webhook 的密钥 |
Azure Event Grid(azure_event_grid) | {"validationResponse": "CODE"} | 携带 webhook 的密钥 |
握手只会针对为该服务商设置的 webhook 响应,在要求任何凭据之前,针对属于该握手的请求,并且已停用的 webhook 绝不会响应。它不写入任何内容,从不计费,也不消耗速率额度。Microsoft Graph、monday.com、Trello 和 Azure Event Grid 不发送 screenRIG 验证的请求头,因此它们的投递只有携带 webhook 的密钥才会被接受。Azure Event Grid 把它作为标记为机密的静态投递头 Authorization: Bearer srkw_… 携带,其事件以数组形式到达,所以映射读取 body[0]。
| 服务商 | 在服务商的设置中 |
|---|---|
| GitHub | Settings、Webhooks、Add webhook:Payload URL 填 webhook 的 url,内容类型填 application/json,密钥相同。GitHub 的 ping 带有签名,会被接受 |
| Stripe | Workbench、Webhooks:添加 url 并显示其签名密钥。Stripe 轮换密钥期间会为每个密钥发送一个 v1,任一个都会被接受;之后用 PATCH 替换已存储的密钥 |
| Shopify | 用 url 以 JSON 格式订阅。密钥是应用的客户端密钥 |
| Slack | Events API 的 Request URL 是 url,密钥是应用的签名密钥。斜杠命令会发送表单:{{body.text}}、{{body.user_name}} |
| Linear | 在 API 设置中用 url 创建 webhook,并复制其签名密钥。正文中的 webhookTimestamp 必须与服务器时钟相差不超过一分钟 |
| Vercel | Team settings、Webhooks:用 url 创建一个。Vercel 只会显示一次密钥 |
| Asana | 用 {"verify": {"vendor": "asana"}} 创建 webhook:它还没有密钥,会以 secret_pending 拒绝事件。然后创建 Asana webhook,把 target 设为 url,握手会设置密钥。要换用新密钥,先对 verify 为 null 执行 PATCH,再用该服务商重新设置 |
| Microsoft Graph | 创建订阅,把 notificationUrl 设为 url |
| monday.com | 用 url 运行 create_webhook |
| Trello | POST /1/webhooks,把 callbackURL 设为 url |
| Azure Event Grid | 创建事件订阅,把 url 作为其 webhook 端点,并添加上面的投递头 |
curl https://api.screenrig.ai/api/cards/crd_01EXAMPLEBOARD0000000000/kv-webhooks \
-H "Authorization: Bearer $SCREENRIG_TOKEN" -H "Content-Type: application/json" \
--data '{"description":"Pushes","verify":{"vendor":"github","secret":"YOUR_SECRET"},
"mapping":{"title":"{{body.repository.full_name}}","body":"{{body.head_commit.message}}"}}'
用自己的 HMAC 签名的发送方,需要指定请求头、编码,如果签名时间戳,还要指定时间戳请求头:
curl https://api.screenrig.ai/api/cards/crd_01EXAMPLEBOARD0000000000/kv-webhooks \
-H "Authorization: Bearer $SCREENRIG_TOKEN" -H "Content-Type: application/json" \
--data '{"verify":{"vendor":"generic_hmac","secret":"YOUR_SECRET","header":"X-Acme-Signature",
"encoding":"base64","timestamp_header":"X-Acme-Time","tolerance_seconds":120},
"mapping":{"title":"{{body.sensor}}","body":"{{body.state}}"}}'
ts=$(date +%s); body='{"sensor":"door","state":"open"}'
sig=$(printf '%s.%s' "$ts" "$body" | openssl dgst -sha256 -hmac "$SECRET" -binary | openssl base64 -A)
curl "$URL" -H "Content-Type: application/json" -H "X-Acme-Time: $ts" -H "X-Acme-Signature: $sig" -d "$body"
每次失败都和其他任何拒绝返回相同的 404。kv webhook deliveries 会显示原因,握手的结果显示为 handshake:
| 原因 | 含义 |
|---|---|
signature_missing | 已设置 verify,而请求既没有携带密钥,也没有携带服务商的请求头 |
signature_invalid | 请求头格式错误,或与正文不匹配 |
timestamp_missing | 签名需要时间戳,而请求没有携带 |
timestamp_stale | 签名有效,但其时间戳超出时间窗口 |
secret_pending | Asana 的验证仍在等待其握手 |
handshake_invalid | 该请求是某个服务商的握手,无法响应 |
kv webhook update#
更改卡片 webhook:其描述、映射、启用状态或签名。
kv webhook update <webhook_id> --card CARD_ID [--description TEXT] [--map FILE|-] [--clear-map]
[--enable|--disable] [--signing|--no-signing]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<webhook_id> | string | 是 | 无 | kvw_ Webhook ID。 |
--card CARD_ID | string | 是 | 无 | crd_ 卡片 ID。 |
--description TEXT | string | 否 | 无 | 发送给它的内容,最多 200 字符。不得包含凭证。 |
--map FILE | 路径 | 否 | 无 | 用从文件读取的 JSON 对象替换映射,或用 - 表示 stdin。 |
--clear-map | boolean | 否 | 关闭 | 移除映射:发送的对象即成为文档。 |
--enable / --disable | boolean | 否 | 关闭 | 在使用 --enable 之前,--disable 对每次发送的响应都与错误密钥相同。 |
--signing / --no-signing | boolean | 否 | 关闭 | --signing 要求签名标头并仅打印一次签名密钥;--no-signing 不再要求。 |
screenrig kv webhook update kvw_01EXAMPLEWEBHOOK00000 --card crd_01EXAMPLEBOARD0000000000 --map alert-map.json信封即该 webhook。data.signing_secret 只出现一次,在开启签名的那次响应中。
kv webhook deliveries#
读取卡片 webhook 过去七天的投递日志,最新的在前。
kv webhook deliveries <webhook_id> --card CARD_ID [--limit N]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<webhook_id> | string | 是 | 无 | kvw_ Webhook ID。 |
--card CARD_ID | string | 是 | 无 | crd_ 卡片 ID。 |
--limit N | number | 否 | 100 | 返回多少条投递记录,1 到 100。 |
screenrig kv webhook deliveries kvw_01EXAMPLEWEBHOOK00000 --card crd_01EXAMPLEBOARD0000000000每一项包含 at、outcome(written、unchanged、refused、invalid 或 handshake)、reason(例如 credentials、signature、disabled、body、mapping、card_data_invalid 或 rate_limited)、detail、status、bytes、revision 和 request_id。不会存储正文、请求头或凭据,向错误地址发送的请求不会留下任何记录。
播放列表
播放列表是页面的 JSON 文档。playlist init 从有序输入准备全屏文档。playlist create 和 playlist update 从文件读取该文档;形状在命令下总结。
playlist init#
从本地媒体文件、准备好的媒体ID、应用发布ID或HTTP 或 HTTPS URL准备可编辑的全屏播放列表。
playlist init <inputs...> --name NAME --output FILE [--overwrite] [--screen-id ID]
[--target-width PX --target-height PX] [--duration-ms MS] [--fit contain|cover|fill]
[--no-transcode] [--no-progress] [--poll-ms MS]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<inputs...> | 文件、med_ ID、rel_ ID 或 HTTP 或 HTTPS URL | 是 | 无 | 播放顺序。本地图像/视频文件上传后等待准备,除非有 --no-transcode。现有媒体必须已准备好。HTTP 和 HTTPS URL 可以包含局域网主机和嵌入的凭据,不会获取页面。Player 网页应用要求 HTTPS URL 中不包含用户名或密码。 |
--name NAME | string | 是 | 无 | 播放列表显示名称。 |
--output FILE | 路径 | 是 | 无 | 写入可编辑的 {name, pages} 文档。自动创建父目录。默认独占。 |
--overwrite | boolean | 否 | 关闭 | 原子性替换现有输出文件。 |
--screen-id ID | string | 否 | 无 | 读取目标屏幕的尺寸和修订版。 |
--target-width PX / --target-height PX | integer | 一起 | 未设置 | 覆盖画布大小。两者都覆盖或都不覆盖。未提供屏幕或屏幕报告未知或多个表面时必需。 |
--duration-ms MS | integer | 否 | 8000 | 非视频页面的持续时间。 |
--fit | string | 否 | contain | contain,cover,或 fill 用于图像和视频页面。应用和 iframe 使用 fill。 |
--no-transcode | boolean | 否 | 关闭 | 上传的文件字节未改变。 |
--no-progress | boolean | 否 | 关闭 | 抑制 stderr 上的上传进度。 |
--poll-ms MS | integer | 否 | 1000 | 上传轮询间隔。 |
screenrig playlist init med_POSTER med_VIDEO --name "Lobby loop" --screen-id scr_LOBBY --output lobby.json准备写入本地文档并可能上传媒体;不创建远程播放列表或分配屏幕。检查文档,然后screen publish。参见准备、发布和编辑播放列表。
playlist validate#
在创建或更新前本地验证播放列表文档。无需网络。
playlist validate <file>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<file> | 路径 | 是 | 无 | 播放列表文档。 |
screenrig playlist validate ./lobby-loop.json错误精确指明 JSON 路径。通过表示本地结构和跨字段语义有效;授权、媒体准备、动态选择器计数、持续时间和远程可用性仍需服务器检查。创建和更新在写入前执行此检查。结果还带有不会使检查失败的几何 lint 发现项:motion_overuse、collision、safe_margin 和 adjacent_repeat。要查看页面外观,请发布它并运行 screen screenshot。
playlist create#
根据 JSON 文档、模板或内置的“紧急通知”模板创建播放列表。
playlist create [file] [--from-template ID --name NAME [--set NAME=VALUE...] [--dry-run]] [--starter KEY [--name NAME]] [--format-region REGION --format-orientation ORIENTATION] [--note TEXT]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
[file] | 路径 | 否 | 无 | 播放列表文档。请提供它,或使用 --from-template,或 --starter。 |
--from-template ID | string | 否 | 无 | 根据此模板(pl_ ID)创建播放列表:使用其当前页面并填入 --set 的值,与任何播放列表一样接受检查。 |
--name NAME | string | 搭配 --from-template | 无 | 新播放列表的名称。 |
--set NAME=VALUE | string | 否 | 无 | 与 --from-template 搭配使用:字段的值;媒体字段则为就绪图片或视频的 ID。可重复使用。 |
--dry-run | boolean | 否 | 关闭 | 与 --from-template 搭配使用:检查值并报告页数,但不创建任何内容。 |
--starter KEY | string | 否 | 无 | 添加内置模板:urgent-notice,包含标题和消息,适用于快速公告。 |
--format-region REGION | string | 否 | 无 | header、footer 或 side:把播放列表变成沿该边缘绘制在页面之上的条带,并替换文件中的 format。请与 --format-orientation 一起给出。参见条带。 |
--format-orientation ORIENTATION | string | 配合 --format-region | 无 | landscape 或 portrait:条带所针对显示器的方向,以观看者看到的方向为准。 |
--note TEXT | string | 否 | 无 | 给审核变更者的备注:纯文本,最多 280 字符。变更即时生效时忽略此备注。 |
screenrig playlist create ./lobby-loop.jsonscreenrig playlist create --from-template pl_01EXAMPLETEMPLATE00000 --name "Monday notice" --set headline="Open late"信封中的 data.id 是 screen assign 所接受的 pl_ ID。当更改等待审阅时,data 为 {status: pending_review, review, playlist}:播放列表已存在且 approved_revision: 0,在有人批准前任何屏幕都无法显示它(playlist_not_approved)。模板是声明了 fields 的播放列表,不会显示在屏幕上(playlist_is_template);由它创建的播放列表是普通播放列表,可分配、排程和修订。
playlist update#
替换播放列表文档。
playlist update <id> <file> [--format-region REGION --format-orientation ORIENTATION] [--expect-rev REVISION] [--note TEXT]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | pl_ 播放列表 ID。 |
<file> | 路径 | 是 | 无 | 替换文档。 |
--format-region REGION | string | 否 | 无 | header、footer 或 side:把播放列表变成沿该边缘绘制在页面之上的条带,并替换文件中的 format。请与 --format-orientation 一起给出。参见条带。 |
--format-orientation ORIENTATION | string | 配合 --format-region | 无 | landscape 或 portrait:条带所针对显示器的方向,以观看者看到的方向为准。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
--note TEXT | string | 否 | 无 | 给审核变更者的备注:纯文本,最多 280 字符。变更即时生效时忽略此备注。 |
screenrig playlist update pl_01EXAMPLEPLAYLIST000000 ./lobby-loop.json当更改等待审核时,直播播放列表保持不变,直到有人批准提议。
playlist show#
读取一个播放列表,包括其当前版本。
playlist show <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | pl_ 播放列表 ID。 |
screenrig playlist show pl_01EXAMPLEPLAYLIST000000返回实时版本。approved_revision 对于无人批准的播放列表为 0,等待变更时 approval 显示开放审核,reviews show ID 返回提案。
playlist list#
列出项目的播放列表。
playlist list [--templates] [--library]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--templates | boolean | 否 | 关闭 | 仅模板:声明了字段的播放列表。 |
--library | boolean | 否 | 关闭 | 改为以只读方式列出组织媒体库的播放列表:可将其分配给屏幕、日程和堆叠,或用 playlist create --from-template 复制一个;只能在媒体库项目中修改它们。 |
screenrig playlist list --templates
screenrig playlist list --libraryplaylist fields#
显示模板的字段或副本的值,或更改值并使副本保持最新。
playlist fields <id> [--set NAME=VALUE...] [--clear NAME...] [--refresh] [--expect-rev REVISION] [--note TEXT]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 模板或由模板创建的播放列表的 pl_ ID。 |
--set NAME=VALUE | string | 否 | 无 | 设置字段的值。可重复使用。 |
--clear NAME | string | 否 | 无 | 清除可选字段的值。可重复使用。 |
--refresh | boolean | 否 | 关闭 | 无论值是否更改,都根据模板的当前修订版重新生成页面。 |
--expect-rev REVISION | string | 否 | 无 | 可选:要求此资源修订版。 |
--note TEXT | string | 否 | 无 | 给审阅此变更的人的备注。 |
screenrig playlist fields pl_01EXAMPLECOPY00000000 --set headline="Closed today"不带选项时,显示模板的字段及由其创建的播放列表数量,或副本的值、其所基于的模板修订版以及模板是否有更新的修订版。每次更改以及单独使用 --refresh,都会根据模板的当前修订版重新生成副本的页面,对模板所做的品牌变更正是这样传到现有副本的;不会自动推送。值的检查方式与创建时相同。在 Propose 访问下,更改会成为审阅。
playlist instances#
列出由模板创建的播放列表及各自所基于的模板修订版。
playlist instances <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 模板的 pl_ ID。 |
screenrig playlist instances pl_01EXAMPLETEMPLATE00000outdated 表示由模板的较旧修订版创建的播放列表;playlist fields ID --refresh 可使其保持最新。
playlist revisions#
列出播放列表的各个版本,最新的在前。
playlist revisions <id> [--after CURSOR]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | pl_ 播放列表 ID。 |
--after CURSOR | string | 否 | 无 | 上一页的 next_cursor。 |
screenrig playlist revisions pl_01EXAMPLEPLAYLIST000000每个版本都说明由什么产生(created、edited、附带所复制版本的 promoted,或 baseline,即播放列表在其历史开始时所处的版本)、由谁产生、何时产生、包含多少页面以及是否为当前版本。每页包含 50 个版本;next_cursor 读取下一页。
playlist revision show#
读取一个版本以及该版本时的播放列表。
playlist revision show <id> --revision N| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | pl_ 播放列表 ID。 |
--revision N | integer | 是 | 无 | 要读取的版本。 |
screenrig playlist revision show pl_01EXAMPLEPLAYLIST000000 --revision 3playlist promote#
将较早的版本复制为新版本,使其重新成为当前版本。
playlist promote <id> --revision N --expect-rev CURRENT| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | pl_ 播放列表 ID。 |
--revision N | integer | 是 | 无 | 要复制的版本。 |
--expect-rev CURRENT | string | 是 | 无 | 播放列表的当前版本(playlist show)。过期值为 revision_conflict:重新读取播放列表后重试。 |
screenrig playlist promote pl_01EXAMPLEPLAYLIST000000 --revision 3 --expect-rev 9该版本的页面、配乐和格式成为下一个版本。名称保持不变,较早的版本仍保留在列表中,所有显示该播放列表的屏幕都会更新。提升需要可直接发布的凭据;变更需等待审核的凭据会得到 forbidden。内容已是当前内容的版本不会产生任何变化。
playlist delete#
删除一个播放列表。
playlist delete <id> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | pl_ 播放列表 ID。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig playlist delete pl_01EXAMPLEPLAYLIST000000playlist export#
将图像和视频文件、背景音轨音频以及 iframe URL 导出为可移植的播放列表包。
playlist export <id> --output DIRECTORY [--skip-applications]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | pl_ 播放列表 ID。 |
--output DIRECTORY | 路径 | 是 | 无 | 目标目录。该目录必须不存在;捆绑包通过临时同级目录写入后重命名到位。 |
--skip-applications | 标志 | 否 | 关闭 | 移除应用程序基元,以及空页面或由应用程序控制的页面。必须至少保留一个页面。结果会列出已跳过的基元和页面 ID。 |
screenrig playlist export pl_01EXAMPLEPLAYLIST000000 --output ./lobby-bundle包中包含清单、播放列表文档,以及按内容寻址的图像、视频和背景音轨音频文件。动态选择器 all、tag 和 folder 会固定为确切的 ID,iframe URL 会保留,注释会被排除。
卡片、流和 adslot 页面会在下载媒体前阻止导出。应用程序默认也会阻止导出;--skip-applications 会移除应用程序基元,以及空页面或由应用程序控制的页面,并报告已跳过的基元和页面 ID。必须至少保留一个页面。使用此标志时,卡片、流和 adslot 页面仍会阻止导出。
如需保留卡片和应用程序引用的可编辑文档,请使用 screenrig playlist show pl_01EXAMPLEPLAYLIST000000 --output playlist.json。该文档使用同一项目中的现有资源。
playlist import#
从捆绑目录创建播放列表,或从中更新现有播放列表。
playlist import <directory> [--name NAME] [--update ID [--expect-rev REVISION] [--note TEXT]]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<directory> | 路径 | 是 | 无 | 由 playlist export 写入的捆绑目录。 |
--name NAME | string | 否 | 包的播放列表名称 | 1 到 120 个字符。将包导入为此名称下的新播放列表。 |
--update ID | string | 否 | 创建了新的播放列表 | 更新此 pl_ 播放列表而非创建新列表。可选接受 --expect-rev。 |
--expect-rev REVISION | string | 否 | 无 | 目标播放列表的当前修订版本。 |
--note TEXT | string | 否 | 无 | 使用 --update:给审核变更人员的备注,最多 280 字符。 |
screenrig playlist import ./lobby-bundle
screenrig playlist import ./lobby-bundle --name "Lobby loop (copy)"播放列表显示名称可能重复。导入时即使名称相同也会创建独立播放列表;使用带 ID 的 --update 替换现有播放列表。
导入在触及项目之前本地验证整个包:清单、文档、路径、媒体类型、长度和哈希。现有媒体在文件名、媒体类型、字节长度、哈希和标签完全匹配时重用;其余无转换上传,且仅在所有对象准备好后写入播放列表。
导入绝不删除或修剪远程媒体。如果上传开始后后续步骤失败,错误会列出确认准备好的对象,并说明播放列表写入是否开始。重试同一包会重用这些对象。
播放列表文档
播放列表由 name 加 pages 组成,带可选的 audio 原声带。每个页面包含 id、canvas、transition、advance,可选 visibility、可选 audio_cue 和 primitives。
模板会在文档中添加 fields,[{name, label, type, required, max_length?}] 的 type 为 text、media 或 url,并可将任何图元标记为 locked: true。页面读取字段的方式:在卡片的 params 中为 {field.NAME}(文本和地址字段),作为图片或视频的 selector.media_id(媒体字段),或作为 iframe 的整个 src(地址字段)。每个标记都必须指向类型正确的已声明字段,每个字段都必须被读取,已锁定的图元不读取任何字段;playlist validate 会离线检查这些。只有所有者或可以审批的成员才能更改已锁定的图元(primitive_locked)。
六种原语为 image、上传的 video、实时的 stream、Web 的 iframe 和 application,以及 card。文案和 chrome 不是传输类型:为实时文本放置 card,或上传完成的静态图像(由 media generate 生成)并将其作为图片放置。
流接收一个或两个有序源,协议唯一,备用媒体为同项目的已准备图像 fallback_media_id。每页及基于时长的前进最多用一个流。HLS 使用公共 HTTPS URL;Android 和 Qt 播放器直接连接 RTSP 摄像头源,包括登录信息。请参阅摄像头传输详情,了解各播放器能打开的 URL 格式;Android 和 Qt 可选的直接 UDP/MPEG-TS 多播使用 239/8 内的 IPv4 组和端口。源可以只给出 url,由 URL 方案决定协议。其他播放器选择 HLS 备选或显示备用。流字节不缓存重播。音频默认静音。播放列表包导入和导出不支持流。
{
"id": "live",
"primitive": "stream",
"sources": [
{
"protocol": "udp-mpegts",
"group": "239.10.0.1",
"port": 5000
},
{
"protocol": "hls",
"url": "https://example.com/live.m3u8"
}
],
"fallback_media_id": "med_fallback",
"muted": true,
"rect": {
"x": 0,
"y": 0,
"width": 1920,
"height": 1080
},
"layer": 0,
"content_fit": "contain"
}在带有 advance: {"mode":"duration","after_ms":30000} 的页面上使用此原语。替换示例源和备用 ID。播放器要求和传输设置。
每个原语都是扁平的:id、primitive、该原语自身字段,然后是rect、layer、content_fit,以及可选的enter。没有嵌套的内容对象。
图片和视频原语需要 selector。selector.by 为:id 并带有一个就绪的 media_id,且 one_at_a_time 为 false;ids 带有 1 到 1,024 个唯一的就绪 media_ids;all 表示该原语的每个就绪对象;tag 匹配 ^[A-Za-z0-9]{1,32}$;或 folder 带有现有 mfd_ 媒体文件夹的 folder_id,它直接播放文件夹内的就绪文件,不含任何子文件夹。不要在原语本身上放置 media_id,也不要发送服务器解析的项目。application 原语固定一个 release_id,iframe 原语接受 src 和标题,因此这两者都不接受选择器。src 是屏幕可以访问的任何 http 或 https 页面,包括局域网页面或需要登录的页面;YouTube 链接存储为其自动播放的嵌入形式。src,以及 iframe 的可选 fallback_src,可携带屏幕令牌,例如 {screen.field.kiosk_id},application 原语可携带使用相同令牌的 params,因此一个播放列表可为每个屏幕提供各自的页面。Android、Amazon Signage Stick、Linux、Raspberry Pi 和 Windows 播放器直接打开该页面。Player 网页应用以及 macOS、Samsung Tizen、LG webOS 和 BrightSign 播放器会将其嵌入框架,因此发送 X-Frame-Options(DENY、SAMEORIGIN 或已废弃的 ALLOW-FROM)的页面,或 Content-Security-Policy frame-ancestors 列表中不含播放器源的页面,在这些播放器上会显示被阻止的框架,而且 Player 网页应用只显示地址中不含登录信息的 https 页面。当发布检测到拒绝嵌入的公共 HTTPS 页面时,写入仍然成功,CLI 会打印服务器的 warnings 条目:代码 iframe_framing_refused、page_id、primitive_id 和 src、拒绝的标头,以及下一步(使用允许从播放器源嵌入的页面,或请其所有者允许该源)。服务器还会向事件日志追加 playlist.iframe_framing_refused 警告,每个拒绝的页面一条,events list 会用 primitive_id 打印。局域网页面、http 页面以及服务器在几秒内无法访问的页面不会被检查。播放器在清单显示于屏幕上后才报告播放列表在播放,因此已验证的发布并不证明 iframe 页面已渲染:请根据警告采取行动,或查看屏幕。两种 Web 原语都需要 fill 的 content_fit,因为二者都没有固有尺寸。
advance.mode 是 duration,带有 after_ms;在恰好有一个 YouTube 视频的页面上(播放列表或直播除外),还可以带有设为 video_end 的 until,使页面持续到视频播放结束,此时 after_ms 是屏幕无法读取视频时长时页面的显示时间;media_end 用于页面上只有一个图片或视频原件时,audio_end 用于页面的 audio_cue 指定了音轨时,或 application 带有 max_ms,当应用通过调用 window.screenrig.nextPage() 主动结束自己的回合时。一个 application 页面必须有且仅有一个标记为 controller 的原件;其他所有模式都禁止使用。
transition.type 是 crossfade、swipe-left、swipe-right、swipe-up、swipe-down、dip、wipe-left、wipe-right、wipe-up、wipe-down、slide-left、slide-right、slide-up、slide-down 或 stinger 之一。duration_ms 是必需的,范围为 0 到 60000。默认页面为 200 毫秒交叉淡入淡出。滑动会使两个页面像旋转木马一样一起移动。滑动效果是新页面覆盖旧页面,旧页面漂移四分之一距离。擦除效果是通过移动的硬边缘揭示新页面。浸入效果是先将旧页面淡出为纯色,然后淡入新页面;color 是可选的 #RRGGBB,默认 #000000,仅在 dip 上有效。方向名称表示运动方向:wipe-left 是向左移动的边缘。ease 是可选的:linear、in、out 或 in-out;默认是 linear 用于 crossfade 和 swipe-*,in-out 用于 dip、wipe-* 和 slide-*;不允许用于 stinger。新页面拥有其过渡效果。播放列表的第一页不播放过渡效果。
Stinger 是覆盖出站页面的主题全屏图形,在屏幕被覆盖时切换入站页面,然后揭开。用它命名播放列表的一个部分:放在该部分的第一页。stinger 对象是 type: "stinger" 所必需,且其他类型不允许。其所有成员均为可选。theme 是 neomustard(默认)、cyanotype、propaganda、signal、avant-garde、bloom 或 primetime 之一,匹配卡片主题。title 最多 40 字符,subtitle 最多 60 字符,设置于主题显示类型。logo 是 media: 加上项目中已准备图像的 ID,例如 media:med_01EXAMPLE。accent 是可选的 #RRGGBB,替换主题强调色。duration_ms 对 stinger 为 2000 至 6000,覆盖整个过渡;典型长度为 2700 至 4000。标题完整显示时间为 hang_ms,范围 0 至 6000,默认 1000(1 秒),hang_ms 最多为 duration_ms 的 60%;更长停留需更长 duration_ms。无法绘制 stinger 的播放器播放同长度交叉淡入。参见直播 Stinger 卡片 页面观看过渡效果。
以下示例展示了过渡页切换效果:
{ "type": "stinger", "duration_ms": 3500, "stinger": { "theme": "primetime", "title": "BREAKFAST", "subtitle": "Served until 11", "logo": "media:med_01EXAMPLE", "hang_ms": 1000 } }原始类型上的可选enter对象添加一个对象动画:fade-up、fade-down、fade-left、fade-right、fade-in、zoom-in或zoom-out。
可选的页面visibility对象限制页面播放时间:必需的enabled布尔值,可选的民用from和until边界,以及最多16个重复的windows,包含天数和民用时间。每个播放列表至少保留一个没有visibility字段的页面,运行定时播放列表的屏幕需要时区。请先设置该时区;screen assign和playlist update在无时区时本地拒绝,并指明修复命令。
页面的visibility.data条件{key, path?, equals?}仅在某个卡片数据文档匹配时才显示该页面:key是卡片数据键或卡片 ID,path是指向文档内部的 RFC 6901 指针,equals是字符串、数字、布尔值或 null(省略则测试该值是否存在)。键{screen.weather}读取每个屏幕自身所在位置的天气,位置由screen update ID --location LAT,LON设置:{"enabled":true,"data":{"key":"{screen.weather}","path":"/condition","equals":"rain"}}仅在该屏幕所在地下雨时显示该页面。天气文档包含condition(clear、cloud、fog、rain、snow、storm或wind)、band(freezing低于 0 °C,cold为 0 到 9,mild为 10 到 17,warm为 18 到 24,hot为 25 及以上)、以整数度表示的temperatureC以及isDay。它是屏幕所在 0.25 度单元的当前天气,约每小时刷新一次,不是预报。没有位置的屏幕永远不会显示该页面,发布时会拒绝文档无法包含的path或equals,例如用cloudy代替cloud。请保留一个没有visibility的普通页面作为后备。
可选的顶层audio对象添加一个在页面切换时持续播放的配乐。tracks列出1到128个条目,按播放顺序排列,每个条目具有唯一的id(页面ID模式)和准备好的audio媒体对象的media_id。loop默认true,在最后一首曲目后重新开始第一首;volume默认1,范围0到1,乘以播放器音量;cued默认false,true在每首曲目后停止配乐,使曲目仅在页面audio_cue启动时播放。普通页面可携带audio_cue,其trackID来自该列表,并可选带restart布尔值(默认false):页面出现时,播放器从头切换到该曲目,仅当曲目正在播放且restart为true时才重启。提示为线索,广告位页面不可携带,且无配乐的提示被拒绝。带有advance {"mode":"audio_end"}的页面在其audio_cue指定的曲目结束时结束,因此需要该提示和配乐,不接受after_ms,并遵循图像和视频原始元素的duration规则;stream原始元素仍需duration页面,页面上的应用永远不是其控制器;max_ms为服务器覆盖的可选提示。playlist update替换整个文档,省略audio则移除配乐。配乐创作。
卡片
浏览卡片类型,创建实例并更新其实时数据。播放列表放置返回的卡片 ID。
screenrig cards list
screenrig cards show gauge
screenrig card create --type gauge --file gauge-params.json
screenrig card list
screenrig card show crd_EXAMPLE
screenrig card params crd_EXAMPLE --file gauge-params.json
screenrig card data get crd_EXAMPLE
screenrig card data put crd_EXAMPLE --file gauge-data.json --expect-rev 1
screenrig card preview crd_EXAMPLE --output gauge.png屏幕
屏幕即一个播放器。这些命令读取它,指向播放列表,并管理其生命周期。写入时修订前提可选。
标签将屏幕分组为设备群。每个屏幕携带 0 到 16 个唯一标签,标签由 1 到 32 个字母或数字组成,通过 screen tag 设置。screen assign、screen reload、screen toast、screen tag 和 screen screenshot 接受一个或多个屏幕 ID,或 --tag TAG,设备群响应报告所有屏幕:见 设备群结果。
屏幕文件夹按地点对屏幕分组,每个屏幕一个文件夹。设备组命令也接受 --folder ID:见 屏幕文件夹。
screen pair#
使用 Player 屏幕上显示的代码将其配对。
screenrig screen pair "$PAIRING_CODE" --name "Lobby"screen list#
列出屏幕。除非请求,否则不包含归档屏幕。
screen list [--state archived] [--tag TAG] [--folder ID|root]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--state | string | 否 | 活跃屏幕 | 唯一接受的值是archived,仅列出已归档的屏幕。 |
--tag TAG | string | 否 | 每个屏幕 | 仅列出带有此精确标签的屏幕。 |
--folder ID|root | string | 否 | 每个屏幕 | 仅此 sfd_ 屏幕文件夹内直接包含的屏幕,不含其子文件夹中的屏幕,或带 root 时仅不在任何文件夹中的屏幕。 |
screenrig screen list --tag Lobby
screenrig screen list --folder sfd_01EXAMPLEFOLDER000000000每一行都包含该屏幕的 tags。有了 --human,当任意列出的屏幕有标签时,表格会增加一个 TAGS 列。
screen show#
读取一个屏幕,包括版本、分配和在线状态。
screen show <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | scr_ 屏幕 ID。 |
screenrig screen show scr_01EXAMPLESCREEN00000000tags 列出屏幕的车队标签。effective_playlist、takeover 和 playlist_schedule 报告屏幕播放内容及原因;见 计划和接管。health 和播放器的主机能力见 设备健康和电源。online 为真时表示播放器已连接,包括短暂重连窗口。可选的 last_online_at 和 last_ip 在首次连接后出现。可选的 observation 报告播放器绘制的表面:id、width、height、pixel_ratio 和 presentation。以上均为只读;screen update 无法发送它们,归档屏幕仍返回其行。
commands 列出屏幕最近 10 次重启、重新加载、清除缓存、应用重启和更新,最早的在前,每条包含其 type、其 state(queued、sent、done、failed、expired、cancelled 或 superseded)、其 source(由重启排程发出的重启为 schedule;由人工请求的则没有)、其 expires_at,以及发送或完成的时间。reboot_schedule 和 next_reboot_at 报告屏幕的重启排程和下一个重启窗口的开始时间。播放器结束的清除缓存、应用重启或更新还会携带其 cause 和一条简短的 detail,--human 会将其打印为 CAUSE 列以及表格下方的一行。suspension 携带已暂停屏幕的 message 和 since。被 screen replace 归档的屏幕会报告 replaced_by,即其设备迁移到的屏幕。使用 --human 时,screen show 会打印其中每一项。
last_outage 报告屏幕最近一次中断:offline_since、back_at 和 duration_s,并在健康报告做出判定后给出 likely_cause,其值为 device_restart、app_crash、app_restart、network 或 platform;screenRIG 无法判断时则不出现。重启会在屏幕恢复时判定,而网络或 screenRIG 原因要等 Player 的下一份健康报告,最长可能需要十五分钟。glass 携带 screenRIG 根据屏幕的播放报告和截图得出的判定。使用 --human 时,screen show 会输出 Last outage 和 Likely cause,并在判定发现问题时输出 Playlist stalled、Blank screen 或 Frozen picture;这些判定不涉及的内容见通知。
screen update#
一次调用即可补丁屏幕名称、播放列表分配或时区。
screen update <id> [--name NAME] [--playlist-id ID] [--timezone ZONE] [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | scr_ 屏幕 ID。 |
--name NAME | string | 否 | 未更改 | 屏幕的显示名称。 |
--playlist-id ID | string | 否 | 未更改 | 该屏幕应运行的 pl_ 播放列表。 |
--timezone ZONE | string | 否 | 未更改 | IANA 区域标识符,如 America/Los_Angeles。根据服务器的区域数据库验证。补丁永远不会清除区域。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig screen update scr_01EXAMPLESCREEN00000000 --name "Lobby"审核中,仅--playlist-id的更改像screen assign一样被提议;提议会话无法更改其他字段。
screen publish#
从准备好的文件创建新播放列表并分配给屏幕。
screen publish <id> <file> [--expect-rev REVISION] [--note TEXT]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | scr_ 屏幕 ID。 |
<file> | 路径 | 是 | 无 | 准备好的播放列表文档,或 - 表示标准输入。 |
--expect-rev REVISION | string | 否 | 无 | 可选的 屏幕 修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
--note TEXT | string | 否 | 无 | 给审核变更者的备注:纯文本,最多 280 字符。变更即时生效时忽略此备注。 |
screenrig screen publish scr_LOBBY lobby.json这会创建一个新的播放列表并分配它。不会按名称更新现有播放列表。请先检查准备好的文档。重复相同输入以恢复模糊失败。分配回读不证明播放;请单独请求截图。审核中返回stage: pending_review,同时带有两个审核。详见准备、发布和编辑播放列表。
screen assign#
将一个屏幕或一组屏幕指向播放列表。
screen assign (<id>... | --tag TAG) --playlist-id ID [--expect-rev REVISION] [--note TEXT]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id>... | string | <id> 或 --tag 之一 | 无 | 一个或多个 scr_ 屏幕 ID。多个 ID 作为一个舰队请求运行。 |
--tag TAG | string | <id> 或 --tag 之一 | 无 | 每个带此标签的活动屏幕。 |
--playlist-id ID | string | 是 | 无 | 要运行的 pl_ 播放列表。 |
--expect-rev REVISION | string | 否 | 无 | 仅一个屏幕 ID。可选的修订前提。省略则写入当前资源。提供的过时值为 revision_conflict:重新获取、重新应用、重试。 |
--note TEXT | string | 否 | 无 | 给审核变更者的备注:纯文本,最多 280 字符。变更即时生效时忽略此备注。 |
screenrig screen assign scr_01EXAMPLESCREEN00000000 --playlist-id pl_01EXAMPLEPLAYLIST000000
screenrig screen assign --tag Lobby --playlist-id pl_01EXAMPLEPLAYLIST000000如果播放列表调度任何页面且屏幕无时区,CLI 在发送任何内容前拒绝并提示运行 screen set-timezone 命令。拒绝不消耗版本。车队中,每个屏幕独立应用该规则:无时区屏幕结果失败,其他屏幕被分配。
要发布到设备群,先用 playlist create 创建播放列表,然后运行 screen assign --tag TAG --playlist-id ID。screen publish 针对单个屏幕。
screen set-timezone#
设置排程播放列表读取的民用时区。
screen set-timezone <id> --timezone ZONE [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | scr_ 屏幕 ID。 |
--timezone ZONE | string | 是 | 无 | IANA 区域标识符,如 Europe/Berlin。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig screen set-timezone scr_01EXAMPLESCREEN00000000 --timezone America/Los_Angeles页面计划是民用时间,没有时区则无意义。更改时区会重新铸造清单修订。
screen archive#
隐藏屏幕并使其玻璃变暗。
screen archive <id> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | scr_ 屏幕 ID。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig screen archive scr_01EXAMPLESCREEN00000000归档会将屏幕从默认列表中隐藏,并使玻璃变暗。它不会解除播放器的绑定。
screen unarchive#
恢复归档的屏幕至默认列表。
screen unarchive <id> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | scr_ 屏幕 ID。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig screen unarchive scr_01EXAMPLESCREEN00000000一个播放器也可以归档自己的屏幕:持有密钥的播放器确认重置,或通过 Cookie 配对的浏览器播放器取消配对。screen show 然后报告 archive_reason 为 device_reset 或 device_unpair(project 为你请求的归档),带 archived_at。屏幕保留其设备绑定,持有该密钥或设备 Cookie 的播放器保持暗屏,取消归档时恢复,无需重新配对。被重置或取消配对的播放器丢弃密钥或 Cookie,作为新屏幕重新配对。确认屏幕恢复替换的密钥保持废弃。
由 screen replace 归档为 replaced 的屏幕不保留设备绑定,因此取消归档会拒绝它,screen delete 则会将其删除。
screen suspend#
在屏幕上显示通知以代替其内容,直到屏幕恢复。
screen suspend <id> --message TEXT [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | scr_ 屏幕 ID。 |
--message TEXT | string | 是 | 无 | 屏幕显示的通知:修剪后为 1 到 280 个字符。换行符是唯一允许的控制字符,播放器会自动换行并保留其中的换行符。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig screen suspend scr_01EXAMPLESCREEN00000000 --message "Closed for stocktake. Back at 9am."已暂停的屏幕显示该消息以代替其内容。其他一切不变:其播放列表、排程、接管和显示控制仍然保留并继续演进,而 screen resume 会让屏幕显示其此刻本应显示的内容。screen show 报告 suspension,带有 message 和 since;对已暂停的屏幕再次暂停会替换消息并保留 since。暂停会提升屏幕版本,播放器立即重新获取。归档屏幕返回 screen_archived。
screen resume#
结束屏幕的暂停,使其重新显示自身内容。
screen resume <id> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | scr_ 屏幕 ID。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig screen resume scr_01EXAMPLESCREEN00000000恢复会让屏幕重新显示自身内容,以屏幕此刻本应显示的内容为准,播放器会立即重新获取。未暂停的屏幕原样返回,版本不变。归档屏幕返回 screen_archived。
screen delete#
删除屏幕。
screen delete <id> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | scr_ 屏幕 ID。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig screen delete scr_01EXAMPLESCREEN00000000只有在没有播放器密钥绑定到屏幕时才能删除它,此时 screen show 为该屏幕报告 deletable: true。通过代码配对的播放器,无论是本地播放器还是浏览器播放器,都持有密钥,该密钥保持绑定在其屏幕上,因此删除这样的屏幕会返回 409 screen_archive_required(退出码 5):请改为归档。只有通过 Cookie 配对的浏览器播放器不持有密钥,其屏幕无论已配对还是仍在等待,都可以删除。
screen replace#
将配对为另一个屏幕的设备移到此屏幕,保留此屏幕的设置和历史记录。
screen replace <id> --with ID [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 要保留的 scr_ 屏幕。 |
--with ID | string | 是 | 无 | scr_ 屏幕,其配对设备将接手本屏幕。必须是项目中的另一个屏幕。 |
--expect-rev REVISION | string | 否 | 无 | 针对要保留屏幕的可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig screen replace scr_01EXAMPLESCREEN00000000 --with scr_01EXAMPLENEWSCREEN000000先将新硬件配对为独立的屏幕,再替换。设备的密钥或浏览器播放器的凭据现在打开的是 <id>,该屏幕保留其名称、标签、时区、播放列表、排程、接管、显示排程和覆盖、视频墙、评论、字段、位置和历史记录,并采用替换方的主机和播放器。其健康、状态、存储和排队命令重新开始。由 --with 指定的屏幕被归档,archive_reason 为 replaced,replaced_by 指明 <id>。它不保留设备绑定,因此 screen unarchive 无法恢复它,screen delete 会将其删除。<id> 原先持有的密钥在十五分钟宽限期后废弃,此后其旧设备将被拒绝。两个屏幕都必须处于活动状态并带有已配对的播放器:仍在等待配对的屏幕返回 resource_conflict,已归档的屏幕返回 screen_archived,视频墙则需要声明 display.wall(wall_unsupported)的替换播放器。请求始终携带幂等键,完全相同的重试会返回原始响应。
screen rotate-public-id#
为屏幕发放新的公共 ID。
screen rotate-public-id <id> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | scr_ 屏幕 ID。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig screen rotate-public-id scr_01EXAMPLESCREEN00000000screen link create#
创建屏幕的链接或替换它,并打印其 Player URL。
screen link create <id> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 屏幕 ID scr_。屏幕处于活动状态:其 Player 已用配对码配对过一次。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig screen link create scr_01EXAMPLESCREEN00000000打印 data.url,即要粘贴为 vMix 或 OBS 浏览器源 URL 的 Player URL(https://play.screenrig.ai/player/#screen=…);浏览器源不保留存储,否则每次加载都会丢失配对。Player 每次加载都从该 URL 运行:URL 就是全部配对。再次创建链接会替换它(data.replaced 为 true):旧 URL 立即失效,从它打开的 Player 会显示无内容的通知。URL 是打开屏幕的凭据:它在敏感标签下打印,不进入操作日志,并可由 screen link show 再次显示。请只在一处打开它。尚未配对的屏幕返回 resource_conflict(退出码 5),已归档的屏幕返回 screen_archived。请求被中断后,重新运行相同命令:它会复用已保存的幂等键,并返回相同的链接。
screen link show#
打印屏幕的链接及其 Player URL。
screen link show <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | scr_ 屏幕 ID。 |
screenrig screen link show scr_01EXAMPLESCREEN00000000在敏感标签下打印 data.url,并附带 data.hint(密钥的最后四个字符),以及 Player 打开链接后的 data.created_at 和 data.last_used_at。只读凭据收到的 url 为空且 url_redacted 为 true,人工输出会说明 URL 已被保留;Manage 登录则可收到。没有链接的屏幕返回 screen_link_not_found(退出码 4),并给出创建链接的命令。screen show 对有链接的屏幕打印 Screen link: on (…HINT),绝不打印其 URL。
screen link delete#
关闭屏幕的链接。
screen link delete <id> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | scr_ 屏幕 ID。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig screen link delete scr_01EXAMPLESCREEN00000000URL 立即失效,它打开的每个会话都会结束:仍显示它的浏览器源只会显示通知而无内容,直到获得新的 URL。屏幕、其配对和内容不受影响。屏幕没有链接时,操作成功且不更改任何内容。
screen reload#
请求屏幕的播放器,或舰队中的所有播放器,重新加载一次。
screen reload (<id>... | --tag TAG) [--expires-in DURATION] [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id>... | string | <id> 或 --tag 之一 | 无 | 一个或多个 scr_ 屏幕 ID。多个 ID 作为一个舰队请求运行。 |
--tag TAG | string | <id> 或 --tag 之一 | 无 | 每个带此标签的活动屏幕。 |
--expires-in DURATION | string | 否 | 24h,由服务器应用 | 请求等待离线屏幕上线的时间:90s、30m、2h 或 1d,范围从 60s 到 24h。 |
--expect-rev REVISION | string | 否 | 无 | 仅一个屏幕 ID。可选的修订前提。 |
screenrig screen reload scr_01EXAMPLESCREEN00000000
screenrig screen reload scr_01EXAMPLESCREEN00000000 --expires-in 2h
screenrig screen reload --tag Lobby响应携带 reload_id、state 和 expires_at。在线屏幕会立即收到重载(state 为 sent);离线屏幕将其置于 queued 状态,若该屏幕在 expires_at(请求后 24 小时,除非 --expires-in 另行指定)之前上线,便会收到它。较新的重载会取代仍在排队的重载,screen show 列出屏幕的 commands,screen command cancel 取消仍在排队的重载。车队中,每个结果的 reload 携带相同的 state。网页播放器在下一页面边界重新加载;原生播放器重新连接,重新获取清单并检查更新。播放器忽略十分钟内的重复重载。重载适用于活动和归档屏幕,不更改屏幕版本。
screen toast#
在实时屏幕或屏幕组上发布一个临时舞台界面消息。
screen toast (<id>... | --tag TAG) --text TEXT [--level info] [--duration-ms MS]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id>... | string | <id> 或 --tag 之一 | 无 | 一个或多个 scr_ 屏幕 ID。多个 ID 作为一个舰队请求运行。 |
--tag TAG | string | <id> 或 --tag 之一 | 无 | 每个带此标签的活动屏幕。 |
--text TEXT | string | 是 | 无 | 一到 120 个字符,换行符为唯一换行,最多三行。 |
--level LEVEL | string | 否 | info | info,alert,或 error。托管播放器显示错误提示。信息和警告是诊断级别,可能被抑制;命令成功不保证可见性。 |
--duration-ms MS | integer | 否 | 10000,由服务器应用 | 提供时介于2000和60000之间。 |
screenrig screen toast scr_01EXAMPLESCREEN00000000 --text "Lobby closed"
screenrig screen toast --tag Lobby --text "Closing in ten minutes"Toast 不是原语:不占画布槽,无图层,不参与就绪或交叉淡入。最新覆盖,无队列无取消,接受的信封仅 { expires_at }。文本中绝不放凭证或其他秘密材料。
screen identify#
在屏幕内容上方显示其名称一段时间,以便在现场找到它。
screen identify <id> [--duration DURATION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | scr_ 屏幕 ID。 |
--duration DURATION | string | 否 | 60s,由服务器应用 | 覆盖层保持显示的时间,从播放器收到请求时算起:30s、2m 或 1m30s,范围从 2s 到 10m。 |
screenrig screen identify scr_01EXAMPLESCREEN00000000
screenrig screen identify scr_01EXAMPLESCREEN00000000 --duration 2m播放器在其内容之上绘制全屏覆盖层,屏幕名称非常大,其 ID 以小字显示在名称下方。播放在覆盖层下方继续,较新的标识请求会替换该覆盖层。接受的信封携带 identify_id、duration_ms 和请求后 60 秒的 expires_at,因此离线屏幕此后绝不会显示它。只有声明 identify 能力的播放器才会显示该覆盖层:其他任何屏幕返回 409 identify_unsupported(退出码 5)且不发送任何内容,因此请更新播放器,或使用 screen toast 显示名称。归档屏幕返回 screen_archived,仍在等待配对的屏幕返回 resource_conflict。标识屏幕不会更改屏幕版本。
screen screenshot#
捕获一个活动屏幕的静态图像,或捕获舰队中每个屏幕的静态图像,并写入磁盘。
screen screenshot <id> [--output FILE] [--timeout MS] [--poll-ms MS]
screen screenshot (<id> <id>... | --tag TAG) [--output DIRECTORY] [--concurrency N] [--timeout MS] [--poll-ms MS]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id>... | string | <id> 或 --tag 之一 | 无 | 一个或多个 scr_ 屏幕 ID。 |
--tag TAG | string | <id> 或 --tag 之一 | 无 | 每个带此标签的活动屏幕,无屏幕数量限制。 |
--output FILE | 路径 | 否 | ./<id>.webp | 针对单个屏幕,提供文件路径;已有文件将被覆盖且无提示。针对多个 ID 或 --tag,提供目录,若不存在则创建,每个屏幕生成一个 <screen_id>.webp。 |
--concurrency N | integer | 否 | 4 | 同时捕获多个 ID 或 --tag,数量从 1 到 8。 |
--timeout MS | integer | 否 | 35000 | 等待截图的时间。 |
--poll-ms MS | integer | 否 | 500 | 捕获状态轮询间隔。 |
screenrig screen screenshot scr_01EXAMPLESCREEN00000000 --output ./lobby.webpscreenrig screen screenshot --tag Lobby --output ./lobby-shots命令会阻塞直到 WebP 写入磁盘;无 --no-wait。信封报告 screen_id、capture_id、path、bytes、sha256、width 和 height,且从不包含图像字节。最新的请求优先:后续请求会替换正在进行的捕获。 Web 播放器的截图会把每个 iframe 页面绘制为标有“Embedded web page”的深灰色方块,把每个应用绘制为其自身渲染的样子;图像中没有该方块的标记,因此不能证明 iframe 页面已渲染。
针对多个 ID 或 --tag,答案是包含 action: "screenshot"、selector 和 output 目录的 设备组结果;每个 ok 结果包含 path、bytes、sha256、width 和 height。使用 --tag 时,CLI 首先列出带标签的屏幕,跟随每个列表页;每页列表计费,截图免费,多个 ID 无需列表。--idempotency-key 形式被拒绝,因为每个截图使用独立密钥。若截图意外失败,该屏幕结果为 unexpected_error,不启动新截图,仍等待的屏幕报告 not_attempted,退出码为 1。
screen tag#
设置、添加、移除或清除屏幕或设备组的标签。
screen tag (<id>... | --tag TAG) (--set TAGS | --add TAGS | --remove TAGS | --clear) [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id>... | string | <id> 或 --tag 之一 | 无 | 一个或多个 scr_ 屏幕 ID。多个 ID 作为一个舰队请求运行。 |
--tag TAG | string | <id> 或 --tag 之一 | 无 | 每个带此标签的活动屏幕。 |
--set TAGS | string | 恰好一个操作 | 无 | 用这些逗号分隔的标签替换整个集合,例如Lobby,Floor2。 |
--add TAGS | string | 恰好一个操作 | 无 | 添加这些逗号分隔的标签。 |
--remove TAGS | string | 恰好一个操作 | 无 | 移除这些逗号分隔的标签。 |
--clear | boolean | 恰好一个操作 | 关闭 | 移除所有标签。 |
--expect-rev REVISION | string | 否 | 无 | 仅一个屏幕 ID。可选的修订前提。 |
screenrig screen tag scr_01EXAMPLESCREEN00000000 --set Lobby,Floor2
screenrig screen tag scr_01EXAMPLESCREEN00000000 --add Spring
screenrig screen tag --tag Lobby --add Spring标签为 1 到 32 个字母或数字,屏幕最多携带 16 个唯一标签。标签选择舰队;绝非授权,且永不传达给播放器。更改标签提升屏幕版本,不提升清单版本。单屏时信封为更新的屏幕。--add 和 --remove 先读取屏幕,再用 --expect-rev 或刚读的版本写入新集合,避免并发改写,返回 revision_conflict(退出码 6);重试命令。舰队中,--add 和 --remove 原子应用于每屏幕存储集合,超出 16 标签的屏幕在自身结果中失败,返回 invalid_request。
凡标签发生变化之处(screen tag、通过 API 更新屏幕、控制台标签编辑器),响应中的 levels 在 gained 和 lost 下列出屏幕加入或离开其标签受众的活动,每项带有其 source (campaign)、id、screens 数量,以及活动具有 reach 时的 reach_before 和 reach_after。车队 screen tag 会在整个车队上对它们求和。在断定标签编辑无害之前,请先读取 levels.lost:从活动的屏幕上移除最后一个匹配的标签会使该分组为空,并触发 reach_dropped 和 group_empty 通知。
设备组结果
使用多个屏幕 ID 或 --tag、screen assign、screen reload、screen toast 和 screen tag 运行一个计量操作,无屏幕数量限制。CLI 会自动跟随有限结果页,控制预算用尽时等待,并在整个过程中保持相同的密钥和选定的 fleet。--tag 仅选择活动屏幕;ID 可指任何屏幕。单个屏幕 ID 保持单屏响应。fleet 命令不接受 --expect-rev,因为版本保护是针对每个屏幕的。每个 fleet 命令都带有幂等键。请求中断(如连接丢失)后,重新运行相同命令可重放已完成的屏幕而不重复副作用。明确答复失败后,仅重试失败的 ID:重新运行整个命令会再次作用于所有屏幕。24 小时内重用相同的显式 --idempotency-key 会返回记录的答案。
信封保留 ok: true。部分成功是正常答案,不是传输错误:
{
"ok": true,
"data": {
"action": "reload",
"matched": 3, "succeeded": 2, "failed": 1,
"results": [
{ "screen_id": "scr_LOBBY", "status": "ok", "reload": { "reload_id": "…", "expires_at": "…", "state": "sent" } },
{ "screen_id": "scr_GONE", "status": "failed", "problem": { "code": "not_found", "status": 404 } },
{ "screen_id": "scr_ENTRANCE", "status": "ok", "reload": { "reload_id": "…", "expires_at": "…", "state": "queued" } }
]
},
"warnings": [{ "code": "fleet_partial_failure", "message": "1 of 3 screens failed; 2 succeeded." }]
}一个 ok 结果包含单屏结果:revision 用于 assign,revision 和 tags 用于标签更改,reload 用于重新加载,toast 用于吐司。一个 failed 结果包含该屏幕自身请求本应返回的问题。舰队操作内仍适用每屏限制,因此舰队重新加载或吐司可能报告刚刚重新加载或吐司的屏幕为 rate_limited;稍后重试该屏幕 ID。每屏限制为每分钟 6 次重新加载和 20 次吐司。舰队重新加载和吐司还使用组织预算,每分钟 600 屏幕:预算耗尽时服务器暂停,CLI 在继续自动操作前遵守 Retry-After。
| 结果 | 退出代码 | 警告 |
|---|---|---|
| 每个匹配的屏幕都成功了 | 0 | 无 |
| 部分或全部屏幕失败 | 第一个失败屏幕的代码,如 4 对应 not_found 或 6 对应 revision_conflict | fleet_partial_failure |
| 无匹配屏幕 | 0 | fleet_no_match |
| 选择器或操作格式错误 | 2 或请求自身代码;无屏幕变更 | 无 |
屏幕文件夹
屏幕文件夹按地点组织屏幕。文件夹 ID 以 sfd_ 开头,一个屏幕最多位于一个文件夹中,在 screen show 和 screen list 中以 folder_id 报告,位于项目根目录时不存在。组织跨其所有项目最多持有 1000 个文件夹,嵌套深度最多 10 级,名称为 1 到 100 个字符,且在同级文件夹中唯一。标签仍用于跨越地点的分组。
screen folder list
screen folder show <id>
screen folder create --name NAME [--parent ID] [--default-playlist-id ID]
screen folder update <id> [--name NAME] [--parent ID | --root] [--default-playlist-id ID | --clear-default] [--expect-rev REVISION]
screen folder delete <id> [--expect-rev REVISION]
screen move <id>... (--folder ID | --root)screenrig screen folder create --name "North Tower"
screenrig screen folder create --name "Level 2" --parent sfd_01EXAMPLEFOLDER000000000 --default-playlist-id pl_01EXAMPLEPLAYLIST000000
screenrig screen move scr_01EXAMPLESCREEN00000000 --folder sfd_01EXAMPLEFOLDER000000000screen folder list 在 data.items 中返回每个文件夹,包含 id、name、parent_id(项目根目录为 null)、已设置时的 default_playlist_id、screens(直接位于其中的活动屏幕)和 revision。screen move 接受任意混合的屏幕 ID 和文件夹 ID,一次全有或全无的请求中最多 1000 个;文件夹连同其中所有内容一起移动,不能移动到自身或其内部的文件夹中。screen list --folder ID 仅列出直接位于某个文件夹中的屏幕。
在每个接受 --tag TAG 的设备组命令上,--folder ID 都会选择该文件夹及其内部每个文件夹中的所有活动屏幕。活动也一样:在 campaign create 和 campaign update 上使用 --folder ID,或在 --audience 中使用 {"folder":"sfd_…"} 规则,并可像 {"all":[{"folder":"sfd_BUILDING"},{"tag":"overhead"}]} 那样与标签规则组合。
文件夹的默认播放列表是其屏幕在没有自己的播放列表时显示的内容。位于屏幕上方、设置了默认播放列表的最近文件夹优先,effective_playlist 报告 source 为 folder,并以文件夹 ID 作为 entry_id。接管、活动、排程以及屏幕自身分配的播放列表的优先级都高于它;见 排程和接管。播放列表必须已批准(playlist_not_approved,退出码 5)。
移动屏幕或文件夹,或更改文件夹的默认播放列表,会在约 15 秒内重新解析受影响的屏幕。响应中的 levels 在 gained 和 lost 下列出这些屏幕加入或离开了其文件夹受众的活动,以及它们开始或停止显示的文件夹默认播放列表,每项带有其 source(campaign 或 folder)、id 和 screens 数量。删除文件夹不会删除其中的任何内容:其屏幕和文件夹会上移到父文件夹,而只要有活动受众指向该文件夹,resource_conflict(退出码 5)就会拒绝删除。删除响应返回 200,并带有 levels,与移动时一样。
写入需要管理权限,且从不等待审核:提议会话返回 403 insufficient_access。每次写入都会向项目事件附加 screen.folder_created、screen.folder_updated、screen.folder_deleted 或 screen.moved。
排程和接管
屏幕的活动和播放列表排程条目是同一个堆栈的层级。服务器从顶部开始决定每个屏幕播放什么:它的接管、覆盖它的活动(先是 --priority,然后是最新的)、屏幕自己的排程条目(按顺序)、用 screen assign 分配的播放列表,然后是设置了默认播放列表的最近一个屏幕文件夹的默认播放列表。第一个有内容的层级播放。切换在边界时间点后约一分钟内生效,Player 无需更新。多个屏幕的排程行工作表可一步导入:见排程导入。
层级在其所有规则都生效时生效:from 和 until、每周 windows、monthly 规则、dates、except 日期、data 条件和 interaction 条件。monthly 规则是每月的某个 day(1 到 31;没有该日的月份会跳过)或第 nth 个星期几(1 到 4,-1 表示最后一个),配合 weekday;dates 项是一个 date;两者都可带可选的 start 和 end 时间,否则覆盖全天。except 日期会移除在该日开始的每次出现,包括跨夜的后续部分,跨夜的出现归属于其开始的日期。data 为 {key, path?, equals?},在该卡片数据存在或等于标量值期间生效。interaction 为 {idle_s}(5 到 3600,默认 60):有人通过触摸或点击使用屏幕时播放该层级,并在 idle_s 秒无输入后退回,例如叠在展示循环之上的交互页面。displays 列出该层级播放所在的视频墙输出(1 到 12)。start 为 next_item(默认),等待当前项目结束;或为 on_time,在边界时刻将其中断。能自行解析堆栈的播放器会播放 interaction、data 和 displays 层级;对其他任何播放器,campaign explain 会将该层级报告为 off,原因是 stack_only(需要能自行解析堆栈的播放器)。
screen show,screen list,以及下面的每个命令返回 effective_playlist({id, source, entry_id?, until?},其中 source 是 takeover,campaign,schedule,default,或 folder),takeover,和 playlist_schedule。entry_id 对 campaign 是活动 ID,对 schedule 是条目 ID,对 folder 是文件夹 ID。until 是下一个已知选择变化的时刻。screen show --human 以屏幕时区打印,如 Assigned: pl_LUNCH (schedule entry lunch until 2026-08-14 15:00 America/Los_Angeles) 或 Assigned: pl_LUNCH (campaign cmp_LUNCH until 2026-08-14 15:00 America/Los_Angeles)(UTC,带标签,当屏幕无时区时);JSON 输出保持 RFC 3339 时间点。人工排程表以屏幕时区标记,且当任何列出的屏幕播放的不是其默认播放列表时,screen list --human 添加 ASSIGNED 列。
| 问题代码 | 退出 | 含义 |
|---|---|---|
invalid_request | 8 | 屏幕无默认播放列表分配(next 为 screen assign),排程目标屏幕无时区(next 为 screen set-timezone),或无法分配命名播放列表。 |
screen_archived | 5 | 归档屏幕拒绝排程和接管。next 是 screen unarchive。 |
revision_conflict | 6 | --expect-rev 版本已过时。 |
rate_limited | 7 | 排程和接管写入共享每分钟限制:每个组织 600 次,每个屏幕 20 次,每个IP 60 次。请等待 retry_after_seconds。 |
使用一个屏幕 ID,这些命令返回更新后的屏幕,--expect-rev 保护其版本。多个 ID 或 --tag 作为一个 fleet 请求 运行,带有 fleet 信封和退出规则;每个屏幕单独失败,项目预算用尽时 CLI 会自动暂停和恢复。
screen schedule show#
显示屏幕的播放列表排程及当前选择的播放列表。
screen schedule show <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | scr_ 屏幕 ID。 |
screenrig screen schedule show scr_CAFEJSON 输出可直接返回至 screen schedule set --file。
screen schedule set#
替换屏幕或车队上的播放列表排程。
screen schedule set (<id>... | --tag TAG) --file FILE [--expect-rev REVISION] [--note TEXT]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id>... | string | <id> 或 --tag 之一 | 无 | 一个或多个 scr_ 屏幕 ID。 |
--tag TAG | string | <id> 或 --tag 之一 | 无 | 每个带此标签的活动屏幕。 |
--file FILE | 路径 | 是 | 无 | 排程文档,或 - 表示标准输入。 |
--expect-rev REVISION | string | 否 | 无 | 仅一个屏幕 ID。可选的修订前提。 |
--note TEXT | string | 否 | 无 | 给审核变更者的备注:纯文本,最多 280 字符。变更即时生效时忽略此备注。 |
screenrig screen schedule set scr_CAFE --file dayparts.json
screenrig screen schedule set --tag Cafe --file dayparts.json每个计划命名的播放列表都作为分配进行验证,屏幕需要时区和分配的默认播放列表。没有条目生效时,播放分配的播放列表。如果计划播放列表之后无法显示,则跳过其条目并记录screen.playlist_unavailable。
screen schedule clear#
从屏幕或设备组移除播放列表排程。
screen schedule clear (<id>... | --tag TAG) [--expect-rev REVISION] [--note TEXT]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id>... | string | <id> 或 --tag 之一 | 无 | 一个或多个 scr_ 屏幕 ID。 |
--tag TAG | string | <id> 或 --tag 之一 | 无 | 每个带此标签的活动屏幕。 |
--expect-rev REVISION | string | 否 | 无 | 仅一个屏幕 ID。可选的修订前提。 |
--note TEXT | string | 否 | 无 | 给审核变更者的备注:纯文本,最多 280 字符。变更即时生效时忽略此备注。 |
screenrig screen schedule clear --tag Cafescreen schedule preview#
显示替换屏幕播放列表排程会带来哪些变化,但不执行。
screen schedule preview <id> --file FILE [--calendar-from INSTANT] [--calendar-to INSTANT]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | scr_ 屏幕 ID。 |
--file FILE | 路径 | 是 | 无 | screen schedule set 所接受的排程文档,或用 - 表示 stdin。也接受 screen schedule show 输出的 JSON。 |
--calendar-from INSTANT | string | 否 | 现在 | 日历从此带时区的时刻开始,例如 2026-12-01T00:00:00Z。 |
--calendar-to INSTANT | string | 否 | 开始后一周 | 日历在此带时区的时刻结束,最晚为开始后 93 天。 |
screenrig screen schedule preview scr_LOBBY --file dayparts.json
screenrig screen schedule preview scr_LOBBY --file dayparts.json --calendar-from 2026-12-01T00:00:00Z --calendar-to 2027-01-01T00:00:00Z不会写入任何内容。条目的检查方式与 screen schedule set 相同,因此预览会拒绝 set 所拒绝的内容。data.gained 和 data.lost 说明屏幕会获得还是失去其排程的层级;带有 "paused": true 的条目不在任何屏幕上,因此发布它会增加该条目。data.calendar.before 和 data.calendar.after 是屏幕现状的日历,以及 --calendar-from 至 --calendar-to 之间更改后的日历。
screen schedule revisions#
按从新到旧列出屏幕播放列表排程的修订。
screen schedule revisions <id> [--after CURSOR]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | scr_ 屏幕 ID。 |
--after CURSOR | string | 否 | 第一页 | 从上一页的 data.next_cursor 继续。 |
screenrig screen schedule revisions scr_LOBBY
screenrig screen schedule revisions scr_LOBBY --after CURSORdata.items 最多包含 50 个修订,每个包含 revision(写入时屏幕的修订号,因此屏幕以其他方式变化处的编号有间隔)、created_at、change、current、已知时的 author,以及 entries(该次写入后的完整排程;none 表示屏幕没有排程)。change 为 edited(一次 set、一次 clear 或一次排程导入)、restored(restored_from 所指较早修订的副本)或 baseline。只要 data.next_cursor 是字符串,就还有更早的修订:将 --after 设为该值,再次运行命令。修订随屏幕清除而删除。只读权限即可。
screen schedule restore#
通过向前复制,把较早修订的排程放回屏幕。
screen schedule restore <id> --revision N [--expect-rev REVISION] [--note TEXT]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | scr_ 屏幕 ID。 |
--revision N | integer | 是 | 无 | 要向前复制的修订,按 screen schedule revisions 的编号。 |
--expect-rev REVISION | string | 否 | 刚读取的修订 | 要求当前屏幕修订为此值,而不是 N。省略时,CLI 会在写入前读取屏幕并发送该修订;期间若有更改,则为 revision_conflict(退出码 6)。 |
--note TEXT | string | 否 | 无 | 给审核变更者的备注:纯文本,最多 280 字符。变更即时生效时忽略此备注。 |
screenrig screen schedule restore scr_LOBBY --revision 4
screenrig screen schedule restore scr_LOBBY --revision 4 --expect-rev 9修订 N 的条目成为屏幕的排程,这与用这些条目执行 screen schedule set(若该修订没有条目则为 screen schedule clear)是同一次写入,按现在的规则检查:此后被删除的播放列表会导致拒绝。在 Propose 权限下,或在要求审核代理更改的项目中,恢复会像 set 一样等待有人批准,批准前屏幕上不会有任何变化。较早的修订保持原样。
screen takeover#
在屏幕或屏幕组上提前显示一个播放列表,优先于活动、计划和分配。
screen takeover [set] (<id>... | --tag TAG) --playlist-id ID [--until TIME | --for DURATION] [--reason TEXT] [--expect-rev REVISION] [--note TEXT]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id>... | string | <id> 或 --tag 之一 | 无 | 一个或多个 scr_ 屏幕 ID。 |
--tag TAG | string | <id> 或 --tag 之一 | 无 | 每个带此标签的活动屏幕。 |
--playlist-id ID | string | 是 | 无 | 要显示的 pl_ 播放列表。 |
--until TIME | string | 否 | 保持直到清除 | 严格 RFC 3339 时间点,含秒和偏移,格式为 YYYY-MM-DDTHH:MM:SSZ 或 YYYY-MM-DDTHH:MM:SS-07:00,发送时归一化为 UTC;严格未来且最多提前 7 天。或 none 保持至 screen takeover clear。 |
--for DURATION | string | 否 | 保持直到清除 | 30m,2h,或 3d,最多 6d23h59m,从此计算机时钟转换为 until。本地拒绝 7d;使用 --until 获取完整 7 天。不适用于 --until。 |
--reason TEXT | string | 否 | 无 | 关于接管及其事件的操作员备注。最多120个字符,且无控制字符。 |
--expect-rev REVISION | string | 否 | 无 | 仅一个屏幕 ID。可选的修订前提。 |
--note TEXT | string | 否 | 无 | 给审核变更者的备注:纯文本,最多 280 字符。变更即时生效时忽略此备注。 |
screenrig screen takeover scr_LOBBY --playlist-id pl_DRILL --for 30m --reason "Fire drill"
screenrig screen takeover --tag Lobby --playlist-id pl_LAUNCH --for 2h
screenrig screen takeover scr_A scr_B --playlist-id pl_NOTICE --until nonescreen takeover ID 是 screen takeover set ID 的缩写。新的接管会替换之前的接管。结束时,屏幕会自动返回生效的活动、其计划或分配的播放列表。无法显示播放列表的接管会结束。模糊失败后的 --for 重跑会重新计算结束时间,并作为新请求发送。
screen takeover clear#
结束屏幕或设备群的接管。
screen takeover clear (<id>... | --tag TAG) [--expect-rev REVISION] [--note TEXT]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id>... | string | <id> 或 --tag 之一 | 无 | 一个或多个 scr_ 屏幕 ID。 |
--tag TAG | string | <id> 或 --tag 之一 | 无 | 每个带此标签的活动屏幕。 |
--expect-rev REVISION | string | 否 | 无 | 仅一个屏幕 ID。可选的修订前提。 |
--note TEXT | string | 否 | 无 | 给审核变更者的备注:纯文本,最多 280 字符。变更即时生效时忽略此备注。 |
screenrig screen takeover clear --tag Lobby排程文件
排程列出 1 到 32 条条目,按优先级排序;第一个生效的条目获胜。条目至少设置层级的一条规则:windows、monthly、dates、except、data、interaction、from 或 until,并可选设置 displays、start 和 paused。windows 有 1 到 16 项,均为屏幕时区:days 使用 mon 至 sun,start 和 end 为 HH:MM;全天省略两者。end 在或早于 start 跨午夜,属于起始日。可选 from(含)和 until(不含)为民用分钟,如 2026-12-24T18:00,无偏移。省略 id 视为 entry_N。带有 "paused": true 的条目是草稿:它不在任何屏幕的层级栈中,screen schedule show 会标记它,日历以虚线绘制。不带 paused 重新发送排程即可发布。CLI 发送前检查此格式。早餐、午餐和晚餐时段:
{
"entries": [
{ "id": "breakfast", "playlist_id": "pl_BREAKFAST",
"windows": [{ "days": ["mon", "tue", "wed", "thu", "fri"], "start": "06:00", "end": "11:00" },
{ "days": ["sat", "sun"], "start": "08:00", "end": "12:00" }] },
{ "id": "lunch", "playlist_id": "pl_LUNCH",
"windows": [{ "days": ["mon", "tue", "wed", "thu", "fri"], "start": "11:00", "end": "15:00" }] },
{ "id": "dinner", "playlist_id": "pl_DINNER",
"windows": [{ "days": ["mon", "tue", "wed", "thu", "fri", "sat", "sun"], "start": "17:00", "end": "22:00" }] }
]
}有人使用屏幕时播放的菜单,位于跳过某一日期的每月第一个周日早午餐之上:
{
"entries": [
{ "id": "browse", "playlist_id": "pl_MENU", "interaction": { "idle_s": 90 } },
{ "id": "brunch", "playlist_id": "pl_BRUNCH",
"monthly": [{ "nth": 1, "weekday": "sun", "start": "10:00", "end": "14:00" }],
"except": ["2026-12-06"] }
]
}播放列表排程在播放列表间切换;单个播放列表内的页面 visibility 仍在页面间切换。
排程和接管事件
events list 和 events follow 打印 screen.playlist_switched(playlist_id、previous_playlist_id、source、entry_id、until)、screen.takeover_started(playlist_id、until,其中 none 表示保留直至清除,以及 reason)、screen.takeover_ended(reason expired、cleared、replaced、playlist_deleted 或 playlist_unavailable),以及警告 screen.playlist_unavailable(playlist_id、entry_ids,还有 code playlist_deleted 或 playlist_unavailable)。
删除仍可被任何屏幕(包括归档屏幕)显示的播放列表会失败,错误代码为 resource_conflict(退出码 5):已分配、被计划条目命名、被接管持有、被活动显示或处于生效状态。next 指向 screen list。
活动
活动会在其规则生效期间,将受众中的每个屏幕切换到一个播放列表,并在规则停止生效时切换回去。一个活动在每家 north 门店运行午餐菜单,之后标记为 north 的屏幕也会获得它。未设置任何规则时,它始终生效。
对每个屏幕,服务器选择其接管,否则选择第一个生效的活动(--priority 0 到 100,较高者优先,然后是最新的),否则选择播放列表排程,否则选择分配的播放列表;堆栈和规则见 排程和接管。活动覆盖有默认播放列表的屏幕(screen assign)。带有日期或时间规则的活动还需要屏幕的时区(screen set-timezone),因为这些是按每个屏幕自己的时区读取的民用时间。屏幕约在一分钟内切换,播放器无需更新。
暂停的活动是草稿:在 campaign publish 发布之前不在任何屏幕上,发布时可先只发给测试文件夹或少数测试屏幕,之后 campaign promote 再把它的受众放到活动上。campaign preview 在更改之前显示其效果,campaign revisions 和 campaign restore 保留并恢复较早的版本。下文的排程条目同样有草稿、预览和历史;见草稿、测试和提升、历史。
活动命令使用 screens 功能。写入需要管理权限,且从不等待审核:提议会话返回 403 insufficient_access。每个组织跨其所有项目最多有 100 个活动(campaign_limit_reached,退出码 5),播放列表必须已批准(playlist_not_approved,退出码 5)。每次写入都会向项目事件附加 campaign.created、campaign.updated 或 campaign.deleted,活动所切换的屏幕会记录 screen.playlist_switched,其 source 为 campaign,活动 ID 作为 entry_id。ads campaigns 用于购买其他屏幕上的广告时间,属于另一种资源。
campaign list#
按屏幕读取的顺序列出项目的活动。
campaign list无参数。
screenrig campaign listdata.items 最多包含 100 个活动,优先级最高的在前,同一优先级内最新的在前。已暂停的活动会被列出,且不适用于任何屏幕。
campaign show#
读取一个活动。
campaign show <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | cmp_ 活动 ID。 |
screenrig campaign show cmp_LUNCH返回 name、playlist_id、audience(确切规则)、priority、paused、已设置的 from、until、windows、monthly、dates、except、interaction、displays 和 start,以及 revision,即后续写入时用于 --expect-rev 的值。reach 报告受众匹配多少个屏幕:published 是活动上次发布时的数量(创建时,或更新了新的受众、播放列表或暂停状态时),current 和 at 是最新数量,empty_groups 是受众中不匹配任何屏幕的 tag:NAME 和 folder:ID 叶子节点。更改数量的标签、文件夹、归档或删除操作会在约 15 秒内重新计数;campaign list 也携带 reach,并且 reach_dropped 和 group_empty 通知会监视它。来自 ads campaigns list 的 ID 在此返回 not_found(退出码 4)。
campaign create#
将受众的屏幕切换到一个播放列表,始终切换,或在其规则生效期间切换。
campaign create --name NAME --playlist-id ID (--tag TAG | --any-tag TAG | --screen-id ID | --folder ID | --all-screens | --audience RULE) [--from TIME] [--until TIME] [--window SPEC] [--monthly SPEC] [--date SPEC] [--except DATES] [--on-touch [IDLE_S]] [--displays N[,N]] [--start on-time|next-item] [--covers WHERE] [--priority N] [--paused]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--name NAME | string | 是 | 无 | 1 到 120 个字符的名称。 |
--playlist-id ID | string | 是 | 无 | 活动生效期间受众显示的 pl_ 播放列表。它必须已批准。 |
--tag TAG | string | 受众选项之一 | 无 | 带有此标签的屏幕。重复或以逗号分隔可要求具备列出的每个标签。 |
--any-tag TAG | string | 受众选项之一 | 无 | 带有这些标签中至少一个的屏幕。重复或以逗号分隔。 |
--screen-id ID | string | 受众选项之一 | 无 | 这些屏幕。重复或以逗号分隔。 |
--folder ID | string | 受众选项之一 | 无 | 此 sfd_ 屏幕文件夹及其内部每个文件夹中的屏幕。要将文件夹与标签组合,请使用 --audience。 |
--all-screens | boolean | 受众选项之一 | 关闭 | 项目中的每个屏幕。 |
--audience RULE | string | 受众选项之一 | 无 | JSON 格式的规则,使用 @FILE 从文件读取,或使用 - 读取标准输入。 |
--from TIME | string | 否 | 无开始时间 | 在每个屏幕时区的此民用时间开始,YYYY-MM-DDTHH:MM,无偏移。 |
--until TIME | string | 否 | 无结束时间 | 在每个屏幕时区的此民用时间之前结束,格式相同且晚于 --from。 |
--window SPEC | string | 否 | 无 | 仅在此每周时间窗口内生效,DAYS 或 DAYS@HH:MM-HH:MM,例如 mon-fri@09:00-17:00 或 sat,sun。最多重复 16 次;活动在其中任一时间窗口内生效。 |
--monthly SPEC | string | 否 | 无 | 仅在此每月出现时生效:每月的某一天(15 或 day15;没有该日的月份会跳过)或每月第 n 个星期几(1st-mon、2nd-tue、3rd-wed、4th-thu、last-sun),均可带可选的 @HH:MM-HH:MM。最多重复 16 次。 |
--date SPEC | string | 否 | 无 | 仅在这一天生效,YYYY-MM-DD 或 YYYY-MM-DD@HH:MM-HH:MM。最多重复 100 次。 |
--except DATE | string | 否 | 无 | 跳过这些日期,YYYY-MM-DD,可重复或以逗号分隔,最多 100 个。例外会移除在该日期开始的每次出现,包括跨夜的后续部分。 |
--on-touch [IDLE_S] | integer | 否 | 关闭 | 仅在有人通过触摸或点击使用屏幕期间生效,在无输入经过 IDLE_S 秒(5 到 3600,默认 60)后停止。 |
--displays N[,N] | string | 否 | 所有输出 | 仅在这些视频墙输出上播放,1 到 12,以逗号分隔。 |
--start WHEN | string | 否 | next-item | on-time 在边界时刻切换并中断当前项目;next-item 等待其结束。 |
--covers WHERE | string | 否 | full | 播放列表播放的位置:full(页面)、main,或 header、footer 或 side(绘制在页面之上的条带,需要为该区域制作的播放列表)。参见条带。 |
--priority N | integer | 否 | 0 | 0 到 100。两个活动在同一屏幕上同时生效时,数字较大者获胜。 |
--paused | boolean | 否 | 关闭 | 创建为暂停状态:草稿在 campaign publish 或 campaign resume 之前不在任何屏幕上。 |
screenrig campaign create --name "Lunch menu" --playlist-id pl_LUNCH --tag north --window mon-fri@11:00-14:00
screenrig campaign create --name "North Tower welcome" --playlist-id pl_WELCOME --folder sfd_01EXAMPLEFOLDER000000000
screenrig campaign create --name "Holiday hours" --playlist-id pl_HOLIDAY --tag Lobby --from 2026-12-20T00:00 --until 2027-01-02T00:00 --priority 10
screenrig campaign create --name "North cafes" --playlist-id pl_CAFE --audience '{"all":[{"tag":"North"},{"any":[{"tag":"Cafe"},{"tag":"Patio"}]}]}' --paused
screenrig campaign create --name "Brunch" --playlist-id pl_BRUNCH --tag Cafe --monthly 1st-sun@10:00-14:00 --except 2026-12-06
screenrig campaign create --name "Touch to browse" --playlist-id pl_MENU --screen-id scr_KIOSK --on-touch 90
screenrig campaign create --name "Holiday opening" --playlist-id pl_HOLIDAY --tag Lobby --date 2026-12-24@18:00-22:00 --start on-time
screenrig campaign create --name "Wall outputs 1 and 2" --playlist-id pl_WALL --screen-id scr_WALL --displays 1,2标签由 1 到 32 个字母或数字组成。DAYS 为 daily、一天(mon)、一个范围(mon-fri;fri-mon 回绕越过一周的末尾)或逗号列表(sat,sun)。不带时间时,时间窗口为全天;结束时间等于或早于开始时间时,该窗口跨越午夜并属于开始日。在 --audience 规则中,每个成员恰好有 all、any、tag、screen_id 或 folder 之一,分组最多嵌套 3 层,一个受众最多有 500 条规则,{"all":[]} 表示每个屏幕。
中断或模糊创建后,24 小时内重新运行相同命令:它会重用保存的幂等键,服务器返回相同活动而非创建新活动。
campaign update#
更改活动;其旧受众和新受众的屏幕会在一分钟内重新解析。
campaign update <id> [--name NAME] [--playlist-id ID] [audience option] [--from TIME | --clear-from] [--until TIME | --clear-until] [--window SPEC | --clear-windows] [--monthly SPEC | --clear-monthly] [--date SPEC | --clear-dates] [--except DATES | --clear-except] [--on-touch [IDLE_S] | --clear-on-touch] [--displays N[,N] | --clear-displays] [--start WHEN] [--covers WHERE] [--priority N] [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | cmp_ 活动 ID。 |
--name NAME | string | 否 | 未更改 | 重命名活动。 |
--playlist-id ID | string | 否 | 未更改 | 改为显示此播放列表。它必须已批准。 |
--tag, --any-tag, --screen-id, --folder, --all-screens, --audience | string | 否 | 未更改 | 最多一个,写法与 campaign create 相同。它会替换整个受众。 |
--from TIME, --until TIME | string | 否 | 未更改 | 与 campaign create 相同的民用时间。--from 必须保持早于 --until,否则为 invalid_request(退出码 8)。 |
--clear-from, --clear-until | boolean | 否 | 关闭 | 移除开始时间或结束时间。 |
--window SPEC | string | 否 | 未更改 | 用这些时间窗口替换所有时间窗口。最多重复 16 次。 |
--clear-windows | boolean | 否 | 关闭 | 移除所有时间窗口。 |
--monthly SPEC, --date SPEC, --except DATE | string | 否 | 未更改 | 与 campaign create 相同;每项都会替换同类的全部规则。 |
--on-touch [IDLE_S], --displays N[,N], --start WHEN | string | 否 | 未更改 | 与 campaign create 相同;不带值的 --on-touch 为 60 秒。 |
--clear-monthly, --clear-dates, --clear-except, --clear-on-touch, --clear-displays | boolean | 否 | 关闭 | 移除它们。没有任何规则的活动始终生效。 |
--covers WHERE | string | 否 | 未更改 | full、main、header、footer 或 side,与 campaign create 相同。 |
--priority N | integer | 否 | 未更改 | 0 到 100。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig campaign update cmp_LUNCH --playlist-id pl_LUNCH2 --expect-rev 2
screenrig campaign update cmp_LUNCH --tag Lobby --window sat,sun --priority 20
screenrig campaign update cmp_LUNCH --clear-until --clear-windows
screenrig campaign update cmp_BRUNCH --monthly 2nd-sun@10:00-14:00 --except 2026-12-13,2027-01-10
screenrig campaign update cmp_BROWSE --clear-on-touch --clear-displays至少传入一项更改;只有传入的字段会更改。新的 --playlist-id 的检查方式与创建时相同。中断或模糊请求后,重新运行相同命令:它会重用保存的幂等键,服务器返回已发生的更新而非再次应用。
campaign pause#
在每个屏幕上停止活动,但不删除它。
campaign pause <id> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | cmp_ 活动 ID。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig campaign pause cmp_LUNCH此前显示它的屏幕会在一分钟内回到没有它时会显示的内容。campaign resume 会重新启动它。
campaign resume#
重新启动已暂停的活动。
campaign resume <id> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | cmp_ 活动 ID。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig campaign resume cmp_LUNCH活动生效期间,受众中活动可适用的每个屏幕会在一分钟内切换到该活动的播放列表。
campaign delete#
删除活动。
campaign delete <id> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | cmp_ 活动 ID。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig campaign delete cmp_LUNCH活动无法恢复。显示它的每个屏幕会在一分钟内回到没有它时会显示的内容;播放列表、屏幕和标签保持不变。campaign pause 会停止活动并保留它。
campaign screens#
显示活动覆盖的屏幕及各屏幕的状态。
campaign screens <id> [--limit N] [--cursor CURSOR]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | cmp_ 活动 ID。 |
--limit N | integer | 否 | 100 | 每页屏幕数,1 到 500。 |
--cursor CURSOR | string | 否 | 第一页 | 上一页的 data.next_cursor。 |
screenrig campaign screens cmp_LUNCHdata.counts 涵盖受众中的每个实时屏幕:audience,然后是出现的每个状态各一个计数。data.items 是这些屏幕按屏幕 ID 顺序排列的一页,每个屏幕附带活动的 status。data.next_cursor 在最后一页缺失。 在播放器能自行解析堆栈的屏幕上,状态取决于该堆栈对活动的安排:条带或 main 活动在其区域内播放,--displays 活动在其指定的显示器上播放。
| 状态 | 含义 |
|---|---|
playing | 屏幕显示该活动的播放列表。 |
pending | 它应当显示,切换会在一分钟内发生。 |
waiting | 当前在 --from、--until 和时间窗口之外;它在八天内开始时有 next_start。 |
ended | --until 已过。 |
outranked | 它生效,但屏幕接管(reason takeover)或另一个活动(reason campaign,带有 by)获胜。 |
conditional | 它按时间生效,在有人使用屏幕时(reason interaction)或在其数据条件成立时(reason data)播放。只有播放器能看到其输入和卡片数据。 |
paused | 活动已暂停。 |
blocked | 它无法在此显示。reason 为 no_default_playlist(screen assign)、no_timezone(screen set-timezone)、playlist_unavailable(播放列表缺失、未批准或不适合该屏幕)、region_not_laid_out(它放不进该屏幕的任何显示器:其条带放不进任何显示器,或其 --displays 未指定任何显示器,活动被排除在其堆栈之外)或 stack_only(该屏幕的播放器不能自行解析堆栈,而只有能自行解析堆栈的播放器才遵循区域、显示器锁定、--on-touch 或数据条件)。 |
campaign explain#
显示每个活动为何在某个屏幕上播放或不播放,可针对现在或所选时间。
campaign explain <screen-id> [--at TIME] [--to TIME]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<screen-id> | string | 是 | 无 | scr_ 屏幕 ID。 |
--at TIME | string | 否 | 现在 | 说明此时间而非现在:带时区的时刻(2026-12-24T10:00:00-08:00)或屏幕自身时钟上的时间(2026-12-24T18:00)。夏令时跳过或重复的时钟时间会被拒绝。 |
--to TIME | string | 否 | 无 | 同时列出从 --at(默认现在)到此时间的播放列表切换,形式相同。距离没有限制;一次回答最多列出 500 个时间段。 |
screenrig campaign explain scr_LOBBY
screenrig campaign explain scr_LOBBY --at 2026-12-24T18:00 --to 2026-12-26T00:00data.items 按屏幕读取的顺序列出项目的每个活动,每个活动带有来自 campaign screens 或 not_in_audience 的状态;blocked 行会指明修复方式。data.effective_playlist 是屏幕当前播放的播放列表(id、source,对于 campaign 还有作为 entry_id 的活动 ID),屏幕不显示播放列表时为 null。它不会更改任何内容。
使用 --at 时,data.at 包含该时间的答案:effective_playlist(其 until 是下一次变更)以及针对接管、每个活动和每个排程条目的 verdicts 行,顺序与屏幕读取顺序一致。
判定为 won(所显示的播放列表)、outranked(它生效,by 指明获胜者)、not_started(尚未开始)、ended(已结束)、outside_hours(在日期范围内,但在时间窗口、每月规则或指定日期之外,或处于例外日期)、conditional(按时间生效,在有人使用屏幕时播放,reason interaction;或在其数据条件成立时播放,reason data)或 off(不适用,reason 说明原因,例如 stack_only)。在播放器能自行解析堆栈的屏幕上,判定依据该堆栈:条带或 main 层级在其区域内获胜或被压过,显示器锁定则在其指定的显示器上判定。effective_playlist 和时间线仍是显示器 1 上的页面,data.at.not_judged 会列出 player_stack。
--to 会添加 data.at.timeline,即播放列表不变的时间段,timeline_truncated 标记在 --to 之前停止的回答。data.at.not_judged 说明未作判断的内容:接管、排程和活动按其现在的状态读取,data.items 仍是当前状态。
campaign preview#
在创建或更改活动之前,显示其会产生的效果。
campaign preview [<id>] [campaign create or update flags] [--paused | --publish] [--calendar-from INSTANT] [--calendar-to INSTANT]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 否 | 新活动 | 要预览更改的 cmp_ 活动。省略则根据 campaign create 的标志预览新活动。 |
--name、--playlist-id、受众选项、规则标志 | string | 否 | 无 | 新活动使用 campaign create 的标志(--name、--playlist-id 和一个受众选项为必填),更改则使用 campaign update 的标志。它们的检查方式与写入相同,因此预览会拒绝写入所拒绝的内容。 |
--paused | boolean | 否 | 关闭 | 以草稿预览:已暂停,不在任何屏幕上。 |
--publish | boolean | 否 | 关闭 | 预览取消活动的暂停。带受众选项时,预览向该受众发布。 |
--calendar-from INSTANT | string | 否 | 现在 | 日历从此带时区的时刻开始,例如 2026-12-01T00:00:00Z。 |
--calendar-to INSTANT | string | 否 | 开始后一周 | 日历在此带时区的时刻结束,最晚为开始后 93 天。 |
screenrig campaign preview cmp_LUNCH --tag Lobby
screenrig campaign preview cmp_LUNCH --publish --folder sfd_TEST
screenrig campaign preview cmp_LUNCH --publish --calendar-from 2026-12-01T00:00:00Z --calendar-to 2027-01-01T00:00:00Z
screenrig campaign preview --name "Holiday hours" --playlist-id pl_HOLIDAY --tag Lobby --from 2026-12-20T00:00 --until 2027-01-02T00:00不会写入任何内容。data.gained 和 data.lost 是 {count, screen_ids}(按 ID 取前 500 个):将带有该活动而现在没有的屏幕,以及将不再带有该活动的屏幕。暂停的活动不在任何屏幕上,因此发布它会增加其受众;让活动保留在屏幕上的编辑只在日历中体现。data.calendar.before 和 data.calendar.after 是 --calendar-from 至 --calendar-to 之间,旧受众和新受众屏幕的排程日历,草稿绘制为暂停层级。--human 打印第一个显示器的时段和会生效的草稿,并在日历不变时说明。
campaign publish#
取消草稿活动的暂停,可只发给测试文件夹或少数测试屏幕。
campaign publish <id> [--test-folder ID | --test-screen ID] [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | cmp_ 活动 ID。 |
--test-folder ID | string | 否 | 活动的受众 | 仅发布到此 sfd_ 屏幕文件夹及其内部每个文件夹中的屏幕。 |
--test-screen ID | string | 否 | 活动的受众 | 仅发布到这些屏幕。重复或以逗号分隔。 |
--expect-rev REVISION | string | 否 | 刚读取的修订 | 要求当前活动修订为此值。省略时,CLI 会在写入前读取活动并发送该修订;期间若有更改,则为 revision_conflict(退出码 6)。 |
screenrig campaign publish cmp_LUNCH
screenrig campaign publish cmp_LUNCH --test-folder sfd_TEST
screenrig campaign publish cmp_LUNCH --test-screen scr_LOBBY,scr_CAFE --expect-rev 2草稿是暂停的活动:发布之前不在任何屏幕上。不带测试选项时,活动会在一分钟内到达它自己的受众。测试选项会在同一次写入中替换受众,因此只有测试屏幕会切换。通常的流程:用真实受众执行 campaign create --paused,执行 campaign publish ID --test-folder FOLDER,查看测试屏幕,然后执行 campaign promote ID --revision N。campaign preview ID --publish 会先显示效果。
campaign promote#
测试之后,把草稿的受众放到活动上。
campaign promote <id> --revision N [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | cmp_ 活动 ID。 |
--revision N | integer | 是 | 无 | 草稿的暂停修订,按 campaign revisions 的编号。活动采用该修订的受众。 |
--expect-rev REVISION | string | 否 | 刚读取的修订 | 要求当前活动修订为此值。省略时,CLI 会在写入前读取活动并发送该修订;期间若有更改,则为 revision_conflict(退出码 6)。 |
screenrig campaign promote cmp_LUNCH --revision 1
screenrig campaign promote cmp_LUNCH --revision 1 --expect-rev 2修订 N 的受众在一次写入中成为活动的受众,形成 change 为 promoted 的新修订,旧受众和新受众的每个屏幕都会在一分钟内重新解析。修订 N 必须是暂停的修订(否则 invalid_request 会指明它),并且活动必须处于启用状态:当前已暂停的活动没有可提升的测试。--expect-rev 是活动的当前修订,而不是 N。提升需要 campaign update 所需的权限。
campaign revisions#
按从新到旧列出活动的修订。
campaign revisions <id> [--after CURSOR]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | cmp_ 活动 ID。 |
--after CURSOR | string | 否 | 第一页 | 从上一页的 data.next_cursor 继续。 |
screenrig campaign revisions cmp_LUNCH
screenrig campaign revisions cmp_LUNCH --after CURSORdata.items 最多包含 50 个修订,每个包含 revision、created_at、change、current、已知时的 author,以及 campaign(该次写入后的活动及其暂停状态)。change 为 created、edited、restored 或 promoted(restored_from 所指较早修订的副本),或 baseline(活动历史开始时所持有的修订)。历史中没有未暂停修订的活动是草稿。只要 data.next_cursor 是字符串,就还有更早的修订:将 --after 设为该值,再次运行命令。修订在活动存在期间一直保留,随活动删除而删除。只读权限即可。
campaign restore#
通过向前复制,使较早的修订再次成为当前修订。
campaign restore <id> --revision N [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | cmp_ 活动 ID。 |
--revision N | integer | 是 | 无 | 要向前复制的修订,按 campaign revisions 的编号。 |
--expect-rev REVISION | string | 否 | 刚读取的修订 | 要求当前活动修订为此值。省略时,CLI 会在写入前读取活动并发送该修订;期间若有更改,则为 revision_conflict(退出码 6)。 |
screenrig campaign restore cmp_LUNCH --revision 3
screenrig campaign restore cmp_LUNCH --revision 3 --expect-rev 5修订 N 的名称、播放列表、受众、规则、区域、优先级和暂停状态成为 change 为 restored 的新修订,其检查方式与 campaign update 相同:播放列表必须仍然存在且已批准(playlist_not_approved,退出码 5)。旧受众和新受众的每个屏幕都会在一分钟内重新解析。较早的修订保持原样,恢复当前内容不会产生任何变化。恢复需要 campaign update 所需的权限。
审核
当项目需要审查 agent 更改,或会话具有提议访问权限时,播放列表和屏幕更改将等待人工处理而非立即应用。命令仍然成功:ok: true,退出 0,服务器在 data 中响应,并有 pending_review 警告。
{
"ok": true,
"data": {
"status": "pending_review",
"review": {
"id": "rvw_LOBBY",
"kind": "playlist_change",
"state": "pending",
"url": "https://screenrig.ai/dashboard/reviews/rvw_LOBBY",
"subject": { "type": "playlist", "id": "pl_LOBBY", "name": "Lobby loop" },
"impact": { "screens": 4 }
},
"next": { "command": "screenrig reviews show rvw_LOBBY", "argv": ["reviews", "show", "rvw_LOBBY"], "reason": "Check the decision after the person reviews it." }
},
"warnings": [{ "code": "pending_review", "message": "Waiting for a person to approve: https://screenrig.ai/dashboard/reviews/rvw_LOBBY" }]
}播放列表创建和更新(包括 playlist import 和 playlist replace-release --apply)、screen publish、screen assign、screen schedule set、clear 和 restore,以及 screen takeover 和 takeover clear 等待审核,针对单个屏幕或设备群。设备群变更为一次审核:当有人批准时其标签解决,reviews show 然后报告每个屏幕的结果;大型设备群在后台完成应用,screen_change.result.applying 是 true,直到每个屏幕都有结果。除以下媒体变更外,其他变更均响应 403 insufficient_access 用于 Propose 会话。--note TEXT 命令发送纯文本备注,最多 280 字符,审核者在控制台阅读。
某人在仪表板的审核页面批准、请求更改或拒绝;智能体无法批准播放列表或屏幕变更。批准的变更视为当时生效,其事件记录批准者和提议智能体。审核等待时请勿轮询、休眠或重复写入:稍后使用 reviews show 检查,或按 review.approved、review.rejected、review.changes_requested 后跟 events follow --type review. 进行操作。
媒体变更也来自 Propose 会话等待。标签、文件夹和 all 选择器在人员批准前跳过新上传,已批准的媒体被会话重新标记或移动时,屏幕继续播放其批准的标签和文件夹,直到变更获批。重新标记返回 ok,退出码 0,带警告 media_review_pending,项目的审核在几秒内显示于 reviews list;请勿轮询、休眠或重试。每个项目获得一次审核,类型 playlist_change,操作 selector_refresh,主题 media:media_change 显示其标签和文件夹 before 与 after(before 为新上传的 null),media_playlists 列出所有批准的播放列表及所有等待审核的提议播放列表,显示变更添加或移除的播放列表 (media_added, media_removed) 及其屏幕。批准即应用变更;拒绝、请求更改或撤回则将重新标记或移动的项目恢复为批准状态,新上传保持未播放。无变更的批准播放列表和提议自动应用,按 ID 命名项目的播放列表在自身审核中包含该项目。当播放列表在人员决定前移动,媒体审核变为 stale,几秒内由新的审核替代。
审核状态:
| 状态 | 含义 | 下一步 |
|---|---|---|
pending | 等待人员。 | 将审核链接交给该人员;稍后再检查。 |
approved | 应用于播放列表或屏幕。 | 用 screen show 和截图在屏幕上验证。 |
changes_requested | 该人员请求更改;decision_note说明了具体内容。 | 使用 --note 修改并再次提议。 |
rejected | 该人员拒绝;decision_note说明原因。 | 不要重复发送相同更改;请询问该人员。 |
withdrawn | 提议者收回了它。 | 无。 |
superseded | 同一播放列表或屏幕有更新的提案替代了它;superseded_by 指明了替代者。 | 关注较新的评论。 |
stale | 提案后实时播放列表发生变化,或其标签、文件夹或 all 选择器将播放提案时未见的媒体,故无法作为已审核应用。媒体审核在其列出的播放列表变化时失效。 | 重新读取播放列表并在其基础上提议。过时的媒体审核会在几秒内被新的替代。 |
reviews list#
列出评论,最新优先。
reviews list [--state pending|decided|all] [--kind playlist_change|screen_change|ad_creative] [--limit N] [--cursor CURSOR]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--state STATE | string | 否 | pending | pending,decided,或 all。 |
--kind KIND | string | 否 | 每种类型 | playlist_change,screen_change,或 ad_creative。 |
--limit N | integer | 否 | 50 | 每页审核数,1 到 100。 |
--cursor CURSOR | string | 否 | 第一页 | 上一页的 next_cursor。 |
screenrig reviews list --state all结果包含 pending_count。会话看到其能力读取的类型:播放列表变更为 playlists,屏幕变更为 screens,广告创意为 advertising。
reviews show#
读取一个评论。
reviews show <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 来自 pending_review 结果的审核 ID。 |
screenrig reviews show rvw_LOBBY审核报告其 state,提议者,你的 note,decision_note 是拒绝或请求更改时留下的人员,和 impact.screens。播放列表变更添加 diff,一个包含直播和提议播放列表的 preview(媒体审核无),媒体审核的 media_change,以及 media_playlists,变更影响选择的播放列表。屏幕变更时,blockers 列出人员先决定的播放列表审核及其当前状态。
reviews withdraw#
撤回自己的待处理提案。
reviews withdraw <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 本会话提出的待审核项。 |
screenrig reviews withdraw rvw_LOBBY无内容到达屏幕,撤回的新播放列表保持未批准。不再待审的审核回答 review_not_pending(退出 5)。
设备健康和电源
每个配对的播放器在会话开始、每十五分钟以及显示连接或电源变化时报告设备健康状态。它还声明支持的主机功能:在各设备上可用的 reboot、clear_cache、restart_app 和 update,以及可用的显示电源方法(display_power.serial,显示器的 RS-232 控制端口;display_power.cec、display_power.ddc、display_power.backlight 或 display_power.scrim,屏幕黑屏)。screen show 返回两者。
screen show 返回健康状态为 data.health,带服务器的 reported_at;无报告 35 分钟后 stale 变为真,最后报告保持可见。带 --human 时打印 Health 块:报告时间、设备和播放器运行时间、内存使用、CPU 负载和核心数、温度、显示连接和电源、网络类型和 Wi-Fi 信号、电池电量、带电池设备的充电状态和供电来源,以及过去 24 小时内的崩溃和渲染器重启。screen list --human 添加 HEALTH 列,当任何列出的屏幕需要关注:display disconnected、hot(80 °C 或以上)、on battery、crashing(24 小时内 3 次或以上崩溃)或 stale。
转换以 screen.health_changed 事件形式到达,由 events list 和 events follow 以紧凑的 changes= 值打印,例如 display_disconnected,temperature_high temperature_c=82。电源命令追加 screen.reboot_requested 和 screen.display_changed。重启排程在设置或清除时追加 screen.reboot_schedule_changed,在某个窗口过去而没有重启时追加带有 reason 的 screen.reboot_skipped;screen.reboot_requested 携带 source,由排程发出时为 schedule。与每个 screen.* 事件一样,它们在监听流上和作为 webhook 投递时免费。通知会在显示器断开、设备过热或使用电池供电、或播放器持续崩溃时,向你发送电子邮件,或 POST 签名的 webhook。
screen uptime,screen presence 和 screen health-history 读取单个屏幕随时间的操作:每日可用性,在线和离线转换,以及其报告的健康状况。project uptime 和 project health-trend 读取整个设备群。离线状态在屏幕无法访问 60 秒后记录,历史数据根据计划的事件保留期限保存。
| 问题代码 | 退出 | 含义 |
|---|---|---|
reboot_unsupported | 5 | 该屏幕的播放器未声明 reboot。未发送也未存储任何内容;screen reload 刷新内容而不重启设备。 |
command_unsupported | 5 | 屏幕的播放器未声明命令所需的能力 clear_cache、restart_app 或 update。未发送任何内容;screen show 列出主机功能,screen reload 刷新内容。 |
resource_conflict | 5 | 屏幕仍在等待配对,尚无播放器可切换。仍可设置显示排程。 |
invalid_request | 8 | 显示器排程目标为无时区的屏幕(next 为 screen set-timezone),或文件格式错误。 |
rate_limited | 7 | 重启,以及清除缓存、重启应用和更新软件合计:每个屏幕每 10 分钟 2 次,每个组织每分钟 600 次。显示器写入:每个屏幕 10 次,每个组织每分钟 600 次。请等待 retry_after_seconds。 |
多个 ID 或 --tag 作为一个 设备组请求 运行,带设备组信封和退出规则。
screen reboot#
重启屏幕设备或机群设备。
screen reboot (<id>... | --tag TAG) [--yes] [--expires-in DURATION] [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id>... | string | <id> 或 --tag 之一 | 无 | 一个或多个 scr_ 屏幕 ID。 |
--tag TAG | string | <id> 或 --tag 之一 | 无 | 每个带此标签的活动屏幕。 |
--yes | boolean | 针对多个 ID 或 --tag | 关闭 | 确认群组重启。CLI从不提示。 |
--expires-in DURATION | string | 否 | 24h,由服务器应用 | 请求等待离线屏幕上线的时间:90s、30m、2h 或 1d,范围从 60s 到 24h。 |
--expect-rev REVISION | string | 否 | 无 | 仅一个屏幕 ID。可选的修订前提。 |
screenrig screen reboot scr_LOBBY
screenrig screen reboot scr_LOBBY --expires-in 2h
screenrig screen reboot --tag Lobby --yes播放器重启的是设备,而不仅是自身。在线的屏幕会立即收到重启(state sent);离线的屏幕会将其保持为 queued,并在 expires_at 之前上线时收到,除非 --expires-in 另有说明,否则为请求后 24 小时。较新的重启会取代仍在排队的重启。screen show 列出屏幕的 commands:已发送的重启在设备报告已启动后变为 done,screen command cancel 取消仍在排队的重启。在机群中,每个结果的 reboot 携带同样的 state。被拒绝或失败的请求,以及完全相同请求的重放,不计入每屏幕限额。从发出重启起,直到设备报告已启动或十分钟过去,屏幕不会开启 screen_offline 或 display_disconnected 警报;这期间到期的任一类提醒会等到该时段结束再加上其保持时间,而 crashing 提醒会作为 planned_reboot 被跳过。之后仍成立的条件会正常开启。
screen clear-cache#
清除屏幕播放器的缓存,或车队中各播放器的缓存。
screen clear-cache (<id>... | --tag TAG | --folder ID) [--yes] [--expires-in DURATION] [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id>... | string | <id>、--tag 或 --folder 之一 | 无 | 一个或多个 scr_ 屏幕 ID。多个 ID 作为一个舰队请求运行。 |
--tag TAG | string | <id>、--tag 或 --folder 之一 | 无 | 每个带此标签的活动屏幕。 |
--folder ID | string | <id>、--tag 或 --folder 之一 | 无 | 此 sfd_ 屏幕文件夹及其内部文件夹中的每个活动屏幕。 |
--yes | boolean | 多个 ID 时,--tag 或 --folder | 关闭 | 确认车队请求。CLI 从不提示。 |
--expires-in DURATION | string | 否 | 24h,由服务器应用 | 请求等待离线屏幕上线的时间:90s、30m、2h 或 1d,范围从 60s 到 24h。 |
--expect-rev REVISION | string | 否 | 无 | 仅一个屏幕 ID。可选的修订前提。 |
screenrig screen clear-cache scr_LOBBY
screenrig screen clear-cache scr_LOBBY --expires-in 2h
screenrig screen clear-cache --tag Lobby --yes播放器删除已下载的媒体、应用包和数据缓存,保留其配对、身份和设置,然后重新获取清单和内容;内容重新填充期间,屏幕可能显示其加载状态。它只送达声明 clear_cache 的播放器。在线屏幕会立即收到请求(state sent);离线屏幕将其保持为 queued,并在 expires_at 之前上线时收到,即请求后 24 小时,除非 --expires-in 另有规定。响应携带 command_id、command、state 和 expires_at。未声明该能力的播放器返回 409 command_unsupported,不发送任何内容;在车队中该屏幕单独失败。screen show 在 commands 下列出该命令,播放器报告后,将其标记为 done 或 failed,附带 cause 和简短的 detail:缓存已清除且重新获取已开始时为 cleared,缓存无法清除时为 clear_failed。没有报告的 sent 命令保持 sent。同类型的较新命令会取代仍在排队的命令,screen command cancel 取消仍在排队的命令。在车队中,每个结果的 command 带有相同的 state。车队(多个 ID、--tag 或 --folder)需要 --yes。被拒绝或失败的请求,以及完全相同请求的重放,不计入每屏每 10 分钟合计 2 次清除缓存、重启应用和更新软件请求的限制。
screen restart-app#
重启屏幕播放器的应用,或车队中各播放器的应用。
screen restart-app (<id>... | --tag TAG | --folder ID) [--yes] [--expires-in DURATION] [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id>... | string | <id>、--tag 或 --folder 之一 | 无 | 一个或多个 scr_ 屏幕 ID。多个 ID 作为一个舰队请求运行。 |
--tag TAG | string | <id>、--tag 或 --folder 之一 | 无 | 每个带此标签的活动屏幕。 |
--folder ID | string | <id>、--tag 或 --folder 之一 | 无 | 此 sfd_ 屏幕文件夹及其内部文件夹中的每个活动屏幕。 |
--yes | boolean | 多个 ID 时,--tag 或 --folder | 关闭 | 确认车队请求。CLI 从不提示。 |
--expires-in DURATION | string | 否 | 24h,由服务器应用 | 请求等待离线屏幕上线的时间:90s、30m、2h 或 1d,范围从 60s 到 24h。 |
--expect-rev REVISION | string | 否 | 无 | 仅一个屏幕 ID。可选的修订前提。 |
screenrig screen restart-app scr_LOBBY
screenrig screen restart-app scr_LOBBY --expires-in 2h
screenrig screen restart-app --tag Lobby --yes播放器重启其应用,而非设备(Web 播放器重新加载其页面),并从重启后的进程报告。它只送达声明 restart_app 的播放器;screen reboot 重启设备。在线屏幕会立即收到请求(state sent);离线屏幕将其保持为 queued,并在 expires_at 之前上线时收到,即请求后 24 小时,除非 --expires-in 另有规定。响应携带 command_id、command、state 和 expires_at。未声明该能力的播放器返回 409 command_unsupported,不发送任何内容;在车队中该屏幕单独失败。screen show 在 commands 下列出该命令,播放器报告后,将其标记为 done 或 failed,附带 cause 和简短的 detail:restarted,或重启无法开始时为 restart_failed。没有报告的 sent 命令保持 sent。同类型的较新命令会取代仍在排队的命令,screen command cancel 取消仍在排队的命令。在车队中,每个结果的 command 带有相同的 state。车队(多个 ID、--tag 或 --folder)需要 --yes。被拒绝或失败的请求,以及完全相同请求的重放,不计入每屏每 10 分钟合计 2 次清除缓存、重启应用和更新软件请求的限制。
screen update-software#
将屏幕的播放器更新到最新版本,或更新车队中的各播放器。
screen update-software (<id>... | --tag TAG | --folder ID) [--yes] [--expires-in DURATION] [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id>... | string | <id>、--tag 或 --folder 之一 | 无 | 一个或多个 scr_ 屏幕 ID。多个 ID 作为一个舰队请求运行。 |
--tag TAG | string | <id>、--tag 或 --folder 之一 | 无 | 每个带此标签的活动屏幕。 |
--folder ID | string | <id>、--tag 或 --folder 之一 | 无 | 此 sfd_ 屏幕文件夹及其内部文件夹中的每个活动屏幕。 |
--yes | boolean | 多个 ID 时,--tag 或 --folder | 关闭 | 确认车队请求。CLI 从不提示。 |
--expires-in DURATION | string | 否 | 24h,由服务器应用 | 请求等待离线屏幕上线的时间:90s、30m、2h 或 1d,范围从 60s 到 24h。 |
--expect-rev REVISION | string | 否 | 无 | 仅一个屏幕 ID。可选的修订前提。 |
screenrig screen update-software scr_LOBBY
screenrig screen update-software scr_LOBBY --expires-in 2h
screenrig screen update-software --tag Lobby --yes播放器立即检查最新的播放器版本,并在其平台允许播放器自行更新时安装;Web 播放器更新其 service worker,然后重新加载。它只送达声明 update 的播放器:通过商店安装或由设备管理器管理的播放器通过该渠道更新。在线屏幕会立即收到请求(state sent);离线屏幕将其保持为 queued,并在 expires_at 之前上线时收到,即请求后 24 小时,除非 --expires-in 另有规定。响应携带 command_id、command、state 和 expires_at。未声明该能力的播放器返回 409 command_unsupported,不发送任何内容;在车队中该屏幕单独失败。screen show 在 commands 下列出该命令,播放器报告后,将其标记为 done 或 failed,附带 cause 和简短的 detail:最新版本已在运行时为 up_to_date,新版本已启动后为 updated,失败时为 update_check_failed、download_failed、install_failed 或 no_update_channel。没有报告的 sent 命令保持 sent。同类型的较新命令会取代仍在排队的命令,screen command cancel 取消仍在排队的命令。在车队中,每个结果的 command 带有相同的 state。车队(多个 ID、--tag 或 --folder)需要 --yes。被拒绝或失败的请求,以及完全相同请求的重放,不计入每屏每 10 分钟合计 2 次清除缓存、重启应用和更新软件请求的限制。
screen command cancel#
取消仍为离线屏幕排队的命令。
screen command cancel <id> <command_id> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | scr_ 屏幕 ID。 |
<command_id> | string | 是 | 无 | 来自 screen show 中 commands 的 ID,或该请求返回的 reboot_id、reload_id 或 command_id。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig screen command cancel scr_01EXAMPLESCREEN00000000 rbt_01EXAMPLEREBOOT00000000只有排队中的命令可以取消。已发送的命令(sent 或 done)返回 409 resource_conflict,并附带 "The command was already sent.";不再排队的命令(expired、cancelled 或 superseded)返回 409 resource_conflict,并附带 "The command is no longer queued.";屏幕未列出的 ID 返回 404 not_found。响应是该命令状态为 cancelled 的屏幕,屏幕版本不变。
screen display#
立即开启或关闭屏幕的显示,或清除该覆盖设置。
screen display [set] (<id>... | --tag TAG) --power on|off [--until TIME | --for DURATION] [--expect-rev REVISION]
screen display clear (<id>... | --tag TAG) [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id>... | string | <id> 或 --tag 之一 | 无 | 一个或多个 scr_ 屏幕 ID。ID 后的尾随 on 或 off 等同于 --power。 |
--tag TAG | string | <id> 或 --tag 之一 | 无 | 每个带此标签的活动屏幕。 |
--power on|off | string | 是,针对 set | 无 | 立即应用的权限。 |
--until TIME | string | 否 | 显示排程的下一个边界 | 严格 RFC 3339 时间点,严格未来且最多提前 7 天。 |
--for DURATION | string | 否 | 显示排程的下一个边界 | 30m,2h,或 3d,最多 6d23h59m。不适用于 --until。 |
--expect-rev REVISION | string | 否 | 无 | 仅一个屏幕 ID。可选的修订前提。 |
screenrig screen display scr_LOBBY --power off --for 2h
screenrig screen display --tag Lobby --power on
screenrig screen display clear --tag Lobbyscreen display 是显示器排程的手动覆盖。没有 --until 或 --for 时,会在排程的下一个边界结束;后续更改显示器排程或时区会将结束时间移动到新的边界。如果接下来八天内没有边界,例如没有启用排程,则会持续到 screen display clear 或被替换。screen display clear 结束覆盖,显示器排程重新生效;若没有,则显示器保持开启。播放器会立即应用每次更改,并报告实际实现的电源状态。
screen display-schedule#
显示、设置或清除屏幕显示器的开关状态。
screen display-schedule show <id>
screen display-schedule set (<id>... | --tag TAG) --file FILE [--expect-rev REVISION]
screen display-schedule clear (<id>... | --tag TAG) [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id>... | string | <id> 或 --tag 之一 | 无 | 一个或多个 scr_ 屏幕 ID;show 接受一个。 |
--tag TAG | string | <id> 或 --tag 之一 | 无 | 每个带此标签的活动屏幕。 |
--file FILE | 路径 | 是,针对 set | 无 | 显示排程,或使用 - 读取标准输入。 |
--expect-rev REVISION | string | 否 | 无 | 仅一个屏幕 ID。可选的修订前提。 |
screenrig screen display-schedule set scr_LOBBY --file hours.json
screenrig screen display-schedule set --tag Cafe --file hours.json显示器排程在显示器开启时列出 1 至 16 个窗口,按屏幕时区;窗口外显示器进入待机。播放器在设备上评估排程,离线时仍有效。窗口的 end 在或早于 start 跨越午夜,且无 start 和 end 的窗口覆盖全天。enabled: false 保持窗口并保持显示器开启。display-schedule show 的保存输出可编辑并通过 set --file 发送回去。
{"enabled": true, "windows": [{"days": ["mon", "tue", "wed", "thu", "fri"], "start": "07:00", "end": "19:00"}, {"days": ["sat"]}]}screen show --human 打印 Display: 及请求的功率、其来源(手动覆盖、显示计划或默认)及屏幕时区的截止时间、计划窗口和播放器报告的功率,超过 35 分钟无报告则标记为过时。
screen display-idle#
在一段时间无人使用后让屏幕变暗,或关闭此功能。
screen display-idle <id> --after SECONDS --wake WAKE [--expect-rev REVISION]
screen display-idle <id> --off [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | scr_ 屏幕 ID。 |
--after SECONDS | integer | --after 或 --off 之一 | 无 | 在无人使用达这么多秒后变暗,30 到 86400。需要 --wake。 |
--wake WAKE | string | 配合 --after | 无 | 重新点亮屏幕的方式:touch、presence 或 touch,presence。presence 在设备本地读取设备的摄像头;不会有图像离开设备。 |
--off | boolean | --after 或 --off 之一 | 关闭 | 关闭空闲变暗。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig screen display-idle scr_LOBBY --after 300 --wake touch
screenrig screen display-idle scr_LOBBY --after 600 --wake touch,presence --expect-rev 4
screenrig screen display-idle scr_LOBBY --off在没有触摸或按键、或(在 --wake 列出 presence 时)屏幕前无人的情况下持续 --after 秒后,屏幕变暗。变暗期间,播放器暂停播放(无播放记录,无广告),并报告显示电源关闭;唤醒事件会立即让屏幕重新亮起并恢复播放,唤醒变暗屏幕的那次触摸不会传给页面。让面板保持关闭的显示排程或覆盖优先,页面在屏幕上时持有 device.display 的应用程序同样优先。只有 display.idle 会更改。当 screen show 在其主机能力中列出 display_power.idle 时,播放器才会应用它;无论如何设置都会被存储,screen show 将其列为 Display idle。Propose 访问权限无法更改它(insufficient_access),受保护文件夹中的屏幕会拒绝它(protected_target)。
screen brightness#
设置屏幕亮度是否跟随设备的光线传感器。
screen brightness <id> --mode auto|fixed [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | scr_ 屏幕 ID。 |
--mode auto|fixed | string | 是 | 无 | auto 根据设备的光线传感器设置亮度;fixed 保持操作员设定的亮度,这是默认值。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig screen brightness scr_LOBBY --mode auto
screenrig screen brightness scr_LOBBY --mode fixed --expect-rev 4只有 display.brightness 会更改。当 screen show 在其主机能力中列出 brightness.auto 时(设备仅在具备光线传感器时才声明它),播放器才会应用 auto;设置显示器亮度的应用程序在其页面显示期间优先。无论如何设置都会被存储,screen show 将其列为 Display brightness。适用 screen display-idle 的访问规则。
screen kiosk-lock#
将屏幕的播放器固定在屏幕上,或解除固定。
screen kiosk-lock <id> (--on | --off) [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | scr_ 屏幕 ID。 |
--on, --off | boolean | 两者之一 | 无 | --on 将播放器固定在屏幕上;--off 解除固定。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。省略则写入当前资源。提供的过期值为 revision_conflict:重新获取,重新应用,重试。 |
screenrig screen kiosk-lock scr_LOBBY --on
screenrig screen kiosk-lock scr_LOBBY --off --expect-rev 4--on 使用 Android 屏幕固定:屏幕前的人员首次需要确认,播放器被固定期间,状态栏、主屏幕和最近任务均被禁用。操作员设置面板可以退出该锁定,直到下一次清单或重启再次应用它。当 screen show 在其主机能力中列出 kiosk_lock 时,播放器才会应用它;无论如何设置都会被存储,开启期间 screen show 会列出 Kiosk lock。适用 screen display-idle 的访问规则。
screen reboot-schedule#
显示、设置或清除后端重启屏幕设备的时间。
screen reboot-schedule show <id>
screen reboot-schedule set (<id>... | --tag TAG) (--window SPEC... | --file FILE) [--enabled | --disabled] [--expect-rev REVISION]
screen reboot-schedule clear (<id>... | --tag TAG) [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id>... | string | <id> 或 --tag 之一 | 无 | 一个或多个 scr_ 屏幕 ID;show 接受一个。 |
--tag TAG | string | <id> 或 --tag 之一 | 无 | 每个带此标签的活动屏幕。 |
--window SPEC | string | --window 或 --file 之一,用于 set | 无 | 在此每周窗口开始时重启,DAYS HH:MM-HH:MM 按屏幕时区,例如 "Mon-Sun 04:00-04:30"(DAYS@HH:MM-HH:MM 也可用)。最多重复 16 次;每个窗口持续 5 分钟到 24 小时。 |
--file FILE | 路径 | --window 或 --file 之一,用于 set | 无 | JSON 格式的重启排程,或用 - 表示标准输入,取代 --window。 |
--enabled, --disabled | boolean | 否 | --enabled | --disabled 保留现有窗口,不重启任何设备。不能与 --file 一起使用。 |
--expect-rev REVISION | string | 否 | 无 | 仅一个屏幕 ID。可选的修订前提。 |
screenrig screen reboot-schedule set scr_LOBBY --window "Mon-Sun 04:00-04:30"
screenrig screen reboot-schedule set --tag Cafe --window "Mon-Fri 04:00-04:30" --window "Sat,Sun 05:00-06:00"
screenrig screen reboot-schedule set scr_LOBBY --file reboots.json --expect-rev 4在屏幕时区的每个窗口开始时,screenRIG 发出与 screen reboot 相同的重启,因此 "Mon-Sun 04:00-04:30" 会让屏幕每天本地时间 04:00 重启。screen show 中的 commands 以 source schedule 列出它,screen show 和 reboot-schedule show 打印 next_reboot_at。结束时间等于或早于开始时间的窗口跨越午夜,没有时间的窗口覆盖全天。reboot-schedule show 保存的输出可以编辑后用 set --file 发回:
{"enabled": true, "windows": [{"days": ["mon", "tue", "wed", "thu", "fri", "sat", "sun"], "start": "04:00", "end": "04:30"}]}在线屏幕会立即收到重启。离线屏幕只在其窗口结束之前保持排队,因此重启绝不会落在窗口之外:窗口之后才恢复的屏幕不会收到重启。落在春季拨快间隙内的开始时间,在窗口的第一个有效分钟触发;秋季回拨造成的重复时间,每个窗口每个本地日期只触发一次。排程重启绝不会取代人工请求且仍在等待屏幕的重启;该次执行会以 screen.reboot_skipped(reboot_pending)被跳过。屏幕需要已存储的时区和声明了 reboot 的播放器;之后失去 reboot 的屏幕会跳过每个窗口并保留其排程。更改时区会将 next_reboot_at 移到新时区。排程发出的重启不会触发离线警报,与 screen reboot 下相同。screen.reboot_schedule_changed 记录每次设置或清除。在机群中,每个结果属于该屏幕自己:播放器无法重启的屏幕为 reboot_unsupported。
screen uptime#
读取屏幕的每日可用性,按 UTC 天计算。
screen uptime <id> [--day-from YYYY-MM-DD] [--day-to YYYY-MM-DD]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | scr_ 屏幕 ID。 |
--day-from YYYY-MM-DD | string | 否 | 提前 29 天 --day-to | 首个 UTC 天(含)。 |
--day-to YYYY-MM-DD | string | 否 | 今天 | 最后的UTC日,含当日。最多为--day-from后366天。 |
screenrig screen uptime scr_01EXAMPLESCREEN00000000
screenrig screen uptime scr_01EXAMPLESCREEN00000000 --day-from 2026-09-01 --day-to 2026-09-30data.items 按 UTC 天列出每个有记录状态的行,最旧的在前:online_s、offline_s、availability(记录时间内在线;无记录时为 null)、coverage(有记录状态的当天份额)、intervals 和包含至今开放区间的 live。无记录状态的时间降低 coverage,但从不算作停机。无记录的天没有行。
screen presence#
列出屏幕的在线和离线转换,最新优先。
screen presence <id> [--since TIME] [--until TIME]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | scr_ 屏幕 ID。 |
--since TIME | string | 否 | 提前 30 天 --until | 转换时间的包含起点:带秒和偏移(归一化为 UTC)的 RFC 3339 时间点,now,或类似 7d、12h 或 30m 的时长。 |
--until TIME | string | 否 | 现在 | 独占结束,形式相同。最多在 --since 后366天内。 |
screenrig screen presence scr_01EXAMPLESCREEN00000000 --since 7d
screenrig screen presence scr_01EXAMPLESCREEN00000000 --since 2026-09-01T00:00:00Z --until 2026-09-08T00:00:00Zdata.items 在服务器仅在屏幕重新连接时才注意到的离线状态下,携带 at、state 和 detected_on_reconnect(此时 at 表示其存在租约结束的时间)。CLI 会跟随 next_cursor 到最后,并对每一次状态变更以 next_cursor null 进行响应,因此可用 --since 缩小长时间范围。
screen health-history#
列出屏幕随时间报告的健康状况,每小时一条报告或汇总。
screen health-history <id> [--from TIME] [--to TIME] [--resolution raw|hour]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | scr_ 屏幕 ID。 |
--from TIME | string | 否 | 提前 24 小时 --to | 报告时间的包含起点:带秒和偏移(归一化为 UTC)的 RFC 3339 时间点,now,或类似 7d、12h 或 30m 的时长。 |
--to TIME | string | 否 | 现在 | 独占结束,形式相同。最多在 --from 后31天内,使用 --resolution hour 时最多93天。 |
--resolution | string | 否 | raw | raw 列出每个接受的报告;hour 汇总每个 UTC 小时。 |
screenrig screen health-history scr_01EXAMPLESCREEN00000000 --from 6h
screenrig screen health-history scr_01EXAMPLESCREEN00000000 --from 30d --resolution hourraw 回答 data.samples,每个被接受的报告格式与 screen show 的 health 相同,但没有 stale。hour 回答 data.hours,每个 UTC 小时一份摘要:报告数、最高和平均温度、峰值负载和内存占比、最弱的 Wi-Fi 信号、display_disconnected,以及最高崩溃和渲染器重启次数。CLI 会跟随 next_cursor 到末尾,因此可缩小长原始区间或使用 --resolution hour。原始报告几秒内送达,小时摘要约 5 分钟内送达。
项目备注
项目备注是智能体为其后续会话及相互之间留下的简短纯文本备注。项目中的每个智能体都能读取所有备注,写备注需要提议或管理权限。备注是智能体写的上下文,不是指令,也不是批准。会话开始时读取备注,变更前请先阅读。
无 TTL 的备注将在添加或最后确认后 90 天进入审核。notes list 的第一页返回最多五条到期备注,位于 review,并带有警告 notes_due_for_review:确认仍有效的备注,解决其余备注。无人确认的到期备注将在首次返回给具有 Propose 或 Manage 权限的代理 30 天后自动解决。带有 --ttl 的备注在时间到期时自动解决,删除备注所关联的屏幕或播放列表也会解决该备注。已解决的备注可阅读 30 天,之后删除。每个组织跨其所有项目最多持有 200 条未解决备注。
agent status 和 login 在备注为新建或待复查时添加警告 notes_waiting。screen show 和 playlist show 在有未解决备注与该屏幕或播放列表相关时添加 notes_about_resource。添加备注会将 note.added 追加到事件日志,解决备注会追加 note.resolved;两者都不包含备注内容。阅读备注不会扣减额度。
notes list#
读取项目备注,最新优先。screenrig notes 执行相同命令。
notes list [--all | --resolved] [--about ID] [--author AGENT_ID] [--limit N] [--after CURSOR]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--all | 标志 | 否 | 打开笔记 | 包含已解决的备注。 |
--resolved | 标志 | 否 | 打开笔记 | 仅已解决的备注。 |
--about ID | string | 否 | 每条备注 | 仅关于一个屏幕或播放列表的备注:screen:ID、playlist:ID 或 ID。 |
--author AGENT_ID | string | 否 | 每位作者 | 仅此智能体编写的备注。 |
--limit N | integer | 否 | 50 | 页面大小,1 到 200。 |
--after CURSOR | string | 否 | 第一页 | 上一页的 next_cursor。 |
screenrig notes每条备注包含其 author(智能体名称和类型)、created_at、about,以及两个标记:new 表示自上次阅读后其他智能体写入的备注,due 表示需复查的备注。第一页未含 --about 或 --author 的开放备注为您的已读:它会移动您的已读标记(仅读智能体不会移动),因此 new 和 counts.new 描述自上次阅读以来的变更。
notes show#
读取一个备注,开放或已解决。
notes show <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | nte_ 备注 ID。 |
screenrig notes show nte_01EXAMPLENOTE000000000notes add#
为项目的智能体写备注。
notes add <text> [--about ID] [--ttl DURATION] [--replaces ID]
notes add --file FILE [--about ID] [--ttl DURATION] [--replaces ID]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<text> | string | 两者之一 | 无 | 备注:修剪后为1至2000字符纯文本。 |
--file FILE | 路径 | 两者之一 | 无 | 从文件读取备注,或使用 - 读取标准输入。 |
--about ID | string | 否 | 整个项目 | 将备注绑定到一个屏幕或播放列表:screen:ID、playlist:ID,或该 ID。 |
--ttl DURATION | string | 否 | 90 天后复审 | 在从 1h 到 365d 的小时或天数后自动解决备注,例如 12h 或 3d。 |
--replaces ID | string | 否 | 无 | 一个被此条覆盖的未解决备注;它被标记为已替代。 |
screenrig notes add "The lobby screen is mounted in portrait: design for 1080x1920." --about screen:scr_01EXAMPLESCREEN00000000写入其他智能体会执行的事实,绝不写进进度报告或聊天。文本(忽略大小写和空格)和主题重复的未关闭备注会确认该备注而非新增,并显示警告 note_matched_open。拒绝凭证形文本,显示 note_contains_credential,拒绝指令文本,显示 note_rejected;不存储任何内容。组织各项目中的第 201 条未关闭备注拒绝,显示 note_limit_reached,详情列出需先解决的备注。
notes confirm#
表示一个未关闭的备注仍然有效。其下一次复审在 90 天后。
notes confirm <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 一个开放备注的 nte_ ID。 |
screenrig notes confirm nte_01EXAMPLENOTE000000000notes resolve#
解决错误或不再有效的未处理备注。
notes resolve <id> <reason>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 一个开放备注的 nte_ ID。 |
<reason> | string | 是 | 无 | 现在的真实情况,1 到 500 字符。 |
screenrig notes resolve nte_01EXAMPLENOTE000000000 "The lobby screen was remounted in landscape."已解决的备注被拒绝,返回 note_not_open。
操作
上传和发布以操作的形式运行。media upload、media replace 和 app upload 默认会等待各自的操作完成;这些命令用于完成你用 --no-wait 留在后台运行的操作。
operations show#
读取一个操作的当前状态。
operations show <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 启动该操作的信封中的操作 ID。 |
screenrig operations show op_01EXAMPLEOPERATION00000operations wait#
轮询一个操作直到完成。
operations wait <id> [--timeout MS] [--poll-ms MS]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 操作 ID。 |
--timeout MS | integer | 否 | 120000 | 等待的截止时间。它也限制每个底层请求。 |
--poll-ms MS | integer | 否 | 1000 | 等待时操作轮询间隔。 |
screenrig operations wait op_01EXAMPLEOPERATION00000operations cancel#
请求控制平面取消一个操作。
operations cancel <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 操作 ID。 |
screenrig operations cancel op_01EXAMPLEOPERATION00000事件
项目事件日志记录项目和车队的操作。发布的版本追加 application.published;调用 screenrig.emit(code) 的应用追加自身事件,这是其在屏幕上运行的最直接证据。
在线状态也记录在日志中。screen.offline在屏幕离线60秒后写入,screen.online在其重新上线时写入;60秒内重连不写入。screen.offline携带details.offline_since,且当屏幕之前在线过时,携带details.last_online_at。screen.online携带details.last_online_at,当屏幕之前离线后返回时,还携带details.offline_at。如所有screen.*事件,监听流上免费,代理可保持events follow打开以监视屏幕组。
events list#
读取项目事件的一个有限页面。
events list [--after CURSOR] [--limit N] [--type TYPE] [--screen-id ID] [--app-id ID]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--after CURSOR | string | 否 | 页面窗口的开始 | 从此游标继续。 |
--limit N | integer | 否 | 服务器的页面大小 | 请求的页面大小。 |
--type TYPE | string | 否 | 每种类型 | 一种事件类型,或以点结尾的前缀表示的事件族,如 note.。 |
--screen-id ID | string | 否 | 每个屏幕 | 以此屏幕为资源的事件,包括 SDK 发出的事件。 |
--app-id ID | string | 否 | 所有应用 | 应用资源、发布版本和 K/V 事件;不包含 SDK 发出的事件。 |
screenrig events list --limit 25
screenrig events list --type application.event --screen-id scr_SCREENSDK 的 emit() 和 emitConfirmed() 会添加以屏幕为资源的 application.event 记录。使用 --type application.event 读取,可选择添加 --screen-id。返回的 details.primitive_id 和 details.code 标识发出事件的图元和命名操作。--app-id 选择应用资源、发布版本和 K/V 事件,因此不包含这些屏幕事件。
默认输出为页面的一个 JSON 信封。使用 --human 时,输出每个事件一行 logfmt:at=、type=、severity= 和标量详情。
events follow#
保持事件流连接,实时打印事件。
events follow [--after CURSOR] [--timeout MS] [--type TYPE]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--after CURSOR | string | 否 | 实时尾部 | 从此游标恢复。 |
--timeout MS | integer | 否 | 无截止日期 | 结束整个跟踪,包括重新连接退避。 |
--type TYPE | string | 否 | 每种类型 | 一种事件类型,或以点结尾的前缀表示的事件族,如 note.。 |
screenrig events follow断开或临时故障时,使用退避重连并从最后事件 ID 恢复。重连后重放免费。授权和未找到问题停止命令而非重试。
使用 --type 时,流仍携带所有事件,CLI 仅打印匹配事件:screenrig events follow --type note. 监视项目备注。
默认输出为 NDJSON:每个事件一个信封,独立一行,而非单个信封。使用 --human 输出 logfmt 行。
通知
当屏幕状态改变时,通知会告知某个人或其他系统。电子邮件通知向每位收件人发送邮件,Webhook 通知发送签名的 HTTPS POST,Slack、Teams、PagerDuty 或 Telegram 通知则向聊天工具或告警呼叫服务发布消息。每个组织所有渠道合计、跨其所有项目最多 50 个,每个项目起初都有一封在屏幕离线 10 分钟时发给所有者的电子邮件。
通知会监视你指定的条件:
| 条件 | 开始条件 | 结束条件 |
|---|---|---|
screen_offline | 播放器已离线 60 秒。 | 屏幕重新上线。 |
display_disconnected | 播放器报告其显示器已断开连接。 | 显示器重新连接。 |
running_hot | 设备报告的温度达到或超过过热阈值。 | 温度恢复正常。 |
on_battery | 带电池的设备报告其正在使用电池供电,未接通电源。 | 设备报告了其他供电来源。 |
storage_full | 播放器的存储空间无法容纳其内容。 | 存储不足的情况已消除。 |
content_stuck | 屏幕的内容更新正在重试、已失败、被阻止或仅部分完成。 | 更新进入任何其他状态。 |
not_playing | 播放器显示错误而不是其内容。存储空间已满属于 storage_full。 | 播放器的状态不再是错误。 |
loop_stalled | 一块在线、按计划运行且内容最新的屏幕,在超过其循环所允许的时间内没有开始任何图像或视频。 | 图像或视频重新开始,或 screenRIG 不再判定该屏幕。 |
glass_blank | screenRIG 在覆盖整个循环的一组截图中,所有截图都是同一种纯色。 | 连续两张截图显示出画面,或 screenRIG 不再判定该屏幕。 |
glass_frozen | screenRIG 在覆盖整个循环的一组截图中,所有截图都是同一幅画面。 | 连续两张截图显示出变化的画面,或 screenRIG 不再判定该屏幕。 |
crashing | 播放器反复崩溃或重启其渲染器。 | 从不:每次突发都是单独的一条提醒。 |
source_failed | 数据源刷新失败。 | 刷新成功。 |
source_stale | 数据源持续失败,直到其数据过期。 | 刷新成功。 |
card_data_stale | 卡片的数据带有过期时间写入,在屏幕显示该卡片期间到达了过期时间,且无人续期。 | 对卡片数据的写入成功。 |
reach_dropped | 活动触达的屏幕比上次发布时更少,原因是屏幕离开了其标签或文件夹,或已被归档或删除。 | 活动重新触达同样多的屏幕,或再次发布。 |
group_empty | 活动受众中的某个标签或文件夹不匹配任何屏幕。 | 该标签或文件夹再次匹配屏幕,或发布时将其从受众中移除。 |
条件持续 --hold 分钟后会发出提醒(默认 10 分钟),因此短暂的重新连接不会发出提醒。如果条件先结束,则不发送任何内容;如果在提醒发出后结束,则随后会发送一条“已解决”提醒。crashing 会立即发送。如果有人在保持时间内确认或暂缓了该屏幕的警报,或有静音覆盖该屏幕,提醒也会被跳过。--tag 将通知限定为带有该标签的屏幕;不使用它时,所有屏幕都适用。
每条提醒都有严重级别。已开启的提醒,对 screen_offline 为 error,对其他每个条件为 warning,已解决的提醒或测试为 info。--min-severity LEVEL(info、warning 或 error)不会创建低于该级别的已开启提醒,已解决提醒跟随其对应的已开启提醒。--severity CONDITION=LEVEL 可重复,设置此通知中某个条件的级别,例如 --severity not_playing=error;它计入 --min-severity,也是 Teams 和 PagerDuty 显示的严重级别。电子邮件、Slack 和 Telegram 文本会写明严重级别,webhook 请求体携带 severity。
--active-hours SPEC 仅在每周窗口内发送已开启的提醒,窗口按 --timezone ZONE 解读,该项为必填。SPEC 为 DAYS HH:MM-HH:MM,例如 "Mon-Fri 08:00-22:00";最多可重复 16 次。使用 --outside-hours hold(默认)时,在时段之外到期的提醒会等到下一个窗口,若届时条件仍然成立才发出,因此条件先行解除则不发送任何内容。使用 drop 时,该提醒会作为 outside_hours 被跳过,notifications deliveries 会列出它。已发送的已开启提醒对应的已解决提醒始终发出,crashing 与其他条件一样遵循时段,暂缓会先检查,而 notifications test 忽略时段、严重级别和受众。
--audience FILE(内联 JSON、文件,或用 - 表示标准输入)按活动受众的规则选择屏幕,例如 {"all":[{"tag":"level2"},{"tag":"overhead"}]} 表示同时带有两个标签的屏幕;--all-tags TAG 和 --any-tag TAG 分别是标签的 all 规则和 any 规则的简写,--tag 表示任一标签。--tag、--any-tag、--all-tags 和 --audience 互相排斥。
loop_stalled、glass_blank 和 glass_frozen 是 screenRIG 根据收到的播放报告和截图得出的判定,对其无法判断的情形不作判定:离线的屏幕、显示器关闭的屏幕、处于接管或已暂停的屏幕、只显示单张静态图或视频墙的屏幕,或其 Player 不发送播放序号的屏幕。当 screenRIG 不再判定一块曾处于其中某种状态的屏幕时,警报会关闭,但电子邮件、Slack、Teams 和 Telegram 不会发送已解决通知,因为没有任何迹象表明屏幕已恢复;PagerDuty 仍会解决其事件。
source_failed 和 source_stale 监视的是项目的数据源而不是屏幕:通知会写明数据源并链接其页面,并且 --tag 永远不会匹配数据源。
card_data_stale 监视的是卡片,而不是屏幕。写入卡片数据时,设置一个与写入方的计划相匹配的过期时间(card data put --ttl 30m):当负责续期的作业或智能体停止时,数据会过期,卡片在每块显示它的屏幕上都会变为空白,并由此条件通知您。通知会写明卡片以及其数据的过期时间,并链接到放置该卡片的页面的页面编辑器。数据源的文档不会在这里通知(由 source_stale 负责),没有屏幕显示的卡片、没有过期时间的数据,或已被删除的数据也不会通知。--tag 从不匹配卡片。
reach_dropped 和 group_empty 监视的是活动而不是屏幕。提醒会写明活动及其此前和现在触达的屏幕,或写明为空的标签或文件夹,并链接到该活动的日历。活动属于项目,因此 --tag、--any-tag、--all-tags 和 --audience 永远不会限制这两者;--min-severity、--severity、--active-hours 和 --hold 与其他条件一样适用,并且两者默认都是 warning。--reach-drop-screens N 和 --reach-drop-percent P 仅在屏幕减少至少 N 个且至少占活动发布时所触达屏幕的 P% 时才发送 reach_dropped 提醒;减少必须同时满足两者,未设置时任何减少都会发出提醒。它们需要 --conditions 中有 reach_dropped。活动的每个空标签或文件夹各自是一条提醒,notifications deliveries 将其显示为 audience_group(tag:Lobby 或 folder:sfd_…)。发布时若把空分组从受众中移除,会关闭 PagerDuty 事件和 webhook 的警报,但不会发送恢复邮件或聊天消息。
邮件发送到每位收件人的已验证地址;约两分钟内到期的所有提醒合并为每位收件人一封邮件,其中包含指向控制台中每个屏幕和该通知的链接。收件人为 owner(即提醒发送时拥有该项目的人)和项目成员的用户 ID。没有已验证地址或已离开项目的收件人会被跳过。通知邮件和屏幕状态提醒免费。
每封邮件都带有专属于其收件人的取消订阅链接:邮件应用中的取消订阅按钮,以及页脚中的链接。点击后,该通知的邮件将不再发给这一个人,无需登录,打开的页面上有 Resubscribe 按钮。其他收件人不受影响,此人仍留在收件人中。notifications show 会用 unsubscribed 列出已取消订阅的人,notifications resubscribe 可让他们重新收到邮件。没有人可发邮件的通知会以 no_recipients 跳过。
Webhook 通知以 JSON 形式 POST 每条提醒,你可按验证交付中所述进行验证。使用 --events 时,它还会在原始项目事件发生时 POST 这些事件;这些交付按Webhooks中所述计量。
Slack、Teams、PagerDuty 或 Telegram 通知会针对每次故障、每块屏幕发布一条消息:屏幕、发生了什么变化、从何时开始、项目、屏幕链接,以及离线屏幕恢复时的可能原因(若届时已知)。第一条消息发出后会再发一条恢复消息,在 PagerDuty 中它会解决第一条消息打开的事件。凭据只需提供一次(--slack 使用传入 Webhook 的 URL,--teams 使用 Workflows Webhook 的 URL,--pagerduty 使用 Events API v2 路由密钥,--telegram 使用机器人令牌并配合 --telegram-chat);它会被加密封存,不再显示,destination_hint 只显示遮蔽后的末尾。- 会从 stdin 的一行读取,使其不进入你的 shell 历史。发布失败会重试 24 小时,连续失败 72 小时的通知会被停用。
| 问题代码 | 退出 | 含义 |
|---|---|---|
webhook_url_rejected | 8 | URL 不是 https,端口非 443 或 8443,或其主机不只解析为公共互联网地址。error.detail 说明服务器原因。未创建或更改任何内容。 |
notification_destination_rejected | 8 | 目标与其渠道不符,或是已停用的 Office 365 连接器 URL。error.detail 会说明正确的形式。未创建或更改任何内容。 |
notification_limit_reached | 5 | 组织已有 50 个通知。请先删除一个。 |
revision_conflict | 6 | --expect-rev 版本已过时。运行 notifications show,然后重试。 |
rate_limited | 7 | 此组织一分钟内超过 20 次 notifications test 调用。 |
notifications create#
创建电子邮件、Webhook、Slack、Teams、PagerDuty 或 Telegram 通知。
notifications create (--email RECIPIENTS | --webhook URL | --slack URL | --teams URL | --pagerduty KEY
| --telegram TOKEN --telegram-chat CHAT_ID) [--conditions LIST] [--events TYPES]
[--tag TAG... | --any-tag TAG... | --all-tags TAG... | --audience FILE] [--hold MINUTES]
[--min-severity LEVEL] [--severity CONDITION=LEVEL]... [--active-hours SPEC]...
[--timezone ZONE] [--outside-hours hold|drop] [--reach-drop-screens N] [--reach-drop-percent P]
[--description TEXT] [--disabled]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--email RECIPIENTS | string | 一个渠道标志 | 无 | 向这些逗号分隔的收件人发送邮件:owner,或项目成员的用户 ID,最多 20 个。 |
--webhook URL | string | 一个渠道标志 | 无 | 一个 https URL,端口为 443(默认)或 8443,主机仅解析为公共互联网地址。服务器在每次写入时检查,并在每次交付前再次检查。携带凭据的 URL(user:pass@ 或 token@)或带有 # 片段的 URL 在本地拒绝,退出码为 2。 |
--conditions LIST | string | 是(Webhook 除外) | 无 | 以逗号分隔的条件,取自上表。Webhook 需要此项、--events 或两者兼有。 |
--slack URL | string | 一个渠道标志 | 无 | 通过 hooks.slack.com 上的传入 Webhook URL 发布到 Slack,或用 - 从 stdin 的一行读取。 |
--teams URL | string | 一个渠道标志 | 无 | 通过 Workflows Webhook 的 URL(触发器“收到 Teams Webhook 请求时”)发布到 Teams,或用 - 从 stdin 读取。Office 365 连接器 URL 已停用,会被拒绝。 |
--pagerduty KEY | string | 一个渠道标志 | 无 | 使用 Events API v2 路由密钥触发并解决 PagerDuty 事件,或用 - 从 stdin 读取。 |
--telegram TOKEN | string | 一个渠道标志 | 无 | 使用机器人令牌发布到 Telegram,或用 - 从 stdin 读取。需要 --telegram-chat。 |
--telegram-chat CHAT_ID | string | 配合 --telegram | 无 | 要发布到的聊天:其数字 ID,例如 -1001234567890,或 @channelname。 |
--events TYPES | string | 否 | 无 | 仅限 webhook。同时 POST 这些原始项目事件:1 到 32 个逗号分隔的精确类型,如 screen.online,或以 .* 结尾的前缀,如 screen.*。 |
--tag TAG | string | 否 | 每个屏幕 | 仅限带有此标签的屏幕。重复该标志或用逗号分隔,最多 16 个标签。 |
--hold MINUTES | integer | 否 | 10 | 条件必须持续多长时间才会发出提醒,0 到 1440。crashing 不适用保持时间。 |
--all-tags TAG | string | 否 | 无 | 仅带有所列全部标签的屏幕。重复该标志或用逗号分隔。 |
--any-tag TAG | string | 否 | 无 | 仅带有至少一个所列标签的屏幕,如 --tag。重复该标志或用逗号分隔。 |
--audience FILE | string | 否 | 每个屏幕 | 作为 JSON 格式活动受众规则的屏幕:内联、文件,或用 - 表示标准输入。不能与标签选项一起使用。 |
--min-severity LEVEL | string | 否 | 无 | info、warning 或 error:低于该级别的已开启提醒不发送。 |
--severity CONDITION=LEVEL | string | 否 | 默认值 | 设置此通知中某个条件的严重级别。重复该标志。 |
--active-hours SPEC | string | 否 | 始终 | 仅在此每周窗口内发送已开启的提醒,DAYS HH:MM-HH:MM 例如 "Mon-Fri 08:00-22:00"。最多重复 16 次。需要 --timezone。 |
--timezone ZONE | string | 配合 --active-hours | 无 | 读取时段所用的 IANA 时区,例如 America/Los_Angeles。 |
--outside-hours MODE | string | 否 | hold | hold 等待下一个窗口;drop 跳过该提醒。 |
--reach-drop-screens N | integer | 否 | 任何减少 | 仅与 reach_dropped 同用:仅当活动至少失去 N 个屏幕(1 或更多)时才发送提醒。 |
--reach-drop-percent P | integer | 否 | 任何减少 | 仅与 reach_dropped 同用:同时要求活动发布时所触达的屏幕至少减少 P% (1 到 100)。 |
--description TEXT | string | 否 | 无 | 最多 200 个字符。 |
--stale-after DURATION | string | 否 | 因类型而异 | 数据源无法刷新时,卡片保留最后一次正常数据的时长,范围 1m 到 7d,且至少为 --refresh 的两倍;none 会保留到下次刷新。之后数据在所有屏幕上过期。momentus 默认为 30m。 |
--disabled | boolean | 否 | 关闭 | 创建时禁用。在 notifications update --enable 之前不会发送任何内容。 |
screenrig notifications create --email owner --conditions screen_offline,display_disconnected --tag Lobbyscreenrig notifications create --webhook https://hooks.example.com/screenrig --conditions screen_offline,crashingscreenrig notifications create --slack - --conditions screen_offline,crashing < slack-url.txt信封就是该通知。webhook 通知的信封在 data.secret(whsec_…)中携带其签名密钥,并附有警告 webhook_secret_shown_once。请立即将密钥存入接收方的密钥库。只有 notifications rotate-secret 会再次返回该密钥,CLI 也不会将其写入配置、操作日志或写恢复状态。中断或不明确的创建之后,24 小时内重新运行相同命令:它会重用保存的幂等键,服务器返回相同答案,包括密钥。提醒从通知创建后的第一个事件开始。
notifications list#
列出该项目的通知,绝不包含其密钥。
notifications listscreenrig notifications list低于管理权限时,webhook 的 url 为空,url_redacted 为 true。
notifications show#
检查通知及其交付健康状况。
notifications show <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 通知 ID,ntf_(除 Webhook 外的任何渠道)或 whk_(Webhook)。 |
screenrig notifications show ntf_01EXAMPLENOTICE00000status 为 active、failing(自 failing_since 起没有任何交付成功时)或 disabled。连续失败 72 小时后,通知会因 disabled_reason: delivery_failures 被禁用,事件日志会记录 notification.disabled。设置了暂停提醒时会出现 snoozed_until。last_success_at 和 last_failure_at 报告最新结果。
notifications update#
更改通知的收件人、URL、目标、条件、屏幕、等待时间、暂停或启用状态。
notifications update <id> [--email RECIPIENTS | --url URL | --destination VALUE] [--telegram-chat CHAT_ID]
[--conditions LIST | --clear-conditions]
[--events TYPES | --clear-events] [--tag TAG... | --any-tag TAG... | --all-tags TAG... | --audience FILE | --all-screens]
[--hold MINUTES] [--min-severity LEVEL | --clear-min-severity]
[--severity CONDITION=LEVEL]... [--clear-severity]
[--active-hours SPEC]... [--timezone ZONE] [--outside-hours hold|drop] [--clear-active-hours]
[--reach-drop-screens N] [--reach-drop-percent P] [--clear-reach-drop]
[--description TEXT | --clear-description] [--enable | --disable]
[--snooze WHEN] [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 通知 ID,ntf_(除 Webhook 外的任何渠道)或 whk_(Webhook)。 |
--email RECIPIENTS | string | 至少有一处更改 | 未更改 | 邮件通知:替换收件人。 |
--url URL | string | 至少有一处更改 | 未更改 | Webhook 通知:替换 URL,校验方式与 create 相同。 |
--destination VALUE | string | 至少有一处更改 | 未更改 | Slack、Teams、PagerDuty 和 Telegram 通知:替换凭据,检查方式与 create 相同。- 从 stdin 的一行读取。 |
--telegram-chat CHAT_ID | string | 至少有一处更改 | 未更改 | Telegram 通知:替换聊天。 |
--conditions LIST | string | 至少有一处更改 | 未更改 | 替换条件。 |
--clear-conditions | boolean | 至少有一处更改 | 关闭 | 移除所有条件。此后 webhook 需要 --events。 |
--events TYPES | string | 至少有一处更改 | 未更改 | Webhook 通知:替换原始项目事件。 |
--clear-events | boolean | 至少有一处更改 | 关闭 | Webhook 通知:停止 POST 原始项目事件。此时它需要条件。 |
--tag TAG | string | 至少有一处更改 | 未更改 | 替换屏幕标签。 |
--all-screens | boolean | 至少有一处更改 | 关闭 | 移除屏幕标签和受众;该通知覆盖每个屏幕。 |
--hold MINUTES | integer | 至少有一处更改 | 未更改 | 0 到 1440。 |
--all-tags TAG | string | 至少有一处更改 | 未更改 | 用带有所列全部标签的屏幕替换屏幕。 |
--any-tag TAG | string | 至少有一处更改 | 未更改 | 用带有至少一个所列标签的屏幕替换屏幕,如 --tag。 |
--audience FILE | string | 至少有一处更改 | 未更改 | 用 JSON 格式的活动受众规则替换屏幕:内联、文件,或用 - 表示标准输入。 |
--min-severity LEVEL | string | 至少有一处更改 | 未更改 | info、warning 或 error。 |
--clear-min-severity | boolean | 至少有一处更改 | 关闭 | 移除严重级别过滤。 |
--severity CONDITION=LEVEL | string | 至少有一处更改 | 未更改 | 用这些替换严重级别覆盖。重复该标志。 |
--clear-severity | boolean | 至少有一处更改 | 关闭 | 移除所有严重级别覆盖。 |
--active-hours SPEC | string | 至少有一处更改 | 未更改 | 用这些替换窗口。最多重复 16 次。--timezone 默认为该通知已有的时区。 |
--timezone ZONE | string | 至少有一处更改 | 未更改 | 读取时段所用的 IANA 时区。单独使用时,保留当前窗口。 |
--outside-hours MODE | string | 至少有一处更改 | 未更改 | hold 或 drop。单独使用时,保留当前窗口。 |
--clear-active-hours | boolean | 至少有一处更改 | 关闭 | 移除活动时段。为其保留的提醒会立即重新判定。 |
--reach-drop-screens N | integer | 至少有一处更改 | 未更改 | 替换 reach_dropped 提醒要求活动至少失去的屏幕数量。 |
--reach-drop-percent P | integer | 至少有一处更改 | 未更改 | 替换活动至少必须失去的已发布触达百分比。 |
--clear-reach-drop | boolean | 至少有一处更改 | 关闭 | 移除阈值,使任何减少都会发出提醒。仅在同时移除时,才将 reach_dropped 从 --conditions 中去掉。 |
--description TEXT | string | 至少有一处更改 | 未更改 | 最多 200 个字符。 |
--clear-description | boolean | 至少有一处更改 | 关闭 | 移除描述。 |
--enable | boolean | 至少有一处更改 | 关闭 | 清除失败状态,并从记录该更改的事件开始;禁用期间产生的任何内容都不会发送。 |
--disable | boolean | 至少有一处更改 | 关闭 | 停止发送提醒;待处理的提醒失败,错误为 webhook_disabled。 |
--snooze WHEN | string | 至少有一处更改 | 未更改 | 在此之前不发送任何内容:时长,如 30m、1h 或 2d(不足 30 天),带秒和偏移的 RFC 3339 时间点,或用 off 结束暂停提醒。期间到期的提醒会被跳过,不会稍后补发。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。 |
screenrig notifications update ntf_01EXAMPLENOTICE00000 --snooze 2hupdate 只会更改你传递的字段。渠道从不改变。
notifications delete#
删除通知。其待处理的提醒失败,错误为 webhook_deleted。
notifications delete <id> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 通知 ID,ntf_(除 Webhook 外的任何渠道)或 whk_(Webhook)。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。 |
screenrig notifications delete ntf_01EXAMPLENOTICE00000notifications rotate-secret#
替换 Webhook 通知的签名密钥,并只返回一次新密钥。其他渠道没有密钥。
notifications rotate-secret <id> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 通知 ID,ntf_(除 Webhook 外的任何渠道)或 whk_(Webhook)。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。 |
screenrig notifications rotate-secret whk_01EXAMPLEWEBHOOK00000信封在 data.secret 中携带新密钥,并附带警告 webhook_secret_shown_once;请立即存储。之前的密钥停止签名,但最多允许一个已在进行中的尝试仍可使用旧密钥签名,因此短时间内接受两者。中断或模糊的轮换后,24 小时内重新运行相同命令以恢复相同密钥。
notifications test#
仅向此通知发送一封测试邮件、一个签名的测试 POST 或一条聊天消息。
notifications test <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 通知 ID,ntf_(除 Webhook 外的任何渠道)或 whk_(Webhook)。 |
screenrig notifications test ntf_01EXAMPLENOTICE00000信封是排队的交付。它只尝试一次,不重试;对已禁用或已暂停提醒的通知同样有效,并且从不改变通知的失败状态。每个组织每分钟最多 20 次测试交付;超出则为 rate_limited(退出码 7)。使用 notifications deliveries 读取结果。
PagerDuty 测试会触发一个键为 screenrig:test:DELIVERY_ID 的信息事件并立即解决,因此不会留下未解决的事件。
notifications resubscribe#
让已取消订阅某个通知邮件的人重新收到邮件。
notifications resubscribe <id> --user USER_ID| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 电子邮件通知的 ntf_ ID。 |
--user USER_ID | string | 是 | 无 | 该人的用户 ID,即 notifications show 在 unsubscribed 下列出的那个。 |
screenrig notifications resubscribe ntf_01EXAMPLENOTICE00000 --user usr_01EXAMPLEPERSON0000信封就是该通知。未取消订阅的人不会带来任何变化。重新订阅某人会提高修订号并追加 notification.updated。其他渠道或项目的通知为 not_found(退出码 4)。
notifications deliveries#
读取通知的交付日志,最新优先。
notifications deliveries <id> [--before CURSOR] [--limit N]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 通知 ID,ntf_(除 Webhook 外的任何渠道)或 whk_(Webhook)。 |
--before CURSOR | string | 否 | 最新事件 | 上一页的 next_cursor(whc1_…)。 |
--limit N | integer | 否 | 50 | 每页行数,1 到 200。 |
screenrig notifications deliveries ntf_01EXAMPLENOTICE00000 --limit 20每一行代表一个事件,或一个屏幕上某个条件的一条提醒:event_type、state(pending、succeeded、failed 或 skipped)、attempts、last_status,以及一个固定的 last_error 类别,如 http_status、timeout、connection_failed、tls_failed、dns_failed、url_rejected、email_failed 或 email_rejected。屏幕状态提醒还包含 condition、phase(opened 或 resolved)、screen_id、screen_name 和 since,邮件提醒还包含 emailed,即触达的人数。无需发送的提醒为 skipped,其原因记录在 last_error:condition_cleared(屏幕在保持时间结束前已离开该状态)、not_opened(没有已发出的提醒需要解决)、snoozed(该通知处于暂停状态)、acknowledged(有人在保持时间内确认或暂缓了该屏幕的警报)、muted(有静音覆盖该屏幕)、no_recipients(没有任何收件人是拥有已验证地址且未退订的项目成员)、grouped(该屏幕与其他屏幕一起进入了该条件,由另一行的一条提醒统一说明)或 no_longer_judged(loop_stalled、glass_blank 或 glass_frozen 条件因 screenRIG 不再判定该屏幕而结束,因此未通知恢复)。为一组屏幕发出统一提醒的那条提醒带有 group(id、attribute、value 和 count),组内其他每块屏幕带有 group_id;--human 会在 GROUP 列中显示这两者。行中不会包含接收方的响应。next_cursor 是日志末尾的 null。失败的尝试会进行重试,采用退避策略,从 30 秒翻倍至 1 小时,持续 24 小时后,该行会被 failed。
验证交付
屏幕状态提醒的主体是 JSON:type(alert.opened 或 alert.resolved)、id(交付 ID)、notification_id、project_id、condition、screen(id 和 name)、since(条件开始的时刻)、at(条件保持足够长时间或已清除的时刻)和 event_id。来自 --events 的原始事件与 events list 返回的 JSON 对象相同。头部为 ScreenRig-Webhook-Id(通知 ID)、ScreenRig-Event-Id(重试间保持不变:提醒为交付 ID,事件为事件游标)和 ScreenRig-Signature: t=<unix seconds>,v1=<hex>,其中 v1 是对 "<t>.<raw body>" 计算的 HMAC-SHA256,以密钥字符串为密钥。请在解析 JSON 之前基于原始字节计算,以恒定时间比较,拒绝过期的 t,并基于 ScreenRig-Event-Id 去重,因为交付至少一次且无序。请在 10 秒内返回 2xx;不跟随重定向。
import { createHmac, timingSafeEqual } from "node:crypto";
// rawBody: the request body bytes (Buffer) exactly as received.
function verify(rawBody, signatureHeader, secret, toleranceSeconds = 300) {
if (typeof signatureHeader !== "string" || !signatureHeader) return false;
const parts = Object.fromEntries(signatureHeader.split(",").map((part) => part.split("=", 2)));
const t = Number(parts.t);
if (!Number.isInteger(t) || Math.abs(Date.now() / 1000 - t) > toleranceSeconds) return false;
const expected = createHmac("sha256", secret).update(`${t}.`).update(rawBody).digest();
const given = Buffer.from(parts.v1 ?? "", "hex");
return given.length === expected.length && timingSafeEqual(given, expected);
}报告
reports show KIND 生成报告(fleet_health、uptime、publishing、alerts、alert_log 或 proof_of_play),加上 --format csv、xlsx 或 pdf 以及 --output FILE 即写入文件;reports subscriptions 按排程通过电子邮件向项目成员发送报告;project export DIR 写入项目数据及各部分的结果。 报告与导出对每一项都有说明。
审计日志
audit list|show|head|verify|export 读取项目的审计日志:audit list 按操作者、来源、资源、操作和字段搜索配置变更,audit show 显示一个条目及每个已更改字段的变更前和变更后,audit head 显示需保存为锚点的链头,audit verify 重新计算链(可选择对照锚点),在无法验证时以退出码 13 结束,audit export 将筛选后的日志写成 CSV、XLSX 或 PDF 文件。审计日志说明了每一项。
警报
警报是某个屏幕上持续存在的一个问题。当屏幕进入除 crashing 以外的通知条件时,无论是否有通知在监视,警报都会打开,条件结束时则解决。每个屏幕的每个条件最多有一条未解决的警报,崩溃激增是提醒,绝不是警报。alerts list 显示当前未解决的内容。
未解决的警报会一直需要关注,直到有人确认或暂缓它,或有静音覆盖其屏幕。确认表示已有人在处理:警报保持打开,记录是谁在何时确认的,并且在解决之前无需关注。暂缓是确认到最多 30 天后的某个时间,到那时如果警报仍未解决,就再次需要关注。之后的确认或暂缓会替换之前的。警报处于已确认或已暂缓状态时,通知中仍在保持时间内、与该警报有关的提醒会被跳过。
静音用于维护:它指定屏幕、标签或两者,并在最多 30 天后的某个时间结束。只要屏幕 ID 在列表中,或带有列表中的标签,静音就覆盖该屏幕;因此之后才加上标签的屏幕也会被覆盖,去掉标签的屏幕则不再被覆盖。被静音屏幕的警报仍会打开和解决,并标记为 muted,但从不需要关注,所有通知都会跳过它们的提醒。一个组织跨其所有项目最多有 50 条当前有效的静音。
alerts list 中的 counts.attention 是控制台在“警报”旁边显示的数字。打开、解决和确认警报会向项目事件日志追加 screen.alert_opened、screen.alert_resolved 和 screen.alert_acknowledged,创建和结束静音会追加 alert_mute.created 和 alert_mute.deleted。与所有 screen.* 事件一样,它们在监听流上免费。已解决的警报会在套餐的事件保留期内继续列出。读取警报和静音需要只读访问;确认、暂缓、静音和取消静音需要管理访问。
| 问题代码 | 退出 | 含义 |
|---|---|---|
alert_not_open | 5 | 该警报已解决,因此没有可确认或暂缓的内容。请运行 alerts list,改用未解决的警报。 |
alert_mute_limit_reached | 5 | 组织已有 50 条当前有效的静音。请用 alerts unmute 结束一条,或用一条按标签设置的静音覆盖更多屏幕。 |
invalid_request | 8 | --until 的时间点超过 30 天之后。未做任何更改。 |
not_found | 4 | 项目中没有使用此 ID 的警报或静音。已解决的警报在套餐的事件保留期之后消失,静音在结束后消失。 |
alerts list#
列出此项目的警报,未解决的在前。
alerts list [--state open|resolved|all] [--screen-id ID] [--before CURSOR] [--limit N]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--state STATE | string | 否 | open | open、resolved 或 all。 |
--screen-id ID | string | 否 | 每个屏幕 | 仅此屏幕的警报。 |
--before CURSOR | string | 否 | 第一页 | 上一页的 next_cursor。 |
--limit N | integer | 否 | 100 | 每页行数,1 到 200。 |
screenrig alerts listscreenrig alerts list --state all --screen-id scr_01EXAMPLESCREEN00000000每一行是一条警报:id(alr_…)、screen_id、screen_name、condition、state(open 或 resolved)、since(条件开始的时间)、解决后有 resolved_at、确认后有 acknowledged_at 和 acknowledged_by(kind、id 和 name 为确认者,即人员或智能体)、暂缓期间有 snoozed_until,以及 muted 和 attention。未解决的警报排在前面,最新的在先。counts 包含整个项目的 open 和 attention,与页面和筛选条件无关,next_cursor 在末尾为 null。
alerts show#
显示一条警报。
alerts show <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | alr_ 警报 ID。 |
screenrig alerts show alr_01EXAMPLEALERT000000信封即该警报,格式与 alerts list 的一行相同。
alerts ack#
确认一条未解决的警报:已有人在处理。
alerts ack <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | alr_ 警报 ID。 |
screenrig alerts ack alr_01EXAMPLEALERT000000警报保持打开,在解决之前无需关注;acknowledged_by 是确认的人员或智能体,acknowledged_at 是时间。通知中仍在保持时间内的提醒会被跳过。再次确认会替换之前的确认或暂缓。已解决的警报会返回 alert_not_open(退出码 5)。信封即该警报,事件日志会记录 screen.alert_acknowledged。
alerts snooze#
将未解决的警报确认到某个时间,使其到那时再次需要关注。
alerts snooze <id> (--for DURATION | --until TIME)| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | alr_ 警报 ID。 |
--for DURATION | duration | --for、--until 之一 | 无 | 从现在起暂缓多久:时长,如 30m、4h 或 2d,最长 29d23h59m。 |
--until TIME | string | --for、--until 之一 | 无 | 暂缓何时结束:带秒和偏移的 RFC 3339 时间点,如 2026-11-01T09:00:00-07:00,最多 30 天后。 |
screenrig alerts snooze alr_01EXAMPLEALERT000000 --for 4hsnoozed_until 是暂缓结束的时间。在此之前,警报无需关注,通知中仍在保持时间内的提醒会被跳过,与 alerts ack 相同;如果到那时警报仍未解决,则再次需要关注。已解决的警报会返回 alert_not_open(退出码 5)。
alerts mute#
为维护让屏幕静音。
alerts mute [--screen-id ID]... [--tag TAG]... (--for DURATION | --until TIME) [--note TEXT]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--screen-id ID | string | --screen-id、--tag 中至少一个 | 无 | 一个 scr_ 屏幕 ID。重复输入,或用逗号分隔列出;最多 100 个。 |
--tag TAG | string | --screen-id、--tag 中至少一个 | 无 | 带有此标签的每个屏幕。重复输入,或用逗号分隔标签;最多 16 个。 |
--for DURATION | duration | --for、--until 之一 | 无 | 从现在起静音持续多久:时长,如 30m、4h 或 2d,最长 29d23h59m。 |
--until TIME | string | --for、--until 之一 | 无 | 静音何时结束:带秒和偏移的 RFC 3339 时间点,如 2026-11-01T09:00:00-07:00,最多 30 天后。 |
--note TEXT | string | 否 | 无 | 让屏幕静音的原因,供查看该静音的人阅读;最多 200 个字符。 |
screenrig alerts mute --tag Lobby --for 2h --note "Rewiring the lobby displays"信封即该静音:id(amt_…)、screen_ids、tags、until、note、created_by 和 created_at。所有被覆盖屏幕的警报会立即显示 muted,包括已经打开的警报。一个组织跨其所有项目最多有 50 条当前有效的静音;超出则返回 alert_mute_limit_reached(退出码 5),已结束的静音不再计数。如果静音请求被中断或结果不明,请先查看 alerts mutes:在 24 小时内用 --until 重新运行相同命令会返回同一条静音,而用 --for 重新运行则从新的时间起算并创建另一条。
alerts mutes#
列出尚未结束的静音,最先结束的排在最前。
alerts mutesscreenrig alerts mutes每一行都是 alerts mute 输出的一条静音。
alerts unmute#
立即结束一条静音。
alerts unmute <mute-id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<mute-id> | string | 是 | 无 | amt_ 静音 ID。 |
screenrig alerts unmute amt_01EXAMPLEMUTE0000000这些屏幕上未解决的警报会再次需要关注,之后的提醒也不再因静音而被跳过。已结束的静音会返回 not_found(退出码 4)。事件日志会记录 alert_mute.deleted。
Webhooks
Webhook 以签名 POST 的形式,将本项目自身的事件发送到你运行的 HTTPS 端点,因此匹配的事件可以唤醒智能体、机器人或你自己的服务。每个匹配的事件以 events list 返回的同一 JSON 对象的形式到达。Webhook 是原始形态的通知:它计入组织的 50 条通知上限,notifications list 会显示它。新建请使用 notifications,它还会发送邮件和屏幕状态提醒。
每次投递尝试都像计费的 listen-stream 事件一样计费:每月 10 000 次 API 和 listen-stream 免费额度后每次消耗 1 额度。在 listen stream 免费的事件在这里同样免费:screen.*、runtime.*、application.event、playback.page_failed 和 agent.command。如果尝试在未发送任何内容前被拒绝,则不计费。
webhooks create --url URL --event-types TYPES [--description TEXT] [--disabled]
webhooks list
webhooks show <id>
webhooks update <id> [--url URL] [--event-types TYPES] [--description TEXT | --clear-description]
[--enable | --disable] [--expect-rev REVISION]
webhooks delete <id> [--expect-rev REVISION]
webhooks rotate-secret <id> [--expect-rev REVISION]
webhooks test <id>
webhooks deliveries <id> [--before CURSOR] [--limit N]当组织已有 50 个通知时,webhooks create 返回 webhook_limit_reached(退出码 5),而 notifications create 返回 notification_limit_reached。URL 被拒绝时,两者都返回 webhook_url_rejected(退出码 8)。
设备组链接
车队链接是一个播放器 URL,你可以将其放入设备管理器,如 Google 管理控制台中的自助服务应用。每个打开它的设备都会成为此项目中的独立屏幕,无需配对码。每个组织跨其所有项目最多有 50 个车队链接。
每个新屏幕会继承链接的标签和播放列表,并从设备获取标签:优先管理员资产 ID,其次为位置,否则使用下一个默认标签。设备在重新加载和重启时保持其唯一屏幕。恢复出厂或重装后,设备如报告序列号或 DUID 且该屏幕为本项目批量链接创建,则在旧密钥静默十分钟后恢复该屏幕,不会新建。screen show 为批量链接创建的屏幕返回 fleet_link_id,--human 打印 Created by fleet link: flk_…。删除链接后 id 仍保留。
URL https://play.screenrig.ai/player/#fleet=srfl_… 是创建屏幕的凭据。仅提供给设备管理员。密钥在 URL 片段中,浏览器不会发送给服务器。只读凭据接收空的 data.url 和 url_redacted: true,随后人工输出显示 URL: withheld from a Read only credential。否则人工输出在 Sensitive fleet link URL 标签下打印 URL,fleet-links list --human 不打印。CLI 在打印前检查返回 URL:HTTPS、/player/ 路径,密钥仅在 #fleet=。检查失败则不打印 URL,显示警告 fleet_link_url_withheld,并将车队链接答案排除在操作日志外。
| 问题代码 | 退出 | 含义 |
|---|---|---|
fleet_link_limit_reached | 5 | 组织已有 50 个车队链接。未创建任何内容。请先删除一个。 |
invalid_request | 8 | 字段被拒绝,例如 --playlist-id,该字段在此项目中未命名播放列表。error.next 对于未知播放列表为 playlist list。 |
not_found | 4 | 项目中无此 ID 的车队链接。 |
revision_conflict | 6 | --expect-rev 版本已过时。运行 fleet-links show,然后重试。 |
fleet-links create#
创建车队链接并获取其播放器 URL。
fleet-links create --name NAME [--tag TAG]... [--playlist-id ID] [--max-screens N] [--disabled]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--name NAME | string | 是 | 无 | 链接名称,1至80字符,无控制字符。 |
--tag TAG | string | 否 | 无标签 | 每个新屏幕的标签,1 到 32 个字母或数字。重复或逗号分隔标签;最多 16 个。 |
--playlist-id ID | string | 否 | 无 | 分配给每个新屏幕的 pl_ 播放列表。 |
--max-screens N | integer | 否 | 无限制 | 链接最多创建的屏幕数,1至10000。 |
--disabled | boolean | 否 | 关闭 | 创建时禁用。直到 fleet-links update --enable 之前不创建任何屏幕。 |
screenrig fleet-links create --name "Lobby displays" --tag Lobby --tag Floor2 --playlist-id pl_01EXAMPLEPLAYLIST000000信封是舰队链接,包含其播放器 URL 于 data.url。请将该 URL 放入设备管理器。中断或模糊创建后,24 小时内重新运行相同命令:它会重用保存的幂等键,服务器返回相同链接而非创建新链接。
fleet-links list#
列出该项目的车队链接,最旧优先。
fleet-links listscreenrig fleet-links list只读凭据接收每个 data.items[].url 为空,带 url_redacted: true。--human 打印 ID、LABEL、ENABLED、SCREENS、TAGS 和 LAST_USED,且从不打印 URL。SCREENS 是链接创建的屏幕数,或创建数/最大数带 --max-screens;恢复不计数。
fleet-links show#
检查车队链接并获取其播放器 URL。
fleet-links show <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | flk_ 车队链接 ID。 |
screenrig fleet-links show flk_01EXAMPLELINK0000screens_created 统计该链接已创建的屏幕数量,last_used_at 是其最近一次创建或恢复屏幕的时间。
fleet-links update#
更改从现在起 fleet 链接为其创建的屏幕提供的内容。
fleet-links update <id> [--name NAME] [--enable | --disable] [--tag TAG]... [--clear-tags]
[--playlist-id ID | --clear-playlist] [--max-screens N | --clear-max-screens]
[--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | flk_ 车队链接 ID。 |
--name NAME | string | 至少有一处更改 | 未更改 | 1 到 80 个字符。 |
--enable | boolean | 至少有一处更改 | 关闭 | 链接再次创建和恢复屏幕。 |
--disable | boolean | 至少有一处更改 | 关闭 | 链接不创建或恢复屏幕;打开设备显示其配对码。 |
--tag TAG | string | 至少有一处更改 | 未更改 | 替换整个标签集。重复操作或用逗号分隔标签;最多16个。 |
--clear-tags | boolean | 至少有一处更改 | 关闭 | 新屏幕无标签。 |
--playlist-id ID | string | 至少有一处更改 | 未更改 | 新屏幕的 pl_ 播放列表。 |
--clear-playlist | boolean | 至少有一处更改 | 关闭 | 新屏幕无播放列表。 |
--max-screens N | integer | 至少有一处更改 | 未更改 | 链接最多创建的屏幕数,1至10000。 |
--clear-max-screens | boolean | 至少有一处更改 | 关闭 | 移除限制。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。 |
screenrig fleet-links update flk_01EXAMPLELINK0000 --playlist-id pl_01EXAMPLEPLAYLIST000000update 只会更改您传递的字段,并且仅对之后通过该链接创建的屏幕生效。已创建的屏幕会保留其标签、播放列表和标签名。URL 不变;如需替换请使用 rotate。
fleet-links rotate#
替换车队链接的URL并接收新链接。
fleet-links rotate <id> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | flk_ 车队链接 ID。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。 |
screenrig fleet-links rotate flk_01EXAMPLELINK0000信封在 data.url 中携带新 URL。旧 URL 立即失效:打开它的设备会显示其配对码。已创建链接的屏幕继续播放,因为配对的播放器不会再次展示该链接。请在设备管理器中更新新 URL。
fleet-links delete#
删除车队链接。其 URL 立即停止工作,且其创建的屏幕保持不变。
fleet-links delete <id> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | flk_ 车队链接 ID。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。 |
screenrig fleet-links delete flk_01EXAMPLELINK0000通过链接创建的屏幕保留其播放列表和标签。
CAP 警报触发器
触发器允许紧急通知系统(如 Everbridge、Rave、Alertus 或 IPAWS 中继)使用 CAP 1.2 警报接管屏幕。每个触发器有自己的 URL、用户名和密码,输入发送系统作为其 CAP HTTP POST 目标,使用 HTTP 基本认证。组织跨其所有项目最多 20 个触发器。
触发器分两种。此处介绍的 CAP 触发器接收应急系统的告警。叠加层触发器会显示任意发送方(例如 Home Assistant、传感器中枢或告警工具)推送的内容,形式是正在播放内容之上的横条或接管;triggers create --kind overlay 创建一个,triggers update、triggers deliveries、triggers clear 和 triggers rotate-secret 对两种都适用。
触发器针对标签(每警报到达时解析)或最多 500 个屏幕 ID。每个警报成为触发器自有播放列表的接管:全屏卡片,颜色对应严重级别,显示事件、标题、描述和指令。演习添加 EXERCISE 横幅。接管持续至警报 <expires>,否则为触发器 --for 默认(1 分钟至 7 天,默认 1 小时),且不超过 7 天。更新重绘卡片,取消或全部清除将屏幕恢复至之前播放内容。新警报替换当前显示。测试、系统、草稿消息,确认和错误消息及过期警报被忽略,重复发送者和标识为重复。屏幕需默认播放列表才能被接管;其他屏幕跳过。
密码srtg_…仅由triggers create和triggers rotate-secret显示,附带警告trigger_password_shown_once。CLI 不在其配置、操作日志和恢复状态中保存密码。URL 和用户名不保密。
| 问题代码 | 退出 | 含义 |
|---|---|---|
trigger_limit_reached | 5 | 组织已有 20 个触发器。未创建任何内容。请先删除一个。 |
resource_conflict | 5 | triggers test 或 triggers delete 在警报激活时。next 是 triggers clear。 |
not_found | 4 | 项目中无此 ID 的触发器。 |
revision_conflict | 6 | --expect-rev 版本已过时。运行 triggers show,然后重试。 |
triggers create#
创建触发器并获取其 URL、用户名和密码。
triggers create --name NAME [--kind cap|overlay] (--tag TAG | --screen-id ID...) [--for DURATION] [--pull FILE]
[--show bar|takeover] [--edge bottom|top] [--style FILE] [--map FILE] [--signing]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--name NAME | string | 是 | 无 | 触发器名称,1 到 80 个字符,不含控制字符。 |
--kind KIND | cap 或 overlay | 否 | cap | cap 接收应急系统的 CAP 1.2 告警。overlay 接收任意发送方的几句话,需要 --show。 |
--tag TAG | string | --tag 或 --screen-id 之一 | 无 | 每个警报到达时带此标签的活动屏幕。 |
--screen-id ID | string | --tag 或 --screen-id 之一 | 无 | 一个 scr_ 屏幕 ID。重复输入,或用逗号分隔列出;最多 500 个。 |
--for DURATION | duration | 否 | 1h(叠加层为 10m) | 没有 <expires> 的告警或没有 duration 的叠加层推送保持屏幕的时长,例如 30m、2h 或 1d;CAP 触发器为 1 分钟到 7 天,叠加层触发器为 10 秒到 7 天。 |
--pull FILE | 路径 | 否 | 无 | 一个 JSON 对象,来自文件或 - 的标准输入,还包含平台读取 CAP 警报源的触发器。其成员是 cap-alert 卡的参数,见下文。 |
--show SHOW | bar 或 takeover | 配合 --kind overlay | 无 | bar 在目标屏幕正在播放的内容之上绘制一条横条。takeover 全屏播放告警。 |
--edge EDGE | bottom 或 top | 否 | bottom | 横条所在的边。仅与 --show bar 一起使用。 |
--style FILE | 路径 | 否 | 无 | 一个 JSON 对象,来自文件或表示标准输入的 -,描述文本卡片的样式:theme、accent、background、backgroundColor、textColor 和 align。 |
--map FILE | 路径 | 否 | 无 | 一个 JSON 模板,来自文件或表示标准输入的 -,根据发送方发送的正文构建叠加层推送;参见叠加层触发器。 |
--signing | 标志 | 否 | 关闭 | 还要求每次推送带有 ScreenRig-Signature 标头,并只显示一次签名密钥。 |
screenrig triggers create --name "Campus alerts" --tag Campus
screenrig triggers create --name "Campus alerts" --tag Campus --pull pull.json
screenrig triggers create --name "Lobby sensors" --kind overlay --show bar --tag Lobby
screenrig triggers create --name "Doorbell" --kind overlay --show takeover --tag Lobby --for 30s信封是带有 data.url(https://api.screenrig.ai/api/triggers/<id>/cap,叠加层触发器为 .../overlay)、data.username(触发器 ID)和 data.password 的触发器。请立即把它们填入发送系统;叠加层触发器的发送方需要 URL 和密码(Authorization: Bearer)。使用 --signing 时,信封还包含只显示一次的 data.signing_secret,并附带警告 trigger_signing_secret_shown_once。创建被中断或结果不明时,请在 24 小时内再次运行相同的命令:它会重用已保存的幂等键,服务器返回同一个触发器和同一个密码,而不会再创建一个。
--pull 添加了平台读取的来源,除了已发布的 URL,后者仍然有效。该对象包含 sources(最多 5 个 CAP 1.0 到 1.2 警报或 ATOM/RSS 索引的 http 或 https URL)、publicAlerts、location(name、latitude、longitude 和 geocodes 作为 [{name, value}])、minSeverity、maxSeverity、minUrgency、minCertainty、events、excludeEvents、senders、statuses、scopes、languages 和 areaUnknown;feeds get cap 接受与标志相同的筛选条件。除非提供 sources,否则必须有 location,且没有 sources 时会读取覆盖 location 的公共源。每个来源每分钟抓取一次。最严重的匹配警报会像已发布的一样接管屏幕,当来源没有警报时,拉取的警报结束;过期或失败的来源不会结束警报。例如 {"location": {"latitude": 49.25, "longitude": -123}, "minSeverity": "moderate"}。
triggers list#
列出该项目的触发器及其最新警报,最旧优先。
triggers listscreenrig triggers list--human 输出 ID、KIND、LABEL、TARGET、ALERT 和 LAST_RECEIVED;对于叠加层触发器,ALERT 说明它绘制什么以及保留了多少条告警。列表从不包含密码或签名密钥。
triggers show#
检查触发器及其最新警报。
triggers show <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | trg_ 触发器 ID。 |
screenrig triggers show trg_01EXAMPLETRIGGER00data.alert 是最新的告警:它的 CAP 字段、state active 或 ended(带 ended_reason cancelled、all_clear、cleared 或 expired)、until,以及带 targeted、taken_over、cleared、skipped、failed 和 pending 的 screens。pending 在屏幕仍在写入时为 true,失败的屏幕会重试。screen show 将告警报告为触发器播放列表的接管。对于叠加层触发器,data.overlay 包含 show、edge、enabled、signing、card_id、alerts(有效告警,最新的在前;第一条是正在显示的)、带 targeted、holding、taken_over、removed、edge_taken、skipped 和 failed 的 screens,以及 pending。
triggers test#
在触发屏幕上显示 60 秒运动提醒。
triggers test <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | trg_ 触发器 ID。 |
screenrig triggers test trg_01EXAMPLETRIGGER00信封就是回执:data.outcome shown 和 data.alert。答复在所有屏幕写入完成之前返回;triggers show 报告计数。叠加层触发器会显示告警 screenrig-test(标签 Test,标题 Test overlay)60 秒,回执与一次推送得到的相同(data.alert_id、data.until、data.active)。两种触发器在有告警显示时都会拒绝测试。
triggers update#
更改触发器,而不更改其 URL 或密钥。
triggers update <id> [--name NAME] [--tag TAG | --screen-id ID...] [--for DURATION] [--pull FILE | --no-pull]
[--edge bottom|top] [--style FILE | --clear-style] [--map FILE | --clear-map] [--enable | --disable]
[--signing | --no-signing] [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | trg_ 触发器 ID。 |
--name NAME | string | 否 | 无 | 重命名触发器。 |
--tag TAG, --screen-id ID | string | 否 | 无 | 新的目标,与 triggers create 相同。 |
--for DURATION | duration | 否 | 无 | 没有自身结束时间的告警的新保持时长。 |
--pull FILE, --no-pull | 路径、标志 | 否 | 无 | CAP 触发器:替换其 CAP 来源,或停止读取。 |
--edge EDGE | bottom 或 top | 否 | 无 | 叠加层横条:将其移到这条边。 |
--style FILE, --clear-style | 路径、标志 | 否 | 无 | 叠加层触发器:替换整个样式,或将其移除。 |
--map FILE, --clear-map | 路径、标志 | 否 | 无 | 叠加层触发器:替换模板,或将其移除,使发送的对象就是推送。 |
--stale-after DURATION | string | 否 | 未更改 | 与 source create 相同;none 会移除该时长。 |
--enable, --disable | 标志 | 否 | 无 | 叠加层触发器:已停用的触发器对每次推送都返回错误密钥会得到的 404。 |
--signing, --no-signing | 标志 | 否 | 无 | 叠加层触发器:开启签名校验(签名密钥只显示一次),或将其关闭。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。 |
screenrig triggers update trg_01EXAMPLETRIGGER00 --tag Lobby
screenrig triggers update trg_01EXAMPLETRIGGER00 --edge top --style style.json
screenrig triggers update trg_01EXAMPLETRIGGER00 --map map.json --signing除 --expect-rev 外至少需要一个选项。横条会在新的目标屏幕和新的边上重新放置;接管触发器的新目标从下一条开始的告警起生效。已经签名的触发器在重复 --signing 时保留其签名密钥;triggers rotate-secret --signing 会替换它。更新被中断或结果不明时,请再次运行相同的命令:它会重用已保存的幂等键。
triggers deliveries#
读取叠加层触发器的推送日志:每次推送为何被显示、忽略或拒绝。
triggers deliveries <id> [--limit N]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | trg_ 触发器 ID。 |
--limit N | integer | 否 | 100 | 投递记录的条数,最新的在前;1 到 100。 |
screenrig triggers deliveries trg_01EXAMPLETRIGGER00 --limit 20data.items 保存最近七天的请求:at、outcome(shown、updated、unchanged、ended、ignored、refused、invalid 或 handshake)、被拒绝或无效请求的 reason(credentials、signature、disabled、body、mapping、field、rate_limited 或 internal)、detail(出错的成员或映射路径)、status、bytes、alert_id 和 request_id。日志从不保存正文、请求头或凭据。错误的密钥、无效的签名和已停用的触发器,都会向发送方返回同样的 404,因此要看是哪一种,请查看此日志。CAP 触发器没有投递记录。
triggers clear#
立即结束触发器警报。
triggers clear <id> [--alert-id ID]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | trg_ 触发器 ID。 |
--alert-id ID | string | 否 | 无 | 叠加层触发器:只结束这一条告警。不指定则结束所有告警。 |
screenrig triggers clear trg_01EXAMPLETRIGGER00
screenrig triggers clear trg_01EXAMPLETRIGGER00 --alert-id front-door告警以 ended_reason cleared 结束,其屏幕恢复为之前播放的内容。此后被其他接管替换的屏幕保持不变。没有有效告警时,不会有任何变化。对于叠加层触发器,解除一条未生效的告警不会有任何变化,最后一条告警结束时横条会收起,或接管的屏幕会交还。
triggers rotate-secret#
替换触发器密码。
triggers rotate-secret <id> [--signing] [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | trg_ 触发器 ID。 |
--signing | 标志 | 否 | 关闭 | 会签名的叠加层触发器:替换签名密钥而不是密码。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。 |
screenrig triggers rotate-secret trg_01EXAMPLETRIGGER00信封的 data.password 中包含新密码。旧密码立即失效,因此请把新密码填入发送系统。使用 --signing 时,信封改为包含新的 data.signing_secret,只显示一次;旧的立即失效,而不签名的触发器会返回 invalid_request。
triggers delete#
删除触发器。其 URL 会立即停止接受告警和推送;叠加层触发器的横条会从其屏幕上撤下,其卡片被删除。正在显示告警的触发器会被拒绝,返回 resource_conflict:请先运行 triggers clear。
triggers delete <id> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | trg_ 触发器 ID。 |
--expect-rev REVISION | string | 否 | 无 | 可选修订前提条件。 |
screenrig triggers delete trg_01EXAMPLETRIGGER00叠加层触发器
叠加层触发器会显示外部系统推送的内容。Home Assistant、门或运动传感器中枢、摄像头系统或告警工具通过一次 HTTP POST 发送几句话,触发器的屏幕会显示它们,直到到期或发送方结束它们。它和 CAP 触发器一样是一种触发器:triggers create --kind overlay 创建它,并计入每个组织 20 个的同一上限。
--show bar 在每个目标屏幕正在播放的内容之上绘制一条横条,位于底部,使用 --edge top 时位于顶部。告警开始时横条滑入,最后一条告警结束时滑出;播放列表、页面和时间安排都不变。每个屏幕每条边只有一条横条:如果某个屏幕上这条边已被另一个叠加层触发器占用,则该触发器不会在那里显示(triggers show 将这些屏幕计为 edge_taken),而在该边上有自己带存在性横条的页面会保留它。无论横条是否显示,该边上的角落卡片或标签卡片都会向内移动,让出横条的高度。广告位页面上和接管期间不会绘制横条。--show takeover 从第一条告警开始到最后一条告警结束,在设有默认播放列表的目标屏幕上全屏播放告警。接管触发器不会替换屏幕上已有的接管,例如操作员的接管或紧急告警,而 CAP 告警会替换它。
标签目标在告警开始时解析;之后才加上标签的屏幕会在下一条开始的告警时获得横条。接管会跳过没有默认播放列表的屏幕。离线的屏幕在重新连接时会赶上。
发送方向 data.url 推送 JSON(或表单),带 Authorization: Bearer SECRET,或使用 HTTP Basic,用户名为触发器 ID,密码为密钥。密钥绝不会出现在 URL 中。一次推送包含以下成员;未知成员会被拒绝并指出其名称。
| 成员 | 类型 | 备注 |
|---|---|---|
alert_id | string | 发送方为告警指定的 ID,1 到 200 个字符。相同的 ID 会更新该告警,而不是再叠加一条。不指定时是名为 default 的单个告警。解除时,不指定则结束所有告警。 |
label | string | 标题上方的简短标签:最多 40 个字符。 |
title | string | 最多 120 个字符。 |
message | string | 主要文字:最多 400 个字符。 |
note | string | 底部一行不显眼的文字:最多 120 个字符。 |
duration | 数字或字符串 | 这次推送从现在起保持其告警的时长:10 到 604800 秒,或 10s、5m、2h、1d 或 until_cleared。省略时使用触发器的 --for(未设置时为 10 分钟)。 |
clear | 布尔值或字符串 | true(或 yes、y、1、x)结束该告警;false(或 no、n、0、空值)触发告警。解除会忽略其他成员。 |
state | string | 发送方的状态词。off、closed、clear、cleared、resolved、ok、normal、inactive 和 ended(不区分大小写)会结束告警;其他任何状态都会触发告警。 |
触发至少需要 label、title、message 和 note 之一。超过限制的文本会被拒绝,duration 超出 10 秒到 7 天的范围也会被拒绝,两者都会用 invalid_request 指出成员。每次触发或更新都会从该次推送起保持其告警 duration,因此每隔几秒推送一次的运动传感器会让横条一直显示,并在最后一次推送 duration 后消失。触发器显示其最新的告警;它结束后,前一条会重新显示。它保留十条告警,第十一条会替换最旧的一条。告警在到期后约十秒内结束。重复发送两次解除只会结束告警一次,解除一条未生效的告警不会有任何变化。
答复是一份回执:outcome(shown、updated、unchanged、ended 或 ignored)、alert_id、until(对于保持到被解除的告警为 null)和 active,即推送之后触发器保留的告警。8 到 200 个字符的 Idempotency-Key 标头会在 24 小时内用第一份回执答复发送方的重试。一个触发器每分钟接受 120 次推送。触发或更新算作一次计费的 API 请求,与向传入的键值 Webhook 推送相同;解除免费,且绝不会因余额而被拒绝,因此始终可以把告警从屏幕上撤下。
curl -X POST https://api.screenrig.ai/api/triggers/trg_01EXAMPLETRIGGER00/overlay \
-H "Authorization: Bearer srtg_YOUR_SECRET" \
-H "Content-Type: application/json" \
-d '{"alert_id":"front-door","title":"Front door","message":"The front door is open","duration":"10m"}'错误的地址、错误的密钥、已停用的触发器、缺失或错误的签名以及任何 GET 都会返回同样的 404 not_found,因此发送方或链接预览无从得知是哪一种。triggers deliveries 向项目显示最近七天的原因,不含推送正文。--style FILE 设置文本卡片的 theme、accent、background、backgroundColor、textColor 和 align;每种外观使用一个触发器。
--map FILE 根据告警工具发送的正文构建推送,所用模板语言与卡片 Webhook 相同。含 {{body.title}} 的字符串是文本,恰好为一个占位符的字符串保留其类型,{"$text": "{{body.message}}", "$max": 400} 会截断文本,路径以 body 或 query 开头。下面的模板转换监控工具的告警,并在其状态为 resolved 时结束它:
{"alert_id": "{{body.groupKey}}", "title": "{{body.title}}", "message": {"$text": "{{body.message}}", "$max": 400}, "state": "{{body.status}}"}--signing 还要求 ScreenRig-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256 of "<t>.<raw body>">,使用 data.signing_secret(whsec_…,仅显示一次)签名,其中 t 与服务器时钟相差不得超过五分钟。发送方在轮换密钥期间可以携带两个 v1 值。
body='{"alert_id":"front-door","title":"Front door","message":"The front door is open"}'
t=$(date +%s)
sig=$(printf '%s.%s' "$t" "$body" | openssl dgst -sha256 -hmac "$SIGNING_SECRET" -hex | sed 's/^.* //')
curl -X POST "$URL" -H "Authorization: Bearer $SECRET" -H "ScreenRig-Signature: t=$t,v1=$sig" \
-H "Content-Type: application/json" -d "$body"对于自己给请求签名的告警工具或服务商,可以让系统用其签名代替密钥来验证,并响应服务商的设置握手,方式与卡片 webhook 相同:overlay.verify 和 overlay.handshake 放在 POST /api/triggers 和 PATCH /api/triggers/{id} 上,null 会分别将其移除。相同规则适用于触发器的 srtg_ 密码和投递日志,握手不会改变任何告警。
Home Assistant 的 rest_command 向触发器发送。将密钥放在 secrets.yaml 中,并为每个自动化指定它要触发或结束的告警:
# secrets.yaml
screenrig_lobby_overlay: "Bearer srtg_YOUR_SECRET"
# configuration.yaml
rest_command:
screenrig_lobby:
url: "https://api.screenrig.ai/api/triggers/trg_01EXAMPLETRIGGER00/overlay"
method: post
headers:
Authorization: !secret screenrig_lobby_overlay
content_type: "application/json"
payload: >-
{{ {"alert_id": alert_id | default(""), "title": title | default(""),
"message": message | default(""), "duration": duration | default("10m"),
"clear": clear | default(false)} | tojson }}
# automations.yaml
- alias: Front door open on the lobby screens
triggers:
- trigger: state
entity_id: binary_sensor.front_door
to: "on"
actions:
- action: rest_command.screenrig_lobby
data: {alert_id: front-door, title: Front door, message: The front door is open, duration: until_cleared}
- alias: Front door closed
triggers:
- trigger: state
entity_id: binary_sensor.front_door
to: "off"
actions:
- action: rest_command.screenrig_lobby
data: {alert_id: front-door, clear: true}
- alias: Driveway motion
triggers:
- trigger: state
entity_id: binary_sensor.driveway_motion
to: "on"
actions:
- action: rest_command.screenrig_lobby
data: {alert_id: driveway, title: Driveway, message: Motion at the driveway, duration: 2m}有两点使其生效。每次运动推送都会从该次推送起保持横条 2 分钟,因此运动持续时它一直显示,并在最后一个事件 2 分钟后消失。并且 Home Assistant 会在推送前渲染 {{ }} 模板,因此触发器收到的是普通 JSON;触发器自己的 --map 模板是另一个独立步骤,会让每次推送都经过它;因此对已经推送叠加层成员的发送方(例如这里的 Home Assistant),请不要使用 --map,或为该发送方单独建一个触发器。
播放
播放证据有三种形式。playback plays 读取每个屏幕上可见的图像或视频开始的一行,按 received_at 由旧到新排序:为报告或广告商提供播放证明。playback list 读取每日总计,每个屏幕、媒体对象和 UTC 天一行。playback totals 读取每个 UTC 天的播放计数,或排名最繁忙的屏幕或媒体。plays 和 list 导出为 CSV,控制台导出相同文件。
播放记录保留以满足计划的事件保留要求,至少30天。
| 问题代码 | 退出 | 含义 |
|---|---|---|
invalid_request | 8 | 播放范围超过 31 天,日范围超过 366 天,或过滤器格式错误。CLI 在发送前拒绝大部分此类请求(退出码 2)。 |
rate_limited | 7 | 每个组织每分钟 30 次的播放导出配额已用尽。请等待retry_after_seconds。 |
计费:每个JSON页面为一个计费API请求,因此--all对每页计费一次。CSV导出为其整个范围计费一次。每个播放请求和每个CSV导出也消耗播放导出预算。playback totals为一个计量API请求,不消耗该预算。
playback plays#
读取每次播放记录,每个可见启动一行。
playback plays [--from TIME] [--to TIME] [--screen-id ID] [--media-id ID] [--tag TAG] [--cursor CURSOR] [--limit N] [--all]
playback plays --format csv [--output FILE] [--from TIME] [--to TIME] [--screen-id ID] [--media-id ID] [--tag TAG]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--from TIME | string | 否 | 提前 24 小时 --to | received_at 的包含上限:带秒和偏移的 RFC 3339 时间点,now,或类似 7d、12h 或 30m 的时长。 |
--to TIME | string | 否 | 现在 | 独占绑定,形式相同。范围最多31天。 |
--screen-id ID | string | 否 | 每个屏幕 | 一个 scr_ 屏幕。 |
--media-id ID | string | 否 | 每个对象 | 一个 med_ 媒体对象。 |
--tag TAG | string | 否 | 每个屏幕 | 播放接收时屏幕携带的标签。 |
--cursor CURSOR | string | 否 | 范围的开始 | 上一页的 next_cursor,使用相同的筛选条件。 |
--limit N | integer | 否 | 200 | 每个 JSON 页的行数,最多 1000。不适用于 --format csv。 |
--all | boolean | 否 | 关闭 | 跟随光标至范围末尾,每页 1000 行,除非 --limit 另有说明,最多 50 页。 |
--format csv | string | 否 | JSON | 将整个范围流式传输为 CSV。 |
--output FILE | 路径 | 否 | ./playback-plays.csv | CSV 目标,或仅用于 stdout 的 -。 |
screenrig playback plays --from 7d --tag Lobby --all
screenrig playback plays --format csv --from 2026-09-01T00:00:00Z --to 2026-10-01T00:00:00Z --output september-plays.csvCLI 将两个边界时间标准化为 UTC 并在每次请求中发送;data.from 和 data.to 会回显它们。最新的 5 秒数据会被延迟,直到稳定,因此播放在接收后约 5 秒出现,data.to 报告该有效结束时间。JSON 在 data.items 返回一页数据,带有 data.next_cursor,data.next.argv 是下一页的精确命令。--all 会提前停止,并在达到页面上限 (playback_plays_truncated) 或导出预算用尽 (playback_export_rate_limited) 时显示 data.next 和警告,而不是继续请求导致拒绝。
CSV 遵循 RFC 4180,固定表头行为 screen_id,playlist_id,page_id,primitive_id,media_id,primitive,started_at,received_at,manifest_revision,playlist_revision,时间为 RFC 3339 UTC。primitive_id 和 started_at 为空,除非播放器报告。以 =、+、-、@、制表符或回车开头的单元格会加前导 ',防止电子表格计算。CLI 通过同目录下的私有临时文件写入,流结束正常后替换现有文件。--timeout 是无进度超时限制,默认 60000 毫秒无字节传输,不限制总时长。信封报告 path、bytes、rows、sha256 和 last_received_at;CSV 不进入信封。
如果流中途失败,命令以非零退出且不写入目标文件。已接收完整行保留在 FILE.partial,error.next 从最后一个 received_at 导出剩余范围到未使用的 FILE-rest.csv。两者在该瞬间接收的行均出现,合并时去重。
playback list#
读取该项目的每日播放总数,最新日期优先。
playback list [--screen-id ID] [--media-id ID] [--day YYYY-MM-DD | --day-from YYYY-MM-DD --day-to YYYY-MM-DD] [--format csv] [--output FILE]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--screen-id ID | string | 否 | 每个屏幕 | 必须以 scr_ 开头。 |
--media-id ID | string | 否 | 每个对象 | 必须以 med_ 开头。 |
--day YYYY-MM-DD | string | 否 | 每天 | 一个 UTC 日历日。 |
--day-from YYYY-MM-DD | string | 否 | 无 | 包含的 UTC 日期范围起点,带 --day-to,最多 366 天。 |
--day-to YYYY-MM-DD | string | 否 | 无 | 该范围的结束。 |
--format csv | string | 否 | JSON | 导出为 CSV。无范围时为截至今日的31天。 |
--output FILE | 路径 | 否 | ./playback-aggregates.csv | CSV 目标,或仅用于 stdout 的 -。 |
screenrig playback list --screen-id scr_01EXAMPLESCREEN00000000 --day 2026-08-14
screenrig playback list --format csv --day-from 2026-09-01 --day-to 2026-09-30每个屏幕、媒体对象和 UTC 天的一行。筛选器选择调用者自己的行。CSV 头行为 screen_id,media_id,filename,primitive,day,play_count,last_page_id,last_manifest_revision,first_started_at,last_started_at。失败的每日导出不保留任何内容;请重新运行。
playback totals#
读取每个 UTC 日的播放次数,或排名最繁忙的屏幕或媒体。
playback totals [--by day|screen|media|screen_day] [--day-from YYYY-MM-DD] [--day-to YYYY-MM-DD]
[--screen-id ID | --media-id ID] [--top N]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--by GROUPING | string | 否 | day | day 每个 UTC 日返回一行。screen 或 media 排名最繁忙的。screen_day 返回最活跃屏幕的每日序列。 |
--day-from YYYY-MM-DD | string | 否 | 提前 29 天 --day-to | 首个 UTC 天(含)。 |
--day-to YYYY-MM-DD | string | 否 | 今天 | 最后的UTC日,含当日。 |
--screen-id ID | string | 否 | 每个屏幕 | 使用 --by day 时,仅计数此屏幕。不适用于 --media-id。 |
--media-id ID | string | 否 | 每个对象 | 使用 --by day 时,仅计数此媒体对象。不适用于 --screen-id。 |
--top N | integer | 否 | 10 | 排名的行,1 到 100;使用 --by screen_day 时为 1 到 10。需要 --by;不适用于 --by day。 |
screenrig playback totals
screenrig playback totals --day-from 2026-09-01 --day-to 2026-09-30 --screen-id scr_01EXAMPLESCREEN00000000
screenrig playback totals --by screen --top 5
screenrig playback totals --by media --day-from 2026-09-01 --day-to 2026-09-30
screenrig playback totals --by screen_day --top 3计数来自每日汇总,延迟摄取约 21 分钟;playback plays 显示较新开始。day 对应 data.days,screen 和 media 对应 data.screens 和 data.media,screen_day 对应 data.screen_days。日期序列最多 366 天(使用 --screen-id 或 --media-id 时为 92 天),排名最多 92。data.truncated 是 true,当窗口过大导致只保留每片段最佳键时。
Feeds
feed 是 screenRIG 获取并缓存的第三方数据,如天气、警报、汇率和头条。feeds get 读取一个 feed 文档,与内置卡片使用相同参数读取的文档相同。命令从不调用第三方提供者。
feeds get#
读取一次订阅。无文档的订阅返回 pending 及其重试时间。
feeds get <family> [--lat DEGREES --lon DEGREES] [--radius-km KM] [--min-magnitude N] [--hours N]
[--basins LIST] [--base CODE] [--symbols IDS] [--currency CODE] [--url URL]...
[--public] [--geocode NAME:VALUE]... [--min-severity LEVEL] [--max-severity LEVEL]
[--min-urgency LEVEL] [--min-certainty LEVEL] [--event NAME]... [--exclude-event NAME]...
[--sender NAME]... [--status STATUS]... [--scope SCOPE]... [--language TAG]...
[--area-unknown hide|show]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<family> | string | 是 | 无 | weather,airquality,alerts,rates,crypto,earthquakes,cyclones,headlines,或 cap。 |
--lat DEGREES | number | 每个家庭 | 无 | 纬度,带--lon。weather、airquality、alerts和earthquakes必填;cyclones和cap可选。 |
--lon DEGREES | number | 每个家庭 | 无 | 经度,带 --lat。 |
--radius-km KM | number | 否 | 500 用于 earthquakes | earthquakes 半径,或 cyclones 区域,范围 10 到 20000 公里。需要 --lat 和 --lon。 |
--min-magnitude MAGNITUDE | number | 否 | 2.5 | earthquakes:最小震级,0 到 9。 |
--hours HOURS | number | 否 | 24 | earthquakes:窗口小时数,1 到 168。 |
--basins LIST | string | 否 | 所有盆地 | cyclones:以逗号分隔的流域 at,ep,cp,wp。 |
--base CODE | string | 否 | EUR | rates:基础货币。 |
--symbols IDS | string | 是,针对 crypto | 无 | 以逗号分隔的加密货币ID或代码,最多20个。 |
--currency CODE | string | 否 | usd | crypto:报价货币。 |
--url URL | string | 是,针对 headlines | 无 | headlines:RSS 或 Atom 源 URL。cap:CAP 警报或 ATOM/RSS 索引 URL;最多重复 5 次。 |
--public | boolean | 否 | 开启但无 --url | cap:还读取覆盖 --lat 和 --lon 的公共警报源。需要 --lat 和 --lon。 |
--geocode NAME:VALUE | string | 否 | 无 | cap:该位置的区号,例如 UGC:WAC033。可重复。需要 --lat 和 --lon。 |
--min-severity LEVEL | string | 否 | 无 | cap:仅警报达到或超过 minor,moderate,severe 或 extreme。 |
--max-severity LEVEL | string | 否 | 无 | cap:仅警报达到或低于 minor,moderate,severe 或 extreme。 |
--min-urgency LEVEL | string | 否 | 无 | cap:仅警报至少达到此紧急程度:past,future,expected 或 immediate。 |
--min-certainty LEVEL | string | 否 | 无 | cap:仅警报至少达到此确定性:unlikely,possible,likely 或 observed。 |
--event NAME | string | 否 | 任何事件 | cap:仅此事件;*匹配任意字符序列。可重复。 |
--exclude-event NAME | string | 否 | 无 | cap:排除此事件。可重复。 |
--sender NAME | string | 否 | 任何发送者 | cap:仅来自此发送者的警报。可重复。 |
--status STATUS | string | 否 | Actual | cap:要读取的警报状态:Actual,Exercise,Test 或 System。可重复。 |
--scope SCOPE | string | 否 | Public | cap:要读取的警报范围:Public,Restricted 或 Private。可重复。 |
--language TAG | string | 否 | 无 | cap:语言偏好;以第一个出现的为准。可重复。 |
--area-unknown MODE | string | 否 | hide | cap:仅由该位置缺少的区号通知的警报:hide 或 show。 |
screenrig feeds get weather --lat 49.25 --lon -123
screenrig feeds get rates --base EUR
screenrig feeds get crypto --symbols btc,eth --currency usd
screenrig feeds get earthquakes --lat 49.25 --lon -123 --radius-km 500 --min-magnitude 4 --hours 72
screenrig feeds get cyclones --basins at,ep
screenrig feeds get headlines --url https://example.com/news.xml
screenrig feeds get cap --lat 49.25 --lon -123 --geocode UGC:WAC033 --min-severity moderate --event '*warning'
screenrig feeds get cap --url https://example.com/alerts.atom --url https://example.com/other.xmlweather,airquality,alerts 和 earthquakes 需要 --lat 和 --lon,它们总是一起使用;earthquakes 还需要 --radius-km,--min-magnitude 和 --hours。cyclones 需要 --basins,并且与 --lat,--lon 和 --radius-km 一起只显示该地点附近的风暴。rates 需要 --base,crypto 需要 --symbols 并且需要 --currency,headlines 需要 --url。
cap 读取匹配地点的 CAP 警报。需要 --url(可重复,最多 5 个 CAP 警报或 ATOM/RSS 索引 URL)或 --lat 和 --lon,读取覆盖该位置的公共订阅;--public 将这些公共订阅添加到 --url 源。过滤标志与 triggers create --pull 对象的成员相对应。
缓存文档以 200 回答,带 fetchedAt 和 attribution:在数据展示处显示归属。无文档时,信封报告状态 pending、retry_after_seconds 和 retry_at,退出码 0;CLI 不循环,需在 retry_at 后重试命令。组织每天最多注册 50 个新 feed 键,超过后 rate_limited 适用。卡片从静态参数派生 feed 键;不要自行写入 feed 或 feed: 键。
数据源
数据源按计划读取外部地址,并把结果写入一张卡片的数据,这样无需任何人重新发布,卡片就能保持最新,文档变化时屏幕会重新获取。类型有 ics、sheets、csv、json、microsoft365、google_calendar、square、shopify、toast 和 momentus。一个数据源写入一张卡片,一个组织跨其所有项目最多有 200 个。失败的同步绝不写入:卡片保留其最后一份正常文档,数据源的状态会显示错误。各类型的设置、状态码和隐私规则见数据源。
预设是为某个服务(例如 Slack 频道、招聘看板或构建看板)准备好的、经过测试的 json 数据源:source presets 列出预设,source presets NAME 显示预设的字段和密钥,source create --preset NAME 创建数据源。
请以 --secret NAME=@FILE 的形式提供每项凭据,或用 NAME=- 从标准输入读取,这样它就不会留在您的 shell 历史和进程列表中。密钥以加密方式存储,只以掩码提示的形式返回。密钥名称是:ics 用 calendar_url.KEY(每个日历一个),需要密钥的 csv 或 json 地址用 token(password、client_secret、header.NAME 和 query.NAME 用于其他登录方式,见请求、登录和分页),microsoft365 和 toast 用 client_secret,google_calendar 用 service_account_key,square 和 shopify 用 access_token,momentus 用 api_key 和 api_secret,已安装在店铺上的 shopify 应用则用 client_secret 加 client_id 设置。
--settings 接受数据源的整个设置对象,形式为 JSON、@FILE 或 -。--set KEY=VALUE 设置一个顶层成员,可重复使用;值能解析为 JSON 时按 JSON 处理(days=14、calendars='[{"key":"lobby"}]'),否则按文本处理(time_zone=America/Vancouver)。两者同时使用时,--set 的成员会替换 --settings 中的同名成员;只用 --set 的 source update 会修改已保存设置中的这些成员。CLI 自己的 --config 选项指的是它的凭据文件,与数据源无关。
source list#
列出项目的数据源,最新的在前,并显示其状态。
source list [--after CURSOR]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--after CURSOR | string | 否 | 第一页 | 上一页的 data.next_cursor。 |
screenrig source listsource show#
查看数据源:其设置、屏蔽后的密钥、最近一次运行和最近一次错误。
source show <source_id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<source_id> | string | 是 | 无 | 数据源(src_…)。 |
screenrig source show src_01EXAMPLESOURCE000000source presets#
列出现成的数据源预设,或显示某个预设及其字段、密钥和获取方式。
source presets [<name>]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<name> | string | 否 | 每个预设 | 预设的名称:以连字符连接的小写单词,例如 slack-channel。 |
screenrig source presets
screenrig source presets slack-channel列表显示每个预设的标题、它所填充的卡片类型(第一个是它专为之制作的类型)以及它的类别。指定名称时会显示要设置的字段(--set NAME=VALUE:带模式和示例的文本、选择项,或接受 JSON 数组的列表)、要输入的密钥(--secret NAME=@FILE)及服务商在何处签发每个密钥、刷新频率、卡片保留最后数据的时长,以及它读取谁的数据、遵循哪些条款。不会创建任何内容。
source create#
创建数据源。它会在几秒内运行,之后按其计划运行。请先创建卡片,并用 source test 预览。
source create (--kind KIND | --preset NAME) --card CARD_ID --name NAME [--settings JSON|@FILE|-] [--set KEY=VALUE]...
[--connection-id ID] [--secret NAME=VALUE]... [--refresh DURATION] [--stale-after DURATION|none] [--disabled]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--kind KIND | string | 没有 --preset | 无 | ics、sheets、csv、json、microsoft365、google_calendar、square、shopify、momentus 或 toast。 |
--preset NAME | string | 没有 --kind | 无 | 基于现成的、经过测试的预设创建数据源(source presets 会列出预设):此时 --set 和 --settings 用于给出预设的字段,--secret 用于给出其凭据。不适用于 --kind。 |
--card CARD_ID | string | 是 | 无 | 数据源写入的卡片(crd_…)。一张卡片只有一个数据源;再添加第二个会返回 source_target_taken。 |
--name NAME | string | 是 | 无 | 1 到 80 个字符。 |
--settings SETTINGS | string | 否 | {} | 一个顶层设置。可重复。使用 --preset 时,为预设的一个字段:文本按原样使用,除非它是 JSON 数组或对象(列表字段的条目)。 |
--connection-id ID | string | 否 | 无 | microsoft365 和 google_calendar:通过项目连接(pcn_…、connection list)读取,而不是使用数据源自己的租户、client_id 和密钥。它会设置 connection_id 设置项。 |
--set KEY=VALUE | string | 否 | 无 | 一个顶层设置。可重复。 |
--secret NAME=VALUE | string | 否 | 无 | 按名称提供的凭据:NAME=@FILE、NAME=-(最多只有一个选项读取标准输入)或 NAME=VALUE。可重复。使用 --preset 时,为预设的凭据。 |
--refresh DURATION | string | 否 | 因类型而异 | 同步频率,从 30s 到 24h。默认值和最短间隔由类型决定:ics 每 5 分钟同步一次,最短 1 分钟;microsoft365 和 google_calendar 每 2 分钟一次;momentus 每 1 分钟一次,最短 30 秒。预设有自己的设置。 |
--stale-after DURATION | string | 否 | 因类型而异 | 数据源无法刷新时,卡片保留最后一次正常数据的时长,范围 1m 到 7d,且至少为 --refresh 的两倍;none 会保留到下次刷新。之后数据在所有屏幕上过期。momentus 默认为 30m。 |
--disabled | boolean | 否 | 关闭 | 以停止状态创建数据源;在 source update --enable 之前不会获取任何内容。 |
screenrig source create --kind ics --card crd_01EXAMPLECARD000000000 --name "Lobby calendar" --set calendars='[{"key":"lobby"}]' --set time_zone=America/Vancouver --secret calendar_url.lobby=@lobby.url
screenrig source create --kind sheets --card crd_01EXAMPLEMENU0000000000 --name "Cafe menu" --settings @menu-sheet.json
screenrig source create --kind json --card crd_01EXAMPLEKPI00000000000 --name "Daily numbers" --settings @kpi-api.json --secret token=@api.token
screenrig source create --kind square --card crd_01EXAMPLEMENU0000000000 --name "Counter menu" --secret access_token=@square.token
screenrig source create --kind microsoft365 --card crd_01EXAMPLEROOMS0000000000 --name "Meeting rooms" --settings @rooms.json --connection-id pcn_01EXAMPLECONNECTION0000
screenrig source create --preset slack-channel --card crd_01EXAMPLEWALL00000000000 --name "Team wall" --set channel=C0123456789 --secret token=@slack.tokensource update#
更改数据源。除重命名外的更改会重置其失败次数并重新运行。
source update <source_id> [--name NAME] [--card CARD_ID] [--settings JSON|@FILE|-] [--set KEY=VALUE]...
[--connection-id ID] [--secret NAME=VALUE]... [--unset-secret NAME]... [--refresh DURATION]
[--stale-after DURATION|none] [--enable | --disable] [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<source_id> | string | 是 | 无 | 数据源(src_…)。 |
--name NAME | string | 否 | 未更改 | 重命名数据源。 |
--card CARD_ID | string | 否 | 未更改 | 写入另一张卡片。 |
--settings SETTINGS | string | 否 | 未更改 | 更改已保存设置中的一个顶层设置。可重复。对于由预设创建的数据源,则是预设的一个字段;值 null 会移除可选字段。 |
--connection-id ID | string | 否 | 未更改 | 与 source create 相同。让数据源不再使用自己的凭据,需要 --settings(不带 tenant 和 client_id)以及 --unset-secret client_secret。 |
--set KEY=VALUE | string | 否 | 无 | 更改已保存设置中的一个顶层设置。可重复。 |
--secret NAME=VALUE | string | 否 | 无 | 设置或替换一个密钥。可重复。您未发送的密钥保留其值,除非更改使数据源指向该密钥不覆盖的位置(另一个来源、店铺、环境或租户):此时 source_secret_required 会再次要求提供。 |
--unset-secret NAME | string | 否 | 无 | 移除一个密钥。可重复。 |
--refresh DURATION | string | 否 | 未更改 | 30s 到 24h;适用该类型的最短值。 |
--stale-after DURATION | string | 否 | 未更改 | 与 source create 相同;none 会移除该时长。 |
--enable, --disable | boolean | 否 | 未更改 | 恢复或停止计划;卡片保留其最后一份文档。最多指定其中一个。 |
--expect-rev REVISION | integer | 否 | 读取到的修订版本 | 除非数据源处于此修订版本,否则拒绝更改。除非您指定其他版本,--set 会以读取到的修订版本作保护。 |
至少需要一项更改。
screenrig source update src_01EXAMPLESOURCE000000 --set days=14
screenrig source update src_01EXAMPLESOURCE000000 --secret calendar_url.lobby=@new.url --refresh 10m
screenrig source update src_01EXAMPLESOURCE000000 --disable
screenrig source update src_01EXAMPLEPRESET0000000 --set channel=C0123456789 --secret token=@new.tokensource test#
预览数据源,不保存也不写入任何内容:获取地址,按卡片的需要整形响应,并用卡片校验。信封包含文档、valid、卡片拒绝时的路径和原因、警告和计数。传入已保存的 <source_id> 可测试它,其他选项作为覆盖项;或传入 --kind(或 --preset)和 --card 测试未保存的数据源。获取或整形失败会返回 source_test_failed 及原因。每个组织每分钟最多 30 次预览。
source test [<source_id>] [--kind KIND | --preset NAME] [--card CARD_ID] [--settings JSON|@FILE|-] [--set KEY=VALUE]...
[--connection-id ID] [--secret NAME=VALUE]...| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<source_id> | string | 否 | 无 | 要测试的已保存数据源。 |
--kind KIND | string | 不使用 <source_id> 或 --preset 时 | 无 | 同 source create。 |
--preset NAME | string | 否 | 无 | 预览由此预设创建的数据源,用 --set 和 --settings 作为其字段,用 --secret 作为其凭据,而不是使用 --kind。 |
--card CARD_ID | string | 没有 <source_id> | 无 | 要填充的卡片。 |
--settings SETTINGS | string | 否 | 已保存的设置 | 类型的设置:JSON、@FILE,或用 - 从标准输入读取。 |
--connection-id ID | string | 否 | 无 | 同 source create。 |
--set KEY=VALUE | string | 否 | 无 | 一个顶层设置。可重复。 |
--secret NAME=VALUE | string | 否 | 已保存的密钥 | 要尝试的凭据。可重复。 |
screenrig source test --kind ics --card crd_01EXAMPLECARD000000000 --set calendars='[{"key":"lobby"}]' --secret calendar_url.lobby=@lobby.url
screenrig source test src_01EXAMPLESOURCE000000
screenrig source test --preset slack-channel --card crd_01EXAMPLEWALL00000000000 --set channel=C0123456789 --secret token=@slack.tokensource refresh#
立即同步数据源并显示结果。它会以内联方式运行最多 60 秒,重置失败次数,并完整读取该地址。失败的同步绝不会更改卡片。计划同步正在运行时会返回 source_busy(退出码 5)。每个数据源每分钟最多 6 次。
source refresh <source_id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<source_id> | string | 是 | 无 | 数据源(src_…)。 |
screenrig source refresh src_01EXAMPLESOURCE000000source rooms#
检查屏幕如何映射到预订系统数据源(momentus)的房间。它读取数据源最后一次成功刷新时的房间和项目的屏幕,不会获取任何内容。它会列出没有任何屏幕显示的房间,以及每个有房间值或其播放列表读取该数据源房间键的屏幕,状态为 mapped、missing(播放列表读取该字段而屏幕没有值)或 unknown(值没有指向任何房间,并给出可能想指的房间)。使用 screen update scr_ID --field room=ROOM_KEY 修正屏幕。
source rooms <source_id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<source_id> | string | 是 | 无 | 读取预订系统房间的数据源(src_…)。 |
screenrig source rooms src_01EXAMPLESOURCE000000source delete#
删除数据源。卡片保留该数据源最后写入的文档。
source delete <source_id> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<source_id> | string | 是 | 无 | 数据源(src_…)。 |
--expect-rev REVISION | integer | 否 | 无 | 除非数据源处于此修订版本,否则拒绝删除。 |
screenrig source delete src_01EXAMPLESOURCE000000连接
连接是项目对 Microsoft 或 Google 已保存的访问权限,用于无人登录时运行的工作。microsoft365 或 google_calendar 数据源(source create --connection-id)、Power BI 连接(bi connection create powerbi --connection-id)和 SharePoint 媒体同步账户(media sync account add microsoft365 --connection-id)都通过连接读取,而不是各自携带租户、客户端 ID 和密钥。连接 ID 以 pcn_ 开头,一个组织在其所有项目中最多有 50 个连接。模式、状态和批准步骤见连接 Microsoft 和 Google。
own_app 模式保存您自己的应用:Microsoft 为 Microsoft Entra 应用注册(--tenant-id、--client-id 和客户端密钥的值),Google 为服务账号的 JSON 密钥。screenrig_app 模式使用 screenRIG 自己的应用,不需要密钥:create 会为完成授权的人打印一次性授权链接(data.consent_url,data.consent_expires_at 到期),这个人是为租户同意的 Microsoft 365 管理员,或授予只读日历访问权限的 Google 账号持有者。只把链接发给那个人,然后用 connection show 读取 status 和 last_error。Power BI 连接只接受 own_app 连接。
用 --secret-file FILE 提供客户端密钥,用 --service-account-key-file FILE 提供 Google 密钥,或用 - 从标准输入读取,绝不作为参数传入。读取需要 Read 访问权限,所有更改都需要 Manage 访问权限。
connection list#
列出此项目的连接,并显示其状态。
connection list无参数。
screenrig connection listconnection show#
查看一个连接:其状态、最近一次错误和最近一次测试。
connection show <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 连接(pcn_…)。 |
screenrig connection show pcn_01EXAMPLECONNECTION0000connection create microsoft#
添加 Microsoft 365 连接:您自己的 Entra 应用,或带授权链接的 screenRIG 应用。
connection create microsoft --mode own_app|screenrig_app [--name NAME]
[--tenant-id ID --client-id ID --secret-file FILE]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--mode MODE | string | 是 | 无 | own_app:您自己的 Microsoft Entra 应用注册及其客户端密钥。screenrig_app:screenRIG 的应用,由 Microsoft 365 管理员通过此命令打印的一次性链接授权。 |
--name NAME | string | 否 | Microsoft 365 | 1 到 80 个字符。 |
--tenant-id ID | string | 配合 own_app | 无 | 您的 Microsoft Entra 目录(租户)ID,或其主域名,例如 contoso.onmicrosoft.com。需与 --client-id 和 --secret-file 一起使用。 |
--client-id ID | string | 配合 own_app | 无 | 应用注册的应用程序(客户端)ID。 |
--secret-file FILE | string | 配合 own_app | 无 | 从此文件读取客户端密钥的值,或用 - 从标准输入读取(绝不作为参数传入);文件中只包含该值。 |
screenrig connection create microsoft --mode own_app --tenant-id contoso.onmicrosoft.com --client-id 0b1d2f3a-4c5e-4f60-8a7b-9c0d1e2f3a4b --secret-file secret.txt
screenrig connection create microsoft --mode screenrig_app --name "Contoso rooms"screenrig_app 模式不接受 --tenant-id、--client-id 和 --secret-file 中的任何一个:它会为 Microsoft 365 管理员打印授权链接(data.consent_url),管理员为租户同意 screenRIG 的应用。应用注册会为会议室日历列出 Calendars.Read,为 SharePoint 媒体同步列出 Sites.Selected 或 Files.Read.All;对于 Power BI,则列出租户设置和工作区成员资格,而不是 Graph 权限;connection test 会报告令牌带有哪些权限。没有 screenRIG 应用的服务器会返回 connection_app_not_configured:own_app 模式仍然可用。
connection create google#
添加 Google 连接:您自己的服务账号密钥,或带登录链接的 screenRIG 应用。
connection create google --mode own_app|screenrig_app [--name NAME]
[--service-account-key-file FILE]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--mode MODE | string | 是 | 无 | own_app:您自己的服务账号密钥。screenrig_app:screenRIG 的应用,由 Google 账号的持有者通过此命令打印的一次性链接登录并授予只读日历访问权限。 |
--name NAME | string | 否 | Google Calendar | 1 到 80 个字符。 |
--service-account-key-file FILE | string | 配合 own_app | 无 | 从此文件读取服务账号的 JSON 密钥文件,或用 - 从标准输入读取(绝不作为参数传入)。 |
screenrig connection create google --mode own_app --service-account-key-file key.json
screenrig connection create google --mode screenrig_app --name "Venue calendars"在 own_app 模式下,把每个会议室日历共享给服务账号的地址,或为数据源指定 subject(全网域授权)。screenrig_app 模式不需要密钥,并为 Google 账号的持有者打印登录链接(data.consent_url):该账号必须能看到数据源列出的每个会议室日历,并且这样的数据源不能指定 subject。没有 screenRIG 应用的服务器会返回 connection_app_not_configured:own_app 模式仍然可用。
connection update#
重命名连接,或在 own_app 模式下更改其租户、应用或密钥。
connection update <id> [--name NAME] [--tenant-id ID] [--client-id ID]
[--secret-file FILE] [--service-account-key-file FILE] [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 连接(pcn_…)。 |
--name NAME | string | 否 | 未更改 | 重命名连接。 |
--tenant-id ID | string | 否 | 未更改 | Microsoft own_app:目录(租户)ID 或主域名。 |
--client-id ID | string | 否 | 未更改 | Microsoft own_app:应用程序(客户端)ID。 |
--secret-file FILE | string | 否 | 未更改 | Microsoft own_app:从此文件读取客户端密钥的值,或用 - 从标准输入读取;它会替换已存储的密钥。 |
--service-account-key-file FILE | string | 否 | 未更改 | Google own_app:从此文件读取服务账号的 JSON 密钥,或用 - 从标准输入读取;它会替换已存储的密钥。 |
--expect-rev REVISION | integer | 否 | 无 | 除非连接处于此修订版本(revision_conflict,退出码 6),否则拒绝更改。 |
screenrig connection update pcn_01EXAMPLECONNECTION0000 --secret-file new-secret.txt
screenrig connection update pcn_01EXAMPLECONNECTION0000 --name "Contoso rooms" --expect-rev 2至少需要一项更改。更改凭据会让连接回到 ready,清除其上一次错误和上一次测试,并作废为旧凭据签发的所有令牌:请重新测试。screenrig_app 连接只能重命名:connection connect 会生成新的授权链接,以更换授权人。省略的密钥会保留。
connection test#
使用连接登录,并检查其凭据允许的操作。
connection test <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 连接(pcn_…)。 |
screenrig connection test pcn_01EXAMPLECONNECTION0000对于 Microsoft,它报告 credentials(租户的应用令牌)和 permissions(令牌带有 Calendars.Read、Sites.Selected、Files.Read.All、Sites.Read.All 和 Place.Read.All 中的哪些;一个都没有则失败,仅有 Sites.Selected 则为警告,因为每个站点都需要单独授予)。对于 Google,它报告 credentials,并指明日历必须对其可见的账号。被拒绝时,连接会转为 error 并带有 last_error;成功时则回到 ready。该测试不判定日历的共享、邮箱访问策略或站点授权。每个组织每分钟最多 30 次。
connection connect#
为 screenrig_app 连接生成新的一次性授权链接。
connection connect <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 连接(pcn_…)。 |
screenrig connection connect pcn_01EXAMPLECONNECTION0000data.consent_url 是给完成授权的人的链接:Microsoft 365 管理员,或 Google 账号的持有者。它会取代任何之前的链接。正常工作的连接在新的授权完成之前保持不变,因此这也可用于续期已转为 error 的连接(授权被撤回、访问被撤销),或把它改到另一个租户或账号。own_app 模式的连接没有授权步骤。每个组织每分钟最多 20 次。
connection delete#
删除没有任何内容通过它读取的连接。
connection delete <id> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 连接(pcn_…)。 |
--expect-rev REVISION | integer | 否 | 无 | 除非连接处于此修订版本(revision_conflict,退出码 6),否则拒绝删除。 |
screenrig connection delete pcn_01EXAMPLECONNECTION0000
screenrig connection delete pcn_01EXAMPLECONNECTION0000 --expect-rev 2只要有数据源、Power BI 连接或媒体同步账户通过该连接读取,响应就是 resource_conflict(退出码 5),并指明它们。删除并不会终止服务商那一侧:Microsoft 365 租户会一直保留 screenRIG 的应用,直到其管理员将其移除;Google 账号会一直保留其授权,直到其持有者撤销。
BI 连接
BI 连接是项目对其拥有的、显示仪表板的系统的访问权限:Grafana 为其地址和服务账号令牌,Power BI 为 Microsoft Entra 应用(服务主体)及其客户端密钥,Tableau 为已连接应用和一个用户,网页则为在登录后显示仪表板的网站的服务账号,或已登录浏览器的 Cookie。连接 ID 以 bic_ 开头。密钥在服务器上加密封存,不会再次显示:读取时显示 secret {set, hint}。连接属于单个项目。bi connection list、show 和 browse 需要 Read 访问权限,其他所有命令都需要 Manage 访问权限。
在文件中提供密钥:Grafana 用 --token-file,Power BI 和 Tableau 用 --secret-file,网页用 --password-file、--totp-file 和 --cookies-file。每个选项都可用 - 表示标准输入,绝不作为参数传入,并且一个命令中最多只有一个选项读取标准输入。
视图通过显示其 embed_url 的 iframe 图元,播放连接的一个仪表板、报表或页面;bi view create --connection-id ID 会创建视图。显示需要登录的仪表板介绍 Web 连接的完整流程,API 参考涵盖每一种类型。
bi connection create grafana#
添加 Grafana 连接:其地址和服务账号令牌。
bi connection create grafana --url URL --token-file FILE [--name NAME] [--org-id N]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--url URL | string | 是 | 无 | Grafana 在公共主机上的地址,可带任意路径前缀:https://grafana.example.com 或 https://example.com/grafana。私有、回环或保留地址会返回 invalid_request(退出码 8),并且 Grafana 必须不经重定向直接响应。 |
--token-file FILE | string | 是 | 无 | 从此文件读取服务账号令牌,或用 - 从标准输入读取(绝不作为参数传入);文件中只包含令牌。 |
--name NAME | string | 否 | 主机名 | 1 到 80 个字符。 |
--org-id N | integer | 否 | 1 | 令牌所属的 Grafana 组织:从 1 开始的整数。 |
screenrig bi connection create grafana --url https://grafana.example.com --token-file token.txt
screenrig bi connection create grafana --url https://example.com/grafana --token-file - --name "Ops Grafana" --org-id 2在 Grafana 中,安装 Grafana Image Renderer 插件或远程渲染服务(它把仪表板绘制成图像;没有它就无法渲染任何内容),然后创建具有 Viewer 角色的服务账号并添加令牌。接着运行 bi connection test。
bi connection create tableau#
添加 Tableau 连接:已连接应用(直接信任)、屏幕视图以其身份显示的用户,以及该应用的密钥值。
bi connection create tableau --url URL --client-id ID --secret-id ID --username USER
--secret-file FILE [--site SITE] [--name NAME]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--url URL | string | 是 | 无 | Tableau Server 的 https 地址,或您的 Tableau Cloud pod 的地址,例如 https://10ay.online.tableau.com(是 pod,而不是 online.tableau.com)。 |
--site SITE | string | 否 | Tableau Server 的默认站点 | 站点的内容 URL,即视图地址中 /site/ 或 /t/ 之后的部分。 |
--client-id ID | string | 是 | 无 | 已连接应用的 Client ID。 |
--secret-id ID | string | 是 | 无 | 为已连接应用生成的密钥的 Secret ID。 |
--username USER | string | 是 | 无 | 屏幕视图以其身份显示的 Tableau 用户(在 Tableau Cloud 上为电子邮件地址)。 |
--secret-file FILE | string | 是 | 无 | 从此文件读取密钥的值,或用 - 从标准输入读取(绝不作为参数传入);文件中只包含密钥值,不包含 Secret ID。 |
--name NAME | string | 否 | 主机名 | 1 到 80 个字符。 |
screenrig bi connection create tableau --url https://10ay.online.tableau.com --site lobby --client-id 11111111-2222-3333-4444-555555555555 --secret-id 66666666-7777-8888-9999-000000000000 --username screens@example.com --secret-file secret.txt在 Tableau 中一次性设置:在 Settings 的 Connected Apps 下,创建一个 Direct trust 已连接应用,复制其 Client ID,生成密钥并复制 Secret ID 和密钥值,然后启用该应用和密钥。选择或创建屏幕以其身份显示视图的 Tableau 用户,并且只授予它屏幕所显示视图的访问权限:任何持有屏幕票据的人都可以嵌入该用户能看到的任何视图。然后运行 bi connection show ID,并把其 embed_origin 的主机输入到已连接应用的域名允许列表中。它需要 Tableau Cloud 或 Tableau Server 2023.3 或更高版本;屏幕必须能够访问 Tableau 主机,其浏览器必须接受来自该主机的第三方 Cookie。接着运行 bi connection test,再运行 bi connection browse 查找视图。
bi connection create powerbi#
添加 Power BI 连接:Microsoft Entra 应用(服务主体)及其客户端密钥,或此项目的 Microsoft 连接。
bi connection create powerbi
(--tenant-id ID --client-id ID --secret-file FILE | --connection-id ID) [--name NAME]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--tenant-id ID | string | 没有 --connection-id | 无 | 您的 Microsoft Entra 目录(租户)ID,或其域名,例如 contoso.onmicrosoft.com;不能是 common、organizations 或 consumers。需与 --client-id 和 --secret-file 一起使用。 |
--client-id ID | string | 没有 --connection-id | 无 | 应用注册的应用程序(客户端)ID。 |
--secret-file FILE | string | 没有 --connection-id | 无 | 从此文件读取客户端密钥的值,或用 - 从标准输入读取(绝不作为参数传入);文件中只包含密钥值,不包含密钥 ID。 |
--connection-id ID | string | 没有 --tenant-id | 无 | 通过此项目中 own_app 模式的 Microsoft 连接(pcn_…)登录,以代替 --tenant-id、--client-id 和 --secret-file。screenrig_app 连接会被拒绝。不能与它们一起使用。 |
--name NAME | string | 否 | Power BI | 1 到 80 个字符。 |
screenrig bi connection create powerbi --tenant-id 11111111-2222-3333-4444-555555555555 --client-id aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee --secret-file secret.txt
screenrig bi connection create powerbi --connection-id pcn_01EXAMPLECONNECTION0000 --name "Contoso Power BI"一次性设置。在 Microsoft Entra 中创建应用注册(单租户、无重定向 URI、无 API 权限)和客户端密钥。Power BI 管理员在管理门户的租户设置下,启用开发者设置 Embed content in apps 和 Service principals can call Fabric public APIs,范围为整个组织或包含该应用的安全组。把应用以 Member 或 Admin 角色添加到您要显示的每个工作区;Member 是最低的访问级别。用于生产嵌入时,工作区必须位于 Fabric (F)、Power BI Embedded (A) 或 Premium (P/EM) 容量上。仅限商业云。接着运行 bi connection test,再运行 bi connection browse 查找工作区和报表。
bi connection create web#
添加 Web 连接:在登录后显示仪表板的网站的服务账号,或已登录浏览器的 Cookie。
bi connection create web --login-mode auto|steps|none [--login-url URL] [--username USER]
[--password-file FILE] [--totp-file FILE] [--steps FILE] [--cookies-file FILE] [--name NAME]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--login-mode MODE | string | 是 | 无 | auto 用 --username 和密码填写 --login-url 上的表单。steps 运行 --steps 脚本。none 不进行任何登录,因此页面使用 --cookies-file 的 Cookie 集显示,并且不接受 --login-url、--username、--password-file、--totp-file 或 --steps。 |
--login-url URL | string | 使用 auto 或 steps 时 | 无 | 网站登录页面的 https 地址,位于公共主机上。密码只会在该页面和脚本的 goto 步骤中输入,绝不会输入到视图的地址中。 |
--username USER | string | 配合 auto | 无 | 服务账号的用户名。 |
--password-file FILE | string | 配合 auto | 无 | 从此文件读取服务账号的密码,或用 - 从标准输入读取(绝不作为参数传入):允许包含空格,末尾的一个换行符会被去掉。 |
--totp-file FILE | string | 否 | 无 | 从此文件或 - 读取网站为账号的身份验证器应用显示的 base32 密钥(16 到 128 个字符),或其 otpauth://totp 地址:由服务器计算验证码。 |
--steps FILE | string | 配合 steps | 无 | 登录脚本,最多 30 个步骤的 JSON 数组,来自文件或 -。操作:goto(url)、fill(selector、value)、click 和 wait_for(selector)、press(value,例如 Enter,可选 selector)以及 wait_ms(ms)。值可以包含 {{username}}、{{password}} 和 {{otp}},但绝不能包含密钥本身。不适用于 auto。 |
--cookies-file FILE | string | 否 | 无 | 从已登录浏览器导出的 Cookie 集:Cookie 的 JSON 数组(Cookie 扩展的导出内容),或带有 cookies 数组的对象(Playwright 的存储状态),来自文件或 -;最多 100 个。只发送 name、value、domain、path、expires、httpOnly、secure 和 sameSite。 |
--name NAME | string | 否 | 登录主机 | 1 到 80 个字符。 |
screenrig bi connection create web --login-mode auto --login-url https://login.example.com/signin --username screens@example.com --password-file password.txt --name "Ops dashboard"
screenrig bi connection create web --login-mode steps --login-url https://login.example.com/signin --username screens@example.com --password-file password.txt --steps steps.json
screenrig bi connection create web --login-mode none --cookies-file cookies.json --name "Signed-in jar"密码、密钥和 Cookie 会加密封存,不会再次显示:data.secret 和 data.totp_secret 说明它们是否已设置,data.session 说明登录所处的状态(idle、active、login_needed、paused、stopped 或 expired)。请使用只读服务账号。被拒绝的登录会等待 5 分钟,之后依次为 15、60 和 120 分钟,连续第五次被拒绝会使连接停止,直到其凭据或登录设置发生更改。在手机上批准登录、检查设备或显示 CAPTCHA 的网站无法用脚本登录:请使用 Cookie 集。没有页面渲染器的服务器会返回 bi_web_unavailable(退出码 5)。接着运行 bi connection test。
bi connection list#
列出此项目的 BI 连接,并显示其类型、屏蔽后的密钥和最近一次测试。
bi connection list无参数。
screenrig bi connection listdata.items 包含项目的所有连接;不会返回任何密钥。
bi connection show#
查看一个连接及其最近一次测试。
bi connection show <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 连接(bic_…)。 |
screenrig bi connection show bic_01EXAMPLECONNECTION0000响应包含 kind、config(Grafana 为 url 和 org_id;Power BI 为 tenant_id 和 client_id;Tableau 为 url、site、client_id、secret_id 和 username)、secret {set, hint}、embed_origin(项目的嵌入主机,已连接应用的域名允许列表中会列出它)和 last_test。
bi connection update#
更改连接的名称、地址、组织、租户、应用、站点、用户、密钥,对于 Web 连接,还可更改其登录和 Cookie。
bi connection update <id> [--name NAME] [--url URL] [--org-id N] [--tenant-id ID] [--client-id ID]
[--site SITE | --default-site] [--secret-id ID] [--username USER]
[--token-file FILE | --secret-file FILE | --password-file FILE | --clear-password]
[--login-mode auto|steps|none] [--login-url URL] [--totp-file FILE | --clear-totp]
[--steps FILE] [--cookies-file FILE | --clear-cookies] [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 连接(bic_…)。 |
--name NAME | string | 否 | 未更改 | 重命名连接。 |
--url URL | string | 否 | 未更改 | Grafana 的新地址,或 Tableau 服务器或 pod 的新地址。 |
--org-id N | integer | 否 | 未更改 | 令牌所属的 Grafana 组织。 |
--tenant-id ID | string | 否 | 未更改 | Power BI 连接的 Microsoft Entra 租户。 |
--client-id ID | string | 否 | 未更改 | Power BI 连接的应用程序(客户端)ID,或 Tableau 已连接应用的 Client ID。 |
--site SITE | string | 否 | 未更改 | Tableau 连接的站点内容 URL。不适用于 --default-site。 |
--default-site | boolean | 否 | 关闭 | Tableau Server:登录默认站点。不适用于 --site。 |
--secret-id ID | string | 否 | 未更改 | Tableau 已连接应用的 Secret ID。 |
--username USER | string | 否 | 未更改 | 屏幕视图以其身份显示的 Tableau 用户,或 Web 连接的服务账号。 |
--token-file FILE | string | 否 | 未更改 | Grafana:从此文件读取服务账号令牌,或用 - 从标准输入读取;它会替换已存储的令牌。--token-file、--secret-file、--password-file 和 --clear-password 最多只能使用一个。 |
--secret-file FILE | string | 否 | 未更改 | Power BI 或 Tableau:从此文件读取密钥值,或用 - 从标准输入读取;它会替换已存储的密钥。 |
--login-mode MODE | string | 否 | 未更改 | Web:登录方式,auto、steps 或 none。 |
--login-url URL | string | 否 | 未更改 | Web:网站登录页面的 https 地址。新的来源需要在同一命令中提供 --password-file,因此已存储的密码绝不会被发送到您没有为其提供密码的页面。 |
--password-file FILE | string | 否 | 未更改 | Web:从此文件读取服务账号的密码,或用 - 从标准输入读取;它会替换已存储的密码。 |
--clear-password | boolean | 否 | 关闭 | Web:移除已存储的密码。 |
--totp-file FILE | string | 否 | 未更改 | Web:从此文件读取身份验证器密钥,或用 - 从标准输入读取;它会替换已存储的密钥。不适用于 --clear-totp。 |
--clear-totp | boolean | 否 | 关闭 | Web:移除已存储的身份验证器密钥。不适用于 --totp-file。 |
--steps FILE | string | 否 | 未更改 | Web:替换登录脚本,最多 30 个步骤的 JSON 数组,来自文件或 -。 |
--cookies-file FILE | string | 否 | 未更改 | Web:用从已登录浏览器导出的 Cookie 集替换现有的 Cookie 集,来自文件或 -(bi connection create web 接受的格式)。不适用于 --clear-cookies。 |
--clear-cookies | boolean | 否 | 关闭 | Web:移除已存储的 Cookie 集。不适用于 --cookies-file。 |
--expect-rev REVISION | integer | 否 | 无 | 除非连接处于此修订版本(revision_conflict,退出码 6),否则拒绝更改。 |
screenrig bi connection update bic_01EXAMPLECONNECTION0000 --token-file new-token.txt
screenrig bi connection update bic_01EXAMPLECONNECTION0000 --password-file new-password.txt
screenrig bi connection update bic_01EXAMPLECONNECTION0000 --clear-totp --clear-cookies
screenrig bi connection update bic_01EXAMPLECONNECTION0000 --url https://grafana.example.com --token-file new-token.txt --name "Ops Grafana" --expect-rev 2至少需要一项更改,省略的密钥会保留。更改为另一个主机、协议或端口上的新地址时,需要在同一命令中提供 --token-file(Grafana)或 --secret-file(Tableau):已存储的密钥只会发送到保存它时所对应的地址。新的地址、组织、租户、应用、站点、用户或密钥会清除 last_test,并作废为该连接的视图缓存的所有渲染结果:请重新测试。更改凭据或登录设置会解除 Web 会话的停止状态。
bi connection test#
检查凭据:Grafana 的令牌和 Image Renderer、Power BI 的应用及其工作区,或 Tableau 的登录。
bi connection test <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 连接(bic_…)。 |
screenrig bi connection test bic_01EXAMPLECONNECTION0000Grafana:token(Grafana 接受它)和 image_renderer(列出了该插件;没有它的 Grafana 只会发出警告,因为远程渲染服务不会显示为插件)。Power BI:token(Microsoft Entra 为该应用签发了令牌)和 workspaces(应用可见的工作区;一个都没有则失败,拒绝时会指明开发者租户设置和应用在工作区中的 Member 或 Admin 角色)。Tableau:以连接用户的身份使用内容读取令牌进行 signin,随后登出。拒绝是一次带有服务商自身响应的失败检查,结果存储为 last_test。该测试不判定 Tableau 的域名允许列表、容量、行级安全或仪表板的权限:bi view test 会真正检查一个视图。
bi connection browse#
列出连接可显示的内容:Grafana 仪表板和面板、Power BI 工作区和报表,或 Tableau 视图。
bi connection browse <id> [--query TEXT] [--dashboard UID] [--workspace ID]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 连接(bic_…)。 |
--query TEXT | string | 否 | 无 | 仅名称匹配的仪表板、工作区、报表或视图。 |
--dashboard UID | string | 否 | 无 | Grafana:改为列出此仪表板的面板。 |
--workspace ID | string | 否 | 无 | Power BI:改为列出此工作区的报表。 |
screenrig bi connection browse bic_01EXAMPLECONNECTION0000 --query lobby
screenrig bi connection browse bic_01EXAMPLECONNECTION0000 --dashboard abc123
screenrig bi connection browse bic_01EXAMPLECONNECTION0000 --workspace f089354e-8366-4e18-aea3-4cb4a3a50b48 --query salesdata.items 列出:对于 Grafana,令牌可显示的每个仪表板的 uid、title、folder 和 tags,带 --dashboard 时则列出其面板的 id、title 和 type(行已展平,因此折叠行内的面板也会列出);对于 Power BI,应用可见的每个工作区的 id 和 name,带 --workspace 时则列出其报表的 id、name 和 embed_url;对于 Tableau,连接用户可见的每个视图的 path(形如 Workbook/View)和 name。将这些值用于 bi view create。
bi connection delete#
删除没有任何视图使用的连接。
bi connection delete <id> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 连接(bic_…)。 |
--expect-rev REVISION | integer | 否 | 无 | 除非连接处于此修订版本(revision_conflict,退出码 6),否则拒绝删除。 |
screenrig bi connection delete bic_01EXAMPLECONNECTION0000只要有视图使用它,响应就是 resource_conflict(退出码 5),并指明它们:请先删除这些视图。
BI 视图
视图是 Grafana 连接的一个仪表板或面板、Power BI 工作区的一份报表、Tableau 站点的一个视图、Web 连接的一个页面,或不需要连接的公开链接:Grafana 公开仪表板、Power BI Publish to web 链接或 Tableau Public 可视化。视图 ID 以 biv_ 开头,视图只在其所属项目的屏幕上播放。
把视图的 embed_url 放入 iframe 图元,并将 content_fit 设为 fill,然后照常发布:播放列表不包含任何凭据。Grafana 和 Web 视图由服务器按 --refresh 的间隔绘制成图像,并由所有相同尺寸的屏幕共享,因此十块大堂屏幕只产生一次渲染,屏幕从不与该系统通信;捕获失败时,最后一张正常的图像会保留在屏幕上。Power BI 报表和 Tableau 视图使用由服务器生成并续期的仅查看令牌嵌入,屏幕从不持有密钥。只有在屏幕的清单指明该视图时,才会绘制图片。
读取需要 Read 访问权限,所有更改都需要 Manage 访问权限。每个目标选项属于一种连接类型,bi connection browse ID 会列出可使用的值。
bi view create#
添加连接的仪表板、面板、报表或 Tableau 视图,或公开链接的视图。
bi view create (--connection-id ID (--url URL | --dashboard UID | --workspace ID --report ID | --view WORKBOOK/VIEW)
| --public-url URL) [--name NAME] [--refresh DURATION] [--fit contain|cover|fill] [--rotate DURATION]
[--panel ID] [--from TIME] [--to TIME] [--var NAME=VALUE]... [--theme dark|light] [--timezone ZONE]
[--page NAME]... [--all-pages] [--rotate-sheets] [--wait-for CSS] [--wait-ms MS] [--clip CSS]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--connection-id ID | string | 没有 --public-url | 无 | 要显示其内容的连接(bic_…)。 |
--url URL | string | 一个目标 | 无 | 连接的 Grafana 主机上的仪表板地址、Power BI 报表地址、Tableau 视图地址,对于 Web 连接则是公共主机上页面的 https 地址。目标的其余部分从中读取。 |
--dashboard UID | string | 一个目标 | 无 | Grafana:仪表板的 uid,即其地址中 /d/ 之后的部分。 |
--workspace ID | string | 一个目标 | 无 | Power BI:工作区 ID,配合 --report。 |
--report ID | string | 配合 --workspace | 无 | Power BI:报表 ID,配合 --workspace。 |
--view WORKBOOK/VIEW | string | 一个目标 | 无 | Tableau:视图,即其地址中 /views/ 之后的名称(bi connection browse 会列出它们)。 |
--public-url URL | string | 一个目标 | 无 | Grafana 公开仪表板链接、Power BI Publish to web 链接或 Tableau Public 可视化地址。它不需要连接,直接从其主机实时播放。仅可单独提供,或与 --name、--refresh、--fit 和 --rotate-sheets 一起提供。 |
--name NAME | string | 否 | 来自目标 | 1 到 80 个字符。 |
--refresh DURATION | string | 否 | 5m | Grafana:图像重新绘制的频率,30s 到 24h。Web:页面重新绘制的频率,60s 到 24h。Power BI 和 Tableau:报表或视图刷新其数据的频率,60s 到 24h,或 0 表示不刷新。 |
--fit FIT | string | 否 | contain | Grafana 和 Web:图像填充屏幕的方式,contain、cover 或 fill。 |
--rotate DURATION | string | 否 | 无 | Power BI:每个页面的显示时长,10s 到 1h;使用两个或更多 --page 或使用 --all-pages 时必需。Tableau:每个工作表的显示时长;使用 --rotate-sheets 时必需。 |
--page NAME | string | 否 | 无 | Power BI:要显示的页面,按名称或显示名称指定。可重复;页面按此顺序显示。 |
--all-pages | boolean | 否 | 关闭 | Power BI:轮换显示每个可见页面,配合 --rotate。 |
--rotate-sheets | boolean | 否 | 关闭 | Tableau:轮换工作簿已发布的工作表,配合 --rotate。 |
--panel ID | string | 否 | 整个仪表板 | Grafana:只显示这一个面板,而不是整个仪表板。 |
--from TIME | string | 否 | 无 | Grafana:时间范围的开始,例如 now-6h。 |
--to TIME | string | 否 | 无 | Grafana:时间范围的结束,例如 now。 |
--var NAME=VALUE | string | 否 | 无 | Grafana:一个仪表板变量。可重复。 |
--theme THEME | string | 否 | dark | Grafana 主题,dark 或 light。 |
--timezone ZONE | string | 否 | 无 | Grafana:仪表板的时区,例如 Europe/Paris、utc 或 browser。 |
--wait-for CSS | string | 否 | 无 | Web:一个 CSS 选择器,指向页面就绪且仅在已登录时才显示的元素。捕获会等待该元素,若它始终没有出现,则以 bi_web_timeout 失败。 |
--wait-ms MS | integer | 否 | 无 | Web:页面就绪后等待的毫秒数,用于较晚出现的图表,0 到 10000。 |
--clip CSS | string | 否 | 整个页面 | Web:要绘制的页面部分的 CSS 选择器。 |
screenrig bi view create --connection-id bic_01EXAMPLECONNECTION0000 --url 'https://grafana.example.com/d/abc123/lobby?orgId=1&viewPanel=4' --refresh 5m
screenrig bi view create --connection-id bic_01EXAMPLECONNECTION0000 --dashboard abc123 --panel 4 --from now-6h --to now --var host=web1 --theme light --name "Web CPU"
screenrig bi view create --public-url https://grafana.example.com/public-dashboards/TOKEN --name "Public status"
screenrig bi view create --connection-id bic_01EXAMPLECONNECTION0000 --workspace f089354e-8366-4e18-aea3-4cb4a3a50b48 --report 5b218778-e7a5-4d73-8187-f10824047715 --page Overview --page Detail --rotate 30s --name "Sales rotation"
screenrig bi view create --connection-id bic_01EXAMPLECONNECTION0000 --view Sales/Overview --rotate-sheets --rotate 30s --refresh 0 --name "Sales sheets"
screenrig bi view create --connection-id bic_01EXAMPLECONNECTION0000 --url https://app.example.com/dashboards/42 --refresh 5m --wait-for '#dashboard.loaded' --wait-ms 1500 --clip '#chart-grid'恰好给出一个目标:--url、--dashboard、--workspace 配合 --report、--view 或 --public-url。响应包含 data.embed_url。接着运行 bi view test。
Grafana:--url 会从地址中读取 orgId、viewPanel 或 panelId、from、to、var-* 和 theme。图像通过 Grafana 的渲染服务绘制,并由所有相同尺寸的屏幕共享;Grafana 不可用时,屏幕会保留最后一张图像,并在角落显示渲染时间。公开仪表板链接直接从 Grafana 实时播放,Grafana 必须允许嵌入(在其设置中为 allow_embedding = true):bi view test 会检查这一点。
Power BI:--url 接受从 Power BI 复制的报表地址 https://app.powerbi.com/groups/WORKSPACE/reports/REPORT,可带可选的 /ReportSection 页面;或者给出 --workspace 和 --report。两个或更多页面需要 --rotate,而 --rotate 需要两个或更多页面或 --all-pages。--refresh 0 适用于会自行更新的 DirectQuery 或自动页面刷新报表。--fit 不适用。Publish to web 链接会向任何持有该链接的人显示报表,并按 Power BI 提供的方式播放,每隔 --refresh 重新加载,不进行页面轮换。
Tableau:--url 接受从 Tableau 复制的视图地址 https://HOST/t/SITE/views/WORKBOOK/VIEW、Tableau Cloud 的 https://HOST/#/site/SITE/views/WORKBOOK/VIEW,或仅 WORKBOOK/VIEW;地址必须位于连接的主机和站点上。--rotate-sheets 和 --rotate 必须同时给出。--fit 不适用。屏幕必须能够访问 Tableau 主机并接受其第三方 Cookie,并且视图的 embed_origin 必须在已连接应用的域名允许列表中。Tableau Public 可视化(--public-url https://public.tableau.com/app/profile/USER/viz/WORKBOOK/VIEW,或其 /views/ 地址)不需要连接,也不需要令牌,--rotate-sheets 对它同样适用。
Web:--url 是页面的地址,--wait-for、--wait-ms 和 --clip 只适用于 Web 视图。捕获失败时,最后一张正常的图像会保留在屏幕上,status.last_error 会说明原因:bi_web_login_failed、bi_web_otp_required、bi_web_session_expired、bi_web_login_paused、bi_web_timeout、bi_web_navigation_failed 或 bi_web_blocked。
bi view list#
列出此项目的 BI 视图,并显示其目标、频率和状态。
bi view list无参数。
screenrig bi view listdata.items 包含项目的所有视图,每个视图都带有其 embed_url。
bi view show#
查看一个视图,包括其 embed_url 以及它上次在屏幕上的表现。
bi view show <id>| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 视图(biv_…)。 |
screenrig bi view show biv_01EXAMPLEVIEW0000000000响应包含 connection_id、target(Tableau 为 view 和 rotate_sheets)、refresh_s、rotate_s、fit、status 和 embed_url。status 包含 last_ok_at 和 last_error,后者带有 code 和 detail:Grafana 拒绝令牌时为 bi_upstream_refused,无法渲染时为 bi_upstream_unavailable。
bi view update#
更改视图的名称、目标、频率或适配方式。
bi view update <id> [--name NAME] [--refresh DURATION] [--fit contain|cover|fill] [--rotate DURATION]
[--url URL | --dashboard UID | --workspace ID | --view WORKBOOK/VIEW | --public-url URL] [--report ID]
[--page NAME]... [--all-pages] [--rotate-sheets] [--panel ID] [--from TIME] [--to TIME]
[--var NAME=VALUE]... [--theme dark|light] [--timezone ZONE] [--wait-for CSS | --clear-wait-for]
[--wait-ms MS] [--clip CSS | --clear-clip] [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 视图(biv_…)。 |
--name NAME | string | 否 | 未更改 | 重命名视图。 |
--url URL | string | 否 | 未更改 | 仪表板、报表或 Tableau 视图的地址,或 Web 视图的页面地址;会替换整个目标。不能与其他目标选项一起使用。 |
--dashboard UID | string | 否 | 未更改 | Grafana:显示此仪表板;会替换整个目标。 |
--workspace ID | string | 否 | 未更改 | Power BI:显示此工作区的一份报表,配合 --report;会替换整个目标。 |
--report ID | string | 否 | 未更改 | Power BI:显示此报表,位于 --workspace 指定的工作区或当前工作区。 |
--view WORKBOOK/VIEW | string | 否 | 未更改 | Tableau:显示此视图;会替换整个目标。 |
--public-url URL | string | 否 | 未更改 | 公开链接;会替换整个目标。 |
--rotate-sheets | boolean | 否 | 关闭 | Tableau:轮换工作簿已发布的工作表,配合 --rotate。 |
--page NAME | string | 否 | 未更改 | Power BI:要显示的页面,按名称或显示名称指定。可重复;会替换当前页面。 |
--all-pages | boolean | 否 | 关闭 | Power BI:轮换显示每个可见页面。 |
--rotate DURATION | string | 否 | 未更改 | Power BI:每个页面的显示时长,10s 到 1h,或 0 表示只显示一个页面。Tableau:每个工作表的显示时长,或 0 表示停止轮换。 |
--panel ID | string | 否 | 未更改 | Grafana:只显示这一个面板。 |
--from TIME | string | 否 | 未更改 | Grafana:时间范围的开始。 |
--to TIME | string | 否 | 未更改 | Grafana:时间范围的结束。 |
--var NAME=VALUE | string | 否 | 未更改 | Grafana:设置一个仪表板变量。可重复;它只设置一个变量,其他变量保持不变。 |
--theme THEME | string | 否 | 未更改 | Grafana 主题,dark 或 light。 |
--timezone ZONE | string | 否 | 未更改 | Grafana:仪表板的时区。 |
--refresh DURATION | string | 否 | 未更改 | 图像重新绘制或报表刷新的频率:Grafana 为 30s 到 24h;Web 为 60s 到 24h;Power BI 和 Tableau 为 60s 到 24h,或 0 表示不刷新。 |
--fit FIT | string | 否 | 未更改 | Grafana 和 Web:图像填充屏幕的方式,contain、cover 或 fill。 |
--wait-for CSS | string | 否 | 未更改 | Web:页面就绪且已登录时显示的元素。不适用于 --clear-wait-for。 |
--clear-wait-for | boolean | 否 | 关闭 | Web:不再等待元素。不适用于 --wait-for。 |
--wait-ms MS | integer | 否 | 未更改 | Web:页面就绪后等待的毫秒数,0 到 10000;0 会移除等待。 |
--clip CSS | string | 否 | 未更改 | Web:要绘制的页面部分。不适用于 --clear-clip。 |
--clear-clip | boolean | 否 | 关闭 | Web:重新绘制整个页面。不适用于 --clip。 |
--expect-rev REVISION | integer | 否 | 无 | 除非视图处于此修订版本(revision_conflict,退出码 6),否则拒绝更改。 |
screenrig bi view update biv_01EXAMPLEVIEW0000000000 --wait-for '#dashboard.loaded' --wait-ms 2000
screenrig bi view update biv_01EXAMPLEVIEW0000000000 --clear-wait-for --clear-clip
screenrig bi view update biv_01EXAMPLEVIEW0000000000 --theme light --var host=web2
screenrig bi view update biv_01EXAMPLEVIEW0000000000 --dashboard def456 --panel 2 --expect-rev 3
screenrig bi view update biv_01EXAMPLEVIEW0000000000 --page Overview --page Detail --rotate 45s
screenrig bi view update biv_01EXAMPLEVIEW0000000000 --view Sales/Detail至少需要一项更改。--url、--dashboard、--workspace 和 --public-url 会替换整个目标,而 --panel、--from、--to、--var、--theme 和 --timezone 更改视图当前的 Grafana 目标,--report、--page 和 --all-pages 更改 Power BI 目标,--view 和 --rotate-sheets 更改 Tableau 目标。--page 会替换页面列表;要清除它,请再次给出 --workspace 和 --report,并加上 --rotate 0。仅 --rotate 0 就能让 Tableau 视图停止轮换其工作表。新的目标会清除状态并作废其缓存的渲染图,屏幕在下一次刷新时会采用该更改,无需重新发布。视图保留其连接和类型。
bi view test#
真正检查视图:Grafana 渲染、Power BI 嵌入令牌、Tableau 查找,或公开链接。
bi view test <id> [--output FILE [--width PIXELS] [--height PIXELS]]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 视图(biv_…)。 |
--output FILE | string | 否 | 无 | Grafana:把渲染的 PNG 保存到此处,而不是运行检查。 |
--width PIXELS | integer | 否 | 1920 | 保存图像的宽度,1 到 10000。需要 --output。 |
--height PIXELS | integer | 否 | 1080 | 保存图像的高度,1 到 10000。需要 --output。 |
screenrig bi view test biv_01EXAMPLEVIEW0000000000
screenrig bi view test biv_01EXAMPLEVIEW0000000000 --output lobby.png --width 1920 --height 1080Grafana:连接视图会真正渲染,不经过共享缓存,也不改动视图的状态。当 Grafana 拒绝令牌、没有渲染器或不认识该仪表板时,data.ok 为 false,并附带 Grafana 给出的原因;失败的测试只是数据,退出码为 0。发布前请打开保存的 PNG 查看。对于公开链接,测试会获取页面,并检查 Grafana 是否允许视图的嵌入页面以框架方式嵌入它。
Tableau:连接视图以连接用户的身份登录并查找该视图(signin、view);用户看不到的视图,或大小写错误的名称,会使 view 检查失败并指明路径。Tableau Public 视图会向 Tableau Public 询问工作簿是否存在。Power BI:连接视图会读取报表(report),并为它生成真实的仅查看嵌入令牌(embed_token);被拒绝时会显示 Power BI 自己给出的原因,例如带行级安全的数据集、401 或 403(租户设置或工作区角色),或应用看不到的报表。Publish to web 链接会被获取,并读取其嵌入框架相关的响应头。
该测试不判定图片显示的内容、视图所指定的页面、容量或 Tableau 的域名允许列表。
bi view delete#
删除视图。
bi view delete <id> [--expect-rev REVISION]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<id> | string | 是 | 无 | 视图(biv_…)。 |
--expect-rev REVISION | integer | 否 | 无 | 除非视图处于此修订版本(revision_conflict,退出码 6),否则拒绝删除。 |
screenrig bi view delete biv_01EXAMPLEVIEW0000000000
screenrig bi view delete biv_01EXAMPLEVIEW0000000000 --expect-rev 3仍显示该视图 embed_url 的屏幕会返回 not_found,直到其播放列表更改。
支持对话
每个计划,包括 Standard,都包含通过 CLI 和控制台右下角的芥末色支持按钮提供的 AI 支持,Premium、Education 和 Enterprise 还可以请求真人。对话保留历史记录。控制台突出显示未读的工作人员回复,并渲染 Markdown,包括可点击链接、列表和代码。按回车发送,Shift+回车换行。工作人员回复显示其名字和 Slack 头像,若无则显示 ScreenRIG 工作人员和 screenRIG 标志;客户使用通用头像。
使用文档和你的操作智能体诊断并解决问题。使用 feedback bug 或 feedback feature 发送报告。
support status
support submit (--body TEXT | --body-file FILE) [--conversation-id ID] [--human-requested]
support history [--before ID]
support history --conversation-id ID [--after SEQUENCE]
support follow [--conversation-id ID] [--after SEQUENCE] [--timeout MS]
support read --conversation-id ID --sequence SEQUENCE
support close --conversation-id ID从 support status 开始,它会报告 chat_allowed(此项目可开始或继续对话)、human_available(真人可按请求加入)、staffed(工作人员当前在工作时间内)和 hours(有人值守的时间)。support submit 接受一条 1–4000 字符的消息。省略 --conversation-id 以开始对话;使用返回的 data.conversation.id 进行后续。重试不确定提交时保持相同幂等键。
历史页面最多包含 100 行。传递对话页的 data.next 作为 --before 以获取较旧对话,或传递最后消息序列作为 --after 以获取较新消息。support follow 以 SSE 流式传输回复,从最后项目序列恢复并抑制重放。对话过滤器选择打印哪些回复,同时推进该项目游标。support read 确认你已阅读的员工回复序列。使用 support close 或仪表板的 结束对话 按钮结束已解决的对话。关闭时保留其历史;如需更多帮助,请开启新对话。
screenrig support submit --body "How do I assign a playlist? Here are the checks I ran."
screenrig support follow --conversation-id sc_CONVERSATION --after 0 --timeout 60000
screenrig support submit --conversation-id sc_CONVERSATION --body "Please ask a human." --human-requestedAI 助手 Luna 在所有套餐上都会立即回答。只有 Education、Premium 和 Enterprise 上,真人才会按请求加入对话(human_available),请求真人会暂停该对话中的 AI;在 Standard 和 Plus 上,该请求会被忽略,由 Luna 回答。员工工作时间为周一至周五温哥华时间 09:00–17:00,不包括 B.C 法定假日,只决定真人何时回答。请勿在支持消息中包含凭证。
反馈
错误报告和功能请求是项目范围且不可更改。类型来自命令,绝不来自正文字段,修正是新提交而非编辑。
feedback bug#
提交针对 screenRIG 的错误报告。
feedback bug <title> (--body TEXT | --body-file FILE) [--command "GROUP ACTION"] [--no-context]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<title> | string | 是 | 无 | 最多 120 个字符。 |
--body TEXT | string | 两者之一 | 无 | 内联正文,最多 4000 字符。 |
--body-file FILE | 路径 | 两者之一 | 无 | 从文件读取正文,适合多行报告。 |
--command | string | 否 | 无 | 报告所涉及的命令,仅为命令路径:最多四个小写单词,如 media upload。绝不取自你运行的命令行。 |
--no-context | boolean | 否 | 关闭 | 省略诊断封装,否则包含 CLI 版本、可选命令路径和平台信息。 |
screenrig feedback bug "Playlist stalls after assignment" --body-file ./report.md --command "screen assign"服务器拒绝而非编辑匹配凭证材料的文本,并返回字段级指导以便重写和重发。相同幂等键下的精确重试在 24 小时内返回原始提交。
feedback feature#
提交功能请求。
feedback feature <title> (--body TEXT | --body-file FILE) [--command "GROUP ACTION"] [--no-context]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
<title> | string | 是 | 无 | 最多 120 个字符。 |
--body TEXT | string | 两者之一 | 无 | 内联正文,最多 4000 字符。 |
--body-file FILE | 路径 | 两者之一 | 无 | 从文件读取正文。 |
--command | string | 否 | 无 | 请求所涉及的命令,仅为命令路径。 |
--no-context | boolean | 否 | 关闭 | 省略诊断封装。 |
screenrig feedback feature "Add a dry-run flag" --body "Preview a change first."feedback list#
列出该项目的自有提交。
feedback list [--kind bug|feature]| 参数 | 类型 | 必填 | 默认 | 备注 |
|---|---|---|---|---|
--kind | string | 否 | 两种类型,最新优先 | bug 或 feature。限制列表为一种类型。 |
screenrig feedback list --kind bug广告
在邀请你的网络中购买广告,或在你拥有的屏幕上出售广告时段。每个命令首先读取 screenrig project capabilities:购买需要 advertiser 权限,销售需要拥有的屏幕。金额以十进制 mcr(毫信用额度)字符串表示。每个标志运行 screenrig ads COMMAND --help --json。购买和销售工作流程在 开始;费率和费用在 定价。
ads networks#
买家:列出此项目被邀请加入的网络,并检查某个网络允许的库存和时段。
ads networks list
ads networks show <seller-project-id>screenrig ads networks listads network#
卖方:检查或创建本项目自有网络并设置默认费率。
ads network show
ads network create --name NAME
ads network rate --rate-mcr-per-15s MCR --expect-rev REVISIONscreenrig ads network rate --rate-mcr-per-15s 1000 --expect-rev 3费率按完成播放的每15秒计算。费率变更会暂停受影响的广告活动,直到每个买家接受新的报价。
ads inventory#
卖方:选择是否允许广告投放到自有屏幕,并向受邀买方描述该屏幕。
ads inventory list
ads inventory update <screen-id> [--enabled | --disabled] [--site-name NAME]
[--city CITY] [--region REGION] [--venue-type TYPE] [--audience-tags TOKENS]
[--placement TEXT] [--public-description TEXT]
[--rate-mcr-per-15s MCR | --clear-rate]
[--impressions-per-hour N | --clear-impressions-per-hour] [--expect-rev REVISION]screenrig ads inventory update scr_LOBBY --enabled --venue-type cafe省略的标志保持当前值。新库存行需要 --enabled 或 --disabled。--impressions-per-hour 记录您对屏幕每小时所产生展示次数的估算:每次完成的播放随后会将该估算值乘以播放秒数再除以 3600,计为 ads reports spend、ads reports delivery 和 ads direct report 中的 estimated_impressions。
ads slots#
卖方:定义可重用广告位。广告位本身不会改变屏幕内容,直到其广告位页面被放入播放列表。
ads slots list
ads slots create --name NAME --accepted-media image,video
[--max-image-duration-ms MS] [--max-video-duration-ms MS]
[--rate-mcr-per-15s MCR] [--enabled | --disabled] [--vast-tag-url URL]
ads slots update <slot-id> --expect-rev REVISION [same fields] [--clear-vast-tag-url]screenrig ads slots create --name "Lobby break" --accepted-media image,video
screenrig ads slots create --name "Lobby video" --accepted-media video --vast-tag-url https://ads.example.com/vast.xml
screenrig ads slots update ads_LOBBY --clear-vast-tag-url --expect-rev 2--vast-tag-url 设置卖方自己的 VAST 2-4 广告标签,当无邀请广告活动填充你自己的屏幕插槽时尝试;插槽必须支持视频。URL 是端口 443 或 8443 上的 HTTPS 公共主机。后端获取它,跟踪最多五个包装器,摄取选定的渐进式 MP4 或 WebM 到项目媒体,并在接受开始时触发 Impression、creativeView 和 start,接受完成时触发 complete,失败时触发 Error;无四分之一追踪器。宏 [CACHEBUSTING]、[TIMESTAMP]、[SCREENRIG_SCREEN_ID]、[SCREENRIG_SLOT_ID] 和 [SCREENRIG_PAGE_ID] 会被展开,买方永远看不到标签。update 时,--vast-tag-url 替换标签,--clear-vast-tag-url 移除标签;两者不可同时使用,省略两者则保留存储标签。ads slots list 向拥有卖方显示 vast_tag_url。
Advertising invitations#
使用上面的共享 invitations 命令:
screenrig invitations create --kind ad-buyer --email owner@bakery.example --screen-id scr_LOBBY --policy review_required
screenrig invitations list --kind ad-buyer
screenrig invitations revoke ID
被邀请者在控制台接受。已登录者选择其购买项目,并通过新的通行密钥证明确认。无登录者在接受时创建登录和仅限广告主项目。
ads memberships#
卖方:更改或撤销已承认买方的审核策略和库存范围。
ads memberships list
ads memberships update <membership-id> --expect-rev REVISION
[--policy trusted|review_required] [--screen-id IDS] [--slot-id IDS]
ads memberships revoke <membership-id>screenrig ads memberships list撤销停止新的广告播放并保留财务记录。
ads creatives#
买家:将已准备好的自有媒体绑定到带有批准文案的不可变创意。
ads creatives list
ads creatives create --media-id ID --copy TEXT
ads creatives show <creative-id>screenrig ads creatives create --media-id med_123 --copy "Fresh bread daily"ads campaigns#
买家:起草广告活动,定价,并通过接受报价激活。
ads campaigns list | show <campaign-id>
ads campaigns create <file>
ads campaigns update <campaign-id> <file> --expect-rev REVISION
ads campaigns preview <campaign-id> [--expect-rev REVISION]
ads campaigns activate <campaign-id> --quote-id ID --expect-rev REVISION
ads campaigns pause | resume <campaign-id> --expect-rev REVISION
ads campaigns accept-rates <campaign-id> --quote-id ID --expect-rev REVISIONscreenrig ads campaigns preview cmp_123草稿不保留任何内容。preview 返回限时报价且不消耗额度;activate 需要该报价。卖方费率变更后,只有带新报价的 accept-rates 可恢复广告活动。
广告活动草稿可从广告主类别列表中选择一个可选的 category。同一类别的两条广告绝不会在同一屏幕的同一广告时段中播放。
ads direct#
卖方:在您自己的屏幕上为 screenRIG 之外的广告主预订您自己的交易。
ads direct list | show <campaign-id>
ads direct create <file>
ads direct update <campaign-id> <file> --expect-rev REVISION
ads direct pause | resume | end <campaign-id> --expect-rev REVISION
ads direct availability <file>
ads direct report <campaign-id> [--from TIMESTAMP] [--to TIMESTAMP] [--format json|csv] [--output FILE|-]screenrig ads direct create campaign.json草稿指定 name、advertiser、可选的 category、flight_start 和 flight_end、media_ids(您自己已就绪的图片或视频)、可选的 goal_plays、可选的 price(按每千次播放计的 cpm 或 flat,含 amount 和 ISO 4217 currency)以及定向:screen_ids、slot_ids、venue_types、cities、tags 和 dayparts,空列表表示所有已加入的屏幕或广告位。直接广告活动先于受邀买家填充广告时段。目标在投放期内均匀分配,落后时优先播放;没有目标的广告活动会在投放期内占用每个符合条件的广告位。不会转移任何额度:由您向广告主收费,价格用于计算报告的价值。
availability 读取具有相同定向和投放期的查询,并估算您仍可预订的播放次数:所选屏幕最近的广告位出现次数,减去您其他直接目标仍需的播放次数。高于估算值的目标会返回 goal_overbooked,除非草稿设置了 "overbook": true。report 列出相对于目标的播放次数、进度、价值、未播放的次数,以及按 UTC 日期、屏幕、广告位和媒体划分的行;end 不可撤销。
ads reviews#
卖方:在 review_required 上批准、拒绝或请求买方对确切提交的创意版本进行更改。
ads reviews list
ads reviews show <review-id>
ads reviews approve <review-id>
ads reviews reject <review-id> --reason TEXT
ads reviews request-changes <review-id> --note TEXTscreenrig ads reviews request-changes arv_123 --note "Use the new logo"request-changes 会将您的备注发送给买方。要提交修订版本,请将修订后的媒体绑定为新创意素材,添加到新广告活动中,并使用新报价运行 preview 和 activate。替代广告活动拥有独立的预算和审核记录。激活替代广告活动前,请暂停原广告活动,以避免重复投放。用户在仪表板的“审核”页面决定广告创意素材的审核结果,该页面也处理播放列表和屏幕变更。
ads reports#
读取作为买方的支出或作为卖方的交付。
ads reports spend --campaign-id ID
ads reports delivery --from TIMESTAMP --to TIMESTAMP
ads reports fill [--from TIMESTAMP] [--to TIMESTAMP]screenrig ads reports delivery --from 2026-09-01T00:00:00Z --to 2026-10-01T00:00:00Z投递报告显示期间的总额、服务费和净额。买方报告永远不会显示卖方的其他收入。fill 显示最多 35 天内您的屏幕请求的广告位出现次数、其中由直接广告活动、受邀买家和您的 VAST 标签填充的次数,以及其余为何保持空白:no_demand、ineligible、separated 或 capped。
准备、发布和编辑播放列表
针对准备好的图片和视频,按播放顺序准备全屏播放列表:
screenrig playlist init med_POSTER med_VIDEO --name "Lobby loop" --screen-id scr_LOBBY --output lobby.json
screenrig playlist validate lobby.json
screenrig screen publish scr_LOBBY lobby.json
screenrig screen screenshot scr_LOBBY验证文档,发布,然后用 screen screenshot 查看真实屏幕。playlist init 接受本地图像/视频文件、准备好的 med_ ID、固定的 rel_ 应用版本和按播放顺序的 HTTP 或 HTTPS iframe URL,包括混合输入:
screenrig playlist init ./poster.png med_VIDEO rel_APP https://example.com --name Lobby --screen-id scr_LOBBY --output lobby.json本地文件通过正常媒体路径上传并等待准备完成。除非提供 --no-transcode,否则需要 ffmpeg 和 ffprobe。准备过程写入本地文档并可能上传媒体;它既不创建远程播放列表,也不分配屏幕。现有媒体必须已准备好。HTTP 和 HTTPS URL 可以包含局域网主机和嵌入的凭据,准备期间不会获取页面。Player 网页应用要求 HTTPS URL 中不包含用户名或密码。
针对可重试的文件准备,首次尝试选择 --idempotency-key,在服务器重放窗口内对相同文件和输入顺序可重复使用。每个文件实例获得独立上传密钥。无显式密钥时,新调用获得新密钥。上传的媒体在后续准备失败时仍保留;检查 media list 并在部分结果对账时重用这些 ID。
每个输入都会成为一个全屏页面,黑色背景,200 毫秒交叉淡入淡出。图片和视频使用 --fit contain|cover|fill(默认 contain)。视频静音,不循环,播放完自动切换。其他页面使用 --duration-ms(默认 8000)。应用和 iframe 使用 fill;应用发布后固定为定时切换,无控制权限。要使用应用控制切换,请编辑文档。请通过服务器和目标播放器验证发布状态和实际播放效果。发布时可以检查符合条件的公开 HTTPS iframe 页面的响应头。X-Frame-Options 或 frame-ancestors 拒绝嵌入的页面无法由 Web 播放器以及 macOS、Samsung Tizen 或 BrightSign 播放器显示。当发布检测到拒绝时,写入仍会成功:screen publish 和 playlist create|update|patch 会打印一条指明页面和原语的 iframe_framing_refused 警告,events list 会显示一条 playlist.iframe_framing_refused 警告。
提供 --screen-id 读取目标尺寸和修订。结果包含 data.screen_id、data.screen_revision 和 data.publish.argv。将此参数数组传递给打包的 screenrig 启动器,无需 shell 分割:它保留路径、配置和 API 来源。显式添加 --expect-rev 以防后续屏幕更改。目标元数据保持在创作文档之外。
要覆盖画布,请同时提供 --target-width 和 --target-height。这些也可在无屏幕时使用,此时不返回发布参数。未知或多个报告的表面需要明确尺寸。输出文件默认独占;使用 --overwrite 可原子替换现有创作文件。父目录会自动创建。带明确尺寸的 URL 和发布 ID 输入无需登录即可使用。
screen publish <screen-id> <file> 创建一个新的播放列表,并可选地分配一个 屏幕 修订保护,然后读取分配结果。不会通过名称更新现有播放列表。显示名称可重复;如需明确 playlist update,请使用播放列表 ID。其 JSON 结果会报告 playlist_id、playlist_revision、screen_id、screen_revision、assignment_verified 和 playback_verified。分配验证并不代表已播放;请单独请求并检查截图及相关播放证据。
当项目要求对智能体更改进行审核,或会话具有提议访问权限时,screen publish 在播放列表或其分配被提议后停止:stage 是 pending_review,结果同时命名两个审核,信封保持 ok: true。在有人批准之前不播放任何内容。添加 --note TEXT 告诉审核者更改内容;参见 审核。
发布自动保存私有本地日志。模糊失败后,重复相同命令和输入及配置以恢复。如果播放列表创建成功但分配失败,错误会标识已创建的播放列表。不要删除它或启动另一个创建以恢复。修订冲突需检查屏幕并调和预期分配;已创建的播放列表可用 screen assign 明确分配。发布不会静默刷新预期修订。未完成恢复在 24 小时服务器幂等窗口后停止;写入前请检查并调和。
编辑现有播放列表:
screenrig playlist show pl_EXISTING --output lobby.json
screenrig playlist update pl_EXISTING lobby.jsonplaylist show --output 写入可编辑的 {name, pages} 文档并返回其路径、playlist_id 和标准输出上的源 revision。可选传递该修订版及 --expect-rev 以保护更新。保留动态选择器、计划、动画和固定的应用发布,移除服务器派生的媒体和时间字段。注释保持独立。纯 playlist show 是检查响应;无 --output 的 --editable 返回 data.document、data.playlist_id 和 data.revision。更新播放列表影响所有分配给它的屏幕。审核中,playlist update 提议新文档,playlist show 持续返回实时版本直到人员批准。
K/V 和注释写入接受 --file - 作为 stdin。使用 playlist show ID --editable --human 作为 stdout 上可编辑文档。应用和播放列表显示名可能重复;更新时使用资源 ID。
替换一个应用版本
成功 app update 后,采取 data.application.release_id 并确定要更改的确切播放列表、页面和应用原语。预览替换内容:
screenrig playlist replace-release pl_EXISTING --page board-page --primitive board --release-id rel_NEW这是只读影响审核。请检查data.previous_release_id、data.release_id和data.affected_screens,包括归档的分配。直接使用--apply应用。要选择此影响检查,还需提供--expect-impact及预览的data.impact:
screenrig playlist replace-release pl_EXISTING --page board-page --primitive board --release-id rel_NEW --apply其他原语和设置将被保留。更新影响分配给此共享播放列表的所有屏幕;归档屏幕保留新的 PIN 以备后用。提供 --expect-impact 时,变更的替换、修订或观察到的屏幕影响需要重新预览。直接应用跳过屏幕调查;省略 affected_screens。已固定的发布成功且不写入。分配可能在快照后更改:服务器仅在提供 --expect-rev 时原子检查播放列表修订。服务器在应用时验证发布可用性和所有权。现有 PIN 保持不变直到应用;之后,验证受影响屏幕的清单修订和播放。审核中,--apply 提出新 PIN;添加 --note TEXT 给审核者。
播放列表验证、创建、更新和屏幕发布接受 - 作为输入文件以读取标准输入。JSON 封装从不写入创作文件。--expect-rev 用于保护修订。省略该标志则写入当前资源,不设修订前提。提供过时修订仍返回 revision_conflict。
生成接受 --prompt TEXT 或 --prompt-file FILE,包括 --prompt-file - 用于标准输入。文件为完整提示,无裁剪;现有的 4000 字符限制适用。提示不包含在诊断中。
保持路径简短
捆绑 CLI 使用 api.screenrig.ai;播放器使用 play.screenrig.ai;控制台位于 screenrig.ai/dashboard;发布使用 apps.screenrig.ai 下的隔离源。原生播放器包保持私有并由服务器中介。内部传输引用 仍可用于传输工具。
标记筛选器和播放批次
媒体最多携带 32 个唯一标签,每个标签由 1 到 32 个字母或数字组成。用 screenrig media update med_ID --tags Summer,Drinks 替换整个集合。--tag Summer 用一个标签替换;--clear-tag 清除所有标签。media list --tag Summer 匹配集合中任何位置的成员。标签区分大小写,且绝不用于授权。
动态选择器可使用一个 tag 或一个 tags 过滤对象:
{
"by": "tag",
"tags": { "all": ["Summer", "Drinks"], "any": ["Lobby", "Patio"], "none": ["Expired"] },
"order": "random",
"one_at_a_time": false,
"batch_size": 3
}
all 需要所有列出的标签,any 至少需要一个,none 排除任何列出的标签。存在的组用 AND 连接;省略的组不施加条件。至少提供一个非空组。每组最多接受 32 个唯一标签。tag 和 tags 互斥。仅 none 过滤器选择该原语的所有就绪媒体,除排除标签外。图像选择器选择图像,视频选择器选择视频。
候选池每个选择器最多包含 1,024 个准备好的媒体,整个循环快照中有 1,024 个媒体引用。匹配数量过大将返回错误;请缩小筛选条件。batch_size 是每次页面访问 1–1,024 项的单独限制。在 media_end 页面上,one_at_a_time: false 按顺序播放下一批;省略 batch_size 则播放剩余批次。one_at_a_time: true 每次出现播放一项,仅允许省略批量大小或 batch_size: 1。持续时间、应用和 audio_end 页面需要 one_at_a_time: true。media_end 上的图像也需要 dwell_ms;该页面上的视频不能循环。
播放器在播放列表启动和每个循环边界时,一次请求解析所有动态媒体原语。循环期间成员冻结。上传、移除、标签变更和可用时段边界不重新生成清单。下次刷新时,移除或新排除项离开待处理队列;新匹配项在当前轮次结束时加入。最终批次可能少于请求数;不会从下一轮补充。文件名排序按文件名再媒体 ID。随机排序每轮完整播放洗牌一次,保持循环刷新间剩余顺序。加权排序遵循其权重,见下文。光标本地于屏幕、播放列表、页面和原语,重启持续,过滤、排序或批次策略变更时重置。离线播放使用最后成功快照。空匹配跳过原语及任何空页面。
将上面的选择器对象保存为 selector.json,然后在发布前检查其当前候选目录:
screenrig media selector-preview selector.json --primitive video
预览返回 matched_count,按文件名排序的 candidates(包含媒体 ID 和标签),以及规范化的 selector 策略。随机顺序显示池和洗牌策略;不选择播放器的洗牌,不推进光标,不创建播放授权,也不更改清单。加权顺序下,它会返回每个候选项的 weight 和 share_percent,以及 cycle。--rect WxH(API 为 rect: {width, height})是版位的尺寸,与 fit: "aspect" 一起使用时必填;被排除的匹配项列在 excluded 中,原因为 aspect_mismatch。图像选择器传入 --primitive image。API 与 POST /api/selectors/preview 结合 { "primitive": "video", "selector": ... } 使用。它使用经过身份验证的项目和与播放相同的匹配规则。预览后的目录更改将在播放的下一个循环边界解决。
静态包导出将动态匹配冻结为精确 ID。它保留一次或完整播放;使用带有 batch_size 和 one_at_a_time: false 的有界运行时序列时,需要在导出前移除该字段或选择明确的 ID。这防止在静态包中静默丢失运行时批次游标。
加权轮换和宽高比适配
order: "weighted" 按权重轮换一个版位的素材,使每个赞助商保持其播放占比。weights 将媒体 ID(med_...)或 tag:NAME 映射为 1 到 1,000 的整数,最多 64 个键。它适用于 by 为 all、tag 或 folder 时:
{
"by": "all",
"order": "weighted",
"one_at_a_time": true,
"weights": { "tag:Acme": 50, "tag:Globex": 30, "tag:Initech": 20 },
"fit": "aspect"
}
权重 50、30 和 20 在每个周期中恰好交付每 10 次播放中的 5、3 和 2 次,重启后从周期中途继续。条目的权重是其媒体 ID 键(若存在);否则取它所带标签中按字母顺序第一个 tag:NAME 键,在所选条目中带有该键的条目之间平均分配,因此无论赞助商有多少素材,其占比都保持不变;否则该条目自成一组,权重为 1。一个周期最多 4,096 次播放;仅当精确比例需要更长周期时,占比才会按其取整。
加权顺序每次访问播放一个条目,因此请设置 one_at_a_time: true 或 batch_size: 1。加权顺序必须提供 weights,且仅允许与其一起使用;否则写入返回 invalid_request。Web、Android、Apple、Windows 和 Linux 播放器自声明 selector.weighted 主机能力的版本起实现加权顺序。较旧的播放器将该选择器按随机顺序播放,清单诊断中带有 selector_order_downgraded。
动态选择器上的 fit: "aspect" 只保留宽高比与版位矩形(包括视频墙或显示器边框)的宽高比相差在 5% 以内的文件,在选择器解析时读取。竖屏版位不会播放横屏文件。无需更改播放器。
screenrig media selector-preview 会输出每个加权或按宽高比筛选的选择器的预期占比,控制台的页面编辑器也在检查器中显示同一张表。静态包导出将加权选择器冻结为按文件名排序的精确 ID,不保留权重。
标签选择器中的屏幕令牌
标签选择器的 tag,以及其 tags 过滤器的每个条目,可以是 {screen.field.NAME} 或 {screen.id}(不带 scr_ 前缀的屏幕标识符,它本身就是标签)。服务器在构建每块屏幕的清单和选择器快照时为其填充令牌,因此一个播放列表即可播放每块屏幕各自的媒体。为媒体打上 Lobby 或 Garage 标签,用 screenrig screen update scr_ID --field zone=Lobby 设置每块屏幕的字段,然后为版位指定这个选择器:
{ "by": "tag", "tag": "{screen.field.zone}", "one_at_a_time": true }
填充后的值遵循标签规则:1 到 32 个字母或数字。没有该字段、或字段值不是标签的屏幕不选择任何内容:它不会播放该版位中的任何文件,清单诊断中带有 screen_fact_missing 或 screen_fact_invalid。更改字段会为该屏幕重新生成清单。带令牌的选择器无法预览(media selector-preview 需要具体标签),也无法被 playlist export 冻结。
iframe 地址和应用参数中的屏幕令牌
iframe 的 src 和 fallback_src 可在 http 或 https 地址的路径、查询或片段中携带屏幕令牌,application 原语的可选 params 也可以:最多 16 个名称,每个由 1 到 32 个小写字母、数字或下划线组成(ticket 和 policy 为保留名称),值最多 512 个字符。服务器会为每个屏幕填入:
| 令牌 | 值 |
|---|---|
{screen.id} | 屏幕的标识符,不含其 scr_ 前缀。 |
{screen.name} | 屏幕的名称。 |
{screen.timezone} | 屏幕已存储的 IANA 时区。 |
{screen.field.NAME} | 屏幕的字段 NAME,由 1 到 32 个小写字母、数字或下划线组成。 |
{screen.location.lat}, {screen.location.lon} | 其位置,以十进制度数表示。 |
{screen.location.name}, {screen.location.address} | 其地名和街道地址。 |
{
"primitive": "iframe",
"src": "https://maps.example.com/directory?kiosk={screen.field.kiosk_id}&level={screen.field.level}",
"title": "Directory"
}
写入时按原样存储模板,包括花括号。每个屏幕的清单携带其自己的地址,每个值都按其在 URL 中的位置进行百分号编码:kiosk_id 为 B 2&3 会变成 B%202%263。位于协议、凭据、主机或端口,或 YouTube 链接、Google 或 Microsoft 文档链接或 BI 视图地址中的令牌,在 src(或 fallback_src)处为 invalid_request。含模板的 src 在发布时跳过嵌入检查,预览则按原样显示模板。
缺少某个值(未设置的字段、无位置),或其值填入后得到超过 2048 个字符的地址,或路径段为 . 或 .. 的屏幕,不会获得此类 iframe 或应用,其清单诊断携带 screen_fact_missing 或 screen_fact_invalid;留空的页面会被丢弃。每个作用于此类屏幕的写入(播放列表写入、screen assign、screen update、机群分配、已批准的审核)都会返回 screen_fact_missing 警告,其中列出令牌、前 20 个屏幕 id 及总数。更改字段或位置会重新生成其所影响屏幕的清单。
对于应用,每个填入的参数会在 ticket 之后以百分号编码追加到启动地址,合计最多 4096 个字符,因此应用从 location.search 读取它们(SDK)。启动参数会到达 Player 网页应用及运行它的播放器(Samsung Tizen、BrightSign、LG webOS 和 Vega);Qt、Android、Apple 和 Windows 播放器从本地包加载应用,不发送任何参数。模板的 url 字段可以是整个 iframe src,其值本身也可携带屏幕令牌,在构建清单时填入。标签选择器以同样方式使用 {screen.id} 和 {screen.field.NAME}(见上文)。卡片保留自己的 {screen.…} 令牌。
媒体可用性
screenrig media availability med_ID --file rule.json 设置动态选择器(all、tag 和 folder)何时可以选取某个文件。--clear 移除规则,--expect-rev N 保护媒体修订版本。API 为 PATCH /api/media/{id}/availability,使用 If-Match 和 { "availability": {...} | null }。设置规则需要 Manage 访问权限;Propose 凭据会收到 insufficient_access。
规则采用排程的时钟语法,按每块屏幕的时区解读,至少包含一个成员:from 和 until(民用时间 YYYY-MM-DDTHH:MM,until 不含),windows(每周 {days, start, end}),monthly({day} 或 {nth, weekday},各自带可选的 start 和 end),dates({date, start, end})以及 except(移除某次出现的日期,包括跨午夜的尾段)。它没有 data 或 interaction。赞助商在长周末的素材,仅在时段内的工作日晚间可用:
{
"from": "2026-11-27T00:00",
"until": "2026-11-30T23:59",
"windows": [{ "days": ["mon", "tue", "wed", "thu", "fri"], "start": "17:00", "end": "22:00" }]
}
只有选择器会读取该规则:显式的 id 或 ids 选择器会忽略它,卡片的媒体引用、配乐音频和广告素材同样不受影响。文件会在每块屏幕的下一个播放列表循环离开或重新进入选择,在边界后约一分钟内生效。播放列表和清单的修订版本都不会变化,离线的播放器会保留其上一次的选择,直到重新连接。screenrig media selector-preview --timezone ZONE(默认 UTC)会在 excluded 中列出此刻处于规则之外的文件,原因为 outside_window。
评论
评论是智能体附加到屏幕、播放列表或播放列表页面的 JSON 对象。该对象的 UTF-8 压缩体积最多 1 KiB,且值必须是对象。screenRIG 从不读取、不发送给播放器,也不作为授权处理。它不出现在运行时清单中,也不增加修订版本,因此这些命令不需要
--expect-rev:最后写入获胜。comment show#读取屏幕、播放列表或播放列表页面上的评论对象。
<id>scr_或pl_ID,匹配目标词。--page PAGE_ID未设置的评论显示为
{ "comments": null }。screen show和playlist show在服务器发送时包含comments。comment set#写入评论对象。
<id>scr_或pl_ID。--json-value JSON--file FILE--page PAGE_ID播放列表创建和更新不能设置评论;这正是这些命令的用途。
comment delete#移除评论对象。
<id>scr_或pl_ID。--page PAGE_ID