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; }
MythRecordingRule MythScheduleHelper75::NewFromTemplate(const MythEPGInfo& epgInfo) { MythRecordingRule rule; // Load rule template from selected provider switch (g_iRecTemplateType) { case 1: // Template provider is 'MythTV', then load the template from backend. if (!epgInfo.IsNull()) { MythRecordingRuleList templates = m_manager->GetTemplateRules(); MythRecordingRuleList::const_iterator tplIt = templates.end(); for (MythRecordingRuleList::const_iterator it = templates.begin(); it != templates.end(); ++it) { if (it->Category() == epgInfo.Category()) { tplIt = it; break; } if (it->Category() == epgInfo.CategoryType()) { tplIt = it; continue; } if (it->Category() == "Default" && tplIt == templates.end()) tplIt = it; } if (tplIt != templates.end()) { XBMC->Log(LOG_INFO, "75::%s: Overriding the rule with template %u '%s'", __FUNCTION__, (unsigned)tplIt->RecordID(), tplIt->Title().c_str()); rule.SetPriority(tplIt->Priority()); rule.SetStartOffset(tplIt->StartOffset()); rule.SetEndOffset(tplIt->EndOffset()); rule.SetSearchType(tplIt->SearchType()); rule.SetDuplicateControlMethod(tplIt->DuplicateControlMethod()); rule.SetCheckDuplicatesInType(tplIt->CheckDuplicatesInType()); rule.SetRecordingGroup(tplIt->RecordingGroup()); rule.SetRecordingProfile(tplIt->RecordingProfile()); rule.SetStorageGroup(tplIt->StorageGroup()); rule.SetPlaybackGroup(tplIt->PlaybackGroup()); rule.SetUserJob(1, tplIt->UserJob(1)); rule.SetUserJob(2, tplIt->UserJob(2)); rule.SetUserJob(3, tplIt->UserJob(3)); rule.SetUserJob(4, tplIt->UserJob(4)); rule.SetAutoTranscode(tplIt->AutoTranscode()); rule.SetAutoCommFlag(tplIt->AutoCommFlag()); rule.SetAutoExpire(tplIt->AutoExpire()); rule.SetAutoMetadata(tplIt->AutoMetadata()); rule.SetMaxEpisodes(tplIt->MaxEpisodes()); rule.SetNewExpiresOldRecord(tplIt->NewExpiresOldRecord()); rule.SetFilter(tplIt->Filter()); rule.SetCategory(tplIt->Category()); } else XBMC->Log(LOG_INFO, "75::%s: No template found for the category '%s'", __FUNCTION__, epgInfo.Category().c_str()); } break; case 0: // Template provider is 'Internal', then set rule with settings rule.SetAutoCommFlag(g_bRecAutoCommFlag); rule.SetAutoMetadata(g_bRecAutoMetadata); rule.SetAutoTranscode(g_bRecAutoTranscode); rule.SetUserJob(1, g_bRecAutoRunJob1); rule.SetUserJob(2, g_bRecAutoRunJob2); rule.SetUserJob(3, g_bRecAutoRunJob3); rule.SetUserJob(4, g_bRecAutoRunJob4); rule.SetAutoExpire(g_bRecAutoExpire); rule.SetTranscoder(g_iRecTranscoder); // set defaults rule.SetPriority(GetRulePriorityDefaultId()); rule.SetDuplicateControlMethod(static_cast<Myth::DM_t>(GetRuleDupMethodDefaultId())); rule.SetCheckDuplicatesInType(Myth::DI_InAll); rule.SetRecordingGroup(GetRuleRecordingGroupName(GetRuleRecordingGroupDefaultId())); } // Category override if (!epgInfo.IsNull()) { Myth::SettingPtr overTimeCategory = m_control->GetSetting("OverTimeCategory", false); if (overTimeCategory && (overTimeCategory->value == epgInfo.Category() || overTimeCategory->value == epgInfo.CategoryType())) { Myth::SettingPtr categoryOverTime = m_control->GetSetting("CategoryOverTime", false); if (categoryOverTime && !categoryOverTime->value.empty()) { int offset = atoi(categoryOverTime->value.c_str()); XBMC->Log(LOG_DEBUG, "75::%s: Overriding end offset for category %s: +%d", __FUNCTION__, overTimeCategory->value.c_str(), offset); rule.SetEndOffset(offset); } } } return rule; }