Zum Inhalt springen
Blog

fn_phone: Fotos und Videos auf FiveDock hochladen

Schick Fotos, Videos und Sprachnachrichten von fn_phone an FiveDock statt in die Datenbank: eine Config-Zeile, dazu der fivedock-Agent oder ein API-Token.

Von Termi

7 Min. Lesezeit
  • fn_phone
  • Uploads
  • Lua
Auf dieser Seite

fn_phone ist unser eigenes Handy-Resource für FiveM. Standardmäßig landet jedes Foto, Video und jede Sprachnachricht in deiner Datenbank. Mit einer Zeile in der Config gehen sie stattdessen zu FiveDock, und in der Datenbank bleibt nur der Link. Der Upload läuft serverseitig über fn_bridge. Du änderst also keine fn_phone-Dateien, und kein Token erreicht je einen Spieler.

Wo fn_phone Medien speichert

Jede Datei, die das Handy aufnimmt, ist eine Zeile in fn_phone_media. Bei Config.Media.provider = 'local', dem Standard, steht in der Spalte url die ganze Datei als Data-URI, bis zu 3 MiB pro Foto und 12 MiB pro Video. Der Server weist bei jedem Start darauf hin:

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

Mit provider = 'fivedock' übergibt der Server jede Datei an FN_BRIDGE.MEDIA.Upload in fn_bridge, das sie hochlädt und den CDN-Link zurückgibt. fn_bridge erreicht FiveDock auf zwei Wegen. Ist ein Token gesetzt, schickt es die Datei an https://api.fivedock.dev/api/v3/file/base64, dieselbe base64-Adresse, die auch die v3-API von Fivemanage hat. Ohne Token und mit gestarteter fivedock-Agent-Resource schreibt es die Datei in seinen Ordner cache, gibt sie an exports.fivedock:upload weiter und löscht sie danach.

Spieler bekommen nie einen Upload-Link. Ein am Handy aufgenommenes Video geht zuerst als Latent Event an den Server, und der Server lädt es wie ein Foto hoch.

Upload über den fivedock-Agent

Läuft der fivedock-Agent schon auf deinem Server, musst du kein Token anlegen. Der Agent meldet sich mit dem fda_live_-Key aus der server.cfg an, und fn_bridge schickt Uploads darüber, solange kein Token gesetzt ist. Der Agent braucht zwei Zeilen in der server.cfg, wie die Agent-Anleitung sie beschreibt. Setz sie über ensure fn_phone:

server.cfg
set fivedock_key "fda_live_…"
ensure fivedock

Dann stellst du den Provider in fn_phone/config.lua um und lässt token leer:

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

Starte fn_phone neu. Die Uploads landen im Ordner fn_phone deiner Organisation.

Upload mit API-Token

Ohne Agent braucht fn_bridge ein API-Token. Öffne im FiveDock-Panel Tokens, erstelle ein Token mit dem Scope files:write und binde es an deinen Server. Es beginnt mit fd_live_. Der fda_live_-Key des Agents ist es nicht, den akzeptiert die Upload-API nicht.

fn_phone liest das Token zuerst aus Config.Media.token. Ist das Feld leer, greift fn_bridge auf eine Convar in der server.cfg zurück, die jedes Script auf fn_bridge nutzen kann:

server.cfg
set fn_bridge:upload_token "fd_live_…"

Nimm hier set. setr repliziert die Convar ins Spiel jedes Spielers. Auch die config.lua ist sicher, weil fn_phone sie nur als Server-Script lädt. Stell provider = 'fivedock' ein wie im Abschnitt zum Agent. Sind Token und Agent beide da, nimmt fn_bridge das Token.

Für jede Datei schickt fn_bridge diese Anfrage:

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

Der Dateiname besteht aus fn_phone_, der Upload-Zeit in Unix-Sekunden und einer Zufallszahl. FiveDock antwortet mit dem CDN-Link in data.url, und von dort liest fn_bridge ihn aus.

Im Spiel ändern

Unter Admin → Serverkonfiguration stehen beide Einstellungen im Schritt Uploads und Web: Speicher ist Media.provider und fivedock-Token ist Media.token. Das Panel zeigt ein gespeichertes Token nie an, nur ob eins gesetzt ist. Gespeicherte Werte landen im KVP-Speicher des Servers und überlagern nach einem fn_phone-Neustart die config.lua. Ein im Spiel gespeicherter Speicher-Wert schlägt also die Datei.

Prüfen, ob es läuft

Nach dem Neustart gibt die Konsole die Zeile über Fotos in der Datenbank nicht mehr aus. Mach ein Foto mit der Kamera und öffne Dateien im FiveDock-Panel: Es liegt im Ordner fn_phone, unter einem Namen wie fn_phone_1792756800_482913.webp. In der Datenbank sollten die neuesten Zeilen FiveDock-Links enthalten:

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

Eine url, die mit https://cdn.fivedock.dev/ beginnt, liegt bei FiveDock. Beginnt sie mit data:, liegt die Datei in der Datenbank: Der Upload ist fehlgeschlagen, und fn_phone hat sie dort gespeichert. Willst du stattdessen einen Fehler am Handy sehen, trag fallback = false in Config.Media ein. Ein Foto oder Video, dessen Upload scheitert, wird dann gar nicht gespeichert. Sprachnachrichten fallen immer auf die Datenbank zurück.

