Aller au contenu
Blog

fn_phone : héberger photos, vidéos et vocaux sur FiveDock

Envoyez photos, vidéos et messages vocaux de fn_phone vers FiveDock plutôt que dans la base : une ligne de config, plus l’agent fivedock ou un jeton API.

Par Termi

7 min de lecture
  • fn_phone
  • Uploads
  • Lua
Sur cette page

fn_phone est notre propre téléphone pour FiveM. Par défaut, il garde chaque photo, vidéo et message vocal dans votre base de données. Une ligne dans sa config les envoie à FiveDock, et la base ne conserve que le lien. L’upload se fait côté serveur via fn_bridge : vous ne modifiez aucun fichier de fn_phone, et aucun jeton n’arrive jamais chez un joueur.

Où fn_phone stocke les médias

Chaque fichier enregistré par le téléphone est une ligne de fn_phone_media. Avec Config.Media.provider = 'local', la valeur par défaut, la colonne url contient le fichier entier sous forme de data URI, jusqu’à 3 MiB pour une photo et 12 MiB pour une vidéo. Le serveur le rappelle à chaque démarrage :

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

Avec provider = 'fivedock', le serveur passe chaque fichier à FN_BRIDGE.MEDIA.Upload dans fn_bridge, qui l’envoie et renvoie le lien du CDN. fn_bridge joint FiveDock de deux façons. Si un jeton est défini, il poste le fichier sur https://api.fivedock.dev/api/v3/file/base64, la même adresse base64 que l’API v3 de Fivemanage. Sans jeton et avec la resource de l’agent fivedock démarrée, il écrit le fichier dans son dossier cache, le confie à exports.fivedock:upload, puis le supprime.

Les joueurs ne reçoivent jamais de lien d’upload. Une vidéo enregistrée sur le téléphone part d’abord vers le serveur en latent event, et le serveur l’envoie comme une photo.

Envoyer via l’agent fivedock

Si l’agent fivedock tourne déjà sur votre serveur, vous n’avez aucun jeton à créer. L’agent se connecte avec la clé fda_live_ du server.cfg, et fn_bridge lui confie les uploads tant qu’aucun jeton n’est défini. L’agent demande deux lignes dans server.cfg, comme le décrit le guide de l’agent. Placez-les au-dessus de ensure fn_phone :

server.cfg
set fivedock_key "fda_live_…"
ensure fivedock

Ensuite, changez le provider dans fn_phone/config.lua et laissez token vide :

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

Redémarrez fn_phone. Les uploads arrivent dans le dossier fn_phone de votre organisation.

Envoyer avec un jeton API

Sans agent, fn_bridge a besoin d’un jeton API. Dans le panel FiveDock, ouvrez Jetons, créez un jeton avec le scope files:write et liez-le à votre serveur. Il commence par fd_live_. Ce n’est pas la clé d’agent fda_live_, que l’API d’upload n’accepte pas.

fn_phone lit d’abord le jeton dans Config.Media.token. Si ce champ reste vide, fn_bridge se rabat sur une convar du server.cfg, que tout script reposant sur fn_bridge peut utiliser :

server.cfg
set fn_bridge:upload_token "fd_live_…"

Utilisez set ici. setr réplique la convar dans le jeu de chaque joueur. config.lua est sûr aussi, puisque fn_phone ne le charge que comme script serveur. Réglez provider = 'fivedock' comme dans la section sur l’agent. Si un jeton et l’agent sont tous deux présents, fn_bridge utilise le jeton.

Pour chaque fichier, fn_bridge envoie cette requête :

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"}

Le nom du fichier est fn_phone_, l’heure d’upload en secondes Unix et un nombre aléatoire. FiveDock répond avec le lien du CDN dans data.url, et c’est là que fn_bridge le lit.

Modifier depuis le jeu

Admin → Configuration du serveur contient les deux réglages dans l’étape Envois et web : Stockage correspond à Media.provider et Jeton fivedock à Media.token. Le panel n’affiche jamais un jeton enregistré, seulement s’il y en a un. Les valeurs enregistrées vont dans le stockage KVP du serveur et s’appliquent par-dessus config.lua après un redémarrage de fn_phone : un Stockage enregistré en jeu l’emporte donc sur le fichier.

Vérifier que ça marche

Après le redémarrage, la console n’affiche plus la ligne sur les photos dans la base. Prenez une photo avec l’appareil et ouvrez Fichiers dans le panel FiveDock : elle est dans le dossier fn_phone, sous un nom comme fn_phone_1792756800_482913.webp. Dans la base, les lignes les plus récentes doivent contenir des liens FiveDock :

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

Une url qui commence par https://cdn.fivedock.dev/ est sur FiveDock. Une url qui commence par data: est dans la base : l’upload a échoué et fn_phone y a stocké le fichier. Pour obtenir une erreur sur le téléphone à la place, ajoutez fallback = false dans Config.Media ; une photo ou une vidéo dont l’upload échoue n’est alors pas enregistrée du tout. Les messages vocaux retombent toujours dans la base.

