As a Roblox developer, it is currently too hard to check if a sound is by APM Music, and thus makes it difficult to comply with the 250 APM music maximum if you have ways players can play their own music (radio game passes). You can check by checking if the sound author is ROBLOX and if they have “APM Music” in their description, but I think this could be made easier by having a simple API developers can call.
November 2024 Update
The terms of use state that this limit applies to all Licensed Music, and not just APM.
Given Roblox’s recent agreement with Distrokid, and their showcases at RDC, Roblox cannot expect me to keep up with every single artist in order to allow for custom sounds in my game.
local audioId = 1491039643
local audioData = game:GetService("MarketplaceService"):GetProductInfo(audioId)
if audioData.Creator.CreatorTargetId == 1 then
if string.find(audioData.Description, "Courtesy of APM Music.") ~= nil then
print("Sound is by APM Music.")
end
end
It’s pretty simple to keep a personal log of which and/or how many APM audios you have in your game, if not putting all the music IDs in a table or parenting all the music Sound objects in a dedicated bin.
I definitely think radio game passes are going to be a tetchy subject at this point (especially considering that most people like to play copyrighted songs, too). I’ve never had a radio game pass in my game but I think that Roblox would want us to provide a pre-made list of music instead of letting players input their own, thus safely managing the royalty free music limit. It may not be what players want but we all need to respect Roblox’s rules.
I am bumping this because even after 6 years, not only is the 250 limit still in place, but the terms of use state that this 250 limit is for all licensed music.
250 Track Limit. Notwithstanding the foregoing, Creator may not use Licensed Music to create a streaming service or music library within an Experience or other UGC, nor may Creator charge Users to listen to a specific track of the Licensed Music. Creator has the right to place, play, and have played up to 250 distinct tracks of Licensed Music at any one time in a single Experience or other UGC With Licensed Music. Creator can replace existing tracks of Licensed Music in an Experience or other UGC with new tracks at any time, provided that at any one time there are no more than 250 tracks in such Experience or UGC With Licensed Music.
Given Roblox’s recent agreement with Distrokid, and their showcases at RDC, Roblox cannot expect me to keep up with every single artist in order to allow for custom sounds in my game.
There’s a plugin called Luau+ that makes it so you can use :IsLicensed. You can download Luau+ for free here: Luau+ Creator Store. Once you’ve downloaded Luau+ you can use my script to check if the sound is licensed or not. If there’s any issues with this code (hopefully not because I tested this code) you can report it in the server.
-- there will be a huge mess of code in this line once you copy & paste this script, it's just the libraries that's built into Luau+
--luau+
local sound = Instance.new("Sound")
sound.SoundId = 114706468036219
print(sound:IsLicensed()) -- prints false for the sound id 114706468036219
I think it’d be better to display why the solution isn’t feasible rather than stating that community alternatives are just not an option. If a community-made alternative is able to achieve the exact feature you need, then the feature-request is practically resolved since there isn’t a problem to solve anymore.
In this case however, the solution of checking genres isn’t long-term viable since there is no guarentee that Roblox will keep genres only to licensed audio creators nor is there any guarentee that every licensed audio will be assigned a genre.
I already did, and it’s in the OP. What defines a “licensed music” has fluctuated over time and nothing we do now can be trusted to last in the future. The feature request is absolutely not resolved and the only resolution is Roblox making an explicit marker for what a licensed song is. Right now, there is nothing for that. Even if there was some complicated user created library that did, the feature request is not invalidated–built in ways to do something that a user can do is a legitimate request. There is nothing to be discussed.
A solid example of how user provided solutions are no good is that the original user provided solution in this thread recently broke when all of APM’s music got moved over to the APMOfficial Roblox account. There is no user solution to these types of things. Things like PolicyService exist because expecting users to check arbitrary conditions that can change at any time is unrealistic and almost definitely will error.
In my opinion this goes beyond just audios. Roblox is responsible for protecting copyright and licences on their platform and should therefore provide us the info we need on whether or not we are allowed to use an asset in our games through an API so we can provide users with the ability to select content themselves in-game. This includes features such as boomboxes, user selected custom textures, or anything that pulls content by ID.
Technically all playable audio currently on Roblox is licensed (with exception of some left over bypasses), I don’t see why would there be e.g. isLicensed variable for audio if only such audios can be currently playable in boomboxes (with exception of DistroKid audios, and releases delivered after September 1st, as these are semi public).
Users have NO ability to make public audio nor will have such (without a third-party) in the future.
I think simple use of the the IsPublicDomain value would solve your issue:
local MarketplaceService = game:GetService("MarketplaceService")
local assetId = 18841891575
local info = MarketplaceService:GetProductInfo(assetId, Enum.InfoType.Asset)
print(info.IsPublicDomain)
Yes, having a more performant or accurate response is certainly a valid use-case and reason to make a feature-request.
As I mentioned in my previous reply, in this case, the proposed community solution unfortunately falls for the pitfall of the behaviour possibly not being future-compatible, which again is a valid reason to make a feature request. I was more commenting on how, at the general-level, user-made solutions are solutions and should at least be considered to see whether they satisfy the use-case.
Not referring to this particular request, if a community alternative is able to achieve all the idealities of the listed use-case, then there isn’t really a problem for the feature request to resolve and hence no feature-request to be had (since feature-requests are based around problems rather than particular solutions).