ContentProvider

Show Deprecated
Not Creatable
Service
Not Replicated

Service that is used to load content, or assets, into a game.

The service's main use is to preload assets into a game. When a new asset such as a Decal or Sound is used in a game, Roblox will load the content associated with it from Roblox servers. In some cases, this can be undesirable for developers as it can lead to a delay before the content loads into the game.

With ContentProvider, developers can preload assets using the ContentProvider:PreloadAsync() function. Another useful property is ContentProvider.RequestQueueSize, which can be used to measure what proportion of assets in the request queue have been downloaded.

Code Samples

ContentProvider

local ContentProvider = game:GetService("ContentProvider")
local LOGO_ID = "rbxassetid://658743164"
local PAGE_TURN_ID = "rbxassetid://12222076"
local decal = Instance.new("Decal")
decal.Texture = LOGO_ID
local sound = Instance.new("Sound")
sound.SoundId = PAGE_TURN_ID
local assets = { decal, sound }
ContentProvider:PreloadAsync(assets)
print("All assets loaded.")

Summary

Properties

Used by the ContentProvider to download assets from the Roblox website.

READ ONLY
NOT REPLICATED

Gives the number of items in ContentProvider's request queue that need to be downloaded.

READ ONLY
NOT REPLICATED

Methods


Gets the current AssetFetchStatus of the contentId provided.


A signal that fires when the AssetFetchStatus of the provided content changes.

RegisterDefaultEncryptionKey(encryptionKey: string): void  


RegisterDefaultSessionKey(sessionKey: string): void  


RegisterEncryptedAsset(assetId: Content, encryptionKey: string): void  


RegisterSessionEncryptedAsset(contentId: Content, sessionKey: string): void  


UnregisterEncryptedAsset(assetId: Content): void  


PreloadAsync(contentIdList: Array, callbackFunction: function): void  YIELDS

Yields until all of the assets associated with the given Instances have loaded.

Events

Properties

BaseUrl

Read Only
Not Replicated

Used by the ContentProvider to download assets from the Roblox website.

This URL points to a Roblox hosted website from which assets are downloaded and is pulled from the AppSettings.xml file, located in the version-hash folder.

It is possible to overwrite this property using the ContentProvider:SetBaseUrl() function in the command bar; however, this is not recommended and may cause asset loading issues.

RequestQueueSize

Read Only
Not Replicated

Gives the number of items in ContentProvider's request queue that need to be downloaded.

Items are added to the client's request queue when an asset is used for the first time or ContentProvider:PreloadAsync() is called.

Developers are advised not to use RequestQueueSize to create loading bars. This is because the queue size can both increase and decrease over time as new assets are added and downloaded. Developers looking to display loading progress should load assets one at a time (see example below).

Code Samples

ContentProvider Loading Bar

local ContentProvider = game:GetService("ContentProvider")
local Players = game:GetService("Players")
local localPlayer = Players.LocalPlayer
local playerGui = localPlayer:WaitForChild("PlayerGui")
local screenGui = Instance.new("ScreenGui")
screenGui.Parent = playerGui
-- create a basic loading bar
local frame = Instance.new("Frame")
frame.Size = UDim2.new(0.5, 0, 0.1, 0)
frame.Position = UDim2.new(0.5, 0, 0.5, 0)
frame.AnchorPoint = Vector2.new(0.5, 0.5)
frame.Parent = screenGui
local bar = Instance.new("Frame")
bar.Size = UDim2.new(0, 0, 1, 0)
bar.Position = UDim2.new(0, 0, 0, 0)
bar.BackgroundColor3 = Color3.new(0, 0, 1)
bar.Parent = frame
local sound = Instance.new("Sound")
sound.SoundId = "rbxassetid://9120386436"
local sound2 = Instance.new("Sound")
sound2.SoundId = "rbxassetid://9120385974"
local assets = {
sound,
sound2,
}
task.wait(3)
for i = 1, #assets do
local asset = assets[i]
ContentProvider:PreloadAsync({ asset }) -- 1 at a time, yields
local progress = i / #assets
bar.Size = UDim2.new(progress, 0, 1, 0)
end
print("loading done")

Methods

GetAssetFetchStatus

Gets the current AssetFetchStatus of the contentId provided. Use GetAssetFetchStatusChangedSignal() to listen for changes to this value.

Parameters

contentId: Content

The ID of the content to fetch the status for.


Returns

Code Samples

Monitoring AssetFetchStatus

