             toItem: self.playerView, attribute: .Height, multiplier: self.playerView.videoBounds.width / self.playerView.videoBounds.height, constant: 0))
     }
 
+    private func updateViews() {
+        createLivePhotoButton.enabled = (posterFrameView.image != nil && exportSession == nil)
+        positionsLabel.stringValue = positionsLabelText
+    }
+
+    private var positionsLabelText: String {
+        guard let time = posterFrameTime else { return "" }
+        let duration = CMTimeGetSeconds(time)
+        let minutes = Int(floor(duration / 60))
+        let seconds = Int(floor(duration - Double(minutes) * 60))
+        let milliseconds = Int((duration - floor(duration)) * 100)
+        let timeString = String(format: "%02d:%02d.%02d", minutes, seconds, milliseconds)
+        return "Poster Frame: \(timeString)"
+    }
+
     @objc private func capturePosterFrame(sender: AnyObject?) {
         guard let cgImage = try? imageGenerator.copyCGImageAtTime(player.currentTime(), actualTime: nil) else { return }
         let image = NSImage(CGImage: cgImage, size: CGSize(width: CGImageGetWidth(cgImage), height: CGImageGetHeight(cgImage)))
         posterFrameView.image = image
         posterFrameTime = player.currentTime()
+        updateViews()
     }
 
     @objc private func createLivePhoto(sender: AnyObject?) {

        b.bezelStyle = .RoundedBezelStyle
        b.target = self
        b.action = "createLivePhoto:"
        b.bind("enabled", toObject: self.posterFrameView, withKeyPath: "image", options: [NSValueTransformerNameBindingOption: NSIsNotNilTransformerName])
    }

    init!(movieURL: NSURL) {

    private let player: AVPlayer
    private let playerItem: AVPlayerItem
    private let imageGenerator: AVAssetImageGenerator
    private var exportSession: AVAssetExportSession?
    private var posterFrameTime: CMTime?

    private let playerView: AVPlayerView = AVPlayerView() ※ { v in
        v.controlsStyle = .Floating
