Skip to content

Commit

Permalink
Merge pull request #4771 from crobibero/typed-get-preference
Browse files Browse the repository at this point in the history
Use typed UserManager GetPreference

(cherry picked from commit 21d2e9f)
Signed-off-by: Joshua M. Boniface <joshua@boniface.me>
  • Loading branch information
cvium authored and joshuaboniface committed Dec 30, 2020
1 parent 98c081f commit 480ded0
Show file tree
Hide file tree
Showing 13 changed files with 93 additions and 50 deletions.
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++)
{
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))
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

0 comments on commit 480ded0

Please sign in to comment.