Swiftgram/TelegramUI/InstantPageMediaAudioPlaylist.swift
2017-09-05 21:27:04 +03:00

134 lines
4.4 KiB
Swift

import Foundation
import Postbox
import TelegramCore
import SwiftSignalKit
struct InstantPageAudioPlaylistItemId: AudioPlaylistItemId {
let index: Int
let id: MediaId
var hashValue: Int {
return self.id.hashValue &+ self.index.hashValue
}
func isEqual(to: AudioPlaylistItemId) -> Bool {
if let other = to as? InstantPageAudioPlaylistItemId {
return self.index == other.index && self.id == other.id
} else {
return false
}
}
}
final class InstantPageAudioPlaylistItem: AudioPlaylistItem {
let media: InstantPageMedia
var id: AudioPlaylistItemId {
return InstantPageAudioPlaylistItemId(index: self.media.index, id: self.media.media.id!)
}
var resource: MediaResource? {
if let file = self.media.media as? TelegramMediaFile {
return file.resource
}
return nil
}
var streamable: Bool {
if let file = self.media.media as? TelegramMediaFile {
if file.isMusic {
return true
}
}
return false
}
var info: AudioPlaylistItemInfo? {
if let file = self.media.media as? TelegramMediaFile {
for attribute in file.attributes {
switch attribute {
case let .Audio(isVoice, duration, title, performer, _):
if isVoice {
return AudioPlaylistItemInfo(duration: Double(duration), labelInfo: .voice)
} else {
return AudioPlaylistItemInfo(duration: Double(duration), labelInfo: .music(title: title, performer: performer))
}
case let .Video(duration, _, flags):
if flags.contains(.instantRoundVideo) {
return AudioPlaylistItemInfo(duration: Double(duration), labelInfo: .video)
}
default:
break
}
}
return nil
}
return nil
}
init(media: InstantPageMedia) {
self.media = media
}
func isEqual(to: AudioPlaylistItem) -> Bool {
if let other = to as? InstantPageAudioPlaylistItem {
return self.media == other.media
} else {
return false
}
}
}
struct InstantPageAudioPlaylistId: AudioPlaylistId {
let webpageId: MediaId
func isEqual(to: AudioPlaylistId) -> Bool {
if let other = to as? InstantPageAudioPlaylistId {
if self.webpageId != other.webpageId {
return false
}
return true
} else {
return false
}
}
}
func instantPageAudioPlaylistAndItemIds(webpage: TelegramMediaWebpage, media: InstantPageMedia) -> (AudioPlaylistId, AudioPlaylistItemId)? {
return (InstantPageAudioPlaylistId(webpageId: webpage.webpageId), InstantPageAudioPlaylistItemId(index: media.index, id: media.media.id!))
}
func instantPageAudioPlaylist(account: Account, webpage: TelegramMediaWebpage, medias: [InstantPageMedia], at centralMedia: InstantPageMedia) -> AudioPlaylist {
return AudioPlaylist(id: InstantPageAudioPlaylistId(webpageId: webpage.webpageId), navigate: { item, navigation in
if let item = item as? InstantPageAudioPlaylistItem {
if let index = medias.index(of: item.media) {
switch navigation {
case .previous:
if index == 0 {
return .single(item)
} else {
return .single(InstantPageAudioPlaylistItem(media: medias[index - 1]))
}
case .next:
if index == medias.count - 1 {
return .single(nil)
} else {
return .single(InstantPageAudioPlaylistItem(media: medias[index + 1]))
}
}
} else {
return .single(nil)
}
} else {
if let index = medias.index(of: centralMedia) {
return .single(InstantPageAudioPlaylistItem(media: medias[index]))
} else if let media = medias.first {
return .single(InstantPageAudioPlaylistItem(media: media))
} else {
return .single(nil)
}
}
})
}