示例#1
0
        public async Task <List <ScheduleDirect.ShowImages> > GetImageForPrograms(List <string> programIds,
                                                                                  CancellationToken cancellationToken)
        {
            var imageIdString = "[";

            programIds.ForEach(i =>
            {
                if (!imageIdString.Contains(i.Substring(0, 10)))
                {
                    imageIdString += "\"" + i.Substring(0, 10) + "\",";
                }
                ;
            });
            imageIdString = imageIdString.TrimEnd(',') + "]";
            _logger.Debug("Json for show images = " + imageIdString);
            var httpOptions = new HttpRequestOptionsMod()
            {
                Url               = _apiUrl + "/metadata/programs",
                UserAgent         = UserAgent,
                CancellationToken = cancellationToken,
                RequestContent    = imageIdString
            };
            List <ScheduleDirect.ShowImages> images;

            using (var innerResponse2 = await _httpClient.Post(httpOptions))
            {
                images = _jsonSerializer.DeserializeFromStream <List <ScheduleDirect.ShowImages> >(
                    innerResponse2.Content);
            }

            return(images);
        }
        public async Task <List <string> > getLineups(CancellationToken cancellationToken)
        {
            List <string> Lineups = new List <string>();

            await GetToken(cancellationToken);

            if (!String.IsNullOrWhiteSpace(token))
            {
                _logger.Info("Lineups on account ");
                var httpOptions = new HttpRequestOptionsMod()
                {
                    Url               = apiUrl + "/lineups",
                    UserAgent         = "Emby-Server",
                    Token             = token,
                    CancellationToken = cancellationToken
                };
                var check = false;
                try
                {
                    using (Stream responce = await _httpClient.Get(httpOptions).ConfigureAwait(false))
                    {
                        var root = _jsonSerializer.DeserializeFromStream <ScheduleDirect.Lineups>(responce);
                        _logger.Info("Lineups on account ");
                        if (root.lineups != null)
                        {
                            foreach (ScheduleDirect.Lineup lineup in root.lineups)
                            {
                                _logger.Info("Lineups ID: " + lineup.lineup);
                                if (lineup.lineup == _lineup.Id)
                                {
                                    check = true;
                                }
                                Lineups.Add(lineup.lineup);
                            }
                            if (!String.IsNullOrWhiteSpace(_lineup.Id) && !check)
                            {
                                await addHeadEnd(cancellationToken);
                            }
                        }
                        else
                        {
                            _logger.Info("No lineups on account");
                            Lineups.Add("");
                        }
                        return(Lineups);
                    }
                }
                catch (HttpException e)
                {
                    _logger.Info("No lineups on account");
                }
                if (!String.IsNullOrWhiteSpace(_lineup.Id) && !check)
                {
                    await addHeadEnd(cancellationToken);
                }
            }
            Lineups.Add("");
            return(Lineups);
        }
        public async Task RecordStream(MediaSourceInfo mediaSourceInfo, CancellationToken cancellationToken)
        {
            HttpRequestOptions options = new HttpRequestOptionsMod()
            {
                Url = mediaSourceInfo.Path
            };
            await RecordingHelper.DownloadVideo(_httpClient, options, _logger, Path.Combine(RecordingPath, mediaSourceInfo.Name), cancellationToken);

            _logger.Info("Recording was a success");
        }
