diff --git a/kplayer/core/MediaItem.swift b/kplayer/core/MediaItem.swift index 3e4673b..d0bfa1b 100644 --- a/kplayer/core/MediaItem.swift +++ b/kplayer/core/MediaItem.swift @@ -41,8 +41,9 @@ class MediaItem : CustomDebugStringConvertible { init(name: String, path: String, root: String, type: ItemType) { self.name = name - self.path = path - self.root = root + let trim = NSCharacterSet(charactersInString: "/ ") + self.root = "/" + root.stringByTrimmingCharactersInSet(trim) + self.path = path.stringByTrimmingCharactersInSet(trim) self.type = type children = [MediaItem]() @@ -67,7 +68,7 @@ class MediaItem : CustomDebugStringConvertible { var thumbPath: String { let len = "/srv/samba/ren".characters.count - let tpath = "/srv/samba/ren/thumb" + (rootSlash as NSString).substringFromIndex(len) + "/" + path + "/" + name + let tpath = "/srv/samba/ren/thumb" + (rootSlash as NSString).substringFromIndex(len) + pathSlash + name let enc = tpath.stringByAddingPercentEscapesUsingEncoding(NSISOLatin1StringEncoding)! //.stringByReplacingOccurrencesOfString(" ", withString: "%20") return enc + "/" @@ -87,7 +88,7 @@ class MediaItem : CustomDebugStringConvertible { } var fullPath: String { - let fpath = rootSlash + path + "/" + name + let fpath = rootSlash + pathSlash + name let enc = fpath.stringByAddingPercentEscapesUsingEncoding(NSISOLatin1StringEncoding) //.stringByReplacingOccurrencesOfString(" ", withString: "%20") return enc! } @@ -106,6 +107,20 @@ class MediaItem : CustomDebugStringConvertible { } + var pathSlash: String { + if path.characters.count == 0 { + return "" + } + + if path.endsWith("/") { + return path + } + else { + return path + "/" + } + + } + var encodedDir: String? { let dir = rootSlash + path diff --git a/kplayer/core/NetworkManager.swift b/kplayer/core/NetworkManager.swift index 01d42e7..35d1ed4 100644 --- a/kplayer/core/NetworkManager.swift +++ b/kplayer/core/NetworkManager.swift @@ -20,29 +20,6 @@ class NetworkManager { return queue }() - func loadRoots() -> AnyObject { - var itemsArray = []; - - Alamofire.request(.GET, baseurl + "/service/roots") - .responseString { - (_, _, result) in - let string = result.value! - let f = string.componentsSeparatedByString("\r\n") - print(string) - print(f) - } - -// .response { (request, response, data, error) in -// println(request) -// println(response) -// -// var r = (response as NSString).componentsSeparatedByString("\r\n") -// -// println(error) -// } - - return itemsArray; - } public typealias Weiter = ([MediaItem]) -> Void @@ -126,6 +103,7 @@ class NetworkManager { let i = MediaItem(name: folderName, path: fpath, root: root, type: ItemType.PICS) i.thumbUrl = "\(s)?preview=true" + i.loaded = true if !name.hasPrefix(".") { if let picfolder = items[path] { picfolder.children.append(i) @@ -201,8 +179,42 @@ class NetworkManager { print(st) - let i = MediaItem(name: st, path: st, root: root, type: ItemType.FOLDER) - res.append(i) + if (st.endsWith("/")) { + let i = MediaItem(name: st, path: st, root: root, type: ItemType.FOLDER) + res.append(i) + } else { + if s.lowercaseString.hasSuffix(".jpg") { + let l = s.length + let name = (s as NSString).lastPathComponent + var pathlen = l - len - name.length + +// if (pathlen > 1000) { + print(pathlen) + print(name) + print(s) +// } + if (pathlen > 2) { + let path = (s as NSString).substringWithRange(NSMakeRange(len, pathlen - 1)) + + let folderName = NSURL(fileURLWithPath: path).lastPathComponent! + let fl = path.length + let pfl = fl - folderName.length + + print("\(folderName) \(pfl)") + let fpath = (path as NSString).substringWithRange(NSMakeRange(0, pfl)) + + let i = MediaItem(name: folderName, path: fpath, root: root, type: ItemType.PICS) + i.thumbUrl = "\(s)?preview=true" + res.append(i) + } else { + print(st) + } + } else { + let i = MediaItem(name: st, path: "", root: root, type: ItemType.PICS) + res.append(i) + } + } + } } completionHandler(res, leaf) @@ -212,7 +224,7 @@ class NetworkManager { func playerURL(item: MediaItem) -> String { let enc = item.name.stringByReplacingOccurrencesOfString(" ", withString: "%20") - return baseurl + "/service/stream" + item.rootSlash + item.path + "/" + enc + return baseurl + "/service/stream" + item.rootSlash + item.pathSlash + enc } func loadItems(item: MediaItem) { @@ -252,7 +264,7 @@ class NetworkManager { print(url) Alamofire.request(.GET, url).responseJSON { - (_,_,response) in + (_, _, response) in if let json = response.value { var hashes = Dictionary() @@ -318,47 +330,41 @@ class NetworkManager { print(url) Alamofire.request(.GET, url).responseJSON { - (_,_,response) in + (_, _, response) in - if let json = response.value { - var hashes = Set() + var hashes = Set() + if let json = response.value { for b in json as! [String] { hashes.insert(b) print(b) } + } - for c in item.children { - if let t = c.time { - let ms = Int(t * 1000) - let p = c.thumbPath + "\(ms).jpg" - let pt = c.thumbPath + "\(ms)_thumb.jpg" - print(p) - if hashes.contains(pt) { - print("contained") - } else { - if let id = c.image, imageData = UIImageJPEGRepresentation(id, 1.0) { - let op = UploadOperation(baseUrl: self.baseurl + "/service/upload", data: imageData, path: p) - self.operationQueue.addOperation(op) + for c in item.children { + if let t = c.time { + let ms = Int(t * 1000) + let p = c.thumbPath + "\(ms).jpg" + let pt = c.thumbPath + "\(ms)_thumb.jpg" + print(p) + if hashes.contains(pt) { + print("contained") + } else { + if let id = c.image, imageData = UIImageJPEGRepresentation(id, 1.0) { + let op = UploadOperation(baseUrl: self.baseurl + "/service/upload", data: imageData, path: p) + self.operationQueue.addOperation(op) - let thumb = c.image!.scaleToSize(15 * 16, height: 15 * 9) - let imageDataT = UIImageJPEGRepresentation(thumb, 1.0); + let thumb = id.scaleToSize(15 * 16, height: 15 * 9) + if let imageDataT = UIImageJPEGRepresentation(thumb, 1.0) { c.image = thumb - let opT = UploadOperation(baseUrl: self.baseurl + "/service/upload", data: imageDataT!, path: pt) + let opT = UploadOperation(baseUrl: self.baseurl + "/service/upload", data: imageDataT, path: pt) self.operationQueue.addOperation(opT) - - c.loaded = true } + + c.loaded = true } - hashes.remove(p) - hashes.remove(pt) } } - - for o in hashes { - print("To delete \(o)") -// todo Alamofire.request(.GET, self.baseurl + "/service/deletethumb\(o)") - } } } diff --git a/kplayer/detail/DetailViewController.swift b/kplayer/detail/DetailViewController.swift index 59cc33c..250a9f3 100644 --- a/kplayer/detail/DetailViewController.swift +++ b/kplayer/detail/DetailViewController.swift @@ -114,19 +114,21 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout var i = [MediaItem]() - for it in detailItem!.children { - for c in it.children { - i.append(c) + if let d = detailItem { + for it in d.children { + for c in it.children { + i.append(c) + } } - } - pc.items = i - pc.completionHandler = { - self.dismissViewControllerAnimated(true, completion: nil); - } - let navController = UINavigationController(rootViewController: pc) // Creating a navigation controller with pc at the root of the navigation stack. + pc.items = i + pc.completionHandler = { + self.dismissViewControllerAnimated(true, completion: nil); + } + let navController = UINavigationController(rootViewController: pc) // Creating a navigation controller with pc at the root of the navigation stack. - presentViewController(navController, animated: false, completion: nil) + presentViewController(navController, animated: false, completion: nil) + } } func refreshItems(notification: NSNotification) { @@ -194,7 +196,14 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout } else { if indexPath!.item >= items.children.count { } else { - items.children.removeAtIndex(indexPath!.item) + let c = items.children.removeAtIndex(indexPath!.item) + if let t = c.time { + let ms = Int(t * 1000) + let p = c.thumbPath + "\(ms).jpg" + let pt = c.thumbPath + "\(ms)_thumb.jpg" + Alamofire.request(.GET, NetworkManager.sharedInstance.baseurl + "/service/deletethumb\(p)") + Alamofire.request(.GET, NetworkManager.sharedInstance.baseurl + "/service/deletethumb\(pt)") + } self.collectionView.reloadData() } } @@ -276,7 +285,7 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { if let detail: MediaItem = self.detailItem { var items = detail.children[indexPath.section] - if (items.loaded) { + if (items.loaded || items.type == ItemType.VIDEO) { if indexPath.item >= items.children.count { print(items.name) } else { diff --git a/kplayer/detail/VideoPlayerController.swift b/kplayer/detail/VideoPlayerController.swift index df43da8..6ae0534 100644 --- a/kplayer/detail/VideoPlayerController.swift +++ b/kplayer/detail/VideoPlayerController.swift @@ -97,7 +97,7 @@ print("play") } func play(url: String) { - self.moviePlayer = ALMoviePlayerController(frame: CGRectMake(0, 0, 1024, 768)) + self.moviePlayer = ALMoviePlayerController(frame: CGRectMake(0, 0, view.frame.width, view.frame.height)) if let player = self.moviePlayer { let movieControls = ALMoviePlayerControls(moviePlayer: player, style: ALMoviePlayerControlsStyleDefault); diff --git a/kplayer/master/MasterViewController.swift b/kplayer/master/MasterViewController.swift index 899ebaa..78d613b 100644 --- a/kplayer/master/MasterViewController.swift +++ b/kplayer/master/MasterViewController.swift @@ -75,6 +75,11 @@ class MasterViewController: UITableViewController { let selectedItem = items[indexPath.row] if (selectedItem.type == ItemType.DETAILS) { +// if !selectedItem.loaded { +// NetworkManager.sharedInstance.loadPicDirs(selectedItem.encodedDir!, completionHandler: weiter) +// return +// } + performSegueWithIdentifier("showDetail", sender: self) return } @@ -153,32 +158,42 @@ class MasterViewController: UITableViewController { if (selectedItem.type == ItemType.ROOT) || (selectedItem.type == ItemType.VIDEOROOT) || (selectedItem.type == ItemType.FOLDER) { print (selectedItem.path) + NetworkManager.sharedInstance.listDirs(selectedItem.encodedDir!, completionHandler: { (i, leaf) in - let newFolder = MediaItem(name: ".", path: selectedItem.path, root: selectedItem.root, type: ItemType.FOLDER) - for item in i { - if item.type != ItemType.FOLDER { + let supertype = selectedItem.superRoot().type + + var neu = [MediaItem]() + let newFolder = MediaItem(name: ".", path: "", root: selectedItem.root, type: ItemType.DETAILS) + newFolder.loaded = true + for item in i { + if item.type != ItemType.FOLDER && supertype != ItemType.VIDEOROOT { item.parent = newFolder +// item.path = "" newFolder.children.append(item) } - - item.parent = selectedItem - selectedItem.children.append(item) + else { + if item.path == "" { + item.path = item.name + item.name = "" + } + item.type = ItemType.FOLDER + item.parent = selectedItem + neu.append(item) + } } if newFolder.children.count > 0 { newFolder.parent = selectedItem - selectedItem.children.append(newFolder) + neu.append(newFolder) } - if leaf { - selectedItem.type = ItemType.DETAILS - - + let isVideo = selectedItem.parent != nil && selectedItem.parent!.type == ItemType.VIDEOROOT + if leaf || isVideo { let weiter: NetworkManager.Weiter = { (g) in - + vc.items.removeAll() vc.itemsMap.removeAll() @@ -207,11 +222,13 @@ class MasterViewController: UITableViewController { f.parent = selectedItem } } - + self.performSegueWithIdentifier("showDetail", sender: self) return } + selectedItem.type = ItemType.DETAILS + let p = selectedItem.superRoot() let dir = selectedItem.encodedDir! @@ -225,7 +242,14 @@ class MasterViewController: UITableViewController { // self.performSegueWithIdentifier("showDetail", sender: self) return } - vc.items = i + else { +// var folders = [MediaItem]() +// var folders = [MediaItem]() +// for item in i { +// +// } + } + vc.items = neu vc.tableView.reloadData() vc.navigationItem.title = selectedItem.name; self.navigationController!.pushViewController(vc, animated: true) @@ -304,7 +328,7 @@ class MasterViewController: UITableViewController { func configureCell(cell: UITableViewCell, atIndexPath indexPath: NSIndexPath) { let object = items[indexPath.row] if (object.path.characters.count == 0) { - cell.textLabel!.text = "." + object.name + cell.textLabel!.text = "'" + object.name } else { cell.textLabel!.text = object.path diff --git a/kplayer/util/ImageLoadOperation.swift b/kplayer/util/ImageLoadOperation.swift index 9062b40..0b4b530 100644 --- a/kplayer/util/ImageLoadOperation.swift +++ b/kplayer/util/ImageLoadOperation.swift @@ -40,8 +40,10 @@ class ImageLoadOperation: NSOperation { } request!.validate().response { (request, response, data, error) in - if let e = error { - print(e) + if let e = error as? NSError { + if (e.code != -999) { + print(e) + } } else if let d = data { self.succeeder(UIImage(data: d, scale: 1)!) diff --git a/kplayer/util/UploadOperation.swift b/kplayer/util/UploadOperation.swift index d72978c..b652344 100644 --- a/kplayer/util/UploadOperation.swift +++ b/kplayer/util/UploadOperation.swift @@ -28,14 +28,26 @@ class UploadOperation: NSOperation { "name": path ] + print("PATH: \(path)") + let urlRequest = urlRequestWithComponents(baseUrl, parameters: parameters) -// let request = Alamofire.upload(urlRequest) + let request = Alamofire.upload(urlRequest.0, data: urlRequest.1) // success: todo set url to item + // .progress { // (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in -// println("progress : \(totalBytesWritten) / \(totalBytesExpectedToWrite)") +// print("progress : \(totalBytesWritten) / \(totalBytesExpectedToWrite)") // } + .response { (request, response, data, error) in + if let d = data { + let datastring = NSString(data: d, encoding:NSUTF8StringEncoding) + print("d \(datastring)") + } + if let e = error { + print("e \(e)") + } + } } }