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.
 
 
 

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