private LiveStreamData MakeStreamData(TwitchStreamData streamData, TwitchGamesResponse gamesResponse, TwitchUsersResponse usersResponse) { var gameData = gamesResponse.Data.Find(x => streamData.Game_id == x.Id); if (gameData == null) { _logger.LogWarning($"{nameof(gameData)} Is Null; gameId: {streamData.Game_id};UserId: {streamData.User_id}; StreamName {streamData.Title}"); } if (gameData?.Name == null) { _logger.LogWarning($"Twitch Game with Id {streamData.Game_id} not found"); } var gameName = gameData?.Name ?? gameData?.Id ?? "Unknown game"; var userData = usersResponse.Data.Find(x => streamData.User_id == x.Id); if (userData == null) { throw new InvalidOperationException($"{nameof(userData)} Is Null; gameId: {streamData.Game_id};UserId: {streamData.User_id} StreamName {streamData.Title}"); } if (userData.Login == null) { _logger.LogError($"Twitch User with Id {streamData.User_id} not found"); return(null); } var lsData = new LiveStreamData() { StreamName = streamData.Title, GameName = gameName, UserName = userData.Login, ChannelUrl = GetChannelUrl(userData.Login), StartedAt = streamData.Started_at, Type = streamData.Type }; return(lsData); }
private async Task<ChannelMediaInfo> GetLiveStream(string id, bool isChannel, CancellationToken cancellationToken) { await _liveStreamSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false); try { var service = ActiveService; ChannelMediaInfo info; if (isChannel) { var channel = GetInternalChannel(id); _logger.Info("Opening channel stream from {0}, external channel Id: {1}", service.Name, channel.ExternalId); info = await service.GetChannelStream(channel.ExternalId, cancellationToken).ConfigureAwait(false); } else { var recordings = await service.GetRecordingsAsync(cancellationToken).ConfigureAwait(false); var recording = recordings.First(i => _tvDtoService.GetInternalRecordingId(service.Name, i.Id) == new Guid(id)); _logger.Info("Opening recording stream from {0}, external recording Id: {1}", service.Name, recording.Id); info = await service.GetRecordingStream(recording.Id, cancellationToken).ConfigureAwait(false); } _logger.Info("Live stream info: {0}", _jsonSerializer.SerializeToString(info)); Sanitize(info); var data = new LiveStreamData { Info = info, ConsumerCount = 1, IsChannel = isChannel, ItemId = id }; _openStreams.AddOrUpdate(info.Id, data, (key, i) => data); return info; } catch (Exception ex) { _logger.ErrorException("Error getting channel stream", ex); throw; } finally { _liveStreamSemaphore.Release(); } }
private async Task<MediaSourceInfo> GetLiveStream(string id, string mediaSourceId, bool isChannel, CancellationToken cancellationToken) { await _liveStreamSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false); if (string.Equals(id, mediaSourceId, StringComparison.OrdinalIgnoreCase)) { mediaSourceId = null; } try { MediaSourceInfo info; bool isVideo; if (isChannel) { var channel = GetInternalChannel(id); isVideo = channel.ChannelType == ChannelType.TV; var service = GetService(channel); _logger.Info("Opening channel stream from {0}, external channel Id: {1}", service.Name, channel.ExternalId); info = await service.GetChannelStream(channel.ExternalId, mediaSourceId, cancellationToken).ConfigureAwait(false); info.RequiresClosing = true; if (info.RequiresClosing) { var idPrefix = service.GetType().FullName.GetMD5().ToString("N") + "_"; info.LiveStreamId = idPrefix + info.Id; } } else { var recording = await GetInternalRecording(id, cancellationToken).ConfigureAwait(false); isVideo = !string.Equals(recording.MediaType, MediaType.Audio, StringComparison.OrdinalIgnoreCase); var service = GetService(recording); _logger.Info("Opening recording stream from {0}, external recording Id: {1}", service.Name, recording.ExternalId); info = await service.GetRecordingStream(recording.ExternalId, null, cancellationToken).ConfigureAwait(false); info.RequiresClosing = true; if (info.RequiresClosing) { var idPrefix = service.GetType().FullName.GetMD5().ToString("N") + "_"; info.LiveStreamId = idPrefix + info.Id; } } _logger.Info("Live stream info: {0}", _jsonSerializer.SerializeToString(info)); Normalize(info, isVideo); var data = new LiveStreamData { Info = info, IsChannel = isChannel, ItemId = id }; _openStreams.AddOrUpdate(info.Id, data, (key, i) => data); return info; } catch (Exception ex) { _logger.ErrorException("Error getting channel stream", ex); throw; } finally { _liveStreamSemaphore.Release(); } }
public static string CreateStreamMessage(LiveStreamData liveStreamData) { return($"{liveStreamData.UserName}; {liveStreamData.GameName}; {liveStreamData.StartedAt}; {liveStreamData.Type}; {liveStreamData.StreamName}; {liveStreamData.ChannelUrl}"); }