Capacidades
Esta página es una traducción. El texto en inglés es el que prevalece: si ambos difieren, sigue el inglés. La traducción se ofrece por comodidad. Leer esta página en inglés
Los indicadores controlan la interfaz en el código, no en la documentación.
Las capacidades se envían en el objeto capabilities de cada sincronización, y cada sincronización reemplaza entera la declaración anterior. Un proveedor que deja de enviar un indicador no conserva el valor antiguo: tiene el valor por defecto. Así que envía cada capacidad que quieras, cada vez.
Los valores por defecto no son todos iguales, y la diferencia es deliberada. Un indicador que concede algo que de otro modo retendríamos vale false por defecto, y solo cuenta el true literal: un valor ausente, "true" y 1 significan false. Un indicador que retira algo que de otro modo daríamos por supuesto vale true por defecto, y solo cuenta el false literal. Una capacidad que esta especificación no nombra se ignora.
Nada verifica una declaración. Un proveedor se toma por su palabra, y por eso el único indicador cuya falsedad hace daño, canAnalyseAudio, dice sin rodeos lo que cuesta.
canTransposeKey: puedes cambiar el tono. Por defecto false. Requiere un decodificador en tu camino, así que solo pueden ofrecerlo los proveedores que transcodifican. Por ahora nada en la app ofrece un cambio de tono, porque ningún proveedor transcodifica, y declararlo no cambia nada en pantalla.canSeek: tu contenido responde a peticiones de rango, así que desplazarse funciona. Por defecto true. Por ahora la app no cambia lo que ofrece según este indicador. En un bucket lo medimos, pidiendo un rango, en cada barrido.canSearchRemotely: puedes responder a una búsqueda que no podemos servir desde el catálogo reflejado, y descargar lo que alguien elija. Por defecto false. Un solo indicador para ambas cosas, porque una fuente que puede encontrar una canción que luego no va a buscar no merece ofrecerse. Véase Responder bajo demanda.canPreview: puedes servir un momento de una canción que nadie ha descargado, para que quien elige entre seis versiones de karaoke pueda oír una primero. Por defecto false. Solo tiene sentido junto acanSearchRemotely, y es independiente de él porque descargar bajo demanda es útil sin esto. Véase Vista previa.allowsSharing: si tu catálogo puede exponerse a alguien que no sea su dueño. Por defecto true, porque la mayoría de las fuentes son los archivos de alguien. Ponlo en false si tus condiciones son por puesto. Una biblioteca que informa false solo puede añadirse en privado, y si lo cambias a false más tarde, las vinculaciones compartidas existentes pasan a privadas en la siguiente sincronización. Es distinto del uso comercial: una licencia puede permitir la escucha privada y prohibirte abrir el catálogo a una sala llena de invitados.maxConcurrentRooms: en cuántas fiestas puede estar tu catálogo a la vez. Por defecto: sin límite, lo adecuado para los archivos de alguien. Envía1para una licencia por puesto. Es un número positivo, y cualquier otra cosa se toma como sin límite. Añadirla por encima del límite se rechaza, y el rechazo nombra las fiestas que ya la usan para que la persona pueda liberar una.allowsCommercialUse: si tu contenido tiene licencia para un local. Por defecto false, y debería seguir siéndolo a menos que tengas una licencia de verdad. El modo local rechaza a los proveedores que informan false; eso se aplica en el código, no en las condiciones.canAnalyseAudio: véase más abajo.
canAnalyseAudio
Por defecto false. Significa: toda respuesta correcta a una petición de mi contenido responde a una petición CORS hecha en modo anónimo, de modo que una página de otro origen puede leer los bytes que está reproduciendo.
En concreto, para GET <baseUrl>/media/<externalId>?t=<mediaToken>, la dirección que se le entrega al Stage, con las peticiones de rango incluidas, en cada 200 y en cada 206. El bridge también las envía en un 416 y en la respuesta a OPTIONS. Una respuesta de error, como el 403 de un token incorrecto o el 404 de un id que no tienes, no necesita llevarlas, y las del bridge no las llevan:
Access-Control-Allow-Origincon el origen que preguntó, o*. El Stage no envía credenciales, así que un comodín es aceptable. Si devuelves el origen tal cual, envía tambiénVary: Origin.Access-Control-Expose-Headers: Content-Length, Content-Range, que Servir el contenido multimedia ya pide.- Si la dirección redirige, cada salto hace lo mismo.
- Las peticiones del Stage son peticiones CORS simples, ya que en una se permite un único
Range: bytes=N-M, así que no se espera un preflight. Responde aOPTIONSde todos modos, como dice Servir el contenido multimedia.
Es una afirmación sobre CORS y nada más. No dice que analices nada, y es independiente de canPreview.
Qué hace el Stage con ella
El Stage lee el indicador de cada pista, a partir de lo que se le dijo cuando la canción estaba a punto de sonar.
- False o ausente. El Stage no pone el atributo
crossoriginy no construye ningún grafo de audio. La reproducción es exactamente la que era antes de que existiera la capacidad, y no le debes a nadie ninguna cabecera CORS. Una pista sin imagen, algo que el Stage averigua cargándola y comprobando que no tiene vídeo, muestra su portada, o el letrero de neón de Let’s DJ si no la tiene, siempre con título y artista. No hay visualizador. - True. El Stage pone
crossorigin="anonymous"antes de cargar, para todas las pistas tuyas, vídeo incluido, porque no puede saber que un archivo no tiene imagen hasta haberlo cargado. Una pista sin imagen recibe además un analizador de audio y un visualizador, una fila de barras, que se muestra con esa misma portada o letrero. Las pistas de vídeo no se analizan. - El atributo queda fijo durante la vida del elemento. Una sincronización que cambie el indicador afecta a la siguiente canción, no a la que está sonando.
- Solo el reproductor del Stage hace todo esto. Las vistas previas en los móviles nunca ponen
crossoriginy nunca se analizan, así que un proveedor que ofrece vistas previas no necesita nada nuevo.
Por qué existe, y la trampa que tiene
Un navegador no deja que una página analice contenido que viene de otro origen a menos que ese origen lo haya aceptado. Si la página hace pasar ese contenido por un analizador sin el acuerdo, el navegador no lanza ningún error: lo que se reproduce se queda en silencio y el analizador lee ceros, y nada dice por qué. Por eso el Stage no puede limitarse a probar.
Declarar true sin enviar las cabeceras no se degrada en silencio. Con crossorigin="anonymous" puesto, una respuesta que carezca de ellas no se carga en absoluto. El Stage trata esa pista como no reproducible y la salta, y así salta todas las pistas de ese proveedor.
Dejarlo sin poner no cuesta nada. El audio sigue sonando y sigue mostrando su portada.
El Stage deliberadamente no prueba el atributo para volver atrás si falla. Para cuando el fallo es visible, un elemento de otro origen que se ha hecho pasar por un analizador ya está en silencio, y una alternativa que reproduce silencio es peor que no probar.
El bridge declara true. Un bucket nunca: un enlace prefirmado no lleva cabeceras CORS a menos que el dueño del bucket las haya configurado, y nosotros no configuramos los buckets de otras personas.