Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use typed UserManager GetPreference #4771

Merged
merged 6 commits into from Dec 16, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
12 changes: 6 additions & 6 deletions Emby.Server.Implementations/Library/UserViewManager.cs
Expand Up @@ -129,23 +129,23 @@ public Folder[] GetUserViews(UserViewQuery query)

if (!query.IncludeHidden)
{
list = list.Where(i => !user.GetPreference(PreferenceKind.MyMediaExcludes).Contains(i.Id.ToString("N", CultureInfo.InvariantCulture))).ToList();
list = list.Where(i => !user.GetPreferenceValues<Guid>(PreferenceKind.MyMediaExcludes).Contains(i.Id)).ToList();
}

var sorted = _libraryManager.Sort(list, user, new[] { ItemSortBy.SortName }, SortOrder.Ascending).ToList();

var orders = user.GetPreference(PreferenceKind.OrderedViews).ToList();
var orders = user.GetPreferenceValues<Guid>(PreferenceKind.OrderedViews);

return list
.OrderBy(i =>
{
var index = orders.IndexOf(i.Id.ToString("D", CultureInfo.InvariantCulture));
var index = Array.IndexOf(orders, i.Id);

if (index == -1
&& i is UserView view
&& view.DisplayParentId != Guid.Empty)
{
index = orders.IndexOf(view.DisplayParentId.ToString("D", CultureInfo.InvariantCulture));
index = Array.IndexOf(orders, view.DisplayParentId);
}

return index == -1 ? int.MaxValue : index;
Expand Down Expand Up @@ -280,8 +280,8 @@ private IReadOnlyList<BaseItem> GetItemsForLatestItems(User user, LatestItemsQue
{
parents = _libraryManager.GetUserRootFolder().GetChildren(user, true)
.Where(i => i is Folder)
.Where(i => !user.GetPreference(PreferenceKind.LatestItemExcludes)
.Contains(i.Id.ToString("N", CultureInfo.InvariantCulture)))
.Where(i => !user.GetPreferenceValues<Guid>(PreferenceKind.LatestItemExcludes)
.Contains(i.Id))
.ToList();
}

Expand Down
3 changes: 1 addition & 2 deletions Emby.Server.Implementations/TV/TVSeriesManager.cs
Expand Up @@ -75,8 +75,7 @@ public QueryResult<BaseItem> GetNextUp(NextUpQuery request, DtoOptions dtoOption
{
parents = _libraryManager.GetUserRootFolder().GetChildren(user, true)
.Where(i => i is Folder)
.Where(i => !user.GetPreference(PreferenceKind.LatestItemExcludes)
.Contains(i.Id.ToString("N", CultureInfo.InvariantCulture)))
.Where(i => !user.GetPreferenceValues<Guid>(PreferenceKind.LatestItemExcludes).Contains(i.Id))
.ToArray();
}

Expand Down
16 changes: 8 additions & 8 deletions Jellyfin.Api/Controllers/ItemsController.cs
Expand Up @@ -254,18 +254,18 @@ public class ItemsController : BaseJellyfinApiController
includeItemTypes = new[] { "Playlist" };
}

bool isInEnabledFolder = user!.GetPreference(PreferenceKind.EnabledFolders).Any(i => new Guid(i) == item.Id)
var enabledChannels = user!.GetPreferenceValues<Guid>(PreferenceKind.EnabledChannels);

bool isInEnabledFolder = Array.IndexOf(user.GetPreferenceValues<Guid>(PreferenceKind.EnabledFolders), item.Id) != -1
// Assume all folders inside an EnabledChannel are enabled
|| user.GetPreference(PreferenceKind.EnabledChannels).Any(i => new Guid(i) == item.Id)
|| Array.IndexOf(enabledChannels, item.Id) != -1
// Assume all items inside an EnabledChannel are enabled
|| user.GetPreference(PreferenceKind.EnabledChannels).Any(i => new Guid(i) == item.ChannelId);
|| Array.IndexOf(enabledChannels, item.ChannelId) != -1;

var collectionFolders = _libraryManager.GetCollectionFolders(item);
foreach (var collectionFolder in collectionFolders)
{
if (user.GetPreference(PreferenceKind.EnabledFolders).Contains(
collectionFolder.Id.ToString("N", CultureInfo.InvariantCulture),
StringComparer.OrdinalIgnoreCase))
if (user.GetPreferenceValues<Guid>(PreferenceKind.EnabledFolders).Contains(collectionFolder.Id))
{
isInEnabledFolder = true;
}
Expand Down Expand Up @@ -786,12 +786,12 @@ public class ItemsController : BaseJellyfinApiController

var ancestorIds = Array.Empty<Guid>();

var excludeFolderIds = user.GetPreference(PreferenceKind.LatestItemExcludes);
var excludeFolderIds = user.GetPreferenceValues<Guid>(PreferenceKind.LatestItemExcludes);
if (parentIdGuid.Equals(Guid.Empty) && excludeFolderIds.Length > 0)
{
ancestorIds = _libraryManager.GetUserRootFolder().GetChildren(user, true)
.Where(i => i is Folder)
.Where(i => !excludeFolderIds.Contains(i.Id.ToString("N", CultureInfo.InvariantCulture)))
.Where(i => !excludeFolderIds.Contains(i.Id))
.Select(i => i.Id)
.ToArray();
}
Expand Down
56 changes: 53 additions & 3 deletions Jellyfin.Data/Entities/User.cs
Expand Up @@ -2,9 +2,9 @@

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Globalization;
using System.Linq;
using System.Text.Json.Serialization;
using Jellyfin.Data.Enums;
Expand Down Expand Up @@ -413,6 +413,44 @@ public string[] GetPreference(PreferenceKind preference)
return Equals(val, string.Empty) ? Array.Empty<string>() : val.Split(Delimiter);
}

/// <summary>
/// Gets the user's preferences for the given preference kind.
/// </summary>
/// <param name="preference">The preference kind.</param>
/// <typeparam name="T">Type of preference.</typeparam>
/// <returns>A {T} array containing the user's preference.</returns>
public T[] GetPreferenceValues<T>(PreferenceKind preference)
{
var val = Preferences.First(p => p.Kind == preference).Value;
if (string.IsNullOrEmpty(val))
{
return Array.Empty<T>();
}

// Convert array of {string} to array of {T}
var converter = TypeDescriptor.GetConverter(typeof(T));
var stringValues = val.Split(Delimiter);
var convertedCount = 0;
var parsedValues = new T[stringValues.Length];
for (var i = 0; i < stringValues.Length; i++)
cvium marked this conversation as resolved.
Show resolved Hide resolved
{
try
{
var parsedValue = converter.ConvertFromString(stringValues[i].Trim());
if (parsedValue != null)
{
parsedValues[convertedCount++] = (T)parsedValue;
}
}
catch (FormatException)
{
// Unable to convert value
}
}

return parsedValues[..convertedCount];
}

/// <summary>
/// Sets the specified preference to the given value.
/// </summary>
Expand All @@ -421,7 +459,19 @@ public string[] GetPreference(PreferenceKind preference)
public void SetPreference(PreferenceKind preference, string[] values)
{
Preferences.First(p => p.Kind == preference).Value
= string.Join(Delimiter.ToString(CultureInfo.InvariantCulture), values);
= string.Join(Delimiter, values);
}

/// <summary>
/// Sets the specified preference to the given value.
/// </summary>
/// <param name="preference">The preference kind.</param>
/// <param name="values">The values.</param>
/// <typeparam name="T">The type of value.</typeparam>
public void SetPreference<T>(PreferenceKind preference, T[] values)
{
Preferences.First(p => p.Kind == preference).Value
= string.Join(Delimiter, values);
}

/// <summary>
Expand All @@ -441,7 +491,7 @@ public bool IsParentalScheduleAllowed()
/// <returns><c>True</c> if the folder is in the user's grouped folders.</returns>
public bool IsFolderGrouped(Guid id)
{
return GetPreference(PreferenceKind.GroupedFolders).Any(i => new Guid(i) == id);
return Array.IndexOf(GetPreferenceValues<Guid>(PreferenceKind.GroupedFolders), id) != -1;
}

private static bool IsParentalScheduleAllowed(AccessSchedule schedule, DateTime date)
Expand Down
18 changes: 8 additions & 10 deletions Jellyfin.Server.Implementations/Users/UserManager.cs
Expand Up @@ -376,14 +376,14 @@ public UserDto GetUserDto(User user, string? remoteEndPoint = null)
EnablePublicSharing = user.HasPermission(PermissionKind.EnablePublicSharing),
AccessSchedules = user.AccessSchedules.ToArray(),
BlockedTags = user.GetPreference(PreferenceKind.BlockedTags),
EnabledChannels = user.GetPreference(PreferenceKind.EnabledChannels)?.Select(Guid.Parse).ToArray(),
EnabledChannels = user.GetPreferenceValues<Guid>(PreferenceKind.EnabledChannels),
EnabledDevices = user.GetPreference(PreferenceKind.EnabledDevices),
EnabledFolders = user.GetPreference(PreferenceKind.EnabledFolders)?.Select(Guid.Parse).ToArray(),
EnabledFolders = user.GetPreferenceValues<Guid>(PreferenceKind.EnabledFolders),
EnableContentDeletionFromFolders = user.GetPreference(PreferenceKind.EnableContentDeletionFromFolders),
SyncPlayAccess = user.SyncPlayAccess,
BlockedChannels = user.GetPreference(PreferenceKind.BlockedChannels)?.Select(Guid.Parse).ToArray(),
BlockedMediaFolders = user.GetPreference(PreferenceKind.BlockedMediaFolders)?.Select(Guid.Parse).ToArray(),
BlockUnratedItems = user.GetPreference(PreferenceKind.BlockUnratedItems).Select(Enum.Parse<UnratedItem>).ToArray()
BlockedChannels = user.GetPreferenceValues<Guid>(PreferenceKind.BlockedChannels),
BlockedMediaFolders = user.GetPreferenceValues<Guid>(PreferenceKind.BlockedMediaFolders),
BlockUnratedItems = user.GetPreferenceValues<UnratedItem>(PreferenceKind.BlockUnratedItems)
}
};
}
Expand Down Expand Up @@ -704,13 +704,11 @@ public async Task UpdatePolicyAsync(Guid userId, UserPolicy policy)
}