示例#4
0
        public async Task <List <Headend> > GetHeadends(string zipcode, CancellationToken cancellationToken)
        {
            var token = await GetToken(cancellationToken);

            var lineups = new List <Headend>();

            if (string.IsNullOrWhiteSpace(token))
            {
                return(lineups);
            }

            _logger.Info("Headends on account ");
            var httpOptions = new HttpRequestOptionsMod()
            {
                Url               = _apiUrl + "/headends?country=USA&postalcode=" + zipcode,
                UserAgent         = UserAgent,
                Token             = token,
                CancellationToken = cancellationToken,
            };

            try
            {
                using (Stream responce = await _httpClient.Get(httpOptions).ConfigureAwait(false))
                {
                    var root = _jsonSerializer.DeserializeFromStream <List <ScheduleDirect.Headends> >(responce);
                    _logger.Info("Lineups on account ");
                    if (root != null)
                    {
                        foreach (ScheduleDirect.Headends headend in root)
                        {
                            _logger.Info("Headend: " + headend.headend);
                            foreach (ScheduleDirect.Lineup lineup in headend.lineups)
                            {
                                _logger.Info("Headend: " + lineup.uri.Substring(18));
                                lineups.Add(new Headend()
                                {
                                    Name = string.IsNullOrWhiteSpace(lineup.name) ? lineup.lineup : lineup.name,
                                    Id   = lineup.uri.Substring(18)
                                });
                            }
                        }
                    }
                    else
                    {
                        _logger.Info("No lineups on account");
                    }
                }
            }
            catch (Exception ex)
            {
                _logger.Error("Error getting headends", ex);
            }

            return(lineups);
        }
        public async Task RecordStream(SingleTimer timer)
        {
            var mediaStreamInfo = await GetChannelStream(timer.ChannelId, "none", CancellationToken.None);

            HttpRequestOptions options = new HttpRequestOptionsMod()
            {
                Url = mediaStreamInfo.Path + "?duration=" + timer.Duration()
            };
            await RecordingHelper.DownloadVideo(_httpClient, options, _logger, Path.Combine(RecordingPath, timer.GetRecordingName()), timer.Cts.Token);

            _logger.Info("Recording was a success");
        }
        public async Task addHeadEnd(CancellationToken cancellationToken)
        {
            await GetToken(cancellationToken);

            if (!String.IsNullOrWhiteSpace(token) && !String.IsNullOrWhiteSpace(_lineup.Id))
            {
                _logger.Info("Adding new LineUp ");
                var httpOptions = new HttpRequestOptionsMod()
                {
                    Url               = apiUrl + "/lineups/" + _lineup.Id,
                    UserAgent         = "Emby-Server",
                    Token             = token,
                    CancellationToken = cancellationToken
                };

                using (var response = await _httpClient.SendAsync(httpOptions, "PUT"))
                {
                }
            }
        }
示例#7
0
        public async Task addHeadEnd(string id, CancellationToken cancellationToken)
        {
            var token = await GetToken(cancellationToken);

            if (string.IsNullOrWhiteSpace(token))
            {
                throw new ArgumentException("Authentication required.");
            }

            _logger.Info("Adding new LineUp ");

            var httpOptions = new HttpRequestOptionsMod()
            {
                Url               = _apiUrl + "/lineups/" + id,
                UserAgent         = UserAgent,
                Token             = token,
                CancellationToken = cancellationToken
            };

            using (var response = await _httpClient.SendAsync(httpOptions, "PUT"))
            {
            }
        }
