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,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