示例#1
0
        private void GetDate(string element)
        {
            if (_startTime == null)
            {
                _startTime = new WorldDateTime();
            }

            int pos = 0;

            if ((pos = element.IndexOf("/")) != -1)
            {
                _startTime.Day = Int32.Parse(element.Substring(0, pos));
            }

            int start = pos + 1;

            if ((pos = element.IndexOf("/", start)) != -1)
            {
                _startTime.Month = Int32.Parse(element.Substring(start, pos - start));
            }
        }
示例#2
0
        //public Program ToTvProgram(string channelName)
        //{
        //  int dbIdChannel = 0;
        //  Channel dbChannel = Broker.TryRetrieveInstance<Channel>(new Key(true, "ExternalId", channelName + "-" + _channelId));
        //  if (dbChannel != null)
        //  {
        //    dbIdChannel = dbChannel.IdChannel;
        //  }

        //  return ToTvProgram(dbIdChannel);
        //}

        public Program ToTvProgram(int dbIdChannel)
        {
            WorldDateTime endTime = (_endTime == null) ? _startTime : _endTime;
            Program       program = new Program(dbIdChannel, _startTime.ToLocalTime(), endTime.ToLocalTime(), _title, _description,
                                                _genre,
                                                Program.ProgramState.None, System.Data.SqlTypes.SqlDateTime.MinValue.Value,
                                                String.Empty, String.Empty,
                                                _subTitle, String.Empty, -1, String.Empty, 0);

            if (_episode > 0)
            {
                program.EpisodeNum = _episode.ToString();
            }
            if (_season > 0)
            {
                program.SeriesNum = _season.ToString();
            }
            //if (_repeat)
            //{
            //  program.Repeat = "Repeat";
            //}

            return(program);
        }
示例#3
0
 public void AddDays(int days)
 {
     _dayOffset  += days;
     _requestTime = _requestTime.AddDays(days);
 }
示例#4
0
        public void SetElement(string tag, string element)
        {
            try
            {
                switch (tag)
                {
                case "#STARTXMLTV":
                    _startTime = new WorldDateTime(element, false);
                    break;

                case "#ENDXMLTV":
                    _endTime = new WorldDateTime(element, false);
                    break;

                case "#START":
                    BasicTime startTime = GetTime(element);
                    if (_startTime == null)
                    {
                        _startTime = new WorldDateTime();
                    }
                    _startTime.Hour   = startTime.Hour;
                    _startTime.Minute = startTime.Minute;
                    break;

                case "#END":
                    BasicTime endTime = GetTime(element);
                    if (_endTime == null)
                    {
                        _endTime = new WorldDateTime();
                    }
                    _endTime.Hour   = endTime.Hour;
                    _endTime.Minute = endTime.Minute;
                    break;

                case "#DATE":
                    GetDate(element);
                    break;

                case "#DAY":
                    if (_startTime == null)
                    {
                        _startTime = new WorldDateTime();
                    }
                    _startTime.Day = int.Parse(element);
                    break;

                case "#DESCRIPTION":
                    if (_description == string.Empty)
                    {
                        _description = element.Trim(' ', '\n', '\t');
                    }
                    else
                    {
                        _description = _description + "\n" + element.Trim(' ', '\n', '\t');
                    }
                    break;

                case "#MONTH":
                    if (_startTime == null)
                    {
                        _startTime = new WorldDateTime();
                    }
                    _startTime.Month = GetMonth(element.Trim(' ', '\n', '\t'));
                    break;

                case "#TITLE":
                    Title = element.Trim(' ', '\n', '\t');
                    break;

                case "#SUBTITLE":
                    SubTitle = element.Trim(' ', '\n', '\t');
                    break;

                case "#GENRE":
                    Genre = element.Trim(' ', '\n', '\t');
                    break;

                case "#ACTORS":
                    _actors = GetActors(element);
                    break;

                case "#EPISODE":
                    _episode = GetNumber(element);
                    break;

                case "#SEASON":
                    _season = GetNumber(element);
                    break;

                case "#REPEAT":
                    if (element.ToLower().IndexOf("false") == -1)
                    {
                        _repeat = true;
                    }
                    break;

                case "#SUBTITLES":
                    if (element.ToLower().IndexOf("false") == -1)
                    {
                        _subtitles = true;
                    }
                    break;

                default:
                    break;
                }
            }
            catch (Exception)
            {
                Log.Error("Parsing error {0} : {1}", tag, element);
            }
        }
