Saltar al contenido
Blog

fn_phone: subir fotos, vídeos y notas de voz a FiveDock

Manda las fotos, vídeos y notas de voz de fn_phone a FiveDock en vez de a tu base de datos: una línea de config, y el agente fivedock o un token de API.

Por Termi

8 min de lectura
  • fn_phone
  • Uploads
  • Lua
En esta página

fn_phone es nuestro propio móvil para FiveM. De serie guarda cada foto, vídeo y nota de voz en tu base de datos. Una línea de su config los manda a FiveDock, y la base de datos se queda solo con el enlace. La subida se hace en el servidor a través de fn_bridge, así que no tocas ningún archivo de fn_phone y ningún token llega nunca a un jugador.

Dónde guarda fn_phone los archivos

Cada archivo que graba el móvil es una fila de fn_phone_media. Con Config.Media.provider = 'local', el valor por defecto, la columna url contiene el archivo entero como data URI, hasta 3 MiB por foto y 12 MiB por vídeo. El servidor lo avisa en cada arranque:

server console
[fn_phone] photos are stored in the database (Config.Media.provider = local); use fivedock for a CDN

Con provider = 'fivedock', el servidor pasa cada archivo a FN_BRIDGE.MEDIA.Upload en fn_bridge, que lo sube y devuelve el enlace del CDN. fn_bridge llega a FiveDock de dos maneras. Si hay un token definido, envía el archivo a https://api.fivedock.dev/api/v3/file/base64, la misma dirección base64 que tiene la API v3 de Fivemanage. Sin token y con el resource del agente fivedock iniciado, escribe el archivo en su carpeta cache, se lo pasa a exports.fivedock:upload y lo borra después.

Los jugadores nunca reciben un enlace de subida. Un vídeo grabado en el móvil va primero al servidor como latent event, y el servidor lo sube igual que una foto.

Subir con el agente fivedock

Si el agente fivedock ya corre en tu servidor, no tienes que crear ningún token. El agente inicia sesión con la clave fda_live_ del server.cfg, y fn_bridge le manda las subidas siempre que no haya token. El agente necesita dos líneas en server.cfg, como describe la guía del agente. Ponlas encima de ensure fn_phone:

server.cfg
set fivedock_key "fda_live_…"
ensure fivedock

Después cambia el provider en fn_phone/config.lua y deja token vacío:

config.lua
Media = { provider = 'fivedock', token = '', encoding = 'webp', quality = 0.85, limit = 2000 },

Reinicia fn_phone. Las subidas aparecen en la carpeta fn_phone de tu organización.

Subir con un token de API

Sin el agente, fn_bridge necesita un token de API. En el panel de FiveDock abre Tokens, crea un token con el scope files:write y vincúlalo a tu servidor. Empieza por fd_live_. No es la clave de agente fda_live_, que la API de subida no acepta.

fn_phone lee el token primero de Config.Media.token. Si lo dejas vacío, fn_bridge recurre a una convar del server.cfg, que puede usar cualquier script basado en fn_bridge:

server.cfg
set fn_bridge:upload_token "fd_live_…"

Aquí usa set. setr replica la convar al juego de cada jugador. config.lua también es seguro, porque fn_phone lo carga solo como script de servidor. Pon provider = 'fivedock' como en la sección del agente. Si hay token y agente a la vez, fn_bridge usa el token.

Por cada archivo, fn_bridge envía esta petición:

request
POST https://api.fivedock.dev/api/v3/file/base64
Authorization: fd_live_…
Content-Type: application/json

{"base64":"UklGR…","filename":"fn_phone_1792756800_482913.webp","path":"fn_phone"}

El nombre del archivo es fn_phone_, la hora de subida en segundos Unix y un número aleatorio. FiveDock responde con el enlace del CDN en data.url, que es de donde lo lee fn_bridge.

Cambiarlo desde el juego

Admin → Configuración del servidor tiene los dos ajustes en el paso Subidas y web: Almacenamiento es Media.provider y Token de fivedock es Media.token. El panel nunca muestra un token guardado, solo si hay uno puesto. Los valores guardados van al almacén KVP del servidor y se aplican encima de config.lua tras reiniciar fn_phone, así que un Almacenamiento guardado en el juego gana al archivo.

Comprobar que funciona

Tras el reinicio, la consola ya no imprime la línea sobre fotos en la base de datos. Haz una foto con la cámara y abre Archivos en el panel de FiveDock: está en la carpeta fn_phone, con un nombre como fn_phone_1792756800_482913.webp. En la base de datos, las filas más recientes deberían tener enlaces de FiveDock:

SQL
SELECT id, kind, LEFT(url, 40) AS url
FROM fn_phone_media
ORDER BY id DESC
LIMIT 10;

Una url que empieza por https://cdn.fivedock.dev/ está en FiveDock. Una que empieza por data: está en la base de datos: la subida falló y fn_phone guardó ahí el archivo. Para que en su lugar salga un error en el móvil, añade fallback = false a Config.Media; una foto o vídeo cuya subida falla entonces no se guarda en absoluto. Las notas de voz siempre recurren a la base de datos.