示例#8
0
        private async Task RecordStream(TimerInfo timer, CancellationToken cancellationToken)
        {
            var mediaStreamInfo = await GetChannelStream(timer.ChannelId, "none", CancellationToken.None);

            var duration = (timer.EndDate - RecordingHelper.GetStartTime(timer)).TotalSeconds + timer.PrePaddingSeconds;

            HttpRequestOptions httpRequestOptions = new HttpRequestOptionsMod()
            {
                Url = mediaStreamInfo.Path + "?duration=" + duration
            };

            var info       = GetProgramInfoFromCache(timer.ChannelId, timer.ProgramId);
            var recordPath = RecordingPath;

            if (info.IsMovie)
            {
                recordPath = Path.Combine(recordPath, "Movies", StringHelper.RemoveSpecialCharacters(info.Name));
            }
            else
            {
                recordPath = Path.Combine(recordPath, "TV", StringHelper.RemoveSpecialCharacters(info.Name));
            }

            recordPath = Path.Combine(recordPath, RecordingHelper.GetRecordingName(timer, info));
            Directory.CreateDirectory(Path.GetDirectoryName(recordPath));

            var recording = _recordingProvider.GetAll().FirstOrDefault(x => string.Equals(x.Id, info.Id, StringComparison.OrdinalIgnoreCase));

            if (recording == null)
            {
                recording = new RecordingInfo()
                {
                    ChannelId       = info.ChannelId,
                    Id              = info.Id,
                    StartDate       = info.StartDate,
                    EndDate         = info.EndDate,
                    Genres          = info.Genres ?? null,
                    IsKids          = info.IsKids,
                    IsLive          = info.IsLive,
                    IsMovie         = info.IsMovie,
                    IsHD            = info.IsHD,
                    IsNews          = info.IsNews,
                    IsPremiere      = info.IsPremiere,
                    IsSeries        = info.IsSeries,
                    IsSports        = info.IsSports,
                    IsRepeat        = !info.IsPremiere,
                    Name            = info.Name,
                    EpisodeTitle    = info.EpisodeTitle ?? "",
                    ProgramId       = info.Id,
                    HasImage        = info.HasImage ?? false,
                    ImagePath       = info.ImagePath ?? null,
                    ImageUrl        = info.ImageUrl,
                    OriginalAirDate = info.OriginalAirDate,
                    Status          = RecordingStatus.Scheduled,
                    Overview        = info.Overview,
                    SeriesTimerId   = info.Id.Substring(0, 10)
                };
                _recordingProvider.Add(recording);
            }

            recording.Path   = recordPath;
            recording.Status = RecordingStatus.InProgress;
            _recordingProvider.Update(recording);

            try
            {
                httpRequestOptions.BufferContent     = false;
                httpRequestOptions.CancellationToken = cancellationToken;
                _logger.Info("Writing file to path: " + recordPath);
                using (var response = await _httpClient.SendAsync(httpRequestOptions, "GET"))
                {
                    using (var output = File.Open(recordPath, FileMode.Create, FileAccess.Write, FileShare.Read))
                    {
                        await response.Content.CopyToAsync(output, 4096, cancellationToken);
                    }
                }

                recording.Status = RecordingStatus.Completed;
            }
            catch (OperationCanceledException)
            {
                recording.Status = RecordingStatus.Cancelled;
            }
            catch
            {
                recording.Status = RecordingStatus.Error;
            }

            _recordingProvider.Update(recording);
            _timerProvider.Delete(timer);
            _logger.Info("Recording was a success");
        }
        public async Task <IEnumerable <ChannelInfo> > getChannelInfo(IEnumerable <ChannelInfo> channelsInfo,
                                                                      CancellationToken cancellationToken)
        {
            await GetToken(cancellationToken);

            if (!String.IsNullOrWhiteSpace(token))
            {
                if (!String.IsNullOrWhiteSpace(_lineup.Id))
                {
                    var httpOptions = new HttpRequestOptionsMod()
                    {
                        Url               = apiUrl + "/lineups/" + _lineup.Id,
                        UserAgent         = "Emby-Server",
                        Token             = token,
                        CancellationToken = cancellationToken
                    };
                    channelPair = new Dictionary <string, ScheduleDirect.Station>();
                    using (var response = await _httpClient.Get(httpOptions))
                    {
                        var root = _jsonSerializer.DeserializeFromStream <ScheduleDirect.Channel>(response);
                        _logger.Info("Found " + root.map.Count() + " channels on the lineup on ScheduleDirect");
                        _logger.Info("Mapping Stations to Channel");
                        foreach (ScheduleDirect.Map map in root.map)
                        {
                            var channel = map.channel ?? (map.atscMajor + "." + map.atscMinor);
                            //_logger.Info("Found channel: "+channel+" in Schedules Direct");
                            if (!channelPair.ContainsKey(channel) && channel != "0.0")
                            {
                                channelPair.Add(channel.TrimStart('0'),
                                                root.stations.FirstOrDefault(item => item.stationID == map.stationID));
                            }
                        }
                        _logger.Info("Added " + channelPair.Count() + " channels to the dictionary");
                        string channelName;
                        foreach (ChannelInfo channel in channelsInfo)
                        {
                            //  Helper.logger.Info("Modifyin channel " + channel.Number);
                            if (channelPair.ContainsKey(channel.Number))
                            {
                                if (channelPair[channel.Number].logo != null)
                                {
                                    channel.ImageUrl = channelPair[channel.Number].logo.URL;
                                    channel.HasImage = true;
                                }
                                if (channelPair[channel.Number].affiliate != null)
                                {
                                    channelName = channelPair[channel.Number].affiliate;
                                }
                                else
                                {
                                    channelName = channelPair[channel.Number].name;
                                }
                                channel.Name = channelName;
                                //channel.Id = channelPair[channel.Number].stationID;
                            }
                            else
                            {
                                _logger.Info("Schedules Direct doesnt have data for channel: " + channel.Number + " " +
                                             channel.Name);
                            }
                        }
                    }
                }
            }
            return(channelsInfo);
        }
        public async Task <IEnumerable <ProgramInfo> > getTvGuideForChannel(string channelNumber, DateTime start,
                                                                            DateTime end, CancellationToken cancellationToken)
        {
            await GetToken(cancellationToken);

            if (!String.IsNullOrWhiteSpace(_lineup.Id) && !String.IsNullOrWhiteSpace(token))
            {
                HttpRequestOptionsMod httpOptions = new HttpRequestOptionsMod()
                {
                    Url               = apiUrl + "/schedules",
                    UserAgent         = "Emby-Server",
                    Token             = token,
                    CancellationToken = cancellationToken
                };
                _logger.Info("Schedules 1");
                List <string> dates       = new List <string>();
                int           numberOfDay = 0;
                DateTime      lastEntry   = start;
                while (lastEntry != end)
                {
                    lastEntry = start.AddDays(numberOfDay);
                    dates.Add(lastEntry.ToString("yyyy-MM-dd"));
                    numberOfDay++;
                }
                _logger.Info("Schedules dates is null?" +
                             (dates != null || dates.All(x => string.IsNullOrWhiteSpace(x))));
                _logger.Info("Date count?" + dates[0]);

                string stationID = channelPair[channelNumber].stationID;
                _logger.Info("Channel ?" + stationID);
                List <ScheduleDirect.RequestScheduleForChannel> requestList =
                    new List <ScheduleDirect.RequestScheduleForChannel>()
                {
                    new ScheduleDirect.RequestScheduleForChannel()
                    {
                        stationID = stationID,
                        date      = dates
                    }
                };

                _logger.Info("Schedules 3");
                _logger.Info("Request string for schedules is: " + _jsonSerializer.SerializeToString(requestList));
                httpOptions.RequestContent = _jsonSerializer.SerializeToString(requestList);
                _logger.Info("Schedules 5");
                using (var response = await _httpClient.Post(httpOptions))
                {
                    StreamReader reader         = new StreamReader(response.Content);
                    string       responseString = reader.ReadToEnd();
                    _logger.Info("Schedules 6");
                    responseString = "{ \"days\":" + responseString + "}";
                    var root = _jsonSerializer.DeserializeFromString <ScheduleDirect.Schedules>(responseString);
                    // Helper.logger.Info("Found " + root.Count() + " programs on "+channelNumber +" ScheduleDirect");
                    List <ProgramInfo> programsInfo = new List <ProgramInfo>();
                    httpOptions = new HttpRequestOptionsMod()
                    {
                        Url               = apiUrl + "/programs",
                        UserAgent         = "Emby-Server",
                        Token             = token,
                        CancellationToken = cancellationToken
                    };
                    // httpOptions.SetRequestHeader("Accept-Encoding", "deflate,gzip");
                    httpOptions.EnableHttpCompression = true;
                    string        requestBody = "";
                    List <string> programsID  = new List <string>();
                    foreach (ScheduleDirect.Day day in root.days)
                    {
                        foreach (ScheduleDirect.Program schedule in day.programs)
                        {
                            programsID.Add(schedule.programID);
                        }
                    }
                    _logger.Info("finish creating dict: ");
                    programsID = programsID.Distinct().ToList();

                    requestBody = "[\"" + string.Join("\", \"", programsID) + "\"]";
                    httpOptions.RequestContent = requestBody;
                    List <string> imageID = new List <string>();
                    using (var innerResponse = await _httpClient.Post(httpOptions))
                    {
                        using (var innerReader = new StreamReader(innerResponse.Content))
                        {
                            responseString = innerReader.ReadToEnd();
                            responseString = "{ \"result\":" + responseString + "}";
                            var programDetails =
                                _jsonSerializer.DeserializeFromString <ScheduleDirect.ProgramDetailsResilt>(
                                    responseString);
                            Dictionary <string, ScheduleDirect.ProgramDetails> programDict =
                                programDetails.result.ToDictionary(p => p.programID, y => y);
                            foreach (var program in programDetails.result)
                            {
                                var imageId = program.programID.Substring(0, 10);
                                if (program.hasImageArtwork && !imageID.Contains(imageId))
                                {
                                    imageID.Add(imageId);
                                }
                            }
                            Dictionary <string, string> imageUrls = new Dictionary <string, string>();
                            foreach (var image in imageID)
                            {
                                var    imageIdString = "[\"" + image + "\"]";
                                string programs      = String.Join(" ",
                                                                   programDict.Keys.ToList().FindAll(x => x.Substring(0, 10) == image))
                                ;
                                _logger.Info("Json for show images = " + imageIdString + " used on prgrams " +
                                             programs);
                                httpOptions = new HttpRequestOptionsMod()
                                {
                                    Url               = "https://json.schedulesdirect.org/20141201/metadata/programs/",
                                    UserAgent         = "Emby-Server",
                                    CancellationToken = cancellationToken
                                };
                                httpOptions.RequestContent = imageIdString;

                                using (var innerResponse2 = await _httpClient.Post(httpOptions))
                                {
                                    List <ScheduleDirect.Image> images;
                                    images = _jsonSerializer.DeserializeFromStream <List <ScheduleDirect.Image> >(
                                        innerResponse2.Content);
                                    //_logger.Info("Images Response: " + _jsonSerializer.SerializeToString(images));
                                    if (images[0] != null)
                                    {
                                        imageUrls.Add(image, images[0].uri);
                                    }
                                }
                            }
                            foreach (ScheduleDirect.Day day in root.days)
                            {
                                foreach (ScheduleDirect.Program schedule in day.programs)
                                {
                                    _logger.Info("Proccesing Schedule for statio ID " + stationID +
                                                 " which corresponds to channel" + channelNumber + " and program id " +
                                                 schedule.programID);


                                    if (imageUrls.ContainsKey(schedule.programID.Substring(0, 10)))
                                    {
                                        string url;
                                        if (imageUrls[schedule.programID.Substring(0, 10)].Contains("http"))
                                        {
                                            url = imageUrls[schedule.programID.Substring(0, 10)];
                                        }
                                        else
                                        {
                                            url = "https://json.schedulesdirect.org/20140530/image/" +
                                                  imageUrls[schedule.programID.Substring(0, 10)];
                                        }
                                        programDict[schedule.programID].images = url;
                                        _logger.Info("URL for image is : " + programDict[schedule.programID].images);
                                    }

                                    programsInfo.Add(GetProgram(channelNumber, schedule, programDict[schedule.programID]));
                                }
                            }
                            _logger.Info("Finished with TVData");
                            return(programsInfo);
                        }
                    }
                }
            }

            return((IEnumerable <ProgramInfo>) new List <ProgramInfo>());
        }
