last-update

This commit is contained in:
15lu.akari
2025-08-29 19:43:57 +03:00
parent 30d97f420e
commit 49737209bd

View File

@ -8,6 +8,8 @@ import SwiftUI
class SightViewModel: ObservableObject {
private let fileDownloader = FileDownloader()
private var mediaCache: [String: URL] = [:]
@Published var sightName: String = "Загрузка..."
@Published var allArticles: [Article] = []
@Published var selectedArticle: Article?
@ -72,7 +74,6 @@ class SightViewModel: ObservableObject {
}
}
// MARK: - Загрузка медиа
// MARK: - Загрузка медиа
@MainActor
private func updateMedia(for article: Article) async {
@ -84,22 +85,25 @@ class SightViewModel: ObservableObject {
guard let sight = sightModel else { return }
if let videoPreviewId = sight.video_preview {
// Пытаемся загрузить видео-превью
if let cachedURL = mediaCache[videoPreviewId] {
let player = AVPlayer(url: cachedURL)
self.mediaState = .video(player)
player.play()
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)
// Пробуем создать AVPlayer из данных
let localFile = try saveMediaToFile(data: data, fileExtension: "mp4")
let player = AVPlayer(url: localFile)
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)
self.downloadProgress = nil
player.play()
await player.seek(to: .zero)
} else {
@ -108,16 +112,19 @@ class SightViewModel: ObservableObject {
} 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)
// Пробуем создать UIImage из данных
if let image = UIImage(data: data) {
let localFile = try saveMediaToFile(data: data, fileExtension: "jpeg")
mediaCache[previewMediaId] = localFile
self.mediaState = .image(localFile)
self.downloadProgress = nil
} else {
self.mediaState = .error
}
@ -132,20 +139,25 @@ class SightViewModel: ObservableObject {
type: [ArticleMedia].self
)
if let firstMedia = mediaItems.first,
let url = URL(string: "https://white-nights.krbl.ru/services/content/media/\(firstMedia.id)/download?lang=\(selectedLanguage)") {
if let firstMedia = mediaItems.first {
let mediaId = "\(firstMedia.id)"
if let cachedURL = mediaCache[mediaId] {
self.mediaState = .image(cachedURL)
return
}
if 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 localFile = try saveMediaToFile(data: data, fileExtension: "jpeg")
mediaCache[mediaId] = localFile
self.mediaState = .image(localFile)
self.downloadProgress = nil
} else {
self.mediaState = .error
}
}
}
}
} catch {
print("Ошибка загрузки файла: \(error)")
self.mediaState = .error
@ -153,6 +165,7 @@ class SightViewModel: ObservableObject {
}
}
private func saveMediaToFile(data: Data, fileExtension: String) throws -> URL {
let destinationURL = FileManager.default.temporaryDirectory
.appendingPathComponent(UUID().uuidString)