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; }
MythRecordingRule MythScheduleHelper76::NewFromTimer(const MythTimerEntry& entry, bool withTemplate) { // Create a recording rule regarding timer attributes. The match SHOULD be opposite to // that which is applied in function 'FillTimerEntry' MythRecordingRule rule; XBMC->Log(LOG_DEBUG, "76::%s", __FUNCTION__); if (withTemplate) { // Base on template rule = NewFromTemplate(entry.epgInfo); // Override template with timer settings rule.SetStartOffset(rule.StartOffset() + entry.startOffset); rule.SetEndOffset(rule.EndOffset() + entry.endOffset); if (entry.dupMethod != GetRuleDupMethodDefaultId()) { rule.SetDuplicateControlMethod(entry.dupMethod); rule.SetCheckDuplicatesInType(Myth::DI_InAll); } if (entry.priority != GetRulePriorityDefaultId()) rule.SetPriority(entry.priority); if (entry.expiration != GetRuleExpirationDefaultId()) { RuleExpiration exr = GetRuleExpiration(entry.expiration); rule.SetAutoExpire(exr.autoExpire); rule.SetMaxEpisodes(exr.maxEpisodes); rule.SetNewExpiresOldRecord(exr.maxNewest); } if (entry.recordingGroup != RECGROUP_DFLT_ID) rule.SetRecordingGroup(GetRuleRecordingGroupName(entry.recordingGroup)); } else { rule.SetCategory(entry.category); rule.SetStartOffset(entry.startOffset); rule.SetEndOffset(entry.endOffset); rule.SetDuplicateControlMethod(entry.dupMethod); rule.SetPriority(entry.priority); RuleExpiration exr = GetRuleExpiration(entry.expiration); rule.SetAutoExpire(exr.autoExpire); rule.SetMaxEpisodes(exr.maxEpisodes); rule.SetNewExpiresOldRecord(exr.maxNewest); rule.SetRecordingGroup(GetRuleRecordingGroupName(entry.recordingGroup)); } switch (entry.timerType) { case TIMER_TYPE_MANUAL_SEARCH: { if (entry.HasChannel() && entry.HasTimeSlot()) { rule.SetType(Myth::RT_SingleRecord); rule.SetSearchType(Myth::ST_ManualSearch); // Using timeslot rule.SetChannelID(entry.chanid); rule.SetCallsign(entry.callsign); rule.SetStartTime(entry.startTime); rule.SetEndTime(entry.endTime); rule.SetTitle(entry.title); rule.SetDescription(entry.description); rule.SetInactive(entry.isInactive); return rule; } break; } case TIMER_TYPE_THIS_SHOWING: { if (!entry.epgInfo.IsNull()) { rule.SetType(Myth::RT_SingleRecord); rule.SetSearchType(Myth::ST_NoSearch); rule.SetChannelID(entry.epgInfo.ChannelID()); rule.SetStartTime(entry.epgInfo.StartTime()); rule.SetEndTime(entry.epgInfo.EndTime()); rule.SetTitle(entry.epgInfo.Title()); rule.SetSubtitle(entry.epgInfo.Subtitle()); rule.SetDescription(entry.description); rule.SetCallsign(entry.epgInfo.Callsign()); rule.SetCategory(entry.epgInfo.Category()); rule.SetProgramID(entry.epgInfo.ProgramID()); rule.SetSeriesID(entry.epgInfo.SeriesID()); rule.SetInactive(entry.isInactive); return rule; } break; } case TIMER_TYPE_RECORD_ONE: { if (!entry.epgInfo.IsNull()) { rule.SetType(Myth::RT_OneRecord); rule.SetSearchType(Myth::ST_NoSearch); rule.SetChannelID(entry.epgInfo.ChannelID()); rule.SetStartTime(entry.epgInfo.StartTime()); rule.SetEndTime(entry.epgInfo.EndTime()); rule.SetTitle(entry.epgInfo.Title()); rule.SetSubtitle(entry.epgInfo.Subtitle()); rule.SetDescription(entry.description); rule.SetCallsign(entry.epgInfo.Callsign()); rule.SetCategory(entry.epgInfo.Category()); rule.SetProgramID(entry.epgInfo.ProgramID()); rule.SetSeriesID(entry.epgInfo.SeriesID()); rule.SetInactive(entry.isInactive); return rule; } if (!entry.epgSearch.empty()) { rule.SetType(Myth::RT_OneRecord); rule.SetSearchType(Myth::ST_TitleSearch); // Search title if (entry.HasChannel()) { rule.SetFilter(Myth::FM_ThisChannel); rule.SetChannelID(entry.chanid); rule.SetCallsign(entry.callsign); } rule.SetTitle(entry.title); // Backend use the subtitle/description to find program by keywords or title rule.SetSubtitle(""); rule.SetDescription(entry.epgSearch); rule.SetInactive(entry.isInactive); return rule; } break; } case TIMER_TYPE_RECORD_WEEKLY: { if (!entry.epgInfo.IsNull()) { rule.SetType(Myth::RT_AllRecord); rule.SetFilter(Myth::FM_ThisChannel + Myth::FM_ThisDayAndTime); rule.SetSearchType(Myth::ST_NoSearch); rule.SetChannelID(entry.epgInfo.ChannelID()); rule.SetStartTime(entry.epgInfo.StartTime()); rule.SetEndTime(entry.epgInfo.EndTime()); rule.SetTitle(entry.epgInfo.Title()); rule.SetSubtitle(entry.epgInfo.Subtitle()); rule.SetDescription(entry.description); rule.SetCallsign(entry.epgInfo.Callsign()); rule.SetCategory(entry.epgInfo.Category()); rule.SetProgramID(entry.epgInfo.ProgramID()); rule.SetSeriesID(entry.epgInfo.SeriesID()); rule.SetInactive(entry.isInactive); rule.SetDuplicateControlMethod(Myth::DM_CheckNone); return rule; } if (!entry.epgSearch.empty()) { rule.SetType(Myth::RT_WeeklyRecord); rule.SetSearchType(Myth::ST_TitleSearch); // Search title if (entry.HasChannel()) { rule.SetFilter(Myth::FM_ThisChannel); rule.SetChannelID(entry.chanid); rule.SetCallsign(entry.callsign); } rule.SetTitle(entry.title); // Backend use the subtitle/description to find program by keywords or title rule.SetSubtitle(""); rule.SetDescription(entry.epgSearch); rule.SetInactive(entry.isInactive); rule.SetDuplicateControlMethod(Myth::DM_CheckNone); return rule; } if (entry.HasChannel() && entry.HasTimeSlot()) { rule.SetType(Myth::RT_WeeklyRecord); rule.SetSearchType(Myth::ST_ManualSearch); // Using timeslot rule.SetChannelID(entry.chanid); rule.SetCallsign(entry.callsign); rule.SetStartTime(entry.startTime); rule.SetEndTime(entry.endTime); rule.SetTitle(entry.title); rule.SetDescription(entry.description); rule.SetInactive(entry.isInactive); rule.SetDuplicateControlMethod(Myth::DM_CheckNone); return rule; } break; } case TIMER_TYPE_RECORD_DAILY: { if (!entry.epgInfo.IsNull()) { rule.SetType(Myth::RT_AllRecord); rule.SetFilter(Myth::FM_ThisChannel + Myth::FM_ThisTime); rule.SetSearchType(Myth::ST_NoSearch); rule.SetChannelID(entry.epgInfo.ChannelID()); rule.SetStartTime(entry.epgInfo.StartTime()); rule.SetEndTime(entry.epgInfo.EndTime()); rule.SetTitle(entry.epgInfo.Title()); rule.SetSubtitle(entry.epgInfo.Subtitle()); rule.SetDescription(entry.description); rule.SetCallsign(entry.epgInfo.Callsign()); rule.SetCategory(entry.epgInfo.Category()); rule.SetProgramID(entry.epgInfo.ProgramID()); rule.SetSeriesID(entry.epgInfo.SeriesID()); rule.SetInactive(entry.isInactive); rule.SetDuplicateControlMethod(Myth::DM_CheckNone); return rule; } if (!entry.epgSearch.empty()) { rule.SetType(Myth::RT_DailyRecord); rule.SetSearchType(Myth::ST_TitleSearch); // Search title if (entry.HasChannel()) { rule.SetFilter(Myth::FM_ThisChannel); rule.SetChannelID(entry.chanid); rule.SetCallsign(entry.callsign); } rule.SetTitle(entry.title); // Backend use the subtitle/description to find program by keywords or title rule.SetSubtitle(""); rule.SetDescription(entry.epgSearch); rule.SetInactive(entry.isInactive); return rule; } if (entry.HasChannel() && entry.HasTimeSlot()) { rule.SetType(Myth::RT_DailyRecord); rule.SetSearchType(Myth::ST_ManualSearch); // Using timeslot rule.SetChannelID(entry.chanid); rule.SetCallsign(entry.callsign); rule.SetStartTime(entry.startTime); rule.SetEndTime(entry.endTime); rule.SetTitle(entry.title); rule.SetDescription(entry.description); rule.SetInactive(entry.isInactive); rule.SetDuplicateControlMethod(Myth::DM_CheckNone); return rule; } break; } case TIMER_TYPE_RECORD_ALL: { if (!entry.epgInfo.IsNull()) { rule.SetType(Myth::RT_AllRecord); rule.SetFilter(Myth::FM_ThisChannel); rule.SetSearchType(Myth::ST_NoSearch); rule.SetChannelID(entry.epgInfo.ChannelID()); rule.SetStartTime(entry.epgInfo.StartTime()); rule.SetEndTime(entry.epgInfo.EndTime()); rule.SetTitle(entry.epgInfo.Title()); rule.SetSubtitle(entry.epgInfo.Subtitle()); rule.SetDescription(entry.description); rule.SetCallsign(entry.epgInfo.Callsign()); rule.SetCategory(entry.epgInfo.Category()); rule.SetProgramID(entry.epgInfo.ProgramID()); rule.SetSeriesID(entry.epgInfo.SeriesID()); rule.SetInactive(entry.isInactive); return rule; } if (!entry.epgSearch.empty()) { rule.SetType(Myth::RT_AllRecord); rule.SetSearchType(Myth::ST_TitleSearch); // Search title if (entry.HasChannel()) { rule.SetFilter(Myth::FM_ThisChannel); rule.SetChannelID(entry.chanid); rule.SetCallsign(entry.callsign); } rule.SetTitle(entry.title); // Backend use the subtitle/description to find program by keywords or title rule.SetSubtitle(""); rule.SetDescription(entry.epgSearch); rule.SetInactive(entry.isInactive); return rule; } break; } case TIMER_TYPE_RECORD_SERIES: { if (!entry.epgInfo.IsNull()) { rule.SetType(Myth::RT_AllRecord); rule.SetFilter(Myth::FM_ThisChannel | Myth::FM_ThisSeries); rule.SetSearchType(Myth::ST_NoSearch); rule.SetChannelID(entry.epgInfo.ChannelID()); rule.SetStartTime(entry.epgInfo.StartTime()); rule.SetEndTime(entry.epgInfo.EndTime()); rule.SetTitle(entry.epgInfo.Title()); rule.SetSubtitle(entry.epgInfo.Subtitle()); rule.SetDescription(entry.description); rule.SetCallsign(entry.epgInfo.Callsign()); rule.SetCategory(entry.epgInfo.Category()); rule.SetProgramID(entry.epgInfo.ProgramID()); rule.SetSeriesID(entry.epgInfo.SeriesID()); rule.SetInactive(entry.isInactive); return rule; } break; } case TIMER_TYPE_SEARCH_KEYWORD: { if (!entry.epgSearch.empty()) { rule.SetType(Myth::RT_AllRecord); rule.SetSearchType(Myth::ST_KeywordSearch); // Search keyword if (entry.HasChannel()) { rule.SetFilter(Myth::FM_ThisChannel); rule.SetChannelID(entry.chanid); rule.SetCallsign(entry.callsign); } rule.SetTitle(entry.title); // Backend use the subtitle/description to find program by keywords or title rule.SetSubtitle(""); rule.SetDescription(entry.epgSearch); rule.SetInactive(entry.isInactive); return rule; } break; } case TIMER_TYPE_SEARCH_PEOPLE: { if (!entry.epgSearch.empty()) { rule.SetType(Myth::RT_AllRecord); rule.SetSearchType(Myth::ST_PeopleSearch); // Search people if (entry.HasChannel()) { rule.SetFilter(Myth::FM_ThisChannel); rule.SetChannelID(entry.chanid); rule.SetCallsign(entry.callsign); } rule.SetTitle(entry.title); // Backend use the subtitle/description to find program by keywords or title rule.SetSubtitle(""); rule.SetDescription(entry.epgSearch); rule.SetInactive(entry.isInactive); return rule; } break; } case TIMER_TYPE_DONT_RECORD: rule.SetType(Myth::RT_DontRecord); rule.SetChannelID(entry.chanid); rule.SetCallsign(entry.callsign); rule.SetStartTime(entry.startTime); rule.SetEndTime(entry.endTime); rule.SetTitle(entry.title); rule.SetDescription(entry.description); rule.SetInactive(entry.isInactive); return rule; case TIMER_TYPE_OVERRIDE: rule.SetType(Myth::RT_OverrideRecord); rule.SetChannelID(entry.chanid); rule.SetCallsign(entry.callsign); rule.SetStartTime(entry.startTime); rule.SetEndTime(entry.endTime); rule.SetTitle(entry.title); rule.SetDescription(entry.description); rule.SetInactive(entry.isInactive); return rule; case TIMER_TYPE_UPCOMING: case TIMER_TYPE_RULE_INACTIVE: case TIMER_TYPE_UPCOMING_ALTERNATE: case TIMER_TYPE_UPCOMING_RECORDED: case TIMER_TYPE_UPCOMING_EXPIRED: case TIMER_TYPE_UPCOMING_MANUAL: case TIMER_TYPE_ZOMBIE: rule.SetType(Myth::RT_SingleRecord); rule.SetChannelID(entry.chanid); rule.SetCallsign(entry.callsign); rule.SetStartTime(entry.startTime); rule.SetEndTime(entry.endTime); rule.SetTitle(entry.title); rule.SetDescription(entry.description); rule.SetInactive(entry.isInactive); return rule; default: break; } rule.SetType(Myth::RT_UNKNOWN); XBMC->Log(LOG_ERROR, "76::%s: Invalid timer %u: TYPE=%d CHANID=%u SIGN=%s ST=%u ET=%u", __FUNCTION__, entry.entryIndex, entry.timerType, entry.chanid, entry.callsign.c_str(), (unsigned)entry.startTime, (unsigned)entry.endTime); return rule; }