MythTV  master
playbackboxhelper.cpp
Go to the documentation of this file.
1 #include <algorithm>
2 using namespace std;
3 
4 #include <QCoreApplication>
5 #include <QStringList>
6 #include <QDateTime>
7 #include <QFileInfo>
8 #include <QDir>
9 #include <QMap>
10 #include <QHash>
11 
12 #include "previewgeneratorqueue.h"
13 #include "metadataimagehelper.h"
14 #include "playbackboxhelper.h"
15 #include "mythcorecontext.h"
16 #include "filesysteminfo.h"
17 #include "tvremoteutil.h"
18 #include "storagegroup.h"
19 #include "mythlogging.h"
20 #include "programinfo.h"
21 #include "remoteutil.h"
22 #include "mythevent.h"
23 #include "mythdirs.h"
24 #include "mythmiscutil.h"
25 
26 #define LOC QString("PlaybackBoxHelper: ")
27 #define LOC_WARN QString("PlaybackBoxHelper Warning: ")
28 #define LOC_ERR QString("PlaybackBoxHelper Error: ")
29 
30 class PBHEventHandler : public QObject
31 {
32  public:
34  m_pbh(pbh), m_freeSpaceTimerId(0), m_checkAvailabilityTimerId(0)
35  {
37  }
38  ~PBHEventHandler() override
39  {
40  if (m_freeSpaceTimerId)
41  killTimer(m_freeSpaceTimerId);
42  if (m_checkAvailabilityTimerId)
43  killTimer(m_checkAvailabilityTimerId);
44  }
45 
46  bool event(QEvent* /*e*/) override; // QObject
47  void UpdateFreeSpaceEvent(void);
48  AvailableStatusType CheckAvailability(const QStringList &slist);
53  QMap<QString, QStringList> m_fileListCache;
54  QHash<uint, QStringList> m_checkAvailability;
55 };
56 
57 const uint PBHEventHandler::kUpdateFreeSpaceInterval = 15000; // 15 seconds
58 
60 {
61  QTime tm = QTime::currentTime();
62 
63  QStringList::const_iterator it2 = slist.begin();
64  ProgramInfo evinfo(it2, slist.end());
65  QSet<CheckAvailabilityType> cats;
66  for (; it2 != slist.end(); ++it2)
67  cats.insert((CheckAvailabilityType)(*it2).toUInt());
68 
69  {
70  QMutexLocker locker(&m_pbh.m_lock);
71  QHash<uint, QStringList>::iterator cit =
72  m_checkAvailability.find(evinfo.GetRecordingID());
73  if (cit != m_checkAvailability.end())
74  m_checkAvailability.erase(cit);
75  if (m_checkAvailability.empty() && m_checkAvailabilityTimerId)
76  {
77  killTimer(m_checkAvailabilityTimerId);
78  m_checkAvailabilityTimerId = 0;
79  }
80  }
81 
82  if (cats.empty())
83  return asFileNotFound;
84 
85  AvailableStatusType availableStatus = asAvailable;
86  if (!evinfo.HasPathname() && !evinfo.GetChanID())
87  availableStatus = asFileNotFound;
88  else
89  {
90  // Note IsFileReadable() implicitly calls GetPlaybackURL
91  // when necessary, we rely on this.
92  if (!evinfo.IsFileReadable())
93  {
94  LOG(VB_GENERAL, LOG_ERR, LOC +
95  QString("CHECK_AVAILABILITY '%1' file not found")
96  .arg(evinfo.GetPathname()));
97  availableStatus = asFileNotFound;
98  }
99  else if (!evinfo.GetFilesize())
100  {
101  // This query should be unnecessary if the ProgramInfo Updater is working
102 // evinfo.SetFilesize(evinfo.QueryFilesize());
103 // if (!evinfo.GetFilesize())
104 // {
105  availableStatus =
108 // }
109  }
110  }
111 
112  QStringList list;
113  list.push_back(QString::number(evinfo.GetRecordingID()));
114  list.push_back(evinfo.GetPathname());
115  auto *e0 = new MythEvent("SET_PLAYBACK_URL", list);
116  QCoreApplication::postEvent(m_pbh.m_listener, e0);
117 
118  list.clear();
119  list.push_back(QString::number(evinfo.GetRecordingID()));
120  list.push_back(QString::number((int)*cats.begin()));
121  list.push_back(QString::number((int)availableStatus));
122  list.push_back(QString::number(evinfo.GetFilesize()));
123  list.push_back(QString::number(tm.hour()));
124  list.push_back(QString::number(tm.minute()));
125  list.push_back(QString::number(tm.second()));
126  list.push_back(QString::number(tm.msec()));
127 
128  for (auto type : qAsConst(cats))
129  {
130  if (type == kCheckForCache && cats.size() > 1)
131  continue;
132  list[1] = QString::number((int)type);
133  auto *e = new MythEvent("AVAILABILITY", list);
134  QCoreApplication::postEvent(m_pbh.m_listener, e);
135  }
136 
137  return availableStatus;
138 }
139 
141 {
142  if (e->type() == QEvent::Timer)
143  {
144  auto *te = (QTimerEvent*)e;
145  const int timer_id = te->timerId();
146  if (timer_id == m_freeSpaceTimerId)
147  UpdateFreeSpaceEvent();
148  if (timer_id == m_checkAvailabilityTimerId)
149  {
150  QStringList slist;
151  {
152  QMutexLocker locker(&m_pbh.m_lock);
153  QHash<uint, QStringList>::iterator it =
154  m_checkAvailability.begin();
155  if (it != m_checkAvailability.end())
156  slist = *it;
157  }
158 
159  if (slist.size() >= 1 + NUMPROGRAMLINES)
160  CheckAvailability(slist);
161  }
162  return true;
163  }
164  if (e->type() == MythEvent::MythEventMessage)
165  {
166  auto *me = dynamic_cast<MythEvent*>(e);
167  if (me == nullptr)
168  return false;
169 
170  if (me->Message() == "UPDATE_FREE_SPACE")
171  {
172  UpdateFreeSpaceEvent();
173  return true;
174  }
175  if (me->Message() == "STOP_RECORDING")
176  {
177  ProgramInfo pginfo(me->ExtraDataList());
178  if (pginfo.GetChanID())
179  RemoteStopRecording(&pginfo);
180  return true;
181  }
182  if (me->Message() == "DELETE_RECORDINGS")
183  {
184  QStringList successes;
185  QStringList failures;
186  QStringList list = me->ExtraDataList();
187  while (list.size() >= 3)
188  {
189  uint recordingID = list[0].toUInt();
190  bool forceDelete = list[1].toUInt() != 0U;
191  bool forgetHistory = list[2].toUInt() != 0U;
192 
193  bool ok = RemoteDeleteRecording( recordingID, forceDelete,
194  forgetHistory);
195 
196  QStringList &res = (ok) ? successes : failures;
197  for (uint i = 0; i < 3; i++)
198  {
199  res.push_back(list.front());
200  list.pop_front();
201  }
202  }
203  if (!successes.empty())
204  {
205  auto *oe = new MythEvent("DELETE_SUCCESSES", successes);
206  QCoreApplication::postEvent(m_pbh.m_listener, oe);
207  }
208  if (!failures.empty())
209  {
210  auto *oe = new MythEvent("DELETE_FAILURES", failures);
211  QCoreApplication::postEvent(m_pbh.m_listener, oe);
212  }
213 
214  return true;
215  }
216  if (me->Message() == "UNDELETE_RECORDINGS")
217  {
218  QStringList successes;
219  QStringList failures;
220  QStringList list = me->ExtraDataList();
221  while (!list.empty())
222  {
223  uint recordingID = list[0].toUInt();
224 
225  bool ok = RemoteUndeleteRecording(recordingID);
226 
227  QStringList &res = (ok) ? successes : failures;
228 
229  res.push_back(QString::number(recordingID));
230  list.pop_front();
231  }
232  if (!successes.empty())
233  {
234  auto *oe = new MythEvent("UNDELETE_SUCCESSES", successes);
235  QCoreApplication::postEvent(m_pbh.m_listener, oe);
236  }
237  if (!failures.empty())
238  {
239  auto *oe = new MythEvent("UNDELETE_FAILURES", failures);
240  QCoreApplication::postEvent(m_pbh.m_listener, oe);
241  }
242 
243  return true;
244  }
245  if (me->Message() == "GET_PREVIEW")
246  {
247  const QString& token = me->ExtraData(0);
248  bool check_avail = (bool) me->ExtraData(1).toInt();
249  QStringList list = me->ExtraDataList();
250  QStringList::const_iterator it = list.cbegin()+2;
251  ProgramInfo evinfo(it, list.cend());
252  if (!evinfo.HasPathname())
253  return true;
254 
255  list.clear();
256  evinfo.ToStringList(list);
257  list += QString::number(kCheckForCache);
258  if (check_avail && (asAvailable != CheckAvailability(list)))
259  return true;
260  if (asAvailable != evinfo.GetAvailableStatus())
261  return true;
262 
263  // Now we can actually request the preview...
265 
266  return true;
267  }
268  if (me->Message() == "CHECK_AVAILABILITY")
269  {
270  if (me->ExtraData(0) != QString::number(kCheckForCache))
271  {
272  if (m_checkAvailabilityTimerId)
273  killTimer(m_checkAvailabilityTimerId);
274  m_checkAvailabilityTimerId = startTimer(0);
275  }
276  else if (!m_checkAvailabilityTimerId)
277  m_checkAvailabilityTimerId = startTimer(50);
278  }
279  else if (me->Message() == "LOCATE_ARTWORK")
280  {
281  const QString& inetref = me->ExtraData(0);
282  uint season = me->ExtraData(1).toUInt();
283  const auto type = (VideoArtworkType)me->ExtraData(2).toInt();
284 #if 0 /* const ref for an unused variable doesn't make much sense either */
285  uint recordingID = me->ExtraData(3).toUInt();
286  const QString &group = me->ExtraData(4);
287 #endif
288  const QString cacheKey = QString("%1:%2:%3")
289  .arg((int)type).arg(inetref).arg(season);
290 
291  ArtworkMap map = GetArtwork(inetref, season);
292 
293  ArtworkInfo info = map.value(type);
294 
295  QString foundFile;
296 
297  if (!info.url.isEmpty())
298  {
299  foundFile = info.url;
300  QMutexLocker locker(&m_pbh.m_lock);
301  m_pbh.m_artworkCache[cacheKey] = foundFile;
302  }
303 
304  if (!foundFile.isEmpty())
305  {
306  QStringList list = me->ExtraDataList();
307  list.push_back(foundFile);
308  auto *oe = new MythEvent("FOUND_ARTWORK", list);
309  QCoreApplication::postEvent(m_pbh.m_listener, oe);
310  }
311 
312  return true;
313  }
314  }
315 
316  return QObject::event(e);
317 }
318 
320 {
321  if (m_freeSpaceTimerId)
322  killTimer(m_freeSpaceTimerId);
323  m_pbh.UpdateFreeSpace();
324  m_freeSpaceTimerId = startTimer(kUpdateFreeSpaceInterval);
325 }
326 
328 
330  MThread("PlaybackBoxHelper"),
331  m_listener(listener), m_eventHandler(new PBHEventHandler(*this))
332 {
333  start();
334  m_eventHandler->moveToThread(qthread());
335  // Prime the pump so the disk free display starts updating
337 }
338 
340 {
341  // delete the event handler
342  m_eventHandler->deleteLater();
343  m_eventHandler = nullptr;
344 
345  MThread::exit();
346  wait();
347 }
348 
350 {
351  QCoreApplication::postEvent(
352  m_eventHandler, new MythEvent("UPDATE_FREE_SPACE"));
353 }
354 
356 {
357  QStringList list;
358  pginfo.ToStringList(list);
359  auto *e = new MythEvent("STOP_RECORDING", list);
360  QCoreApplication::postEvent(m_eventHandler, e);
361 }
362 
363 void PlaybackBoxHelper::DeleteRecording( uint recordingID, bool forceDelete,
364  bool forgetHistory)
365 {
366  QStringList list;
367  list.push_back(QString::number(recordingID));
368  list.push_back((forceDelete) ? "1" : "0");
369  list.push_back((forgetHistory) ? "1" : "0");
370  DeleteRecordings(list);
371 }
372 
373 void PlaybackBoxHelper::DeleteRecordings(const QStringList &list)
374 {
375  auto *e = new MythEvent("DELETE_RECORDINGS", list);
376  QCoreApplication::postEvent(m_eventHandler, e);
377 }
378 
380 {
381  QStringList list;
382  list.push_back(QString::number(recordingID));
383  auto *e = new MythEvent("UNDELETE_RECORDINGS", list);
384  QCoreApplication::postEvent(m_eventHandler, e);
385 }
386 
388 {
389  QList<FileSystemInfo> fsInfos = FileSystemInfo::RemoteGetInfo();
390 
391  QMutexLocker locker(&m_lock);
392  for (const auto& fsInfo : qAsConst(fsInfos))
393  {
394  if (fsInfo.getPath() == "TotalDiskSpace")
395  {
396  m_freeSpaceTotalMB = (uint64_t) (fsInfo.getTotalSpace() >> 10);
397  m_freeSpaceUsedMB = (uint64_t) (fsInfo.getUsedSpace() >> 10);
398  }
399  }
400  auto *e = new MythEvent("UPDATE_USAGE_UI");
401  QCoreApplication::postEvent(m_listener, e);
402 }
403 
405 {
406  QMutexLocker locker(&m_lock);
407  return m_freeSpaceTotalMB;
408 }
409 
411 {
412  QMutexLocker locker(&m_lock);
413  return m_freeSpaceUsedMB;
414 }
415 
417  const ProgramInfo &pginfo, CheckAvailabilityType cat)
418 {
419  QString catstr = QString::number((int)cat);
420  QMutexLocker locker(&m_lock);
421  QHash<uint, QStringList>::iterator it =
423  if (it == m_eventHandler->m_checkAvailability.end())
424  {
425  QStringList list;
426  pginfo.ToStringList(list);
427  list += catstr;
429  }
430  else
431  {
432  (*it).push_back(catstr);
433  }
434  auto *e = new MythEvent("CHECK_AVAILABILITY", QStringList(catstr));
435  QCoreApplication::postEvent(m_eventHandler, e);
436 }
437 
439  const QString &inetref, uint season,
440  const VideoArtworkType type,
441  const ProgramInfo *pginfo,
442  const QString &groupname)
443 {
444  QString cacheKey = QString("%1:%2:%3")
445  .arg((int)type).arg(inetref).arg(season);
446 
447  QMutexLocker locker(&m_lock);
448 
449  InfoMap::const_iterator it =
450  m_artworkCache.constFind(cacheKey);
451 
452  if (it != m_artworkCache.constEnd())
453  return *it;
454 
455  QStringList list(inetref);
456  list.push_back(QString::number(season));
457  list.push_back(QString::number(type));
458  list.push_back((pginfo)?QString::number(pginfo->GetRecordingID()):"");
459  list.push_back(groupname);
460  auto *e = new MythEvent("LOCATE_ARTWORK", list);
461  QCoreApplication::postEvent(m_eventHandler, e);
462 
463  return QString();
464 }
465 
467  const ProgramInfo &pginfo, bool check_availability)
468 {
469  if (!check_availability && pginfo.GetAvailableStatus() != asAvailable)
470  return QString();
471 
472  if (pginfo.GetAvailableStatus() == asPendingDelete)
473  return QString();
474 
475  QString token = QString("%1:%2")
476  .arg(pginfo.MakeUniqueKey()).arg(MythRandom());
477 
478  QStringList extra(token);
479  extra.push_back(check_availability?"1":"0");
480  pginfo.ToStringList(extra);
481  auto *e = new MythEvent("GET_PREVIEW", extra);
482  QCoreApplication::postEvent(m_eventHandler, e);
483 
484  return token;
485 }
PlaybackBoxHelper::DeleteRecording
void DeleteRecording(uint recordingID, bool forceDelete, bool forgetHistory)
Definition: playbackboxhelper.cpp:363
filesysteminfo.h
PlaybackBoxHelper::m_freeSpaceUsedMB
uint64_t m_freeSpaceUsedMB
Definition: playbackboxhelper.h:64
e
QDomElement e
Definition: mythplugins/mytharchive/mytharchivehelper/main.cpp:1423
mythevent.h
bool
bool
Definition: pxsup2dast.c:30
PBHEventHandler::UpdateFreeSpaceEvent
void UpdateFreeSpaceEvent(void)
Definition: playbackboxhelper.cpp:319
VideoArtworkType
VideoArtworkType
Definition: metadataimagehelper.h:10
ProgramInfo::MakeUniqueKey
QString MakeUniqueKey(void) const
Creates a unique string that can be used to identify an existing recording.
Definition: programinfo.h:337
kCheckForCache
@ kCheckForCache
Definition: playbackboxhelper.h:23
MythEvent::MythEventMessage
static Type MythEventMessage
Definition: mythevent.h:73
MThread::start
void start(QThread::Priority p=QThread::InheritPriority)
Tell MThread to start running the thread in the near future.
Definition: mthread.cpp:289
ProgramInfo::GetFilesize
virtual uint64_t GetFilesize(void) const
Definition: programinfo.cpp:6154
PBHEventHandler::~PBHEventHandler
~PBHEventHandler() override
Definition: playbackboxhelper.cpp:38
metadataimagehelper.h
asFileNotFound
@ asFileNotFound
Definition: programtypes.h:222
PlaybackBoxHelper::m_eventHandler
PBHEventHandler * m_eventHandler
Definition: playbackboxhelper.h:59
PBHEventHandler::kUpdateFreeSpaceInterval
static const uint kUpdateFreeSpaceInterval
Definition: playbackboxhelper.cpp:52
PlaybackBoxHelper::GetFreeSpaceTotalMB
uint64_t GetFreeSpaceTotalMB(void) const
Definition: playbackboxhelper.cpp:404
asAvailable
@ asAvailable
Definition: programtypes.h:219
ProgramInfo::GetRecordingID
uint GetRecordingID(void) const
Definition: programinfo.h:444
hardwareprofile.devicelist.cat
def cat(file_name)
Definition: devicelist.py:95
MythEvent
This class is used as a container for messages.
Definition: mythevent.h:17
PlaybackBoxHelper
Definition: playbackboxhelper.h:30
CheckAvailabilityType
CheckAvailabilityType
Definition: playbackboxhelper.h:22
arg
arg(title).arg(filename).arg(doDelete))
GetArtwork
ArtworkMap GetArtwork(const QString &inetref, uint season, bool strict)
Definition: metadataimagehelper.cpp:23
PlaybackBoxHelper::m_freeSpaceTotalMB
uint64_t m_freeSpaceTotalMB
Definition: playbackboxhelper.h:63
RemoteUndeleteRecording
bool RemoteUndeleteRecording(uint recordingID)
Definition: remoteutil.cpp:139
AvailableStatusType
AvailableStatusType
Definition: programtypes.h:218
LOG
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:23
mythdirs.h
playbackboxhelper.h
PBHEventHandler::m_fileListCache
QMap< QString, QStringList > m_fileListCache
Definition: playbackboxhelper.cpp:53
remoteutil.h
PlaybackBoxHelper::UndeleteRecording
void UndeleteRecording(uint recordingID)
Definition: playbackboxhelper.cpp:379
StorageGroup::ClearGroupToUseCache
static void ClearGroupToUseCache(void)
Definition: storagegroup.cpp:861
ProgramInfo::GetPathname
QString GetPathname(void) const
Definition: programinfo.h:341
programinfo.h
asPendingDelete
@ asPendingDelete
Definition: programtypes.h:221
mythlogging.h
ProgramInfo::GetRecordingStatus
RecStatus::Type GetRecordingStatus(void) const
Definition: programinfo.h:445
FileSystemInfo::RemoteGetInfo
static QList< FileSystemInfo > RemoteGetInfo(MythSocket *sock=nullptr)
Definition: filesysteminfo.cpp:145
RemoteStopRecording
bool RemoteStopRecording(uint inputid)
Definition: tvremoteutil.cpp:97
ArtworkInfo
Definition: metadataimagehelper.h:22
PlaybackBoxHelper::GetPreviewImage
QString GetPreviewImage(const ProgramInfo &pginfo, bool check_availability=true)
Definition: playbackboxhelper.cpp:466
LOC
#define LOC
Definition: playbackboxhelper.cpp:26
PlaybackBoxHelper::m_lock
QMutex m_lock
Definition: playbackboxhelper.h:60
PlaybackBoxHelper::DeleteRecordings
void DeleteRecordings(const QStringList &list)
Definition: playbackboxhelper.cpp:373
MThread::qthread
QThread * qthread(void)
Returns the thread, this will always return the same pointer no matter how often you restart the thre...
Definition: mthread.cpp:239
asZeroByte
@ asZeroByte
Definition: programtypes.h:223
PBHEventHandler::m_checkAvailabilityTimerId
int m_checkAvailabilityTimerId
Definition: playbackboxhelper.cpp:51
storagegroup.h
uint
unsigned int uint
Definition: compat.h:140
token
return token
Definition: musicutils.cpp:74
PlaybackBoxHelper::PlaybackBoxHelper
PlaybackBoxHelper(QObject *listener)
Definition: playbackboxhelper.cpp:329
PlaybackBoxHelper::~PlaybackBoxHelper
~PlaybackBoxHelper(void) override
Definition: playbackboxhelper.cpp:339
tvremoteutil.h
PlaybackBoxHelper::m_artworkCache
InfoMap m_artworkCache
Definition: playbackboxhelper.h:67
PBHEventHandler::m_pbh
PlaybackBoxHelper & m_pbh
Definition: playbackboxhelper.cpp:49
MythRandom
MBASE_PUBLIC uint32_t MythRandom()
Definition: mythmiscutil.h:24
ProgramInfo::GetChanID
uint GetChanID(void) const
This is the unique key used in the database to locate tuning information.
Definition: programinfo.h:370
ProgramInfo
Holds information on recordings and videos.
Definition: programinfo.h:68
PBHEventHandler::PBHEventHandler
PBHEventHandler(PlaybackBoxHelper &pbh)
Definition: playbackboxhelper.cpp:33
mythmiscutil.h
RecStatus::Recording
@ Recording
Definition: recStatus.h:30
ProgramInfo::ToStringList
void ToStringList(QStringList &list) const
Serializes ProgramInfo into a QStringList which can be passed over a socket.
Definition: programinfo.cpp:1270
mythcorecontext.h
ProgramInfo::IsFileReadable
bool IsFileReadable(void)
Attempts to ascertain if the main file for this ProgramInfo is readable.
Definition: programinfo.cpp:4767
PreviewGeneratorQueue::GetPreviewImage
static void GetPreviewImage(const ProgramInfo &pginfo, const QString &token)
Submit a request for the generation of a preview image.
Definition: previewgeneratorqueue.h:88
PBHEventHandler
Definition: playbackboxhelper.cpp:31
PBHEventHandler::event
bool event(QEvent *) override
Definition: playbackboxhelper.cpp:140
MThread
This is a wrapper around QThread that does several additional things.
Definition: mthread.h:49
MThread::exit
void exit(int retcode=0)
Use this to exit from the thread if you are using a Qt event loop.
Definition: mthread.cpp:284
previewgeneratorqueue.h
PlaybackBoxHelper::UpdateFreeSpace
void UpdateFreeSpace(void)
Definition: playbackboxhelper.cpp:387
ArtworkMap
QMultiMap< VideoArtworkType, ArtworkInfo > ArtworkMap
Definition: metadataimagehelper.h:31
PlaybackBoxHelper::StopRecording
void StopRecording(const ProgramInfo &pginfo)
Definition: playbackboxhelper.cpp:355
NUMPROGRAMLINES
#define NUMPROGRAMLINES
Definition: programinfo.h:28
PlaybackBoxHelper::LocateArtwork
QString LocateArtwork(const QString &inetref, uint season, VideoArtworkType type, const ProgramInfo *pginfo, const QString &groupname=nullptr)
Definition: playbackboxhelper.cpp:438
MThread::wait
bool wait(unsigned long time=ULONG_MAX)
Wait for the MThread to exit, with a maximum timeout.
Definition: mthread.cpp:306
PBHEventHandler::m_checkAvailability
QHash< uint, QStringList > m_checkAvailability
Definition: playbackboxhelper.cpp:54
PlaybackBoxHelper::GetFreeSpaceUsedMB
uint64_t GetFreeSpaceUsedMB(void) const
Definition: playbackboxhelper.cpp:410
PBHEventHandler::CheckAvailability
AvailableStatusType CheckAvailability(const QStringList &slist)
Definition: playbackboxhelper.cpp:59
ProgramInfo::GetAvailableStatus
AvailableStatusType GetAvailableStatus(void) const
Definition: programinfo.h:817
RemoteDeleteRecording
bool RemoteDeleteRecording(uint recordingID, bool forceMetadataDelete, bool forgetHistory)
Definition: remoteutil.cpp:110
PlaybackBoxHelper::m_listener
QObject * m_listener
Definition: playbackboxhelper.h:58
asNotYetAvailable
@ asNotYetAvailable
Definition: programtypes.h:220
PlaybackBoxHelper::CheckAvailability
void CheckAvailability(const ProgramInfo &pginfo, CheckAvailabilityType cat=kCheckForCache)
Definition: playbackboxhelper.cpp:416
PlaybackBoxHelper::ForceFreeSpaceUpdate
void ForceFreeSpaceUpdate(void)
Definition: playbackboxhelper.cpp:349
ProgramInfo::HasPathname
bool HasPathname(void) const
Definition: programinfo.h:356
ArtworkInfo::url
QString url
Definition: metadataimagehelper.h:25
PBHEventHandler::m_freeSpaceTimerId
int m_freeSpaceTimerId
Definition: playbackboxhelper.cpp:50