From 8e4aba92d211a4abc6d349e093a37e1fb341a98f Mon Sep 17 00:00:00 2001 From: Sveske_Juice Date: Fri, 4 Apr 2025 01:13:41 +0200 Subject: [PATCH] Users options --- modules/options/users.nix | 161 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 modules/options/users.nix diff --git a/modules/options/users.nix b/modules/options/users.nix new file mode 100644 index 0000000..4d3e355 --- /dev/null +++ b/modules/options/users.nix @@ -0,0 +1,161 @@ +{lib, ...}: +with lib; { + options.services.declarative-jellyfin.network = { + # Based on: https://github.com/jellyfin/jellyfin/blob/master/MediaBrowser.Model/Configuration/UserConfiguration.cs + Users = mkOption { + description = "User configuration"; + type = lib.types.listOf (lib.types.submodule ({config, ...}: { + options = { + Id = mkOption { + type = types.str; # TODO: Limit the id to the pattern: "18B51E25-33FD-46B6-BBF8-DB4DD77D0679" + description = "The ID of the user"; + default = "autogenerate"; + example = "18B51E25-33FD-46B6-BBF8-DB4DD77D0679"; + }; + AudioLanguagePreference = mkOption { + type = with types; either null str; + description = "The audio language preference. Defaults to 'Any Language'"; + default = null; + example = "eng"; + }; + AuthenticationProviderId = mkOption { + type = types.str; + # idk no docs man + default = "Jellyfin.Server.Implementations.Users.DefaultAuthenticationProvider"; + }; + DisplayCollectionsView = mkOption { + type = types.bool; + description = "Whether to show the Collections View"; + default = false; + example = true; + }; + DisplayMissingEpisodes = mkOption { + type = types.bool; + description = "Whether to show missing episodes"; + default = false; + example = true; + }; + EnableAutoLogin = mkOption { + type = types.bool; + default = false; + example = true; + }; + EnableLocalPassword = mkOption { + type = types.bool; + default = false; + example = true; + }; + EnableNextEpisodeAutoPlay = mkOption { + type = types.bool; + description = "Automatically play the next episode"; + default = true; + example = false; + }; + EnableUserPreferenceAccess = mkOption { + type = types.bool; + # idk no docs man + default = true; + example = false; + }; + HidePlayedInLatest = mkOption { + type = types.bool; + description = "Whether to hide already played titles in the 'Latest' section"; + default = true; + example = false; + }; + InternalId = mkOption { + type = with types; either int str; # TODO: Limit string to "autogenerate" + # NOTE: index is 1-indexed! NOT 0-indexed. + description = "The index of the user in the database. Be careful setting this option. 1 indexed."; + default = "autogenerate"; + example = 69; + }; + LoginAttemptsBeforeLockout = mkOption { + type = types.int; + description = "The number of login attempts the user can make before they are locked out."; + default = 3; + example = 10; + }; + MaxActiveSessions = mkOption { + type = types.int; + description = "The maximum number of active sessions the user can have at once. 0 for unlimited"; + default = 0; + example = 5; + }; + MaxParentalAgeRating = mkOption { + type = with types; either null int; + # idk no docs man + default = null; + }; + Password = mkOption { + type = types.str; + # TODO: implement + }; + PasswordResetProviderId = mkOption { + type = types.str; + # no docs man + default = "Jellyfin.Server.Implementations.Users.DefaultPasswordResetProvider"; + }; + PlayDefaultAudioTrack = mkOption { + type = types.bool; + default = true; + example = false; + }; + RememberAudioSelections = mkOption { + type = types.bool; + default = true; + }; + RememberSubtitleSelections = mkOption { + type = types.bool; + default = true; + }; + RemoteClientBitrateLimit = mkOption { + type = types.int; + description = "0 for unlimited"; + default = 0; + }; + SubtitleLanguagePreference = mkOption { + type = with types; either null str; + description = "The subtitle language preference. Defaults to 'Any Language'"; + default = null; + example = "eng"; + }; + # https://github.com/jellyfin/jellyfin/blob/master/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/SubtitlePlaybackMode.cs + SubtitleMode = mkOption { + type = types.enum ["Default" "Always" "OnlyForced" "None" "Smart"]; + description = '' + Default: The default subtitle playback mode. + Always: Always show subtitles. + OnlyForced: Only show forced subtitles. + None: Don't show subtitles. + Smart: Only show subtitles when the current audio stream is in a different language. + ''; + default = "Default"; + }; + SyncPlayAccess = mkOption { + type = types.bool; + description = "Whether or not this user has access to SyncPlay"; + default = false; + example = true; + }; + Username = mkOption { + type = types.str; + description = "The username for the user"; + }; + # Something to do with chromecast, don't know tbh + CastReceiverId = mkOption { + type = types.str; + default = "F007D354"; + }; + }; + + # Omitted database columns: + # InvalidLoginAttemptCount + # LastActivityDate + # LastLoginDate + # MustUpdatePassword + # RowVersion + })); + }; + }; +}