Ce que fn_phone envoie

  • Les photos de l’appareil, en WebP par défaut. Config.Media.encoding accepte webp, jpg ou png, et quality règle la compression, 0.85 par défaut. L’appareil photo demande que screencapture ou screenshot-basic tourne.
  • Les vidéos, en WebM avec VP9 ou VP8 à 1,6 Mbit/s. L’appareil coupe un clip à 30 secondes, donc un clip reste autour de 6 Mo.
  • Les messages vocaux et ceux de la messagerie vocale, en WebM avec audio Opus, jusqu’à 400 KiB chacun.
  • Les images ajoutées à Photos depuis un lien : PNG, JPEG, WebP ou GIF jusqu’à 2,25 MiB. Le serveur télécharge sa propre copie et l’envoie, donc la photo survit à un lien Discord qui expire.

FiveDock accepte tout cela. Côté téléphone, les enregistrements d’écran font exception : fn_phone les garde dans la base, dans son propre format, quel que soit le provider.

Les messages vocaux apparaissent comme des vidéos

Les messages vocaux sont des fichiers WebM, le même conteneur que les vidéos de fn_phone. FiveDock lit le type d’un fichier dans ses octets, donc le panel range les messages vocaux sous vidéo.

Photos encore chez Fivemanage

fn_phone a supprimé l’option Fivemanage dans la version 1.1.11. Si votre config.lua contient encore provider = 'fivemanage', remplacez-le par 'fivedock' comme plus haut. Les photos prises avant le changement gardent leurs liens Fivemanage, tout comme celles que fn_phone_migrate a reprises de lb-phone ou d’un autre téléphone, puisque l’import copie chaque lien tel quel. Elles se chargent tant que les fichiers restent chez Fivemanage. Depuis la 1.1.11, les liens r2.fivemanage.com ne fonctionnent plus comme sonneries personnalisées.

Les liens se trouvent dans la colonne url de fn_phone_media, et les Messages, les annonces et les stories pointent vers ces lignes par leur clé de 16 caractères. La migration copie vos fichiers Fivemanage avec une clé en lecture seule et vous remet une liste ancien lien → nouveau lien. Chaque ligne de cette liste devient une requête :

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

Rien n’est modifié ni supprimé chez Fivemanage, vous pouvez donc lancer ces requêtes quand vous voulez.

Si les uploads échouent

  • Les photos finissent toujours dans la base. fn_phone stocke une photo dans la base quand son upload échoue : une faute de frappe dans le jeton, un jeton sans files:write et une organisation pleine se ressemblent donc sur le téléphone. Une organisation au-delà de sa limite de stockage refuse les uploads avec 429. Vérifiez le jeton dans Config.Media.token ou fn_bridge:upload_token, et le stockage dans le panel.
  • L’agent tourne, mais les uploads échouent encore. Un jeton passe avant l’agent. Si Config.Media.token ou fn_bridge:upload_token contient un ancien jeton, fn_bridge envoie celui-là. Videz les deux pour passer par l’agent.
  • La console affiche toujours [fn_phone] photos are stored in the database (Config.Media.provider = local); use fivedock for a CDN. Un Stockage enregistré dans Admin → Configuration du serveur remplace config.lua. Modifiez-le là, ou cliquez sur Rétablir à côté.
  • L’appareil photo ne prend pas de photos. fn_phone a besoin de screencapture ou de screenshot-basic pour l’appareil photo. Vérifiez que l’un des deux est démarré.

Questions fréquentes

fn_phone fonctionne-t-il avec FiveDock ?

Oui, sans toucher à ses fichiers. Réglez Config.Media.provider = 'fivedock', puis lancez l’agent fivedock ou donnez à fn_phone un jeton fd_live_ avec le scope files:write, dans Config.Media.token ou dans la convar fn_bridge:upload_token. fn_bridge envoie chaque photo, vidéo et message vocal depuis le serveur et stocke le lien du CDN.

Faut-il un jeton API pour fn_phone ?

Pas si l’agent fivedock tourne sur le serveur. Sans jeton défini, fn_bridge confie chaque upload à l’agent, qui se connecte avec sa propre clé fda_live_. Un jeton fd_live_ ne sert que sur un serveur sans agent.

fn_phone peut-il encore envoyer vers Fivemanage ?

Non. La version 1.1.11 a retiré l’option Fivemanage, et Config.Media.provider accepte désormais local ou fivedock. Les anciens liens Fivemanage dans fn_phone_media continuent de se charger tant que les fichiers existent, et la migration de FiveDock copie les fichiers et liste les nouveaux liens.

Les joueurs peuvent-ils utiliser des liens FiveDock comme sonnerie ?

Oui. fivedock.dev est le premier hôte de Config.Ringtones.hosts, et les sous-domaines comptent, donc un lien sur cdn.fivedock.dev passe. Le lien doit se terminer par une extension de fichier audio comme .mp3 ou .ogg. Envoyez le fichier dans Fichiers, puis collez son lien sur le téléphone dans Réglages → Sons et vibrations → Sonnerie.

Config.Fivedock est-il le même réglage ?

Non. Config.Fivedock envoie les événements Black Box, les journaux du téléphone, vers votre panel FiveDock. Les photos, vidéos et messages vocaux ne suivent que Config.Media. Quand l’agent tourne, les deux fonctionnent sans jeton.

Tous les articles