38 #include "libmythbase/mythversion.h"
71 qRegisterMetaType<V2ChannelInfoList*>(
"V2ChannelInfoList");
72 qRegisterMetaType<V2ChannelInfo*>(
"V2ChannelInfo");
73 qRegisterMetaType<V2VideoSourceList*>(
"V2VideoSourceList");
74 qRegisterMetaType<V2VideoSource*>(
"V2VideoSource");
75 qRegisterMetaType<V2LineupList*>(
"V2LineupList");
76 qRegisterMetaType<V2Lineup*>(
"V2Lineup");
77 qRegisterMetaType<V2VideoMultiplexList*>(
"V2VideoMultiplexList");
78 qRegisterMetaType<V2VideoMultiplex*>(
"V2VideoMultiplex");
79 qRegisterMetaType<V2Program*>(
"V2Program");
80 qRegisterMetaType<V2RecordingInfo*>(
"V2RecordingInfo");
81 qRegisterMetaType<V2ArtworkInfoList*>(
"V2ArtworkInfoList");
82 qRegisterMetaType<V2ArtworkInfo*>(
"V2ArtworkInfo");
83 qRegisterMetaType<V2CastMemberList*>(
"V2CastMemberList");
84 qRegisterMetaType<V2CastMember*>(
"V2CastMember");
85 qRegisterMetaType<V2Grabber*>(
"V2Grabber");
86 qRegisterMetaType<V2GrabberList*>(
"V2GrabberList");
87 qRegisterMetaType<V2FreqTableList*>(
"V2FreqTableList");
88 qRegisterMetaType<V2CommMethodList*>(
"V2CommMethodList");
89 qRegisterMetaType<V2CommMethod*>(
"V2CommMethod");
90 qRegisterMetaType<V2ScanStatus*>(
"V2ScanStatus");
91 qRegisterMetaType<V2Scan*>(
"V2Scan");
92 qRegisterMetaType<V2ScanList*>(
"V2ScanList");
102 uint nChannelGroupID,
108 bool bGroupByCallsign,
113 uint nTotalAvailable = 0;
118 nSourceID, nChannelGroupID,
false,
"",
127 nStartIndex = (nStartIndex > 0) ? std::min( nStartIndex, nTotalAvailable ) : 0;
128 nCount = (nCount > 0) ? std::min(nCount, (nTotalAvailable - nStartIndex)) :
129 (nTotalAvailable - nStartIndex);
131 ChannelInfoList::iterator chanIt;
132 auto chanItBegin = chanList.begin() + nStartIndex;
133 auto chanItEnd = chanItBegin + nCount;
135 for( chanIt = chanItBegin; chanIt < chanItEnd; ++chanIt )
137 V2ChannelInfo *pChannelInfo = pChannelInfos->AddNewChannelInfo();
144 delete pChannelInfos;
145 throw( QString(
"V2Channel ID appears invalid."));
154 nTotalPages = (int)std::ceil((
float)nTotalAvailable / nCount);
156 if (nTotalPages == 1)
160 nCurPage = (int)std::ceil((
float)nStartIndex / nCount) + 1;
163 pChannelInfos->setStartIndex ( nStartIndex );
164 pChannelInfos->setCount ( nCount );
165 pChannelInfos->setCurrentPage ( nCurPage );
166 pChannelInfos->setTotalPages ( nTotalPages );
167 pChannelInfos->setTotalAvailable( nTotalAvailable );
169 pChannelInfos->setVersion ( MYTH_BINARY_VERSION );
170 pChannelInfos->setProtoVer ( MYTH_PROTO_VERSION );
172 return pChannelInfos;
182 throw( QString(
"V2Channel ID appears invalid."));
199 const QString &CallSign,
200 const QString &ChannelName,
201 const QString &ChannelNumber,
203 uint ATSCMajorChannel,
204 uint ATSCMinorChannel,
207 const QString &ExtendedVisible,
208 const QString &FrequencyID,
211 const QString &XMLTVID,
212 const QString &DefaultAuthority,
219 throw QString(
"ChannelId is required");
222 throw QString(
"Nothing to update");
226 throw QString(
"ChannelId %1 doesn't exist");
235 channel.
m_name = ChannelName;
259 throw QString(
"Can't override Always/NeverVisible");
298 query.
prepare(
"SELECT MAX(chanid) FROM channel");
302 throw( QString(
"Database Error executing query." ));
305 chanId = query.
value(0).toUInt() + 1;
314 const QString &CallSign,
315 const QString &ChannelName,
316 const QString &ChannelNumber,
318 uint ATSCMajorChannel,
319 uint ATSCMinorChannel,
322 const QString &ExtendedVisible,
323 const QString &FrequencyID,
326 const QString &XMLTVID,
327 const QString &DefaultAuthority,
340 CallSign, ChannelName, ChannelNumber,
341 ServiceID, ATSCMajorChannel, ATSCMinorChannel,
342 UseEIT, chan_visible, FrequencyID,
368 pCommMethod->setCommMethod(pref);
384 throw( QString(
"Database not open while trying to list "
387 query.
prepare(
"SELECT sourceid, name, xmltvgrabber, userid, "
388 "freqtable, lineupid, password, useeit, configpath, "
389 "dvb_nit_id, bouquet_id, region_id, scanfrequency, "
390 "lcnoffset FROM videosource "
391 "ORDER BY sourceid" );
397 throw( QString(
"Database Error executing query." ));
411 pVideoSource->setId ( query.
value(0).toInt() );
412 pVideoSource->setSourceName ( query.
value(1).toString() );
413 pVideoSource->setGrabber ( query.
value(2).toString() );
414 pVideoSource->setUserId ( query.
value(3).toString() );
415 pVideoSource->setFreqTable ( query.
value(4).toString() );
416 pVideoSource->setLineupId ( query.
value(5).toString() );
417 pVideoSource->setPassword ( query.
value(6).toString() );
418 pVideoSource->setUseEIT ( query.
value(7).toBool() );
419 pVideoSource->setConfigPath ( query.
value(8).toString() );
420 pVideoSource->setNITId ( query.
value(9).toInt() );
421 pVideoSource->setBouquetId ( query.
value(10).toUInt() );
422 pVideoSource->setRegionId ( query.
value(11).toUInt() );
423 pVideoSource->setScanFrequency ( query.
value(12).toUInt() );
424 pVideoSource->setLCNOffset ( query.
value(13).toUInt() );
428 pList->setVersion ( MYTH_BINARY_VERSION );
429 pList->setProtoVer ( MYTH_PROTO_VERSION );
443 throw( QString(
"Database not open while trying to list "
446 query.
prepare(
"SELECT name, xmltvgrabber, userid, "
447 "freqtable, lineupid, password, useeit, configpath, "
448 "dvb_nit_id, bouquet_id, region_id, scanfrequency, "
450 "FROM videosource WHERE sourceid = :SOURCEID "
451 "ORDER BY sourceid" );
458 throw( QString(
"Database Error executing query." ));
469 pVideoSource->setId ( nSourceID );
470 pVideoSource->setSourceName ( query.
value(0).toString() );
471 pVideoSource->setGrabber ( query.
value(1).toString() );
472 pVideoSource->setUserId ( query.
value(2).toString() );
473 pVideoSource->setFreqTable ( query.
value(3).toString() );
474 pVideoSource->setLineupId ( query.
value(4).toString() );
475 pVideoSource->setPassword ( query.
value(5).toString() );
476 pVideoSource->setUseEIT ( query.
value(6).toBool() );
477 pVideoSource->setConfigPath ( query.
value(7).toString() );
478 pVideoSource->setNITId ( query.
value(8).toInt() );
479 pVideoSource->setBouquetId ( query.
value(9).toUInt() );
480 pVideoSource->setRegionId ( query.
value(10).toUInt() );
481 pVideoSource->setScanFrequency ( query.
value(11).toUInt() );
482 pVideoSource->setLCNOffset ( query.
value(12).toUInt() );
493 const QString &sSourceName,
494 const QString &sGrabber,
495 const QString &sUserId,
496 const QString &sFreqTable,
497 const QString &sLineupId,
498 const QString &sPassword,
500 const QString &sConfigPath,
510 LOG(VB_GENERAL, LOG_ERR,
"SourceId is required");
516 LOG(VB_GENERAL, LOG_ERR, QString(
"SourceId %1 doesn't exist")
523 LOG(VB_GENERAL, LOG_ERR, QString(
"SourceId=%1 was the only parameter")
529 MSqlBindings::const_iterator it;
533 ADD_SQLv2(settings, bindings,
"name",
"SourceName", sSourceName);
536 ADD_SQLv2(settings, bindings,
"xmltvgrabber",
"Grabber", sGrabber);
539 ADD_SQLv2(settings, bindings,
"userid",
"UserId", sUserId);
542 ADD_SQLv2(settings, bindings,
"freqtable",
"FreqTable", sFreqTable);
545 ADD_SQLv2(settings, bindings,
"lineupid",
"LineupId", sLineupId);
548 ADD_SQLv2(settings, bindings,
"password",
"Password", sPassword);
551 ADD_SQLv2(settings, bindings,
"useeit",
"UseEIT", bUseEIT);
555 if (sConfigPath.isEmpty())
556 settings +=
"configpath=NULL, ";
558 ADD_SQLv2(settings, bindings,
"configpath",
"ConfigPath", sConfigPath);
562 ADD_SQLv2(settings, bindings,
"dvb_nit_id",
"NITId", nNITId);
565 ADD_SQLv2(settings, bindings,
"bouquet_id",
"BouquetId", nBouquetId);
568 ADD_SQLv2(settings, bindings,
"region_id",
"RegionId", nRegionId);
571 ADD_SQLv2(settings, bindings,
"scanfrequency",
"ScanFrequency", nScanFrequency);
574 ADD_SQLv2(settings, bindings,
"lcnoffset",
"LCNOffset", nLCNOffset);
576 if ( settings.isEmpty() )
578 LOG(VB_GENERAL, LOG_ERR,
"No valid parameters were passed");
586 query.
prepare(QString(
"UPDATE videosource SET %1 WHERE sourceid=:SOURCEID")
588 bindings[
":SOURCEID"] = nSourceId;
590 for (it = bindings.cbegin(); it != bindings.cend(); ++it)
597 throw( QString(
"Database Error executing query." ));
608 const QString &sGrabber,
609 const QString &sUserId,
610 const QString &sFreqTable,
611 const QString &sLineupId,
612 const QString &sPassword,
614 const QString &sConfigPath,
622 sLineupId, sPassword, bUseEIT, sConfigPath,
623 nNITId, nBouquetId, nRegionId, nScanFrequency,
665 bool bWaitForFinish )
667 if ( nSourceId < 1 || nCardId < 1)
668 throw( QString(
"A source ID and card ID are both required."));
701 throw( QString(
"Database not open while trying to list "
704 query.
prepare(
"SELECT mplexid, sourceid, transportid, networkid, "
705 "frequency, inversion, symbolrate, fec, polarity, "
706 "modulation, bandwidth, lp_code_rate, transmission_mode, "
707 "guard_interval, visible, constellation, hierarchy, hp_code_rate, "
708 "mod_sys, rolloff, sistandard, serviceversion, updatetimestamp, "
709 "default_authority FROM dtv_multiplex WHERE sourceid = :SOURCEID "
710 "ORDER BY mplexid" );
717 throw( QString(
"Database Error executing query." ));
728 nStartIndex = (nStartIndex > 0) ? std::min( nStartIndex, muxCount ) : 0;
729 nCount = (nCount > 0) ? std::min( nCount, muxCount ) : muxCount;
730 int nEndIndex = std::min((nStartIndex + nCount), muxCount );
732 for(
int n = nStartIndex; n < nEndIndex; n++)
736 V2VideoMultiplex *pVideoMultiplex = pVideoMultiplexes->AddNewVideoMultiplex();
738 pVideoMultiplex->setMplexId( query.
value(0).toInt() );
739 pVideoMultiplex->setSourceId( query.
value(1).toInt() );
740 pVideoMultiplex->setTransportId( query.
value(2).toInt() );
741 pVideoMultiplex->setNetworkId( query.
value(3).toInt() );
742 pVideoMultiplex->setFrequency( query.
value(4).toLongLong() );
743 pVideoMultiplex->setInversion( query.
value(5).toString() );
744 pVideoMultiplex->setSymbolRate( query.
value(6).toLongLong() );
745 pVideoMultiplex->setFEC( query.
value(7).toString() );
746 pVideoMultiplex->setPolarity( query.
value(8).toString() );
747 pVideoMultiplex->setModulation( query.
value(9).toString() );
748 pVideoMultiplex->setBandwidth( query.
value(10).toString() );
749 pVideoMultiplex->setLPCodeRate( query.
value(11).toString() );
750 pVideoMultiplex->setTransmissionMode( query.
value(12).toString() );
751 pVideoMultiplex->setGuardInterval( query.
value(13).toString() );
752 pVideoMultiplex->setVisible( query.
value(14).toBool() );
753 pVideoMultiplex->setConstellation( query.
value(15).toString() );
754 pVideoMultiplex->setHierarchy( query.
value(16).toString() );
755 pVideoMultiplex->setHPCodeRate( query.
value(17).toString() );
756 pVideoMultiplex->setModulationSystem( query.
value(18).toString() );
757 pVideoMultiplex->setRollOff( query.
value(19).toString() );
758 pVideoMultiplex->setSIStandard( query.
value(20).toString() );
759 pVideoMultiplex->setServiceVersion( query.
value(21).toInt() );
760 pVideoMultiplex->setUpdateTimeStamp(
762 pVideoMultiplex->setDefaultAuthority( query.
value(23).toString() );
766 if (query.
value(9).toString() ==
"8vsb")
768 QString ChannelNumber =
770 QString(
"Freq %1").arg(query.
value(4).toInt());
771 int findFrequency = (query.
value(4).toInt() / 1000) - 1750;
774 if ((list.freq <= findFrequency + 200) &&
775 (list.freq >= findFrequency - 200))
777 ChannelNumber = QString(
"%1").arg(list.name);
781 DisplayText = tr(
"ATSC Channel %1").arg(ChannelNumber);
785 DisplayText = QString(
"%1 Hz (%2) (%3) (%4)")
786 .arg(query.
value(4).toString(),
787 query.
value(6).toString(),
788 query.
value(3).toString(),
789 query.
value(2).toString());
791 pVideoMultiplex->setDescription(DisplayText);
800 totalPages = (int)std::ceil((
float)muxCount / nCount);
806 curPage = (int)std::ceil((
float)nStartIndex / nCount) + 1;
809 pVideoMultiplexes->setStartIndex ( nStartIndex );
810 pVideoMultiplexes->setCount ( nCount );
811 pVideoMultiplexes->setCurrentPage ( curPage );
812 pVideoMultiplexes->setTotalPages ( totalPages );
813 pVideoMultiplexes->setTotalAvailable( muxCount );
815 pVideoMultiplexes->setVersion ( MYTH_BINARY_VERSION );
816 pVideoMultiplexes->setProtoVer ( MYTH_PROTO_VERSION );
818 return pVideoMultiplexes;
826 throw( QString(
"Database not open while trying to list "
827 "Video Multiplex."));
829 query.
prepare(
"SELECT sourceid, transportid, networkid, "
830 "frequency, inversion, symbolrate, fec, polarity, "
831 "modulation, bandwidth, lp_code_rate, transmission_mode, "
832 "guard_interval, visible, constellation, hierarchy, hp_code_rate, "
833 "mod_sys, rolloff, sistandard, serviceversion, updatetimestamp, "
834 "default_authority FROM dtv_multiplex WHERE mplexid = :MPLEXID "
835 "ORDER BY mplexid" );
842 throw( QString(
"Database Error executing query." ));
849 pVideoMultiplex->setMplexId( nMplexID );
850 pVideoMultiplex->setSourceId( query.
value(0).toInt() );
851 pVideoMultiplex->setTransportId( query.
value(1).toInt() );
852 pVideoMultiplex->setNetworkId( query.
value(2).toInt() );
853 pVideoMultiplex->setFrequency( query.
value(3).toLongLong() );
854 pVideoMultiplex->setInversion( query.
value(4).toString() );
855 pVideoMultiplex->setSymbolRate( query.
value(5).toLongLong() );
856 pVideoMultiplex->setFEC( query.
value(6).toString() );
857 pVideoMultiplex->setPolarity( query.
value(7).toString() );
858 pVideoMultiplex->setModulation( query.
value(8).toString() );
859 pVideoMultiplex->setBandwidth( query.
value(9).toString() );
860 pVideoMultiplex->setLPCodeRate( query.
value(10).toString() );
861 pVideoMultiplex->setTransmissionMode( query.
value(11).toString() );
862 pVideoMultiplex->setGuardInterval( query.
value(12).toString() );
863 pVideoMultiplex->setVisible( query.
value(13).toBool() );
864 pVideoMultiplex->setConstellation( query.
value(14).toString() );
865 pVideoMultiplex->setHierarchy( query.
value(15).toString() );
866 pVideoMultiplex->setHPCodeRate( query.
value(16).toString() );
867 pVideoMultiplex->setModulationSystem( query.
value(17).toString() );
868 pVideoMultiplex->setRollOff( query.
value(18).toString() );
869 pVideoMultiplex->setSIStandard( query.
value(19).toString() );
870 pVideoMultiplex->setServiceVersion( query.
value(20).toInt() );
871 pVideoMultiplex->setUpdateTimeStamp(
873 pVideoMultiplex->setDefaultAuthority( query.
value(22).toString() );
876 return pVideoMultiplex;
888 throw( QString(
"Database not open while trying to get source name."));
890 query.
prepare(
"SELECT name FROM videosource WHERE sourceid = :SOURCEID ");
897 throw( QString(
"Database Error executing query." ));
904 QString sourceName = query.
value(0).toString();
906 QString xmltvFile =
GetConfDir() +
'/' + sourceName +
".xmltv";
908 if (QFile::exists(xmltvFile))
910 QFile
file(xmltvFile);
911 if (!
file.open(QIODevice::ReadOnly | QIODevice::Text))
914 while (!
file.atEnd())
916 QByteArray line =
file.readLine();
918 if (line.startsWith(
"channel="))
920 QString
id = line.mid(8, -1).trimmed();
929 throw(QString(
"SourceID (%1) not found").arg(
SourceID));
948 V2Grabber *pGrabber = pGrabberList->AddNewGrabber();
949 pGrabber->setProgram(
"eitonly");
950 pGrabber->setDisplayName(QObject::tr(
"Transmitted guide only (EIT)"));
951 pGrabber = pGrabberList->AddNewGrabber();
952 pGrabber->setProgram(
"/bin/true");
953 pGrabber->setDisplayName(QObject::tr(
"No grabber"));
960 find_grabber_proc.
Run(25s);
961 LOG(VB_GENERAL, LOG_INFO,
962 "Running 'tv_find_grabbers " +
args.join(
" ") +
"'.");
963 uint status = find_grabber_proc.
Wait();
967 QTextStream ostream(find_grabber_proc.
ReadAll());
968 while (!ostream.atEnd())
970 QString grabber_list(ostream.readLine());
971 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
972 QStringList grabber_split =
973 grabber_list.split(
"|", QString::SkipEmptyParts);
975 QStringList grabber_split =
976 grabber_list.split(
"|", Qt::SkipEmptyParts);
978 QString grabber_name = grabber_split[1];
979 QFileInfo grabber_file(grabber_split[0]);
980 QString program = grabber_file.fileName();
982 if (!pGrabberList->containsProgram(program))
984 pGrabber = pGrabberList->AddNewGrabber();
985 pGrabber->setProgram(program);
986 pGrabber->setDisplayName(grabber_name);
988 LOG(VB_GENERAL, LOG_DEBUG,
"Found " + grabber_split[0]);
990 LOG(VB_GENERAL, LOG_INFO,
"Finished running tv_find_grabbers");
994 LOG(VB_GENERAL, LOG_ERR,
"Failed to run tv_find_grabbers");
1003 QStringList freqList;
1004 freqList.append(
"default");
1007 freqList.append(freqEntry.name);
1021 bool TestDecryptable,
1022 const QString &ScanType,
1025 const QString &FirstChan,
1026 const QString &LastChan,
1032 const QString &Bandwidth,
1033 const QString &Polarity,
1034 const QString &SymbolRate,
1035 const QString &Inversion,
1036 const QString &Constellation,
1037 const QString &ModSys,
1038 const QString &CodeRateLP,
1039 const QString &CodeRateHP,
1041 const QString &TransmissionMode,
1042 const QString &GuardInterval,
1043 const QString &Hierarchy,
1047 if (pScanner->
m_status ==
"RUNNING")
1089 pStatus->setCardId(pScanner->
m_cardid);
1090 pStatus->setStatus(pScanner->
m_status);
1098 pStatus->setDialogMsg(pScanner->
m_dlgMsg);
1121 auto *pItem = pResult->AddNewScan();
1122 pItem->setScanId (
scan.m_scanid);
1123 pItem->setCardId (
scan.m_cardid);
1124 pItem->setSourceId (
scan.m_sourceid);
1125 pItem->setProcessed (
scan.m_processed);
1126 pItem->setScanDate (
scan.m_scandate);
1132 const QString &DialogString,