5#include <QCoreApplication>
29#define LOC QString("PlaybackBoxHelper: ")
30#define LOC_WARN QString("PlaybackBoxHelper Warning: ")
31#define LOC_ERR QString("PlaybackBoxHelper Error: ")
49 bool event(QEvent* )
override;
62 QTime tm = QTime::currentTime();
64 QStringList::const_iterator it2 = slist.begin();
68 QSet<CheckAvailabilityType> cats;
69 for (; it2 != slist.end(); ++it2)
82 QHash<uint, QStringList>::iterator cit =
105 LOG(VB_GENERAL, LOG_ERR,
LOC +
106 QString(
"CHECK_AVAILABILITY '%1' file not found")
126 auto *e0 =
new MythEvent(
"SET_PLAYBACK_URL", list);
131 list.push_back(QString::number((
int)firstType));
132 list.push_back(QString::number((
int)availableStatus));
133 list.push_back(QString::number(evinfo.
GetFilesize()));
134 list.push_back(QString::number(tm.hour()));
135 list.push_back(QString::number(tm.minute()));
136 list.push_back(QString::number(tm.second()));
137 list.push_back(QString::number(tm.msec()));
139 for (
auto type : std::as_const(cats))
143 list[1] = QString::number((
int)
type);
144 auto *e =
new MythEvent(
"AVAILABILITY", list);
148 return availableStatus;
153 if (e->type() == QEvent::Timer)
155 auto *te = (QTimerEvent*)e;
156 const int timer_id = te->timerId();
164 QHash<uint, QStringList>::iterator it =
179 return QObject::event(e);
181 if (me->Message() ==
"UPDATE_FREE_SPACE")
186 if (me->Message() ==
"STOP_RECORDING")
193 if (me->Message() ==
"DELETE_RECORDINGS")
195 QStringList successes;
196 QStringList failures;
197 QStringList list = me->ExtraDataList();
198 while (list.size() >= 3)
200 uint recordingID = list[0].toUInt();
201 bool forceDelete = list[1].toUInt() != 0U;
202 bool forgetHistory = list[2].toUInt() != 0U;
207 QStringList &res = (ok) ? successes : failures;
208 for (
uint i = 0; i < 3; i++)
210 res.push_back(list.front());
214 if (!successes.empty())
216 auto *oe =
new MythEvent(
"DELETE_SUCCESSES", successes);
219 if (!failures.empty())
221 auto *oe =
new MythEvent(
"DELETE_FAILURES", failures);
227 if (me->Message() ==
"UNDELETE_RECORDINGS")
229 QStringList successes;
230 QStringList failures;
231 QStringList list = me->ExtraDataList();
232 while (!list.empty())
234 uint recordingID = list[0].toUInt();
238 QStringList &res = (ok) ? successes : failures;
240 res.push_back(QString::number(recordingID));
243 if (!successes.empty())
245 auto *oe =
new MythEvent(
"UNDELETE_SUCCESSES", successes);
248 if (!failures.empty())
250 auto *oe =
new MythEvent(
"UNDELETE_FAILURES", failures);
256 if (me->Message() ==
"GET_PREVIEW")
258 const QString& token = me->ExtraData(0);
259 bool check_avail = (
bool) me->ExtraData(1).toInt();
260 QStringList list = me->ExtraDataList();
261 QStringList::const_iterator it = list.cbegin()+2;
279 if (me->Message() ==
"CHECK_AVAILABILITY")
292 else if (me->Message() ==
"LOCATE_ARTWORK")
294 const QString& inetref = me->ExtraData(0);
295 uint season = me->ExtraData(1).toUInt();
298 uint recordingID = me->ExtraData(3).toUInt();
299 const QString &group = me->ExtraData(4);
301 const QString cacheKey = QString(
"%1:%2:%3")
302 .arg((
int)
type).arg(inetref).arg(season);
310 if (!
info.url.isEmpty())
312 foundFile =
info.url;
317 if (!foundFile.isEmpty())
319 QStringList list = me->ExtraDataList();
320 list.push_back(foundFile);
321 auto *oe =
new MythEvent(
"FOUND_ARTWORK", list);
329 return QObject::event(e);
364 QCoreApplication::postEvent(
372 auto *e =
new MythEvent(
"STOP_RECORDING", list);
380 list.push_back(QString::number(recordingID));
381 list.push_back((forceDelete) ?
"1" :
"0");
382 list.push_back((forgetHistory) ?
"1" :
"0");
388 auto *e =
new MythEvent(
"DELETE_RECORDINGS", list);
395 list.push_back(QString::number(recordingID));
396 auto *e =
new MythEvent(
"UNDELETE_RECORDINGS", list);
404 QMutexLocker locker(&
m_lock);
405 for (
const auto& fsInfo : std::as_const(fsInfos))
407 if (fsInfo.getPath() ==
"TotalDiskSpace")
413 auto *e =
new MythEvent(
"UPDATE_USAGE_UI");
419 QMutexLocker locker(&
m_lock);
425 QMutexLocker locker(&
m_lock);
432 QString catstr = QString::number((
int)
cat);
433 QMutexLocker locker(&
m_lock);
434 QHash<uint, QStringList>::iterator it =
445 (*it).push_back(catstr);
447 auto *e =
new MythEvent(
"CHECK_AVAILABILITY", QStringList(catstr));
452 const QString &inetref,
uint season,
455 const QString &groupname)
457 QString cacheKey = QString(
"%1:%2:%3")
458 .arg((
int)
type).arg(inetref).arg(season);
460 QMutexLocker locker(&
m_lock);
462 InfoMap::const_iterator it =
468 QStringList list(inetref);
469 list.push_back(QString::number(season));
470 list.push_back(QString::number(
type));
471 list.push_back((pginfo)?QString::number(pginfo->
GetRecordingID()):
"");
472 list.push_back(groupname);
473 auto *e =
new MythEvent(
"LOCATE_ARTWORK", list);
480 const ProgramInfo &pginfo,
bool check_availability)
488 QString token = QString(
"%1:%2")
491 QStringList extra(token);
492 extra.push_back(check_availability?
"1":
"0");
494 auto *e =
new MythEvent(
"GET_PREVIEW", extra);
This is a wrapper around QThread that does several additional things.
void start(QThread::Priority p=QThread::InheritPriority)
Tell MThread to start running the thread in the near future.
bool wait(std::chrono::milliseconds time=std::chrono::milliseconds::max())
Wait for the MThread to exit, with a maximum timeout.
void exit(int retcode=0)
Use this to exit from the thread if you are using a Qt event loop.
QThread * qthread(void)
Returns the thread, this will always return the same pointer no matter how often you restart the thre...
This class is used as a container for messages.
static const Type kMythEventMessage
QMap< QString, QStringList > m_fileListCache
AvailableStatusType CheckAvailability(const QStringList &slist)
QHash< uint, QStringList > m_checkAvailability
int m_checkAvailabilityTimerId
PBHEventHandler(PlaybackBoxHelper &pbh)
void UpdateFreeSpaceEvent(void)
PlaybackBoxHelper & m_pbh
~PBHEventHandler() override
bool event(QEvent *) override
static constexpr std::chrono::milliseconds kUpdateFreeSpaceInterval
PlaybackBoxHelper(QObject *listener)
QString GetPreviewImage(const ProgramInfo &pginfo, bool check_availability=true)
~PlaybackBoxHelper(void) override
uint64_t m_freeSpaceUsedMB
uint64_t m_freeSpaceTotalMB
void DeleteRecording(uint recordingID, bool forceDelete, bool forgetHistory)
QString LocateArtwork(const QString &inetref, uint season, VideoArtworkType type, const ProgramInfo *pginfo, const QString &groupname=nullptr)
void DeleteRecordings(const QStringList &list)
uint64_t GetFreeSpaceTotalMB(void) const
void StopRecording(const ProgramInfo &pginfo)
void UpdateFreeSpace(void)
void CheckAvailability(const ProgramInfo &pginfo, CheckAvailabilityType cat=kCheckForCache)
PBHEventHandler * m_eventHandler
void UndeleteRecording(uint recordingID)
void ForceFreeSpaceUpdate(void)
uint64_t GetFreeSpaceUsedMB(void) const
static void GetPreviewImage(const ProgramInfo &pginfo, const QString &token)
Submit a request for the generation of a preview image.
Holds information on recordings and videos.
uint GetChanID(void) const
This is the unique key used in the database to locate tuning information.
bool HasPathname(void) const
uint GetRecordingID(void) const
AvailableStatusType GetAvailableStatus(void) const
bool IsFileReadable(void)
Attempts to ascertain if the main file for this ProgramInfo is readable.
QString MakeUniqueKey(void) const
Creates a unique string that can be used to identify an existing recording.
QString GetPathname(void) const
virtual uint64_t GetFilesize(void) const
void ToStringList(QStringList &list) const
Serializes ProgramInfo into a QStringList which can be passed over a socket.
RecStatus::Type GetRecordingStatus(void) const
static void ClearGroupToUseCache(void)
QVector< FileSystemInfo > FileSystemInfoList
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Convenience inline random number generator functions.
MBASE_PUBLIC FileSystemInfoList GetInfoList(MythSocket *sock=nullptr)
uint32_t MythRandom()
generate 32 random bits
static constexpr int8_t NUMPROGRAMLINES
bool RemoteDeleteRecording(uint recordingID, bool forceMetadataDelete, bool forgetHistory)
bool RemoteUndeleteRecording(uint recordingID)
bool RemoteStopRecording(uint inputid)