last-update
This commit is contained in:
@ -8,6 +8,8 @@ import SwiftUI
|
|||||||
class SightViewModel: ObservableObject {
|
class SightViewModel: ObservableObject {
|
||||||
private let fileDownloader = FileDownloader()
|
private let fileDownloader = FileDownloader()
|
||||||
|
|
||||||
|
private var mediaCache: [String: URL] = [:]
|
||||||
|
|
||||||
@Published var sightName: String = "Загрузка..."
|
@Published var sightName: String = "Загрузка..."
|
||||||
@Published var allArticles: [Article] = []
|
@Published var allArticles: [Article] = []
|
||||||
@Published var selectedArticle: Article?
|
@Published var selectedArticle: Article?
|
||||||
@ -72,86 +74,97 @@ class SightViewModel: ObservableObject {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Загрузка медиа
|
|
||||||
// MARK: - Загрузка медиа
|
// MARK: - Загрузка медиа
|
||||||
@MainActor
|
@MainActor
|
||||||
private func updateMedia(for article: Article) async {
|
private func updateMedia(for article: Article) async {
|
||||||
self.mediaState = .loading
|
self.mediaState = .loading
|
||||||
self.downloadProgress = nil
|
self.downloadProgress = nil
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if article.isReviewArticle ?? false {
|
if article.isReviewArticle ?? false {
|
||||||
guard let sight = sightModel else { return }
|
guard let sight = sightModel else { return }
|
||||||
|
|
||||||
if let videoPreviewId = sight.video_preview {
|
if let videoPreviewId = sight.video_preview {
|
||||||
// Пытаемся загрузить видео-превью
|
if let cachedURL = mediaCache[videoPreviewId] {
|
||||||
let url = URL(string: "https://white-nights.krbl.ru/services/content/media/\(videoPreviewId)/download?lang=\(selectedLanguage)")!
|
let player = AVPlayer(url: cachedURL)
|
||||||
let (data, _) = try await URLSession.shared.data(from: url)
|
|
||||||
|
|
||||||
// Пробуем создать AVPlayer из данных
|
|
||||||
let localFile = try saveMediaToFile(data: data, fileExtension: "mp4")
|
|
||||||
let player = AVPlayer(url: localFile)
|
|
||||||
|
|
||||||
// Асинхронно загружаем статус готовности
|
|
||||||
let asset = player.currentItem?.asset
|
|
||||||
if let asset = asset {
|
|
||||||
try await asset.load(.isPlayable)
|
|
||||||
|
|
||||||
if asset.isPlayable {
|
|
||||||
self.mediaState = .video(player)
|
self.mediaState = .video(player)
|
||||||
self.downloadProgress = nil
|
|
||||||
player.play()
|
player.play()
|
||||||
await player.seek(to: .zero)
|
await player.seek(to: .zero)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let url = URL(string: "https://white-nights.krbl.ru/services/content/media/\(videoPreviewId)/download?lang=\(selectedLanguage)")!
|
||||||
|
let (data, _) = try await URLSession.shared.data(from: url)
|
||||||
|
let localFile = try saveMediaToFile(data: data, fileExtension: "mp4")
|
||||||
|
mediaCache[videoPreviewId] = localFile
|
||||||
|
|
||||||
|
let player = AVPlayer(url: localFile)
|
||||||
|
let asset = player.currentItem?.asset
|
||||||
|
if let asset = asset {
|
||||||
|
try await asset.load(.isPlayable)
|
||||||
|
if asset.isPlayable {
|
||||||
|
self.mediaState = .video(player)
|
||||||
|
player.play()
|
||||||
|
await player.seek(to: .zero)
|
||||||
|
} else {
|
||||||
|
self.mediaState = .error
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
self.mediaState = .error
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if let previewMediaId = sight.preview_media {
|
||||||
|
if let cachedURL = mediaCache[previewMediaId] {
|
||||||
|
self.mediaState = .image(cachedURL)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let url = URL(string: "https://white-nights.krbl.ru/services/content/media/\(previewMediaId)/download?lang=\(selectedLanguage)")!
|
||||||
|
let (data, _) = try await URLSession.shared.data(from: url)
|
||||||
|
if let image = UIImage(data: data) {
|
||||||
|
let localFile = try saveMediaToFile(data: data, fileExtension: "jpeg")
|
||||||
|
mediaCache[previewMediaId] = localFile
|
||||||
|
self.mediaState = .image(localFile)
|
||||||
} else {
|
} else {
|
||||||
self.mediaState = .error
|
self.mediaState = .error
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
self.mediaState = .error
|
self.mediaState = .error
|
||||||
}
|
}
|
||||||
} else if let previewMediaId = sight.preview_media {
|
|
||||||
// Если нет видео-превью, пытаемся загрузить изображение
|
|
||||||
let url = URL(string: "https://white-nights.krbl.ru/services/content/media/\(previewMediaId)/download?lang=\(selectedLanguage)")!
|
|
||||||
let (data, _) = try await URLSession.shared.data(from: url)
|
|
||||||
|
|
||||||
// Пробуем создать UIImage из данных
|
|
||||||
if let image = UIImage(data: data) {
|
|
||||||
let localFile = try saveMediaToFile(data: data, fileExtension: "jpeg")
|
|
||||||
self.mediaState = .image(localFile)
|
|
||||||
self.downloadProgress = nil
|
|
||||||
} else {
|
|
||||||
self.mediaState = .error
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
self.mediaState = .error
|
// Загрузка медиа для статьи
|
||||||
}
|
let mediaItems = try await fetchJSON(
|
||||||
|
from: "https://white-nights.krbl.ru/services/content/article/\(article.id)/media?lang=\(selectedLanguage)",
|
||||||
|
type: [ArticleMedia].self
|
||||||
|
)
|
||||||
|
|
||||||
} else {
|
if let firstMedia = mediaItems.first {
|
||||||
// Загрузка медиа для статьи
|
let mediaId = "\(firstMedia.id)"
|
||||||
let mediaItems = try await fetchJSON(
|
if let cachedURL = mediaCache[mediaId] {
|
||||||
from: "https://white-nights.krbl.ru/services/content/article/\(article.id)/media?lang=\(selectedLanguage)",
|
self.mediaState = .image(cachedURL)
|
||||||
type: [ArticleMedia].self
|
return
|
||||||
)
|
}
|
||||||
|
|
||||||
if let firstMedia = mediaItems.first,
|
if let url = URL(string: "https://white-nights.krbl.ru/services/content/media/\(firstMedia.id)/download?lang=\(selectedLanguage)") {
|
||||||
let url = URL(string: "https://white-nights.krbl.ru/services/content/media/\(firstMedia.id)/download?lang=\(selectedLanguage)") {
|
let (data, _) = try await URLSession.shared.data(from: url)
|
||||||
|
if let image = UIImage(data: data) {
|
||||||
let (data, _) = try await URLSession.shared.data(from: url)
|
let localFile = try saveMediaToFile(data: data, fileExtension: "jpeg")
|
||||||
|
mediaCache[mediaId] = localFile
|
||||||
if let image = UIImage(data: data) {
|
self.mediaState = .image(localFile)
|
||||||
let localFile = try saveMediaToFile(data: data, fileExtension: "jpeg")
|
} else {
|
||||||
self.mediaState = .image(localFile)
|
self.mediaState = .error
|
||||||
self.downloadProgress = nil
|
}
|
||||||
} else {
|
}
|
||||||
self.mediaState = .error
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch {
|
||||||
|
print("Ошибка загрузки файла: \(error)")
|
||||||
|
self.mediaState = .error
|
||||||
|
self.downloadProgress = nil
|
||||||
}
|
}
|
||||||
} catch {
|
|
||||||
print("Ошибка загрузки файла: \(error)")
|
|
||||||
self.mediaState = .error
|
|
||||||
self.downloadProgress = nil
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private func saveMediaToFile(data: Data, fileExtension: String) throws -> URL {
|
private func saveMediaToFile(data: Data, fileExtension: String) throws -> URL {
|
||||||
let destinationURL = FileManager.default.temporaryDirectory
|
let destinationURL = FileManager.default.temporaryDirectory
|
||||||
|
Reference in New Issue
Block a user