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
- fn_phone
- Uploads
- Lua
En esta página
- Dónde guarda fn_phone los archivos
- Subir con el agente fivedock
- Subir con un token de API
- Cambiarlo desde el juego
- Comprobar que funciona
- Qué sube fn_phone
- Fotos que siguen en Fivemanage
- Si las subidas fallan
- Preguntas frecuentes
- ¿Funciona fn_phone con FiveDock?
- ¿Necesito un token de API para fn_phone?
- ¿Puede fn_phone seguir subiendo a Fivemanage?
- ¿Pueden los jugadores usar enlaces de FiveDock como tono de llamada?
- ¿Es Config.Fivedock el mismo ajuste?
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:
[fn_phone] photos are stored in the database (Config.Media.provider = local); use fivedock for a CDNCon 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:
set fivedock_key "fda_live_…"
ensure fivedockDespués cambia el provider en fn_phone/config.lua y deja token vacío:
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:
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:
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:
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
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:
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
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.