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

14
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 {

10
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,7 +327,7 @@ println (ux)
if hashes.containsObject(pt) {
println("contained")
} 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)
self.operationQueue.addOperation(op)
@ -338,6 +339,7 @@ println (ux)
c.loaded = true
}
}
hashes.removeObject(p)
hashes.removeObject(pt)
}

4
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)

36
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)
}
@ -111,8 +112,9 @@ 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)
}
@ -145,16 +147,28 @@ println ("\(indexPath.row)")
self.performSegueWithIdentifier("showDetail", sender: self)
return
}
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)
}
}
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()
})
@ -176,7 +190,16 @@ println ("\(indexPath.row)")
let item = items[indexPath.row]
let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController
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)
}
item.children.sort({
$0.sortName < $1.sortName
@ -226,7 +249,12 @@ println ("\(indexPath.row)")
func configureCell(cell: UITableViewCell, atIndexPath indexPath: NSIndexPath) {
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

60
kplayer/photo/MediaPhotoController.swift

@ -60,20 +60,30 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
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 bytesPerPixel = CGImageGetBitsPerPixel(imageRef) / 8;
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)")
self.imageCache.setObject(img, forKey: i.thumbUrlAbsolute, cost: cost)
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)")
}
}
}
override func didReceiveMemoryWarning() {
@ -213,8 +223,9 @@ 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
@ -244,19 +255,23 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
} else {
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)")
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(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)
// requests.append(op3)
operationQueue.addOperation(op3)
}
@ -279,6 +294,11 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView
photoSize[0] = size
return image
} else {
println("## Invalid URL: \(newItem.imageUrlAbsolute)")
return nil
}
}
func numberOfPagesInPagingScrollView(pagingScrollView: NIPagingScrollView) -> Int {
@ -324,21 +344,31 @@ 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;
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)
}
else {
println("## Invalid URL: \(newItem.thumbUrlAbsolute)")
}
}
return image
}

28
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()
}

6
kplayer/util/alamoimage.swift

@ -9,15 +9,17 @@ 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!)
if let i = UIImage(data: data!) {
// let image = i.hnk_decompressedImage()
return (i, nil)
}
return (nil, nil)
}
}
func responseImage(completionHandler: (NSURLRequest, NSHTTPURLResponse?, UIImage?, NSError?) -> Void) -> Self {

Loading…
Cancel
Save