Files
yattee/Yattee/Data/RecentPlaylist.swift
2026-02-08 18:33:56 +01:00

75 lines
2.2 KiB
Swift

//
// RecentPlaylist.swift
// Yattee
//
// SwiftData model for recent playlist visits (remote playlists only).
//
import Foundation
import SwiftData
@Model
final class RecentPlaylist {
var id: UUID
var playlistID: String
var sourceRawValue: String
var instanceURLString: String?
var title: String
var authorName: String
var videoCount: Int
var thumbnailURLString: String?
var visitedAt: Date
init(
id: UUID = UUID(),
playlistID: String,
sourceRawValue: String,
instanceURLString: String? = nil,
title: String,
authorName: String = "",
videoCount: Int = 0,
thumbnailURLString: String? = nil,
visitedAt: Date = Date()
) {
self.id = id
self.playlistID = playlistID
self.sourceRawValue = sourceRawValue
self.instanceURLString = instanceURLString
self.title = title
self.authorName = authorName
self.videoCount = videoCount
self.thumbnailURLString = thumbnailURLString
self.visitedAt = visitedAt
}
/// Creates a RecentPlaylist from a Playlist model
/// Returns nil for local playlists (we only track remote ones)
static func from(playlist: Playlist) -> RecentPlaylist? {
guard !playlist.isLocal, let source = playlist.id.source else {
return nil
}
let (sourceRaw, instanceURL) = extractSourceInfo(from: source)
return RecentPlaylist(
playlistID: playlist.id.playlistID,
sourceRawValue: sourceRaw,
instanceURLString: instanceURL,
title: playlist.title,
authorName: playlist.authorName,
videoCount: playlist.videoCount,
thumbnailURLString: playlist.thumbnailURL?.absoluteString
)
}
private static func extractSourceInfo(from source: ContentSource) -> (String, String?) {
switch source {
case .global:
return ("global", nil)
case .federated(_, let instance):
return ("federated", instance.absoluteString)
case .extracted:
return ("extracted", nil)
}
}
}