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)); } }
//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); }
public void AddDays(int days) { _dayOffset += days; _requestTime = _requestTime.AddDays(days); }
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); } }
/// <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); }
/// <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); }
public void SetWorld(World world) { World = world; Time = new WorldDateTime(); }