2 Commits

Author SHA1 Message Date
marcoschmickler 6ad3782d53 Photos 4 years ago
marcoschmickler 4d63b3778d Photos 4 years ago
  1. 56
      kplayer/core/DatabaseManager.swift
  2. 2
      kplayer/core/LocalManager.swift
  3. 4
      kplayer/core/MediaItem.swift
  4. 2
      kplayer/core/NetworkManager.swift
  5. 13
      kplayer/detail/DetailViewController+Show.swift
  6. 17
      kplayer/detail/DetailViewController.swift
  7. 23
      kplayer/photo/SPhotoAlbumView.swift
  8. 24
      kplayer/photo/SPhotoModel.swift
  9. 1
      kplayer/photo/SPhotoScrubber.swift
  10. 2
      kplayer/server/kplayer.js
  11. 20
      kplayer/util/AsyncImage.swift

56
kplayer/core/DatabaseManager.swift

@ -107,6 +107,28 @@ class DatabaseManager {
} }
func saveItemMetaData(_ item: MediaItem) { func saveItemMetaData(_ item: MediaItem) {
if (item.type == ItemType.PICS) {
if let oid = item.objectID {
do {
let i = try managedObjectContext.existingObject(with: oid)
if i != nil {
let snap = i as! KSnapshot
updateSnapshot(snap: snap, c: item)
print("DB -- Update snapshot at \(item.indexId)")
}
} catch {
}
}
else {
let kitem = getKItem(item)
let snap = KSnapshot(context: managedObjectContext)
snap.index = Int32(item.indexId)
kitem.addToSnapshots(snap)
updateSnapshot(snap: snap, c: item)
}
}
if (item.type == ItemType.SNAPSHOT) { if (item.type == ItemType.SNAPSHOT) {
if let oid = item.objectID { if let oid = item.objectID {
do { do {
@ -264,13 +286,22 @@ class DatabaseManager {
let snapshots = t.tagged as! Set<KSnapshot> let snapshots = t.tagged as! Set<KSnapshot>
for s in snapshots { for s in snapshots {
let sitem = loadSnapshot(s: s)
sitem.parent = tag
if sitem.name == tag.name {
print(sitem.name)
if s.item != nil {
let sitem = loadSnapshot(s: s)
sitem.parent = tag
if sitem.name == tag.name {
print(sitem.name)
} else {
tag.children.append(sitem)
}
} }
else { else {
tag.children.append(sitem)
do {
try managedObjectContext.delete(s)
try managedObjectContext.save()
} catch {
print("Error")
}
} }
} }
@ -289,13 +320,24 @@ class DatabaseManager {
} }
private func loadSnapshot(s: KSnapshot) -> MediaItem { private func loadSnapshot(s: KSnapshot) -> MediaItem {
let stype : ItemType
let ctype : ItemType
if s.item!.type! == "pics" {
stype = ItemType.PICS
ctype = ItemType.PICS
}
else {
stype = ItemType.VIDEO
ctype = ItemType.SNAPSHOT
}
let i = s.item! let i = s.item!
let sitem = MediaItem(name: i.name!, path: i.path!, root: i.root!, type: ItemType.VIDEO)
let sitem = MediaItem(name: i.name!, path: i.path!, root: i.root!, type: stype)
sitem.loaded = true sitem.loaded = true
sitem.compilation = true sitem.compilation = true
sitem.objectID = i.objectID sitem.objectID = i.objectID
let c = MediaItem(name: i.name!, path: i.path!, root: i.root!, type: ItemType.SNAPSHOT)
let c = MediaItem(name: i.name!, path: i.path!, root: i.root!, type: ctype)
c.time = s.time c.time = s.time
c.length = s.length c.length = s.length
c.loop = s.loop c.loop = s.loop

2
kplayer/core/LocalManager.swift

@ -10,7 +10,7 @@ class LocalManager {
var settings = KSettings() var settings = KSettings()
var authenticated = true
var authenticated = false
var favorites = MediaItem(name: "fav", path: "", root: "", type: ItemType.FAVROOT) var favorites = MediaItem(name: "fav", path: "", root: "", type: ItemType.FAVROOT)

4
kplayer/core/MediaItem.swift

@ -274,8 +274,8 @@ class MediaItem: CustomDebugStringConvertible, ObservableObject, Identifiable {
Absoluter Pfad des Items. Absoluter Pfad des Items.
*/ */
var fullPath: String { var fullPath: String {
let fpath = "\(root)/\(path)/\(name)"
let enc = fpath.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)!
let fpath = (path == "") ? "\(root)/\(name)" : "\(root)/\(path)/\(name)"
let enc = fpath.precomposedStringWithCanonicalMapping.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)!
return enc return enc
} }

2
kplayer/core/NetworkManager.swift

@ -439,7 +439,7 @@ class NetworkManager {
let len = items.root.count let len = items.root.count
let url = nodeurl + "listfiles" + items.fullPath let url = nodeurl + "listfiles" + items.fullPath
print(items)
// print(items)
print(url) print(url)
AF.request(url).responseJSON { AF.request(url).responseJSON {

13
kplayer/detail/DetailViewController+Show.swift

@ -13,7 +13,7 @@ extension DetailViewController {
if sectionItem.isVideo() { if sectionItem.isVideo() {
showVideo(selectedItem: selectedItem) showVideo(selectedItem: selectedItem)
} else if sectionItem.isPic() { } else if sectionItem.isPic() {
showPhotos(sectionItem.children)
showPhotos(sectionItem.children, selectedItem: selectedItem)
} else if sectionItem.isWeb() { } else if sectionItem.isWeb() {
showWeb(selectedItem: selectedItem) showWeb(selectedItem: selectedItem)
} else if sectionItem.type == ItemType.DOWNLOAD { } else if sectionItem.type == ItemType.DOWNLOAD {
@ -21,15 +21,18 @@ extension DetailViewController {
} }
} }
func showPhotos(_ im: [MediaItem]) {
func showPhotos(_ im: [MediaItem], selectedItem: MediaItem) {
let base = MediaItem(name: "", path: "", root: "", type: ItemType.PICFOLDER) let base = MediaItem(name: "", path: "", root: "", type: ItemType.PICFOLDER)
base.children = im base.children = im
if im.count < 1 {
return
}
let model = SPhotoModel(allItems: base.clone().children) let model = SPhotoModel(allItems: base.clone().children)
model.selectItem(selectedItem)
let view = SPhotoAlbumView(completionHandler: { saved in let view = SPhotoAlbumView(completionHandler: { saved in
// self.collectionView.reloadData()
// self.collectionView.collectionViewLayout.invalidateLayout()
self.collectionView.reloadData()
self.collectionView.collectionViewLayout.invalidateLayout()
self.dismiss(animated: true, completion: nil); self.dismiss(animated: true, completion: nil);
}, model: model) }, model: model)

17
kplayer/detail/DetailViewController.swift

@ -343,18 +343,27 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
let sectionItem = detail.children[indexPath.section] let sectionItem = detail.children[indexPath.section]
currentItem = sectionItem currentItem = sectionItem
var selectedItem = currentItem!
if currentItem!.type == .PICS {
currentItem = sectionItem.clone()
}
if currentItem!.type == .FOLDER {
currentItem = sectionItem.children[indexPath.item]
}
var selectedItem = sectionItem
let weiter: () -> Void = { let weiter: () -> Void = {
if (sectionItem.type == ItemType.VIDEO || sectionItem.loaded) {
// if (sectionItem.type == ItemType.VIDEO || sectionItem.loaded) {
if indexPath.item >= sectionItem.children.count { if indexPath.item >= sectionItem.children.count {
selectedItem = sectionItem
print(sectionItem.name) print(sectionItem.name)
} else { } else {
selectedItem = sectionItem.children[indexPath.item] selectedItem = sectionItem.children[indexPath.item]
print(selectedItem.name) print(selectedItem.name)
} }
}
self.showDetails(sectionItem: sectionItem, selectedItem: selectedItem)
// }
self.showDetails(sectionItem: self.currentItem!, selectedItem: selectedItem)
} }
delegate!.loadDetails(selectedItem: currentItem!, completionHandler: weiter) delegate!.loadDetails(selectedItem: currentItem!, completionHandler: weiter)

23
kplayer/photo/SPhotoAlbumView.swift

@ -47,19 +47,30 @@ struct SPhotoAlbumView: View {
} }
if more { if more {
v.overlay(VStack { v.overlay(VStack {
KToggleButton(text: "spring", binding: $model.spring).frame(height: 30)
KToggleButton(text: "edit", binding: $edit).frame(height: 30)
}
.frame(width: 60, alignment: .top).offset(x: 0, y: 70), alignment: .topLeading).overlay(TagEditor(item: model.allItems[model.index])
KToggleButton(text: "spring", binding: $model.spring).frame(height: 30)
Button(action: {
saveSelectedItem()
}, label: {
Text("save")
})
.buttonStyle(BorderlessButtonStyle())
}
.frame(width: 60, alignment: .top).offset(x: 0, y: 70), alignment: .topLeading)
.overlay(TagEditor(item: model.allItems[model.index])
.frame(width: 60, alignment: .top).offset(x: 0, y: 70), .frame(width: 60, alignment: .top).offset(x: 0, y: 70),
alignment: .topTrailing) alignment: .topTrailing)
}
else {
} else {
v v
} }
} }
func saveSelectedItem() {
let item = model.selectedItem
DatabaseManager.sharedInstance.saveItemMetaData(item)
}
func cleanup() { func cleanup() {
for i in model.allItems { for i in model.allItems {
i.thumbImage = nil i.thumbImage = nil

24
kplayer/photo/SPhotoModel.swift

@ -31,12 +31,34 @@ class SPhotoModel : ObservableObject {
indexItems = [MediaItem]() indexItems = [MediaItem]()
var nj = -1 var nj = -1
for i in 0...allItems.count-1 { for i in 0...allItems.count-1 {
let j = Int((Double(i) / Double(allItems.count)) * 17.0)
allItems[i].indexId = i
let j = Int((Double(i) / Double(allItems.count)) * 17.0)
if j > nj { if j > nj {
nj = j nj = j
indexItems.append(allItems[i]) 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
}
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
break;
}
}
}
} }
} }

1
kplayer/photo/SPhotoScrubber.swift

@ -71,6 +71,7 @@ struct SPhotoScrubber: View {
} }
model.selectedItem = item model.selectedItem = item
item.indexId = i
if item.thumbUrl != nil && item.thumbImage == nil { if item.thumbUrl != nil && item.thumbImage == nil {
item.thumbImage = UIImage(systemName: "repeat") item.thumbImage = UIImage(systemName: "repeat")

2
kplayer/server/kplayer.js

@ -38,7 +38,7 @@ function getFiles(address) {
} }
app.get('/listfiles/*', function (req, res) { app.get('/listfiles/*', function (req, res) {
var address = req.path.substr(10)
var address = decodeURIComponent(req.path.substr(10))
console.log("listdirs " + address); console.log("listdirs " + address);
if (!req.path.startsWith("/listfiles/srv/samba/ren/")) { if (!req.path.startsWith("/listfiles/srv/samba/ren/")) {

20
kplayer/util/AsyncImage.swift

@ -1,7 +1,5 @@
import SwiftUI import SwiftUI
import Haneke import Haneke
import Alamofire
//import AlamofireImage
struct AsyncImage<Placeholder: View>: View { struct AsyncImage<Placeholder: View>: View {
@StateObject private var item: MediaItem @StateObject private var item: MediaItem
@ -27,10 +25,7 @@ struct AsyncImage<Placeholder: View>: View {
private var content: some View { private var content: some View {
Group { Group {
if item.image != nil {
image(item.image!)
}
else if item.thumbImage != nil {
if item.thumbImage != nil {
image(item.thumbImage!) image(item.thumbImage!)
} else { } else {
placeholder placeholder
@ -39,20 +34,21 @@ struct AsyncImage<Placeholder: View>: View {
} }
func setImage(newItem: MediaItem) { func setImage(newItem: MediaItem) {
if newItem.thumbImage != nil {
return
}
if newItem.image != nil { if newItem.image != nil {
newItem.thumbImage = newItem.image!.scaleToSize(66.0, height: 44.0) newItem.thumbImage = newItem.image!.scaleToSize(66.0, height: 44.0)
newItem.image = nil
} else if newItem.thumbImage == nil {
} else {
if newItem.thumbUrl != nil { if newItem.thumbUrl != nil {
let URL = Foundation.URL(string: newItem.thumbUrlAbsolute)! let URL = Foundation.URL(string: newItem.thumbUrlAbsolute)!
print("fetch \(newItem.thumbUrlAbsolute)")
Shared.imageCache.fetch(URL: URL).onSuccess { Shared.imageCache.fetch(URL: URL).onSuccess {
i in i in
//newItem.image = i
newItem.thumbImage = i.scaleToSize(66.0, height: 44.0)
newItem.image = i
newItem.thumbImage = newItem.image!.scaleToSize(66.0, height: 44.0)
} }
} }
} }

Loading…
Cancel
Save