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(time_t) ==
sizeof(
int))
68 uptime = std::chrono::seconds(strlist[0].toUInt());
69 else if (
sizeof(time_t) ==
sizeof(
long))
70 uptime = std::chrono::seconds(strlist[0].toULong());
71 else if (
sizeof(time_t) ==
sizeof(
long long))
72 uptime = std::chrono::seconds(strlist[0].toULongLong());
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);
484 QStringList strlist( QString(
"CHECK_RECORDING") );
488 return strlist[0].toInt();
502 const ProgramInfo *pginfo,
int overrecsecs,
int underrecsecs)
511 curtime < pginfo->GetScheduledEndTime().addSecs(overrecsecs))
514 curtime < pginfo->GetScheduledEndTime())
516 else if (curtime < pginfo->GetScheduledStartTime() &&
533 QString str =
"QUERY_RECORDINGS ";
535 QStringList strlist( str );
537 auto *reclist =
new std::vector<ProgramInfo *>;
538 auto *info =
new std::vector<ProgramInfo *>;
547 for (
auto &
p : *info)
553 p->GetRecordingGroup() ==
"LiveTV"))
559 while (!info->empty())
575 *list <<
"QUERY_ACTIVE_BACKENDS";
585 const QString &storageGroup,
588 QStringList strlist(cmd);
590 strlist << storageGroup;
595 if (!ok || strlist.size() < 2 || strlist[0] !=
"OK")
597 LOG(VB_GENERAL, LOG_ERR,
598 "downloadRemoteFile(): " + cmd +
" returned ERROR!");
606 const QString &storageGroup,
613 const QString &storageGroup,