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 { 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,7 +74,6 @@ class SightViewModel: ObservableObject {
} }
} }
// MARK: - Загрузка медиа
// MARK: - Загрузка медиа // MARK: - Загрузка медиа
@MainActor @MainActor
private func updateMedia(for article: Article) async { private func updateMedia(for article: Article) async {
@ -84,22 +85,25 @@ class SightViewModel: ObservableObject {
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 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 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 (data, _) = try await URLSession.shared.data(from: url)
// Пробуем создать AVPlayer из данных
let localFile = try saveMediaToFile(data: data, fileExtension: "mp4") 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 let asset = player.currentItem?.asset
if let asset = asset { if let asset = asset {
try await asset.load(.isPlayable) try await asset.load(.isPlayable)
if asset.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)
} else { } else {
@ -108,16 +112,19 @@ class SightViewModel: ObservableObject {
} else { } else {
self.mediaState = .error self.mediaState = .error
} }
} else if let previewMediaId = sight.preview_media { } 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 url = URL(string: "https://white-nights.krbl.ru/services/content/media/\(previewMediaId)/download?lang=\(selectedLanguage)")!
let (data, _) = try await URLSession.shared.data(from: url) let (data, _) = try await URLSession.shared.data(from: url)
// Пробуем создать UIImage из данных
if let image = UIImage(data: data) { if let image = UIImage(data: data) {
let localFile = try saveMediaToFile(data: data, fileExtension: "jpeg") let localFile = try saveMediaToFile(data: data, fileExtension: "jpeg")
mediaCache[previewMediaId] = localFile
self.mediaState = .image(localFile) self.mediaState = .image(localFile)
self.downloadProgress = nil
} else { } else {
self.mediaState = .error self.mediaState = .error
} }
@ -132,20 +139,25 @@ class SightViewModel: ObservableObject {
type: [ArticleMedia].self type: [ArticleMedia].self
) )
if let firstMedia = mediaItems.first, if let firstMedia = mediaItems.first {
let url = URL(string: "https://white-nights.krbl.ru/services/content/media/\(firstMedia.id)/download?lang=\(selectedLanguage)") { 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) let (data, _) = try await URLSession.shared.data(from: url)
if let image = UIImage(data: data) { if let image = UIImage(data: data) {
let localFile = try saveMediaToFile(data: data, fileExtension: "jpeg") let localFile = try saveMediaToFile(data: data, fileExtension: "jpeg")
mediaCache[mediaId] = localFile
self.mediaState = .image(localFile) self.mediaState = .image(localFile)
self.downloadProgress = nil
} else { } else {
self.mediaState = .error self.mediaState = .error
} }
} }
} }
}
} catch { } catch {
print("Ошибка загрузки файла: \(error)") print("Ошибка загрузки файла: \(error)")
self.mediaState = .error self.mediaState = .error
@ -153,6 +165,7 @@ class SightViewModel: ObservableObject {
} }
} }
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
.appendingPathComponent(UUID().uuidString) .appendingPathComponent(UUID().uuidString)