You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
361 lines
13 KiB
361 lines
13 KiB
//
|
|
// Created by Marco Schmickler on 26.05.15.
|
|
// Copyright (c) 2015 Marco Schmickler. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import UIKit
|
|
import MediaPlayer
|
|
import ALMoviePlayerController
|
|
import Haneke
|
|
|
|
class VideoPlayerController: UIViewController {
|
|
var moviePlayer: ALMoviePlayerController?
|
|
var currentItem: MediaItem?
|
|
|
|
var completionHandler: ((Void) -> Void)?
|
|
|
|
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() {
|
|
super.viewDidLoad()
|
|
|
|
var url = NetworkManager.sharedInstance.playerURL(currentItem!)
|
|
|
|
println(url)
|
|
|
|
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()
|
|
}
|
|
completionHandler!()
|
|
}
|
|
|
|
func play(url: String) {
|
|
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
|
|
|
|
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("exitedFullscreen"), name: MPMoviePlayerDidExitFullscreenNotification, object: nil);
|
|
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("enteredFullscreen"), name: MPMoviePlayerDidEnterFullscreenNotification, object: nil);
|
|
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("showThumbnail:"), name: MPMoviePlayerThumbnailImageRequestDidFinishNotification, object: nil);
|
|
|
|
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.AspectFit
|
|
// 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)
|
|
|
|
// 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)
|
|
}
|
|
}
|
|
|
|
func showThumbnail(note: NSNotification) {
|
|
let userInfo = note.userInfo! as NSDictionary
|
|
let thumbnail = userInfo.objectForKey(MPMoviePlayerThumbnailImageKey) as! UIImage
|
|
let time = userInfo.objectForKey(MPMoviePlayerThumbnailTimeKey) as! NSTimeInterval
|
|
|
|
let newItem = MediaItem(name: currentItem!.name, path: currentItem!.path, root: currentItem!.root, type: ItemType.SNAPSHOT)
|
|
newItem.image = thumbnail
|
|
newItem.time = time
|
|
newItem.parent = currentItem!
|
|
currentItem!.children.append(newItem)
|
|
|
|
println(newItem.time)
|
|
|
|
addItemButton(newItem)
|
|
}
|
|
|
|
func addItemButton(newItem: MediaItem) {
|
|
let frame = CGRectMake(0, 0, 66.0, 44.0);
|
|
|
|
let button = UIButton(frame: frame)
|
|
button.showsTouchWhenHighlighted = true
|
|
button.addTarget(self, action: "thumbnailClicked:", forControlEvents: .TouchDown)
|
|
|
|
if newItem.image != nil {
|
|
let icon = newItem.image!.scaleToSize(66.0, height: 44.0)
|
|
|
|
button.setBackgroundImage(icon, forState: UIControlState.Normal);
|
|
} else {
|
|
if newItem.thumbUrl != nil {
|
|
let URL = NSURL(string: newItem.thumbUrlAbsolute)!
|
|
|
|
Shared.imageCache.fetch(URL: URL).onSuccess {
|
|
i in
|
|
let icon = i.scaleToSize(66.0, height: 44.0)
|
|
button.setBackgroundImage(icon, forState: UIControlState.Normal);
|
|
}
|
|
}
|
|
}
|
|
|
|
let barbutton = UIBarButtonItem(customView: button);
|
|
|
|
if navigationItem.rightBarButtonItems == nil {
|
|
navigationItem.rightBarButtonItems = []
|
|
}
|
|
navigationItem.rightBarButtonItems!.append(barbutton)
|
|
|
|
buttons[button] = newItem
|
|
}
|
|
|
|
func thumbnailClicked(source: UIButton) {
|
|
|
|
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 {
|
|
|
|
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 = mp!.recursiveSearchForViewWithName("MPVideoContainerView") {
|
|
if (moviePlayerContainer.gestureRecognizers != nil) {
|
|
return;
|
|
}
|
|
installGestures(moviePlayerContainer)
|
|
}
|
|
}
|
|
|
|
func exitedFullscreen() {
|
|
moviePlayer!.view.removeFromSuperview();
|
|
moviePlayer = nil;
|
|
NSNotificationCenter.defaultCenter().removeObserver(self);
|
|
|
|
}
|
|
|
|
func installGestures(moviePlayer: UIView) {
|
|
let twoFingersTwoTaps = UITapGestureRecognizer(target: self, action: "twoFingersTwoTaps")
|
|
twoFingersTwoTaps.numberOfTapsRequired = 2
|
|
twoFingersTwoTaps.numberOfTouchesRequired = 2
|
|
moviePlayer.addGestureRecognizer(twoFingersTwoTaps)
|
|
|
|
let sR = UISwipeGestureRecognizer(target: self, action: "swipeRight")
|
|
sR.direction = UISwipeGestureRecognizerDirection.Right
|
|
sR.numberOfTouchesRequired = 1
|
|
moviePlayer.addGestureRecognizer(sR)
|
|
|
|
let sL = UISwipeGestureRecognizer(target: self, action: "swipeLeft")
|
|
sL.direction = UISwipeGestureRecognizerDirection.Left
|
|
sL.numberOfTouchesRequired = 1
|
|
moviePlayer.addGestureRecognizer(sL)
|
|
|
|
let sR2 = UISwipeGestureRecognizer(target: self, action: "swipeDown")
|
|
sR2.direction = UISwipeGestureRecognizerDirection.Down
|
|
sR2.numberOfTouchesRequired = 1
|
|
moviePlayer.addGestureRecognizer(sR2)
|
|
|
|
let sR3 = UISwipeGestureRecognizer(target: self, action: "swipeUp")
|
|
sR3.direction = UISwipeGestureRecognizerDirection.Up
|
|
sR3.numberOfTouchesRequired = 1
|
|
moviePlayer.addGestureRecognizer(sR3)
|
|
|
|
}
|
|
|
|
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 {
|
|
index = 0;
|
|
}
|
|
let child = currentItem!.children[index]
|
|
player.currentPlaybackTime = child.time!
|
|
moviePlayer!.currentPlaybackRate = Float(speedOptions[speedOption])
|
|
}
|
|
}
|
|
}
|
|
|
|
func swipeRight() {
|
|
println("r")
|
|
if let player = self.moviePlayer {
|
|
player.currentPlaybackTime = player.currentPlaybackTime - 30.0
|
|
moviePlayer!.currentPlaybackRate = Float(speedOptions[speedOption])
|
|
}
|
|
}
|
|
|
|
func swipeDown() {
|
|
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])
|
|
}
|
|
}
|
|
|
|
func swipeLeft() {
|
|
println("l")
|
|
if let player = self.moviePlayer {
|
|
player.currentPlaybackTime = player.currentPlaybackTime + 30.0
|
|
moviePlayer!.currentPlaybackRate = Float(speedOptions[speedOption])
|
|
}
|
|
}
|
|
|
|
func twoFingersTwoTaps() {
|
|
if edit {
|
|
thumbnailTime = moviePlayer!.currentPlaybackTime
|
|
println("tap \(thumbnailTime)")
|
|
moviePlayer!.requestThumbnailImagesAtTimes([thumbnailTime],
|
|
timeOption: MPMovieTimeOption.Exact);
|
|
}
|
|
else {
|
|
NetworkManager.sharedInstance.favItem(currentItem!)
|
|
}
|
|
}
|
|
|
|
|
|
}
|