// TODO: fix this at some point
user.SetPreference(
PreferenceKind.BlockUnratedItems,
policy.BlockUnratedItems?.Select(i => i.ToString()).ToArray() ?? Array.Empty<string>());
user.SetPreference(PreferenceKind.BlockUnratedItems, policy.BlockUnratedItems ?? Array.Empty<UnratedItem>());
user.SetPreference(PreferenceKind.BlockedTags, policy.BlockedTags);
user.SetPreference(PreferenceKind.EnabledChannels, policy.EnabledChannels?.Select(i => i.ToString("N", CultureInfo.InvariantCulture)).ToArray());
user.SetPreference(PreferenceKind.EnabledChannels, policy.EnabledChannels);
user.SetPreference(PreferenceKind.EnabledDevices, policy.EnabledDevices);
user.SetPreference(PreferenceKind.EnabledFolders, policy.EnabledFolders?.Select(i => i.ToString("N", CultureInfo.InvariantCulture)).ToArray());
user.SetPreference(PreferenceKind.EnabledFolders, policy.EnabledFolders);
user.SetPreference(PreferenceKind.EnableContentDeletionFromFolders, policy.EnableContentDeletionFromFolders);

dbContext.Update(user);
Expand Down
4 changes: 2 additions & 2 deletions Jellyfin.Server/Migrations/Routines/MigrateUserDb.cs
Expand Up @@ -168,9 +168,9 @@ public void Perform()
}

