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 channelSubscription(_ id: String) -> Resource?
|
|
|
|
|
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?
|
2021-10-24 18:01:08 +00:00
|
|
|
|
|
|
|
func loadDetails(_ item: PlayerQueueItem, completionHandler: @escaping (PlayerQueueItem) -> Void)
|
2021-10-28 17:14:55 +00:00
|
|
|
func shareURL(_ item: ContentItem) -> URL?
|
2021-10-24 18:01:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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-10-28 17:14:55 +00:00
|
|
|
func shareURL(_ item: ContentItem) -> URL? {
|
|
|
|
guard let frontendHost = account.instance.frontendHost else {
|
|
|
|
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-10-26 22:59:59 +00:00
|
|
|
switch item.contentType {
|
|
|
|
case .video:
|
|
|
|
urlComponents.path = "/watch"
|
|
|
|
urlComponents.query = "v=\(item.video.videoID)"
|
|
|
|
case .channel:
|
|
|
|
urlComponents.path = "/channel/\(item.channel.id)"
|
|
|
|
case .playlist:
|
|
|
|
urlComponents.path = "/playlist"
|
|
|
|
urlComponents.query = "list=\(item.playlist.id)"
|
|
|
|
}
|
|
|
|
|
|
|
|
return urlComponents.url!
|
|
|
|
}
|
2021-10-20 22:21:50 +00:00
|
|
|
}
|