Browse Source

Photo

master
Marco Schmickler 11 years ago
parent
commit
f602ad6569
  1. 21
      kplayer/AppDelegate.swift
  2. 14
      kplayer/core/MediaItem.swift
  3. 10
      kplayer/core/NetworkManager.swift
  4. 4
      kplayer/detail/DetailViewController.swift
  5. 36
      kplayer/master/MasterViewController.swift
  6. 60
      kplayer/photo/MediaPhotoController.swift
  7. 28
      kplayer/util/DataLoadOperation.swift
  8. 6
      kplayer/util/alamoimage.swift

21
kplayer/AppDelegate.swift

@ -26,15 +26,22 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele
let controller = masterNavigationController.topViewController as! MasterViewController let controller = masterNavigationController.topViewController as! MasterViewController
controller.items = [ 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: "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: "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 return true

14
kplayer/core/MediaItem.swift

@ -8,6 +8,7 @@ import UIKit
enum ItemType : String, Printable { enum ItemType : String, Printable {
case ROOT = "root" case ROOT = "root"
case VIDEOROOT = "videoroot"
case FOLDER = "folder" case FOLDER = "folder"
case VIDEO = "video" case VIDEO = "video"
case PICS = "pics" case PICS = "pics"
@ -66,25 +67,28 @@ println (lsortName)
var thumbPath: String { var thumbPath: String {
let len = count("/srv/samba/ren") let len = count("/srv/samba/ren")
let tpath = "/srv/samba/ren/thumb" + (root as NSString).substringFromIndex(len) + "/" + path + "/" + name 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 + "/" return enc + "/"
} }
var thumbUrlAbsolute: String { 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 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("?preview=true", withString: "")
imageUrl = imageUrl.stringByReplacingOccurrencesOfString(" ", withString: "%20")
return NetworkManager.sharedInstance.baseurl + "/service/download" + imageUrl return NetworkManager.sharedInstance.baseurl + "/service/download" + imageUrl
} }
var fullPath: String { var fullPath: String {
let fpath = root + "/" + path + "/" + name let fpath = root + "/" + path + "/" + name
return fpath
let enc = fpath.stringByReplacingOccurrencesOfString(" ", withString: "%20")
return enc
} }
var debugDescription: String { var debugDescription: String {

10
kplayer/core/NetworkManager.swift

@ -43,8 +43,9 @@ class NetworkManager {
return itemsArray; 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 url1 = baseurl + "/service/listvideos" + root
let len = count(root) let len = count(root)
var res = [MediaItem]() 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 url1 = baseurl + "/service/listpicdirs" + root
let len = count(root) let len = count(root)
var res = [MediaItem]() var res = [MediaItem]()
@ -102,7 +103,7 @@ class NetworkManager {
// let (a,b) = j # // let (a,b) = j #
let s = c.object as! String let s = c.object as! String
println(s) println(s)
if s.hasSuffix(".jpg") {
if s.lowercaseString.hasSuffix(".jpg") {
let l = count(s) let l = count(s)
let name = (s as NSString).lastPathComponent let name = (s as NSString).lastPathComponent
var pathlen = l - len - count(name) var pathlen = l - len - count(name)
@ -326,7 +327,7 @@ println (ux)
if hashes.containsObject(pt) { if hashes.containsObject(pt) {
println("contained") println("contained")
} else { } else {
let imageData = UIImageJPEGRepresentation(c.image, 1.0);
if let imageData = UIImageJPEGRepresentation(c.image, 1.0) {
let op = UploadOperation(baseUrl: self.baseurl + "/service/upload", data: imageData, path: p) let op = UploadOperation(baseUrl: self.baseurl + "/service/upload", data: imageData, path: p)
self.operationQueue.addOperation(op) self.operationQueue.addOperation(op)
@ -338,6 +339,7 @@ println (ux)
c.loaded = true c.loaded = true
} }
}
hashes.removeObject(p) hashes.removeObject(p)
hashes.removeObject(pt) hashes.removeObject(pt)
} }

4
kplayer/detail/DetailViewController.swift

@ -281,7 +281,7 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
} }
else { else {
let len = count(items.root) 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(items)
println(url) println(url)
@ -296,7 +296,7 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
// let (a,b) = j # // let (a,b) = j #
let s = c.object as! NSString let s = c.object as! NSString
if s.hasSuffix(".jpg") {
if s.lowercaseString.hasSuffix(".jpg") {
let l = s.length let l = s.length
let name = (s as NSString).lastPathComponent let name = (s as NSString).lastPathComponent
var pathlen = l - len - count(name) var pathlen = l - len - count(name)

36
kplayer/master/MasterViewController.swift

@ -40,7 +40,8 @@ class MasterViewController: UITableViewController {
} }
func loadDirs(dir: String) { func loadDirs(dir: String) {
NetworkManager.sharedInstance.loadDirs(dir) { (g) in
NetworkManager.sharedInstance.loadDirs(dir) {
(g) in
for f in g { for f in g {
self.addItem(f) self.addItem(f)
} }
@ -111,8 +112,9 @@ println ("\(indexPath.row)")
if !selectedItem.loaded { if !selectedItem.loaded {
let dir = selectedItem.root + "/" + selectedItem.path 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 { for f in g {
vc.addItem(f) vc.addItem(f)
} }
@ -145,16 +147,28 @@ println ("\(indexPath.row)")
self.performSegueWithIdentifier("showDetail", sender: self) self.performSegueWithIdentifier("showDetail", sender: self)
return return
} }
let p = selectedItem.parent!
if p.type == ItemType.VIDEOROOT {
NetworkManager.sharedInstance.loadDirs(dir, completionHandler: weiter)
} }
else { else {
NetworkManager.sharedInstance.loadPicDirs(dir, completionHandler: weiter)
}
} else {
vc.items = selectedItem.children 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: { NetworkManager.sharedInstance.listDirs(selectedItem.root, completionHandler: {
(i) in (i) in
for item in i {
item.parent = selectedItem
}
vc.items = i vc.items = i
vc.tableView.reloadData() vc.tableView.reloadData()
}) })
@ -176,7 +190,16 @@ println ("\(indexPath.row)")
let item = items[indexPath.row] let item = items[indexPath.row]
let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController
controller.detailItem = item controller.detailItem = item
var root = item
while root.parent != nil {
root = root.parent!
}
if root.type == ItemType.ROOT {
controller.defaultItemSize = CGSize(width: 300, height: 300) controller.defaultItemSize = CGSize(width: 300, height: 300)
}
item.children.sort({ item.children.sort({
$0.sortName < $1.sortName $0.sortName < $1.sortName
@ -226,7 +249,12 @@ println ("\(indexPath.row)")
func configureCell(cell: UITableViewCell, atIndexPath indexPath: NSIndexPath) { func configureCell(cell: UITableViewCell, atIndexPath indexPath: NSIndexPath) {
let object = items[indexPath.row] let object = items[indexPath.row]
if (object.path.length == 0) {
cell.textLabel!.text = "."
}
else {
cell.textLabel!.text = object.path cell.textLabel!.text = object.path
}
// if !object.children.isEmpty && object.children[0].type == ItemType.VIDEO { // if !object.children.isEmpty && object.children[0].type == ItemType.VIDEO {
// cell.accessoryType = UITableViewCellAccessoryType.DetailDisclosureButton // cell.accessoryType = UITableViewCellAccessoryType.DetailDisclosureButton

60
kplayer/photo/MediaPhotoController.swift

@ -60,20 +60,30 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
break break
} }
let URL = NSURL(string: i.thumbUrlAbsolute)!
let u1 = NSURL(string: i.thumbUrlAbsolute)
let op1 = ImageLoadOperation(imageURL: URL, succeeder: {
img in
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 imageRef = img.CGImage;
let bytesPerPixel = CGImageGetBitsPerPixel(imageRef) / 8; let bytesPerPixel = CGImageGetBitsPerPixel(imageRef) / 8;
let cost = CGImageGetWidth(imageRef) * CGImageGetHeight(imageRef) * bytesPerPixel; let cost = CGImageGetWidth(imageRef) * CGImageGetHeight(imageRef) * bytesPerPixel;
self.total += cost
self.total += d.length
println("preload image loaded \(i.thumbUrlAbsolute) cost \(cost) total\(self.total)") println("preload image loaded \(i.thumbUrlAbsolute) cost \(cost) total\(self.total)")
self.imageCache.setObject(img, forKey: i.thumbUrlAbsolute, cost: cost)
self.imageCache.setObject(img, forKey: i.thumbUrlAbsolute, cost: d.length)
}
}
}, index: j) }, index: j)
op1.qualityOfService = NSQualityOfService.Background op1.qualityOfService = NSQualityOfService.Background
backgroundOperationQueue.addOperation(op1) backgroundOperationQueue.addOperation(op1)
} }
else {
println("## Invalid URL: \(i.thumbUrlAbsolute)")
}
}
} }
override func didReceiveMemoryWarning() { override func didReceiveMemoryWarning() {
@ -213,8 +223,9 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
let c = count(items) let c = count(items)
// println("Index: \(photoAtIndex) of \(c)") // println("Index: \(photoAtIndex) of \(c)")
let newItem = items[photoAtIndex] 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
@ -244,19 +255,23 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
} else { } else {
let URL = NSURL(string: newItem.thumbUrlAbsolute)! let URL = NSURL(string: newItem.thumbUrlAbsolute)!
let op3 = ImageLoadOperation(imageURL: URL, succeeder: {
i in
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)") // println("thumb preload image loaded \(newItem.imageUrlAbsolute)")
let imageRef = i.CGImage; let imageRef = i.CGImage;
let bytesPerPixel = CGImageGetBitsPerPixel(imageRef) / 8; let bytesPerPixel = CGImageGetBitsPerPixel(imageRef) / 8;
let cost = CGImageGetWidth(imageRef) * CGImageGetHeight(imageRef) * bytesPerPixel; let cost = CGImageGetWidth(imageRef) * CGImageGetHeight(imageRef) * bytesPerPixel;
self.imageCache.setObject(i, forKey: newItem.thumbUrlAbsolute, cost: cost)
self.imageCache.setObject(d, forKey: newItem.thumbUrlAbsolute, cost: d.length)
size = NIPhotoScrollViewPhotoSizeThumbnail size = NIPhotoScrollViewPhotoSizeThumbnail
self.photoAlbumView.didLoadPhoto(i, atIndex: photoAtIndex, photoSize: size) self.photoAlbumView.didLoadPhoto(i, atIndex: photoAtIndex, photoSize: size)
self.photoScrubberView.didLoadThumbnail(i, atIndex: photoAtIndex); self.photoScrubberView.didLoadThumbnail(i, atIndex: photoAtIndex);
}
}
}, index: photoAtIndex) }, index: photoAtIndex)
op3.qualityOfService = NSQualityOfService.UserInteractive op3.qualityOfService = NSQualityOfService.UserInteractive
requests.append(op3)
// requests.append(op3)
operationQueue.addOperation(op3) operationQueue.addOperation(op3)
} }
@ -279,6 +294,11 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
photoSize[0] = size photoSize[0] = size
return image return image
} else {
println("## Invalid URL: \(newItem.imageUrlAbsolute)")
return nil
}
} }
func numberOfPagesInPagingScrollView(pagingScrollView: NIPagingScrollView) -> Int { func numberOfPagesInPagingScrollView(pagingScrollView: NIPagingScrollView) -> Int {
@ -324,21 +344,31 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
image = imageCache.objectForKey(newItem.thumbUrlAbsolute) as? UIImage image = imageCache.objectForKey(newItem.thumbUrlAbsolute) as? UIImage
if (image == nil) { 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)") // println("thumb image loaded \(newItem.thumbUrlAbsolute)")
let imageRef = i.CGImage; let imageRef = i.CGImage;
let bytesPerPixel = CGImageGetBitsPerPixel(imageRef) / 8; let bytesPerPixel = CGImageGetBitsPerPixel(imageRef) / 8;
let cost = CGImageGetWidth(imageRef) * CGImageGetHeight(imageRef) * bytesPerPixel; 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); self.photoScrubberView.didLoadThumbnail(i, atIndex: thumbnailIndex);
}
}
}, index: thumbnailIndex) }, index: thumbnailIndex)
op3.qualityOfService = NSQualityOfService.UserInitiated op3.qualityOfService = NSQualityOfService.UserInitiated
operationQueue.addOperation(op3) operationQueue.addOperation(op3)
} }
else {
println("## Invalid URL: \(newItem.thumbUrlAbsolute)")
}
}
return image return image
} }