示例#5
0
        /// <summary>
        /// Checks and adjusts the start and end times for a program.
        /// </summary>
        /// <param name="guideData">The guide data.</param>
        /// <returns>true if successfull otherwise false</returns>
        public bool CheckAdjustTime(ref ProgramData guideData)
        {
            WorldDateTime guideStartTime = guideData.StartTime;
            WorldDateTime guideEndTime   = guideData.EndTime;

            _addDays = 1;

            // Check if the start time day value is set
            if (guideStartTime.Day == 0)
            {
                guideStartTime.Day = _startTime.Day; // Set program day to start day
            }
            else
            {
                // program has day value
                if (guideStartTime.Day != _startTime.Day && _expectedTime != Expect.Start)
                {
                    // day value not the same as start time -> increase start time one day
                    _grabDay++;
                    _startTime    = _startTime.AddDays(1);
                    _nextDay      = false;
                    _lastTime     = 0;
                    _expectedTime = Expect.BeforeMidday;
                }
            }

            // Check and set month and year
            if (guideStartTime.Year == 0)
            {
                guideStartTime.Year = _startTime.Year;
            }
            if (guideStartTime.Month == 0)
            {
                guideStartTime.Month = _startTime.Month;
            }


            // State loop Start, BeforeMidday and AfterMidday
            switch (_expectedTime)
            {
            // Start of a new day - need to work out if the listings start in the morning or afternoon
            case Expect.Start:
                if (OnPreviousDay(guideStartTime.Hour))
                {
                    return(false); // Guide starts on previous day ignore these listings.
                }

                if (_newDay)
                {
                    _newDay = false;
                    //if (guideStartTime.Hour < _startTime.Hour)
                    //  return false;

                    if (guideStartTime.Hour <= 12)
                    {
                        _expectedTime = Expect.BeforeMidday;
                        goto case Expect.BeforeMidday;
                    }

                    _expectedTime = Expect.AfterMidday;
                    goto case Expect.AfterMidday;
                }

                _expectedTime = Expect.BeforeMidday;
                goto case Expect.BeforeMidday; // Pass into BeforeMidday Code

            // Before Midday
            case Expect.BeforeMidday:
                if (_lastTime > guideStartTime.Hour)
                {
                    // last time was before midday, new time is less -> site doesn't have 24 hours or AM/PM
                    _expectedTime = Expect.AfterMidday;
                }
                else
                {
                    if (guideStartTime.Hour <= 12)
                    {
                        break; // Time is before midday -> Do nothing
                    }
                }

                // Pass into AfterMidday Code
                goto case Expect.AfterMidday;

            // After midday
            case Expect.AfterMidday:
                bool adjusted = false;
                if (guideStartTime.Hour < 12)  // Site doesn't have correct time
                {
                    guideStartTime.Hour += 12; // starts again at 1:00 without "pm"
                    adjusted             = true;
                }

                if (_lastTime > guideStartTime.Hour)
                {
                    if (_nextDay)
                    {
                        _addDays++;
                        _grabDay++;
                        _startTime = _startTime.AddDays(1);
                    }
                    else
                    {
                        _nextDay = true;
                    }

                    if (adjusted)
                    {
                        guideStartTime.Hour -= 12;
                    }

                    if (guideStartTime.Hour < 12)
                    {
                        _expectedTime = Expect.BeforeMidday;
                    }
                }

                break;

            default:
                break;
            }

            // store current hour as last hour
            _lastTime = guideStartTime.Hour;

            // Check if orogram has an end time
            if (guideEndTime != null)
            {
                // set Day, Month and Year is not set
                if (guideEndTime.Year == 0)
                {
                    guideEndTime.Year = guideStartTime.Year;
                }
                if (guideEndTime.Month == 0)
                {
                    guideEndTime.Month = guideStartTime.Month;
                }
                if (guideEndTime.Day == 0)
                {
                    guideEndTime.Day = guideStartTime.Day;
                }

                // correct date if required
                if (_nextDay)
                {
                    if (guideStartTime.Hour > guideEndTime.Hour)
                    {
                        // start before midnight end after
                        guideEndTime = guideEndTime.AddDays(_addDays + 1);
                    }
                    else
                    {
                        guideEndTime = guideEndTime.AddDays(_addDays);
                    }
                }
                else
                {
                    if (guideStartTime.Hour > guideEndTime.Hour)
                    {
                        guideEndTime = guideEndTime.AddDays(_addDays);
                    }
                }
            }

            // if next day -> correct start date
            if (_nextDay)
            {
                guideStartTime = guideStartTime.AddDays(_addDays);
            }

            //Log.Debug("WebEPG: Guide, Program Debug: [{0} {1}]", _GrabDay, _bNextDay);

            guideData.StartTime = guideStartTime;
            guideData.EndTime   = guideEndTime;

            return(true);
        }
