diff --git a/.idea/kplayer.iml b/.idea/kplayer.iml index 0875b24..8455700 100644 --- a/.idea/kplayer.iml +++ b/.idea/kplayer.iml @@ -16,13 +16,12 @@ - - + @@ -32,35 +31,35 @@ - - + + - + - + - - + - + + - - + + @@ -90,12 +89,6 @@ - - - - - - @@ -103,8 +96,8 @@ - + @@ -114,82 +107,38 @@ - - - - - - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + - - + - - + + - + - + - + + @@ -197,21 +146,22 @@ - - + + - + + - - + + @@ -232,6 +182,12 @@ + + + + + + @@ -248,17 +204,10 @@ - - - - - - - diff --git a/Podfile b/Podfile index 3859a64..a5977ba 100644 --- a/Podfile +++ b/Podfile @@ -9,11 +9,11 @@ use_frameworks! pod 'Alamofire', '~> 2.0' pod 'ALMoviePlayerController', '~>0.3.0' #pod 'DZVideoPlayerViewController' -pod 'SwiftyJSON' +#pod 'SwiftyJSON' pod 'HanekeSwift' pod 'Nimbus/Photos' pod 'Nimbus/PagingScrollView' -pod 'AFNetworking', '~>2.1' +#pod 'AFNetworking', '~>2.1' pod 'Dollar' pod 'Cent' #, '1.2.0' diff --git a/kplayer.xcodeproj/project.pbxproj b/kplayer.xcodeproj/project.pbxproj index 94daea4..934f774 100644 --- a/kplayer.xcodeproj/project.pbxproj +++ b/kplayer.xcodeproj/project.pbxproj @@ -7,10 +7,8 @@ objects = { /* Begin PBXBuildFile section */ - 1C73626E34BA4D64ACF94AE5 /* alamoimage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736C60C423AE87B8D0F22A /* alamoimage.swift */; }; 1C73631EACF56BABD3B2BCFB /* LayoutTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736BC4450890C45F8FBC63 /* LayoutTools.swift */; }; 1C73635138BBD2BB480A308F /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C736777456388CA571DA17B /* MediaPlayer.framework */; }; - 1C7363D9DC8F9D1F866DE935 /* Kirschkeks-256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C7368DC7EF11A553145E169 /* Kirschkeks-256x256.png */; }; 1C73640D928DE56D35175D39 /* UploadOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736260E748CF136FF37EA7 /* UploadOperation.swift */; }; 1C73646F87B495A47D7943C7 /* NetData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7369EC16B19B32B515169E /* NetData.swift */; }; 1C736503B656C999E5E12081 /* NetworkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7365B06FA66294E99AC2D3 /* NetworkManager.swift */; }; @@ -24,6 +22,7 @@ 1C73691A9C7174E0C6B57267 /* stringutil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736B794396F2E50387B8F2 /* stringutil.swift */; }; 1C73693A1334A7792856FC58 /* MasterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C73611D226B48C24DB37535 /* MasterViewController.swift */; }; 1C7369ABC44CFB530EA71FB6 /* HeaderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736D9BB5498E7E8F11C754 /* HeaderCell.swift */; }; + 1C736A5FA5BA53B2597F2ED7 /* Kirschkeks-256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C736059262A57AADE6AB761 /* Kirschkeks-256x256.png */; }; 1C736D16E81BA1FB325200E0 /* HanekeFetchOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7360744ABACC3557D05760 /* HanekeFetchOperation.swift */; }; 1C736D24891597F2728230EE /* ImageLoadOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7360A94DBECA685ED8602F /* ImageLoadOperation.swift */; }; 1C736D24B49451141CD4B64D /* DetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7369F53095B7A4D65679C2 /* DetailViewController.swift */; }; @@ -50,6 +49,7 @@ /* Begin PBXFileReference section */ 127AC1F28342F9AAE3CEC5C2 /* Pods.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1C736059262A57AADE6AB761 /* Kirschkeks-256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Kirschkeks-256x256.png"; path = "kplayer/Kirschkeks-256x256.png"; sourceTree = ""; }; 1C736069C214E9522BB1BD97 /* ItemCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemCell.swift; sourceTree = ""; }; 1C7360744ABACC3557D05760 /* HanekeFetchOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HanekeFetchOperation.swift; sourceTree = ""; }; 1C7360A94DBECA685ED8602F /* ImageLoadOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageLoadOperation.swift; sourceTree = ""; }; @@ -63,12 +63,10 @@ 1C73673DC671535E3A049F54 /* MediaPhotoController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaPhotoController.swift; sourceTree = ""; }; 1C736777456388CA571DA17B /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; }; 1C73688DAB88F9360FB62A49 /* MediaItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaItem.swift; sourceTree = ""; }; - 1C7368DC7EF11A553145E169 /* Kirschkeks-256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Kirschkeks-256x256.png"; sourceTree = ""; }; 1C7369EC16B19B32B515169E /* NetData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetData.swift; sourceTree = ""; }; 1C7369F53095B7A4D65679C2 /* DetailViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetailViewController.swift; sourceTree = ""; }; 1C736B794396F2E50387B8F2 /* stringutil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = stringutil.swift; sourceTree = ""; }; 1C736BC4450890C45F8FBC63 /* LayoutTools.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LayoutTools.swift; sourceTree = ""; }; - 1C736C60C423AE87B8D0F22A /* alamoimage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = alamoimage.swift; sourceTree = ""; }; 1C736D9BB5498E7E8F11C754 /* HeaderCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeaderCell.swift; sourceTree = ""; }; 1C736DCCE3AA9993E15F7652 /* UIImageExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImageExtension.swift; sourceTree = ""; }; 1C736F9338CE36708244D42A /* DataLoadOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataLoadOperation.swift; sourceTree = ""; }; @@ -143,7 +141,6 @@ 1C7369EC16B19B32B515169E /* NetData.swift */, 1C7360744ABACC3557D05760 /* HanekeFetchOperation.swift */, 1C7360A94DBECA685ED8602F /* ImageLoadOperation.swift */, - 1C736C60C423AE87B8D0F22A /* alamoimage.swift */, 1C736F9338CE36708244D42A /* DataLoadOperation.swift */, 1C736B794396F2E50387B8F2 /* stringutil.swift */, 1C73648CEC974A2500172064 /* ViewControllerExtensions.swift */, @@ -187,6 +184,7 @@ C98AF5D01B124D6A00D196CC /* Products */, 8EB26707CC8BD3E10F328A9E /* Pods */, 8CB608B13A2BDFA9D708982B /* Frameworks */, + 1C736059262A57AADE6AB761 /* Kirschkeks-256x256.png */, ); sourceTree = ""; }; @@ -209,7 +207,6 @@ C98AF5D61B124D6A00D196CC /* kplayer.xcdatamodeld */, C98AF5D21B124D6A00D196CC /* Supporting Files */, 1C736DC8C3AFB991541A2079 /* core */, - 1C7368DC7EF11A553145E169 /* Kirschkeks-256x256.png */, 1C7365603CAE04E39B73D843 /* util */, 1C73615846EE8B07DAAFD230 /* detail */, 1C7364808E72BFA7575E75E1 /* master */, @@ -332,7 +329,7 @@ C98AF5DF1B124D6A00D196CC /* Main.storyboard in Resources */, C98AF5E41B124D6A00D196CC /* LaunchScreen.xib in Resources */, C98AF5E11B124D6A00D196CC /* Images.xcassets in Resources */, - 1C7363D9DC8F9D1F866DE935 /* Kirschkeks-256x256.png in Resources */, + 1C736A5FA5BA53B2597F2ED7 /* Kirschkeks-256x256.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -415,7 +412,6 @@ 1C7365885FAF292F2221ED44 /* MediaPhotoController.swift in Sources */, 1C736D16E81BA1FB325200E0 /* HanekeFetchOperation.swift in Sources */, 1C736D24891597F2728230EE /* ImageLoadOperation.swift in Sources */, - 1C73626E34BA4D64ACF94AE5 /* alamoimage.swift in Sources */, 1C7367AF39961D2BA72480ED /* DataLoadOperation.swift in Sources */, 1C73675C34BE0990D44570BE /* ItemModel.swift in Sources */, 1C73691A9C7174E0C6B57267 /* stringutil.swift in Sources */, diff --git a/kplayer/core/ItemModel.swift b/kplayer/core/ItemModel.swift index 0304173..2e8ae3a 100644 --- a/kplayer/core/ItemModel.swift +++ b/kplayer/core/ItemModel.swift @@ -10,7 +10,7 @@ class ItemModel { var itemsMap = Dictionary() func addItem(item: MediaItem) { - let path = item.rootSlash + item.path + let path = item.root + "/" + item.path print(path) var folder = itemsMap[path] diff --git a/kplayer/core/MediaItem.swift b/kplayer/core/MediaItem.swift index d0bfa1b..449b5c8 100644 --- a/kplayer/core/MediaItem.swift +++ b/kplayer/core/MediaItem.swift @@ -6,39 +6,82 @@ import Foundation import UIKit -enum ItemType : String, CustomStringConvertible { +enum ItemType: String, CustomStringConvertible { + /** + Repräsentiert eine Wurzel, in der nur Bilder angezeigt werden. + */ case ROOT = "root" + + /** + Repräsentiert eine Wurzel, in der nur Videos angezeigt werden. + */ case VIDEOROOT = "videoroot" + + /** + Repräsentiert einen Ordner. Darin sind weitere Ordner enthalten. + */ case FOLDER = "folder" + + /** + Repräsentiert ein Video. Hat keine Unterordner. Die Children sind Snapshots. + */ case VIDEO = "video" + + /** + Snapshots eines Videos. + */ + case SNAPSHOT = "snapshot" + + /** + Repräsentiert einen Bilder-Ordner. + */ case PICS = "pics" + + /** + Repräsentiert einen Ordner, der Videos oder Bilder-Ordner enthält. Wird im DetailViewController angezeigt. + */ case DETAILS = "details" - case SNAPSHOT = "snapshot" var description: String { return self.rawValue } } -class MediaItem : CustomDebugStringConvertible { - var name : String - var path : String - var root: String +/** + Repräsentiert ein Item eines der festgelegten Typen. +*/ +class MediaItem: CustomDebugStringConvertible { - var image: UIImage? - var time: NSTimeInterval? - var thumbUrl: String? + + /** + 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 - var featured = true + // abgeleitet var sortName = "" + // Nutzinhalt + var image: UIImage? + var time: NSTimeInterval? + var thumbUrl: String? + init(name: String, path: String, root: String, type: ItemType) { self.name = name let trim = NSCharacterSet(charactersInString: "/ ") @@ -51,10 +94,14 @@ class MediaItem : CustomDebugStringConvertible { sortName = computeSortName(name) } - func computeSortName(sname: String) -> String { + private func computeSortName(sname: String) -> String { var lsortName = sname.stringByReplacingOccurrencesOfString("full", withString: "") - var fullNameArr = sortName.characters.split {$0 == "_"}.map { String($0) } -// println (lsortName) + var fullNameArr = sortName.characters.split { + $0 == "_" + }.map { + String($0) + } + if !fullNameArr.isEmpty { lsortName = fullNameArr[0] } @@ -66,63 +113,58 @@ class MediaItem : CustomDebugStringConvertible { return lsortName } - var thumbPath: String { + /** + Ordner, in dem die Snapshots eines Videos abgelegt sind. + Absoluter Pfad mit Slash am Ende. + */ + var snapshotDirPathForVideo: String { let len = "/srv/samba/ren".characters.count - let tpath = "/srv/samba/ren/thumb" + (rootSlash as NSString).substringFromIndex(len) + pathSlash + name - let enc = tpath.stringByAddingPercentEscapesUsingEncoding(NSISOLatin1StringEncoding)! //.stringByReplacingOccurrencesOfString(" ", withString: "%20") + let rootPostfix = (root as NSString).substringFromIndex(len) + let tpath = "/srv/samba/ren/thumb\(rootPostfix)/\(path)/\(name)" + let enc = tpath.stringByAddingPercentEscapesUsingEncoding(NSISOLatin1StringEncoding)! return enc + "/" } + /** + Absolute URL, unter der das Thumbnail des Items abgerufen werden kann. + */ var thumbUrlAbsolute: String { - let enc = thumbUrl!.stringByAddingPercentEscapesUsingEncoding(NSISOLatin1StringEncoding)! //.stringByReplacingOccurrencesOfString(" ", withString: "%20") + let enc = thumbUrl!.stringByAddingPercentEscapesUsingEncoding(NSISOLatin1StringEncoding)! return NetworkManager.sharedInstance.baseurl + "/service/download" + enc } + /** + Absolute URL, unter der das Image des Items abgerufen werden kann. + */ var imageUrlAbsolute: String { var imageUrl = thumbUrl!.stringByReplacingOccurrencesOfString("_thumb.", withString: ".") imageUrl = imageUrl.stringByReplacingOccurrencesOfString("?preview=true", withString: "") - imageUrl = imageUrl.stringByAddingPercentEscapesUsingEncoding(NSISOLatin1StringEncoding)! //.stringByReplacingOccurrencesOfString(" ", withString: "%20") + imageUrl = imageUrl.stringByAddingPercentEscapesUsingEncoding(NSISOLatin1StringEncoding)! return NetworkManager.sharedInstance.baseurl + "/service/download" + imageUrl } + var playerURL: NSURL? { + let enc = name.stringByReplacingOccurrencesOfString(" ", withString: "%20") + return NSURL(string: NetworkManager.sharedInstance.baseurl + "/service/stream" + encodedDir! + enc) + } + + /** + Absoluter Pfad des Items. + */ var fullPath: String { - let fpath = rootSlash + pathSlash + name - let enc = fpath.stringByAddingPercentEscapesUsingEncoding(NSISOLatin1StringEncoding) //.stringByReplacingOccurrencesOfString(" ", withString: "%20") + let fpath = "\(root)/\(path)/\(name)" + let enc = fpath.stringByAddingPercentEscapesUsingEncoding(NSISOLatin1StringEncoding) return enc! } var debugDescription: String { return "\(type): \(root) \(path) \(name) (\(index)) Child count \(children.count)" } - - var rootSlash: String { - if root.endsWith("/") { - return root - } - else { - return root + "/" - } - - } - - var pathSlash: String { - if path.characters.count == 0 { - return "" - } - - if path.endsWith("/") { - return path - } - else { - return path + "/" - } - - } var encodedDir: String? { - let dir = rootSlash + path + let dir = "\(root)/\(path)" return dir.stringByAddingPercentEscapesUsingEncoding(NSISOLatin1StringEncoding) } diff --git a/kplayer/core/NetworkManager.swift b/kplayer/core/NetworkManager.swift index 35d1ed4..de2636f 100644 --- a/kplayer/core/NetworkManager.swift +++ b/kplayer/core/NetworkManager.swift @@ -21,7 +21,7 @@ class NetworkManager { }() - public typealias Weiter = ([MediaItem]) -> Void + internal typealias Weiter = ([MediaItem]) -> Void func loadDirs(root: String, completionHandler: Weiter) -> Void { let url1 = baseurl + "/service/listvideos" + root @@ -33,8 +33,7 @@ class NetworkManager { (_, _, response) in if let json = response.value { - var hashes = Set() - + for s in json as! [String] { print(s) if s.hasSuffix(".mp4") || s.hasSuffix(".m4v") { @@ -121,39 +120,7 @@ class NetworkManager { } } - func loadDir(root: String, completionHandler: ([MediaItem]) -> Void) -> Void { - var itemsArray = []; - - let url = (root as NSString).stringByReplacingOccurrencesOfString(" ", withString: "+") - Alamofire.request(.GET, baseurl + "/service/dirs" + url) - .responseString { - (_, _, result) in - let string = result.value! - let f = string.componentsSeparatedByString("\r\n") - - - let len = root.length - - var res = [MediaItem]() - - for s in f { - if s.hasSuffix(".mp4") || s.hasSuffix(".m4v") { - let l = s.length - let name = NSURL(fileURLWithPath: s).lastPathComponent! - let pathlen = l - len - name.length - let path = (s as NSString).substringWithRange(NSMakeRange(len + 1, pathlen - 2)) - let i = MediaItem(name: name, path: path, root: root, type: ItemType.VIDEO) - if !name.hasPrefix(".") { - res.append(i) - } - } - } - completionHandler(res) - } - } - func listDirs(root: String, completionHandler: ([MediaItem], Bool) -> Void) -> Void { - var itemsArray = []; let len = root.characters.count let url = (root as NSString).stringByReplacingOccurrencesOfString(" ", withString: "+") @@ -174,8 +141,8 @@ class NetworkManager { // let (a,b) = j # - var index1 = s.startIndex.advancedBy(len) - var st = s.substringFromIndex(index1) + let index1 = s.startIndex.advancedBy(len) + let st = s.substringFromIndex(index1) print(st) @@ -186,7 +153,7 @@ class NetworkManager { if s.lowercaseString.hasSuffix(".jpg") { let l = s.length let name = (s as NSString).lastPathComponent - var pathlen = l - len - name.length + let pathlen = l - len - name.length // if (pathlen > 1000) { print(pathlen) @@ -222,11 +189,6 @@ class NetworkManager { } } - func playerURL(item: MediaItem) -> String { - let enc = item.name.stringByReplacingOccurrencesOfString(" ", withString: "%20") - return baseurl + "/service/stream" + item.rootSlash + item.pathSlash + enc - } - func loadItems(item: MediaItem) { if (item.type != ItemType.FOLDER && item.type != ItemType.DETAILS) { return @@ -259,7 +221,7 @@ class NetworkManager { return } - let url = baseurl + "/service/listfiles" + item.thumbPath + let url = baseurl + "/service/listfiles" + item.snapshotDirPathForVideo print(url) @@ -276,13 +238,13 @@ class NetworkManager { if p.containsString("_thumb.jpg") { let ts = p[0 ..< p.length - 10] - hashes[ts] = b as! String + hashes[ts] = b } else { let ende = p.length - 4 let ts = p[0 ..< ende] if hashes[ts] == nil { - hashes[ts] = b as! String + hashes[ts] = b } } } @@ -325,7 +287,7 @@ class NetworkManager { return } - let url = baseurl + "/service/listfiles" + item.thumbPath + let url = baseurl + "/service/listfiles" + item.snapshotDirPathForVideo print(url) @@ -344,8 +306,8 @@ class NetworkManager { 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" + let p = c.snapshotDirPathForVideo + "\(ms).jpg" + let pt = c.snapshotDirPathForVideo + "\(ms)_thumb.jpg" print(p) if hashes.contains(pt) { print("contained") diff --git a/kplayer/detail/DetailViewController.swift b/kplayer/detail/DetailViewController.swift index 250a9f3..7a36a54 100644 --- a/kplayer/detail/DetailViewController.swift +++ b/kplayer/detail/DetailViewController.swift @@ -26,41 +26,9 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout if collectionView != nil { collectionView.reloadData() } - // Update the view. - // self.configureView() } } - func configureView() { - // Update the user interface for the detail item. - print(detailItem) - if let detail: MediaItem = self.detailItem { - print(detail) - print(detail.children) - - if let label = self.detailDescriptionLabel { - label.text = detail.name - } - - if detail.children.count > 0 { - let i = detail.children[0] - let url = NetworkManager.sharedInstance.playerURL(i) - - print(url) - -// if moviePlayer == nil { -// play(url) -// } - } - } - - } - - - override func loadView() { - super.loadView() - } - required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) @@ -152,10 +120,6 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout print("Object: \(oid.hashValue) Index \(index) Item: \(i) Parent: \(i.parent) Detail: \(detailItem)") -// if (count(detail.children) > 100) { -// self.collectionView.reloadData() -// } -// else { collectionView.performBatchUpdates({ var newItems = [NSIndexPath]() var j = 0 @@ -164,7 +128,7 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout let path = NSIndexPath(forItem: 0, inSection: index) self.collectionView.reloadItemsAtIndexPaths([path]) - for i in detail.children[index].children { + for _ in detail.children[index].children { if j >= 1 { newItems.append(NSIndexPath(forItem: j, inSection: index)) } @@ -174,7 +138,6 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout } return }, completion: nil) -// } } } @@ -199,8 +162,8 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout 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" + let p = c.snapshotDirPathForVideo + "\(ms).jpg" + let pt = c.snapshotDirPathForVideo + "\(ms)_thumb.jpg" Alamofire.request(.GET, NetworkManager.sharedInstance.baseurl + "/service/deletethumb\(p)") Alamofire.request(.GET, NetworkManager.sharedInstance.baseurl + "/service/deletethumb\(pt)") } @@ -212,18 +175,6 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout } } - override func viewDidAppear(animated: Bool) { - super.viewDidAppear(animated) - -// self.configureView() - - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { if let detail: MediaItem = self.detailItem { let cnt = detail.children.count @@ -307,7 +258,6 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout if let json = response.value { var im = [MediaItem]() - var hashes = Dictionary() for s in json as! [String] { diff --git a/kplayer/detail/HeaderCell.swift b/kplayer/detail/HeaderCell.swift index f3795c0..cd63eb7 100644 --- a/kplayer/detail/HeaderCell.swift +++ b/kplayer/detail/HeaderCell.swift @@ -5,7 +5,6 @@ import Foundation import UIKit -import Haneke class HeaderCell: UICollectionViewCell { var item: MediaItem? diff --git a/kplayer/detail/ItemCell.swift b/kplayer/detail/ItemCell.swift index c9043cb..9ef8ac1 100644 --- a/kplayer/detail/ItemCell.swift +++ b/kplayer/detail/ItemCell.swift @@ -16,10 +16,8 @@ class ItemCell: UICollectionViewCell { required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) - } - override init(frame: CGRect) { super.init(frame: frame) @@ -36,12 +34,11 @@ class ItemCell: UICollectionViewCell { func setItem(item: MediaItem) { self.item = item - if let url = item.thumbUrl, nsurl = NSURL(string: item.thumbUrlAbsolute) { + if let _ = item.thumbUrl, nsurl = NSURL(string: item.thumbUrlAbsolute) { image.hnk_setImageFromURL(nsurl, placeholder: defaultImage) } else { if let i = item.image { image.image = i.scaleToSize(15 * 16, height: 15 * 9) -// image.sizeToFit() } else { image.image = defaultImage } diff --git a/kplayer/detail/VideoPlayerController.swift b/kplayer/detail/VideoPlayerController.swift index 6ae0534..b9c43ef 100644 --- a/kplayer/detail/VideoPlayerController.swift +++ b/kplayer/detail/VideoPlayerController.swift @@ -35,10 +35,6 @@ class VideoPlayerController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - let url = NetworkManager.sharedInstance.playerURL(currentItem!) - - print(url) - barbutton = UIBarButtonItem(barButtonSystemItem: .Action, target: self, action: Selector("twoFingersTwoTaps")); navigationItem.rightBarButtonItems = [barbutton!] @@ -49,7 +45,10 @@ class VideoPlayerController: UIViewController { navigationItem.leftBarButtonItems = [backButton!, playButton!, speedButton!, reviewButton!] - play(url) + if let c = currentItem, url = c.playerURL { + print(url) + play(url) + } } func doEdit(sender: AnyObject) { @@ -96,7 +95,7 @@ print("play") completionHandler!() } - func play(url: String) { + func play(url: NSURL) { self.moviePlayer = ALMoviePlayerController(frame: CGRectMake(0, 0, view.frame.width, view.frame.height)) if let player = self.moviePlayer { @@ -115,21 +114,11 @@ print("play") // player.controlStyle = MPMovieControlStyle.Embedded player.movieSourceType = MPMovieSourceType.Streaming player.repeatMode = MPMovieRepeatMode.One - player.contentURL = NSURL(string: url) - - // player.play() - // var timer = NSTimer.scheduledTimerWithTimeInterval(0.8, target: self, selector: Selector("update"), userInfo: nil, repeats: false) + player.contentURL = url -// view.autolayout(["controls": movieControls, "player": player.view], -// constraints: -// "H:|-[player]-|", -// "H:|-[controls]-|", -// "V:|-[player]-[controls(<=50)]-|" ) self.view.addSubview(player.view) installGestures(player.view) update() -// view.addSubview(movieControls) - // player.setFrame(view.frame) } } @@ -193,9 +182,9 @@ print("play") func update() { if let player = self.moviePlayer { - if !(player.duration > 0.0) { // player.loadState == MPMovieLoadState.Unknown || player.loadState == MPMovieLoadState.Stalled { + if !(player.duration > 0.0) { print("again") - var timer = NSTimer.scheduledTimerWithTimeInterval(0.3, target: self, selector: Selector("update"), userInfo: nil, repeats: false) + NSTimer.scheduledTimerWithTimeInterval(0.3, target: self, selector: Selector("update"), userInfo: nil, repeats: false) return } @@ -221,7 +210,6 @@ print("play") } player.play() - // player.fullscreen = true } } @@ -288,9 +276,9 @@ print("play") print("'Switched Type: \(currentItem!.type) Count: \(currentItem!.children.count) Index: \(index) Current: \(currentItem!.index)") index = 0 - player.contentURL = NSURL(string: NetworkManager.sharedInstance.playerURL(currentItem!)) + player.contentURL = currentItem!.playerURL player.play() - var timer = NSTimer.scheduledTimerWithTimeInterval(1.2, target: self, selector: Selector("update"), userInfo: nil, repeats: false) + NSTimer.scheduledTimerWithTimeInterval(1.2, target: self, selector: Selector("update"), userInfo: nil, repeats: false) return } @@ -331,9 +319,9 @@ print("play") currentItem = currentItem!.parent!.children[newIndex] index = 0; - player.contentURL = NSURL(string: NetworkManager.sharedInstance.playerURL(currentItem!)) + player.contentURL = currentItem!.playerURL player.play() - var timer = NSTimer.scheduledTimerWithTimeInterval(1.2, target: self, selector: Selector("update"), userInfo: nil, repeats: false) + NSTimer.scheduledTimerWithTimeInterval(1.2, target: self, selector: Selector("update"), userInfo: nil, repeats: false) return } diff --git a/kplayer/master/MasterViewController.swift b/kplayer/master/MasterViewController.swift index 78d613b..a841410 100644 --- a/kplayer/master/MasterViewController.swift +++ b/kplayer/master/MasterViewController.swift @@ -11,8 +11,6 @@ import CoreData class MasterViewController: UITableViewController { - var detailViewController: DetailViewController? = nil - var items = [MediaItem]() var itemsMap = Dictionary() @@ -25,8 +23,9 @@ class MasterViewController: UITableViewController { } func addItem(item: MediaItem) { - let path = item.rootSlash + item.path + let path = item.encodedDir! print(path) + var folder = itemsMap[path] if folder == nil { @@ -40,27 +39,8 @@ class MasterViewController: UITableViewController { item.parent = folder } - func loadDirs(dir: String) { - NetworkManager.sharedInstance.loadDirs(dir) { - (g) in - for f in g { - self.addItem(f) - } - self.tableView.reloadData() - } - } - override func viewDidLoad() { - super.viewDidLoad() - - // Do any additional setup after loading the view, typically from a nib. -// self.navigationItem.leftBarButtonItem = self.editButtonItem() -// let addButton = UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "insertNewObject:") -// self.navigationItem.rightBarButtonItem = addButton - if let split = self.splitViewController { - self.detailViewController = split.findChildController(DetailViewController.self) - } } override func didReceiveMemoryWarning() { @@ -75,11 +55,6 @@ 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 } @@ -99,57 +74,7 @@ class MasterViewController: UITableViewController { if (selectedItem.type == ItemType.FOLDER) { vc.navigationItem.title = selectedItem.name; - if !selectedItem.loaded { - let dir = selectedItem.encodedDir! - - let weiter: NetworkManager.Weiter = { - (g) in - for f in g { - vc.addItem(f) - } - selectedItem.children = vc.items - selectedItem.loaded = true - - var all: [MediaItem]? - - for f in selectedItem.children { - print(f.path) - if f.type == ItemType.FOLDER && f.path != "" { - self.navigationController!.pushViewController(vc, animated: true) - return - } - if f.type == ItemType.FOLDER && f.path == "" { - all = f.children - // break - } - } - - if all != nil { - selectedItem.children = all! - selectedItem.loaded = false - - for f in all! { - f.loaded = false - f.parent = selectedItem - } - } - - self.performSegueWithIdentifier("showDetail", sender: self) - return - } - - let p = selectedItem.parent! - if p.type == ItemType.VIDEOROOT { - // NetworkManager.sharedInstance.loadDirs(dir, completionHandler: weiter) - } - else if p.type == ItemType.DETAILS { - // NetworkManager.sharedInstance.loadPicDirs(dir, completionHandler: weiter) - } - else if p.type == ItemType.FOLDER { - - } - - } else { + if selectedItem.loaded { vc.items = selectedItem.children navigationController!.pushViewController(vc, animated: true) return @@ -170,7 +95,6 @@ class MasterViewController: UITableViewController { for item in i { if item.type != ItemType.FOLDER && supertype != ItemType.VIDEOROOT { item.parent = newFolder -// item.path = "" newFolder.children.append(item) } else { @@ -238,25 +162,15 @@ class MasterViewController: UITableViewController { else { NetworkManager.sharedInstance.loadPicDirs(dir, completionHandler: weiter) } - - // self.performSegueWithIdentifier("showDetail", sender: self) return } - 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) }) } - - } override func shouldPerformSegueWithIdentifier(identifier: String, sender: AnyObject?) -> Bool { diff --git a/kplayer/photo/MediaPhotoController.swift b/kplayer/photo/MediaPhotoController.swift index 2f87e5c..691ac80 100644 --- a/kplayer/photo/MediaPhotoController.swift +++ b/kplayer/photo/MediaPhotoController.swift @@ -5,7 +5,6 @@ import Foundation import Nimbus -import Haneke import Alamofire class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollViewDataSource, NIPhotoScrubberViewDataSource { @@ -95,7 +94,6 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView imageCache.removeAllObjects() super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. } func shot() { @@ -158,14 +156,13 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView (request, response, result) in var im = [MediaItem]() - var hashes = Dictionary() - + if let json = result.value { for s in json as! [String] { if s.hasSuffix(".jpg") { let l = s.length - let name = NSURL(fileURLWithPath: s as! String).lastPathComponent! + let name = NSURL(fileURLWithPath: s ).lastPathComponent! var pathlen = l - len - name.length // if (pathlen > 1000) { @@ -251,8 +248,6 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView func photoAlbumScrollView(photoAlbumScrollView: NIPhotoAlbumScrollView!, photoAtIndex: Int, photoSize: UnsafeMutablePointer, isLoading: UnsafeMutablePointer, originalPhotoDimensions: UnsafeMutablePointer) -> UIImage! { - let c = items.count - // println("Index: \(photoAtIndex) of \(c)") let newItem = items[photoAtIndex] let u1 = NSURL(string: newItem.imageUrlAbsolute) let u2 = NSURL(string: newItem.thumbUrlAbsolute) @@ -280,7 +275,7 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView image = imageCache.objectForKey(URL.absoluteString) as? UIImage - if let i = image { + if image != nil { size = NIPhotoScrollViewPhotoSizeThumbnail isLoading[0] = false } else { @@ -302,7 +297,6 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView } }, index: photoAtIndex) op3.qualityOfService = NSQualityOfService.UserInteractive -// requests.append(op3) operationQueue.addOperation(op3) } @@ -367,7 +361,6 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView return nil } - let c = items.count let newItem = items[thumbnailIndex] var image: UIImage? @@ -404,15 +397,3 @@ class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollView } } -class MediaFetcher: NetworkFetcher { - let bsession: NSURLSession? - - init(URL: NSURL, session: NSURLSession) { - self.bsession = session - super.init(URL: URL) - } - - override public var session: NSURLSession { - return bsession! - } -} diff --git a/kplayer/util/DataLoadOperation.swift b/kplayer/util/DataLoadOperation.swift index f881c21..433edd6 100644 --- a/kplayer/util/DataLoadOperation.swift +++ b/kplayer/util/DataLoadOperation.swift @@ -8,7 +8,7 @@ import Alamofire import Darwin class DataLoadOperation: NSOperation { - public typealias Succeeder = (NSData) -> () + internal typealias Succeeder = (NSData) -> () let imageURL: NSURL let succeeder: Succeeder diff --git a/kplayer/util/ImageLoadOperation.swift b/kplayer/util/ImageLoadOperation.swift index 0b4b530..0ad8966 100644 --- a/kplayer/util/ImageLoadOperation.swift +++ b/kplayer/util/ImageLoadOperation.swift @@ -31,8 +31,6 @@ class ImageLoadOperation: NSOperation { return } - // println("do load \(imageURL.absoluteString!)") - if let m = manager { request = m.request(.GET, imageURL) } else { diff --git a/kplayer/util/LayoutTools.swift b/kplayer/util/LayoutTools.swift index e2718ce..0f75228 100644 --- a/kplayer/util/LayoutTools.swift +++ b/kplayer/util/LayoutTools.swift @@ -48,7 +48,7 @@ public extension UIView { let cn = String(v.dynamicType) if cn == classname { - return v as? UIView + return v } if result != nil { diff --git a/kplayer/util/NetworkHelper.swift b/kplayer/util/NetworkHelper.swift index 53b4ca3..20452f2 100644 --- a/kplayer/util/NetworkHelper.swift +++ b/kplayer/util/NetworkHelper.swift @@ -9,7 +9,7 @@ import Alamofire func urlRequestWithComponents(urlString: String, parameters: NSDictionary) -> (URLRequestConvertible, NSData) { // create url request to send - var mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: urlString)!) + let mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: urlString)!) mutableURLRequest.HTTPMethod = Alamofire.Method.POST.rawValue //let boundaryConstant = "myRandomBoundary12345" let boundaryConstant = "NET-POST-boundary-\(arc4random())-\(arc4random())" @@ -27,12 +27,12 @@ func urlRequestWithComponents(urlString: String, parameters: NSDictionary) -> (U if value is NetData { // add image - var postData = value as! NetData + let postData = value as! NetData //uploadData.appendData("Content-Disposition: form-data; name=\"\(key)\"; filename=\"\(postData.filename)\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) // append content disposition - var filenameClause = " filename=\"\(postData.filename)\"" + let filenameClause = " filename=\"\(postData.filename)\"" let contentDispositionString = "Content-Disposition: form-data; name=\"\(key)\";\(filenameClause)\r\n" let contentDispositionData = contentDispositionString.dataUsingEncoding(NSUTF8StringEncoding) uploadData.appendData(contentDispositionData!) diff --git a/kplayer/util/UploadOperation.swift b/kplayer/util/UploadOperation.swift index b652344..bcbb310 100644 --- a/kplayer/util/UploadOperation.swift +++ b/kplayer/util/UploadOperation.swift @@ -23,7 +23,7 @@ class UploadOperation: NSOperation { return } - var parameters = [ + let parameters = [ "file": NetData(data: data, mimeType: MimeType.Json, filename: path), "name": path ] @@ -31,11 +31,10 @@ class UploadOperation: NSOperation { print("PATH: \(path)") let urlRequest = urlRequestWithComponents(baseUrl, parameters: parameters) - let request = Alamofire.upload(urlRequest.0, data: urlRequest.1) + Alamofire.upload(urlRequest.0, data: urlRequest.1) // success: todo set url to item - // .progress { // (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in // print("progress : \(totalBytesWritten) / \(totalBytesExpectedToWrite)") diff --git a/kplayer/util/ViewControllerExtensions.swift b/kplayer/util/ViewControllerExtensions.swift index ba344a4..67fc035 100644 --- a/kplayer/util/ViewControllerExtensions.swift +++ b/kplayer/util/ViewControllerExtensions.swift @@ -35,11 +35,10 @@ public extension UIViewController { // (XXX) return result } - if let childControl = child as? UIViewController { - if let found = childControl.findChildController(my) { + if let found = child.findChildController(my) { return found; } - } + } return nil } diff --git a/kplayer/util/alamoimage.swift b/kplayer/util/alamoimage.swift deleted file mode 100644 index d9110f5..0000000 --- a/kplayer/util/alamoimage.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// Created by Marco Schmickler on 22.06.15. -// Copyright (c) 2015 Marco Schmickler. All rights reserved. -// - -import Foundation -import Alamofire - -extension Alamofire.Request { - - -// class func imageResponseSerializer() -> Serializer { -// return { request, response, data in -// if data == nil || data!.length == 0 { -// return (nil, nil) -// } -// -// 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 { -// return response(serializer: Request.imageResponseSerializer(), completionHandler: { (request, response, image, error) in -// completionHandler(request, response, image as? UIImage, error) -// }) -// } -} \ No newline at end of file