28
kplayer/util/DataLoadOperation.swift

@ -7,15 +7,12 @@ import Foundation
import Alamofire import Alamofire
import Darwin import Darwin
class ImageLoadOperation: NSOperation {
class DataLoadOperation: NSOperation {
public typealias Succeeder = (NSData) -> () public typealias Succeeder = (NSData) -> ()
let imageURL: NSURL let imageURL: NSURL
let succeeder: Succeeder let succeeder: Succeeder
let index: Int let index: Int
var request: Request?
var manager: Manager?
var ready1 = false var ready1 = false
@ -31,30 +28,17 @@ class ImageLoadOperation: NSOperation {
return 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() { override func cancel() {
// println("cancel load \(imageURL.absoluteString!)") // println("cancel load \(imageURL.absoluteString!)")
ready1 = true ready1 = true
if let r = request {
r.cancel()
}
super.cancel() super.cancel()
} }

6
kplayer/util/alamoimage.swift

@ -9,15 +9,17 @@ import Alamofire
extension Alamofire.Request { extension Alamofire.Request {
class func imageResponseSerializer() -> Serializer { class func imageResponseSerializer() -> Serializer {
return { request, response, data in return { request, response, data in
if data == nil {
if data == nil || data!.length == 0 {
return (nil, nil) return (nil, nil)
} }
let i = UIImage(data: data!)
if let i = UIImage(data: data!) {
// let image = i.hnk_decompressedImage() // let image = i.hnk_decompressedImage()
return (i, nil) return (i, nil)
} }
return (nil, nil)
}
} }
func responseImage(completionHandler: (NSURLRequest, NSHTTPURLResponse?, UIImage?, NSError?) -> Void) -> Self { func responseImage(completionHandler: (NSURLRequest, NSHTTPURLResponse?, UIImage?, NSError?) -> Void) -> Self {

Loading…
Cancel
Save