To prevent unauthorized access to HLS segments and keys, use the DynamicHLSPlaylist class. This allows you to serve playlists through Laravel routes where you can implement authentication/authorization (e.g., via Gates or Middleware).
Instead of linking directly to a file on a public disk, you use FFMpeg::dynamicHLSPlaylist() to resolve paths dynamically via three resolvers:
setKeyUrlResolver: Maps a relative key path to a secure route/URL.setMediaUrlResolver: Maps a relative media segment path to a public URL.setPlaylistUrlResolver: Maps a relative playlist path to a route/URL.
The DynamicHLSPlaylist instance implements Illuminate\Contracts\Support\Responsable, so it can be returned directly from a controller.
// Route to serve the actual key file securely
Route::get('/video/secret/{key}', function ($key) {
return Storage::disk('secrets')->download($key);
})->name('video.key');
// Route to serve the dynamic playlist
Route::get('/video/{playlist}', function ($playlist) {
return FFMpeg::dynamicHLSPlaylist()
->fromDisk('public')
->open($playlist)
->setKeyUrlResolver(function ($key) {
return route('video.key', ['key' => $key]);
})
->setMediaUrlResolver(function ($mediaFilename) {
return Storage::disk('public')->url($mediaFilename);
})
->setPlaylistUrlResolver(function ($playlistFilename) {
return route('video.playlist', ['playlist' => $playlistFilename]);
});
})->name('video.playlist');