bool MythScheduleHelper85::FillTimerEntryWithUpcoming(MythTimerEntry& entry, const MythProgramInfo& recording) const { //Only include timers which have an inactive status if the user has requested it (flag m_showNotRecording) switch (recording.Status()) { //Upcoming recordings which are disabled due to being lower priority duplicates or already recorded case Myth::RS_EARLIER_RECORDING: //will record earlier case Myth::RS_LATER_SHOWING: //will record later case Myth::RS_CURRENT_RECORDING: //Already in the current library case Myth::RS_PREVIOUS_RECORDING: //Previoulsy recorded but no longer in the library if (!m_manager->ShowNotRecording()) { XBMC->Log(LOG_DEBUG, "85::%s: Skipping %s:%s on %s because status %d", __FUNCTION__, recording.Title().c_str(), recording.Subtitle().c_str(), recording.ChannelName().c_str(), recording.Status()); return false; } default: break; } MythRecordingRuleNodePtr node = m_manager->FindRuleById(recording.RecordID()); if (node) { MythRecordingRule rule = node->GetRule(); // Relate the main rule as parent entry.parentIndex = MythScheduleManager::MakeIndex(node->GetMainRule()); switch (rule.Type()) { case Myth::RT_SingleRecord: return false; // Discard upcoming. We show only main rule. case Myth::RT_DontRecord: entry.recordingStatus = recording.Status(); entry.timerType = TIMER_TYPE_DONT_RECORD; entry.isInactive = rule.Inactive(); break; case Myth::RT_OverrideRecord: entry.recordingStatus = recording.Status(); entry.timerType = TIMER_TYPE_OVERRIDE; entry.isInactive = rule.Inactive(); break; default: entry.recordingStatus = recording.Status(); if (node->GetMainRule().SearchType() == Myth::ST_ManualSearch) entry.timerType = TIMER_TYPE_UPCOMING_MANUAL; else entry.timerType = TIMER_TYPE_UPCOMING; } entry.startOffset = rule.StartOffset(); entry.endOffset = rule.EndOffset(); entry.priority = rule.Priority(); entry.expiration = GetRuleExpirationId(RuleExpiration(rule.AutoExpire(), 0, false)); } else entry.timerType = TIMER_TYPE_ZOMBIE; switch (entry.timerType) { case TIMER_TYPE_UPCOMING: case TIMER_TYPE_OVERRIDE: case TIMER_TYPE_UPCOMING_MANUAL: entry.epgCheck = true; break; default: entry.epgCheck = false; } entry.description = ""; entry.chanid = recording.ChannelID(); entry.callsign = recording.Callsign(); entry.startTime = recording.StartTime(); entry.endTime = recording.EndTime(); entry.title.assign(recording.Title()); if (!recording.Subtitle().empty()) entry.title.append(" (").append(recording.Subtitle()).append(")"); if (recording.Season() || recording.Episode()) entry.title.append(" - ").append(Myth::IntToString(recording.Season())).append(".").append(Myth::IntToString(recording.Episode())); entry.recordingGroup = GetRuleRecordingGroupId(recording.RecordingGroup()); entry.entryIndex = MythScheduleManager::MakeIndex(recording); // upcoming index return true; }
bool MythScheduleHelper76::FillTimerEntryWithRule(MythTimerEntry& entry, const MythRecordingRuleNode& node) const { // Assign timer type regarding rule attributes. The match SHOULD be opposite to // that which is applied in function 'NewFromTimer' MythRecordingRule rule = node.GetRule(); if (g_bExtraDebug) XBMC->Log(LOG_DEBUG, "76::%s: RecordID %u", __FUNCTION__, rule.RecordID()); switch (rule.Type()) { case Myth::RT_SingleRecord: { // Fill recording status from its upcoming MythScheduleList recordings = m_manager->FindUpComingByRuleId(rule.RecordID()); MythScheduleList::const_reverse_iterator it = recordings.rbegin(); if (it != recordings.rend()) entry.recordingStatus = it->second->Status(); else return false; // Don't transfer single without upcoming } if (rule.SearchType() == Myth::ST_ManualSearch) entry.timerType = TIMER_TYPE_MANUAL_SEARCH; else entry.timerType = TIMER_TYPE_THIS_SHOWING; entry.chanid = rule.ChannelID(); entry.callsign = rule.Callsign(); break; case Myth::RT_OneRecord: entry.timerType = TIMER_TYPE_RECORD_ONE; if (rule.Filter() & Myth::FM_ThisChannel) { entry.chanid = rule.ChannelID(); entry.callsign = rule.Callsign(); } break; case Myth::RT_DailyRecord: entry.timerType = TIMER_TYPE_RECORD_DAILY; if (rule.Filter() & Myth::FM_ThisChannel) { entry.chanid = rule.ChannelID(); entry.callsign = rule.Callsign(); } break; case Myth::RT_WeeklyRecord: entry.timerType = TIMER_TYPE_RECORD_WEEKLY; if (rule.Filter() & Myth::FM_ThisChannel) { entry.chanid = rule.ChannelID(); entry.callsign = rule.Callsign(); } break; case Myth::RT_AllRecord: if ((rule.Filter() & Myth::FM_ThisDayAndTime)) entry.timerType = TIMER_TYPE_RECORD_WEEKLY; else if ((rule.Filter() & Myth::FM_ThisTime)) entry.timerType = TIMER_TYPE_RECORD_DAILY; else if ((rule.Filter() & Myth::FM_ThisSeries)) entry.timerType = TIMER_TYPE_RECORD_SERIES; else entry.timerType = TIMER_TYPE_RECORD_ALL; if (rule.Filter() & Myth::FM_ThisChannel) { entry.chanid = rule.ChannelID(); entry.callsign = rule.Callsign(); } break; case Myth::RT_OverrideRecord: entry.timerType = TIMER_TYPE_OVERRIDE; entry.chanid = rule.ChannelID(); entry.callsign = rule.Callsign(); break; case Myth::RT_DontRecord: entry.timerType = TIMER_TYPE_DONT_RECORD; entry.chanid = rule.ChannelID(); entry.callsign = rule.Callsign(); break; default: entry.timerType = TIMER_TYPE_UNHANDLED; entry.chanid = rule.ChannelID(); entry.callsign = rule.Callsign(); break; } switch (rule.SearchType()) { case Myth::ST_TitleSearch: entry.epgSearch = rule.Description(); break; case Myth::ST_KeywordSearch: entry.epgSearch = rule.Description(); entry.timerType = TIMER_TYPE_SEARCH_KEYWORD; break; case Myth::ST_PeopleSearch: entry.epgSearch = rule.Description(); entry.timerType = TIMER_TYPE_SEARCH_PEOPLE; break; case Myth::ST_PowerSearch: entry.epgSearch = rule.Description(); entry.timerType = TIMER_TYPE_UNHANDLED; break; case Myth::ST_NoSearch: // EPG based entry.epgCheck = true; entry.epgSearch = rule.Title(); break; case Myth::ST_ManualSearch: // Manual entry.chanid = rule.ChannelID(); entry.callsign = rule.Callsign(); entry.startTime = rule.StartTime(); entry.endTime = rule.EndTime(); break; default: break; } switch (entry.timerType) { case TIMER_TYPE_RECORD_ONE: case TIMER_TYPE_RECORD_WEEKLY: case TIMER_TYPE_RECORD_DAILY: case TIMER_TYPE_RECORD_ALL: case TIMER_TYPE_RECORD_SERIES: case TIMER_TYPE_SEARCH_KEYWORD: case TIMER_TYPE_SEARCH_PEOPLE: case TIMER_TYPE_UNHANDLED: entry.startTime = rule.StartTime(); entry.endTime = rule.EndTime(); // For all repeating fix timeslot as needed if (!entry.HasTimeSlot()) { if (difftime(rule.NextRecording(), 0) > 0) { // fill timeslot starting at next recording entry.startTime = rule.NextRecording(); // it includes offset correction // WARNING: if next recording has been overriden then offset could be different timeadd(&entry.startTime, INTERVAL_MINUTE * rule.StartOffset()); // remove start offset entry.endTime = 0; // any time } else if (difftime(rule.LastRecorded(), 0) > 0) { // fill timeslot starting at last recorded entry.startTime = rule.LastRecorded(); // it includes offset correction // WARNING: if last recorded has been overriden then offset could be different timeadd(&entry.startTime, INTERVAL_MINUTE * rule.StartOffset()); // remove start offset entry.endTime = 0; // any time } } // For all repeating set summary status if (node.HasConflict()) entry.recordingStatus = Myth::RS_CONFLICT; else if (node.IsRecording()) entry.recordingStatus = Myth::RS_RECORDING; // break; default: entry.startTime = rule.StartTime(); entry.endTime = rule.EndTime(); } // fill others entry.epgInfo = MythEPGInfo(rule.ChannelID(), rule.StartTime(), rule.EndTime()); entry.title = rule.Title(); entry.category = rule.Category(); entry.startOffset = rule.StartOffset(); entry.endOffset = rule.EndOffset(); entry.dupMethod = rule.DuplicateControlMethod(); entry.priority = rule.Priority(); entry.expiration = GetRuleExpirationId(RuleExpiration(rule.AutoExpire(), rule.MaxEpisodes(), rule.NewExpiresOldRecord())); entry.isInactive = rule.Inactive(); entry.firstShowing = (rule.Filter() & Myth::FM_FirstShowing ? true : false); entry.recordingGroup = GetRuleRecordingGroupId(rule.RecordingGroup()); entry.entryIndex = MythScheduleManager::MakeIndex(rule); // rule index if (node.IsOverrideRule()) entry.parentIndex = MythScheduleManager::MakeIndex(node.GetMainRule()); else entry.parentIndex = 0; return true; }
bool MythScheduleHelper75::SameTimeslot(const MythRecordingRule& first, const MythRecordingRule& second) const { time_t first_st = first.StartTime(); time_t second_st = second.StartTime(); switch (first.Type()) { case Myth::RT_NotRecording: case Myth::RT_SingleRecord: case Myth::RT_OverrideRecord: case Myth::RT_DontRecord: return second_st == first_st && second.EndTime() == first.EndTime() && second.ChannelID() == first.ChannelID() && second.Filter() == first.Filter(); case Myth::RT_OneRecord: // FindOneRecord return second.Title() == first.Title() && second.ChannelID() == first.ChannelID() && second.Filter() == first.Filter(); case Myth::RT_DailyRecord: // TimeslotRecord return second.Title() == first.Title() && daytime(&first_st) == daytime(&second_st) && second.ChannelID() == first.ChannelID() && second.Filter() == first.Filter(); case Myth::RT_WeeklyRecord: // WeekslotRecord return second.Title() == first.Title() && daytime(&first_st) == daytime(&second_st) && weekday(&first_st) == weekday(&second_st) && second.ChannelID() == first.ChannelID() && second.Filter() == first.Filter(); case Myth::RT_FindDailyRecord: return second.Title() == first.Title() && second.ChannelID() == first.ChannelID() && second.Filter() == first.Filter(); case Myth::RT_FindWeeklyRecord: return second.Title() == first.Title() && weekday(&first_st) == weekday(&second_st) && second.ChannelID() == first.ChannelID() && second.Filter() == first.Filter(); case Myth::RT_ChannelRecord: return second.Title() == first.Title() && second.ChannelID() == first.ChannelID() && second.Filter() == first.Filter(); case Myth::RT_AllRecord: return second.Title() == first.Title() && second.Filter() == first.Filter(); default: break; } return false; }