Random Sorting (#547)
This commit is contained in:
parent
13bb70987e
commit
199e8adf91
|
@ -10,6 +10,7 @@ import Combine
|
||||||
import Foundation
|
import Foundation
|
||||||
import JellyfinAPI
|
import JellyfinAPI
|
||||||
|
|
||||||
|
// TODO: Look at refactoring everything in this file, probably move to JellyfinAPI
|
||||||
struct LibraryFilters: Codable, Hashable {
|
struct LibraryFilters: Codable, Hashable {
|
||||||
var filters: [ItemFilter] = []
|
var filters: [ItemFilter] = []
|
||||||
var sortOrder: [APISortOrder] = [.ascending]
|
var sortOrder: [APISortOrder] = [.ascending]
|
||||||
|
@ -25,9 +26,11 @@ public enum SortBy: String, Codable, CaseIterable {
|
||||||
case premiereDate = "PremiereDate"
|
case premiereDate = "PremiereDate"
|
||||||
case name = "SortName"
|
case name = "SortName"
|
||||||
case dateAdded = "DateCreated"
|
case dateAdded = "DateCreated"
|
||||||
|
case random = "Random"
|
||||||
}
|
}
|
||||||
|
|
||||||
extension SortBy {
|
extension SortBy {
|
||||||
|
// TODO: Localize
|
||||||
var localized: String {
|
var localized: String {
|
||||||
switch self {
|
switch self {
|
||||||
case .premiereDate:
|
case .premiereDate:
|
||||||
|
@ -36,6 +39,8 @@ extension SortBy {
|
||||||
return "Name"
|
return "Name"
|
||||||
case .dateAdded:
|
case .dateAdded:
|
||||||
return "Date added"
|
return "Date added"
|
||||||
|
case .random:
|
||||||
|
return "Random"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -45,6 +50,7 @@ extension ItemFilter {
|
||||||
[.isUnplayed, isPlayed, .isFavorite, .likes]
|
[.isUnplayed, isPlayed, .isFavorite, .likes]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Localize
|
||||||
var localized: String {
|
var localized: String {
|
||||||
switch self {
|
switch self {
|
||||||
case .isUnplayed:
|
case .isUnplayed:
|
||||||
|
@ -62,6 +68,7 @@ extension ItemFilter {
|
||||||
}
|
}
|
||||||
|
|
||||||
extension APISortOrder {
|
extension APISortOrder {
|
||||||
|
// TODO: Localize
|
||||||
var localized: String {
|
var localized: String {
|
||||||
switch self {
|
switch self {
|
||||||
case .ascending:
|
case .ascending:
|
||||||
|
@ -72,6 +79,7 @@ extension APISortOrder {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Remove
|
||||||
enum ItemType: String {
|
enum ItemType: String {
|
||||||
case episode = "Episode"
|
case episode = "Episode"
|
||||||
case movie = "Movie"
|
case movie = "Movie"
|
||||||
|
|
|
@ -69,6 +69,8 @@ final class LibraryViewModel: ViewModel {
|
||||||
|
|
||||||
if replaceCurrentItems {
|
if replaceCurrentItems {
|
||||||
self.items = []
|
self.items = []
|
||||||
|
self.currentPage = 0
|
||||||
|
self.hasNextPage = true
|
||||||
}
|
}
|
||||||
|
|
||||||
let personIDs: [String] = [person].compactMap(\.?.id)
|
let personIDs: [String] = [person].compactMap(\.?.id)
|
||||||
|
@ -93,8 +95,17 @@ final class LibraryViewModel: ViewModel {
|
||||||
includeItemTypes = [.movie, .series, .boxSet]
|
includeItemTypes = [.movie, .series, .boxSet]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let excludedIDs: [String]?
|
||||||
|
|
||||||
|
if filters.sortBy == [.random] {
|
||||||
|
excludedIDs = items.compactMap(\.id)
|
||||||
|
} else {
|
||||||
|
excludedIDs = nil
|
||||||
|
}
|
||||||
|
|
||||||
ItemsAPI.getItemsByUserId(
|
ItemsAPI.getItemsByUserId(
|
||||||
userId: SessionManager.main.currentLogin.user.id,
|
userId: SessionManager.main.currentLogin.user.id,
|
||||||
|
excludeItemIds: excludedIDs,
|
||||||
startIndex: currentPage * pageItemSize,
|
startIndex: currentPage * pageItemSize,
|
||||||
limit: pageItemSize,
|
limit: pageItemSize,
|
||||||
recursive: true,
|
recursive: true,
|
||||||
|
@ -121,7 +132,20 @@ final class LibraryViewModel: ViewModel {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
self?.items.append(contentsOf: response.items ?? [])
|
let items: [BaseItemDto]
|
||||||
|
|
||||||
|
// There is a bug either with the request construction or the server when using
|
||||||
|
// "Random" sort which causes duplicate items to be sent even though we send the
|
||||||
|
// excluded ids. This causes shorter item additions when using "Random" over
|
||||||
|
// consecutive calls. Investigation needs to be done to find the root of the problem.
|
||||||
|
// Only filter for "Random" as an optimization.
|
||||||
|
if filters.sortBy == [.random] {
|
||||||
|
items = response.items?.filter { !(self?.items.contains($0) ?? true) } ?? []
|
||||||
|
} else {
|
||||||
|
items = response.items ?? []
|
||||||
|
}
|
||||||
|
|
||||||
|
self?.items.append(contentsOf: items)
|
||||||
})
|
})
|
||||||
.store(in: &cancellables)
|
.store(in: &cancellables)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue