Multimedia
Un objeto multimedia es una imagen fija, un clip o una pista de audio MP3, almacenado como exactamente una versión. No hay alternativa por dispositivo, así que cada pantalla tiene que decodificar lo que guarde media upload.
Las carpetas multimedia organizan la biblioteca. Un ID de carpeta comienza con mfd_ y un ID de archivo con med_. Una carga llega a la raíz de la biblioteca a menos que --folder nombre una carpeta, media move y media folder update reorganicen el árbol, y un selector de lista de reproducción by:folder reproduce los archivos directamente dentro de una carpeta, no los de sus subcarpetas. Una organización contiene como máximo 1000 carpetas en todos sus proyectos, anidadas hasta 10 niveles, con nombres de 1 a 100 caracteres.
Un contenido multimedia conserva su ID cuando cambia su archivo: media replace reemplaza el archivo en el sitio, de modo que cada lista de reproducción y programación que lo usa reproduce el nuevo, y media versions enumera todos los archivos que ha tenido el elemento.
media upload#
Convierta un archivo local a bytes de entrega, cárguelo y espere hasta que el objeto esté listo.
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]| Parámetro | Tipo | Requerido | Predeterminado | Notas |
|---|---|---|---|---|
<file> | ruta | sí | ninguno | La imagen fija, clip o pista de audio fuente. El nombre del archivo se convierte en el identificador humano en listados, listas de reproducción e informes de reproducción, así que nómbrelo según lo que muestra. |
--content-type TYPE | string | no | el tipo de la extensión del archivo | Declare el tipo de medio de la fuente para un archivo cuya extensión no lo indica. Un tipo que no coincide con los bytes del archivo se rechaza (usage_error, salida 2) antes de cualquier conversión. |
--tag TAG | string | no | ninguno | De uno a 32 letras o dígitos, que coinciden con ^[A-Za-z0-9]{1,32}$. Se rechazan los guiones. Una etiqueta es lo que hace que media list --tag TAG sea un mapa confiable de nombre de archivo a id. |
--folder ID | string | no | raíz de la biblioteca | Una carpeta de medios mfd_ existente, verificada antes de comenzar cualquier trabajo. El archivo llega a ella cuando está listo, nada se mueve después, y data.folder_id la reporta. Funciona con --no-wait. Un usuario de carga debe nombrar una de sus carpetas; vea Usuarios de carga. |
--no-wait | boolean | no | apagado | Devolver tan pronto como se acepte el compromiso. El objeto aún no está listo; termine con operations wait. |
--poll-ms MS | integer | no | 1000 | Intervalo entre sondeos de operación mientras espera. |
--timeout MS | integer | no | 120000 | Fecha límite para la espera. También limita cada solicitud subyacente. |
--no-transcode | boolean | no | apagado | Suba los bytes de origen sin cambios. ffmpeg, ffprobe y cwebp no se ejecutan. El archivo ya debe ser un PNG, JPEG, WebP, GIF, MP4, WebM o MP3, y WebP sin pérdida sigue siendo rechazado. No se puede combinar con --codec, --max-fps, --max-edge, --webp-quality, --preset ni --no-audio. |
--codec | string | no | h264 | h264 o hevc. Use hevc solo cuando todas las pantallas que reproducirán el clip sean Player nativos. |
--max-fps N | number | no | 30 | Velocidad de fotogramas de salida constante. Cada video se codifica exactamente a esta velocidad sin importar su velocidad de origen, por lo que los clips consecutivos nunca cambian la velocidad. Mayor que 0 y como máximo 240. |
--max-edge PIXELS | integer | no | 3840 | Límite aplicado a cada borde, de 16 a 3840. Se preserva la relación de aspecto y una fuente más pequeña nunca se escala hacia arriba. |
--webp-quality | integer | no | 90 | Calidad de imagen fija para la codificación WebP, de 1 a 100. |
--preset | string | no | no establecido | signage-1080p30 o signage-4k30. Tamaño de video consciente de la orientación y 30 fps constantes. --max-edge y --max-fps pueden ajustar un preajuste pero no ampliarlo. Solo video; no se puede combinar con --no-transcode. |
--no-audio | boolean | no | apagado | Omitir la pista de audio en la entrega de video. Solo video; no se puede combinar con --no-transcode. |
--no-progress | boolean | no | apagado | No emitir salida de progreso. El progreso siempre se envía a stderr; stdout queda reservado para el único sobre de resultado. |
screenrig media upload ./lobby-welcome-loop.mp4 --tag LobbyLoopEl vídeo se convierte en MP4: perfil High H.264 en nivel 4.2, 5.1 o 5.2, el más bajo que se ajuste al tamaño y la frecuencia, o perfil Main H.265 en nivel 5.1 o 5.2 con --codec hevc, en yuv420p etiquetado Rec. 709, con un máximo de 3840 por 2160 píxeles por fotograma. Una fuente HDR se mapea a tono Rec. 709. El audio, si la fuente lo tiene, es AAC a 192 kbit/s, 48 kHz, estéreo.
Las imágenes fijas se convierten en WebP con pérdida a calidad 90, manteniendo el canal alfa donde la fuente lo tiene. Una fuente animada se repite indefinidamente. Un WebP que ya cumple con el límite de tamaño se pasa sin recodificar.
El audio se convierte en un MP3 para la banda sonora de la lista de reproducción. Una fuente MP3 se sube sin cambios; fuentes WAV, AAC, M4A, OGG y FLAC se convierten a MP3 de 128 kb/s, que requiere una compilación ffmpeg con libmp3lame. Una pista dura de 1 segundo a 3 horas. playlist init convierte entradas de audio en pistas de banda sonora en lugar de páginas. El objeto listo es un objeto multimedia audio con duración. No puede colocarse en una página; en la lista de reproducción, nómbrelo como banda sonora audio.
El id del objeto listo es data.media_id. El mismo valor es data.id y data.operation.result.media_id. Ese id es lo que toma un selector de lista de reproducción.
Un medio listo con los mismos bytes, nombre de archivo y etiqueta se devuelve en lugar de subirse de nuevo (data.reused es true), por lo que repetir una subida interrumpida devuelve su ID de medio. data.timing informa los milisegundos por etapa: prepare_ms (conversión y hash), declare_ms, transfer_ms, commit_ms y processing_ms (hasta que está listo, tan fino como --poll-ms; ausente con --no-wait).
Un nombre de archivo con poca información como video.mp4 añade una advertencia generic_filename al sobre. La carga aún tiene éxito y la CLI nunca renombra el archivo; elija el nombre antes de ejecutar el comando.
La conversión ejecuta ffmpeg y ffprobe desde PATH, o desde las rutas absolutas en SCREENRIG_FFMPEG y SCREENRIG_FFPROBE. Las imágenes fijas prefieren el codificador ffmpeg libwebp y recurren a cwebp en PATH o SCREENRIG_CWEBP. Ejecute doctor antes de la primera carga de una sesión.
--preset signage-1080p30 limita el borde largo a 1920, el borde corto a 1080 y la tasa a 30 fps constante. signage-4k30 limita el borde largo a 3840, el borde corto a 2160 y la tasa a 30 fps constante. Ambos funcionan con contenido horizontal, vertical y cuadrado. --no-audio omite la codificación de audio para clips silenciosos. Estas opciones solo se aplican a video.
screenrig media upload ./lobby.mov --preset signage-1080p30 --no-audioscreenrig media upload ./menu.png --folder mfd_01EXAMPLEFOLDER000000000media upload-batch --folder coloca cada elemento subido en la carpeta de la misma manera.
Una imagen o un vídeo puede tener hasta 16383 píxeles de ancho o de alto y 67 108 864 píxeles (8192 por 8192) en un fotograma; uno mayor se rechaza con invalid_request. La conversión por defecto ajusta cada lado a 3840 píxeles, así que suba un máster ultraancho como 9216 por 2160 o 12000 por 540 con --no-transcode. Una subida de vídeo puede ser como máximo el vídeo más grande que permite el plan del proyecto, que project capabilities informa como media_video_bytes (vea Precios); un vídeo mayor se rechaza antes de leerlo, así que recorte primero el clip. La CLI codifica el vídeo con una calidad fija, por lo que un vídeo largo aún puede superar el límite tras la codificación y entonces se rechaza; con --no-transcode, el propio archivo debe cumplir el límite.
Una transferencia al almacenamiento que se interrumpe se intenta hasta 4 veces mientras su URL de subida sea válida. Si sigue fallando, el error nombra el operation_id de la subida y esta se cancela para no ocupar almacenamiento; con --idempotency-key se conserva para la repetición. Ejecute de nuevo el mismo comando.
Con acceso Proponer, o cuando el proyecto requiere revisión para cambios de agente, una nueva carga espera la revisión de una persona antes de que una etiqueta, carpeta o selector all la reproduzca; vea Revisiones.
media upload-batch#
Suba muchos archivos locales desde un manifiesto, reanudando desde un archivo de estado.
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]| Parámetro | Tipo | Requerido | Predeterminado | Notas |
|---|---|---|---|---|
<manifest.json> | ruta | sí | ninguno | { "items": [ { "path": "./a.png", "tag"?: "Lobby", "content_type"?: "image/png" } ] } con 1 a 1000 elementos. Las rutas son relativas al archivo manifiesto. |
--state FILE | ruta | no | archivo privado junto a la configuración | Un archivo JSON 0600 indexado por el SHA-256 de los bytes locales de cada archivo fuente; por defecto, un archivo por proyecto, dirección de API y manifiesto. Los elementos ya presentes con un media_id se reportan como resumed. No comparta un archivo de estado entre proyectos. |
--concurrency N | integer | no | 4 | Subidas paralelas, de 1 a 8. |
--no-transcode | boolean | no | apagado | Suba los bytes de origen sin cambios, como hace media upload. No se puede combinar con --codec, --max-fps, --max-edge, --webp-quality, --preset ni --no-audio. |
--poll-ms MS | integer | no | 1000 | Intervalo entre sondeos de operación mientras espera. |
--timeout MS | integer | no | 120000 | Fecha límite para la espera. También limita cada solicitud subyacente. |
--codec | string | no | h264 | h264 o hevc. Use hevc solo cuando todas las pantallas que reproducirán el clip sean Player nativos. |
--max-fps N | number | no | 30 | Velocidad de fotogramas de salida constante. Cada video se codifica exactamente a esta velocidad sin importar su velocidad de origen, por lo que los clips consecutivos nunca cambian la velocidad. Mayor que 0 y como máximo 240. |
--max-edge PIXELS | integer | no | 3840 | Límite aplicado a cada borde, de 16 a 3840. Se preserva la relación de aspecto y una fuente más pequeña nunca se escala hacia arriba. |
--webp-quality | integer | no | 90 | Calidad de imagen fija para la codificación WebP, de 1 a 100. |
--preset | string | no | no establecido | signage-1080p30 o signage-4k30. Tamaño de video consciente de la orientación y 30 fps constantes. --max-edge y --max-fps pueden ajustar un preajuste pero no ampliarlo. Solo video; no se puede combinar con --no-transcode. |
--no-audio | boolean | no | apagado | Omitir la pista de audio en la entrega de video. Solo video; no se puede combinar con --no-transcode. |
--tag TAG | string | no | ninguno | Aplicado cuando un elemento omite su propia etiqueta. |
--folder ID | string | no | raíz de la biblioteca | Una carpeta de medios mfd_ existente, verificada antes de comenzar cualquier trabajo. Cada elemento llega a ella cuando está listo, y data.folder_id la reporta. Un usuario de carga debe nombrar una de sus carpetas. |
--no-progress | boolean | no | apagado | No emitir salida de progreso. |
screenrig media upload-batch ./images.json --state ./upload-state.jsonEl sobre lleva data.items[] en orden de manifiesto, cada uno con path, source_filename, sha256, outcome (accepted o resumed), y media_id. data.failed[] lleva elementos que no se entregaron, cada uno con su path y su problem; data.accepted, data.resumed, data.attempts, data.rate_limited, data.wait_ms y data.transfer_ms cuentan la ejecución. Un elemento se intenta hasta 8 veces, con espera entre intentos, mientras la respuesta sea un límite de tasa o un error del servidor.
Si hay fallos, el código de salida sigue al último elemento fallido: 7 para un límite de tasa, 9 para un error del servidor, 2 para un error de uso, y en otro caso 8. Ejecute de nuevo el mismo comando con el mismo manifiesto para subir solo lo que no llegó.
media replace#
Reemplazar el archivo de un contenido multimedia en el sitio. Su ID, sus listas de reproducción y sus programaciones siguen funcionando.
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]| Parámetro | Tipo | Requerido | Predeterminado | Notas |
|---|---|---|---|---|
<id> | string | sí | ninguno | El id de objeto med_. |
<file> | ruta | sí | ninguno | La nueva imagen, clip o pista de audio. Debe ser del mismo tipo que el contenido multimedia: imagen por imagen, vídeo por vídeo, audio por audio. Se comprueba antes de que empiece cualquier trabajo (usage_error, código de salida 2). |
--expect-rev REVISION | string | no | ninguno | Precondición de revisión opcional. Un valor obsoleto suministrado es revision_conflict y la carga declarada se cancela: lea media show ID y ejecute de nuevo el comando. |
--note TEXT | string | no | ninguno | Se conserva con la nueva versión y se muestra a la persona que la revisa. Como máximo 280 caracteres. |
--content-type TYPE | string | no | detectado a partir de los bytes subidos | Declare usted mismo el tipo de contenido en lugar de dejar que la CLI lo detecte. |
--no-wait | boolean | no | apagado | Devolver tan pronto como se acepte el reemplazo. El archivo nuevo aún no está en uso; termine con operations wait. |
--poll-ms MS | integer | no | 1000 | Intervalo entre sondeos de operación mientras espera. |
--timeout MS | integer | no | 120000 | Fecha límite para la espera. También limita cada solicitud subyacente. |
--no-transcode | boolean | no | apagado | Suba los bytes de origen sin cambios. ffmpeg, ffprobe y cwebp no se ejecutan. El archivo ya debe ser un PNG, JPEG, WebP, GIF, MP4, WebM o MP3, y WebP sin pérdida sigue siendo rechazado. No se puede combinar con --codec, --max-fps, --max-edge, --webp-quality, --preset ni --no-audio. |
--codec | string | no | h264 | h264 o hevc. Use hevc solo cuando todas las pantallas que reproducirán el clip sean Player nativos. |
--max-fps N | number | no | 30 | Velocidad de fotogramas de salida constante. Cada video se codifica exactamente a esta velocidad sin importar su velocidad de origen, por lo que los clips consecutivos nunca cambian la velocidad. Mayor que 0 y como máximo 240. |
--max-edge PIXELS | integer | no | 3840 | Límite aplicado a cada borde, de 16 a 3840. Se preserva la relación de aspecto y una fuente más pequeña nunca se escala hacia arriba. |
--webp-quality | integer | no | 90 | Calidad de imagen fija para la codificación WebP, de 1 a 100. |
--preset | string | no | no establecido | signage-1080p30 o signage-4k30. Tamaño de video consciente de la orientación y 30 fps constantes. --max-edge y --max-fps pueden ajustar un preajuste pero no ampliarlo. Solo video; no se puede combinar con --no-transcode. |
--no-audio | boolean | no | apagado | Omitir la pista de audio en la entrega de video. Solo video; no se puede combinar con --no-transcode. |
--no-progress | boolean | no | apagado | No emitir salida de progreso. El progreso siempre se envía a stderr; stdout queda reservado para el único sobre de resultado. |
screenrig media replace med_01EXAMPLEIMAGE0000000000 ./menu-v2.png
screenrig media replace med_01EXAMPLEVIDEO0000000000 ./intro.mp4 --expect-rev 3 --note "Spring cut"El archivo conserva su ID, sus etiquetas y su carpeta, así que cada lista de reproducción y programación que lo nombra reproduce el archivo nuevo en el siguiente manifiesto, y los selectores por etiqueta, carpeta y all también lo recogen. No se reprograma nada. El comando ejecuta los mismos pasos que media upload (conversión, el límite de bytes de video del plan, los límites de dimensiones, el límite de almacenamiento del plan, la transferencia firmada) y luego reemplaza en lugar de añadir un archivo nuevo. No acepta --tag ni --folder.
De forma predeterminada el comando espera al procesamiento. data.media_id y data.id son el ID del contenido multimedia, data.version es el número del nuevo archivo en media versions, y data.revision es la nueva revisión del contenido multimedia. data.warnings, data.operation, data.upload, data.transcode y la temporización se informan como en media upload, y el ID de la operación está en el sobre. Con --no-wait, data.operation es la operación aceptada, y data.version y data.warnings no aparecen.
Se permite un cambio de relación de aspecto. El sobre incluye una advertencia aspect_ratio_changed, y data.warnings[].playlists nombra las listas de reproducción que usan el contenido multimedia, así que compruebe cómo se ven. Un archivo con los mismos bytes que el actual se rechaza con resource_conflict (código de salida 13).
Cada archivo anterior permanece en el historial del contenido multimedia y cuenta en los bytes almacenados hasta que se elimine su versión; vea media versions.
Con acceso Propose, o cuando el proyecto requiere revisión para los cambios de agente, el reemplazo espera a una persona y el comando tiene éxito (código de salida 0): data.status es pending_review, data.review_id nombra la revisión, la advertencia pending_review da su URL y data.next es screenrig reviews show ID. El contenido multimedia sigue reproduciendo su archivo actual hasta que una persona apruebe, así que dígale que está esperando y no repita la escritura. Un reemplazo más reciente del mismo contenido multimedia sustituye al que espera. Vea Revisiones.
media versions#
Enumera los archivos que ha tenido un contenido multimedia, con el archivo en uso primero.
media versions <id> [--limit N] [--cursor CURSOR]| Parámetro | Tipo | Requerido | Predeterminado | Notas |
|---|---|---|---|---|
<id> | string | sí | ninguno | El id de objeto med_. |
--limit N | integer | no | cada página | Leer una página de esta cantidad de versiones, de 1 a 100. |
--cursor CURSOR | string | no | ninguno | Leer la página que sigue al data.next_cursor de la página anterior. |
screenrig media versions med_01EXAMPLEIMAGE0000000000data.items tiene una entrada por cada archivo que ha tenido el contenido multimedia: number, current, filename, source_filename, content_type, sha256, bytes, width, height, duration_ms, codecs, source (upload, replace, sync o restore), note, by (tipo person, agent, client o sync, con ID y nombre), restored_from y created_at. El archivo en uso va primero (current: true), después los demás del más reciente al más antiguo. La versión 1 es la primera carga; cada reemplazo, restauración o cambio de sincronización de multimedia añade el número siguiente.
Sin --limit ni --cursor se leen todas las páginas y data.next_cursor es null. Con cualquiera de los dos, se lee una página: mientras data.next_cursor sea una cadena, ejecute de nuevo el comando con --cursor establecido en ese valor. Basta con acceso de solo lectura. Los bytes de una versión anterior siguen almacenados y cuentan en los bytes almacenados del proyecto hasta que media version delete los elimine; no hay límite en cuántas versiones se conservan, y los bytes almacenados por encima del almacenamiento gratuito del plan se facturan como cualquier otro almacenamiento.
media restore#
Volver a poner en uso una versión anterior como nueva versión.
media restore <id> --number N [--expect-rev REVISION] [--note TEXT]| Parámetro | Tipo | Requerido | Predeterminado | Notas |
|---|---|---|---|---|
<id> | string | sí | ninguno | El id de objeto med_. |
--number N | integer | sí | ninguno | El número de la versión que se va a volver a poner en uso, tal como lo enumera media versions. |
--expect-rev REVISION | string | no | ninguno | Precondición de revisión opcional. Un valor obsoleto suministrado es revision_conflict: lea media show ID y ejecute de nuevo el comando. |
--note TEXT | string | no | ninguno | Se conserva con la nueva versión y se muestra a la persona que la revisa. Como máximo 280 caracteres. |
screenrig media restore med_01EXAMPLEIMAGE0000000000 --number 2
screenrig media restore med_01EXAMPLEIMAGE0000000000 --number 2 --expect-rev 5 --note "Back to the winter menu"El contenido multimedia conserva su ID y pasa a una nueva revisión, y cada lista de reproducción y programación que lo nombra vuelve a reproducir ese archivo. La versión que copia permanece en el historial y comparte sus bytes; la nueva versión cuenta en los bytes almacenados como cualquier otra. data.media es el contenido multimedia y data.warnings incluye aspect_ratio_changed, que nombra las listas de reproducción que usan el contenido multimedia, cuando el archivo restaurado tiene otra relación de aspecto.
La versión en uso no se puede restaurar (resource_conflict, código de salida 5), y una versión desconocida es not_found (código de salida 4). Con acceso Propose, o cuando el proyecto requiere revisión para los cambios de agente, la restauración espera a una persona y el comando tiene éxito (código de salida 0): data.status es pending_review con data.review, la advertencia pending_review da su URL y data.next es screenrig reviews show ID. El contenido multimedia sigue reproduciendo su archivo actual hasta que una persona apruebe, así que no repita la escritura.
media version delete#
Eliminar una versión anterior y sus bytes almacenados.
media version delete <id> --number N| Parámetro | Tipo | Requerido | Predeterminado | Notas |
|---|---|---|---|---|
<id> | string | sí | ninguno | El id de objeto med_. |
--number N | integer | sí | ninguno | El número de la versión que se va a eliminar, tal como lo enumera media versions. |
screenrig media version delete med_01EXAMPLEIMAGE0000000000 --number 2El registro de la versión desaparece y sus bytes salen de inmediato de los bytes almacenados del proyecto. El objeto almacenado se elimina tras 24 horas, salvo que otra versión o el archivo en uso contenga el mismo archivo. Una versión eliminada no se puede restaurar. La versión en uso no se puede eliminar, y ninguna versión se puede eliminar mientras un reemplazo del contenido multimedia espera revisión; ambos casos son resource_conflict (código de salida 5), y media versions ID muestra qué versión está en uso. Una versión desconocida es not_found (código de salida 4). Eliminar requiere acceso Manage: una credencial Propose se rechaza con insufficient_access, y la eliminación nunca se propone para revisión.
media show#
Lea un objeto multimedia, incluida su revisión actual.
media show <id>| Parámetro | Tipo | Requerido | Predeterminado | Notas |
|---|---|---|---|---|
<id> | string | sí | ninguno | El id de objeto med_. |
screenrig media show med_01EXAMPLEIMAGE0000000000media download#
Escriba una versión almacenada en disco para inspección. Nunca imprima los bytes.
media download <id> [--output FILE]| Parámetro | Tipo | Requerido | Predeterminado | Notas |
|---|---|---|---|---|
<id> | string | sí | ninguno | El id de objeto med_. |
--output FILE | ruta | no | ./<id>.<ext> en el directorio actual | Una ruta de archivo, no un directorio. Un archivo existente se sobrescribe. La extensión sigue al tipo de contenido. |
screenrig media download med_01EXAMPLEIMAGE0000000000 --output ./lobby.webpLa respuesta informa media_id, path, bytes, sha256, content_type, primitive, filename, source_filename opcional y width / height. Nunca incluye píxeles. Úsela para revisar una imagen antes de que llegue a la pantalla.
media list#
Listar objetos multimedia, opcionalmente filtrados por etiqueta, primitivo y carpeta.
media list [--tag TAG] [--primitive image|video|audio] [--folder ID|root] [--library]| Parámetro | Tipo | Requerido | Predeterminado | Notas |
|---|---|---|---|---|
--tag TAG | string | no | ninguno | Coincidir ^[A-Za-z0-9]{1,32}$. Los objetos sin etiqueta se omiten siempre que este filtro esté presente. |
--primitive | string | no | todo | image, video o audio. Restringe la lista a imágenes fijas, clips o pistas de banda sonora. |
--folder ID|root | string | no | cada carpeta | Solo archivos directamente dentro de esta carpeta mfd_, no sus subcarpetas, o con root solo archivos en la raíz de la biblioteca. La API aplica el filtro. |
--library | boolean | no | apagado | Enumera en su lugar los medios de la Biblioteca de la organización, en solo lectura: las filas llevan library: true. Use sus ID en las páginas de la lista de reproducción; cámbielos solo en el proyecto Biblioteca. |
screenrig media list --tag LobbyLoop --primitive video
screenrig media list --folder mfd_01EXAMPLEFOLDER000000000
screenrig media list --libraryCada fila lleva folder_id, que está ausente en la raíz de la biblioteca.
media selector-preview#
Previsualizar qué archivos listos coinciden ahora con un selector dinámico de medios, sin publicar una lista de reproducción ni avanzar un Player.
media selector-preview <selector.json> --primitive image|video [--rect WxH] [--timezone IANA]| Parámetro | Tipo | Requerido | Predeterminado | Notas |
|---|---|---|---|---|
<selector.json> | ruta | sí | ninguno | Un archivo JSON con un selector de medios all, tag o folder, o - para stdin. Una etiqueta con un token de pantalla no puede previsualizarse. |
--primitive | string | sí | ninguno | image o video: el tipo de archivo que coincide con el selector. |
--rect WxH | string | con fit: "aspect" | ninguno | El tamaño del rectángulo del primitivo, como 1080x1920, con ambos números mayores que 0. |
--timezone IANA | string | no | UTC | La zona horaria en la que se leen las reglas de disponibilidad de los archivos, como America/New_York. |
screenrig media selector-preview selector.json --primitive video
screenrig media selector-preview selector.json --primitive image --timezone America/New_YorkLas claves del selector (order, batch_size, one_at_a_time, weights y fit) se describen en Filtros de etiquetas y lotes de reproducción y Rotación ponderada y ajuste por aspecto.
La respuesta incluye matched_count, los candidates ordenados por nombre de archivo (media_id, filename, tags, width, height), el selector normalizado y, en excluded, los archivos descartados con su reason: aspect_mismatch para fit: "aspect", y outside_window para un archivo cuya regla de disponibilidad no se cumple ahora. Con order: "weighted", cada candidato incluye weight y share_percent, y cycle es el número de reproducciones tras las cuales cada elemento ha sonado exactamente su peso. Más de 1024 coincidencias es invalid_request. Basta con acceso de lectura. La vista previa lee el proyecto autenticado, nunca avanza un cursor ni cambia un manifiesto, y un cambio del catálogo posterior se recoge en el siguiente límite de ciclo de cada Player.
media update#
Reemplazar o borrar las etiquetas de un objeto. Su regla de disponibilidad se define con media availability.
media update <id> (--tag TAG | --tags TAG1,TAG2 | --clear-tag) [--expect-rev REVISION]| Parámetro | Tipo | Requerido | Predeterminado | Notas |
|---|---|---|---|---|
<id> | string | sí | ninguno | El id de objeto med_. |
--tag TAG | string | uno de los tres | ninguno | La etiqueta de reemplazo, de una a 32 letras o dígitos. Pasa a ser la única etiqueta del objeto. |
--tags TAG1,TAG2 | string | uno de los tres | ninguno | El conjunto de etiquetas de reemplazo: de 1 a 32 etiquetas únicas separadas por comas, cada una de una a 32 letras o dígitos. |
--clear-tag | boolean | uno de los tres | apagado | Elimina todas las etiquetas y deja el objeto sin etiquetar. |
--expect-rev REVISION | string | no | ninguno | Precondición opcional de revisión. Omitir para escribir el recurso actual. Un valor obsoleto suministrado es revision_conflict: volver a obtener, reaplicar, reintentar. |
screenrig media update med_01EXAMPLEIMAGE0000000000 --tag LobbyLoop
screenrig media update med_01EXAMPLEIMAGE0000000000 --tags Summer,DrinksCon acceso Proponer, o cuando el proyecto requiere revisión para cambios de agente, volver a etiquetar multimedia aprobado responde ok con advertencia media_review_pending: las pantallas siguen reproduciéndolo con sus etiquetas aprobadas hasta que una persona aprueba el cambio, y un rechazo restaura las etiquetas. Su revisión aparece en reviews list en segundos; un reetiquetado que no cambia ninguna playlist aprobada ni ninguna playlist en revisión se aplica solo. Vea Revisiones.
media availability#
Define o borra cuándo los selectores dinámicos pueden elegir un archivo.
media availability <id> (--file FILE | --clear) [--expect-rev REVISION]| Parámetro | Tipo | Requerido | Predeterminado | Notas |
|---|---|---|---|---|
<id> | string | sí | ninguno | El id de objeto med_. |
--file FILE | ruta | uno de los dos | ninguno | Una regla de disponibilidad JSON, o - para stdin. |
--clear | boolean | uno de los dos | apagado | Elimina la regla; el archivo siempre está disponible. |
--expect-rev REVISION | string | no | revisión actual | Precondición opcional de revisión. Si se omite, el comando lee primero la revisión actual del medio. Un valor obsoleto suministrado es revision_conflict: volver a obtener, reaplicar, reintentar. |
screenrig media availability med_01EXAMPLEIMAGE0000000000 --file rule.jsonLos miembros y el comportamiento de la regla están en Disponibilidad de medios. Un archivo a la espera de la revisión de una persona se rechaza con media_pending_review: decida primero esa revisión.
media delete#
Eliminar un objeto multimedia.
media delete <id> [--expect-rev REVISION]| Parámetro | Tipo | Requerido | Predeterminado | Notas |
|---|---|---|---|---|
<id> | string | sí | ninguno | El id de objeto med_. |
--expect-rev REVISION | string | no | ninguno | Precondición opcional de revisión. Omitir para escribir el recurso actual. Un valor obsoleto suministrado es revision_conflict: volver a obtener, reaplicar, reintentar. |
screenrig media delete med_01EXAMPLEIMAGE0000000000media move#
Mueva archivos y carpetas multimedia a una carpeta, o de vuelta a la raíz de la biblioteca.
media move <id>... (--folder ID | --root)| Parámetro | Tipo | Requerido | Predeterminado | Notas |
|---|---|---|---|---|
<id>... | string | sí | ninguno | Uno o más ID de archivo med_ y ID de carpeta mfd_, como máximo 1000 en total. |
--folder ID | string | uno de los dos | ninguno | La carpeta de destino mfd_. |
--root | boolean | uno de los dos | apagado | Mover a la raíz de la biblioteca. |
screenrig media move med_01EXAMPLEIMAGE0000000000 med_01EXAMPLEVIDEO0000000000 --folder mfd_01EXAMPLEFOLDER000000000
screenrig media move mfd_01EXAMPLEFOLDER000000000 --rootEl movimiento es una solicitud de todo o nada. Una carpeta no puede moverse dentro de sí misma ni dentro de una carpeta que contenga, y las carpetas se anidan a lo sumo 10 niveles. Los elementos ya en el destino permanecen como están. data.media y data.folders cuentan lo que se movió.
Mover archivos cambia lo que los selectores by:folder de sus carpetas antigua y nueva reproducen, desde la resolución del siguiente selector de cada pantalla; mover una carpeta no cambia los archivos propios de ninguna carpeta. Bajo Propose access, o cuando el proyecto requiere revisión para cambios de agente, cada archivo movido espera la revisión de una persona (reviews list) y las listas de reproducción aprobadas siguen reproduciéndolo por la carpeta con la que fue aprobado; vea Reviews.
media folder list#
Listar las carpetas multimedia del proyecto.
media folder list [--library]| Parámetro | Tipo | Requerido | Predeterminado | Notas |
|---|---|---|---|---|
--library | boolean | no | apagado | Enumera en su lugar las carpetas de la Biblioteca de la organización, en solo lectura: las filas llevan library: true, y un selector by:folder puede nombrar una para reproducir sus archivos. |
screenrig media folder list
screenrig media folder list --libraryDevuelve todas las carpetas del proyecto, hasta 1000, ordenadas por nombre: data.items con id, name, parent_id (null en la raíz de la biblioteca) y revision. Construya el árbol a partir de parent_id. La carpeta de un archivo es folder_id en media list y media show; está ausente en la raíz de la biblioteca.
media folder show#
Lea una carpeta de medios.
media folder show <id>| Parámetro | Tipo | Requerido | Predeterminado | Notas |
|---|---|---|---|---|
<id> | string | sí | ninguno | El id de carpeta mfd_. |
screenrig media folder show mfd_01EXAMPLEFOLDER000000000El sobre lleva el name, parent_id y revision de la carpeta.
media folder create#
Crear una carpeta de medios en la raíz de la biblioteca o dentro de otra carpeta.
media folder create --name NAME [--parent ID]| Parámetro | Tipo | Requerido | Predeterminado | Notas |
|---|---|---|---|---|
--name NAME | string | sí | ninguno | De 1 a 100 caracteres, recortados. Los nombres pueden repetirse. |
--parent ID | string | no | raíz de la biblioteca | La carpeta mfd_ para crearla. |
screenrig media folder create --name Menus
screenrig media folder create --name Lunch --parent mfd_01EXAMPLEFOLDER000000000Una organización contiene como máximo 1000 carpetas en todos sus proyectos, anidadas hasta 10 niveles de profundidad. Una lista de reproducción reproduce los archivos de una carpeta con un selector by:folder.
media folder update#
Renombrar una carpeta de multimedia o moverla con todo su contenido a otra carpeta.
media folder update <id> [--name NAME] [--parent ID | --root] [--expect-rev REVISION]| Parámetro | Tipo | Requerido | Predeterminado | Notas |
|---|---|---|---|---|
<id> | string | sí | ninguno | El id de carpeta mfd_. |
--name NAME | string | al menos uno de --name, --parent, --root | sin cambios | El nuevo nombre, de 1 a 100 caracteres. |
--parent ID | string | al menos uno de --name, --parent, --root | sin cambios | Mueva la carpeta, con todo su contenido, a esta carpeta mfd_. No con --root. |
--root | boolean | al menos uno de --name, --parent, --root | apagado | Mueva la carpeta a la raíz de la biblioteca. No con --parent. |
--expect-rev REVISION | string | no | ninguno | Precondición opcional de revisión. Omitir para escribir el recurso actual. Un valor obsoleto suministrado es revision_conflict: volver a obtener, reaplicar, reintentar. |
screenrig media folder update mfd_01EXAMPLEFOLDER000000000 --name Archive
screenrig media folder update mfd_01EXAMPLEFOLDER000000000 --rootUna carpeta no puede moverse dentro de sí misma ni dentro de una carpeta contenida en ella, y un movimiento debe mantener todas las carpetas dentro de 10 niveles. Enviar los valores actuales no hace nada.
media folder delete#
Eliminar una carpeta de multimedia. Sus archivos y carpetas se mueven un nivel arriba.
media folder delete <id> [--expect-rev REVISION]| Parámetro | Tipo | Requerido | Predeterminado | Notas |
|---|---|---|---|---|
<id> | string | sí | ninguno | El id de carpeta mfd_. |
--expect-rev REVISION | string | no | ninguno | Precondición opcional de revisión. Omitir para escribir el recurso actual. Un valor obsoleto suministrado es revision_conflict: volver a obtener, reaplicar, reintentar. |
screenrig media folder delete mfd_01EXAMPLEFOLDER000000000Elimina solo la carpeta. Sus archivos y carpetas se mueven al padre, o a la raíz de la biblioteca si no tiene. Un selector by:folder que la nombre ya no coincide con nada, así que redirija esas listas de reproducción primero.
Filtros de etiquetas y lotes de reproducción
Los medios llevan hasta 32 etiquetas únicas, cada una de 1 a 32 letras o dígitos. Reemplace todo el conjunto con screenrig media update med_ID --tags Summer,Drinks. --tag Summer lo reemplaza con una etiqueta; --clear-tag borra todas las etiquetas. media list --tag Summer coincide con la membresía en cualquier parte del conjunto. Las etiquetas distinguen mayúsculas y minúsculas y nunca son autorización.
Un selector dinámico puede usar un tag o un objeto filtro tags:
{
"by": "tag",
"tags": { "all": ["Summer", "Drinks"], "any": ["Lobby", "Patio"], "none": ["Expired"] },
"order": "random",
"one_at_a_time": false,
"batch_size": 3
}
all requiere todas las etiquetas listadas, any requiere al menos una, y none excluye cualquier etiqueta listada. Los grupos presentes se combinan con AND; los grupos omitidos no imponen condición. Proporcione al menos un grupo no vacío. Cada grupo acepta hasta 32 etiquetas únicas. tag y tags son mutuamente excluyentes. Un filtro solo none selecciona todos los medios listos de ese primitivo excepto las etiquetas excluidas. Los selectores de imagen seleccionan imágenes y los de video seleccionan videos.
Un selector folder, { "by": "folder", "folder_id": "mfd_…" }, reproduce los archivos listos que están directamente dentro de una carpeta multimedia y ninguno de sus subcarpetas; media folder list muestra los ids. Admite los mismos order, one_at_a_time y batch_size que all y tag, y al eliminar una carpeta sus archivos suben un nivel y el selector queda vacío.
El conjunto de candidatos contiene hasta 1024 medios listos por selector, con 1024 referencias de medios en la instantánea completa del ciclo. Una escritura cuenta cada selector all, tag o folder como 32 de esas referencias y un selector ids como su longitud. Una coincidencia mayor devuelve un error; restrinja los filtros. batch_size es un límite aparte de 1–1024 elementos por visita de página. En una página media_end, one_at_a_time: false reproduce el siguiente lote en secuencia; omitir batch_size reproduce el pase restante. one_at_a_time: true reproduce un elemento por aparición y solo permite un tamaño de lote omitido o batch_size: 1. En las páginas de duración, de aplicación y audio_end, todo selector all, tag, folder y ids de varios ids requiere one_at_a_time: true, y se rechaza dwell_ms. Las imágenes en media_end también requieren dwell_ms; los videos no pueden repetirse en esa página.
El reproductor resuelve cada primitiva multimedia dinámica en una solicitud al iniciar la lista de reproducción y en cada límite de ciclo. La membresía se congela durante el ciclo. Las cargas, eliminaciones, cambios de etiquetado y límites de disponibilidad no regeneran el manifiesto. En la siguiente actualización, los elementos eliminados o excluidos salen de la cola pendiente; las nuevas coincidencias se unen cuando termina el pase actual. Un lote final puede contener menos que el número solicitado; no se rellena con el siguiente pase. El orden de nombre de archivo ordena por nombre de archivo, luego ID de medio. El orden aleatorio mezcla una vez por pase completo, preservando el orden restante entre actualizaciones del ciclo. El orden ponderado sigue sus pesos, más abajo. El cursor es local a la pantalla, lista de reproducción, página y primitiva, persiste tras reinicio y se reinicia al cambiar filtro, orden o política de lote. La reproducción sin conexión usa la última instantánea exitosa. Las coincidencias vacías omiten la primitiva y cualquier página vacía resultante.
Guarde el objeto selector arriba como selector.json, luego inspeccione su catálogo de candidatos actual antes de publicar:
screenrig media selector-preview selector.json --primitive video
La vista previa devuelve matched_count, ordenado por nombre de archivo candidates con IDs de medios y etiquetas, y la política selector normalizada. Con orden aleatorio muestra el grupo y la política de mezcla; no elige la mezcla del reproductor, avanza un cursor, crea un permiso de reproducción ni cambia un manifiesto. Con orden ponderado devuelve, para cada candidato, weight y share_percent, además de cycle. --rect WxH (API rect: {width, height}) es el tamaño del espacio y es obligatorio con fit: "aspect"; las coincidencias que deja fuera se listan en excluded con el motivo aspect_mismatch. Los selectores de imágenes pasan --primitive image. La API es POST /api/selectors/preview con { "primitive": "video", "selector": ... }. Usa el proyecto autenticado y las mismas reglas de coincidencia que la reproducción. Los cambios en el catálogo después de la vista previa se resuelven en el siguiente ciclo de reproducción.
La exportación de paquete estático congela las coincidencias dinámicas como IDs exactos y mezcla una vez un selector random. Preserva la reproducción uno a la vez o de pase completo; una secuencia de tiempo de ejecución limitada usando batch_size con one_at_a_time: false requiere eliminar ese campo o elegir IDs explícitos antes de exportar. Esto evita perder silenciosamente un cursor de lote en tiempo de ejecución en un paquete estático.
Rotación ponderada y ajuste por aspecto
order: "weighted" rota las creatividades de un espacio según su peso, de modo que cada patrocinador conserva su parte de reproducciones. weights asigna un ID de medio (med_...) o tag:NAME a un entero de 1 a 1000, con un máximo de 64 claves. Funciona con by igual a all, tag o folder:
{
"by": "all",
"order": "weighted",
"one_at_a_time": true,
"weights": { "tag:Acme": 50, "tag:Globex": 30, "tag:Initech": 20 },
"fit": "aspect"
}
Pesos de 50, 30 y 20 entregan exactamente 5, 3 y 2 de cada 10 reproducciones, en cada ciclo, y un reinicio continúa a mitad de ciclo. El peso de un elemento es su clave de ID de medio cuando existe; si no, la primera clave tag:NAME, en orden alfabético, entre las etiquetas que lleva, repartida por igual entre los elementos de la selección que la comparten, de modo que la parte de un patrocinador se mantiene sea cual sea el número de creatividades; si no, el elemento cuenta como su propio grupo con peso 1. Un ciclo tiene como máximo 4096 reproducciones; las partes se redondean a él solo cuando la proporción exacta exige un ciclo más largo.
El orden ponderado reproduce un elemento por visita, así que defina one_at_a_time: true o batch_size: 1. weights es obligatorio con el orden ponderado y solo se permite con él; de lo contrario, la escritura devuelve invalid_request. La rotación ponderada es una función de Plus: sin ella, una escritura que fija un peso que un elemento aún no tiene recibe feature_not_in_plan, mientras que la rotación igual, conservar los pesos guardados y quitarlos siguen disponibles. Todos los Players reproducen el orden ponderado. A un Player que no declara la capacidad de host selector.weighted se le envía random, y los diagnósticos del manifiesto llevan selector_order_downgraded.
fit: "aspect" en un selector dinámico conserva solo los archivos cuya relación ancho/alto está dentro del 5 % de la del rectángulo del espacio, incluido un muro de video o marco de pantalla, leída cuando el selector se resuelve. Un espacio vertical nunca reproduce un archivo horizontal. No requiere ningún cambio en el reproductor.
screenrig media selector-preview imprime la proporción esperada de cada archivo de un selector ponderado y, con fit: aspect, enumera los archivos que deja fuera; el editor de páginas del panel muestra la misma tabla en el inspector. La exportación de paquete estático congela un selector ponderado como IDs exactos en orden de nombre de archivo; los pesos no se conservan.
Tokens de pantalla en selectores de etiquetas
El tag de un selector de etiquetas, y cada entrada de su filtro tags, puede ser {screen.field.NAME} o {screen.id}, el identificador de la pantalla sin su prefijo scr_, que es una etiqueta. Un token puede ir junto a letras y dígitos en una plantilla de hasta 128 caracteres. El servidor rellena el token para cada pantalla al construir el manifiesto y la instantánea de selectores de esa pantalla, así que una lista de reproducción reproduce los medios propios de cada pantalla. Etiquete los medios Lobby o Garage, defina el campo de cada pantalla con screenrig screen update scr_ID --field zone=Lobby y asigne al espacio este selector:
{ "by": "tag", "tag": "{screen.field.zone}", "one_at_a_time": true }
El valor rellenado sigue las reglas de las etiquetas: de 1 a 32 letras o dígitos. Una pantalla sin el campo, o cuyo valor no es una etiqueta, no selecciona nada: no reproduce ningún archivo de ese espacio, y los diagnósticos del manifiesto incluyen screen_fact_missing o screen_fact_invalid. Cambiar un campo regenera el manifiesto de esa pantalla. Un selector con token no se puede previsualizar (media selector-preview necesita una etiqueta concreta) ni congelar con playlist export.
Tokens de pantalla en direcciones de iframe y params de aplicación
El iframe y el src de un fallback_src pueden llevar tokens de pantalla en la ruta, la consulta o el fragmento de una dirección http o https, y también el params opcional de una primitiva application: hasta 16 nombres de 1 a 32 letras minúsculas, dígitos o guiones bajos (ticket y policy están reservados) con valores de hasta 512 caracteres. El servidor los rellena para cada pantalla:
| Token | Valor |
|---|---|
{screen.id} | El identificador de la pantalla sin su prefijo scr_. |
{screen.name} | El nombre de la pantalla. |
{screen.timezone} | La zona horaria IANA efectiva de la pantalla: su anulación, si no la zona que informa su Player, si no UTC. |
{screen.field.NAME} | El campo NAME de la pantalla, de 1 a 32 letras minúsculas, dígitos o guiones bajos. |
{screen.location.lat}, {screen.location.lon} | Su ubicación en grados decimales. |
{screen.location.name}, {screen.location.address} | Su nombre de lugar y dirección postal. |
{
"primitive": "iframe",
"src": "https://maps.example.com/directory?kiosk={screen.field.kiosk_id}&level={screen.field.level}",
"title": "Directory"
}
La escritura guarda la plantilla tal como está escrita, con las llaves incluidas. El manifiesto de cada pantalla lleva su propia dirección, con cada valor codificado en porcentaje para su lugar en la URL: un kiosk_id de B 2&3 se convierte en B%202%263. Un token en el esquema, las credenciales, el host o el puerto, o en un enlace de YouTube, un enlace de documento de Google o Microsoft o una dirección de vista de BI, se invalid_request en src (o fallback_src). La publicación omite la comprobación de marcos para un src con plantilla, y las vistas previas muestran la plantilla tal como está escrita.
Una pantalla a la que le falta un valor (un campo sin definir, sin ubicación), o cuyos valores forman una dirección de más de 2048 caracteres o con un segmento de ruta de . o .., no recibe ese iframe ni aplicación, y los diagnósticos de su manifiesto llevan screen_fact_missing o screen_fact_invalid; una página que queda vacía se descarta. Toda escritura que llega a una pantalla así (una escritura de lista de reproducción, screen assign, screen update, una asignación de flota, una revisión aprobada) responde con una advertencia screen_fact_missing que nombra los tokens, los primeros 20 ids de pantalla y cuántas hay. Cambiar un campo o la ubicación vuelve a emitir el manifiesto de las pantallas a las que afecta.
Para una aplicación, los params rellenados, de un máximo de 4096 caracteres en conjunto una vez codificados en porcentaje, le llegan en context.params en todos los Players (SDK). La app web del Player y los Players que la ejecutan (Samsung Tizen, BrightSign, LG webOS y Vega) también añaden cada uno a la dirección de lanzamiento después de ticket, codificado en porcentaje, de modo que la aplicación puede leer location.search. El campo url de una plantilla puede ser un src de iframe completo, y su valor puede llevar a su vez tokens de pantalla, que se rellenan cuando se construye el manifiesto. Un selector de etiquetas usa {screen.id} y {screen.field.NAME} del mismo modo (arriba). Las tarjetas conservan sus propios tokens {screen.…}.
Las primitivas de aplicación de una misma lista de reproducción que fijan la misma versión llevan los mismos params.
Disponibilidad de medios
screenrig media availability med_ID --file rule.json define cuándo los selectores dinámicos (all, tag y folder) pueden elegir un archivo. --clear elimina la regla y --expect-rev N protege la revisión del medio. La API es PATCH /api/media/{id}/availability con If-Match y { "availability": {...} | null }. Definir una regla requiere acceso Manage; una credencial Propose recibe insufficient_access. Sin --expect-rev, el comando lee primero la revisión actual del medio. Un archivo a la espera de la revisión de una persona se rechaza con media_pending_review.
La regla es la gramática horaria del calendario, leída en la zona horaria de cada pantalla, y contiene al menos un miembro: from y until (civil YYYY-MM-DDTHH:MM, until exclusivo), windows (semanal {days, start, end}), monthly ({day} o {nth, weekday}, cada uno con start y end opcionales), dates ({date, start, end}) y except (fechas que eliminan una ocurrencia, incluidas las colas después de medianoche), con hasta 16 windows, 16 entradas monthly, 100 dates y 100 fechas except. No tiene data ni interaction. La creatividad de un patrocinador para el fin de semana largo, disponible solo en las tardes entre semana dentro del periodo:
{
"from": "2026-11-27T00:00",
"until": "2026-11-30T23:59",
"windows": [{ "days": ["mon", "tue", "wed", "thu", "fri"], "start": "17:00", "end": "22:00" }]
}
Solo los selectores leen la regla: un selector explícito con id o ids la ignora, igual que las referencias de medios de las tarjetas, el audio de la banda sonora y las creatividades publicitarias. Un archivo sale de la selección y vuelve en el siguiente ciclo de lista de reproducción de cada pantalla, en aproximadamente un minuto desde el límite. No cambia ninguna revisión de lista de reproducción ni de manifiesto, y un reproductor sin conexión conserva su última selección hasta que se reconecta. media selector-preview con --timezone ZONE (UTC por defecto) lee las reglas en esa zona y lista en excluded los archivos fuera de su regla en ese momento, con el motivo outside_window.