source_data_SessionDataTransformer.bs

import "pkg:/source/utils/misc.bs"

' Transforms the user's server-side Configuration and Policy to content nodes (called by user.Login)
class SessionDataTransformer

  sub new()
  end sub

  ' Transform user configuration to JellyfinUserConfiguration content node
  ' Configuration is SERVER-AUTHORITATIVE and should never be loaded from registry
  function transformUserConfiguration(configData as object) as object
    config = CreateObject("roSGNode", "JellyfinUserConfiguration")

    if not isValid(configData)
      return config
    end if

    ' Audio Settings
    config.audioLanguagePreference = configData.AudioLanguagePreference ?? ""
    config.playDefaultAudioTrack = configData.PlayDefaultAudioTrack ?? true
    config.rememberAudioSelections = configData.RememberAudioSelections ?? false

    ' Subtitle Settings
    config.subtitleMode = configData.SubtitleMode ?? "Default"
    config.subtitleLanguagePreference = configData.SubtitleLanguagePreference ?? ""
    config.rememberSubtitleSelections = configData.RememberSubtitleSelections ?? false

    ' Display Settings
    config.displayMissingEpisodes = configData.DisplayMissingEpisodes ?? false
    config.displayCollectionsView = configData.DisplayCollectionsView ?? false
    config.hidePlayedInLatest = configData.HidePlayedInLatest ?? true
    config.useEpisodeImagesInNextUpAndResume = configData.useEpisodeImagesInNextUpAndResume ?? false

    ' Playback Settings
    config.enableNextEpisodeAutoPlay = configData.EnableNextEpisodeAutoPlay ?? false

    ' View Organization
    config.orderedViews = configData.OrderedViews ?? []
    config.latestItemsExcludes = configData.LatestItemsExcludes ?? []
    config.myMediaExcludes = configData.MyMediaExcludes ?? []
    config.groupedFolders = configData.GroupedFolders ?? []

    ' Other Settings
    config.castReceiverId = configData.CastReceiverId ?? ""
    config.enableLocalPassword = configData.EnableLocalPassword ?? false

    #if debug
      config.rawConfigData = configData
    #end if

    return config
  end function

  ' Transform user policy to JellyfinUserPolicy content node
  ' Policy is SERVER-AUTHORITATIVE and should never be loaded from registry
  function transformUserPolicy(policyData as object) as object
    policy = CreateObject("roSGNode", "JellyfinUserPolicy")

    if not isValid(policyData)
      return policy
    end if

    ' User Status
    policy.isAdministrator = policyData.IsAdministrator ?? false
    policy.isDisabled = policyData.IsDisabled ?? false
    policy.isHidden = policyData.IsHidden ?? false

    ' Authentication Settings
    policy.authenticationProviderId = policyData.AuthenticationProviderId ?? ""
    policy.passwordResetProviderId = policyData.PasswordResetProviderId ?? ""
    policy.invalidLoginAttemptCount = policyData.InvalidLoginAttemptCount ?? 0
    policy.loginAttemptsBeforeLockout = policyData.LoginAttemptsBeforeLockout ?? - 1

    ' Media Playback Permissions
    policy.enableMediaPlayback = policyData.EnableMediaPlayback ?? true
    policy.enableAudioPlaybackTranscoding = policyData.EnableAudioPlaybackTranscoding ?? true
    policy.enableVideoPlaybackTranscoding = policyData.EnableVideoPlaybackTranscoding ?? true
    policy.enablePlaybackRemuxing = policyData.EnablePlaybackRemuxing ?? true
    policy.forceRemoteSourceTranscoding = policyData.ForceRemoteSourceTranscoding ?? false

    ' Content Access Permissions
    policy.enableAllFolders = policyData.EnableAllFolders ?? false
    policy.enabledFolders = policyData.EnabledFolders ?? []
    policy.enableContentDownloading = policyData.EnableContentDownloading ?? true
    policy.enableContentDeletion = policyData.EnableContentDeletion ?? false
    policy.enableContentDeletionFromFolders = policyData.EnableContentDeletionFromFolders ?? []

    ' Live TV Permissions
    policy.enableLiveTvAccess = policyData.EnableLiveTvAccess ?? true
    policy.enableLiveTvManagement = policyData.EnableLiveTvManagement ?? false

    ' Channel Permissions
    policy.enableAllChannels = policyData.EnableAllChannels ?? false
    policy.enabledChannels = policyData.EnabledChannels ?? []
    policy.blockedChannels = policyData.BlockedChannels ?? []

    ' Device Permissions
    policy.enableAllDevices = policyData.EnableAllDevices ?? true
    policy.enabledDevices = policyData.EnabledDevices ?? []
    policy.maxActiveSessions = policyData.MaxActiveSessions ?? 0

    ' Remote Access Permissions
    policy.enableRemoteAccess = policyData.EnableRemoteAccess ?? true
    policy.enableRemoteControlOfOtherUsers = policyData.EnableRemoteControlOfOtherUsers ?? false
    policy.enableSharedDeviceControl = policyData.EnableSharedDeviceControl ?? true
    policy.remoteClientBitrateLimit = policyData.RemoteClientBitrateLimit ?? 0

    ' Content Management Permissions
    policy.enableCollectionManagement = policyData.EnableCollectionManagement ?? false
    policy.enableSubtitleManagement = policyData.EnableSubtitleManagement ?? false
    policy.enableLyricManagement = policyData.EnableLyricManagement ?? false

    ' Sharing and Sync Permissions
    policy.enablePublicSharing = policyData.EnablePublicSharing ?? true
    policy.enableSyncTranscoding = policyData.EnableSyncTranscoding ?? true
    policy.enableMediaConversion = policyData.EnableMediaConversion ?? true

    ' User Preferences
    policy.enableUserPreferenceAccess = policyData.EnableUserPreferenceAccess ?? true

    ' Content Filtering
    policy.blockedMediaFolders = policyData.BlockedMediaFolders ?? []
    policy.blockedTags = policyData.BlockedTags ?? []
    policy.allowedTags = policyData.AllowedTags ?? []
    policy.blockUnratedItems = policyData.BlockUnratedItems ?? []

    ' Access Schedules
    policy.accessSchedules = policyData.AccessSchedules ?? []

    ' Sync Play
    policy.syncPlayAccess = policyData.SyncPlayAccess ?? "CreateAndJoinGroups"

    #if debug
      policy.rawPolicyData = policyData
    #end if

    return policy
  end function

end class