21 QString str =
"QUERY_RECORDINGS ";
29 QStringList strlist(str);
31 auto *
info =
new std::vector<ProgramInfo *>;
44 QStringList strlist(QString(
"QUERY_LOAD"));
48 load[0] = strlist[0].toDouble();
49 load[1] = strlist[1].toDouble();
50 load[2] = strlist[2].toDouble();
59 QStringList strlist(QString(
"QUERY_UPTIME"));
64 if (strlist[0].isEmpty() || !strlist[0].at(0).isNumber())
67 if (
sizeof(std::chrono::seconds::rep) ==
sizeof(
long long))
68 uptime = std::chrono::seconds(strlist[0].toLongLong());
69 else if (
sizeof(std::chrono::seconds::rep) ==
sizeof(
long))
70 uptime = std::chrono::seconds(strlist[0].toLong());
71 else if (
sizeof(std::chrono::seconds::rep) ==
sizeof(
int))
72 uptime = std::chrono::seconds(strlist[0].toInt());
79 QStringList strlist(QString(
"QUERY_MEMSTATS"));
83 totalMB = strlist[0].toInt();
84 freeMB = strlist[1].toInt();
85 totalVM = strlist[2].toInt();
86 freeVM = strlist[3].toInt();
95 QStringList strlist(
"QUERY_CHECKFILE");
96 strlist << QString::number((
int)checkSlaves);
100 (strlist.size() < 2) || !strlist[0].toInt())
105 QString localpath = strlist[1];
106 QFile checkFile(localpath);
107 if (checkFile.exists())
120 QString(
"DELETE_RECORDING %1 %2 %3 %4")
121 .arg(QString::number(recInfo.
GetChanID()),
123 forceMetadataDelete ?
"FORCE" :
"NO_FORCE",
124 forgetHistory ?
"FORGET" :
"NO_FORGET");
125 QStringList strlist(cmd);
128 (strlist[0].toInt() == -2))
133 LOG(VB_GENERAL, LOG_ALERT,
134 QString(
"Failed to delete recording %1:%2")
153 QStringList strlist(QString(
"UNDELETE_RECORDING"));
154 strlist.push_back(QString::number(recInfo.
GetChanID()));
159 if (!strlist.isEmpty() && strlist[0].toInt() == 0)
167 QStringList strList(QString(
"QUERY_GETALLSCHEDULED"));
173 QStringList strList(QString(
"QUERY_GETEXPIRING"));
178 std::vector<ProgramInfo *> &reclist, QStringList &strList)
183 int numrecordings = strList[0].toInt();
184 if (numrecordings <= 0)
189 LOG(VB_GENERAL, LOG_ERR,
190 "RemoteGetRecordingList() list size appears to be incorrect.");
194 uint reclist_initial_size = (
uint) reclist.size();
195 QStringList::const_iterator it = strList.cbegin() + 1;
196 for (
int i = 0; i < numrecordings; i++)
198 auto *pginfo =
new ProgramInfo(it, strList.cend());
199 reclist.push_back(pginfo);
202 return ((
uint) reclist.size()) - reclist_initial_size;
207 QString cmd = QString(
"QUERY_GETCONFLICTING");
208 QStringList strlist( cmd );
211 auto *retlist =
new std::vector<ProgramInfo *>;
219 QStringList strlist(
"QUERY_PIXMAP_LASTMODIFIED" );
225 if (!strlist.isEmpty() && !strlist[0].isEmpty() && (strlist[0] !=
"BAD"))
227 qint64 timet = strlist[0].toLongLong();
237 const ProgramInfo &pginfo,
const QString &cachefile)
239 QString loc(
"RemoteGetPreviewIfModified: ");
240 QDateTime cacheLastModified;
241 QFileInfo cachefileinfo(cachefile);
242 if (cachefileinfo.exists())
243 cacheLastModified = cachefileinfo.lastModified();
245 QStringList strlist(
"QUERY_PIXMAP_GET_IF_MODIFIED");
246 strlist << ((cacheLastModified.isValid()) ?
247 QString::number(cacheLastModified.toSecsSinceEpoch()) :
249 strlist << QString::number(200 * 1024);
253 strlist.isEmpty() || strlist[0] ==
"ERROR")
255 LOG(VB_GENERAL, LOG_ERR, loc +
"Remote error" +
256 ((strlist.size() >= 2) ? (
":\n\t\t\t" + strlist[1]) :
""));
261 if (strlist[0] ==
"WARNING")
263 LOG(VB_NETWORK, LOG_WARNING, loc +
"Remote warning" +
264 ((strlist.size() >= 2) ? (
":\n\t\t\t" + strlist[1]) :
""));
269 QDateTime retdatetime;
270 qlonglong timet = strlist[0].toLongLong();
276 if (strlist.size() < 4)
281 size_t length = strlist[1].toULongLong();
282 quint16 checksum16 = strlist[2].toUInt();
283 QByteArray data = QByteArray::fromBase64(strlist[3].toLatin1());
284 if ((
size_t) data.size() < length)
286 LOG(VB_GENERAL, LOG_ERR, loc +
287 QString(
"Preview size check failed %1 < %2")
288 .arg(data.size()).arg(length));
293#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
294 quint16 calculated = qChecksum(data.constData(), data.size());
296 quint16 calculated = qChecksum(data);
298 if (checksum16 != calculated)
300 LOG(VB_GENERAL, LOG_ERR, loc +
"Preview checksum failed");
304 QString pdir(cachefile.section(
"/", 0, -2));
306 if (!cfd.exists() && !cfd.mkdir(pdir))
308 LOG(VB_GENERAL, LOG_ERR, loc +
309 QString(
"Unable to create remote cache directory '%1'")
315 QFile
file(cachefile);
316 if (!
file.open(QIODevice::WriteOnly|QIODevice::Truncate))
318 LOG(VB_GENERAL, LOG_ERR, loc +
319 QString(
"Unable to open cached preview file for writing '%1'")
326 size_t remaining = length;
327 uint failure_cnt = 0;
328 while ((remaining > 0) && (failure_cnt < 5))
330 ssize_t written =
file.write(data.data() + offset, remaining);
340 remaining -= written;
345 LOG(VB_GENERAL, LOG_ERR, loc +
346 QString(
"Failed to write cached preview file '%1'")
361 QStringList strlist(
"FILL_PROGRAM_INFO" );
362 strlist << playbackhost;
368 if (
tmp.HasPathname() ||
tmp.GetChanID())
380 QStringList strlist(
"QUERY_ISRECORDING");
396 QString cmd =
"QUERY_ISRECORDING";
398 QStringList strlist( cmd );
403 int recCount = strlist[0].toInt();
405 for (
int i = 0, j = 0; j < recCount; i++)
407 cmd = QString(
"QUERY_RECORDER %1").arg(i + 1);
409 strlist = QStringList( cmd );
410 strlist <<
"IS_RECORDING";
414 if (strlist[0].toInt())
430 QString sgroup,
bool fileNamesOnly)
436 if (sgroup.isEmpty())
439 *list <<
"QUERY_SG_GETFILELIST";
443 *list << QString::number(static_cast<int>(fileNamesOnly));
454 QString ann = QString(
"ANN Playback %1 0")
458 bool mismatch =
false;
461 addr, port, ann, &mismatch);
488 QStringList strlist( QString(
"CHECK_RECORDING") );
492 return strlist[0].toInt();
506 const ProgramInfo *pginfo,
int overrecsecs,
int underrecsecs)
515 curtime < pginfo->GetScheduledEndTime().addSecs(overrecsecs))
518 curtime < pginfo->GetScheduledEndTime())
520 else if (curtime < pginfo->GetScheduledStartTime() &&
537 QString str =
"QUERY_RECORDINGS ";
539 QStringList strlist( str );
541 auto *reclist =
new std::vector<ProgramInfo *>;
542 auto *
info =
new std::vector<ProgramInfo *>;
551 for (
auto &
p : *
info)
557 p->GetRecordingGroup() ==
"LiveTV"))
563 while (!
info->empty())
579 *list <<
"QUERY_ACTIVE_BACKENDS";
589 const QString &storageGroup,
592 QStringList strlist(cmd);
594 strlist << storageGroup;
599 if (!ok || strlist.size() < 2 || strlist[0] !=
"OK")
601 LOG(VB_GENERAL, LOG_ERR,
602 "downloadRemoteFile(): " + cmd +
" returned ERROR!");
610 const QString &storageGroup,
617 const QString &storageGroup,
QString GetHostName(void)
MythSocket * ConnectCommandSocket(const QString &hostname, int port, const QString &announcement, bool *proto_mismatch=nullptr, int maxConnTry=-1, std::chrono::milliseconds setup_timeout=-1ms)
int GetBackendServerPort(void)
Returns the locally defined backend control port.
bool SendReceiveStringList(QStringList &strlist, bool quickTimeout=false, bool block=true)
Send a message to the backend and wait for a response.
int GetNumSetting(const QString &key, int defaultval=0)
QString GetBackendServerIP(void)
Returns the IP address of the locally defined backend IP.
bool IsMasterBackend(void)
is this the actual MBE process
Class for communcating between myth backends and frontends.
bool SendReceiveStringList(QStringList &list, uint min_reply_length=0, std::chrono::milliseconds timeoutMS=kLongTimeout)
Holds information on recordings and videos.
uint GetChanID(void) const
This is the unique key used in the database to locate tuning information.
QDateTime GetScheduledEndTime(void) const
The scheduled end time of the program.
QDateTime GetRecordingStartTime(void) const
Approximate time the recording started.
QDateTime GetScheduledStartTime(void) const
The scheduled start time of program.
void ToStringList(QStringList &list) const
Serializes ProgramInfo into a QStringList which can be passed over a socket.
void SetPathname(const QString &pn)
virtual int DecrRef(void)
Decrements reference count and deletes on 0.
static QString GetGroupToUse(const QString &host, const QString &sgroup)
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
MBASE_PUBLIC QDateTime fromSecsSinceEpoch(int64_t seconds)
This function takes the number of seconds since the start of the epoch and returns a QDateTime with t...
QDateTime current(bool stripped)
Returns current Date and Time in UTC.
static constexpr int8_t NUMPROGRAMLINES
QStringList RemoteRecordings(void)
void RemoteGetAllScheduledRecordings(std::vector< ProgramInfo * > &scheduledlist)
bool RemoteGetUptime(std::chrono::seconds &uptime)
bool RemoteFillProgramInfo(ProgramInfo &pginfo, const QString &playbackhost)
QDateTime RemoteGetPreviewIfModified(const ProgramInfo &pginfo, const QString &cachefile)
Download preview & get timestamp if newer than cachefile's last modified time, otherwise just get the...
QString RemoteDownloadFile(const QString &url, const QString &storageGroup, const QString &filename)
std::vector< ProgramInfo * > * RemoteGetConflictList(const ProgramInfo *pginfo)
bool RemoteCheckFile(ProgramInfo *pginfo, bool checkSlaves)
bool RemoteGetActiveBackends(QStringList *list)
return list of backends currently connected to the master
bool RemoteGetFileList(const QString &host, const QString &path, QStringList *list, QString sgroup, bool fileNamesOnly)
bool RemoteDeleteRecording(uint recordingID, bool forceMetadataDelete, bool forgetHistory)
QString RemoteDownloadFileNow(const QString &url, const QString &storageGroup, const QString &filename)
int RemoteGetRecordingStatus(const ProgramInfo *pginfo, int overrecsecs, int underrecsecs)
Get status of an individual programme (with pre-post roll?).
std::vector< ProgramInfo * > * RemoteGetRecordedList(int sort)
int RemoteCheckForRecording(const ProgramInfo *pginfo)
Get recorder for a programme.
uint RemoteGetRecordingList(std::vector< ProgramInfo * > &reclist, QStringList &strList)
void RemoteGetAllExpiringRecordings(std::vector< ProgramInfo * > &expiringlist)
int RemoteGetRecordingMask(void)
bool RemoteGetMemStats(int &totalMB, int &freeMB, int &totalVM, int &freeVM)
std::vector< ProgramInfo * > * RemoteGetCurrentlyRecordingList(void)
return list of currently recording shows
QDateTime RemoteGetPreviewLastModified(const ProgramInfo *pginfo)
bool RemoteGetLoad(system_load_array &load)
static QString downloadRemoteFile(const QString &cmd, const QString &url, const QString &storageGroup, const QString &filename)
bool RemoteUndeleteRecording(uint recordingID)
std::array< double, 3 > system_load_array