示例#6
0
        /// <summary>
        /// Gets the guide for a given channel.
        /// </summary>
        /// <param name="strChannelID">The channel ID.</param>
        /// <param name="Linked">if set to <c>true</c> get [linked] pages.</param>
        /// <param name="linkStart">The start time to get link pages.</param>
        /// <param name="linkEnd">The end time to get linked pages.</param>
        /// <param name="startDateTime">The start date time for grabbing.</param>
        /// <returns>list of programs</returns>
        public List <ProgramData> GetGuide(string strChannelID, string displayName, bool Linked, TimeRange linkTime,
                                           DateTime startDateTime)
        {
            _strID         = strChannelID;
            _grabLinked    = Linked;
            _linkTimeRange = linkTime;
            //int offset = 0;

            _reqData.ChannelId = _grabber.GetChannel(strChannelID);
            if (_reqData.ChannelId == null)
            {
                Log.Error("WebEPG: ChannelId: {0} not found!", strChannelID);
                return(null);
            }

            //_removeProgramsList = _grabber.GetRemoveProgramList(strChannelID); // <--- !!!

            _programs = new List <ProgramData>();

            Log.Info("WebEPG: ChannelId: {0}", strChannelID);

            //_GrabDay = 0;

            // sets a minimum delay for the programlist Site page grabbing
            // why? likely not needed. to be tested.
            // possible reason: 'relaxing' webservers
            if (_grabber.Listing.Request.Delay < 500)
            {
                _grabber.Listing.Request.Delay = 500;
            }
            WorldDateTime reqStartTime = new WorldDateTime(_siteTimeZone.FromLocalTime(startDateTime), _siteTimeZone);

            _reqBuilder = new RequestBuilder(_grabber.Listing.Request, reqStartTime, _reqData);
            _grabStart  = startDateTime;

            Log.Debug("WebEPG: Grab Start {0} {1}", startDateTime.ToShortTimeString(),
                      startDateTime.ToShortDateString());
            int requestedStartDay = startDateTime.Subtract(DateTime.Now).Days;

            if (requestedStartDay > 0)
            {
                if (requestedStartDay > _grabber.Info.GrabDays)
                {
                    Log.Error("WebEPG: Trying to grab past guide days");
                    return(null);
                }

                if (requestedStartDay + _maxGrabDays > _grabber.Info.GrabDays)
                {
                    _maxGrabDays = _grabber.Info.GrabDays - requestedStartDay;
                    Log.Info("WebEPG: Grab days more than Guide days, limiting to {0}", _maxGrabDays);
                }

                //_GrabDay = requestedStartDay;
                _reqBuilder.DayOffset = requestedStartDay;
                if (_reqBuilder.DayOffset > _maxGrabDays)                //_GrabDay > _maxGrabDays)
                {
                    _maxGrabDays = _reqBuilder.DayOffset + _maxGrabDays; // _GrabDay + _maxGrabDays;
                }
            }

            //TVDatabase.BeginTransaction();
            //TVDatabase.ClearCache();
            //TVDatabase.RemoveOldPrograms();

            _dbPrograms = new List <Program>();
            _dbLastProg = 0;

            try
            {
                Key             epgMapKey   = new Key(false, "displayName", displayName);
                IList <Channel> epgChannels = Broker.RetrieveList <Channel>(epgMapKey);
                if (epgChannels.Count > 0)
                {
                    _dbPrograms = epgChannels[0].ReferringProgram();
                }
            }
            catch (Exception)
            {
                Log.Error("WebEPG: Database failed, disabling db lookup");
                _dblookup = false;
            }

            _timeControl = new ListingTimeControl(_siteTimeZone.FromLocalTime(startDateTime));
            while (_reqBuilder.DayOffset < _maxGrabDays)
            {
                _reqBuilder.Offset = 0;

                bool error;
                while (GetListing(out error))
                {
                    //if (_grabber.Listing.SearchParameters.MaxListingCount == 0)
                    //  break;
                    _reqBuilder.Offset++;
                }

                if (error)
                {
                    if (!_grabber.Info.TreatErrorAsWarning)
                    {
                        Log.Error("WebEPG: ChannelId: {0} grabber error - stopping", strChannelID);
                        break;
                    }
                    Log.Info("WebEPG: ChannelId: {0} grabber error - continuing", strChannelID);
                }

                //_GrabDay++;
                if (_reqBuilder.HasDate()) // < here
                {
                    _reqBuilder.AddDays(1);
                    _timeControl.NewDay();
                }
                else
                {
                    //if (_reqBuilder.HasList()) // < here
                    break;
                    //_reqBuilder.AddDays(_timeControl.GrabDay);
                }
            }

            return(_programs);
        }
示例#7
0
 public void SetWorld(World world)
 {
     World = world;
     Time  = new WorldDateTime();
 }