Files
silo-server/internal/policy/playback_adapter.go
28c6ddc237 feat(playback): add per-user transcoding controls (#375)
* feat(playback): add per-user transcoding controls

* fix(playback): enforce forced video transcode permission

* chore: address transcode control review feedback

* fix(playback): recheck transcode permission on audio switch

---------

Co-authored-by: Quick104 <31828688+Quick104@users.noreply.github.com>
2026-07-10 22:30:04 -04:00

48 lines
1.7 KiB
Go

package policy
import (
"context"
"time"
"github.com/Silo-Server/silo-server/internal/playback"
)
// ActionChecker is the subset of PDP used by action adapters.
type ActionChecker interface {
CheckAction(context.Context, ActionInput) (ActionDecision, Meta, error)
}
// NewPlaybackAdmissionDecider adapts CheckAction to playback.SessionManager's
// admission hook. Session counts and limit loading remain owned by playback.
func NewPlaybackAdmissionDecider(checker ActionChecker) playback.AdmissionDecider {
return func(ctx context.Context, req playback.AdmissionRequest) (playback.AdmissionDecision, error) {
requestedAction := RequestedActionDirectPlay
if req.RequiresVideoTranscode {
requestedAction = RequestedActionTranscode
} else if req.RequiresAudioTranscode {
requestedAction = RequestedActionAudioTranscode
}
decision, _, err := checker.CheckAction(ctx, ActionInput{
SchemaVersion: 1,
Action: ActionPlaybackAdmission,
UserID: req.UserID,
MaxStreams: req.Limits.MaxStreams,
MaxTranscodes: req.Limits.MaxTranscodes,
TranscodeAllowed: !req.Limits.TranscodingDisabled,
AudioTranscodeAllowed: !req.Limits.AudioTranscodingDisabled,
CurrentActiveStreams: req.CurrentActiveStreams,
CurrentActiveTranscodes: req.CurrentActiveTranscodes,
RequestedAction: requestedAction,
RequestTime: time.Now().UTC().Format(time.RFC3339),
})
if err != nil {
return playback.AdmissionDecision{}, err
}
return playback.AdmissionDecision{
Allowed: decision.Allowed,
Reason: decision.Reason,
ReasonCode: decision.ReasonCode,
}, nil
}
}