diff --git a/kplayer/AppDelegate.swift b/kplayer/AppDelegate.swift index 6bd6cff..c837202 100644 --- a/kplayer/AppDelegate.swift +++ b/kplayer/AppDelegate.swift @@ -26,15 +26,22 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele let controller = masterNavigationController.topViewController as! MasterViewController controller.items = [ - MediaItem(name: "fav", path:"fav", root: "/srv/samba/ren/fav", type: ItemType.ROOT), - MediaItem(name: "knk_archiv", path:"knk_archiv", root: "/srv/samba/ren/knk_archiv", type: ItemType.ROOT), - MediaItem(name: "knk_archiv2", path:"knk_archiv2", root: "/srv/samba/ren/knk_archiv2", type: ItemType.ROOT), - MediaItem(name: "knk_archiv3", path:"knk_archiv3", root: "/srv/samba/ren/knk_archiv3", type: ItemType.ROOT), - MediaItem(name: "knk_archiv4", path:"knk_archiv4", root: "/srv/samba/ren/knk_archiv4", type: ItemType.ROOT), - MediaItem(name: "sp", path:"sp", root: "/srv/samba/ren/sp", type: ItemType.ROOT), + MediaItem(name: "fav", path:"fav", root: "/srv/samba/ren/fav", type: ItemType.VIDEOROOT), + MediaItem(name: "knk", path:"knk", root: "/srv/samba/ren/knk", type: ItemType.VIDEOROOT), + MediaItem(name: "knk_archiv", path:"knk_archiv", root: "/srv/samba/ren/knk_archiv", type: ItemType.VIDEOROOT), + MediaItem(name: "knk_archiv2", path:"knk_archiv2", root: "/srv/samba/ren/knk_archiv2", type: ItemType.VIDEOROOT), + MediaItem(name: "knk_archiv3", path:"knk_archiv3", root: "/srv/samba/ren/knk_archiv3", type: ItemType.VIDEOROOT), + MediaItem(name: "knk_archiv4", path:"knk_archiv4", root: "/srv/samba/ren/knk_archiv4", type: ItemType.VIDEOROOT), + MediaItem(name: "ewp", path:"ewp", root: "/srv/samba/ren/ewp", type: ItemType.ROOT), MediaItem(name: "fjoy", path:"fjoy", root: "/srv/samba/ren/fjoy", type: ItemType.ROOT), MediaItem(name: "heg", path:"heg", root: "/srv/samba/ren/heg", type: ItemType.ROOT), - MediaItem(name: "ten", path:"ten", root: "/srv/samba/ren/ten", type: ItemType.ROOT) + MediaItem(name: "ten", path:"ten", root: "/srv/samba/ren/ten", type: ItemType.ROOT), + MediaItem(name: "leg", path:"leg", root: "/srv/samba/ren/leg", type: ItemType.ROOT), + MediaItem(name: "ang", path:"ang", root: "/srv/samba/ren/ang", type: ItemType.ROOT), + MediaItem(name: "series", path:"series", root: "/srv/samba/ren/series", type: ItemType.ROOT), + MediaItem(name: "bm", path:"bm", root: "/srv/samba/ren/bm", type: ItemType.ROOT), + MediaItem(name: "medieval", path:"medieval", root: "/srv/samba/ren/medieval", type: ItemType.ROOT), + ] return true diff --git a/kplayer/core/MediaItem.swift b/kplayer/core/MediaItem.swift index 52fb3a5..9961b30 100644 --- a/kplayer/core/MediaItem.swift +++ b/kplayer/core/MediaItem.swift @@ -8,6 +8,7 @@ import UIKit enum ItemType : String, Printable { case ROOT = "root" + case VIDEOROOT = "videoroot" case FOLDER = "folder" case VIDEO = "video" case PICS = "pics" @@ -66,25 +67,28 @@ println (lsortName) var thumbPath: String { let len = count("/srv/samba/ren") let tpath = "/srv/samba/ren/thumb" + (root as NSString).substringFromIndex(len) + "/" + path + "/" + name - let enc = tpath.stringByReplacingOccurrencesOfString(" ", withString: "+") + let enc = tpath.stringByReplacingOccurrencesOfString(" ", withString: "%20") return enc + "/" } var thumbUrlAbsolute: String { - return NetworkManager.sharedInstance.baseurl + "/service/download" + thumbUrl! + let enc = thumbUrl!.stringByReplacingOccurrencesOfString(" ", withString: "%20") + return NetworkManager.sharedInstance.baseurl + "/service/download" + enc } var imageUrlAbsolute: String { - var imageUrl = thumbUrl!.stringByReplacingOccurrencesOfString("_thumb.jpg", withString: ".jpg") + var imageUrl = thumbUrl!.stringByReplacingOccurrencesOfString("_thumb.", withString: ".") imageUrl = imageUrl.stringByReplacingOccurrencesOfString("?preview=true", withString: "") + imageUrl = imageUrl.stringByReplacingOccurrencesOfString(" ", withString: "%20") + return NetworkManager.sharedInstance.baseurl + "/service/download" + imageUrl } var fullPath: String { let fpath = root + "/" + path + "/" + name - - return fpath + let enc = fpath.stringByReplacingOccurrencesOfString(" ", withString: "%20") + return enc } var debugDescription: String { diff --git a/kplayer/core/NetworkManager.swift b/kplayer/core/NetworkManager.swift index 01b9915..b712a78 100644 --- a/kplayer/core/NetworkManager.swift +++ b/kplayer/core/NetworkManager.swift @@ -43,8 +43,9 @@ class NetworkManager { return itemsArray; } + public typealias Weiter = ([MediaItem]) -> Void - func loadDirs(root: String, completionHandler: ([MediaItem]) -> Void) -> Void { + func loadDirs(root: String, completionHandler: Weiter) -> Void { let url1 = baseurl + "/service/listvideos" + root let len = count(root) var res = [MediaItem]() @@ -85,7 +86,7 @@ class NetworkManager { }) } - func loadPicDirs(root: String, completionHandler: ([MediaItem]) -> Void) -> Void { + func loadPicDirs(root: String, completionHandler: Weiter) -> Void { let url1 = baseurl + "/service/listpicdirs" + root let len = count(root) var res = [MediaItem]() @@ -102,7 +103,7 @@ class NetworkManager { // let (a,b) = j # let s = c.object as! String println(s) - if s.hasSuffix(".jpg") { + if s.lowercaseString.hasSuffix(".jpg") { let l = count(s) let name = (s as NSString).lastPathComponent var pathlen = l - len - count(name) @@ -326,17 +327,18 @@ println (ux) if hashes.containsObject(pt) { println("contained") } else { - let imageData = UIImageJPEGRepresentation(c.image, 1.0); - let op = UploadOperation(baseUrl: self.baseurl + "/service/upload", data: imageData, path: p) - self.operationQueue.addOperation(op) + if let imageData = UIImageJPEGRepresentation(c.image, 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); - c.image = thumb - let opT = UploadOperation(baseUrl: self.baseurl + "/service/upload", data: imageDataT, path: pt) - self.operationQueue.addOperation(opT) + let thumb = c.image!.scaleToSize(15 * 16, height: 15 * 9) + let imageDataT = UIImageJPEGRepresentation(thumb, 1.0); + c.image = thumb + let opT = UploadOperation(baseUrl: self.baseurl + "/service/upload", data: imageDataT, path: pt) + self.operationQueue.addOperation(opT) - c.loaded = true + c.loaded = true + } } hashes.removeObject(p) hashes.removeObject(pt) diff --git a/kplayer/detail/DetailViewController.swift b/kplayer/detail/DetailViewController.swift index 5b32765..8bbaceb 100644 --- a/kplayer/detail/DetailViewController.swift +++ b/kplayer/detail/DetailViewController.swift @@ -281,7 +281,7 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout } else { let len = count(items.root) - let url = NetworkManager.sharedInstance.baseurl + "/service/listfiles" + items.root + "/" + items.path + "/" + items.name + let url = NetworkManager.sharedInstance.baseurl + "/service/listfiles" + items.fullPath println(items) println(url) @@ -296,7 +296,7 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout // let (a,b) = j # let s = c.object as! NSString - if s.hasSuffix(".jpg") { + if s.lowercaseString.hasSuffix(".jpg") { let l = s.length let name = (s as NSString).lastPathComponent var pathlen = l - len - count(name) diff --git a/kplayer/master/MasterViewController.swift b/kplayer/master/MasterViewController.swift index 60b7490..6490769 100644 --- a/kplayer/master/MasterViewController.swift +++ b/kplayer/master/MasterViewController.swift @@ -40,7 +40,8 @@ class MasterViewController: UITableViewController { } func loadDirs(dir: String) { - NetworkManager.sharedInstance.loadDirs(dir) { (g) in + NetworkManager.sharedInstance.loadDirs(dir) { + (g) in for f in g { self.addItem(f) } @@ -58,7 +59,7 @@ class MasterViewController: UITableViewController { // self.navigationItem.rightBarButtonItem = addButton if let split = self.splitViewController { let controllers = split.viewControllers - self.detailViewController = controllers[controllers.count-1].topViewController as? DetailViewController + self.detailViewController = controllers[controllers.count - 1].topViewController as? DetailViewController } } @@ -90,7 +91,7 @@ class MasterViewController: UITableViewController { } override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { -println ("\(indexPath.row)") + println("\(indexPath.row)") let selectedItem = items[indexPath.row] if (selectedItem.type == ItemType.FOLDER) { @@ -111,15 +112,16 @@ println ("\(indexPath.row)") if !selectedItem.loaded { let dir = selectedItem.root + "/" + selectedItem.path -// NetworkManager.sharedInstance.loadDirs(dir) { (g) in - NetworkManager.sharedInstance.loadPicDirs(dir) { (g) in + + let weiter: NetworkManager.Weiter = { + (g) in for f in g { vc.addItem(f) } selectedItem.children = vc.items selectedItem.loaded = true - var all :[MediaItem]? + var all: [MediaItem]? for f in selectedItem.children { if f.type == ItemType.FOLDER && f.path != "" { @@ -145,38 +147,59 @@ println ("\(indexPath.row)") self.performSegueWithIdentifier("showDetail", sender: self) return } - } - else { + + let p = selectedItem.parent! + if p.type == ItemType.VIDEOROOT { + NetworkManager.sharedInstance.loadDirs(dir, completionHandler: weiter) + } + else { + NetworkManager.sharedInstance.loadPicDirs(dir, completionHandler: weiter) + } + + + } else { vc.items = selectedItem.children - navigationController!.pushViewController(vc, animated:true) + navigationController!.pushViewController(vc, animated: true) } } - if (selectedItem.type == ItemType.ROOT) { + if (selectedItem.type == ItemType.ROOT) || (selectedItem.type == ItemType.VIDEOROOT) { NetworkManager.sharedInstance.listDirs(selectedItem.root, completionHandler: { (i) in + for item in i { + item.parent = selectedItem + } vc.items = i vc.tableView.reloadData() }) vc.navigationItem.title = selectedItem.name; - navigationController!.pushViewController(vc, animated:true) + navigationController!.pushViewController(vc, animated: true) } } - override func shouldPerformSegueWithIdentifier(identifier:String!, sender: AnyObject?) -> Bool { - return false; - } - // MARK: - Segues + override func shouldPerformSegueWithIdentifier(identifier: String!, sender: AnyObject?) -> Bool { + return false; + } + // MARK: - Segues override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "showDetail" { if let indexPath = self.tableView.indexPathForSelectedRow() { - let item = items[indexPath.row] + let item = items[indexPath.row] let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController controller.detailItem = item - controller.defaultItemSize = CGSize(width: 300, height: 300) + + var root = item + + while root.parent != nil { + root = root.parent! + } + + if root.type == ItemType.ROOT { + controller.defaultItemSize = CGSize(width: 300, height: 300) + } item.children.sort({ $0.sortName < $1.sortName @@ -225,14 +248,19 @@ println ("\(indexPath.row)") } func configureCell(cell: UITableViewCell, atIndexPath indexPath: NSIndexPath) { - let object = items[indexPath.row] - cell.textLabel!.text = object.path + let object = items[indexPath.row] + if (object.path.length == 0) { + cell.textLabel!.text = "." + } + else { + cell.textLabel!.text = object.path + } // if !object.children.isEmpty && object.children[0].type == ItemType.VIDEO { // cell.accessoryType = UITableViewCellAccessoryType.DetailDisclosureButton // } // else { - cell.accessoryType = UITableViewCellAccessoryType.None + cell.accessoryType = UITableViewCellAccessoryType.None // } } diff --git a/kplayer/photo/MediaPhotoController.swift b/kplayer/photo/MediaPhotoController.swift index c5cf948..02dd5ca 100644 --- a/kplayer/photo/MediaPhotoController.swift +++ b/kplayer/photo/MediaPhotoController.swift @@ -60,19 +60,29 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView break } - let URL = NSURL(string: i.thumbUrlAbsolute)! - - let op1 = ImageLoadOperation(imageURL: URL, succeeder: { - img in - let imageRef = img.CGImage; - let bytesPerPixel = CGImageGetBitsPerPixel(imageRef) / 8; - let cost = CGImageGetWidth(imageRef) * CGImageGetHeight(imageRef) * bytesPerPixel; - self.total += cost - println("preload image loaded \(i.thumbUrlAbsolute) cost \(cost) total\(self.total)") - self.imageCache.setObject(img, forKey: i.thumbUrlAbsolute, cost: cost) - }, index: j) - op1.qualityOfService = NSQualityOfService.Background - backgroundOperationQueue.addOperation(op1) + let u1 = NSURL(string: i.thumbUrlAbsolute) + + if let URL = u1 { + + let op1 = DataLoadOperation(imageURL: URL, succeeder: { + d in + if d.length > 0 { + if let img = UIImage(data: d) { + let imageRef = img.CGImage; + let bytesPerPixel = CGImageGetBitsPerPixel(imageRef) / 8; + let cost = CGImageGetWidth(imageRef) * CGImageGetHeight(imageRef) * bytesPerPixel; + self.total += d.length + println("preload image loaded \(i.thumbUrlAbsolute) cost \(cost) total\(self.total)") + self.imageCache.setObject(img, forKey: i.thumbUrlAbsolute, cost: d.length) + } + } + }, index: j) + op1.qualityOfService = NSQualityOfService.Background + backgroundOperationQueue.addOperation(op1) + } + else { + println("## Invalid URL: \(i.thumbUrlAbsolute)") + } } } @@ -213,72 +223,82 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView let c = count(items) // println("Index: \(photoAtIndex) of \(c)") let newItem = items[photoAtIndex] - let hqURL = NSURL(string: newItem.imageUrlAbsolute)! - let URL = NSURL(string: newItem.thumbUrlAbsolute)! + let u1 = NSURL(string: newItem.imageUrlAbsolute) + let u2 = NSURL(string: newItem.thumbUrlAbsolute) + if let hqURL = u1, URL = u2 { - var image: UIImage? = nil + var image: UIImage? = nil - var size = NIPhotoScrollViewPhotoSizeUnknown + var size = NIPhotoScrollViewPhotoSizeUnknown - for r in requests { - let pages = self.photoAlbumView.visiblePages() as NSMutableSet! - var ok = false - for page in pages.allObjects { - if (page.pageIndex == r.index) { - ok = true - break + for r in requests { + let pages = self.photoAlbumView.visiblePages() as NSMutableSet! + var ok = false + for page in pages.allObjects { + if (page.pageIndex == r.index) { + ok = true + break + } } - } - if !ok { - r.cancel() - requests.remove(r) + if !ok { + r.cancel() + requests.remove(r) + } } - } - image = imageCache.objectForKey(URL.absoluteString!) as? UIImage + image = imageCache.objectForKey(URL.absoluteString!) as? UIImage + + if let i = image { + size = NIPhotoScrollViewPhotoSizeThumbnail + isLoading[0] = false + } else { + let URL = NSURL(string: newItem.thumbUrlAbsolute)! + + let op3 = DataLoadOperation(imageURL: URL, succeeder: { + d in + if d.length > 0 { + if let i = UIImage(data: d) { +// println("thumb preload image loaded \(newItem.imageUrlAbsolute)") + let imageRef = i.CGImage; + let bytesPerPixel = CGImageGetBitsPerPixel(imageRef) / 8; + let cost = CGImageGetWidth(imageRef) * CGImageGetHeight(imageRef) * bytesPerPixel; + self.imageCache.setObject(d, forKey: newItem.thumbUrlAbsolute, cost: d.length) + size = NIPhotoScrollViewPhotoSizeThumbnail + self.photoAlbumView.didLoadPhoto(i, atIndex: photoAtIndex, photoSize: size) + self.photoScrubberView.didLoadThumbnail(i, atIndex: photoAtIndex); + } + } + }, index: photoAtIndex) + op3.qualityOfService = NSQualityOfService.UserInteractive +// requests.append(op3) + operationQueue.addOperation(op3) + } - if let i = image { - size = NIPhotoScrollViewPhotoSizeThumbnail - isLoading[0] = false - } else { - let URL = NSURL(string: newItem.thumbUrlAbsolute)! - let op3 = ImageLoadOperation(imageURL: URL, succeeder: { + let op2 = ImageLoadOperation(imageURL: hqURL, succeeder: { i in -// println("thumb preload image loaded \(newItem.imageUrlAbsolute)") - let imageRef = i.CGImage; - let bytesPerPixel = CGImageGetBitsPerPixel(imageRef) / 8; - let cost = CGImageGetWidth(imageRef) * CGImageGetHeight(imageRef) * bytesPerPixel; - self.imageCache.setObject(i, forKey: newItem.thumbUrlAbsolute, cost: cost) - size = NIPhotoScrollViewPhotoSizeThumbnail +// println("image loaded \(newItem.imageUrlAbsolute) at \(photoAtIndex)") + size = NIPhotoScrollViewPhotoSizeOriginal self.photoAlbumView.didLoadPhoto(i, atIndex: photoAtIndex, photoSize: size) - self.photoScrubberView.didLoadThumbnail(i, atIndex: photoAtIndex); + photoSize[0] = size }, index: photoAtIndex) - op3.qualityOfService = NSQualityOfService.UserInteractive - requests.append(op3) - operationQueue.addOperation(op3) - } + op2.qualityOfService = NSQualityOfService.UserInitiated + requests.append(op2) + operationQueue.addOperation(op2) + if (image == nil) { + isLoading[0] = true + } - let op2 = ImageLoadOperation(imageURL: hqURL, succeeder: { - i in -// println("image loaded \(newItem.imageUrlAbsolute) at \(photoAtIndex)") - size = NIPhotoScrollViewPhotoSizeOriginal - self.photoAlbumView.didLoadPhoto(i, atIndex: photoAtIndex, photoSize: size) photoSize[0] = size - }, index: photoAtIndex) - op2.qualityOfService = NSQualityOfService.UserInitiated - requests.append(op2) - operationQueue.addOperation(op2) - if (image == nil) { - isLoading[0] = true - } - - photoSize[0] = size + return image + } else { + println("## Invalid URL: \(newItem.imageUrlAbsolute)") - return image + return nil + } } func numberOfPagesInPagingScrollView(pagingScrollView: NIPagingScrollView) -> Int { @@ -324,20 +344,30 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView image = imageCache.objectForKey(newItem.thumbUrlAbsolute) as? UIImage if (image == nil) { - let URL = NSURL(string: newItem.thumbUrlAbsolute)! - let op3 = ImageLoadOperation(imageURL: URL, succeeder: { - i in + let u1 = NSURL(string: newItem.thumbUrlAbsolute) + if let URL = u1 { + let op3 = DataLoadOperation(imageURL: URL, succeeder: { + d in + + if d.length > 0 { + if let i = UIImage(data: d) { // println("thumb image loaded \(newItem.thumbUrlAbsolute)") - let imageRef = i.CGImage; - let bytesPerPixel = CGImageGetBitsPerPixel(imageRef) / 8; - let cost = CGImageGetWidth(imageRef) * CGImageGetHeight(imageRef) * bytesPerPixel; + let imageRef = i.CGImage; + let bytesPerPixel = CGImageGetBitsPerPixel(imageRef) / 8; + let cost = CGImageGetWidth(imageRef) * CGImageGetHeight(imageRef) * bytesPerPixel; - self.imageCache.setObject(i, forKey: newItem.thumbUrlAbsolute, cost: cost) + self.imageCache.setObject(i, forKey: newItem.thumbUrlAbsolute, cost: d.length) - self.photoScrubberView.didLoadThumbnail(i, atIndex: thumbnailIndex); - }, index: thumbnailIndex) - op3.qualityOfService = NSQualityOfService.UserInitiated - operationQueue.addOperation(op3) + self.photoScrubberView.didLoadThumbnail(i, atIndex: thumbnailIndex); + } + } + }, index: thumbnailIndex) + op3.qualityOfService = NSQualityOfService.UserInitiated + operationQueue.addOperation(op3) + } + else { + println("## Invalid URL: \(newItem.thumbUrlAbsolute)") + } } return image diff --git a/kplayer/util/DataLoadOperation.swift b/kplayer/util/DataLoadOperation.swift index 28f24ed..f881c21 100644 --- a/kplayer/util/DataLoadOperation.swift +++ b/kplayer/util/DataLoadOperation.swift @@ -7,15 +7,12 @@ import Foundation import Alamofire import Darwin -class ImageLoadOperation: NSOperation { +class DataLoadOperation: NSOperation { public typealias Succeeder = (NSData) -> () let imageURL: NSURL let succeeder: Succeeder let index: Int - var request: Request? - - var manager: Manager? var ready1 = false @@ -31,30 +28,17 @@ class ImageLoadOperation: NSOperation { return } - // println("do load \(imageURL.absoluteString!)") - - if let m = manager { - request = m.request(.GET, imageURL) - } else { - request = Alamofire.request(.GET, imageURL) - } - - request!.validate().response { (request, response, data, error) in - self.succeeder(data) - } - - while !ready1 { - usleep(10000) - } + Alamofire.request(.GET, imageURL).response { + (_, _, d: AnyObject?, _) in + self.succeeder(d as! NSData) + }; } override func cancel() { // println("cancel load \(imageURL.absoluteString!)") ready1 = true - if let r = request { - r.cancel() - } + super.cancel() } diff --git a/kplayer/util/alamoimage.swift b/kplayer/util/alamoimage.swift index c018aaf..757e246 100644 --- a/kplayer/util/alamoimage.swift +++ b/kplayer/util/alamoimage.swift @@ -9,14 +9,16 @@ import Alamofire extension Alamofire.Request { class func imageResponseSerializer() -> Serializer { return { request, response, data in - if data == nil { + if data == nil || data!.length == 0 { return (nil, nil) } - let i = UIImage(data: data!) - // let image = i.hnk_decompressedImage() + if let i = UIImage(data: data!) { +// let image = i.hnk_decompressedImage() - return (i, nil) + return (i, nil) + } + return (nil, nil) } }