void ViewScheduled::deleteRule() { MythUIButtonListItem *item = m_schedulesList->GetItemCurrent(); if (!item) return; ProgramInfo *pginfo = qVariantValue<ProgramInfo*>(item->GetData()); if (!pginfo) return; RecordingRule *record = new RecordingRule(); if (!record->LoadByProgram(pginfo)) { delete record; return; } QString message = tr("Delete '%1' %2 rule?").arg(record->m_title) .arg(toString(pginfo->GetRecordingRuleType())); MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack"); MythConfirmationDialog *okPopup = new MythConfirmationDialog(popupStack, message, true); okPopup->SetReturnEvent(this, "deleterule"); okPopup->SetData(qVariantFromValue(record)); if (okPopup->Create()) popupStack->AddScreen(okPopup); else delete okPopup; }
bool Dvr::DeleteRecording(int RecordedId, int chanid, const QDateTime &recstarttsRaw, bool forceDelete, bool allowRerecord) { if ((RecordedId <= 0) && (chanid <= 0 || !recstarttsRaw.isValid())) throw QString("Recorded ID or Channel ID and StartTime appears invalid."); // TODO Should use RecordingInfo ProgramInfo pi; if (RecordedId > 0) pi = ProgramInfo(RecordedId); else pi = ProgramInfo(chanid, recstarttsRaw.toUTC()); if (pi.GetChanID() && pi.HasPathname()) { QString cmd = QString("DELETE_RECORDING %1 %2 %3 %4") .arg(pi.GetChanID()) .arg(pi.GetRecordingStartTime(MythDate::ISODate)) .arg(forceDelete ? "FORCE" : "NO_FORCE") .arg(allowRerecord ? "FORGET" : "NO_FORGET"); MythEvent me(cmd); gCoreContext->dispatch(me); return true; } return false; }
ProgramInfo *getProgramInfoForFile(const QString &inFile) { ProgramInfo *pinfo = NULL; QString chanID, startTime; bool bIsMythRecording = false; bIsMythRecording = extractDetailsFromFilename(inFile, chanID, startTime); if (bIsMythRecording) { uint chanid = chanID.toUInt(); QDateTime recstartts = MythDate::fromString(startTime); pinfo = new ProgramInfo(chanid, recstartts); if (pinfo->GetChanID()) { pinfo->SetPathname(pinfo->GetPlaybackURL(false, true)); } else { delete pinfo; pinfo = NULL; } } if (!pinfo) { // file is not a myth recording or is no longer in the db pinfo = new ProgramInfo(inFile); LOG(VB_JOBQUEUE, LOG_NOTICE, "File is not a MythTV recording."); } else LOG(VB_JOBQUEUE, LOG_NOTICE, "File is a MythTV recording."); return pinfo; }
void ThumbFinder::loadCutList() { ProgramInfo *progInfo = getProgramInfoForFile(m_archiveItem->filename); if (progInfo && m_archiveItem->hasCutlist) { progInfo->QueryCutList(m_deleteMap); delete progInfo; } if (m_deleteMap.isEmpty()) { LOG(VB_GENERAL, LOG_ERR, "ThumbFinder::loadCutList: Got an empty delete map"); return; } // if the first mark is a end mark then add the start mark at the beginning frm_dir_map_t::const_iterator it = m_deleteMap.begin(); if (it.value() == MARK_CUT_END) m_deleteMap.insert(0, MARK_CUT_START); // if the last mark is a start mark then add the end mark at the end it = m_deleteMap.end(); --it; if (it != m_deleteMap.end()) { if (it.value() == MARK_CUT_START) m_deleteMap.insert(m_archiveItem->duration * m_fps, MARK_CUT_END); } }
/// \brief Copies important fields from ProgramInfo void RecordingInfo::clone(const ProgramInfo &other, bool ignore_non_serialized_data) { bool is_same = (chanid && recstartts.isValid() && startts.isValid() && chanid == other.GetChanID() && recstartts == other.GetRecordingStartTime() && startts == other.GetScheduledStartTime()); ProgramInfo::clone(other, ignore_non_serialized_data); if (!is_same) { delete record; record = NULL; } oldrecstatus = rsUnknown; savedrecstatus = rsUnknown; future = false; schedorder = 0; mplexid = 0; desiredrecstartts = QDateTime(); desiredrecendts = QDateTime(); }
void RecordingSelector::updateSelectedList() { if (!m_recordingList) return; m_selectedList.clear(); ProgramInfo *p; ArchiveItem *a; for (int x = 0; x < m_archiveList->size(); x++) { a = m_archiveList->at(x); for (uint y = 0; y < m_recordingList->size(); y++) { p = m_recordingList->at(y); if (p->GetPlaybackURL(false, true) == a->filename) { if (m_selectedList.indexOf(p) == -1) m_selectedList.append(p); break; } qApp->processEvents(); } } }
void PreviewGeneratorQueue::GetPreviewImage( const ProgramInfo &pginfo, const QSize &outputsize, const QString &outputfile, long long time, bool in_seconds, QString token) { if (!s_pgq) return; if (pginfo.GetPathname().isEmpty() || pginfo.GetBasename() == pginfo.GetPathname()) { return; } QStringList extra; pginfo.ToStringList(extra); extra += token; extra += QString::number(outputsize.width()); extra += QString::number(outputsize.height()); extra += outputfile; extra += QString::number(time); extra += (in_seconds ? "1" : "0"); MythEvent *e = new MythEvent("GET_PREVIEW", extra); QCoreApplication::postEvent(s_pgq, e); }
/** \fn EncoderLink::MatchesRecording(const ProgramInfo *rec) * \brief Returns true if rec is actually being recorded by TVRec. * * This waits for TVRec to enter a state other than kState_ChangingState * Then it checks TVRec::GetRecording() against rec. * \param rec Recording to check against TVRec::GetRecording(). * \sa IsRecording(const ProgramInfo*) */ bool EncoderLink::MatchesRecording(const ProgramInfo *rec) { bool retval = false; ProgramInfo *tvrec = NULL; if (local) { while (kState_ChangingState == GetState()) usleep(100); if (IsBusyRecording()) tvrec = tv->GetRecording(); if (tvrec) { retval = tvrec->IsSameRecording(*rec); delete tvrec; } } else { if (HasSockAndIncrRef()) { ReferenceLocker rlocker(sock); retval = sock->EncoderIsRecording(m_capturecardnum, rec); } } return retval; }
void ProgLister::ShowDeleteRuleMenu(void) { ProgramInfo *pi = GetCurrent(); if (!pi || !pi->GetRecordingRuleID()) return; RecordingRule *record = new RecordingRule(); if (!record->LoadByProgram(pi)) { delete record; return; } QString message = tr("Delete '%1' %2 rule?").arg(record->m_title) .arg(toString(pi->GetRecordingRuleType())); MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack"); MythConfirmationDialog *okPopup = new MythConfirmationDialog( popupStack, message, true); okPopup->SetReturnEvent(this, "deleterule"); okPopup->SetData(qVariantFromValue(record)); if (okPopup->Create()) popupStack->AddScreen(okPopup); else delete okPopup; }
void RecordingSelector::getRecordingList(void) { ProgramInfo *p; m_recordingList = RemoteGetRecordedList(-1); m_categories.clear(); if (m_recordingList && !m_recordingList->empty()) { vector<ProgramInfo *>::iterator i = m_recordingList->begin(); for ( ; i != m_recordingList->end(); ++i) { p = *i; // ignore live tv and deleted recordings if (p->GetRecordingGroup() == "LiveTV" || p->GetRecordingGroup() == "Deleted") { i = m_recordingList->erase(i); --i; continue; } if (m_categories.indexOf(p->GetTitle()) == -1) m_categories.append(p->GetTitle()); } } }
/** * \brief Show the previous recordings for this recording rule */ void ScheduleCommon::ShowPrevious(void) const { ProgramInfo *pginfo = GetCurrentProgram(); if (!pginfo) return; ShowPrevious(pginfo->GetRecordingRuleID(), pginfo->GetTitle()); }
/** \brief Adds a ProgramInfo to the cache. * \note This must only be called from the UI thread. */ void ProgramInfoCache::Add(const ProgramInfo &pginfo) { if (!pginfo.GetChanID() || Update(pginfo)) return; PICKey key(pginfo.GetChanID(),pginfo.GetRecordingStartTime()); m_cache[key] = new ProgramInfo(pginfo); }
void LiveTVChain::SetProgram(const ProgramInfo &pginfo) { QMutexLocker lock(&m_lock); m_cur_chanid = pginfo.GetChanID(); m_cur_startts = pginfo.GetRecordingStartTime(); m_curpos = ProgramIsAt(pginfo); m_switchid = -1; }
void ProgLister::ClearCurrentProgramInfo(void) { InfoMap infoMap; ProgramInfo pginfo; pginfo.ToMap(infoMap); ResetMap(infoMap); if (m_positionText) m_positionText->Reset(); }
DTC::ArtworkInfoList* Content::GetRecordingArtworkList( int nChanId, const QDateTime &dStartTime ) { if (nChanId <= 0 || !dStartTime.isValid()) throw( QString("Channel ID or StartTime appears invalid.")); ProgramInfo pInfo = ProgramInfo(nChanId, dStartTime); return GetProgramArtworkList(pInfo.GetInetRef(), pInfo.GetSeason()); }
void ThumbFinder::loadCutList() { ProgramInfo *progInfo = getProgramInfoForFile(m_archiveItem->filename); if (progInfo && m_archiveItem->hasCutlist) { progInfo->QueryCutList(m_deleteMap); delete progInfo; } }
/** * \brief Show the program guide */ void ScheduleCommon::ShowGuide(void) const { ProgramInfo *pginfo = GetCurrentProgram(); if (!pginfo) return; QString startchannel = pginfo->GetChanNum(); uint startchanid = pginfo->GetChanID(); QDateTime starttime = pginfo->GetScheduledStartTime(); GuideGrid::RunProgramGuide(startchanid, startchannel, starttime); }
void ProgLister::ShowDeleteOldSeriesMenu(void) { ProgramInfo *pi = GetCurrent(); if (!pi) return; QString message = tr("Delete all episodes of '%1'?").arg(pi->GetTitle()); ShowOkPopup(message, this, SLOT(DeleteOldSeries(bool)), true); }
/** \brief Updates a ProgramInfo in the cache. * \note This must only be called from the UI thread. * \return True iff the ProgramInfo was in the cache and was updated. */ bool ProgramInfoCache::Update(const ProgramInfo &pginfo) { QMutexLocker locker(&m_lock); Cache::iterator it = m_cache.find( PICKey(pginfo.GetChanID(),pginfo.GetRecordingStartTime())); if (it != m_cache.end()) it->second->clone(pginfo, true); return it != m_cache.end(); }
/** * \brief Show the upcoming recordings for this title */ void ScheduleCommon::ShowUpcoming(void) const { ProgramInfo *pginfo = GetCurrentProgram(); if (!pginfo) return; if (pginfo->GetChanID() == 0 && pginfo->GetRecordingRuleID() > 0) return ShowUpcomingScheduled(); ShowUpcoming(pginfo->GetTitle(), pginfo->GetSeriesID()); }
QFileInfo Content::GetRecording( int nRecordedId, int nChanId, const QDateTime &recstarttsRaw ) { if ((nRecordedId <= 0) && (nChanId <= 0 || !recstarttsRaw.isValid())) throw QString("Recorded ID or Channel ID and StartTime appears invalid."); // ------------------------------------------------------------------ // Read Recording From Database // ------------------------------------------------------------------ // TODO Should use RecordingInfo ProgramInfo pginfo; if (nRecordedId > 0) pginfo = ProgramInfo(nRecordedId); else pginfo = ProgramInfo(nChanId, recstarttsRaw.toUTC()); if (!pginfo.GetChanID()) { LOG(VB_UPNP, LOG_ERR, QString("GetRecording - for '%1' failed") .arg(nRecordedId)); return QFileInfo(); } if (pginfo.GetHostname().toLower() != gCoreContext->GetHostName().toLower()) { // We only handle requests for local resources QString sMsg = QString("GetRecording: Wrong Host '%1' request from '%2'.") .arg( gCoreContext->GetHostName()) .arg( pginfo.GetHostname() ); LOG(VB_UPNP, LOG_ERR, sMsg); throw HttpRedirectException( pginfo.GetHostname() ); } QString sFileName( GetPlaybackURL(&pginfo) ); // ---------------------------------------------------------------------- // check to see if the file exists // ---------------------------------------------------------------------- if (QFile::exists( sFileName )) return QFileInfo( sFileName ); return QFileInfo(); }
static int GetMarkupList(const MythUtilCommandLineParser &cmdline, const QString type) { ProgramInfo pginfo; if (!GetProgramInfo(cmdline, pginfo)) return GENERIC_EXIT_NO_RECORDING_DATA; frm_dir_map_t cutlist; frm_dir_map_t::const_iterator it; QString result; if (type == "cutlist") pginfo.QueryCutList(cutlist); else pginfo.QueryCommBreakList(cutlist); uint64_t lastStart = 0; for (it = cutlist.begin(); it != cutlist.end(); ++it) { if ((*it == MARK_COMM_START) || (*it == MARK_CUT_START)) { if (!result.isEmpty()) result += ","; lastStart = it.key(); result += QString("%1-").arg(lastStart); } else { if (result.isEmpty()) result += "0-"; result += QString("%1").arg(it.key()); } } if (result.endsWith('-')) { uint64_t lastFrame = pginfo.QueryLastFrameInPosMap() + 60; if (lastFrame > lastStart) result += QString("%1").arg(lastFrame); } if (type == "cutlist") cout << QString("Cutlist: %1\n").arg(result).toLocal8Bit().constData(); else { cout << QString("Commercial Skip List: %1\n") .arg(result).toLocal8Bit().constData(); } return GENERIC_EXIT_OK; }
void ViewScheduleDiff::updateInfo(MythUIButtonListItem *item) { if (!item) return; ProgramInfo *pginfo = qVariantValue<ProgramInfo*> (item->GetData()); if (pginfo) { InfoMap infoMap; pginfo->ToMap(infoMap); SetTextFromMap(infoMap); } }
void RecordingSelector::titleChanged(MythUIButtonListItem *item) { ProgramInfo *p; p = qVariantValue<ProgramInfo *>(item->GetData()); if (!p) return; if (m_titleText) m_titleText->SetText(p->GetTitle()); if (m_datetimeText) m_datetimeText->SetText(p->GetScheduledStartTime() .toString("dd MMM yy (hh:mm)")); if (m_descriptionText) { m_descriptionText->SetText( ((!p->GetSubtitle().isEmpty()) ? p->GetSubtitle() + "\n" : "") + p->GetDescription()); } if (m_filesizeText) { m_filesizeText->SetText(formatSize(p->GetFilesize() / 1024)); } if (m_cutlistImage) { if (p->HasCutlist()) m_cutlistImage->Show(); else m_cutlistImage->Hide(); } if (m_previewImage) { // try to locate a preview image if (QFile::exists(p->GetPathname() + ".png")) { m_previewImage->SetFilename(p->GetPathname() + ".png"); m_previewImage->Load(); } else { m_previewImage->SetFilename("blank.png"); m_previewImage->Load(); } } }
void ProgFinder::edit() { if (GetFocusWidget() == m_timesList) { ProgramInfo *curPick = m_showData[m_timesList->GetCurrentPos()]; if (curPick) { EditScheduled(curPick); // TODO: When schedule editor is non-blocking, move selectShowData(curPick->GetTitle(), m_timesList->GetCurrentPos()); } } }
/** * \brief Show the previous recordings for this recording rule */ void ScheduleCommon::ShowPrevious(void) const { ProgramInfo *pginfo = GetCurrentProgram(); if (!pginfo) return; MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack(); ProgLister *pl = new ProgLister(mainStack, pginfo->GetRecordingRuleID(), pginfo->GetTitle()); if (pl->Create()) mainStack->AddScreen(pl); else delete pl; }
void LookerUpper::HandleAllRecordings(bool updaterules) { QMap< QString, ProgramInfo* > recMap; QMap< QString, uint32_t > inUseMap = ProgramInfo::QueryInUseMap(); QMap< QString, bool > isJobRunning = ProgramInfo::QueryJobsRunning(JOB_COMMFLAG); m_updaterules = updaterules; ProgramList progList; LoadFromRecorded( progList, false, inUseMap, isJobRunning, recMap, -1 ); for( int n = 0; n < (int)progList.size(); n++) { ProgramInfo *pginfo = new ProgramInfo(*(progList[n])); if ((pginfo->GetRecordingGroup() != "Deleted") && (pginfo->GetRecordingGroup() != "LiveTV") && (pginfo->GetInetRef().isEmpty() || (!pginfo->GetSubtitle().isEmpty() && (pginfo->GetSeason() == 0) && (pginfo->GetEpisode() == 0)))) { QString msg = QString("Looking up: %1 %2").arg(pginfo->GetTitle()) .arg(pginfo->GetSubtitle()); LOG(VB_GENERAL, LOG_INFO, msg); m_busyRecList.append(pginfo); m_metadataFactory->Lookup(pginfo, true, false, false); } else delete pginfo; } }
ProgramInfo ProgramInfo::FromSam(const std::string& sam) { // pop off '@PG\t', then split rest of line into tokens const std::vector<std::string>& tokens = internal::Split(sam.substr(4), '\t'); if (tokens.empty()) return ProgramInfo(); ProgramInfo prog; std::map<std::string, std::string> custom; // iterate over tokens for (const std::string& token : tokens) { const std::string& tokenTag = token.substr(0,2); const std::string& tokenValue = token.substr(3); // set program contents if (tokenTag == internal::token_ID) prog.Id(tokenValue); else if (tokenTag == internal::token_CL) prog.CommandLine(tokenValue); else if (tokenTag == internal::token_DS) prog.Description(tokenValue); else if (tokenTag == internal::token_PN) prog.Name(tokenValue); else if (tokenTag == internal::token_PP) prog.PreviousProgramId(tokenValue); else if (tokenTag == internal::token_VN) prog.Version(tokenValue); // otherwise, "custom" tag else custom[tokenTag] = tokenValue; } prog.CustomTags(custom); return prog; }
static int SetMarkupList(const MythUtilCommandLineParser &cmdline, const QString &type, QString newList) { ProgramInfo pginfo; if (!GetProgramInfo(cmdline, pginfo)) return GENERIC_EXIT_NO_RECORDING_DATA; bool isCutlist = (type == "cutlist"); frm_dir_map_t markuplist; newList.replace(QRegExp(" "), ""); QStringList tokens = newList.split(",", QString::SkipEmptyParts); if (newList.isEmpty()) newList = "(EMPTY)"; for (int i = 0; i < tokens.size(); i++) { QStringList cutpair = tokens[i].split("-", QString::SkipEmptyParts); if (isCutlist) { markuplist[cutpair[0].toInt()] = MARK_CUT_START; markuplist[cutpair[1].toInt()] = MARK_CUT_END; } else { markuplist[cutpair[0].toInt()] = MARK_COMM_START; markuplist[cutpair[1].toInt()] = MARK_COMM_END; } } if (isCutlist) { pginfo.SaveCutList(markuplist); cout << QString("Cutlist set to: %1\n") .arg(newList).toLocal8Bit().constData(); LOG(VB_GENERAL, LOG_NOTICE, QString("Cutlist set to: %1").arg(newList)); } else { pginfo.SaveCommBreakList(markuplist); cout << QString("Commercial Skip List set to: %1\n") .arg(newList).toLocal8Bit().constData(); LOG(VB_GENERAL, LOG_NOTICE, QString("Commercial Skip List set to: %1").arg(newList)); } return GENERIC_EXIT_OK; }
/** * \brief Create a kSingleRecord or bring up recording dialog. */ void ScheduleCommon::QuickRecord(void) { ProgramInfo *pginfo = GetCurrentProgram(); if (!pginfo) return; if (pginfo->GetRecordingRuleID()) EditRecording(); else { RecordingInfo ri(*pginfo); ri.QuickRecord(); *pginfo = ri; } }