RecordingQuality::RecordingQuality( const RecordingInfo *ri, const RecordingGaps &rg, const QDateTime &first, const QDateTime &latest) : m_continuity_error_count(0), m_packet_count(0), m_overall_score(1.0), m_recording_gaps(rg) { if (!ri) return; m_program_key = ri->MakeUniqueKey(); // trim start QDateTime start = get_start(*ri); while (!m_recording_gaps.empty() && m_recording_gaps.first().GetStart() < start) { RecordingGap &first = m_recording_gaps.first(); if (start < first.GetEnd()) first = RecordingGap(start, first.GetEnd()); else m_recording_gaps.pop_front(); } // trim end QDateTime end = get_end(*ri); while (!m_recording_gaps.empty() && m_recording_gaps.back().GetEnd() > end) { RecordingGap &back = m_recording_gaps.back(); if (back.GetStart() < end) back = RecordingGap(back.GetStart(), end); else m_recording_gaps.pop_back(); } // account for late start int start_gap = (first.isValid()) ? start.secsTo(first) : 0; if (start_gap > 15) m_recording_gaps.push_front(RecordingGap(start, first)); // account for missing end int end_gap = (latest.isValid()) ? latest.secsTo(end) : 0; if (end_gap > 15) m_recording_gaps.push_back(RecordingGap(latest, end)); stable_sort(m_recording_gaps.begin(), m_recording_gaps.end()); merge_overlapping(m_recording_gaps); m_overall_score = score_gaps(*ri, m_recording_gaps); LOG(VB_RECORD, LOG_INFO, QString("RecordingQuality() start(%1) end(%2) score(%3)") .arg(MythDate::toString(start, MythDate::ISODate)) .arg(MythDate::toString(end, MythDate::ISODate)) .arg(m_overall_score)); }