mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-08-08 08:31:13 +00:00
134 lines
4.4 KiB
Swift
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)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|