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;
210 for (
uint i = 0; i < 3; i++)
212 res.push_back(list.front());
216 if (!successes.empty())
218 auto *oe =
new MythEvent(
"DELETE_SUCCESSES", successes);
221 if (!failures.empty())
223 auto *oe =
new MythEvent(
"DELETE_FAILURES", failures);
229 if (me->Message() ==
"UNDELETE_RECORDINGS")
231 QStringList successes;
232 QStringList failures;
233 QStringList list = me->ExtraDataList();
234 while (!list.empty())
236 uint recordingID = list[0].toUInt();
240 QStringList &res = ok ? successes : failures;
242 res.push_back(QString::number(recordingID));
245 if (!successes.empty())
247 auto *oe =
new MythEvent(
"UNDELETE_SUCCESSES", successes);
250 if (!failures.empty())
252 auto *oe =
new MythEvent(
"UNDELETE_FAILURES", failures);
258 if (me->Message() ==
"GET_PREVIEW")
260 const QString& token = me->ExtraData(0);
261 bool check_avail = (bool) me->ExtraData(1).toInt();
262 QStringList list = me->ExtraDataList();
263 QStringList::const_iterator it = list.cbegin()+2;
281 if (me->Message() ==
"CHECK_AVAILABILITY")
294 else if (me->Message() ==
"LOCATE_ARTWORK")
296 const QString& inetref = me->ExtraData(0);
297 uint season = me->ExtraData(1).toUInt();
300 uint recordingID = me->ExtraData(3).toUInt();
301 const QString &group = me->ExtraData(4);
303 const QString cacheKey = QString(
"%1:%2:%3")
304 .arg((
int)
type).arg(inetref).arg(season);
312 if (!
info.url.isEmpty())
314 foundFile =
info.url;
319 if (!foundFile.isEmpty())
321 QStringList list = me->ExtraDataList();
322 list.push_back(foundFile);
323 auto *oe =
new MythEvent(
"FOUND_ARTWORK", list);
331 return QObject::event(e);
366 QCoreApplication::postEvent(
374 auto *e =
new MythEvent(
"STOP_RECORDING", list);
382 list.push_back(QString::number(recordingID));
383 list.push_back(forceDelete ?
"1" :
"0");
384 list.push_back(forgetHistory ?
"1" :
"0");
390 auto *e =
new MythEvent(
"DELETE_RECORDINGS", list);
397 list.push_back(QString::number(recordingID));
398 auto *e =
new MythEvent(
"UNDELETE_RECORDINGS", list);
406 QMutexLocker locker(&
m_lock);
407 for (
const auto& fsInfo : std::as_const(fsInfos))
409 if (fsInfo.getPath() ==
"TotalDiskSpace")
415 auto *e =
new MythEvent(
"UPDATE_USAGE_UI");
421 QMutexLocker locker(&
m_lock);
427 QMutexLocker locker(&
m_lock);
434 QString catstr = QString::number((
int)
cat);
435 QMutexLocker locker(&
m_lock);
436 QHash<uint, QStringList>::iterator it =
447 (*it).push_back(catstr);
449 auto *e =
new MythEvent(
"CHECK_AVAILABILITY", QStringList(catstr));
454 const QString &inetref,
uint season,
457 const QString &groupname)
459 QString cacheKey = QString(
"%1:%2:%3")
460 .arg((
int)
type).arg(inetref).arg(season);
462 QMutexLocker locker(&
m_lock);
464 InfoMap::const_iterator it =
470 QStringList list(inetref);
471 list.push_back(QString::number(season));
472 list.push_back(QString::number(
type));
473 list.push_back(pginfo?QString::number(pginfo->
GetRecordingID()):
"");
474 list.push_back(groupname);
475 auto *e =
new MythEvent(
"LOCATE_ARTWORK", list);
482 const ProgramInfo &pginfo,
bool check_availability)
490 QString token = QString(
"%1:%2")
493 QStringList extra(token);
494 extra.push_back(check_availability?
"1":
"0");
496 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)