mirror of
https://github.com/yattee/yattee.git
synced 2026-02-20 17:59:45 +00:00
67 lines
3.2 KiB
Swift
67 lines
3.2 KiB
Swift
//
|
|
// InstanceAPI.swift
|
|
// Yattee
|
|
//
|
|
// Protocol defining the API interface that each backend must implement.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
/// Protocol that each backend API (Invidious, Piped, PeerTube) must implement.
|
|
protocol InstanceAPI: Sendable {
|
|
func trending(instance: Instance) async throws -> [Video]
|
|
func popular(instance: Instance) async throws -> [Video]
|
|
func search(query: String, instance: Instance, page: Int, filters: SearchFilters) async throws -> SearchResult
|
|
func searchSuggestions(query: String, instance: Instance) async throws -> [String]
|
|
func video(id: String, instance: Instance) async throws -> Video
|
|
func channel(id: String, instance: Instance) async throws -> Channel
|
|
func channelVideos(id: String, instance: Instance, continuation: String?) async throws -> ChannelVideosPage
|
|
func channelPlaylists(id: String, instance: Instance, continuation: String?) async throws -> ChannelPlaylistsPage
|
|
func channelShorts(id: String, instance: Instance, continuation: String?) async throws -> ChannelVideosPage
|
|
func channelStreams(id: String, instance: Instance, continuation: String?) async throws -> ChannelVideosPage
|
|
func playlist(id: String, instance: Instance) async throws -> Playlist
|
|
func comments(videoID: String, instance: Instance, continuation: String?) async throws -> CommentsPage
|
|
func streams(videoID: String, instance: Instance) async throws -> [Stream]
|
|
func captions(videoID: String, instance: Instance) async throws -> [Caption]
|
|
func channelSearch(id: String, query: String, instance: Instance, page: Int) async throws -> ChannelSearchPage
|
|
}
|
|
|
|
// MARK: - Default Implementations
|
|
|
|
extension InstanceAPI {
|
|
/// Default implementation for backends that don't distinguish popular from trending.
|
|
func popular(instance: Instance) async throws -> [Video] {
|
|
try await trending(instance: instance)
|
|
}
|
|
|
|
/// Default implementation for backends that don't support search suggestions.
|
|
func searchSuggestions(query: String, instance: Instance) async throws -> [String] {
|
|
[]
|
|
}
|
|
|
|
/// Default implementation for backends that don't support captions.
|
|
func captions(videoID: String, instance: Instance) async throws -> [Caption] {
|
|
[]
|
|
}
|
|
|
|
/// Default implementation for backends that don't support channel playlists tab.
|
|
func channelPlaylists(id: String, instance: Instance, continuation: String?) async throws -> ChannelPlaylistsPage {
|
|
ChannelPlaylistsPage(playlists: [], continuation: nil)
|
|
}
|
|
|
|
/// Default implementation for backends that don't support channel shorts tab.
|
|
func channelShorts(id: String, instance: Instance, continuation: String?) async throws -> ChannelVideosPage {
|
|
ChannelVideosPage(videos: [], continuation: nil)
|
|
}
|
|
|
|
/// Default implementation for backends that don't support channel streams tab.
|
|
func channelStreams(id: String, instance: Instance, continuation: String?) async throws -> ChannelVideosPage {
|
|
ChannelVideosPage(videos: [], continuation: nil)
|
|
}
|
|
|
|
/// Default implementation for backends that don't support channel search.
|
|
func channelSearch(id: String, query: String, instance: Instance, page: Int) async throws -> ChannelSearchPage {
|
|
throw APIError.notSupported
|
|
}
|
|
}
|