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.
 
 
 

272 lines
6.8 KiB

//
// Created by Marco Schmickler on 25.05.15.
// Copyright (c) 2015 Marco Schmickler. All rights reserved.
//
import Foundation
import UIKit
/**
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 length: TimeInterval?
var loop = true
var thumbUrl: String?
var externalURL: String?
var local = false
var leaf = false
var cancelled = false
var scale = 0.0
var offset = CGPoint()
var size = CGSize()
convenience init(model: MediaModel) {
self.init(name: model.name, path: model.path, root: model.root, type: model.type)
self.time = model.time
self.length = model.length
self.loop = model.loop
self.thumbUrl = model.thumbURL
self.scale = model.scale
self.offset = model.offset
self.size = model.size
for m in model.children {
let item = MediaItem(model: m)
item.index = children.count
item.parent = self
children.append(item)
}
}
func toMediaModel() -> MediaModel {
var c = [MediaModel]()
for m in children {
let mm = m.toMediaModel()
c.append(mm)
}
var model: MediaModel = MediaModel(name: name, path: path, root: root, children: c, type: type)
model.time = time ?? 0
model.loop = loop
model.length = length ?? 0
model.thumbURL = thumbUrl
model.size = size
model.offset = offset
model.scale = scale
return model
}
func toJSON() -> String {
let jsonEncoder = JSONEncoder()
let jsonData = try! jsonEncoder.encode(toMediaModel())
let json = String(data: jsonData, encoding: String.Encoding.utf8)
return json!
}
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)
length = 5.0
}
fileprivate func computeSortName(_ sname: String) -> String {
var lsortName = sname.replacingOccurrences(of: "full", with: "")
let 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.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)!
return enc + "/"
}
/**
Absolute URL, unter der das Thumbnail des Items abgerufen werden kann.
*/
var thumbUrlAbsolute: String {
if thumbUrl == nil {
return ""
}
if thumbUrl!.starts(with: "file:") {
return thumbUrl!
}
let enc = thumbUrl!.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)!
return NetworkManager.sharedInstance.baseurl + "/service/download" + enc
}
/**
Absolute URL, unter der das Image des Items abgerufen werden kann.
*/
var imageUrlAbsolute: String {
if thumbUrl!.starts(with: "file:") {
return thumbUrl!
}
var imageUrl = thumbUrl!.replacingOccurrences(of: "_thumb.", with: ".")
imageUrl = imageUrl.replacingOccurrences(of: "?preview=true", with: "")
imageUrl = imageUrl.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)!
return NetworkManager.sharedInstance.vidurl + imageUrl.substringStartingFrom(10)
}
var playerURL: URL? {
if let ext = externalURL {
return URL(string: ext)
}
if local {
var file = FileHelper.getDocumentsDirectory()
if (path != "") {
file = file.appendingPathComponent(path)
}
file = file.appendingPathComponent(name)
return file
}
let enc = name.replacingOccurrences(of: " ", with: "%20")
var encoded : String
if encodedDir!.count >= 10 {
let index = encodedDir!.index(encodedDir!.startIndex, offsetBy: 10)
encoded = encodedDir!.substring(from:index)
}
else {
encoded = encodedDir!
}
let s = NetworkManager.sharedInstance.vidurl + encoded
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.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)!
return enc
}
var debugDescription: String {
return "\(type): \(root) \(path) \(name) (\(index)) Child count \(children.count)"
}
var encodedDir: String? {
let dir = "\(root)/\(path)"
return dir.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)
}
func superRoot() -> MediaItem {
if let p = parent {
return p.superRoot()
}
return self
}
func sort() {
children.sort(by: {
$0.sortName < $1.sortName
})
var j = 0
for i in children {
i.index = j
j += 1
}
}
func isWeb() -> Bool {
return type == ItemType.WEB
}
func isPic() -> Bool {
return type == ItemType.PICS || type == ItemType.DETAILS
}
func isVideo() -> Bool {
return type == ItemType.VIDEO || type == ItemType.SNAPSHOT
}
func isDetails() -> Bool {
return isWeb() || isPic() || isVideo()
}
func isFolder() -> Bool {
return type == ItemType.REMOTEROOT || type == ItemType.FOLDER || type == ItemType.WEBROOT || type == ItemType.FAVROOT
}
}