Swift Media Player
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

232 lines
6.3 KiB

//
// Created by Marco Schmickler on 22.06.22.
// Copyright (c) 2022 Marco Schmickler. All rights reserved.
//
import Foundation
import SwiftUI
class SPhotoModel : ObservableObject {
@Published var folderItems = [MediaItem]()
@Published var folderIndex = 0
@Published var compilationItems : [MediaItem]
@Published var allItems : [MediaItem]
@Published var indexItems : [MediaItem]
@Published var selectedItem : MediaItem
@Published var index = 0
@Published var thumbIndex = 0
@Published var scrub = false
@Published var favorite = false
@Published var dirty = false
@Published var compilation = false
@Published var preloading = 0
@Published var go = false
@Published var locked = false
@Published var deadline = Date()
@Published var image = UIImage()
@Published var scale: CGFloat = 1.0
@Published var maxScale: CGFloat = 1.0
@Published var dragOffset: CGSize = CGSize.zero
@Published var spring = false
@Published var timer : Timer?
init(allItems: [MediaItem]) {
self.allItems = allItems
self.compilationItems = allItems
selectedItem = allItems[0]
indexItems = allItems
update(allItems: allItems)
}
func loadImage() {
if selectedItem.thumbUrl != nil {
loadImage(for: selectedItem.imageUrlAbsolute)
}
}
func loadImage(for urlString: String) {
guard let url = URL(string: urlString) else { return }
if (!go) {
if let thumb = ImageLoader.shared.cache[url] {
image = thumb
print("cache \(url)")
}
}
if let t = timer {
t.invalidate()
}
timer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: false) { timer in
print("load \(urlString)")
ImageLoader.shared.loadFullImage(from: url).sink { img in
if let i = img {
if self.go || self.selectedItem.imageUrlAbsolute == url.absoluteString {
Thread.sleep(until: self.deadline)
self.image = i
}
if (self.go) {
self.nextItem()
}
}
}
}
// let task = URLSession.shared.dataTask(with: url) { data, response, error in
// guard let data = data else { return }
// DispatchQueue.main.async {
// self.image = UIImage(data: data) ?? UIImage(systemName: "repeat")!
// print("loaded \(urlString)\(self.image)")
// }
// }
// task.resume()
}
private func update(allItems: [MediaItem]) {
if allItems.isEmpty {
return
}
self.allItems = allItems
selectedItem = allItems[0]
let max = 17
if allItems.count < max {
indexItems = allItems
}
else {
indexItems = [MediaItem]()
var nj = -1
for i in 0...allItems.count-1 {
allItems[i].indexId = i
let j = Int((Double(i) / Double(allItems.count)) * 17.0)
if j > nj {
nj = j
indexItems.append(allItems[i])
}
}
}
let m = MediaItem(name: selectedItem.name, path: selectedItem.path, root: selectedItem.root, type: selectedItem.type)
m.children = allItems
DatabaseManager.sharedInstance.enrichItem(m)
selectedItem.indexId = 0
loadImage()
}
func selectItem(_ item: MediaItem) {
if let thumb = item.thumbUrl {
for i in 0...allItems.count - 1 {
if allItems[i].thumbUrl != nil && allItems[i].thumbUrl! == thumb {
selectedItem = item
selectedItem.indexId = i
index = i
loadImage()
break;
}
}
}
}
func back() {
if locked {
return
}
locked = true
if (folderIndex > 0) {
folderIndex -= 1
} else {
folderIndex = folderItems.count - 1
}
show()
}
func next() {
if locked {
return
}
locked = true
if (folderIndex < folderItems.count - 1) {
folderIndex += 1
} else {
folderIndex = 0
}
show()
}
func nextItem() {
if (index < allItems.count - 1) {
index += 1
}
else {
index = 0
}
selectedItem = allItems[index]
deadline = Date().advanced(by: 0.4)
loadImage()
}
func show() {
if (compilation) {
if folderIndex == 0 {
update(allItems: compilationItems)
locked = false
return
}
else {
folderIndex = 1
}
}
if folderIndex > folderItems.count - 1 {
return
}
var selectedItem = compilation ? selectedItem : folderItems[folderIndex]
NetworkManager.sharedInstance.loadPicDetails(items: selectedItem, result: { (im: [MediaItem]) in
self.index = 0
self.update(allItems: im)
self.preload()
let kitem = DatabaseManager.sharedInstance.getKItem(selectedItem)
self.favorite = kitem.favorite
Timer.scheduledTimer(withTimeInterval: 1, repeats: false) { timer in
self.locked = false
}
})
}
func preload() {
preloading = 0
for item in allItems {
if item.thumbImage == nil && item.thumbUrlAbsolute.contains("/ren/thumbs/"){
if let URL = Foundation.URL(string: item.thumbUrlAbsolute) {
//try! await Task.sleep(nanoseconds: UInt64(1 * Double(NSEC_PER_SEC)))
print("preload \(item.thumbUrlAbsolute)")
preloading += 1
ImageLoader.shared.loadImageBackground(from: URL).sink { image in
if let i = image {
item.thumbImage = i
}
self.preloading -= 1
}
// break
}
}
}
}
}