public override void DidResolveMediaSelection(NSUrlSession session, AVAssetDownloadTask assetDownloadTask, AVMediaSelection resolvedMediaSelection)
        {
            Log.Debug($"DidResolveMediaSelection: {assetDownloadTask?.TaskDescription} | {resolvedMediaSelection.Asset}");

            // You should be sure to use this delegate callback to keep a reference
            // to `resolvedMediaSelection` so that in the future you can use it to
            // download additional media selections.

            mediaSelectionMap [assetDownloadTask] = resolvedMediaSelection;
        }
        public override void DidFinishDownloadingToUrl(NSUrlSession session, AVAssetDownloadTask assetDownloadTask, NSUrl location)
        {
            //Log.Debug ($"DidFinishDownloadingToUrl: {assetDownloadTask?.TaskDescription} | {location}");

            // This delegate callback should only be used to save the location URL
            // somewhere in your application. Any additional work should be done in
            // `URLSessionTaskDelegate.urlSession(_:task:didCompleteWithError:)`.

            MusicAsset asset;

            if (activeDownloadsMap.TryGetValue(assetDownloadTask, out asset))
            {
                SettingsStudio.Settings.SetSetting(asset.Id, location.RelativePath);
            }
        }
        public override void DidLoadTimeRange(NSUrlSession session, AVAssetDownloadTask assetDownloadTask, CMTimeRange timeRange, NSValue [] loadedTimeRanges, CMTimeRange timeRangeExpectedToLoad)
        {
            //Log.Debug ($"DidLoadTimeRange: {assetDownloadTask?.TaskDescription}");

            var asset = activeDownloadsMap [assetDownloadTask];

            if (asset != null)
            {
                var percentComplete = 0.0;

                // Iterate through the loaded time ranges
                foreach (var val in loadedTimeRanges)
                {
                    // Unwrap the CMTimeRange from the NSValue
                    var loadedTimeRange = val.CMTimeRangeValue;

                    // Calculate the percentage of the total expected asset duration
                    percentComplete += loadedTimeRange.Duration.Seconds / timeRangeExpectedToLoad.Duration.Seconds;
                }

                AssetDownloadProgressChanged?.Invoke(this, new MusicAssetDownloadProgressChangeArgs(asset.Music, percentComplete));
            }
        }