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.
204 lines
5.0 KiB
204 lines
5.0 KiB
//
|
|
// Created by Marco Schmickler on 25.05.15.
|
|
// Copyright (c) 2015 Marco Schmickler. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import UIKit
|
|
|
|
enum ItemType: String, CustomStringConvertible {
|
|
/**
|
|
Repräsentiert eine Wurzel, in der nur Bilder angezeigt werden.
|
|
*/
|
|
case ROOT = "root"
|
|
|
|
/**
|
|
Repräsentiert eine Wurzel, in der nur Videos angezeigt werden.
|
|
*/
|
|
case VIDEOROOT = "videoroot"
|
|
|
|
/**
|
|
Repräsentiert einen Ordner. Darin sind weitere Ordner enthalten.
|
|
*/
|
|
case FOLDER = "folder"
|
|
|
|
/**
|
|
Repräsentiert ein Video. Hat keine Unterordner. Die Children sind Snapshots.
|
|
*/
|
|
case VIDEO = "video"
|
|
|
|
/**
|
|
Snapshots eines Videos.
|
|
*/
|
|
case SNAPSHOT = "snapshot"
|
|
|
|
/**
|
|
Repräsentiert einen Bilder-Ordner.
|
|
*/
|
|
case PICS = "pics"
|
|
|
|
/**
|
|
Repräsentiert einen Ordner, der Videos oder Bilder-Ordner enthält. Wird im DetailViewController angezeigt.
|
|
*/
|
|
case DETAILS = "details"
|
|
|
|
var description: String {
|
|
return self.rawValue
|
|
}
|
|
}
|
|
|
|
/**
|
|
Repräsentiert ein Item eines der festgelegten Typen.
|
|
*/
|
|
class MediaItem: CustomDebugStringConvertible {
|
|
|
|
|
|
/**
|
|
Wird durch name, path und root identifiziert.
|
|
*/
|
|
var name: String
|
|
var path: String
|
|
var root: String
|
|
|
|
var children: [MediaItem]
|
|
var parent: MediaItem?
|
|
var type: ItemType
|
|
|
|
/**
|
|
Position innerhalb der Children
|
|
*/
|
|
var index = 0
|
|
|
|
/**
|
|
true, wenn die Children geladen sind
|
|
*/
|
|
var loaded = false
|
|
|
|
// abgeleitet
|
|
var sortName = ""
|
|
|
|
// Nutzinhalt
|
|
var image: UIImage?
|
|
var time: TimeInterval?
|
|
var thumbUrl: String?
|
|
|
|
init(name: String, path: String, root: String, type: ItemType) {
|
|
self.name = name
|
|
let trim = CharacterSet(charactersIn: "/ ")
|
|
self.root = "/" + root.trimmingCharacters(in: trim)
|
|
self.path = path.trimmingCharacters(in: trim)
|
|
self.type = type
|
|
|
|
children = [MediaItem]()
|
|
|
|
sortName = computeSortName(name)
|
|
}
|
|
|
|
fileprivate func computeSortName(_ sname: String) -> String {
|
|
var lsortName = sname.replacingOccurrences(of: "full", with: "")
|
|
var fullNameArr = lsortName.split {
|
|
$0 == "_"
|
|
}.map {
|
|
String($0)
|
|
}
|
|
|
|
if !fullNameArr.isEmpty {
|
|
lsortName = fullNameArr[0]
|
|
}
|
|
|
|
while lsortName.count < 6 {
|
|
lsortName = "0" + lsortName
|
|
}
|
|
|
|
return lsortName
|
|
}
|
|
|
|
/**
|
|
Ordner, in dem die Snapshots eines Videos abgelegt sind.
|
|
Absoluter Pfad mit Slash am Ende.
|
|
*/
|
|
var snapshotDirPathForVideo: String {
|
|
let len = "/srv/samba/ren".count
|
|
let rootPostfix = (root as NSString).substring(from: len)
|
|
let tpath = "/srv/samba/ren/thumb\(rootPostfix)/\(path)/\(name)"
|
|
let enc = tpath.addingPercentEscapes(using: String.Encoding.isoLatin1)!
|
|
|
|
return enc + "/"
|
|
}
|
|
|
|
/**
|
|
Absolute URL, unter der das Thumbnail des Items abgerufen werden kann.
|
|
*/
|
|
var thumbUrlAbsolute: String {
|
|
let enc = thumbUrl!.addingPercentEscapes(using: String.Encoding.isoLatin1)!
|
|
return NetworkManager.sharedInstance.baseurl + "/service/download" + enc
|
|
}
|
|
|
|
/**
|
|
Absolute URL, unter der das Image des Items abgerufen werden kann.
|
|
*/
|
|
var imageUrlAbsolute: String {
|
|
var imageUrl = thumbUrl!.replacingOccurrences(of: "_thumb.", with: ".")
|
|
imageUrl = imageUrl.replacingOccurrences(of: "?preview=true", with: "")
|
|
imageUrl = imageUrl.addingPercentEscapes(using: String.Encoding.isoLatin1)!
|
|
|
|
return NetworkManager.sharedInstance.baseurl + "/service/download" + imageUrl
|
|
}
|
|
|
|
var playerURL: URL? {
|
|
let enc = name.replacingOccurrences(of: " ", with: "%20")
|
|
let s = NetworkManager.sharedInstance.baseurl + "/service/stream" + encodedDir!
|
|
|
|
if s.endsWith("/") {
|
|
return URL(string: s + enc)
|
|
}
|
|
else {
|
|
return URL(string: s + "/" + enc)
|
|
}
|
|
}
|
|
|
|
/**
|
|
Absoluter Pfad des Items.
|
|
*/
|
|
var fullPath: String {
|
|
let fpath = "\(root)/\(path)/\(name)"
|
|
let enc = fpath.addingPercentEscapes(using: String.Encoding.isoLatin1)
|
|
return enc!
|
|
}
|
|
|
|
var debugDescription: String {
|
|
return "\(type): \(root) \(path) \(name) (\(index)) Child count \(children.count)"
|
|
}
|
|
|
|
var encodedDir: String? {
|
|
let dir = "\(root)/\(path)"
|
|
|
|
return dir.addingPercentEscapes(using: String.Encoding.isoLatin1)
|
|
}
|
|
|
|
func superRoot() -> MediaItem {
|
|
if let p = parent {
|
|
return p.superRoot()
|
|
}
|
|
|
|
return self
|
|
}
|
|
|
|
func sort() {
|
|
children.sort(by: {
|
|
$0.sortName < $1.sortName
|
|
})
|
|
}
|
|
|
|
func isPic() -> Bool {
|
|
return superRoot().type == ItemType.ROOT
|
|
}
|
|
|
|
func isVideo() -> Bool {
|
|
return superRoot().type == ItemType.VIDEOROOT
|
|
}
|
|
|
|
func isFolder() -> Bool {
|
|
return type == ItemType.ROOT || type == ItemType.VIDEOROOT || type == ItemType.FOLDER
|
|
}
|
|
}
|