yattee/Model/Applications/VideosAPI.swift

89 lines
2.8 KiB
Swift
Raw Normal View History

2021-11-02 19:40:49 +00:00
import AVFoundation
2021-10-20 22:21:50 +00:00
import Foundation
import Siesta
protocol VideosAPI {
2021-10-26 22:59:59 +00:00
var account: Account! { get }
2021-10-20 22:21:50 +00:00
var signedIn: Bool { get }
func channel(_ id: String) -> Resource
2021-11-01 21:56:18 +00:00
func channelVideos(_ id: String) -> Resource
2021-10-20 22:21:50 +00:00
func trending(country: Country, category: TrendingCategory?) -> Resource
func search(_ query: SearchQuery) -> Resource
func searchSuggestions(query: String) -> Resource
func video(_ id: Video.ID) -> Resource
var subscriptions: Resource? { get }
var feed: Resource? { get }
var home: Resource? { get }
var popular: Resource? { get }
var playlists: Resource? { get }
func subscribe(_ channelID: String, onCompletion: @escaping () -> Void)
func unsubscribe(_ channelID: String, onCompletion: @escaping () -> Void)
2021-10-20 22:21:50 +00:00
2021-11-01 21:56:18 +00:00
func playlist(_ id: String) -> Resource?
2021-10-20 22:21:50 +00:00
func playlistVideo(_ playlistID: String, _ videoID: String) -> Resource?
func playlistVideos(_ id: String) -> Resource?
2021-10-22 23:04:03 +00:00
func channelPlaylist(_ id: String) -> Resource?
func loadDetails(_ item: PlayerQueueItem, completionHandler: @escaping (PlayerQueueItem) -> Void)
2021-11-02 19:40:49 +00:00
func shareURL(_ item: ContentItem, frontendHost: String?, time: CMTime?) -> URL?
2021-12-04 19:35:41 +00:00
func comments(_ id: Video.ID, page: String?) -> Resource?
}
extension VideosAPI {
func loadDetails(_ item: PlayerQueueItem, completionHandler: @escaping (PlayerQueueItem) -> Void = { _ in }) {
guard (item.video?.streams ?? []).isEmpty else {
completionHandler(item)
return
}
video(item.videoID).load().onSuccess { response in
guard let video: Video = response.typedContent() else {
return
}
var newItem = item
newItem.video = video
completionHandler(newItem)
}
}
2021-10-26 22:59:59 +00:00
2021-11-02 19:40:49 +00:00
func shareURL(_ item: ContentItem, frontendHost: String? = nil, time: CMTime? = nil) -> URL? {
guard let frontendHost = frontendHost ?? account.instance.frontendHost else {
2021-10-28 17:14:55 +00:00
return nil
}
2021-10-26 22:59:59 +00:00
var urlComponents = account.instance.urlComponents
2021-10-28 17:14:55 +00:00
urlComponents.host = frontendHost
2021-10-27 21:11:38 +00:00
2021-11-02 19:40:49 +00:00
var queryItems = [URLQueryItem]()
2021-10-26 22:59:59 +00:00
switch item.contentType {
case .video:
urlComponents.path = "/watch"
2021-11-02 19:40:49 +00:00
queryItems.append(.init(name: "v", value: item.video.videoID))
2021-10-26 22:59:59 +00:00
case .channel:
urlComponents.path = "/channel/\(item.channel.id)"
case .playlist:
urlComponents.path = "/playlist"
2021-11-02 19:40:49 +00:00
queryItems.append(.init(name: "list", value: item.playlist.id))
}
if !time.isNil, time!.seconds.isFinite {
queryItems.append(.init(name: "t", value: "\(Int(time!.seconds))s"))
}
if !queryItems.isEmpty {
urlComponents.queryItems = queryItems
2021-10-26 22:59:59 +00:00
}
2021-11-13 15:45:47 +00:00
return urlComponents.url
2021-10-26 22:59:59 +00:00
}
2021-10-20 22:21:50 +00:00
}