Browse Source

init

master
Marco Schmickler 11 years ago
parent
commit
a2837b992d
  1. 4
      Podfile
  2. 28
      kplayer.xcodeproj/project.pbxproj
  3. 18
      kplayer/Base.lproj/Main.storyboard
  4. 32
      kplayer/core/MediaItem.swift
  5. 8
      kplayer/core/NetworkManager.swift
  6. 8
      kplayer/detail/DetailViewController.swift
  7. 23
      kplayer/detail/ItemCell.swift
  8. 170
      kplayer/detail/VideoPlayerController.swift
  9. 127
      kplayer/master/MasterViewController.swift
  10. 150
      kplayer/photo/MediaPhotoController.swift
  11. 17
      kplayer/util/LayoutTools.swift

4
Podfile

@ -8,3 +8,7 @@ pod 'Alamofire', '~> 1.2'
pod 'ALMoviePlayerController', '~>0.3.0'
pod 'SwiftyJSON'
pod 'HanekeSwift'
pod 'Nimbus/Photos'
pod 'Nimbus/PagingScrollView'
pod 'AFNetworking', '= 2.1'
#, '1.2.0'

28
kplayer.xcodeproj/project.pbxproj

@ -14,8 +14,10 @@
1C73646F87B495A47D7943C7 /* NetData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7369EC16B19B32B515169E /* NetData.swift */; };
1C736503B656C999E5E12081 /* NetworkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7365B06FA66294E99AC2D3 /* NetworkManager.swift */; };
1C73654C9EA6D255CFC039C5 /* NetworkHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C73620D01687FB4F1811C5C /* NetworkHelper.swift */; };
1C7365885FAF292F2221ED44 /* MediaPhotoController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C73673DC671535E3A049F54 /* MediaPhotoController.swift */; };
1C7368364397315E12E90F05 /* VideoPlayerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7367379DEE94EBF3FAFA78 /* VideoPlayerController.swift */; };
1C73688D13E5A804880C8768 /* UIImageExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736DCCE3AA9993E15F7652 /* UIImageExtension.swift */; };
1C73693A1334A7792856FC58 /* MasterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C73611D226B48C24DB37535 /* MasterViewController.swift */; };
1C7369ABC44CFB530EA71FB6 /* HeaderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C736D9BB5498E7E8F11C754 /* HeaderCell.swift */; };
1C736C5DD23466269607E07F /* alamojson.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C73618272969871601AB817 /* alamojson.swift */; };
1C736D24B49451141CD4B64D /* DetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C7369F53095B7A4D65679C2 /* DetailViewController.swift */; };
@ -24,7 +26,6 @@
A5D637AE4588AAB5DC1CBC6B /* Pods.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 127AC1F28342F9AAE3CEC5C2 /* Pods.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
C98AF5D51B124D6A00D196CC /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C98AF5D41B124D6A00D196CC /* AppDelegate.swift */; };
C98AF5D81B124D6A00D196CC /* kplayer.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = C98AF5D61B124D6A00D196CC /* kplayer.xcdatamodeld */; };
C98AF5DA1B124D6A00D196CC /* MasterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C98AF5D91B124D6A00D196CC /* MasterViewController.swift */; };
C98AF5DF1B124D6A00D196CC /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C98AF5DD1B124D6A00D196CC /* Main.storyboard */; };
C98AF5E11B124D6A00D196CC /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C98AF5E01B124D6A00D196CC /* Images.xcassets */; };
C98AF5E41B124D6A00D196CC /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = C98AF5E21B124D6A00D196CC /* LaunchScreen.xib */; };
@ -44,11 +45,13 @@
/* Begin PBXFileReference section */
127AC1F28342F9AAE3CEC5C2 /* Pods.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods.framework; sourceTree = BUILT_PRODUCTS_DIR; };
1C736069C214E9522BB1BD97 /* ItemCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemCell.swift; sourceTree = "<group>"; };
1C73611D226B48C24DB37535 /* MasterViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MasterViewController.swift; sourceTree = "<group>"; };
1C73618272969871601AB817 /* alamojson.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = alamojson.swift; sourceTree = "<group>"; };
1C73620D01687FB4F1811C5C /* NetworkHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkHelper.swift; sourceTree = "<group>"; };
1C736260E748CF136FF37EA7 /* UploadOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UploadOperation.swift; sourceTree = "<group>"; };
1C7365B06FA66294E99AC2D3 /* NetworkManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkManager.swift; sourceTree = "<group>"; };
1C7367379DEE94EBF3FAFA78 /* VideoPlayerController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideoPlayerController.swift; sourceTree = "<group>"; };
1C73673DC671535E3A049F54 /* MediaPhotoController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaPhotoController.swift; sourceTree = "<group>"; };
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 = "<group>"; };
1C7368DC7EF11A553145E169 /* Kirschkeks-256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Kirschkeks-256x256.png"; sourceTree = "<group>"; };
@ -63,7 +66,6 @@
C98AF5D31B124D6A00D196CC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
C98AF5D41B124D6A00D196CC /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
C98AF5D71B124D6A00D196CC /* kplayer.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = kplayer.xcdatamodel; sourceTree = "<group>"; };
C98AF5D91B124D6A00D196CC /* MasterViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MasterViewController.swift; sourceTree = "<group>"; };
C98AF5DE1B124D6A00D196CC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
C98AF5E01B124D6A00D196CC /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
C98AF5E31B124D6A00D196CC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = "<group>"; };
@ -103,6 +105,22 @@
path = detail;
sourceTree = "<group>";
};
1C7363B608460DED4F522D1C /* photo */ = {
isa = PBXGroup;
children = (
1C73673DC671535E3A049F54 /* MediaPhotoController.swift */,
);
path = photo;
sourceTree = "<group>";
};
1C7364808E72BFA7575E75E1 /* master */ = {
isa = PBXGroup;
children = (
1C73611D226B48C24DB37535 /* MasterViewController.swift */,
);
path = master;
sourceTree = "<group>";
};
1C7365603CAE04E39B73D843 /* util */ = {
isa = PBXGroup;
children = (
@ -167,7 +185,6 @@
isa = PBXGroup;
children = (
C98AF5D41B124D6A00D196CC /* AppDelegate.swift */,
C98AF5D91B124D6A00D196CC /* MasterViewController.swift */,
C98AF5DD1B124D6A00D196CC /* Main.storyboard */,
C98AF5E01B124D6A00D196CC /* Images.xcassets */,
C98AF5E21B124D6A00D196CC /* LaunchScreen.xib */,
@ -177,6 +194,8 @@
1C7368DC7EF11A553145E169 /* Kirschkeks-256x256.png */,
1C7365603CAE04E39B73D843 /* util */,
1C73615846EE8B07DAAFD230 /* detail */,
1C7364808E72BFA7575E75E1 /* master */,
1C7363B608460DED4F522D1C /* photo */,
);
path = kplayer;
sourceTree = "<group>";
@ -360,7 +379,6 @@
files = (
C98AF5D81B124D6A00D196CC /* kplayer.xcdatamodeld in Sources */,
C98AF5D51B124D6A00D196CC /* AppDelegate.swift in Sources */,
C98AF5DA1B124D6A00D196CC /* MasterViewController.swift in Sources */,
1C736503B656C999E5E12081 /* NetworkManager.swift in Sources */,
1C736FB92B19FE17E4357C85 /* MediaItem.swift in Sources */,
1C73688D13E5A804880C8768 /* UIImageExtension.swift in Sources */,
@ -373,6 +391,8 @@
1C73640D928DE56D35175D39 /* UploadOperation.swift in Sources */,
1C73646F87B495A47D7943C7 /* NetData.swift in Sources */,
1C736C5DD23466269607E07F /* alamojson.swift in Sources */,
1C73693A1334A7792856FC58 /* MasterViewController.swift in Sources */,
1C7365885FAF292F2221ED44 /* MediaPhotoController.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

18
kplayer/Base.lproj/Main.storyboard

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7702" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="H1p-Uh-vWS">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7706" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="H1p-Uh-vWS">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7701"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
</dependencies>
<scenes>
<!--Master-->
@ -28,10 +28,10 @@
<viewControllerLayoutGuide type="bottom" id="GAO-Cl-Wes"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="svH-Pt-448">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<rect key="frame" x="0.0" y="0.0" width="600" height="536"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" text="Detail view content goes here" textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="0XM-y9-sOw">
<label clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" misplaced="YES" text="Detail view content goes here" textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="0XM-y9-sOw">
<rect key="frame" x="20" y="292" width="560" height="17"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<fontDescription key="fontDescription" type="system" size="system"/>
@ -46,6 +46,7 @@
<constraint firstAttribute="trailing" secondItem="0XM-y9-sOw" secondAttribute="trailing" constant="20" symbolic="YES" id="tHV-ZD-HQj"/>
</constraints>
</view>
<extendedEdge key="edgesForExtendedLayout" bottom="YES"/>
<toolbarItems/>
<navigationItem key="navigationItem" title="Detail" id="mOI-FS-AaM"/>
<connections>
@ -57,7 +58,7 @@
</objects>
<point key="canvasLocation" x="709" y="129"/>
</scene>
<!--Video-->
<!--Video Player Controller-->
<scene sceneID="6y1-jK-8xM">
<objects>
<viewController id="yqJ-Uz-RRd" customClass="VideoPlayerController" customModule="kplayer" customModuleProvider="target" sceneMemberID="viewController">
@ -70,8 +71,9 @@
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</view>
<extendedEdge key="edgesForExtendedLayout" bottom="YES"/>
<navigationItem key="navigationItem" title="Video" id="gsi-1J-w6z">
<extendedEdge key="edgesForExtendedLayout" top="YES"/>
<navigationItem key="navigationItem" id="gsi-1J-w6z">
<nil key="title"/>
<barButtonItem key="backBarButtonItem" title="back" id="mQc-4U-xZS"/>
<barButtonItem key="leftBarButtonItem" style="plain" id="cd5-8s-DNN">
<button key="customView" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="TxA-bq-Yuj">
@ -186,6 +188,6 @@
</scene>
</scenes>
<inferredMetricsTieBreakers>
<segue reference="Tll-UG-LXB"/>
<segue reference="6S0-TO-JiA"/>
</inferredMetricsTieBreakers>
</document>

32
kplayer/core/MediaItem.swift

@ -6,10 +6,14 @@
import Foundation
import UIKit
enum ItemType {
case FOLDER
case VIDEO
case SNAPSHOT
enum ItemType : String, Printable {
case FOLDER = "folder"
case VIDEO = "video"
case SNAPSHOT = "snapshot"
var description: String {
return self.rawValue
}
}
class MediaItem : DebugPrintable {
@ -25,7 +29,9 @@ class MediaItem : DebugPrintable {
var parent: MediaItem?
var type: ItemType
var index = 0
var loaded = false
var featured = true
init(name: String, path: String, root: String, type: ItemType) {
self.name = name
@ -35,6 +41,19 @@ class MediaItem : DebugPrintable {
children = [MediaItem]()
}
var sortName: String {
var sortName = name.stringByReplacingOccurrencesOfString("full", withString: "")
var fullNameArr = split(sortName) {$0 == "_"}
sortName = fullNameArr[0]
while count(sortName) < 6 {
sortName = "0" + sortName
}
return sortName
}
var thumbPath: String {
let len = count("/srv/samba/ren")
let tpath = "/srv/samba/ren/thumb" + (root as NSString).substringFromIndex(len) + "/" + path + "/" + name
@ -47,6 +66,11 @@ class MediaItem : DebugPrintable {
return NetworkManager.sharedInstance.baseurl + "/service/download" + thumbUrl!
}
var imageUrlAbsolute: String {
let imageUrl = thumbUrl!.stringByReplacingOccurrencesOfString("_thumb.jpg", withString: ".jpg")
return NetworkManager.sharedInstance.baseurl + "/service/download" + imageUrl
}
var fullPath: String {
let fpath = root + "/" + path + "/" + name

8
kplayer/core/NetworkManager.swift

@ -198,6 +198,12 @@ class NetworkManager {
})
}
func favItem(item: MediaItem) {
let url = baseurl + "/service/linkfav" + item.fullPath
Alamofire.request(.GET, url)
}
func saveItem(item: MediaItem) {
println (item.children)
@ -236,7 +242,7 @@ class NetworkManager {
let op = UploadOperation(baseUrl: self.baseurl + "/service/upload", data: imageData, path: p)
self.operationQueue.addOperation(op)
let thumb = c.image!.scaleToSize(14 * 16, height: 14 * 10)
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)

8
kplayer/detail/DetailViewController.swift

@ -65,8 +65,10 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.sectionInset = UIEdgeInsets(top: 2, left: 2, bottom: 2, right: 2)
layout.itemSize = CGSize(width: 14 * 16, height: 14 * 10)
layout.sectionInset = UIEdgeInsets(top: 1, left: 0, bottom: 1, right: 0)
layout.minimumInteritemSpacing = 0.0;
layout.itemSize = CGSize(width: (15 * 16) - 6, height: 15 * 9)
layout.headerReferenceSize = CGSize(width: 50, height: 50)
collectionView = UICollectionView(frame: view.frame, collectionViewLayout: layout)
@ -95,7 +97,7 @@ class DetailViewController: UIViewController, UICollectionViewDelegateFlowLayout
let index = notification.object as! Int
if let detail: MediaItem = self.detailItem {
if (count(detail.children) == 1) {
if (count(detail.children) > 100) {
self.collectionView.reloadData()
}
else {

23
kplayer/detail/ItemCell.swift

@ -7,13 +7,14 @@ import Foundation
import UIKit
import Haneke
var defaultImage = UIImage(named: "Kirschkeks-256x256.png")
class ItemCell: UICollectionViewCell {
var item: MediaItem?
var image: UIImageView!
required init(coder aDecoder: NSCoder)
{
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
@ -27,24 +28,28 @@ class ItemCell: UICollectionViewCell {
autolayout(["imag": image],
constraints:
"H:|-[imag]-|",
"V:|-[imag]-|" )
"H:|[imag]|",
"V:|[imag]|")
}
func setItem(item: MediaItem) {
self.item = item
if let url = item.thumbUrl {
image.hnk_setImageFromURL(NSURL(string: item.thumbUrlAbsolute)!)
}
else {
image.hnk_setImageFromURL(NSURL(string: item.thumbUrlAbsolute)!, placeholder: defaultImage)
} else {
if let i = item.image {
image.image = i.scaleToSize(14 * 16, height: 14 * 10)
image.image = i.scaleToSize(15 * 16, height: 15 * 9)
image.sizeToFit()
} else {
image.image = UIImage(named: "Kirschkeks-256x256.png")
image.image = defaultImage
}
}
}
override func prepareForReuse() {
image.hnk_cancelSetImage()
image.image = nil;
}
}

170
kplayer/detail/VideoPlayerController.swift

@ -17,6 +17,18 @@ class VideoPlayerController: UIViewController {
var buttons = Dictionary<UIButton, MediaItem>()
var barbutton: UIBarButtonItem?
var speedButton: UIBarButtonItem?
var playButton: UIBarButtonItem?
var backButton: UIBarButtonItem?
var reviewButton: UIBarButtonItem?
let speedOptions = [ 0.25, 0.5, 1.0, 2.0 ]
var speedOption = 2
var thumbnailTime: NSTimeInterval = 0.0
var edit = true
var index = 0
override func viewDidLoad() {
@ -26,12 +38,52 @@ class VideoPlayerController: UIViewController {
println(url)
let barbutton = UIBarButtonItem(barButtonSystemItem: .Action, target: self, action: Selector("twoFingersTwoTaps"));
navigationItem.rightBarButtonItems = [barbutton]
barbutton = UIBarButtonItem(barButtonSystemItem: .Action, target: self, action: Selector("twoFingersTwoTaps"));
navigationItem.rightBarButtonItems = [barbutton!]
backButton = UIBarButtonItem(barButtonSystemItem: .Cancel, target: self, action: Selector("back:"))
speedButton = UIBarButtonItem(title:"1.0", style:UIBarButtonItemStyle.Plain, target: self, action: Selector("speed:"))
playButton = UIBarButtonItem(barButtonSystemItem: .Play, target: self, action: Selector("startstop:"))
reviewButton = UIBarButtonItem(title:"Edit ", style:UIBarButtonItemStyle.Plain, target: self, action: Selector("doEdit:"))
navigationItem.leftBarButtonItems = [backButton!, playButton!, speedButton!, reviewButton!]
play(url)
}
func doEdit(sender: AnyObject) {
if (edit) {
edit = false
reviewButton!.tintColor = UIColor.blueColor()
}
else {
edit = true
reviewButton!.tintColor = UIColor.yellowColor()
}
}
func startstop(sender: AnyObject) {
if moviePlayer!.playbackState == MPMoviePlaybackState.Playing {
moviePlayer!.pause()
}
else {
moviePlayer!.play()
moviePlayer!.currentPlaybackRate = Float(speedOptions[speedOption])
}
println("play")
}
func speed(sender: AnyObject) {
if ++speedOption > 3 {
speedOption = 0
}
moviePlayer!.currentPlaybackRate = Float(speedOptions[speedOption])
speedButton!.title = "\(moviePlayer!.currentPlaybackRate)"
println("speed \(moviePlayer!.currentPlaybackRate)")
}
@IBAction func back(sender: AnyObject) {
if let player = self.moviePlayer {
player.stop()
@ -40,10 +92,11 @@ class VideoPlayerController: UIViewController {
}
func play(url: String) {
self.moviePlayer = ALMoviePlayerController(frame: CGRectMake(0, 0, 1024, 680))
self.moviePlayer = ALMoviePlayerController(frame: CGRectMake(0, 0, 1024, 768))
if let player = self.moviePlayer {
let movieControls = ALMoviePlayerControls(moviePlayer: player, style: ALMoviePlayerControlsStyleDefault);
movieControls.fadeDelay = 60
player.controls = movieControls
movieControls.style = ALMoviePlayerControlsStyleEmbedded
@ -53,14 +106,14 @@ class VideoPlayerController: UIViewController {
player.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height)
player.view.sizeToFit()
player.scalingMode = MPMovieScalingMode.AspectFill
player.scalingMode = MPMovieScalingMode.AspectFit
// player.controlStyle = MPMovieControlStyle.Embedded
player.movieSourceType = MPMovieSourceType.Streaming
player.repeatMode = MPMovieRepeatMode.One
player.contentURL = NSURL(string: url)
player.play()
var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("update"), userInfo: nil, repeats: false)
// player.play()
// var timer = NSTimer.scheduledTimerWithTimeInterval(0.8, target: self, selector: Selector("update"), userInfo: nil, repeats: false)
// view.autolayout(["controls": movieControls, "player": player.view],
// constraints:
@ -68,6 +121,8 @@ class VideoPlayerController: UIViewController {
// "H:|-[controls]-|",
// "V:|-[player]-[controls(<=50)]-|" )
self.view.addSubview(player.view)
installGestures(player.view)
update()
// view.addSubview(movieControls)
// player.setFrame(view.frame)
}
@ -123,37 +178,51 @@ class VideoPlayerController: UIViewController {
}
func thumbnailClicked(source: UIButton) {
println(source)
moviePlayer!.currentPlaybackTime = buttons[source]!.time!
moviePlayer!.currentPlaybackRate = Float(speedOptions[speedOption])
println("goto \(buttons[source]!.time!) is \(moviePlayer!.currentPlaybackTime)")
}
func update() {
if let player = self.moviePlayer {
installGestures(player.view)
if let t = currentItem!.time {
player.currentPlaybackTime = t
} else {
println(player.duration)
player.currentPlaybackTime = player.duration / 2
if !(player.duration > 0.0) { // player.loadState == MPMovieLoadState.Unknown || player.loadState == MPMovieLoadState.Stalled {
println("again")
var timer = NSTimer.scheduledTimerWithTimeInterval(0.3, target: self, selector: Selector("update"), userInfo: nil, repeats: false)
return
}
reviewButton!.title = currentItem!.name
if currentItem!.type == ItemType.SNAPSHOT {
player.currentPlaybackTime = currentItem!.time!
currentItem = currentItem!.parent
} else {
if !currentItem!.children.isEmpty {
player.currentPlaybackTime = currentItem!.children[0].time!
}
else {
println(player.duration)
player.currentPlaybackTime = player.duration / 2
}
}
navigationItem.rightBarButtonItems = [barbutton!]
for c in currentItem!.children {
addItemButton(c)
}
player.play()
// player.fullscreen = true
}
}
func enteredFullscreen() {
let mp = UIApplication.sharedApplication().keyWindow;
if let moviePlayerContainer = recursiveSearchForViewWithName(mp!, classname: "MPVideoContainerView") {
if let moviePlayerContainer = mp!.recursiveSearchForViewWithName("MPVideoContainerView") {
if (moviePlayerContainer.gestureRecognizers != nil) {
return;
}
@ -199,7 +268,30 @@ class VideoPlayerController: UIViewController {
func swipeUp() {
println("u")
if let player = self.moviePlayer {
println("Type: \(currentItem!.type) Count: \(count(currentItem!.children)) Index: \(index) Current: \(currentItem!.index)")
if !edit && (currentItem!.children.isEmpty || !(index < count(currentItem!.children) - 1)) {
println ("switch")
var newIndex = currentItem!.index + 1
if count(currentItem!.parent!.children) <= newIndex {
newIndex = 0
}
currentItem = currentItem!.parent!.children[newIndex]
println("'Switched Type: \(currentItem!.type) Count: \(count(currentItem!.children)) Index: \(index) Current: \(currentItem!.index)")
index = 0
player.contentURL = NSURL(string: NetworkManager.sharedInstance.playerURL(currentItem!))
player.play()
var timer = NSTimer.scheduledTimerWithTimeInterval(1.2, target: self, selector: Selector("update"), userInfo: nil, repeats: false)
return
}
if !(currentItem!.children.isEmpty) {
println ("switch internal")
if index < count(currentItem!.children) - 1 {
index++;
} else {
@ -207,6 +299,7 @@ class VideoPlayerController: UIViewController {
}
let child = currentItem!.children[index]
player.currentPlaybackTime = child.time!
moviePlayer!.currentPlaybackRate = Float(speedOptions[speedOption])
}
}
}
@ -215,13 +308,32 @@ class VideoPlayerController: UIViewController {
println("r")
if let player = self.moviePlayer {
player.currentPlaybackTime = player.currentPlaybackTime - 30.0
moviePlayer!.currentPlaybackRate = Float(speedOptions[speedOption])
}
}
func swipeDown() {
println("r")
println("d")
if let player = self.moviePlayer {
if !edit {
var newIndex = currentItem!.index - 1
if newIndex < 0 {
newIndex = 0
}
currentItem = currentItem!.parent!.children[newIndex]
index = 0;
player.contentURL = NSURL(string: NetworkManager.sharedInstance.playerURL(currentItem!))
player.play()
var timer = NSTimer.scheduledTimerWithTimeInterval(1.2, target: self, selector: Selector("update"), userInfo: nil, repeats: false)
return
}
player.currentPlaybackTime = player.currentPlaybackTime + 10.0
moviePlayer!.currentPlaybackRate = Float(speedOptions[speedOption])
}
}
@ -229,29 +341,21 @@ class VideoPlayerController: UIViewController {
println("l")
if let player = self.moviePlayer {
player.currentPlaybackTime = player.currentPlaybackTime + 30.0
moviePlayer!.currentPlaybackRate = Float(speedOptions[speedOption])
}
}
func twoFingersTwoTaps() {
println("tap")
moviePlayer!.requestThumbnailImagesAtTimes([moviePlayer!.currentPlaybackTime],
timeOption: MPMovieTimeOption.NearestKeyFrame);
if edit {
thumbnailTime = moviePlayer!.currentPlaybackTime
println("tap \(thumbnailTime)")
moviePlayer!.requestThumbnailImagesAtTimes([thumbnailTime],
timeOption: MPMovieTimeOption.Exact);
}
else {
NetworkManager.sharedInstance.favItem(currentItem!)
}
}
func recursiveSearchForViewWithName(view: UIView, classname: String) -> UIView? {
for v in view.subviews {
var result = recursiveSearchForViewWithName(v as! UIView, classname: classname)
let cn = toString(v.dynamicType)
if cn == classname {
return v as? UIView
}
if result != nil {
return result
}
}
return nil
}
}

127
kplayer/MasterViewController.swift → kplayer/master/MasterViewController.swift

@ -14,6 +14,7 @@ class MasterViewController: UITableViewController {
var detailViewController: DetailViewController? = nil
var items = [MediaItem]()
var itemsMap = Dictionary<String, MediaItem>()
override func awakeFromNib() {
super.awakeFromNib()
@ -23,74 +24,38 @@ class MasterViewController: UITableViewController {
}
}
override func viewDidLoad() {
super.viewDidLoad()
func addItem(item: MediaItem) {
let path = item.root + item.path
var folder = itemsMap[path]
NetworkManager.sharedInstance.loadDirs("/srv/samba/ren/knk_archiv4") { (g) in
var d = Dictionary<String, MediaItem>()
for f in g {
var p = d[f.path]
if folder == nil {
folder = MediaItem(name: "", path: item.path, root: item.root, type: ItemType.FOLDER)
itemsMap[path] = folder!
items.append(folder!)
}
if p == nil {
p = MediaItem(name: "", path: f.path, root: f.root, type: ItemType.FOLDER)
d[f.path] = p!
}
item.index = count(folder!.children)
folder!.children.append(item)
item.parent = folder
}
p!.children.append(f)
f.parent = p!
func loadDirs(dir: String) {
NetworkManager.sharedInstance.loadDirs(dir) { (g) in
for f in g {
self.addItem(f)
}
self.tableView.reloadData()
}
}
NetworkManager.sharedInstance.loadDirs("/srv/samba/ren/knk_archiv3") {
(g) in
for f in g {
var p = d[f.path]
if p == nil {
p = MediaItem(name: "", path: f.path, root: f.root, type: ItemType.FOLDER)
d[f.path] = p!
}
p!.children.append(f)
f.parent = p!
}
NetworkManager.sharedInstance.loadDirs("/srv/samba/ren/knk_archiv2") {
(g) in
for f in g {
var p = d[f.path]
if p == nil {
p = MediaItem(name: "", path: f.path, root: f.root, type: ItemType.FOLDER)
d[f.path] = p!
}
p!.children.append(f)
f.parent = p!
}
NetworkManager.sharedInstance.loadDirs("/srv/samba/ren/knk_archiv") {
(g) in
for f in g {
var p = d[f.path]
if p == nil {
p = MediaItem(name: "", path: f.path, root: f.root, type: ItemType.FOLDER)
d[f.path] = p!
}
p!.children.append(f)
f.parent = p!
}
self.items = Array(d.values)
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.reloadData()
}
}
}
}
loadDirs("/srv/samba/ren/fav")
loadDirs("/srv/samba/ren/knk_archiv")
loadDirs("/srv/samba/ren/knk_archiv2")
loadDirs("/srv/samba/ren/knk_archiv3")
loadDirs("/srv/samba/ren/knk_archiv4")
// Do any additional setup after loading the view, typically from a nib.
self.navigationItem.leftBarButtonItem = self.editButtonItem()
@ -113,15 +78,44 @@ class MasterViewController: UITableViewController {
func insertNewObject(sender: AnyObject) {
}
override func tableView(tableView: UITableView, accessoryButtonTappedForRowWithIndexPath indexPath: NSIndexPath) {
let pc = MediaPhotoController()
var i = [MediaItem]()
for it in items[indexPath.row].children {
for c in it.children {
i.append(c)
}
}
pc.items = i
pc.completionHandler = {
self.dismissViewControllerAnimated(true, completion: nil);
}
let navController = UINavigationController(rootViewController: pc) // Creating a navigation controller with pc at the root of the navigation stack.
presentViewController(navController, animated: false, completion: nil)
}
// MARK: - Segues
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "showDetail" {
if let indexPath = self.tableView.indexPathForSelectedRow() {
let object = items[indexPath.row]
let item = items[indexPath.row]
let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController
controller.detailItem = object
NetworkManager.sharedInstance.loadItems(object)
controller.detailItem = item
item.children.sort({
$0.sortName < $1.sortName
})
var j = 0
for i in item.children {
i.index = j++
}
NetworkManager.sharedInstance.loadItems(item)
controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
controller.navigationItem.leftItemsSupplementBackButton = true
}
@ -141,6 +135,9 @@ class MasterViewController: UITableViewController {
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell
self.configureCell(cell, atIndexPath: indexPath)
cell.accessoryType = UITableViewCellAccessoryType.DetailDisclosureButton
return cell
}

150
kplayer/photo/MediaPhotoController.swift

@ -0,0 +1,150 @@
//
// Created by Marco Schmickler on 04.06.15.
// Copyright (c) 2015 Marco Schmickler. All rights reserved.
//
import Foundation
import Nimbus
import Haneke
class MediaPhotoController: NIToolbarPhotoViewController, NIPhotoAlbumScrollViewDataSource, NIPhotoScrubberViewDataSource {
var items = [MediaItem]()
var completionHandler: ((Void) -> Void)?
override func viewDidLoad() {
super.viewDidLoad()
let backButton = UIBarButtonItem(barButtonSystemItem: .Cancel, target: self, action: Selector("back"))
navigationItem.leftBarButtonItems = [backButton]
setChromeVisibility(true, animated: true)
self.photoAlbumView.reloadData();
self.photoScrubberView.reloadData();
}
func back() {
completionHandler!()
}
override func loadView() {
super.loadView()
photoAlbumView.dataSource = self
photoScrubberView.dataSource = self
toolbarIsTranslucent = true
hidesChromeWhenScrolling = true
chromeCanBeHidden = true
scrubberIsEnabled = true
// Toolbar Setup
let bounds = self.view.bounds;
let toolbarHeight = CGFloat(120.0)
toolbar.frame = CGRectMake(0, bounds.size.height - toolbarHeight, bounds.size.width, toolbarHeight);
photoAlbumView.zoomingAboveOriginalSizeIsEnabled = true;
// This title will be displayed until we get the results back for the album information.
self.title = "loading"
// self.photoAlbumView.loadingImage = UIImage(named: "Kirschkeks-256x256.png")
println("\(count(items))")
}
func photoAlbumScrollView(photoAlbumScrollView: NIPhotoAlbumScrollView!, photoAtIndex: Int, photoSize: UnsafeMutablePointer<NIPhotoScrollViewPhotoSize>,
isLoading: UnsafeMutablePointer<ObjCBool>, originalPhotoDimensions: UnsafeMutablePointer<CGSize>) -> UIImage! {
let c = count(items)
println ("Index: \(photoAtIndex) of \(c)")
let newItem = items[photoAtIndex]
let URL = NSURL(string: newItem.imageUrlAbsolute)!
println (newItem.imageUrlAbsolute)
var image: UIImage? = nil
var size = NIPhotoScrollViewPhotoSizeUnknown
Shared.imageCache.fetch(URL: URL).onSuccess {
i in
image = i
size = NIPhotoScrollViewPhotoSizeOriginal
self.photoAlbumView.didLoadPhoto(image, atIndex:photoAtIndex, photoSize:size)
}
if let i = image {
isLoading[0] = false
}
else {
let URL = NSURL(string: newItem.thumbUrlAbsolute)!
println (newItem.thumbUrlAbsolute)
var image: UIImage? = nil
Shared.imageCache.fetch(URL: URL).onSuccess {
i in
image = i
size = NIPhotoScrollViewPhotoSizeThumbnail
self.photoAlbumView.didLoadPhoto(image, atIndex:photoAtIndex, photoSize:size)
}
isLoading[0] = true
}
photoSize[0] = size
// if image == nil { return UIImage(named: "Kirschkeks-256x256.png") }
// self.photoAlbumView.didLoadPhoto(image, atIndex:photoAtIndex, photoSize:size)
return image
}
func numberOfPagesInPagingScrollView(pagingScrollView: NIPagingScrollView) -> Int {
let c = count(items)
return c
}
/**
* Fetches a page that will be displayed at the given page index.
*
* You should always try to reuse pages by calling dequeueReusablePageWithIdentifier: on the
* paging scroll view before allocating a new page.
*/
func pagingScrollView(pagingScrollView: NIPagingScrollView, pageViewForIndex: Int) -> UIView {
let view = photoAlbumView.pagingScrollView(pagingScrollView, pageViewForIndex: pageViewForIndex) as! NIPhotoScrollView
view.maximumScale = 3;
return view;
}
func numberOfPhotosInScrubberView(photoScrubberView: NIPhotoScrubberView!) -> Int {
let c = count(items)
return c
}
/**
* Fetch the thumbnail image for the given photo index.
*
* Please read and understand the performance considerations for this data source.
*/
func photoScrubberView(photoScrubberView: NIPhotoScrubberView!, thumbnailAtIndex thumbnailIndex: Int) -> UIImage! {
if thumbnailIndex < 0 {
return nil
}
let c = count(items)
println ("Index: \(thumbnailIndex) of \(c)")
let newItem = items[thumbnailIndex]
let URL = NSURL(string: newItem.thumbUrlAbsolute)!
var image: UIImage? = nil
Shared.imageCache.fetch(URL: URL).onSuccess {
i in
image = i
self.photoScrubberView.didLoadThumbnail(i, atIndex: thumbnailIndex);
}
// if image == nil { return UIImage(named: "Kirschkeks-256x256.png") }
return image
}
}

17
kplayer/util/LayoutTools.swift

@ -41,5 +41,22 @@ public extension UIView {
}
}
func recursiveSearchForViewWithName(classname: String) -> UIView? {
for v in subviews {
let sv = v as! UIView
var result = sv.recursiveSearchForViewWithName(classname)
let cn = toString(v.dynamicType)
if cn == classname {
return v as? UIView
}
if result != nil {
return result
}
}
return nil
}
}
Loading…
Cancel
Save