示例#1
0
        public StreamHelpers.GetStreamsResult FetchStreams(int id)
        {
            bool isLive = false;

            using (var context = new MainDataContext()) {
                Streamer data = context.Streamers.FirstOrDefault(item => item.streamerId == id);

                if (data != null && data.isLive != null)
                {
                    isLive = (bool)data.isLive;
                }
            }

            TwitchApiHelpers twitchApiHelpers = new TwitchApiHelpers();
            var response = twitchApiHelpers.TwitchRequest("https://api.twitch.tv/helix/videos" +
                                                          $"?user_id={id}" +
                                                          "&first=100", Method.GET);
            var deserializeResponse =
                JsonConvert.DeserializeObject <StreamHelpers.GetStreamsResult>(response.Content);

            StreamHelpers.GetStreamsResult getStreamsResult =
                new StreamHelpers.GetStreamsResult();
            getStreamsResult.data = new List <StreamHelpers.Data>();
            string cursor;

            foreach (var stream in deserializeResponse.data)
            {
                if (isLive && stream.thumbnail_url.Length > 0)
                {
                    getStreamsResult.data.Add(stream);
                }
                else if (!isLive)
                {
                    getStreamsResult.data.Add(stream);
                }
            }

            if (deserializeResponse.pagination.cursor != null && deserializeResponse.data.Count >= 100)
            {
                cursor = deserializeResponse.pagination.cursor;
            }
            else
            {
                cursor = null;
            }

            while (cursor != null)
            {
                var paginatedResponse = twitchApiHelpers.TwitchRequest("https://api.twitch.tv/helix/videos" +
                                                                       $"?user_id={id}" +
                                                                       "&first=100" +
                                                                       $"&after={deserializeResponse.pagination.cursor}",
                                                                       Method.GET);
                deserializeResponse =
                    JsonConvert.DeserializeObject <StreamHelpers.GetStreamsResult>(paginatedResponse
                                                                                   .Content);


                foreach (var stream in deserializeResponse.data)
                {
                    if (isLive && stream.thumbnail_url.Length > 0)
                    {
                        getStreamsResult.data.Add(stream);
                    }
                    else if (!isLive)
                    {
                        getStreamsResult.data.Add(stream);
                    }
                }

                if (deserializeResponse.data.Count >= 100)
                {
                    cursor = deserializeResponse.pagination.cursor;
                }
                else
                {
                    cursor = null;
                }
            }

            for (int x = 0; x < getStreamsResult.data.Count; x++)
            {
                /*if (getStreamsResult.data[x].type != "archive") {
                 *  // only retrieve vods
                 *  getStreamsResult.data.Remove(getStreamsResult.data[x]);
                 * }*/

                // manually add thumbnail dimensions because twitch is too lazy to do it
                getStreamsResult.data[x].thumbnail_url = getStreamsResult.data[x].thumbnail_url
                                                         .Replace("%{width}", "320").Replace("%{height}", "180");
            }

            return(getStreamsResult);
        }
示例#2
0
        public void UpdateLiveStatus(List <Streamer> listOfStreamers)
        {
            string listOfIds = "?user_id=";

            for (int i = 0; i < listOfStreamers.Count; i++)
            {
                if (i != listOfStreamers.Count - 1)
                {
                    listOfIds += listOfStreamers[i].streamerId + "&user_id=";
                }
                else
                {
                    listOfIds += listOfStreamers[i].streamerId;
                }
            }

            TwitchApiHelpers twitchApiHelpers = new TwitchApiHelpers();
            var response = twitchApiHelpers.TwitchRequest($"https://api.twitch.tv/helix/streams{listOfIds}&first=100",
                                                          Method.GET);

            StreamHelpers.GetStreamsResult liveStream =
                JsonConvert.DeserializeObject <StreamHelpers.GetStreamsResult>(response.Content);

            for (int x = 0; x < listOfStreamers.Count; x++)
            {
                var stream = liveStream.data.FirstOrDefault(item => item.user_id == listOfStreamers[x].streamerId);

                if (stream != null && stream.type == "live")
                {
                    // if live and if not a re-run or something else

                    using (var context = new MainDataContext()) {
                        var alreadyExistingStream =
                            context.Streams.FirstOrDefault(item => item.vodId == Int64.Parse(stream.id));

                        var streamer =
                            context.Streamers.FirstOrDefault(item => item.streamerId == listOfStreamers[x].streamerId);

                        if (streamer.isLive == false)
                        {
                            streamer.isLive = true;
                            context.SaveChanges();
                        }

                        NotificationHub.Current.Clients.All.SendAsync($"{streamer.id}Live",
                                                                      true);

                        if (streamer.getLive == false || alreadyExistingStream != null)
                        {
                            // already downloading/downloaded, or user does not want to download this streamers live stream
                            continue;
                        }
                    }

                    if (DateTime.UtcNow.Subtract(stream.started_at).TotalMinutes < 5)
                    {
                        // queue up the stream to be downloaded
                        StreamExtended convertedLiveStream = new StreamExtended {
                            streamId   = StreamHelpers.GetStreamDetails(Int64.Parse(stream.id), true, stream.user_id).streamId,
                            vodId      = Int64.Parse(stream.id),
                            streamerId = stream.user_id,
                            title      = stream.title,
                            createdAt  = stream.started_at
                        };

                        CreateLiveStream createLiveStream = new CreateLiveStream();
                        createLiveStream.PrepareLiveStreamDownload(convertedLiveStream, stream.user_login);
                    }
                }
                else
                {
                    using (var context = new MainDataContext()) {
                        var streamer =
                            context.Streamers.FirstOrDefault(item => item.streamerId == listOfStreamers[x].streamerId);

                        if (streamer.isLive == true)
                        {
                            streamer.isLive = false;
                            context.SaveChanges();
                        }

                        NotificationHub.Current.Clients.All.SendAsync($"{streamer.id}Live",
                                                                      false);
                    }
                }
            }
        }