* 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>
48 lines
1.7 KiB
Go
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
|
|
}
|
|
}
|