/// <summary> /// Build a media item and add it to the list /// </summary> /// <param name="track">Track to build into a media item</param> private void BuildMediaItem(BaseTrack track) { // Create a media binding for later (this is used to // load the track streams as we need them). var binder = new MediaBinder { Token = JsonConvert.SerializeObject(track) }; binder.Binding += BindMediaSource; // Create the source, bind track metadata and use it to // create a playback item var source = MediaSource.CreateFromMediaBinder(binder); var mediaPlaybackItem = new MediaPlaybackItem(track.AsMediaSource(source)); // Apply display properties to this item var displayProperties = mediaPlaybackItem.GetDisplayProperties(); displayProperties.Type = MediaPlaybackType.Music; displayProperties.MusicProperties.Title = track.Title; displayProperties.MusicProperties.Artist = track.User.Username; displayProperties.Thumbnail = RandomAccessStreamReference.CreateFromUri(new Uri(track.ThumbnailUrl)); // Apply the properties mediaPlaybackItem.ApplyDisplayProperties(displayProperties); // Add this item to the list _mediaPlaybackList.Items.Add(mediaPlaybackItem); }
private MediaPlaybackItem GetPlaybackItem(Message message) { var token = message.Id.ToString(); var file = GetFile(message); var binder = new MediaBinder(); binder.Token = token; binder.Binding += Binder_Binding; var source = MediaSource.CreateFromMediaBinder(binder); var item = new MediaPlaybackItem(source); source.CustomProperties["file"] = file.Id; source.CustomProperties["message"] = message.Id; source.CustomProperties["chat"] = message.ChatId; source.CustomProperties["token"] = token; if (message.Content is MessageAudio audio) { var props = item.GetDisplayProperties(); props.Type = MediaPlaybackType.Music; props.MusicProperties.Title = string.IsNullOrEmpty(audio.Audio.Title) ? Strings.Resources.AudioUnknownTitle : audio.Audio.Title; props.MusicProperties.Artist = string.IsNullOrEmpty(audio.Audio.Performer) ? Strings.Resources.AudioUnknownArtist : audio.Audio.Performer; item.ApplyDisplayProperties(props); } _mapping[token] = message; return(item); }
public void AddToPlay(PlayModel play) { var item = playList.FirstOrDefault(x => x.songid == play.songid); if (item != null) { mediaPlaybackList.MoveTo(Convert.ToUInt32(playList.IndexOf(item))); return; } if (!play.pic.Contains("300w_300h_1e_1c")) { play.pic = play.pic + "@300w_300h_1e_1c.jpg"; } playList.Add(play); var binder = new MediaBinder(); binder.Token = play.songid.ToString(); binder.Binding += Binder_Binding; var source = MediaSource.CreateFromMediaBinder(binder); source.CustomProperties["id"] = play.songid; mediaPlaybackList.Items.Add(new MediaPlaybackItem(source)); mediaPlaybackList.MoveTo(Convert.ToUInt32(playList.IndexOf(play))); //var item = new MediaPlaybackItem(MediaSource.CreateFromUri(play.play_url)); //mediaPlaybackList.Items.Add(item); }
private async void PlayAll_Click(object sender, RoutedEventArgs e) { bool ExistCannotPlay = false; if (MediaPlayList.AlbumSongList.Items.Count != 0) { MediaPlayList.AlbumSongBackup.Clear(); MediaPlayList.AlbumSongList.Items.Clear(); } MusicPage.ThisPage.MediaControl.AutoPlay = true; MusicPage.ThisPage.MediaControl.MediaPlayer.Source = MediaPlayList.AlbumSongList; foreach (SearchSingleMusic item in AlbumCollection) { MediaPlayList.AlbumSongBackup.Add(new SearchSingleMusic(item.MusicName, item.Artist, item.Album, item.Duration, item.SongID[0], item.ImageUrl, item.MVid)); string uri = (await NeteaseMusicAPI.GetInstance().GetSongsUrlAsync(item.SongID)).Data[0].Url; if (uri == null) { ExistCannotPlay = true; continue; } //采用延迟加载技术,仅当该歌曲处于即将播放状态时才调用Binder_Binding加载资源 MediaBinder binder = new MediaBinder { Token = uri }; binder.Binding += Binder_Binding; MediaPlaybackItem Item = new MediaPlaybackItem(MediaSource.CreateFromMediaBinder(binder)); //与系统的SMTC集成 MediaItemDisplayProperties Props = Item.GetDisplayProperties(); Props.Type = Windows.Media.MediaPlaybackType.Music; Props.MusicProperties.Title = item.MusicName; Props.MusicProperties.Artist = item.Album; Item.ApplyDisplayProperties(Props); MediaPlayList.AlbumSongList.Items.Add(Item); } if (ExistCannotPlay) { ExistCannotPlay = false; ContentDialog dialog = new ContentDialog { Title = "抱歉", Content = "部分歌曲暂时无法播放,已自动忽略", CloseButtonText = "确定", Background = Application.Current.Resources["DialogAcrylicBrush"] as Brush }; await dialog.ShowAsync(); } }
// <SnippetBinderBinding> private void Binder_Binding(MediaBinder sender, MediaBindingEventArgs args) { // Get a deferral if you need to perform async operations // var deferral = args.GetDeferral(); var contentUri = new Uri("http://contoso.com/media/" + args.MediaBinder.Token); args.SetUri(contentUri); // Call complete after your async operations are complete // deferral.Complete(); }
private void Binder_Binding_StorageFile(MediaBinder sender, MediaBindingEventArgs args) { switch (args.MediaBinder.Token) { case "MyBindingToken1": args.SetStorageFile(binderFiles[0]); break; case "MyBindingToken2": args.SetStorageFile(binderFiles[1]); break; } }
// <SnippetBinderBindingAMS> private async void Binder_Binding_AdaptiveMediaSource(MediaBinder sender, MediaBindingEventArgs args) { var deferral = args.GetDeferral(); var contentUri = new Uri("http://contoso.com/media/" + args.MediaBinder.Token); AdaptiveMediaSourceCreationResult result = await AdaptiveMediaSource.CreateFromUriAsync(contentUri); if (result.MediaSource != null) { args.SetAdaptiveMediaSource(result.MediaSource); } args.SetUri(contentUri); deferral.Complete(); }
private PlaybackItem GetPlaybackItem(Message message) { var token = $"{message.ChatId}_{message.Id}"; var file = GetFile(message); var binder = new MediaBinder(); binder.Token = token; binder.Binding += Binder_Binding; var source = MediaSource.CreateFromMediaBinder(binder); var item = new PlaybackItem(source); source.CustomProperties["file"] = file.Id; source.CustomProperties["message"] = message.Id; source.CustomProperties["chat"] = message.ChatId; source.CustomProperties["token"] = token; item.File = file; item.Message = message; item.Token = token; if (message.Content is MessageAudio audio) { var performer = string.IsNullOrEmpty(audio.Audio.Performer) ? null : audio.Audio.Performer; var title = string.IsNullOrEmpty(audio.Audio.Title) ? null : audio.Audio.Title; if (performer == null && title == null) { item.Title = audio.Audio.FileName; item.Artist = string.Empty; } else { item.Title = string.IsNullOrEmpty(audio.Audio.Title) ? Strings.Resources.AudioUnknownTitle : audio.Audio.Title; item.Artist = string.IsNullOrEmpty(audio.Audio.Performer) ? Strings.Resources.AudioUnknownArtist : audio.Audio.Performer; } } _mapping[token] = item; return(item); }
private async void BindMediaSource(MediaBinder sender, MediaBindingEventArgs args) { var deferal = args.GetDeferral(); // Get the track data var track = JsonConvert.DeserializeObject <BaseTrack>(args.MediaBinder.Token); // Only run if the track exists if (track != null) { // Get the audio stream url for this track var audioStreamUri = await track.GetAudioStreamAsync(_youTubeClient); // If we are live and youtube, we get an adaptive stream url if (track.ServiceType == ServiceType.YouTube && track.IsLive) { var source = await AdaptiveMediaSource.CreateFromUriAsync(audioStreamUri); if (source.Status == AdaptiveMediaSourceCreationStatus.Success) { args.SetAdaptiveMediaSource(source.MediaSource); } } else if (track.ServiceType == ServiceType.Local) { var file = track.CustomProperties["File"] as StorageFile; args.SetStorageFile(file); } else if (track.ServiceType == ServiceType.ITunesPodcast) { args.SetUri(new Uri(track.AudioStreamUrl)); } else { // Set generic stream url. args.SetUri(audioStreamUri); } } deferal.Complete(); }
private void Binder_Binding(MediaBinder sender, MediaBindingEventArgs args) { var deferral = args.GetDeferral(); if (_mapping.TryGetValue(args.MediaBinder.Token, out Message message)) { var file = GetFile(message); if (file.Local.IsDownloadingCompleted) { args.SetUri(new Uri("file:///" + file.Local.Path)); deferral.Complete(); } else if (file.Local.CanBeDownloaded && !file.Local.IsDownloadingCompleted) { _inverse[args.MediaBinder.Token] = deferral; _binders[args.MediaBinder.Token] = args; _protoService.Send(new DownloadFile(file.Id, 10)); } } }
private void InitMediaBinder() { // <SnippetInitMediaBinder> _mediaPlaybackList = new MediaPlaybackList(); var binder = new MediaBinder(); binder.Token = "MyBindingToken1"; binder.Binding += Binder_Binding; _mediaPlaybackList.Items.Add(new MediaPlaybackItem(MediaSource.CreateFromMediaBinder(binder))); binder = new MediaBinder(); binder.Token = "MyBindingToken2"; binder.Binding += Binder_Binding; _mediaPlaybackList.Items.Add(new MediaPlaybackItem(MediaSource.CreateFromMediaBinder(binder))); _mediaPlayer = new MediaPlayer(); _mediaPlayer.Source = _mediaPlaybackList; mediaPlayerElement.SetMediaPlayer(_mediaPlayer); // </SnippetInitMediaBinder> }
private async void Binder_Binding(MediaBinder sender, MediaBindingEventArgs args) { var deferral = args.GetDeferral(); loading = true; var songid = Convert.ToInt32(args.MediaBinder.Token); var item = playList.FirstOrDefault(x => x.songid == songid); var url = await GetUrl(songid); if (url == null) { await DispatcherHelper.ExecuteOnUIThreadAsync(() => { Utils.ShowMessageToast("无法播放" + item.title + ",已从播放列表移除"); playList.Remove(item); }); mediaPlaybackList.Items.Remove(mediaPlaybackList.Items.FirstOrDefault(x => x.Source == sender.Source)); loading = false; return; } if (url.type == -1) { item.is_preview = true; } else { item.is_preview = false; } item.play_url = new Uri(url.cdns[0]); item.qualities = url.qualities; item.backup_url = url.cdns; var contentUri = item.play_url; args.SetUri(contentUri); loading = false; deferral.Complete(); }
private async void InitMediaBinder_StorageFile() { var filePicker = new FileOpenPicker(); //make a collection of all video types you want to support (for testing we are adding just 4). string[] fileTypes = new string[] { ".wmv", ".mp4", ".mkv", ".mp3" }; //Add your fileTypes to the FileTypeFilter list of filePicker. foreach (string fileType in fileTypes) { filePicker.FileTypeFilter.Add(fileType); } //Set picker start location to the video library filePicker.SuggestedStartLocation = PickerLocationId.VideosLibrary; _mediaPlaybackList = new MediaPlaybackList(); binderFiles = await filePicker.PickMultipleFilesAsync(); _mediaPlaybackList = new MediaPlaybackList(); var binder = new MediaBinder(); binder.Token = "MyBindingToken1"; binder.Binding += Binder_Binding_StorageFile; _mediaPlaybackList.Items.Add(new MediaPlaybackItem(MediaSource.CreateFromMediaBinder(binder))); binder = new MediaBinder(); binder.Token = "MyBindingToken2"; binder.Binding += Binder_Binding_StorageFile; _mediaPlaybackList.Items.Add(new MediaPlaybackItem(MediaSource.CreateFromMediaBinder(binder))); _mediaPlayer = new MediaPlayer(); _mediaPlayer.Source = _mediaPlaybackList; mediaPlayerElement.SetMediaPlayer(_mediaPlayer); mediaPlayerElement.MediaPlayer.Play(); }
private async void InitMediaBinder_StorageFile() { var filePicker = new FileOpenPicker(); //Add filetype filters. In this case wmv and mp4. filePicker.FileTypeFilter.Add(".wmv"); filePicker.FileTypeFilter.Add(".mp4"); filePicker.FileTypeFilter.Add(".mkv"); filePicker.FileTypeFilter.Add(".mp3"); //Set picker start location to the video library filePicker.SuggestedStartLocation = PickerLocationId.VideosLibrary; _mediaPlaybackList = new MediaPlaybackList(); binderFiles = await filePicker.PickMultipleFilesAsync(); _mediaPlaybackList = new MediaPlaybackList(); var binder = new MediaBinder(); binder.Token = "MyBindingToken1"; binder.Binding += Binder_Binding_StorageFile; _mediaPlaybackList.Items.Add(new MediaPlaybackItem(MediaSource.CreateFromMediaBinder(binder))); binder = new MediaBinder(); binder.Token = "MyBindingToken2"; binder.Binding += Binder_Binding_StorageFile; _mediaPlaybackList.Items.Add(new MediaPlaybackItem(MediaSource.CreateFromMediaBinder(binder))); _mediaPlayer = new MediaPlayer(); _mediaPlayer.Source = _mediaPlaybackList; mediaPlayerElement.SetMediaPlayer(_mediaPlayer); mediaPlayerElement.MediaPlayer.Play(); }
private void Binder_Binding(MediaBinder sender, MediaBindingEventArgs args) { args.SetUri(new Uri(sender.Token)); sender.Binding -= Binder_Binding; }
private async Task BindMediaSourceAsync(MediaBinder sender, MediaBindingEventArgs args) { var deferal = args.GetDeferral(); // Get the track data var track = JsonConvert.DeserializeObject <BaseTrack>(args.MediaBinder.Token); try { // Only run if the track exists if (track != null) { switch (track.ServiceType) { case ServiceTypes.YouTube: var youTubeAudioUrl = await track.GetAudioStreamAsync(_youTubeClient); if (!string.IsNullOrEmpty(youTubeAudioUrl)) { if (track.IsLive) { var source = await AdaptiveMediaSource.CreateFromUriAsync(new Uri(youTubeAudioUrl)); if (source.Status == AdaptiveMediaSourceCreationStatus.Success) { args.SetAdaptiveMediaSource(source.MediaSource); } } else { args.SetUri(new Uri(youTubeAudioUrl)); } } break; case ServiceTypes.Local: var fileToken = track.CustomProperties["file_token"].ToString(); var file = await StorageApplicationPermissions.FutureAccessList.GetFileAsync(fileToken); args.SetStorageFile(file); break; case ServiceTypes.ITunesPodcast: args.SetUri(new Uri(track.AudioStreamUrl)); break; default: // Get the audio stream url for this track var audioStreamUrl = await track.GetAudioStreamAsync(_youTubeClient); if (!string.IsNullOrEmpty(audioStreamUrl)) { // Set generic stream url. args.SetUri(new Uri(audioStreamUrl)); } break; } } } catch (Exception e) { // So we know an error has occured _telemetryService.TrackEvent("Media Item Load Fail", new Dictionary <string, string> { { "Message", e.Message }, { "Service Type", track.ServiceType.ToString() }, { "Item ID", track.TrackId } }); if (!(DeviceHelper.IsBackground || DeviceHelper.IsXbox)) { await DispatcherHelper.ExecuteOnUIThreadAsync(() => { App.NotificationManager?.Show("An error occurred while trying to play or preload the track '" + track?.Title + "' (" + track?.ServiceType + ").\n\nError message: " + e.Message, 6500); }); } } deferal.Complete(); }
private void BindMediaSource(MediaBinder sender, MediaBindingEventArgs args) => BindMediaSourceAsync(sender, args).FireAndForgetSafeAsync();
private async Task BindMediaSourceAsync(MediaBinder sender, MediaBindingEventArgs args) { var deferal = args.GetDeferral(); // Get the track data var track = JsonConvert.DeserializeObject <BaseTrack>(args.MediaBinder.Token); try { // Only run if the track exists if (track != null) { switch (track.ServiceType) { case ServiceTypes.YouTube: var youTubeAudioUrl = await track.GetAudioStreamAsync(_youTubeClient); if (!string.IsNullOrEmpty(youTubeAudioUrl)) { if (track.IsLive) { var source = await AdaptiveMediaSource.CreateFromUriAsync(new Uri(youTubeAudioUrl)); if (source.Status == AdaptiveMediaSourceCreationStatus.Success) { args.SetAdaptiveMediaSource(source.MediaSource); } } else { args.SetUri(new Uri(youTubeAudioUrl)); } } break; case ServiceTypes.SoundCloud: case ServiceTypes.SoundCloudV2: // Build the url for soundcloud var soundcloudStreamUrl = await track.GetAudioStreamAsync(_youTubeClient); // SoundCloud now requires auth feeds var scConnected = SoundByteService.Current.IsServiceConnected(ServiceTypes.SoundCloud); if (!scConnected) { throw new Exception("You must be logged into your SoundCloud account to play music from SoundCloud!"); } // Get scheme and token var scheme = SoundByteService.Current.Services.FirstOrDefault(x => x.Service == ServiceTypes.SoundCloud)?.AuthenticationScheme; var token = SoundByteService.Current.Services.FirstOrDefault(x => x.Service == ServiceTypes.SoundCloud)?.UserToken?.AccessToken; // Client with Auth var client = new Windows.Web.Http.HttpClient(); client.DefaultRequestHeaders.Authorization = new HttpCredentialsHeaderValue(scheme, token); var stream = await HttpRandomAccessStream.CreateAsync(client, new Uri(soundcloudStreamUrl)); args.SetStream(stream, stream.ContentType); break; case ServiceTypes.Local: var fileToken = track.CustomProperties["file_token"].ToString(); var file = await StorageApplicationPermissions.FutureAccessList.GetFileAsync(fileToken); args.SetStorageFile(file); break; case ServiceTypes.ITunesPodcast: args.SetUri(new Uri(track.AudioStreamUrl)); break; default: // Get the audio stream url for this track var audioStreamUrl = await track.GetAudioStreamAsync(_youTubeClient); if (!string.IsNullOrEmpty(audioStreamUrl)) { // Set generic stream url. args.SetUri(new Uri(audioStreamUrl)); } break; } } } catch (Exception e) { // So we know an error has occured _telemetryService.TrackEvent("Media Item Load Fail", new Dictionary <string, string> { { "Message", e.Message }, { "Service Type", track.ServiceType.ToString() }, { "Item ID", track.TrackId } }); if (!(DeviceHelper.IsBackground || DeviceHelper.IsXbox)) { await DispatcherHelper.ExecuteOnUIThreadAsync(() => { App.NotificationManager?.Show("An error occurred while trying to play or preload the track '" + track?.Title + "' (" + track?.ServiceType + ").\n\nError message: " + e.Message, 6500); }); } } deferal.Complete(); }