user.SetPreference(PreferenceKind.BlockedTags, policy.BlockedTags);
user.SetPreference(PreferenceKind.EnabledChannels, policy.EnabledChannels?.Select(i => i.ToString("N", CultureInfo.InvariantCulture)).ToArray());
user.SetPreference(PreferenceKind.EnabledChannels, policy.EnabledChannels);
user.SetPreference(PreferenceKind.EnabledDevices, policy.EnabledDevices);
user.SetPreference(PreferenceKind.EnabledFolders, policy.EnabledFolders?.Select(i => i.ToString("N", CultureInfo.InvariantCulture)).ToArray());
user.SetPreference(PreferenceKind.EnabledFolders, policy.EnabledFolders);
user.SetPreference(PreferenceKind.EnableContentDeletionFromFolders, policy.EnableContentDeletionFromFolders);
user.SetPreference(PreferenceKind.OrderedViews, config.OrderedViews);
user.SetPreference(PreferenceKind.GroupedFolders, config.GroupedFolders);
Expand Down
8 changes: 4 additions & 4 deletions MediaBrowser.Controller/Channels/Channel.cs
Expand Up @@ -17,18 +17,18 @@ public class Channel : Folder
{
public override bool IsVisible(User user)
{
if (user.GetPreference(PreferenceKind.BlockedChannels) != null)
var blockedChannelsPreference = user.GetPreferenceValues<Guid>(PreferenceKind.BlockedChannels);
if (blockedChannelsPreference.Length != 0)
{
if (user.GetPreference(PreferenceKind.BlockedChannels).Contains(Id.ToString("N", CultureInfo.InvariantCulture), StringComparer.OrdinalIgnoreCase))
if (blockedChannelsPreference.Contains(Id))
{
return false;
}
}
else
{
if (!user.HasPermission(PermissionKind.EnableAllChannels)
&& !user.GetPreference(PreferenceKind.EnabledChannels)
.Contains(Id.ToString("N", CultureInfo.InvariantCulture), StringComparer.OrdinalIgnoreCase))
&& !user.GetPreferenceValues<Guid>(PreferenceKind.EnabledChannels).Contains(Id))
{
return false;
}
Expand Down
2 changes: 1 addition & 1 deletion MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs
Expand Up @@ -120,7 +120,7 @@ public override List<string> GetUserDataKeys()

protected override bool GetBlockUnratedValue(User user)
{
return user.GetPreference(PreferenceKind.BlockUnratedItems).Contains(UnratedItem.Music.ToString());
return user.GetPreferenceValues<UnratedItem>(PreferenceKind.BlockUnratedItems).Contains(UnratedItem.Music);
}

public override UnratedItem GetBlockUnratedType()
Expand Down
2 changes: 1 addition & 1 deletion MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
Expand Up @@ -145,7 +145,7 @@ public override string CreatePresentationUniqueKey()

protected override bool GetBlockUnratedValue(User user)
{
return user.GetPreference(PreferenceKind.BlockUnratedItems).Contains(UnratedItem.Music.ToString());
return user.GetPreferenceValues<UnratedItem>(PreferenceKind.BlockUnratedItems).Contains(UnratedItem.Music);
}

public override UnratedItem GetBlockUnratedType()
Expand Down
8 changes: 4 additions & 4 deletions MediaBrowser.Controller/Entities/BaseItem.cs
Expand Up @@ -480,19 +480,19 @@ public virtual bool IsAuthorizedToDelete(User user, List<Folder> allCollectionFo
return true;
}

var allowed = user.GetPreference(PreferenceKind.EnableContentDeletionFromFolders);
var allowed = user.GetPreferenceValues<Guid>(PreferenceKind.EnableContentDeletionFromFolders);

if (SourceType == SourceType.Channel)
{
return allowed.Contains(ChannelId.ToString(""), StringComparer.OrdinalIgnoreCase);
return allowed.Contains(ChannelId);
}
else
{
var collectionFolders = LibraryManager.GetCollectionFolders(this, allCollectionFolders);

foreach (var folder in collectionFolders)
{
if (allowed.Contains(folder.Id.ToString("N", CultureInfo.InvariantCulture), StringComparer.OrdinalIgnoreCase))
if (allowed.Contains(folder.Id))
{
return true;
}
Expand Down Expand Up @@ -1909,7 +1909,7 @@ protected virtual bool GetBlockUnratedValue(User user)
return false;
}

return user.GetPreference(PreferenceKind.BlockUnratedItems).Contains(GetBlockUnratedType().ToString());
return user.GetPreferenceValues<UnratedItem>(PreferenceKind.BlockUnratedItems).Contains(GetBlockUnratedType());
}

/// <summary>
Expand Down
10 changes: 3 additions & 7 deletions MediaBrowser.Controller/Entities/Folder.cs
Expand Up @@ -186,22 +186,18 @@ public override bool IsVisible(User user)
{
if (this is ICollectionFolder && !(this is BasePluginFolder))
{
var blockedMediaFolders = user.GetPreference(PreferenceKind.BlockedMediaFolders);
var blockedMediaFolders = user.GetPreferenceValues<Guid>(PreferenceKind.BlockedMediaFolders);
if (blockedMediaFolders.Length > 0)
{
if (blockedMediaFolders.Contains(Id.ToString("N", CultureInfo.InvariantCulture), StringComparer.OrdinalIgnoreCase) ||

// Backwards compatibility
blockedMediaFolders.Contains(Name, StringComparer.OrdinalIgnoreCase))
crobibero marked this conversation as resolved.
Show resolved Hide resolved
if (blockedMediaFolders.Contains(Id))
{
return false;
}
}
else
{
if (!user.HasPermission(PermissionKind.EnableAllFolders)
&& !user.GetPreference(PreferenceKind.EnabledFolders)
.Contains(Id.ToString("N", CultureInfo.InvariantCulture), StringComparer.OrdinalIgnoreCase))
&& !user.GetPreferenceValues<Guid>(PreferenceKind.EnabledFolders).Contains(Id))
{
return false;
}
Expand Down
2 changes: 1 addition & 1 deletion MediaBrowser.Controller/Entities/Movies/BoxSet.cs
Expand Up @@ -49,7 +49,7 @@ public BoxSet()

protected override bool GetBlockUnratedValue(User user)
{
return user.GetPreference(PreferenceKind.BlockUnratedItems).Contains(UnratedItem.Movie.ToString());
return user.GetPreferenceValues<UnratedItem>(PreferenceKind.BlockUnratedItems).Contains(UnratedItem.Movie);
}

public override double GetDefaultPrimaryImageAspectRatio()
Expand Down
2 changes: 1 addition & 1 deletion MediaBrowser.Controller/Entities/TV/Series.cs
Expand Up @@ -452,7 +452,7 @@ public static IEnumerable<Episode> FilterEpisodesBySeason(IEnumerable<Episode> e

protected override bool GetBlockUnratedValue(User user)
{
return user.GetPreference(PreferenceKind.BlockUnratedItems).Contains(UnratedItem.Series.ToString());
return user.GetPreferenceValues<UnratedItem>(PreferenceKind.BlockUnratedItems).Contains(UnratedItem.Series);
}

public override UnratedItem GetBlockUnratedType()
Expand Down