{"id":40269961,"url":"https://github.com/kibook/pmms","last_synced_at":"2026-01-20T02:54:05.385Z","repository":{"id":44397842,"uuid":"317760058","full_name":"kibook/pmms","owner":"kibook","description":"Synchronized media player for FiveM and RedM","archived":false,"fork":false,"pushed_at":"2023-04-06T13:09:57.000Z","size":341,"stargazers_count":114,"open_issues_count":32,"forks_count":47,"subscribers_count":8,"default_branch":"master","last_synced_at":"2023-11-07T17:18:22.422Z","etag":null,"topics":["citizenfx","fivem","redm"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kibook.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-12-02T05:30:44.000Z","updated_at":"2023-10-30T01:01:07.000Z","dependencies_parsed_at":"2023-01-19T22:47:28.352Z","dependency_job_id":null,"html_url":"https://github.com/kibook/pmms","commit_stats":null,"previous_names":[],"tags_count":0,"template":null,"template_full_name":null,"purl":"pkg:github/kibook/pmms","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kibook%2Fpmms","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kibook%2Fpmms/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kibook%2Fpmms/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kibook%2Fpmms/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kibook","download_url":"https://codeload.github.com/kibook/pmms/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kibook%2Fpmms/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28594958,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-20T02:08:49.799Z","status":"ssl_error","status_checked_at":"2026-01-20T02:08:44.148Z","response_time":117,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["citizenfx","fivem","redm"],"created_at":"2026-01-20T02:54:04.576Z","updated_at":"2026-01-20T02:54:05.377Z","avatar_url":"https://github.com/kibook.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# pmms - FiveM/RedM synchronized media player\n\npmms (Poodle's MultiMedia System) allows players to play music/video from entities such as phonographs, radios or TVs.\n\n# Features\n\n- NUI-based, using [MediaElement.js](https://www.mediaelementjs.com/) to support HTML5 media, HLS, YouTube, and more.\n\n- Synchronized between players.\n\n- Multiple entities can play different things at the same time.\n\n- Dynamic sound attenuation based on whether the player and entity are in the same interior room.\n\n- Optional immersive filter can be applied to any audio.\n\n- Play video on a TV screen or scaleform with DUI (FiveM), or on a screen displayed above the entity (RedM).\n\n- Play audio inside or outside of vehicles.\n\n- Permissions system and ability to lock entities so only certain players can control them.\n\n- Configure default entities which are spawned and play music/video automatically.\n\n- Audio visualizations via [Wave.js](https://foobar404.github.io/Wave.js/#/).\n\n# Examples\n\n| | | |\n|-|-|-|\n|[![Attenuation Example](https://i.imgur.com/BTkglVYm.jpg)](https://imgur.com/BTkglVY)| [![Phonograph Filter](https://i.imgur.com/L8sWpOCm.jpg)](https://imgur.com/L8sWpOC) | [![Video](https://i.imgur.com/2jRYlSem.jpg)](https://imgur.com/2jRYlSe) |\n|[![FiveM basic audio](https://i.imgur.com/CofS0VPm.jpg)](https://imgur.com/CofS0VP)|[![FiveM DUI example](https://i.imgur.com/ndZwPvDm.jpg)](https://imgur.com/ndZwPvD)|[![DUI render target proximity](https://i.imgur.com/m2KddI6m.jpg)](https://imgur.com/m2KddI6)|\n|[![Audio Visualizations](https://i.imgur.com/4E42m4tm.jpg)](https://imgur.com/4E42m4t)|[![Vehicle modes](https://i.imgur.com/gkx5oRym.jpg)](https://imgur.com/gkx5oRy)|[![Scaleform adjustment](https://i.imgur.com/AcAiGzzm.jpg)](https://imgur.com/AcAiGzz)|\n\n# Dependencies\n\n- [httpmanager](https://github.com/kibook/httpmanager)\n\n# Installing\n\n1. Install all [dependencies](#dependencies).\n\n2. Place the files from this repository in a new folder in your resources directory.\n\n   Example: `resources/[local]/pmms`\n   \n   \u003e **NOTE**\n   \u003e \n   \u003e The name of the resource **must** be in all lowercase in order for it to function properly. This is due to how [NUI callbacks](https://docs.fivem.net/docs/scripting-manual/nui-development/nui-callbacks/) work.\n\n3. Add the following in server.cfg:\n   ```\n   exec @pmms/permissions.cfg\n   start pmms\n   ```\n\n# Permissions\n\nThe default permissions allow members of `group.admin` full access to pmms, while other players will only be able to perform basic interactions with media players and only be able to play preset songs (those defined in `Config.presets` in [config.lua](config.lua)).\n\nTo allow all players to be able to play custom URLs, in [permissions.cfg](permissions.cfg), uncomment or add the following line:\n\n```\nadd_ace builtin.everyone pmms.customUrl allow\n```\n\nEven with this ace, URLs will be restricted to those allowed by `Config.allowedUrls`, which includes generally safe sites such as YouTube. To allow players to use URLs from other sites, you can either add the appropriate pattern to `Config.allowedUrls`, or uncomment or add the following line to remove the restriction entirely:\n\n```\nadd_ace builtin.everyone pmms.anyUrl allow\n```\n\nKeep in mind that media played with pmms is loaded individually by all players, meaning each player will be accessing the URL from their own connection. Therefore, allowing any player to play a random URL can present some risk of exposing players' IP addresses to an attacker playing something from their own web server and logging the connections.\n\n# Commands\n\n\u003e **Note**\n\u003e \n\u003e The command names can be customized. These are the defaults.\n\n| Command                | Description                                       |\n|------------------------|---------------------------------------------------|\n| `/pmms`                | Open the media player control panel.              |\n| `/pmms_play [url] ...` | Play music/video on the nearest media player.     |\n| `/pmms_pause`          | Pause playback on the nearest media player.       |\n| `/pmms_stop`           | Stop playback on the nearest media player.        |\n| `/pmms_status`         | Show the status of the nearest media player.      |\n| `/pmms_presets`        | List presets.                                     |\n| `/pmms_vol [volume]`   | Set a personal base volume for all media players. |\n| `/pmms_fix`            | Reset your client, which may fix certain issues.  |\n| `/pmms_ctl`            | Advanced media player control.                    |\n| `/pmms_add`            | Add or modify a media player model preset.        |\n| `/pmms_refresh_perms`  | Refresh permissions for all clients.              |\n\n# Exports\n\n## Server-side\n\n### startByNetworkId\n\n```lua\nhandle = exports.pmms:startByNetworkId(netId, options)\n```\n\nStarts playing something on a networked media player entity, using its network ID.\n\n#### Media player options\n\n`options` is a table of options for the new media player.\n\n| Option           | Description                                                                             |\n|------------------|-----------------------------------------------------------------------------------------|\n| `url`            | The URL of the media to play.                                                           |\n| `title`          | The title of the media to display.                                                      |\n| `volume`         | The volume of the new media player. Default: 100.                                       |\n| `offset`         | The time to start the media at in seconds. Default: 0.                                  |\n| `duration`       | The duration of the media. `nil`, `false` or `0` will treat the media as a live stream. |\n| `loop`           | Whether to loop the media. Requires a duration.                                         |\n| `filter`         | Whether to apply the immersive filter to the media player.                              |\n| `locked`         | Whether to lock the media player.                                                       |\n| `video`          | Whether to display NUI video (RedM only).                                               |\n| `videoSize`      | The size of the NUI video screen (RedM only).                                           |\n| `muted`          | Whether the media player is muted by default.                                           |\n| `attenuation`    | The attenuation multipliers for the media player.                                       |\n| `diffRoomVolume` | Difference between the base volume in the same room and a different room.               |\n| `range`          | The range of the media player.                                                          |\n| `visualization`  | The audio visualization to apply to the media player.                                   |\n\n### startByCoords\n\n```lua\nhandle = exports.pmms:startByCoords(x, y, z, options)\n```\n\nStarts playing something on a non-networked media player entity, using its coordinates on the world map.\n\nFor `options`, refer to [Media player options](#media-player-options).\n\n### startScaleform\n\n```lua\nhandle = exports.pmms:startScaleform(scaleform, options)\n```\n\nStarts playing something on a standalone scaleform screen.\n\nFor `options`, refer to [Media player options](#media-player-options).\n\n#### Scaleform options\n\n`scaleform` is a table of options for the scaleform screen.\n\n| Option     | Description                                                    |\n|------------|----------------------------------------------------------------|\n| `name`     | The name of the scaleform (.gfx filename minus extension).     |\n| `position` | A `vector3` for the coordinates of the top-left of the screen. |\n| `rotation` | A `vector3` for the orientation of the screen.                 |\n| `scale`    | A `vector3` for the scale of the screen.                       |\n\n### stop\n\n```lua\nexports.pmms:stop(handle)\n```\n\nStops a media player and removes its handle.\n\n### pause\n\n```lua\nexports.pmms:pause(handle)\n```\n\nPause or resume a media player.\n\n### lock\n\n```lua\nexports.pmms:lock(handle)\n```\n\nLocks an active media player so that only privileged users can interact with it.\n\n### unlock\n\n```lua\nexports.pmms:unlock(handle)\n```\n\nUnlocks an active media player so anyone can interact with it.\n\n### mute\n\n```lua\nexports.pmms:mute(handle)\n```\n\nMutes an active media player.\n\n### unmute\n\n```lua\nexports.pmms:unmute(handle)\n```\n\nUnmutes an active media player.\n\n## Client-side\n\n### enableEntity\n\n```lua\nexports.pmms:enableEntity(entity)\n```\n\nAllows the player to use a particular entity if they do not have the `pmms.anyEntity` ace.\n\n\n### disableEntity\n\n```lua\nexports.pmms:disableEntity(entity)\n```\n\nDisables the use of this entity for a player without the `pmms.anyEntity` ace.\n\n\n### createMediaPlayer\n\n```lua\nentity = exports.pmms:createMediaPlayer(options)\n```\n\nCreates a new networked entity which the player can use as a media player.\n\n#### createMediaPlayer options\n\n| Option     | Description                                                              |\n|------------|--------------------------------------------------------------------------|\n| `model`    | The entity model to use. If omitted, `Config.defaultModel` will be used. |\n| `position` | A vector3 for the coordinates where the entity will be spawned.          |\n| `rotation` | A vector3 for the orientation of the entity.                             |\n\n\n### deleteMediaPlayer\n\n```lua\nexports.pmms:deleteMediaPlayer(entity)\n```\n\nDeletes an entity created by [createMediaPlayer](#createmediaplayer).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkibook%2Fpmms","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkibook%2Fpmms","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkibook%2Fpmms/lists"}