                                   name: kCMTimebaseNotification_EffectiveRateChanged as NSNotification.Name,
                                   object: player.currentItem)
         }
+        player.currentItem?.asset.removeObserver(self, forKeyPath: #keyPath(AVAsset.duration))
     }
 }

            if let token = timebaseRangeToken {
                center.removeObserver(token)
            }

            guard let timebase: CMTimebase = newValue() else { return }
            
            weak var this = self

            }
            
        case #keyPath(AVPlayerItem.asset):
            guard let new: AVAsset = newValue() else { return }
            emit(.didChangeAsset(new))
            
            let old: AVAsset? = oldValue()
            old?.removeObserver(self, forKeyPath: #keyPath(AVAsset.duration))
            new.addObserver(self,
                            forKeyPath: #keyPath(AVAsset.duration),
                            options: [.initial, .new],
                            context: nil)
            
        case #keyPath(AVAsset.duration):
            guard let object = object as? AVAsset else { return }
            guard case .loaded = object.statusOfValue(forKey: "duration", error: nil) else { return }
            guard let duration: CMTime = newValue() else { return }
            emit(.didChangeItemDuration(to: duration))
            
        default:
            super.observeValue(
