[{"data":1,"prerenderedAt":96},["ShallowReactive",2],{"site":3,"config-slug-site":15,"config-product-en-x3d-music":21,"config-public-x3d-music":91},{"site":4,"contact":10,"seo":13,"payment":14},{"name":5,"host":6,"default_locale":7,"locales":8},"X3D Developer","fivem.x3d-developer.com","th",[7,9],"en",{"discord_invite":11,"email":12,"line":12},"https:\u002F\u002Fdiscord.gg\u002FNA5kPVynFv","",{"google_site_verification":12,"bing_site_verification":12},{"bank_name":12,"account_name":12,"account_no":12,"promptpay_id":12},{"site":16,"contact":18,"seo":19,"payment":20},{"name":5,"host":6,"default_locale":7,"locales":17},[7,9],{"discord_invite":11,"email":12,"line":12},{"google_site_verification":12,"bing_site_verification":12},{"bank_name":12,"account_name":12,"account_no":12,"promptpay_id":12},{"id":22,"slug":23,"name":24,"summary":25,"price_thb":26,"license_mode":27,"cover_key":28,"cover_url":29,"category_slugs":30,"tags":32,"latest_version":52,"latest_released_at":53,"published_at":54,"has_docs":55,"config":56,"rent_price_satang":57,"description_md":58,"docs_md":59,"seo_title":60,"seo_description":61,"media":62,"versions":76},"c72d91e0-6bcd-4fae-bde9-0e140e02b0cb","x3d-music","X3D Music","Free ESX boombox: place it on the ground or mount it on a car, play YouTube with a shared queue and distance falloff; speakers survive restarts.",0,"none","public\u002Fproducts\u002Fx3d-music\u002Fcover\u002Fce445e0d251f7540.jpg","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-music\u002Fcover\u002Fce445e0d251f7540.jpg",[31],"entertainment",[33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],"boombox","ลำโพง","ลำโพงเปิดเพลง","เปิดเพลง youtube","music script","fivem music","xsound","youtube","คิวเพลง","ติดบนรถ","esx","ฟรี","free","ลำโพงติดรถ","เปิดเพลงในรถ","ฟังเพลงด้วยกัน","เพลงร่วมกัน","ลำโพงวางพื้น","จำกัดลำโพง","1.1.4","2026-10-12T17:17:14.482272Z","2026-09-26T14:56:09.091062Z",true,"public",null,"A free boombox for ESX. Put a speaker on the ground or on a car and play YouTube for everyone around.\r\n\r\n---\r\n\r\n## Features\r\n\r\n- [+] Easy setup: tune everything in config, or set it from the web builder\r\n- [+] Place the speaker on the ground or on a car, with a ghost preview and scroll rotate\r\n- [+] Search YouTube by name or paste a link; the API key stays on the server\r\n- [+] Shared queue with a length you set, or owner-only adding\r\n- [+] Owner can play, pause, skip, clear and pick a 10\u002F20\u002F30 m range\r\n- [+] Volume fades with distance; set how fast it drops\r\n- [+] Set speaker limits per player and per server\r\n- [+] Set the longest song; live streams cannot be added\r\n- [+] Ground speakers survive restarts; car speakers return as an item\r\n- [+] Admins stop one speaker or all with musicstop\r\n- [+] Set the item name and prop model, or turn car mounting off\r\n- [+] Hook it into other scripts in addons\u002F\r\n\r\n---\r\n\r\n## What's inside\r\n\r\n- **Ground or vehicle**: use the `boombox` item, see a ghost preview, rotate with the scroll wheel, or aim at a car to mount it.\r\n- **YouTube search**: search by name or paste a link. The API key stays on the server.\r\n- **Shared queue**: anyone in range can add songs, up to 25, and everyone sees who added what.\r\n- **Owner controls**: play, pause, skip, clear, volume, range 10\u002F20\u002F30 m and pick up.\r\n- **Distance falloff**: the music fades as you walk away, up to 3 speakers are heard at once, and people who arrive late hear the song from the right point.\r\n- **Survives restarts**: ground speakers are saved in the database; vehicle speakers go back to the owner when the car is gone.\r\n- **Limits**: per player and per server, and admins can stop music with `musicstop`.\r\n- **Thai and English**\r\n\r\n---\r\n\r\n## Make it fit your server\r\n\r\n| File | Job |\r\n|---|---|\r\n| `addons\u002Fitems\u002Fserver.lua` | Returns the boombox to the player (hook up your mail system here) |\r\n| `addons\u002Fvehiclekey\u002Fserver.lua` | Who may mount a speaker on a car (hook up your vehicle keys here) |\r\n| `addons\u002Fnotify\u002Fclient.lua` | Notifications |\r\n| `addons\u002Fprompt\u002Fclient.lua` | Floating label and the [E] key |\r\n\r\n---\r\n\r\n## Requirements\r\n\r\n- `es_extended` (ESX Legacy)\r\n- `oxmysql`\r\n- A YouTube Data API v3 key (free from Google Cloud)\r\n","## Installation\n\n1. Put the `x3d_music` folder in `resources\u002F`. **Do not rename the folder.**\n2. Run `install.sql` to create `x3d_music_speakers` and add the `boombox` item (with ox_inventory, add the item to `items.lua` instead; the file has an example).\n3. Add to `server.cfg`:\n\n```\nset x3d_music_ytkey \"your YouTube API key\"\nensure oxmysql\nensure es_extended\nensure x3d_music\n```\n\n> **Put the key in server.cfg only.** Never put it in `config\u002Fconfig.lua`, which is sent to every player.\n\n## Getting a YouTube API key (free)\n\n1. Open the Google Cloud Console and create a project.\n2. APIs & Services > Library: find **YouTube Data API v3** and enable it.\n3. Credentials > Create credentials > API key, then copy the key.\n4. Put it in `server.cfg` as above and restart the resource.\n\nThe free quota is 10,000 units a day and one search costs about 101, which is plenty for most servers. Without a key, players can still place speakers but cannot search or add songs.\n\n## Requirements\n\n| Resource | Required | Used for |\n|---|---|---|\n| `es_extended` | yes | ESX Legacy |\n| `oxmysql` | yes | saving placed speakers |\n\n---\n\n## All settings: `config\u002Fconfig.lua`\n\n| Setting | Default | Meaning |\n|---|---|---|\n| `Config.Locale` | `'th'` | `'th'` or `'en'` |\n| `Config.Item` \u002F `Config.PropModel` | `'boombox'` \u002F `'prop_boombox_01'` | Item and prop |\n| `Config.SearchMaxResults` | `12` | Search results |\n| `Config.SearchCooldownMs` | `4000` | Time between searches (ms) |\n| `Config.MaxTrackSeconds` | `10800` | Longest song (s); live streams cannot be added |\n| `Config.InteractDistance` | `2.5` | [E] distance |\n| `Config.StreamDistance` | `65.0` | Distance at which speakers appear |\n| `Config.Ranges` \u002F `Config.DefaultRange` | `{10,20,30}` \u002F `20` | Selectable ranges |\n| `Config.DefaultVolume` | `60` | Starting volume |\n| `Config.FalloffPower` | `1.6` | How fast the volume drops with distance |\n| `Config.MaxConcurrentAudible` | `3` | Speakers heard at once |\n| `Config.MaxSpeakers` \u002F `Config.MaxPerPlayer` | `40` \u002F `2` | Speakers per server \u002F per player |\n| `Config.QueueMax` | `25` | Longest queue |\n| `Config.PublicQueue` | `true` | `false` = only the owner adds songs |\n| `Config.AdminGroups` | admin, superadmin | Control every speaker and use `musicstop` |\n| `Config.VehicleMount` | on | Mount on vehicles, `maxZOffset` |\n| `Config.OwnedVehiclesTable` | `'owned_vehicles'` | ESX vehicle table for the owner check |\n\n---\n\n## Fitting your server: `addons\u002F`\n\n| File | Functions | Default |\n|---|---|---|\n| `addons\u002Fitems\u002Fserver.lua` | `Items.Return(identifier)` | Into the ESX bag; if full or offline, returned on the next join |\n| `addons\u002Fvehiclekey\u002Fserver.lua` | `VehicleKey.Has(source, plate, vehicle)` | In the driver seat, or the owner in `owned_vehicles` |\n| `addons\u002Fnotify\u002Fclient.lua` | `Notify(message, kind)` | esx_notify, then ox_lib, then ESX |\n| `addons\u002Fprompt\u002Fclient.lua` | `Prompt.Draw3D`, `Prompt.IsInteractPressed` | 3D text, [E] |\n\n## Admin commands\n\n| Command | Does |\n|---|---|\n| `musicstop all` | Stops music and clears the queue on every speaker |\n| `musicstop \u003Cid>` | Stops one speaker (ids look like `g12`, `v3`) |\n\n## Troubleshooting\n\n| Symptom | Cause \u002F fix |\n|---|---|\n| Search says there is no key | `set x3d_music_ytkey` is missing from server.cfg, or comes after the `ensure` line |\n| A song will not add | It is a live stream or longer than `Config.MaxTrackSeconds` |\n| Using the item does nothing | The `boombox` item is missing from the database, or the player hit `Config.MaxPerPlayer` |\n| Some songs are silent | The uploader disabled embedding on YouTube; try another song |\n","Free FiveM ESX Boombox: YouTube Music Speaker","Free FiveM ESX boombox: YouTube music on the ground or on a car, shared queue, distance falloff, API key kept on the server.",[63,66,68,70,72,74],{"kind":64,"url":65},"image","\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-music\u002Fmedia\u002Ff997ccd3243c45ce.png",{"kind":64,"url":67},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-music\u002Fmedia\u002F2a3abb94fdeb7fb6.png",{"kind":64,"url":69},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-music\u002Fmedia\u002Fca0ac6e81ba8ea46.png",{"kind":64,"url":71},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-music\u002Fmedia\u002F2e03247b64d9093e.png",{"kind":64,"url":73},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-music\u002Fmedia\u002F1f4be38e3267f411.png",{"kind":64,"url":75},"\u002Fapi\u002Fv1\u002Fmedia\u002Fpublic\u002Fproducts\u002Fx3d-music\u002Fmedia\u002Fa312550bd1797eba.png",[77,79,83,87],{"version":52,"released_at":53,"changelog_md":78},"### Changed\n\n- Store images now carry English captions for the English store page",{"version":80,"released_at":81,"changelog_md":82},"1.1.2","2026-10-12T03:23:21.815599Z","### Changed\n\n- UI font is now Kanit (one family for Thai and English), bundled inside the script; the Thai font now really loads in game (FiveM's browser dropped the old font declaration and fell back to a system font)\n- New store images",{"version":84,"released_at":85,"changelog_md":86},"1.1.1","2026-10-11T09:19:43.787308Z","### Changed\n\n- Boombox `[E]` label uses the X3D 3D-text standard (outlined Thai text, amber key line)",{"version":88,"released_at":89,"changelog_md":90},"1.0.0","2026-09-26T14:56:07.80947Z","First public release.\n\n### Added\n\n- `boombox` item: place it on the ground (ghost preview, scroll to rotate) or aim at a vehicle to mount it.\n- YouTube search through the server, so the API key (`x3d_music_ytkey` convar) never reaches players. Search by name or paste a link.\n- Shared queue (anyone in range can add, up to 25), owner controls for play, pause, skip, stop, volume, range 10\u002F20\u002F30 m and pick up.\n- Playback through hidden YouTube players with distance falloff, up to 3 speakers heard at once, and late joiners start at the right point.\n- Ground speakers are saved in `x3d_music_speakers` and come back after a restart; vehicle speakers are returned when the vehicle is gone.\n- Picked-up speakers go back to the bag; if it is full or the owner is offline, they are returned on the next join.\n- Limits per player and per server, `musicstop \u003Cid|all>` for admins, Thai and English.",{"slug":23,"version":52,"latest_version":52,"files":92,"options":57},[93],{"path":94,"content":95},"config\u002Fconfig.lua","Config = {}\n\n-- ===== ระบบ \u002F System =====\n\n-- เฟรมเวิร์ก: 'auto' | 'esx' | 'standalone'\n-- Framework: 'auto' | 'esx' | 'standalone'\nConfig.Framework = 'auto'\n-- ภาษา: 'th' | 'en' \u002F Language: 'th' | 'en'\nConfig.Locale = 'th'\n-- เปิดข้อความ debug · ต้อง false ตอนใช้จริง \u002F Enables debug output · must be false in production\nConfig.Debug = false\n\n-- ===== YouTube =====\n-- ใส่ API key ใน server.cfg (ห้ามใส่ในไฟล์นี้ ไฟล์นี้ถูกส่งไปที่เครื่องผู้เล่น):\n--   set x3d_music_ytkey \"AIza...\"\n-- ไม่มี key = ค้นหา\u002Fเพิ่มเพลงไม่ได้ (ดูวิธีขอ key ฟรีใน docs)\n-- Put the API key in server.cfg (never in this file, it is sent to players):\n--   set x3d_music_ytkey \"AIza...\"\n-- No key = no search or adding songs (see the docs for how to get a free key)\n\n-- จำนวนผลค้นหา \u002F Number of search results\nConfig.SearchMaxResults = 12\n-- เว้นระหว่างค้นหา (ms) \u002F Time between searches (ms)\nConfig.SearchCooldownMs = 4000\n-- ความยาวเพลงสูงสุด (วินาที) · ไลฟ์สดเพิ่มไม่ได้ \u002F Longest song (seconds) · live streams cannot be added\nConfig.MaxTrackSeconds = 3 * 3600\n\n-- ===== ไอเทมและโมเดล \u002F Item and model =====\n\n-- ชื่อไอเทมลำโพง \u002F Speaker item name\nConfig.Item = 'boombox'\n-- โมเดลพร็อพลำโพง \u002F Speaker prop model\nConfig.PropModel = 'prop_boombox_01'\n\n-- ===== เสียง \u002F Sound =====\n\n-- ระยะกด [E] \u002F [E] distance\nConfig.InteractDistance = 2.5\n-- ระยะที่ลำโพงปรากฏ \u002F Distance at which speakers appear\nConfig.StreamDistance = 65.0\n-- ระยะเสียงที่เจ้าของเลือกได้ (เมตร) \u002F Ranges the owner can pick (metres)\nConfig.Ranges = { 10, 20, 30 }\n-- ระยะเสียงเริ่มต้น \u002F Default range\nConfig.DefaultRange = 20\n-- ระดับเสียงเริ่มต้น \u002F Default volume\nConfig.DefaultVolume = 60\n-- เสียงเบาลงตามระยะ ยิ่งมากยิ่งลดเร็ว \u002F Volume falls off with distance, higher = faster drop\nConfig.FalloffPower = 1.6\n-- ได้ยินพร้อมกันได้กี่ตัว (ใกล้สุดก่อน) \u002F Speakers heard at once (nearest first)\nConfig.MaxConcurrentAudible = 3\n\n-- ===== จำกัดจำนวน \u002F Limits =====\n\n-- ลำโพงสูงสุดทั้งเซิร์ฟ \u002F Max speakers on the server\nConfig.MaxSpeakers = 40\n-- ลำโพงสูงสุดต่อคน \u002F Max speakers per player\nConfig.MaxPerPlayer = 2\n-- เพลงสูงสุดในคิว \u002F Max songs in the queue\nConfig.QueueMax = 25\n-- true = ทุกคนที่อยู่ในระยะเพิ่มเพลงเข้าคิวได้ · false = เฉพาะเจ้าของ\n-- true = anyone in range can queue songs · false = owner only\nConfig.PublicQueue = true\n\n-- ===== แอดมิน \u002F Admin =====\n\n-- กลุ่มที่คุมทุกลำโพงและใช้ musicstop ได้ \u002F Groups that control every speaker and can use musicstop\n-- เช่น \u002F e.g. ['moderator'] = true\nConfig.AdminGroups = {\n    ['admin'] = true,\n    ['superadmin'] = true,\n}\n\n-- ===== ติดลำโพงบนรถ \u002F Vehicle mount =====\n\nConfig.VehicleMount = {\n    -- เปิด\u002Fปิดการติดบนรถ \u002F Allow mounting on vehicles\n    enabled = true,\n    -- ความสูงสูงสุดที่ติดได้เหนือจุดกลางรถ (เมตร) \u002F Max height offset above the vehicle origin (metres)\n    maxZOffset = 2.5,\n}\n-- ตารางรถของผู้เล่นสำหรับเช็คเจ้าของ · ใช้เฉพาะโหมด ESX เท่านั้น standalone เช็คแค่คนขับ (ดู addons\u002Fvehiclekey\u002Fserver.lua)\n-- Player vehicle table for the owner check · ESX mode only, standalone only checks the driver (see addons\u002Fvehiclekey\u002Fserver.lua)\nConfig.OwnedVehiclesTable = 'owned_vehicles'\n",1792316315162]