Qué sube fn_phone

  • Fotos de la cámara, en WebP por defecto. Config.Media.encoding acepta webp, jpg o png, y quality fija la compresión, 0.85 por defecto. La cámara necesita que screencapture o screenshot-basic esté en marcha.
  • Vídeos, en WebM con VP9 o VP8 a 1,6 Mbit/s. La cámara corta un clip a los 30 segundos, así que un clip ronda los 6 MB.
  • Notas de voz y mensajes del buzón de voz, en WebM con audio Opus, de hasta 400 KiB cada uno.
  • Imágenes añadidas a Fotos desde un enlace: PNG, JPEG, WebP o GIF de hasta 2,25 MiB. El servidor descarga su propia copia y la sube, así que la foto sobrevive a un enlace de Discord que caduca.

FiveDock acepta todo esto. Del lado del móvil, las grabaciones de pantalla son la excepción: fn_phone las guarda en su propio formato en la base de datos, sea cual sea el provider.

Las notas de voz salen como vídeo

Las notas de voz son archivos WebM, el mismo contenedor que usan los vídeos de fn_phone. FiveDock lee el tipo de un archivo por sus bytes, por eso el panel lista las notas de voz como vídeo.

Fotos que siguen en Fivemanage

fn_phone quitó la opción de Fivemanage en la versión 1.1.11. Si tu config.lua todavía dice provider = 'fivemanage', cámbialo a 'fivedock' como arriba. Las fotos hechas antes del cambio conservan sus enlaces de Fivemanage, igual que las que fn_phone_migrate trajo de lb-phone u otro móvil, porque la importación copia cada enlace tal cual. Cargan mientras los archivos sigan en Fivemanage. Desde la 1.1.11, los enlaces de r2.fivemanage.com ya no valen como tonos de llamada personalizados.

Los enlaces están en la columna url de fn_phone_media, y Mensajes, anuncios e historias apuntan a esas filas con su clave de 16 caracteres. La migración copia tus archivos de Fivemanage con una clave de solo lectura y te da una lista de enlace antiguo → enlace nuevo. Cada fila de esa lista se convierte en una sentencia:

SQL
UPDATE fn_phone_media
SET url = 'https://cdn.fivedock.dev/f/8Kq2nR4t.webp'
WHERE url = 'https://r2.fivemanage.com/…/IMG_0412.webp';

En Fivemanage no se cambia ni se borra nada, así que puedes ejecutar las sentencias cuando quieras.

Si las subidas fallan

  • Las fotos siguen cayendo en la base de datos. fn_phone guarda una foto en la base de datos cuando falla su subida, así que un token con una errata, un token sin files:write y una organización llena se ven igual en el móvil. Una organización por encima de su límite de almacenamiento rechaza las subidas con 429. Revisa el token en Config.Media.token o fn_bridge:upload_token, y el almacenamiento en el panel.
  • El agente corre, pero las subidas siguen fallando. Un token tiene prioridad sobre el agente. Si Config.Media.token o fn_bridge:upload_token guarda un token viejo, fn_bridge envía ese. Vacía los dos para subir por el agente.
  • La consola sigue imprimiendo [fn_phone] photos are stored in the database (Config.Media.provider = local); use fivedock for a CDN. Un Almacenamiento guardado en Admin → Configuración del servidor pisa config.lua. Cámbialo ahí o pulsa Restablecer a su lado.
  • La cámara no hace fotos. fn_phone necesita screencapture o screenshot-basic para la cámara. Comprueba que uno de los dos esté iniciado.

Preguntas frecuentes

¿Funciona fn_phone con FiveDock?

Sí, sin editar sus archivos. Pon Config.Media.provider = 'fivedock' y luego arranca el agente fivedock o dale a fn_phone un token fd_live_ con el scope files:write, en Config.Media.token o en la convar fn_bridge:upload_token. fn_bridge sube desde el servidor cada foto, vídeo y nota de voz y guarda el enlace del CDN.

¿Necesito un token de API para fn_phone?

No, si el agente fivedock corre en el servidor. Sin token definido, fn_bridge pasa cada subida al agente, que inicia sesión con su propia clave fda_live_. Solo necesitas un token fd_live_ en un servidor sin agente.

¿Puede fn_phone seguir subiendo a Fivemanage?

No. La versión 1.1.11 quitó la opción de Fivemanage, y Config.Media.provider ahora acepta local o fivedock. Los enlaces viejos de Fivemanage en fn_phone_media siguen cargando mientras existan los archivos, y la migración de FiveDock copia los archivos y lista los enlaces nuevos.

¿Pueden los jugadores usar enlaces de FiveDock como tono de llamada?

Sí. fivedock.dev es el primer host de Config.Ringtones.hosts, y los subdominios cuentan, así que un enlace en cdn.fivedock.dev pasa. El enlace tiene que acabar en una extensión de audio como .mp3 o .ogg. Sube el archivo en Archivos y pega su enlace en el móvil, en Ajustes → Sonidos y vibraciones → Tono de llamada.

¿Es Config.Fivedock el mismo ajuste?

No. Config.Fivedock envía eventos Black Box, los registros del móvil, a tu panel de FiveDock. Las fotos, vídeos y notas de voz solo siguen a Config.Media. Con el agente en marcha, ambos funcionan sin token.

Todos los artículos