33 #include "libmythbase/mythversion.h"
56 const QDateTime &rawEndTime,
63 if (!rawStartTime.isValid())
64 throw QString(
"StartTime is invalid" );
66 if (!rawEndTime.isValid())
67 throw QString(
"EndTime is invalid" );
69 QDateTime dtStartTime = rawStartTime.toUTC();
70 QDateTime dtEndTime = rawEndTime.toUTC();
72 if (dtEndTime < dtStartTime)
73 throw QString(
"EndTime is before StartTime");
85 uint nTotalAvailable = 0;
101 QString sWhere =
"program.chanid = :CHANID "
102 "AND program.endtime >= :STARTDATE "
103 "AND program.starttime < :ENDDATE "
104 "AND program.starttime >= :STARTDATELIMIT "
105 "AND program.manualid = 0";
108 QString sGroupBy =
"program.starttime, channel.channum,"
109 "channel.callsign, program.title";
112 QString sOrderBy =
"program.starttime";
114 bindings[
":STARTDATE" ] = dtStartTime;
115 bindings[
":STARTDATELIMIT"] = dtStartTime.addDays(-1);
116 bindings[
":ENDDATE" ] = dtEndTime;
134 ChannelInfoList::iterator chan_it;
135 for (chan_it = chanList.begin(); chan_it != chanList.end(); ++chan_it)
143 bindings[
":CHANID"] = (*chan_it).m_chanId;
149 for( progIt = progList.
begin(); progIt != progList.
end(); ++progIt)
158 pGuide->setStartTime ( dtStartTime );
159 pGuide->setEndTime ( dtEndTime );
160 pGuide->setDetails ( bDetails );
162 pGuide->setStartIndex ( nStartIndex );
163 pGuide->setCount ( chanList.size() );
164 pGuide->setTotalAvailable( nTotalAvailable );
167 pGuide->setVersion ( MYTH_BINARY_VERSION );
168 pGuide->setProtoVer ( MYTH_PROTO_VERSION );
179 const QDateTime& rawStartTime,
180 const QDateTime& rawEndTime,
182 const QString& sTitleFilter,
183 const QString& sCategoryFilter,
184 const QString& sPersonFilter,
185 const QString& sKeywordFilter,
188 const QString &sSort,
192 if (!rawStartTime.isNull() && !rawStartTime.isValid())
193 throw QString(
"StartTime is invalid" );
195 if (!rawEndTime.isNull() && !rawEndTime.isValid())
196 throw QString(
"EndTime is invalid" );
198 QDateTime dtStartTime = rawStartTime;
199 const QDateTime& dtEndTime = rawEndTime;
201 if (!rawEndTime.isNull() && dtEndTime < dtStartTime)
202 throw QString(
"EndTime is before StartTime");
217 if (!sPersonFilter.isEmpty())
219 sSQL =
", people, credits "
220 "WHERE people.name LIKE :PersonFilter "
221 "AND credits.person = people.person "
222 "AND program.chanid = credits.chanid "
223 "AND program.starttime = credits.starttime AND ";
224 bindings[
":PersonFilter"] = QString(
"%%1%").arg(sPersonFilter);
231 sSQL =
"LEFT JOIN oldprogram ON oldprogram.oldtitle = program.title "
233 +
"oldprogram.oldtitle IS NULL AND ";
236 sSQL +=
"deleted IS NULL AND ";
239 sSQL +=
"visible > 0 AND ";
241 sSQL +=
"program.manualid = 0 ";
248 sSQL +=
"AND program.chanid = :ChanId ";
249 bindings[
":ChanId"] = nChanId;
252 if (dtStartTime.isNull())
253 dtStartTime = QDateTime::currentDateTimeUtc();
255 sSQL +=
" AND program.endtime >= :StartDate ";
256 bindings[
":StartDate"] = dtStartTime;
258 if (!dtEndTime.isNull())
260 sSQL +=
"AND program.starttime <= :EndDate ";
261 bindings[
":EndDate"] = dtEndTime;
264 if (!sTitleFilter.isEmpty())
266 sSQL +=
"AND program.title LIKE :Title ";
267 bindings[
":Title"] = QString(
"%%1%").arg(sTitleFilter);
270 if (!sCategoryFilter.isEmpty())
272 sSQL +=
"AND program.category LIKE :Category ";
273 bindings[
":Category"] = sCategoryFilter;
276 if (!sKeywordFilter.isEmpty())
278 sSQL +=
"AND (program.title LIKE :Keyword1 "
279 "OR program.subtitle LIKE :Keyword2 "
280 "OR program.description LIKE :Keyword3) ";
282 QString filter = QString(
"%%1%").arg(sKeywordFilter);
283 bindings[
":Keyword1"] = filter;
284 bindings[
":Keyword2"] = filter;
285 bindings[
":Keyword3"] = filter;
288 if (sSort ==
"starttime")
289 sSQL +=
"ORDER BY program.starttime ";
290 else if (sSort ==
"title")
291 sSQL +=
"ORDER BY program.title ";
292 else if (sSort ==
"channel")
293 sSQL +=
"ORDER BY channel.channum ";
294 else if (sSort ==
"duration")
295 sSQL +=
"ORDER BY (program.endtime - program.starttime) ";
297 sSQL +=
"ORDER BY program.starttime ";
316 uint nTotalAvailable = 0;
318 (
uint)nStartIndex, (
uint)nCount, nTotalAvailable);
326 nCount = (int)progList.
size();
327 int nEndIndex = (int)progList.
size();
329 for(
int n = 0; n < nEndIndex; n++)
340 pPrograms->setStartIndex ( nStartIndex );
341 pPrograms->setCount ( nCount );
342 pPrograms->setTotalAvailable( nTotalAvailable );
344 pPrograms->setVersion ( MYTH_BINARY_VERSION );
345 pPrograms->setProtoVer ( MYTH_PROTO_VERSION );
355 const QDateTime &rawStartTime )
359 throw QString(
"Channel ID is invalid" );
360 if (!rawStartTime.isValid())
361 throw QString(
"StartTime is invalid" );
363 QDateTime dtStartTime = rawStartTime.toUTC();
393 if (sFileName.isEmpty())
395 LOG(VB_UPNP, LOG_ERR,
396 QString(
"GetImageFile - ChanId %1 doesn't exist or isn't visible")
406 const QString sFullFileName = storage.
FindFile( sFileName );
408 if (sFullFileName.isEmpty())
410 LOG(VB_UPNP, LOG_ERR,
411 QString(
"GetImageFile - Unable to find %1.").arg(sFileName));
420 if ((nWidth == 0) && (nHeight == 0))
422 if (QFile::exists( sFullFileName ))
424 return QFileInfo( sFullFileName );
427 LOG(VB_UPNP, LOG_ERR,
428 QString(
"GetImageFile - File Does not exist %1.").arg(sFullFileName));
434 QString sNewFileName = QString(
"%1.%2x%3.png" )
435 .arg( sFullFileName )
443 if (QFile::exists( sNewFileName ))
444 return QFileInfo( sNewFileName );
450 QString sChannelsDirectory = QFileInfo( sNewFileName ).absolutePath();
452 if (!QFileInfo( sChannelsDirectory ).isWritable())
454 LOG(VB_UPNP, LOG_ERR, QString(
"GetImageFile - no write access to: %1")
455 .arg( sChannelsDirectory ));
459 auto *pImage =
new QImage( sFullFileName );
463 LOG(VB_UPNP, LOG_ERR, QString(
"GetImageFile - can't create image: %1")
464 .arg( sFullFileName ));
468 float fAspect = (float)(pImage->width()) / pImage->height();
471 LOG(VB_UPNP, LOG_ERR, QString(
"GetImageFile - zero aspect"));
477 nWidth = (int)std::rint(nHeight * fAspect);
480 nHeight = (int)std::rint(nWidth / fAspect);
482 QImage img = pImage->scaled( nWidth, nHeight, Qt::IgnoreAspectRatio,
483 Qt::SmoothTransformation);
487 LOG(VB_UPNP, LOG_ERR, QString(
"SaveImageFile - unable to scale. "
488 "See if %1 is really an image.").arg( sFullFileName ));
493 if (!img.save( sNewFileName,
"PNG" ))
495 LOG(VB_UPNP, LOG_ERR, QString(
"SaveImageFile - failed, %1")
496 .arg( sNewFileName ));
503 return QFileInfo( sNewFileName );
515 ChannelGroupList::iterator it;
516 for (it = list.begin(); it < list.end(); ++it)
534 query.
prepare(
"SELECT DISTINCT category FROM program WHERE category != '' "
535 "ORDER BY category");
542 catList << query.
value(0).toString();
554 QStringList keywordList;
565 query.
prepare(
"SELECT DISTINCT phrase FROM keyword "
566 "WHERE searchtype = :TYPE "
568 query.
bindValue(
":TYPE",
static_cast<int>(iType));
575 keywordList << query.
value(0).toString();
588 bool bResult =
false;
591 throw QString(
"Channel ID is invalid" );
605 bool bResult =
false;
608 throw QString(
"Channel ID is invalid" );