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 =
107 LOG(VB_GENERAL, LOG_ERR,
LOC +
108 QString(
"CHECK_AVAILABILITY '%1' file not found")
128 auto *e0 =
new MythEvent(
"SET_PLAYBACK_URL", list);
133 list.push_back(QString::number((
int)firstType));
134 list.push_back(QString::number((
int)availableStatus));
135 list.push_back(QString::number(evinfo.
GetFilesize()));
136 list.push_back(QString::number(tm.hour()));
137 list.push_back(QString::number(tm.minute()));
138 list.push_back(QString::number(tm.second()));
139 list.push_back(QString::number(tm.msec()));
141 for (
auto type : std::as_const(cats))
145 list[1] = QString::number((
int)
type);
146 auto *e =
new MythEvent(
"AVAILABILITY", list);
150 return availableStatus;
155 if (e->type() == QEvent::Timer)
157 auto *te = (QTimerEvent*)e;
158 const int timer_id = te->timerId();
166 QHash<uint, QStringList>::iterator it =
181 return QObject::event(e);
183 if (me->Message() ==
"UPDATE_FREE_SPACE")
188 if (me->Message() ==
"STOP_RECORDING")
195 if (me->Message() ==
"DELETE_RECORDINGS")
197 QStringList successes;
198 QStringList failures;
199 QStringList list = me->ExtraDataList();
200 while (list.size() >= 3)
202 uint recordingID = list[0].toUInt();
203 bool forceDelete = list[1].toUInt() != 0U;
204 bool forgetHistory = list[2].toUInt() != 0U;
209 QStringList &res = ok ? successes : failures;
211 for (
uint i = 0; i < 3; i++)
213 res.push_back(list.front());
217 if (!successes.empty())
219 auto *oe =
new MythEvent(
"DELETE_SUCCESSES", successes);
222 if (!failures.empty())
224 auto *oe =
new MythEvent(
"DELETE_FAILURES", failures);
230 if (me->Message() ==
"UNDELETE_RECORDINGS")
232 QStringList successes;
233 QStringList failures;
234 QStringList list = me->ExtraDataList();
235 while (!list.empty())
237 uint recordingID = list[0].toUInt();
241 QStringList &res = ok ? successes : failures;
243 res.push_back(QString::number(recordingID));
246 if (!successes.empty())
248 auto *oe =
new MythEvent(
"UNDELETE_SUCCESSES", successes);
251 if (!failures.empty())
253 auto *oe =
new MythEvent(
"UNDELETE_FAILURES", failures);
259 if (me->Message() ==
"GET_PREVIEW")
261 const QString& token = me->ExtraData(0);
262 bool check_avail = (bool) me->ExtraData(1).toInt();
263 QStringList list = me->ExtraDataList();
264 QStringList::const_iterator it = list.cbegin()+2;
282 if (me->Message() ==
"CHECK_AVAILABILITY")
295 else if (me->Message() ==
"LOCATE_ARTWORK")
297 const QString& inetref = me->ExtraData(0);
298 uint season = me->ExtraData(1).toUInt();
301 uint recordingID = me->ExtraData(3).toUInt();
302 const QString &group = me->ExtraData(4);
304 const QString cacheKey = QString(
"%1:%2:%3")
305 .arg((
int)
type).arg(inetref).arg(season);
313 if (!
info.url.isEmpty())
315 foundFile =
info.url;
320 if (!foundFile.isEmpty())
322 QStringList list = me->ExtraDataList();
323 list.push_back(foundFile);
324 auto *oe =
new MythEvent(
"FOUND_ARTWORK", list);
332 return QObject::event(e);
367 QCoreApplication::postEvent(
375 auto *e =
new MythEvent(
"STOP_RECORDING", list);
383 list.push_back(QString::number(recordingID));
384 list.push_back(forceDelete ?
"1" :
"0");
385 list.push_back(forgetHistory ?
"1" :
"0");
391 auto *e =
new MythEvent(
"DELETE_RECORDINGS", list);
398 list.push_back(QString::number(recordingID));
399 auto *e =
new MythEvent(
"UNDELETE_RECORDINGS", list);
407 QMutexLocker locker(&
m_lock);
408 for (
const auto& fsInfo : std::as_const(fsInfos))
410 if (fsInfo.getPath() ==
"TotalDiskSpace")
416 auto *e =
new MythEvent(
"UPDATE_USAGE_UI");
422 QMutexLocker locker(&
m_lock);
428 QMutexLocker locker(&
m_lock);
435 QString catstr = QString::number((
int)
cat);
436 QMutexLocker locker(&
m_lock);
437 QHash<uint, QStringList>::iterator it =
448 (*it).push_back(catstr);
450 auto *e =
new MythEvent(
"CHECK_AVAILABILITY", QStringList(catstr));
455 const QString &inetref,
uint season,
458 const QString &groupname)
460 QString cacheKey = QString(
"%1:%2:%3")
461 .arg((
int)
type).arg(inetref).arg(season);
463 QMutexLocker locker(&
m_lock);
465 InfoMap::const_iterator it =
471 QStringList list(inetref);
472 list.push_back(QString::number(season));
473 list.push_back(QString::number(
type));
474 list.push_back(pginfo?QString::number(pginfo->
GetRecordingID()):
"");
475 list.push_back(groupname);
476 auto *e =
new MythEvent(
"LOCATE_ARTWORK", list);
483 const ProgramInfo &pginfo,
bool check_availability)
491 QString token = QString(
"%1:%2")
494 QStringList extra(token);
495 extra.push_back(check_availability?
"1":
"0");
497 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)