MythTV master
netbase.cpp
Go to the documentation of this file.
1#include <QDir>
2
15
16#include "netbase.h"
17
18NetBase::NetBase(MythScreenStack *parent, const char *name)
19 : MythScreenType(parent, name),
20 m_popupStack(GetMythMainWindow()->GetStack("popup stack")),
21 m_imageDownload(new MetadataImageDownload(this))
22{
24}
25
27{
29
30 qDeleteAll(m_grabberList);
31 m_grabberList.clear();
32
34
35 delete m_imageDownload;
36 m_imageDownload = nullptr;
37
39}
40
42{
43 LoadData();
44}
45
46void NetBase::DownloadVideo(const QString &url, const QString &dest)
47{
49 m_downloadFile = RemoteDownloadFile(url, "Default", dest);
50}
51
53{
54 QString message = tr("Downloading Video...");
56 m_popupStack, "videodownloadprogressdialog");
57
60 else
61 {
62 delete m_progressDialog;
63 m_progressDialog = nullptr;
64 }
65}
66
68{
69 QString cache = QString("%1/cache/netvision-thumbcache")
70 .arg(GetConfDir());
71 QDir cacheDir(cache);
72 QStringList thumbs = cacheDir.entryList(QDir::Files);
73
74 for (auto i = thumbs.crbegin(); i != thumbs.crend(); ++i)
75 {
76 QString filename = QString("%1/%2").arg(cache, *i);
77 LOG(VB_GENERAL, LOG_DEBUG, QString("Deleting file %1").arg(filename));
78 QFileInfo fi(filename);
79 QDateTime lastmod = fi.lastModified();
80 if (lastmod.addDays(7) < MythDate::current())
81 QFile::remove(filename);
82 }
83}
84
86{
87 ResultItem *item = GetStreamItem();
88
89 if (!item)
90 return;
91
92 if (!item->GetDownloadable())
93 {
95 return;
96 }
97
98 auto seconds = std::chrono::seconds(item->GetTime().toInt());
99 GetMythMainWindow()->HandleMedia("Internal", item->GetMediaURL(),
100 item->GetDescription(), item->GetTitle(), item->GetSubtitle(),
101 QString(), item->GetSeason(), item->GetEpisode(), QString(),
102 duration_cast<std::chrono::minutes>(seconds), item->GetDate().toString("yyyy"));
103}
104
106{
107 ResultItem *item = GetStreamItem();
108
109 if (!item)
110 return;
111
112 if (!item->GetPlayer().isEmpty())
113 {
114 const QString& cmd = item->GetPlayer();
115 QStringList args = item->GetPlayerArguments();
116 if (args.empty())
117 {
118 args += item->GetMediaURL();
119 if (args.empty())
120 args += item->GetURL();
121 }
122 else
123 {
124 args.replaceInStrings("%DIR%", GetConfDir() + "/MythNetvision");
125 args.replaceInStrings("%MEDIAURL%", item->GetMediaURL());
126 args.replaceInStrings("%URL%", item->GetURL());
127 args.replaceInStrings("%TITLE%", item->GetTitle());
128 }
129
130 QString playerCommand = cmd + " " + args.join(" ");
131 RunCmdWithoutScreensaver(playerCommand);
132 }
133 else
134 {
135 QString url = item->GetURL();
136
137 LOG(VB_GENERAL, LOG_DEBUG, QString("Web URL = %1").arg(url));
138
139 if (url.isEmpty())
140 return;
141
142 QString browser = gCoreContext->GetSetting("WebBrowserCommand", "");
143 QString zoom = gCoreContext->GetSetting("WebBrowserZoomLevel", "1.0");
144
145 if (browser.isEmpty())
146 {
147 ShowOkPopup(tr("No browser command set! MythNetTree needs "
148 "MythBrowser installed to display the video."));
149 return;
150 }
151
152 if (browser.toLower() == "internal")
153 {
154 GetMythMainWindow()->HandleMedia("WebBrowser", url);
155 }
156 else
157 {
158 url.replace("mythflash://", "http://");
159 QString cmd = browser;
160 cmd.replace("%ZOOM%", zoom);
161 cmd.replace("%URL%", url);
162 cmd.replace('\'', "%27");
163 cmd.replace("&","\\&");
164 cmd.replace(";","\\;");
165
167 }
168 }
169}
170
171void NetBase::RunCmdWithoutScreensaver(const QString &cmd)
172{
180}
181
183{
184 QString message = tr("Are you sure you want to delete this file?");
185
186 auto *confirmdialog = new MythConfirmationDialog(m_popupStack, message);
187
188 if (confirmdialog->Create())
189 {
190 m_popupStack->AddScreen(confirmdialog);
191 connect(confirmdialog, &MythConfirmationDialog::haveResult,
193 }
194 else
195 {
196 delete confirmdialog;
197 }
198}
199
200void NetBase::DoDeleteVideo(bool remove)
201{
202 if (!remove)
203 return;
204
205 ResultItem *item = GetStreamItem();
206
207 if (!item)
208 return;
209
210 QString filename = GetDownloadFilename(item->GetTitle(),
211 item->GetMediaURL());
212
213 if (filename.startsWith("myth://"))
215 else
216 {
217 QFile file(filename);
218 file.remove();
219 }
220}
221
222void NetBase::customEvent(QEvent *event)
223{
224 if (event->type() == MythEvent::kMythEventMessage)
225 {
226 auto *me = dynamic_cast<MythEvent *>(event);
227 if (me == nullptr)
228 return;
229 QStringList tokens = me->Message().split(" ", Qt::SkipEmptyParts);
230
231 if (tokens.isEmpty())
232 return;
233
234 if (tokens[0] == "DOWNLOAD_FILE")
235 {
236 QStringList args = me->ExtraDataList();
237 if ((tokens.size() != 2) ||
238 (args[1] != m_downloadFile))
239 return;
240
241 if (tokens[1] == "UPDATE")
242 {
243 QString message = tr("Downloading Video...\n"
244 "(%1 of %2 MB)")
245 .arg(QString::number(args[2].toInt() / 1024.0 / 1024.0,
246 'f', 2),
247 QString::number(args[3].toInt() / 1024.0 / 1024.0,
248 'f', 2));
250 m_progressDialog->SetTotal(args[3].toInt());
251 m_progressDialog->SetProgress(args[2].toInt());
252 }
253 else if (tokens[1] == "FINISHED")
254 {
255 int fileSize = args[2].toInt();
256 int errorCode = args[4].toInt();
257
259 {
261 m_progressDialog = nullptr;
262 }
263
264 if ((m_downloadFile.startsWith("myth://")))
265 {
266 if ((errorCode == 0) &&
267 (fileSize > 0))
268 {
270 }
271 else
272 {
273 ShowOkPopup(tr("Error downloading video to backend."));
274 }
275 }
276 }
277 }
278 }
279}
280
282{
283 ResultItem *item = GetStreamItem();
284 if (!item)
285 return;
286
287 QString baseFilename = GetDownloadFilename(item->GetTitle(),
288 item->GetMediaURL());
289
290 QString finalFilename = StorageGroup::generate_file_url("Default",
292 baseFilename);
293
294 LOG(VB_GENERAL, LOG_INFO, QString("Downloading %1 to %2")
295 .arg(item->GetMediaURL(), finalFilename));
296
297 // Does the file already exist?
298 bool exists = RemoteFile::Exists(finalFilename);
299
300 if (exists)
301 {
302 DoPlayVideo(finalFilename);
303 return;
304 }
305 DownloadVideo(item->GetMediaURL(), baseFilename);
306}
307
308void NetBase::DoPlayVideo(const QString &filename)
309{
310 ResultItem *item = GetStreamItem();
311 if (!item)
312 return;
313
314 GetMythMainWindow()->HandleMedia("Internal", filename);
315}
316
318{
319 ResultItem *item = GetStreamItem();
320 if (!item)
321 return;
322
323 QString filename = GetDownloadFilename(item->GetTitle(),
324 item->GetMediaURL());
325
327}
Dialog asking for user confirmation.
QString GetSetting(const QString &key, const QString &defaultval="")
QString GetMasterHostName(void)
This class is used as a container for messages.
Definition: mythevent.h:17
const QString & Message() const
Definition: mythevent.h:65
static const Type kMythEventMessage
Definition: mythevent.h:79
static void DisableScreensaver()
void PauseIdleTimer(bool Pause)
Pause the idle timeout timer.
bool HandleMedia(const QString &Handler, const QString &Mrl, const QString &Plot="", const QString &Title="", const QString &Subtitle="", const QString &Director="", int Season=0, int Episode=0, const QString &Inetref="", std::chrono::minutes LenMins=2h, const QString &Year="1895", const QString &Id="", bool UseBookmarks=false)
static void RestoreScreensaver()
void AllowInput(bool Allow)
void addListener(QObject *listener)
Add a listener to the observable.
void removeListener(QObject *listener)
Remove a listener to the observable.
virtual void AddScreen(MythScreenType *screen, bool allowFade=true)
Screen in which all other widgets are contained and rendered.
virtual void Close()
bool Create(void) override
void SetProgress(uint count)
void SetMessage(const QString &message)
GrabberScript::scriptList m_grabberList
Definition: netbase.h:53
void DownloadVideo(const QString &url, const QString &dest)
Definition: netbase.cpp:46
void DoPlayVideo()
Definition: netbase.cpp:317
NetBase(MythScreenStack *parent, const char *name=nullptr)
Definition: netbase.cpp:18
void ShowWebVideo(void)
Definition: netbase.cpp:105
static void CleanCacheDir()
Definition: netbase.cpp:67
MythUIProgressDialog * m_progressDialog
Definition: netbase.h:49
static void RunCmdWithoutScreensaver(const QString &cmd)
Definition: netbase.cpp:171
void DoDeleteVideo(bool remove)
Definition: netbase.cpp:200
void customEvent(QEvent *event) override
Definition: netbase.cpp:222
void SlotDeleteVideo(void)
Definition: netbase.cpp:182
MetadataImageDownload * m_imageDownload
Definition: netbase.h:50
void StreamWebVideo(void)
Definition: netbase.cpp:85
MythScreenStack * m_popupStack
Definition: netbase.h:48
~NetBase() override
Definition: netbase.cpp:26
virtual ResultItem * GetStreamItem()=0
void InitProgressDialog()
Definition: netbase.cpp:52
void Init() override
Used after calling Load() to assign data to widgets and other UI initilisation which is prohibited in...
Definition: netbase.cpp:41
QString m_downloadFile
Definition: netbase.h:52
virtual void LoadData(void)=0
void DoDownloadAndPlay(void)
Definition: netbase.cpp:281
static bool DeleteFile(const QString &url)
Definition: remotefile.cpp:418
static bool Exists(const QString &url, struct stat *fileinfo)
Definition: remotefile.cpp:461
const QString & GetPlayer() const
Definition: rssparse.h:147
const QString & GetURL() const
Definition: rssparse.h:139
const QString & GetDescription() const
Definition: rssparse.h:138
const QString & GetMediaURL() const
Definition: rssparse.h:141
const QDateTime & GetDate() const
Definition: rssparse.h:143
const QStringList & GetPlayerArguments() const
Definition: rssparse.h:148
const QString & GetTime() const
Definition: rssparse.h:144
const uint & GetEpisode() const
Definition: rssparse.h:157
const QString & GetTitle() const
Definition: rssparse.h:134
const bool & GetDownloadable() const
Definition: rssparse.h:154
const QString & GetSubtitle() const
Definition: rssparse.h:136
const uint & GetSeason() const
Definition: rssparse.h:156
static QString generate_file_url(const QString &storage_group, const QString &host, const QString &path)
void cleanThumbnailCacheDir()
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
MythConfirmationDialog * ShowOkPopup(const QString &message, bool showCancel)
Non-blocking version of MythPopupBox::showOkPopup()
QString GetConfDir(void)
Definition: mythdirs.cpp:263
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
MythMainWindow * GetMythMainWindow(void)
@ kMSDontDisableDrawing
avoid disabling UI drawing
Definition: mythsystem.h:37
uint myth_system(const QString &command, uint flags, std::chrono::seconds timeout)
QDateTime current(bool stripped)
Returns current Date and Time in UTC.
Definition: mythdate.cpp:15
bool exists(str path)
Definition: xbmcvfs.py:51
QString GetDownloadFilename(const QString &title, const QString &url)
Definition: netutils.cpp:854
QString RemoteDownloadFile(const QString &url, const QString &storageGroup, const QString &filename)