39 #include "libmythbase/mythversion.h"
59 bool bGroupByCallsign,
64 uint nTotalAvailable = 0;
69 nSourceID, nChannelGroupID,
false,
"",
78 nStartIndex = (nStartIndex > 0) ? std::min( nStartIndex, nTotalAvailable ) : 0;
79 nCount = (nCount > 0) ? std::min(nCount, (nTotalAvailable - nStartIndex)) :
80 (nTotalAvailable - nStartIndex);
82 ChannelInfoList::iterator chanIt;
83 auto chanItBegin = chanList.begin() + nStartIndex;
84 auto chanItEnd = chanItBegin + nCount;
86 for( chanIt = chanItBegin; chanIt < chanItEnd; ++chanIt )
96 throw( QString(
"Channel ID appears invalid."));
105 nTotalPages = (int)std::ceil((
float)nTotalAvailable / nCount);
107 if (nTotalPages == 1)
111 nCurPage = (int)std::ceil((
float)nStartIndex / nCount) + 1;
114 pChannelInfos->setStartIndex ( nStartIndex );
115 pChannelInfos->setCount ( nCount );
116 pChannelInfos->setCurrentPage ( nCurPage );
117 pChannelInfos->setTotalPages ( nTotalPages );
118 pChannelInfos->setTotalAvailable( nTotalAvailable );
120 pChannelInfos->setVersion ( MYTH_BINARY_VERSION );
121 pChannelInfos->setProtoVer ( MYTH_PROTO_VERSION );
123 return pChannelInfos;
133 throw( QString(
"Channel ID appears invalid."));
150 const QString &CallSign,
151 const QString &ChannelName,
152 const QString &ChannelNumber,
154 uint ATSCMajorChannel,
155 uint ATSCMinorChannel,
158 const QString &ExtendedVisible,
159 const QString &FrequencyID,
162 const QString &XMLTVID,
163 const QString &DefaultAuthority,
167 throw QString(
"ChannelId is required");
170 throw QString(
"Nothing to update");
174 throw QString(
"ChannelId %1 doesn't exist");
183 channel.
m_name = ChannelName;
197 #ifndef _WIN32 // TODO Does not compile on Windows
200 Q_UNUSED(ExtendedVisible);
214 throw QString(
"Can't override Always/NeverVisible");
245 const QString &CallSign,
246 const QString &ChannelName,
247 const QString &ChannelNumber,
249 uint ATSCMajorChannel,
250 uint ATSCMinorChannel,
253 const QString &ExtendedVisible,
254 const QString &FrequencyID,
257 const QString &XMLTVID,
258 const QString &DefaultAuthority,
263 #ifdef _WIN32 // TODO Needs fixing for Windows
264 Q_UNUSED(ExtendedVisible);
275 CallSign, ChannelName, ChannelNumber,
276 ServiceID, ATSCMajorChannel, ATSCMinorChannel,
277 UseEIT, chan_visible, FrequencyID,
300 throw( QString(
"Database not open while trying to list "
303 query.
prepare(
"SELECT sourceid, name, xmltvgrabber, userid, "
304 "freqtable, lineupid, password, useeit, configpath, "
305 "dvb_nit_id, bouquet_id, region_id, scanfrequency, "
306 "lcnoffset FROM videosource "
307 "ORDER BY sourceid" );
313 throw( QString(
"Database Error executing query." ));
327 pVideoSource->setId ( query.
value(0).toInt() );
328 pVideoSource->setSourceName ( query.
value(1).toString() );
329 pVideoSource->setGrabber ( query.
value(2).toString() );
330 pVideoSource->setUserId ( query.
value(3).toString() );
331 pVideoSource->setFreqTable ( query.
value(4).toString() );
332 pVideoSource->setLineupId ( query.
value(5).toString() );
333 pVideoSource->setPassword ( query.
value(6).toString() );
334 pVideoSource->setUseEIT ( query.
value(7).toBool() );
335 pVideoSource->setConfigPath ( query.
value(8).toString() );
336 pVideoSource->setNITId ( query.
value(9).toInt() );
337 pVideoSource->setBouquetId ( query.
value(10).toUInt() );
338 pVideoSource->setRegionId ( query.
value(11).toUInt() );
339 pVideoSource->setScanFrequency ( query.
value(12).toUInt() );
340 pVideoSource->setLCNOffset ( query.
value(13).toUInt() );
344 pList->setVersion ( MYTH_BINARY_VERSION );
345 pList->setProtoVer ( MYTH_PROTO_VERSION );
359 throw( QString(
"Database not open while trying to list "
362 query.
prepare(
"SELECT name, xmltvgrabber, userid, "
363 "freqtable, lineupid, password, useeit, configpath, "
364 "dvb_nit_id, bouquet_id, region_id, scanfrequency, "
366 "FROM videosource WHERE sourceid = :SOURCEID "
367 "ORDER BY sourceid" );
374 throw( QString(
"Database Error executing query." ));
385 pVideoSource->setId ( nSourceID );
386 pVideoSource->setSourceName ( query.
value(0).toString() );
387 pVideoSource->setGrabber ( query.
value(1).toString() );
388 pVideoSource->setUserId ( query.
value(2).toString() );
389 pVideoSource->setFreqTable ( query.
value(3).toString() );
390 pVideoSource->setLineupId ( query.
value(4).toString() );
391 pVideoSource->setPassword ( query.
value(5).toString() );
392 pVideoSource->setUseEIT ( query.
value(6).toBool() );
393 pVideoSource->setConfigPath ( query.
value(7).toString() );
394 pVideoSource->setNITId ( query.
value(8).toInt() );
395 pVideoSource->setBouquetId ( query.
value(9).toUInt() );
396 pVideoSource->setRegionId ( query.
value(10).toUInt() );
397 pVideoSource->setScanFrequency ( query.
value(11).toUInt() );
398 pVideoSource->setLCNOffset ( query.
value(12).toUInt() );
409 const QString &sSourceName,
410 const QString &sGrabber,
411 const QString &sUserId,
412 const QString &sFreqTable,
413 const QString &sLineupId,
414 const QString &sPassword,
416 const QString &sConfigPath,
426 LOG(VB_GENERAL, LOG_ERR,
"SourceId is required");
432 LOG(VB_GENERAL, LOG_ERR, QString(
"SourceId %1 doesn't exist")
439 LOG(VB_GENERAL, LOG_ERR, QString(
"SourceId=%1 was the only parameter")
445 MSqlBindings::const_iterator it;
449 ADD_SQL(settings, bindings,
"name",
"SourceName", sSourceName);
452 ADD_SQL(settings, bindings,
"xmltvgrabber",
"Grabber", sGrabber);
455 ADD_SQL(settings, bindings,
"userid",
"UserId", sUserId);
458 ADD_SQL(settings, bindings,
"freqtable",
"FreqTable", sFreqTable);
461 ADD_SQL(settings, bindings,
"lineupid",
"LineupId", sLineupId);
464 ADD_SQL(settings, bindings,
"password",
"Password", sPassword);
467 ADD_SQL(settings, bindings,
"useeit",
"UseEIT", bUseEIT);
471 if (sConfigPath.isEmpty())
472 settings +=
"configpath=NULL, ";
474 ADD_SQL(settings, bindings,
"configpath",
"ConfigPath", sConfigPath);
478 ADD_SQL(settings, bindings,
"dvb_nit_id",
"NITId", nNITId);
481 ADD_SQL(settings, bindings,
"bouquet_id",
"BouquetId", nBouquetId);
484 ADD_SQL(settings, bindings,
"region_id",
"RegionId", nRegionId);
487 ADD_SQL(settings, bindings,
"scanfrequency",
"ScanFrequency", nScanFrequency);
490 ADD_SQL(settings, bindings,
"lcnoffset",
"LCNOffset", nLCNOffset);
492 if ( settings.isEmpty() )
494 LOG(VB_GENERAL, LOG_ERR,
"No valid parameters were passed");
502 query.
prepare(QString(
"UPDATE videosource SET %1 WHERE sourceid=:SOURCEID")
504 bindings[
":SOURCEID"] = nSourceId;
506 for (it = bindings.cbegin(); it != bindings.cend(); ++it)
513 throw( QString(
"Database Error executing query." ));
524 const QString &sGrabber,
525 const QString &sUserId,
526 const QString &sFreqTable,
527 const QString &sLineupId,
528 const QString &sPassword,
530 const QString &sConfigPath,
538 sLineupId, sPassword, bUseEIT, sConfigPath,
539 nNITId, nBouquetId, nRegionId, nScanFrequency,
574 bool bWaitForFinish )
576 if ( nSourceId < 1 || nCardId < 1)
577 throw( QString(
"A source ID and card ID are both required."));
586 throw( QString(
"This device is incompatible with channel fetching.") );
608 throw( QString(
"Database not open while trying to list "
611 query.
prepare(
"SELECT mplexid, sourceid, transportid, networkid, "
612 "frequency, inversion, symbolrate, fec, polarity, "
613 "modulation, bandwidth, lp_code_rate, transmission_mode, "
614 "guard_interval, visible, constellation, hierarchy, hp_code_rate, "
615 "mod_sys, rolloff, sistandard, serviceversion, updatetimestamp, "
616 "default_authority FROM dtv_multiplex WHERE sourceid = :SOURCEID "
617 "ORDER BY mplexid" );
624 throw( QString(
"Database Error executing query." ));
635 nStartIndex = (nStartIndex > 0) ? std::min( nStartIndex, muxCount ) : 0;
636 nCount = (nCount > 0) ? std::min( nCount, muxCount ) : muxCount;
637 int nEndIndex = std::min((nStartIndex + nCount), muxCount );
639 for(
int n = nStartIndex; n < nEndIndex; n++)
645 pVideoMultiplex->setMplexId( query.
value(0).toInt() );
646 pVideoMultiplex->setSourceId( query.
value(1).toInt() );
647 pVideoMultiplex->setTransportId( query.
value(2).toInt() );
648 pVideoMultiplex->setNetworkId( query.
value(3).toInt() );
649 pVideoMultiplex->setFrequency( query.
value(4).toLongLong() );
650 pVideoMultiplex->setInversion( query.
value(5).toString() );
651 pVideoMultiplex->setSymbolRate( query.
value(6).toLongLong() );
652 pVideoMultiplex->setFEC( query.
value(7).toString() );
653 pVideoMultiplex->setPolarity( query.
value(8).toString() );
654 pVideoMultiplex->setModulation( query.
value(9).toString() );
655 pVideoMultiplex->setBandwidth( query.
value(10).toString() );
656 pVideoMultiplex->setLPCodeRate( query.
value(11).toString() );
657 pVideoMultiplex->setTransmissionMode( query.
value(12).toString() );
658 pVideoMultiplex->setGuardInterval( query.
value(13).toString() );
659 pVideoMultiplex->setVisible( query.
value(14).toBool() );
660 pVideoMultiplex->setConstellation( query.
value(15).toString() );
661 pVideoMultiplex->setHierarchy( query.
value(16).toString() );
662 pVideoMultiplex->setHPCodeRate( query.
value(17).toString() );
663 pVideoMultiplex->setModulationSystem( query.
value(18).toString() );
664 pVideoMultiplex->setRollOff( query.
value(19).toString() );
665 pVideoMultiplex->setSIStandard( query.
value(20).toString() );
666 pVideoMultiplex->setServiceVersion( query.
value(21).toInt() );
667 pVideoMultiplex->setUpdateTimeStamp(
669 pVideoMultiplex->setDefaultAuthority( query.
value(23).toString() );
678 totalPages = (int)std::ceil((
float)muxCount / nCount);
684 curPage = (int)std::ceil((
float)nStartIndex / nCount) + 1;
687 pVideoMultiplexes->setStartIndex ( nStartIndex );
688 pVideoMultiplexes->setCount ( nCount );
689 pVideoMultiplexes->setCurrentPage ( curPage );
690 pVideoMultiplexes->setTotalPages ( totalPages );
691 pVideoMultiplexes->setTotalAvailable( muxCount );
693 pVideoMultiplexes->setVersion ( MYTH_BINARY_VERSION );
694 pVideoMultiplexes->setProtoVer ( MYTH_PROTO_VERSION );
696 return pVideoMultiplexes;
704 throw( QString(
"Database not open while trying to list "
705 "Video Multiplex."));
707 query.
prepare(
"SELECT sourceid, transportid, networkid, "
708 "frequency, inversion, symbolrate, fec, polarity, "
709 "modulation, bandwidth, lp_code_rate, transmission_mode, "
710 "guard_interval, visible, constellation, hierarchy, hp_code_rate, "
711 "mod_sys, rolloff, sistandard, serviceversion, updatetimestamp, "
712 "default_authority FROM dtv_multiplex WHERE mplexid = :MPLEXID "
713 "ORDER BY mplexid" );
720 throw( QString(
"Database Error executing query." ));
727 pVideoMultiplex->setMplexId( nMplexID );
728 pVideoMultiplex->setSourceId( query.
value(0).toInt() );
729 pVideoMultiplex->setTransportId( query.
value(1).toInt() );
730 pVideoMultiplex->setNetworkId( query.
value(2).toInt() );
731 pVideoMultiplex->setFrequency( query.
value(3).toLongLong() );
732 pVideoMultiplex->setInversion( query.
value(4).toString() );
733 pVideoMultiplex->setSymbolRate( query.
value(5).toLongLong() );
734 pVideoMultiplex->setFEC( query.
value(6).toString() );
735 pVideoMultiplex->setPolarity( query.
value(7).toString() );
736 pVideoMultiplex->setModulation( query.
value(8).toString() );
737 pVideoMultiplex->setBandwidth( query.
value(9).toString() );
738 pVideoMultiplex->setLPCodeRate( query.
value(10).toString() );
739 pVideoMultiplex->setTransmissionMode( query.
value(11).toString() );
740 pVideoMultiplex->setGuardInterval( query.
value(12).toString() );
741 pVideoMultiplex->setVisible( query.
value(13).toBool() );
742 pVideoMultiplex->setConstellation( query.
value(14).toString() );
743 pVideoMultiplex->setHierarchy( query.
value(15).toString() );
744 pVideoMultiplex->setHPCodeRate( query.
value(16).toString() );
745 pVideoMultiplex->setModulationSystem( query.
value(17).toString() );
746 pVideoMultiplex->setRollOff( query.
value(18).toString() );
747 pVideoMultiplex->setSIStandard( query.
value(19).toString() );
748 pVideoMultiplex->setServiceVersion( query.
value(20).toInt() );
749 pVideoMultiplex->setUpdateTimeStamp(
751 pVideoMultiplex->setDefaultAuthority( query.
value(22).toString() );
754 return pVideoMultiplex;
766 throw( QString(
"Database not open while trying to get source name."));
768 query.
prepare(
"SELECT name FROM videosource WHERE sourceid = :SOURCEID ");
775 throw( QString(
"Database Error executing query." ));
782 QString sourceName = query.
value(0).toString();
784 QString xmltvFile =
GetConfDir() +
'/' + sourceName +
".xmltv";
786 if (QFile::exists(xmltvFile))
788 QFile
file(xmltvFile);
789 if (!
file.open(QIODevice::ReadOnly | QIODevice::Text))
792 while (!
file.atEnd())
794 QByteArray line =
file.readLine();
796 if (line.startsWith(
"channel="))
798 QString
id = line.mid(8, -1).trimmed();
807 throw(QString(
"SourceID (%1) not found").arg(
SourceID));