示例#11
0
        public async Task <IEnumerable <ProgramInfo> > getTvGuideForChannel(string channelNumber, DateTime start,
                                                                            DateTime end, CancellationToken cancellationToken)
        {
            List <ProgramInfo> programsInfo = new List <ProgramInfo>();

            if (_channelPair.ContainsKey(channelNumber))
            {
                var token = await GetToken(cancellationToken);

                if (string.IsNullOrWhiteSpace(token))
                {
                    return(programsInfo);
                }

                HttpRequestOptionsMod httpOptions = new HttpRequestOptionsMod()
                {
                    Url               = _apiUrl + "/schedules",
                    UserAgent         = UserAgent,
                    Token             = token,
                    CancellationToken = cancellationToken
                };
                List <string> dates       = new List <string>();
                int           numberOfDay = 0;
                DateTime      lastEntry   = start;
                while (lastEntry != end)
                {
                    lastEntry = start.AddDays(numberOfDay);
                    dates.Add(lastEntry.ToString("yyyy-MM-dd"));
                    numberOfDay++;
                }
                string stationID = _channelPair[channelNumber].stationID;
                _logger.Info("Channel Station ID is: " + stationID);
                List <ScheduleDirect.RequestScheduleForChannel> requestList =
                    new List <ScheduleDirect.RequestScheduleForChannel>()
                {
                    new ScheduleDirect.RequestScheduleForChannel()
                    {
                        stationID = stationID,
                        date      = dates
                    }
                };

                var requestString = _jsonSerializer.SerializeToString(requestList);
                _logger.Debug("Request string for schedules is: " + requestString);
                httpOptions.RequestContent = requestString;
                using (var response = await _httpClient.Post(httpOptions))
                {
                    StreamReader reader         = new StreamReader(response.Content);
                    string       responseString = reader.ReadToEnd();
                    var          dailySchedules = _jsonSerializer.DeserializeFromString <List <ScheduleDirect.Day> >(responseString);
                    _logger.Debug("Found " + dailySchedules.Count() + " programs on " + channelNumber +
                                  " ScheduleDirect");
                    httpOptions = new HttpRequestOptionsMod()
                    {
                        Url               = _apiUrl + "/programs",
                        UserAgent         = UserAgent,
                        Token             = token,
                        CancellationToken = cancellationToken
                    };
                    httpOptions.EnableHttpCompression = true;
                    List <string> programsID = new List <string>();
                    programsID = dailySchedules.SelectMany(d => d.programs.Select(s => s.programID)).Distinct().ToList();
                    var requestBody = "[\"" + string.Join("\", \"", programsID) + "\"]";
                    httpOptions.RequestContent = requestBody;

                    using (var innerResponse = await _httpClient.Post(httpOptions))
                    {
                        StreamReader innerReader = new StreamReader(innerResponse.Content);
                        responseString = innerReader.ReadToEnd();
                        var programDetails =
                            _jsonSerializer.DeserializeFromString <List <ScheduleDirect.ProgramDetails> >(
                                responseString);
                        Dictionary <string, ScheduleDirect.ProgramDetails> programDict =
                            programDetails.ToDictionary(p => p.programID, y => y);
                        var images =
                            await
                            GetImageForPrograms(
                                programDetails.Where(p => p.hasImageArtwork).Select(p => p.programID).ToList(),
                                cancellationToken);

                        var schedules = dailySchedules.SelectMany(d => d.programs);
                        foreach (ScheduleDirect.Program schedule in schedules)
                        {
                            _logger.Debug("Proccesing Schedule for statio ID " + stationID +
                                          " which corresponds to channel " + channelNumber + " and program id " +
                                          schedule.programID + " which says it has images? " +
                                          programDict[schedule.programID].hasImageArtwork);
                            var imageIndex =
                                images.FindIndex(i => i.programID == schedule.programID.Substring(0, 10));
                            if (imageIndex > -1)
                            {
                                programDict[schedule.programID].images = GetProgramLogo(images[imageIndex]);
                            }
                            programsInfo.Add(GetProgram(channelNumber, schedule, programDict[schedule.programID]));
                        }
                        _logger.Info("Finished with EPGData");
                    }
                }
            }
            return(programsInfo);
        }