Was fn_phone hochlädt

  • Fotos von der Kamera, standardmäßig als WebP. Config.Media.encoding nimmt webp, jpg oder png, und quality stellt die Kompression ein, standardmäßig 0.85. Die Kamera braucht ein laufendes screencapture oder screenshot-basic.
  • Videos als WebM mit VP9 oder VP8 bei 1,6 Mbit/s. Die Kamera beendet einen Clip nach 30 Sekunden, ein Clip bleibt also bei etwa 6 MB.
  • Sprachnachrichten und Mailbox-Nachrichten als WebM mit Opus-Audio, jeweils bis 400 KiB.
  • Bilder, die per Link zu Fotos hinzugefügt werden: PNG, JPEG, WebP oder GIF bis 2,25 MiB. Der Server lädt eine eigene Kopie herunter und lädt sie hoch, das Foto überlebt also einen ablaufenden Discord-Link.

FiveDock nimmt all das an. Eine Ausnahme auf Seiten des Handys sind Bildschirmaufnahmen: fn_phone speichert sie in einem eigenen Format in der Datenbank, egal welcher Provider eingestellt ist.

Sprachnachrichten erscheinen als Video

Sprachnachrichten sind WebM-Dateien, derselbe Container wie bei den Videos von fn_phone. FiveDock erkennt den Dateityp an den Bytes, deshalb listet das Panel Sprachnachrichten unter Video.

Fotos, die noch bei Fivemanage liegen

fn_phone hat die Fivemanage-Option mit Version 1.1.11 entfernt. Steht in deiner config.lua noch provider = 'fivemanage', ändere es wie oben auf 'fivedock'. Fotos von vor der Umstellung behalten ihre Fivemanage-Links, genauso Fotos, die fn_phone_migrate aus lb-phone oder einem anderen Handy übernommen hat, denn der Import kopiert jeden Link unverändert. Sie laden, solange die Dateien bei Fivemanage liegen. Seit 1.1.11 funktionieren r2.fivemanage.com-Links nicht mehr als eigene Klingeltöne.

Die Links stehen in der Spalte url von fn_phone_media, und Nachrichten, Anzeigen und Stories verweisen über ihren 16-stelligen Schlüssel auf diese Zeilen. Die Migration kopiert deine Fivemanage-Dateien mit einem schreibgeschützten Key und liefert dir eine Liste alter Link → neuer Link. Jede Zeile dieser Liste wird zu einem Statement:

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

Bei Fivemanage wird nichts geändert oder gelöscht, du kannst die Statements also ausführen, wann du bereit bist.

Wenn Uploads fehlschlagen

  • Fotos landen weiter in der Datenbank. fn_phone speichert ein Foto in der Datenbank, wenn der Upload scheitert. Ein Tippfehler im Token, ein Token ohne files:write und eine volle Organisation sehen am Handy deshalb alle gleich aus. Eine Organisation über dem Speicherlimit lehnt Uploads mit 429 ab. Prüfe das Token in Config.Media.token oder fn_bridge:upload_token und den Speicher im Panel.
  • Der Agent läuft, aber Uploads scheitern weiter. Ein Token hat Vorrang vor dem Agent. Steht in Config.Media.token oder fn_bridge:upload_token ein altes Token, schickt fn_bridge dieses. Leere beide, damit der Upload über den Agent läuft.
  • Die Konsole gibt weiter [fn_phone] photos are stored in the database (Config.Media.provider = local); use fivedock for a CDN aus. Ein in Admin → Serverkonfiguration gespeicherter Speicher-Wert überschreibt die config.lua. Ändere ihn dort oder klick daneben auf Zurücksetzen.
  • Die Kamera macht keine Fotos. fn_phone braucht für die Kamera screencapture oder screenshot-basic. Prüfe, ob eins von beiden gestartet ist.

Häufige Fragen

Funktioniert fn_phone mit FiveDock?

Ja, ohne Änderungen an seinen Dateien. Setz Config.Media.provider = 'fivedock' und starte entweder den fivedock-Agent oder gib fn_phone ein fd_live_-Token mit dem Scope files:write, in Config.Media.token oder in der Convar fn_bridge:upload_token. fn_bridge lädt jedes Foto, Video und jede Sprachnachricht vom Server hoch und speichert den CDN-Link.

Brauche ich für fn_phone ein API-Token?

Nicht, wenn der fivedock-Agent auf dem Server läuft. Ohne gesetztes Token gibt fn_bridge jeden Upload an den Agent weiter, der sich mit seinem eigenen fda_live_-Key anmeldet. Ein fd_live_-Token brauchst du nur auf einem Server ohne Agent.

Kann fn_phone noch zu Fivemanage hochladen?

Nein. Version 1.1.11 hat die Fivemanage-Option entfernt, und Config.Media.provider nimmt jetzt local oder fivedock. Alte Fivemanage-Links in fn_phone_media laden weiter, solange die Dateien existieren, und die Migration von FiveDock kopiert die Dateien und listet die neuen Links auf.

Können Spieler FiveDock-Links als Klingelton nutzen?

Ja. fivedock.dev ist der erste Host in Config.Ringtones.hosts, Subdomains zählen mit, ein Link auf cdn.fivedock.dev geht also durch. Der Link muss auf eine Audio-Endung wie .mp3 oder .ogg enden. Lade die Datei unter Dateien hoch und füge ihren Link am Handy unter Einstellungen → Töne & Haptik → Klingelton ein.

Ist Config.Fivedock dieselbe Einstellung?

Nein. Config.Fivedock schickt Black-Box-Events, die Logs des Handys, an dein FiveDock-Panel. Fotos, Videos und Sprachnachrichten richten sich nur nach Config.Media. Läuft der Agent, funktionieren beide ohne Token.

Alle Artikel