async void _device_PlaybackStopped(object sender, PlaybackStoppedEventArgs e) { if (_disposed) { return; } try { var streamInfo = await StreamParams.ParseFromUrl(e.MediaInfo.Url, _libraryManager, _mediaSourceManager) .ConfigureAwait(false); if (streamInfo.Item == null) { return; } var progress = GetProgressInfo(e.MediaInfo, streamInfo); var positionTicks = progress.PositionTicks; ReportPlaybackStopped(e.MediaInfo, streamInfo, positionTicks); var duration = streamInfo.MediaSource == null ? (_device.Duration == null ? (long?)null : _device.Duration.Value.Ticks) : streamInfo.MediaSource.RunTimeTicks; var playedToCompletion = (positionTicks.HasValue && positionTicks.Value == 0); if (!playedToCompletion && duration.HasValue && positionTicks.HasValue) { double percent = positionTicks.Value; percent /= duration.Value; playedToCompletion = Math.Abs(1 - percent) <= .1; } if (playedToCompletion) { await SetPlaylistIndex(_currentPlaylistIndex + 1).ConfigureAwait(false); } else { Playlist.Clear(); } } catch (Exception ex) { _logger.ErrorException("Error reporting playback stopped", ex); } }
private async void OnDevicePlaybackStopped(object sender, PlaybackStoppedEventArgs e) { if (_disposed) { return; } try { var streamInfo = StreamParams.ParseFromUrl(e.MediaInfo.Url, _libraryManager, _mediaSourceManager); if (streamInfo.Item == null) { return; } var positionTicks = GetProgressPositionTicks(streamInfo); await ReportPlaybackStopped(streamInfo, positionTicks).ConfigureAwait(false); var mediaSource = await streamInfo.GetMediaSource(CancellationToken.None).ConfigureAwait(false); var duration = mediaSource == null ? (_device.Duration == null ? (long?)null : _device.Duration.Value.Ticks) : mediaSource.RunTimeTicks; var playedToCompletion = positionTicks.HasValue && positionTicks.Value == 0; if (!playedToCompletion && duration.HasValue && positionTicks.HasValue) { double percent = positionTicks.Value; percent /= duration.Value; playedToCompletion = Math.Abs(1 - percent) <= .1; } if (playedToCompletion) { await SetPlaylistIndex(_currentPlaylistIndex + 1).ConfigureAwait(false); } else { _playlist.Clear(); } } catch (Exception ex) { _logger.LogError(ex, "Error reporting playback stopped"); } }