diff --git a/back/src/Kyoo.Abstractions/Models/Utils/Sort.cs b/back/src/Kyoo.Abstractions/Models/Utils/Sort.cs
index 702e6240..ddae48ed 100644
--- a/back/src/Kyoo.Abstractions/Models/Utils/Sort.cs
+++ b/back/src/Kyoo.Abstractions/Models/Utils/Sort.cs
@@ -56,6 +56,9 @@ namespace Kyoo.Abstractions.Controllers
/// The list of keys to sort by.
public record Conglomerate(params Sort[] List) : Sort;
+ /// Sort randomly items
+ public record Random() : Sort;
+
/// The default sort method for the given type.
public record Default : Sort;
@@ -69,6 +72,8 @@ namespace Kyoo.Abstractions.Controllers
{
if (string.IsNullOrEmpty(sortBy) || sortBy == "default")
return new Default();
+ if (sortBy == "random")
+ return new Random();
if (sortBy.Contains(','))
return new Conglomerate(sortBy.Split(',').Select(From).ToArray());
diff --git a/back/src/Kyoo.Core/Controllers/Repositories/LibraryItemRepository.cs b/back/src/Kyoo.Core/Controllers/Repositories/LibraryItemRepository.cs
index 1bc010f0..045de09d 100644
--- a/back/src/Kyoo.Core/Controllers/Repositories/LibraryItemRepository.cs
+++ b/back/src/Kyoo.Core/Controllers/Repositories/LibraryItemRepository.cs
@@ -19,12 +19,10 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using System.Linq.Expressions;
using System.Threading.Tasks;
using Kyoo.Abstractions.Controllers;
using Kyoo.Abstractions.Models;
using Kyoo.Postgresql;
-using Kyoo.Utils;
using Microsoft.EntityFrameworkCore;
namespace Kyoo.Core.Controllers
@@ -53,42 +51,6 @@ namespace Kyoo.Core.Controllers
_database = database;
}
- ///
- public override async Task GetOrDefault(int id)
- {
- return await _database.LibraryItems.SingleOrDefaultAsync(x => x.Id == id).Then(SetBackingImage);
- }
-
- ///
- public override async Task GetOrDefault(string slug)
- {
- return await _database.LibraryItems.SingleOrDefaultAsync(x => x.Slug == slug).Then(SetBackingImage);
- }
-
- ///
- public override async Task GetOrDefault(Expression> where, Sort sortBy = default)
- {
- return await Sort(_database.LibraryItems, sortBy).FirstOrDefaultAsync(where).Then(SetBackingImage);
- }
-
- ///
- public override async Task> GetAll(Expression> where = null,
- Sort sort = default,
- Pagination limit = default)
- {
- return (await ApplyFilters(_database.LibraryItems, where, sort, limit))
- .Select(SetBackingImageSelf).ToList();
- }
-
- ///
- public override Task GetCount(Expression> where = null)
- {
- IQueryable query = _database.LibraryItems;
- if (where != null)
- query = query.Where(where);
- return query.CountAsync();
- }
-
///
public override async Task> Search(string query)
{
diff --git a/back/src/Kyoo.Core/Controllers/Repositories/LocalRepository.cs b/back/src/Kyoo.Core/Controllers/Repositories/LocalRepository.cs
index 1af459b4..e11c7816 100644
--- a/back/src/Kyoo.Core/Controllers/Repositories/LocalRepository.cs
+++ b/back/src/Kyoo.Core/Controllers/Repositories/LocalRepository.cs
@@ -109,6 +109,8 @@ namespace Kyoo.Core.Controllers
return _Sort(query, DefaultSort, then);
case Sort.By(var key, var desc):
return _SortBy(query, x => EF.Property(x, key), desc, then);
+ case Sort.Random:
+ return _SortBy(query, x => EF.Functions.Random(), false, then);
case Sort.Conglomerate(var sorts):
IOrderedQueryable nQuery = _Sort(query, sorts.First(), false);
foreach (Sort sort in sorts.Skip(1))
@@ -169,6 +171,7 @@ namespace Kyoo.Core.Controllers
Sort.Default => GetSortsBy(DefaultSort),
Sort.By @sortBy => new[] { sortBy },
Sort.Conglomerate(var list) => list.SelectMany(GetSortsBy),
+ Sort.Random => throw new ArgumentException("Impossible to paginate randomly sorted items."),
_ => Array.Empty.By>(),
};
}
@@ -306,6 +309,8 @@ namespace Kyoo.Core.Controllers
///
public virtual Task GetOrDefault(string slug)
{
+ if (slug == "random")
+ return Database.Set().OrderBy(x => EF.Functions.Random()).FirstOrDefaultAsync().Then(SetBackingImage);
return Database.Set().FirstOrDefaultAsync(x => x.Slug == slug).Then(SetBackingImage);
}
diff --git a/back/src/Kyoo.Core/Controllers/ThumbnailsManager.cs b/back/src/Kyoo.Core/Controllers/ThumbnailsManager.cs
index f2ecf5a2..a46a0e67 100644
--- a/back/src/Kyoo.Core/Controllers/ThumbnailsManager.cs
+++ b/back/src/Kyoo.Core/Controllers/ThumbnailsManager.cs
@@ -113,6 +113,7 @@ namespace Kyoo.Core.Controllers
{
string directory = item switch
{
+ LibraryItem litem => Path.Combine("./metadata", litem.Kind.ToString().ToLowerInvariant(), litem.Slug),
IResource res => Path.Combine("./metadata", item.GetType().Name.ToLowerInvariant(), res.Slug),
_ => Path.Combine("./metadata", typeof(T).Name.ToLowerInvariant())
};
diff --git a/back/src/Kyoo.Core/Views/Resources/LibraryItemApi.cs b/back/src/Kyoo.Core/Views/Resources/LibraryItemApi.cs
index 3c5459b5..13ff93e1 100644
--- a/back/src/Kyoo.Core/Views/Resources/LibraryItemApi.cs
+++ b/back/src/Kyoo.Core/Views/Resources/LibraryItemApi.cs
@@ -39,7 +39,7 @@ namespace Kyoo.Core.Api
[ResourceView]
[PartialPermission("LibraryItem")]
[ApiDefinition("Items", Group = ResourcesGroup)]
- public class LibraryItemApi : BaseApi
+ public class LibraryItemApi : CrudThumbsApi
{
///
/// The library item repository used to modify or retrieve information in the data store.
@@ -52,7 +52,8 @@ namespace Kyoo.Core.Api
///
/// The library item repository used to modify or retrieve information in the data store.
///
- public LibraryItemApi(ILibraryItemRepository libraryItems)
+ public LibraryItemApi(ILibraryItemRepository libraryItems, IThumbnailsManager thumbs)
+ : base(libraryItems, thumbs)
{
_libraryItems = libraryItems;
}