private async Task <StreamContext> GetSteamContextFromVideoInfoAsync(VideoId videoId) { var embedPage = await EmbedPage.GetAsync(_httpClient, videoId); var playerConfig = embedPage.TryGetPlayerConfig() ?? throw VideoUnplayableException.Unplayable(videoId); var playerSourceUrl = embedPage.TryGetPlayerSourceUrl() ?? playerConfig.GetPlayerSourceUrl(); var playerSource = await PlayerSource.GetAsync(_httpClient, playerSourceUrl); var cipherOperations = playerSource.GetCipherOperations().ToArray(); var videoInfoResponse = await VideoInfoResponse.GetAsync(_httpClient, videoId, playerSource.GetSts()); var playerResponse = videoInfoResponse.GetPlayerResponse(); var previewVideoId = playerResponse.TryGetPreviewVideoId(); if (!string.IsNullOrWhiteSpace(previewVideoId)) { throw VideoRequiresPurchaseException.Preview(videoId, previewVideoId); } if (!playerResponse.IsVideoPlayable()) { throw VideoUnplayableException.Unplayable(videoId, playerResponse.TryGetVideoPlayabilityError()); } if (playerResponse.IsLive()) { throw VideoUnplayableException.LiveStream(videoId); } var streamInfoProviders = new List <IStreamInfoProvider>(); // Streams from video info streamInfoProviders.AddRange(videoInfoResponse.GetStreams()); // Streams from player response streamInfoProviders.AddRange(playerResponse.GetStreams()); // Streams from DASH manifest var dashManifestUrl = playerResponse.TryGetDashManifestUrl(); if (!string.IsNullOrWhiteSpace(dashManifestUrl)) { var dashManifest = await GetDashManifestAsync(dashManifestUrl, cipherOperations); streamInfoProviders.AddRange(dashManifest.GetStreams()); } return(new StreamContext(streamInfoProviders, cipherOperations)); }