local ContentProvider = game:GetService("ContentProvider")
-- Image of a purple book
local ASSET_ID = "rbxassetid://5173222739"
local imageLabel = Instance.new("ImageLabel")
imageLabel.Image = ASSET_ID
-- Output the current AssetFetchStatus of the asset
local initialAssetFetchStatus = ContentProvider:GetAssetFetchStatus(ASSET_ID)
print("Initial AssetFetchStatus:", initialAssetFetchStatus)
-- Listen for updates
local signal = ContentProvider:GetAssetFetchStatusChangedSignal(ASSET_ID)
local signalCallback = function(newAssetFetchStatus)
print("New AssetFetchStatus:", newAssetFetchStatus)
end
local connection = signal:Connect(signalCallback)
-- Trigger the thumbnail to preload
local preloadAsyncCallback = function(contentId, assetFetchStatus)
print("PreloadAsync() content ID:", contentId)
print("PreloadAsync() AssetFetchStatus:", assetFetchStatus)
end
ContentProvider:PreloadAsync({imageLabel}, preloadAsyncCallback)

GetAssetFetchStatusChangedSignal

A signal that fires when the AssetFetchStatus of the provided content changes. Connect to this signal by using a callback with one argument of type AssetFetchStatus. This is particularly useful for assets that might update themselves automatically like the thumbnail of a user when they change clothes.

Parameters

contentId: Content

Returns

Code Samples

Monitoring AssetFetchStatus

local ContentProvider = game:GetService("ContentProvider")
-- Image of a purple book
local ASSET_ID = "rbxassetid://5173222739"
local imageLabel = Instance.new("ImageLabel")
imageLabel.Image = ASSET_ID
-- Output the current AssetFetchStatus of the asset
local initialAssetFetchStatus = ContentProvider:GetAssetFetchStatus(ASSET_ID)
print("Initial AssetFetchStatus:", initialAssetFetchStatus)
-- Listen for updates
local signal = ContentProvider:GetAssetFetchStatusChangedSignal(ASSET_ID)
local signalCallback = function(newAssetFetchStatus)
print("New AssetFetchStatus:", newAssetFetchStatus)
end
local connection = signal:Connect(signalCallback)
-- Trigger the thumbnail to preload
local preloadAsyncCallback = function(contentId, assetFetchStatus)
print("PreloadAsync() content ID:", contentId)
print("PreloadAsync() AssetFetchStatus:", assetFetchStatus)
end
ContentProvider:PreloadAsync({imageLabel}, preloadAsyncCallback)

ListEncryptedAssets


Returns

RegisterDefaultEncryptionKey

void

Parameters

encryptionKey: string

Returns

void

RegisterDefaultSessionKey

void

Parameters

sessionKey: string

Returns

void

RegisterEncryptedAsset

void

Parameters

assetId: Content
encryptionKey: string

Returns

void

RegisterSessionEncryptedAsset

void

Parameters

contentId: Content
sessionKey: string

Returns

void

UnregisterDefaultEncryptionKey

void

Returns

void

UnregisterEncryptedAsset

void

Parameters

assetId: Content

Returns

void

PreloadAsync

void
Yields

Yields until all of the assets associated with the given Instances have loaded. This can be used to pause a script and not use content until it is certain that the content has been loaded into the experience.

When called, the engine identifies links to content for each item in the list. For any of the Instances which have properties that define links to content, such as a Decal or a Sound, the engine attempts to load these assets from Roblox. For each requested asset, the callback function runs, indicating the asset's final AssetFetchStatus.

If any of the assets fail to load, an error message appears in the output. The method itself will not error and it will continue executing until it has processed each requested instance or asset ID.

Parameters

contentIdList: Array

An array of items to load.

callbackFunction: function

The function called when each asset request completes. Returns the content string and the asset's final AssetFetchStatus.

Default Value: "nil"

Returns

void

Code Samples

Preloading Assets

local ContentProvider = game:GetService("ContentProvider")
local sound = Instance.new("Sound")
sound.SoundId = "rbxassetid://9120386436"
local decal = Instance.new("Decal")
decal.Texture = "rbxassetid://5447528495"
local assets = {
decal,
sound,
}
-- This will be hit as each asset resolves
local callback = function(assetId, assetFetchStatus)
print("PreloadAsync() resolved asset ID:", assetId)
print("PreloadAsync() final AssetFetchStatus:", assetFetchStatus)
end
-- Preload the content and time it
local startTime = os.clock()
ContentProvider:PreloadAsync(assets, callback)
local deltaTime = os.clock() - startTime
print(("Preloading complete, took %.2f seconds"):format(deltaTime))

Events

AssetFetchFailed

Parameters

assetId: Content