                 // Player item is not yet ready.
             }
         }
+
+        if keyPath == #keyPath(AVPlayerItem.isPlaybackLikelyToKeepUp) {
+            // Preloaded enough that it should play smoothly.
+            // If going to play at this point, check not curently .paused status
+        }
+
+        if keyPath == #keyPath(AVPlayerItem.isPlaybackBufferEmpty) {
+            // Playback likely to stall or end.
+        }
     }
     
     deinit {

        // Add observers for metadata and item status, respectively.
        playerItem?.addObserver(self, forKeyPath: observedValue, options: NSKeyValueObservingOptions.new, context: nil)
        playerItem?.addObserver(self, forKeyPath: #keyPath(AVPlayerItem.status), options: [.old, .new], context: nil)

        // Update metadata.
        update()

    fileprivate func removeObservers() {
        playerItem?.removeObserver(self, forKeyPath: observedValue)
        playerItem?.removeObserver(self, forKeyPath: #keyPath(AVPlayerItem.status))
        playerItem?.removeObserver(self, forKeyPath: #keyPath(AVPlayerItem.isPlaybackLikelyToKeepUp))
        playerItem?.removeObserver(self, forKeyPath: #keyPath(AVPlayerItem.isPlaybackBufferEmpty))
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)
    }

    /// Item Metadata
