MythRecordingRule MythScheduleHelper75::MakeOverride(const MythRecordingRule& rule, const MythProgramInfo& recording) { MythRecordingRule modifier = rule.DuplicateRecordingRule(); // Do the same as backend even we know the modifier will be rejected for manual rule: // Don't know if this behavior is a bug issue or desired: cf libmythtv/recordingrule.cpp if (modifier.SearchType() != Myth::ST_ManualSearch) modifier.SetSearchType(Myth::ST_NoSearch); modifier.SetType(Myth::RT_OverrideRecord); modifier.SetParentID(modifier.RecordID()); modifier.SetRecordID(0); modifier.SetInactive(false); // Assign recording info modifier.SetTitle(recording.Title()); modifier.SetSubtitle(recording.Subtitle()); modifier.SetDescription(recording.Description()); modifier.SetChannelID(recording.ChannelID()); modifier.SetCallsign(recording.Callsign()); modifier.SetStartTime(recording.StartTime()); modifier.SetEndTime(recording.EndTime()); modifier.SetSeriesID(recording.SerieID()); modifier.SetProgramID(recording.ProgramID()); modifier.SetCategory(recording.Category()); if (rule.InetRef().empty()) { modifier.SetInerRef(recording.Inetref()); modifier.SetSeason(recording.Season()); modifier.SetEpisode(recording.Episode()); } return modifier; }
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; }