28#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
29#include <QtSystemDetection>
36#include "libmythbase/mythconfig.h"
44#include "libmythbase/mythversion.h"
59 qRegisterMetaType<V2CaptureCardList*>(
"V2CaptureCardList");
60 qRegisterMetaType<V2CaptureCard*>(
"V2CaptureCard");
61 qRegisterMetaType<V2CardTypeList*>(
"V2CardTypeList");
62 qRegisterMetaType<V2CardType*>(
"V2CardType");
63 qRegisterMetaType<V2CaptureDeviceList*>(
"V2CaptureDeviceList");
64 qRegisterMetaType<V2CaptureDevice*>(
"V2CaptureDevice");
65 qRegisterMetaType<V2DiseqcTree*>(
"V2DiseqcTree");
66 qRegisterMetaType<V2DiseqcTreeList*>(
"V2DiseqcTreeList");
67 qRegisterMetaType<V2InputGroupList*>(
"V2InputGroupList");
68 qRegisterMetaType<V2InputGroup*>(
"V2InputGroup");
69 qRegisterMetaType<V2DiseqcConfig*>(
"V2DiseqcConfig");
70 qRegisterMetaType<V2DiseqcConfigList*>(
"V2DiseqcConfigList");
71 qRegisterMetaType<V2RecProfParam*>(
"V2RecProfParam");
72 qRegisterMetaType<V2RecProfile*>(
"V2RecProfile");
73 qRegisterMetaType<V2RecProfileGroup*>(
"V2RecProfileGroup");
74 qRegisterMetaType<V2RecProfileGroupList*>(
"V2RecProfileGroupList");
75 qRegisterMetaType<V2CardSubType*>(
"V2CardSubType");
93 throw( QString(
"Database not open while trying to list "
96 QString str =
"SELECT cardid, parentid, videodevice, audiodevice, vbidevice, "
97 "cardtype, defaultinput, audioratelimit, hostname, "
98 "dvb_swfilter, dvb_sat_type, dvb_wait_for_seqstart, "
99 "skipbtaudio, dvb_on_demand, dvb_diseqc_type, "
100 "firewire_speed, firewire_model, firewire_connection, "
101 "signal_timeout, channel_timeout, dvb_tuning_delay, "
102 "contrast, brightness, colour, hue, diseqcid, dvb_eitscan, "
103 "inputname, sourceid, externalcommand, changer_device, "
104 "changer_model, tunechan, startchan, displayname, "
105 "dishnet_eit, recpriority, quicktune, schedorder, "
106 "livetvorder, reclimit, schedgroup "
109 if (!sHostName.isEmpty())
110 str +=
" WHERE hostname = :HOSTNAME";
112 str +=
" WHERE cardtype = :CARDTYPE";
114 if (!sHostName.isEmpty() && !
CardType.isEmpty())
115 str +=
" AND cardtype = :CARDTYPE";
119 if (!sHostName.isEmpty())
127 throw( QString(
"Database Error executing query." ));
141 pCaptureCard->setCardId ( query.
value(0).toInt() );
142 pCaptureCard->setParentId ( query.
value(1).toInt() );
143 pCaptureCard->setVideoDevice ( query.
value(2).toString() );
144 pCaptureCard->setAudioDevice ( query.
value(3).toString() );
145 pCaptureCard->setVBIDevice ( query.
value(4).toString() );
146 pCaptureCard->setCardType ( query.
value(5).toString() );
147 pCaptureCard->setDefaultInput ( query.
value(6).toString() );
148 pCaptureCard->setAudioRateLimit ( query.
value(7).toUInt() );
149 pCaptureCard->setHostName ( query.
value(8).toString() );
150 pCaptureCard->setDVBSWFilter ( query.
value(9).toUInt() );
151 pCaptureCard->setDVBSatType ( query.
value(10).toUInt() );
152 pCaptureCard->setDVBWaitForSeqStart( query.
value(11).toBool() );
153 pCaptureCard->setSkipBTAudio ( query.
value(12).toBool() );
154 pCaptureCard->setDVBOnDemand ( query.
value(13).toBool() );
155 pCaptureCard->setDVBDiSEqCType ( query.
value(14).toUInt() );
156 pCaptureCard->setFirewireSpeed ( query.
value(15).toUInt() );
157 pCaptureCard->setFirewireModel ( query.
value(16).toString() );
158 pCaptureCard->setFirewireConnection( query.
value(17).toUInt() );
159 pCaptureCard->setSignalTimeout ( query.
value(18).toUInt() );
160 pCaptureCard->setChannelTimeout ( query.
value(19).toUInt() );
161 pCaptureCard->setDVBTuningDelay ( query.
value(20).toUInt() );
162 pCaptureCard->setContrast ( query.
value(21).toUInt() );
163 pCaptureCard->setBrightness ( query.
value(22).toUInt() );
164 pCaptureCard->setColour ( query.
value(23).toUInt() );
165 pCaptureCard->setHue ( query.
value(24).toUInt() );
166 pCaptureCard->setDiSEqCId ( query.
value(25).toUInt() );
167 pCaptureCard->setDVBEITScan ( query.
value(26).toBool() );
168 pCaptureCard->setInputName ( query.
value(27).toString() );
169 pCaptureCard->setSourceId ( query.
value(28).toInt() );
170 pCaptureCard->setExternalCommand ( query.
value(29).toString() );
171 pCaptureCard->setChangerDevice ( query.
value(30).toString() );
172 pCaptureCard->setChangerModel ( query.
value(31).toString() );
173 pCaptureCard->setTuneChannel ( query.
value(32).toString() );
174 pCaptureCard->setStartChannel ( query.
value(33).toString() );
175 pCaptureCard->setDisplayName ( query.
value(34).toString() );
176 pCaptureCard->setDishnetEit ( query.
value(35).toBool() );
177 pCaptureCard->setRecPriority ( query.
value(36).toInt() );
178 pCaptureCard->setQuickTune ( query.
value(37).toBool() );
179 pCaptureCard->setSchedOrder ( query.
value(38).toUInt() );
180 pCaptureCard->setLiveTVOrder ( query.
value(39).toUInt() );
181 pCaptureCard->setRecLimit ( query.
value(40).toUInt() );
182 pCaptureCard->setSchedGroup ( query.
value(41).toBool() );
195 throw( QString(
"The Card ID is invalid."));
200 throw( QString(
"Database not open while trying to list "
201 "V2Capture Cards."));
203 QString str =
"SELECT cardid, parentid, videodevice, audiodevice, vbidevice, "
204 "cardtype, defaultinput, audioratelimit, hostname, "
205 "dvb_swfilter, dvb_sat_type, dvb_wait_for_seqstart, "
206 "skipbtaudio, dvb_on_demand, dvb_diseqc_type, "
207 "firewire_speed, firewire_model, firewire_connection, "
208 "signal_timeout, channel_timeout, dvb_tuning_delay, "
209 "contrast, brightness, colour, hue, diseqcid, dvb_eitscan, "
210 "inputname, sourceid, externalcommand, changer_device, "
211 "changer_model, tunechan, startchan, displayname, "
212 "dishnet_eit, recpriority, quicktune, schedorder, "
213 "livetvorder, reclimit, schedgroup "
214 "from capturecard WHERE cardid = :CARDID";
222 throw( QString(
"Database Error executing query." ));
229 pCaptureCard->setCardId ( query.
value(0).toInt() );
230 pCaptureCard->setParentId ( query.
value(1).toInt() );
231 pCaptureCard->setVideoDevice ( query.
value(2).toString() );
232 pCaptureCard->setAudioDevice ( query.
value(3).toString() );
233 pCaptureCard->setVBIDevice ( query.
value(4).toString() );
234 pCaptureCard->setCardType ( query.
value(5).toString() );
235 pCaptureCard->setDefaultInput ( query.
value(6).toString() );
236 pCaptureCard->setAudioRateLimit ( query.
value(7).toUInt() );
237 pCaptureCard->setHostName ( query.
value(8).toString() );
238 pCaptureCard->setDVBSWFilter ( query.
value(9).toUInt() );
239 pCaptureCard->setDVBSatType ( query.
value(10).toUInt() );
240 pCaptureCard->setDVBWaitForSeqStart( query.
value(11).toBool() );
241 pCaptureCard->setSkipBTAudio ( query.
value(12).toBool() );
242 pCaptureCard->setDVBOnDemand ( query.
value(13).toBool() );
243 pCaptureCard->setDVBDiSEqCType ( query.
value(14).toUInt() );
244 pCaptureCard->setFirewireSpeed ( query.
value(15).toUInt() );
245 pCaptureCard->setFirewireModel ( query.
value(16).toString() );
246 pCaptureCard->setFirewireConnection( query.
value(17).toUInt() );
247 pCaptureCard->setSignalTimeout ( query.
value(18).toUInt() );
248 pCaptureCard->setChannelTimeout ( query.
value(19).toUInt() );
249 pCaptureCard->setDVBTuningDelay ( query.
value(20).toUInt() );
250 pCaptureCard->setContrast ( query.
value(21).toUInt() );
251 pCaptureCard->setBrightness ( query.
value(22).toUInt() );
252 pCaptureCard->setColour ( query.
value(23).toUInt() );
253 pCaptureCard->setHue ( query.
value(24).toUInt() );
254 pCaptureCard->setDiSEqCId ( query.
value(25).toUInt() );
255 pCaptureCard->setDVBEITScan ( query.
value(26).toBool() );
256 pCaptureCard->setInputName ( query.
value(27).toString() );
257 pCaptureCard->setSourceId ( query.
value(28).toInt() );
258 pCaptureCard->setExternalCommand ( query.
value(29).toString() );
259 pCaptureCard->setChangerDevice ( query.
value(30).toString() );
260 pCaptureCard->setChangerModel ( query.
value(31).toString() );
261 pCaptureCard->setTuneChannel ( query.
value(32).toString() );
262 pCaptureCard->setStartChannel ( query.
value(33).toString() );
263 pCaptureCard->setDisplayName ( query.
value(34).toString() );
264 pCaptureCard->setDishnetEit ( query.
value(35).toBool() );
265 pCaptureCard->setRecPriority ( query.
value(36).toInt() );
266 pCaptureCard->setQuickTune ( query.
value(37).toBool() );
267 pCaptureCard->setSchedOrder ( query.
value(38).toUInt() );
268 pCaptureCard->setLiveTVOrder ( query.
value(39).toUInt() );
269 pCaptureCard->setRecLimit ( query.
value(40).toUInt() );
270 pCaptureCard->setSchedGroup ( query.
value(41).toBool() );
291 bool HDHRdoesDVBC =
false;
292 bool HDHRdoesDVB =
false;
303 pCardType->setCardId(CardId);
304 pCardType->setSubType (subtype);
308 QMetaEnum meta = QMetaEnum::fromType<CardUtil::INPUT_TYPES>();
309 QString key = meta.valueToKeys(
static_cast<uint>(cardType));
310 QStringList keyList = key.split(
"|");
312 if (keyList.length() > 1 && keyList[1].startsWith(
"DV"))
315 pCardType->setInputType (key);
316 pCardType->setHDHRdoesDVBC (HDHRdoesDVBC);
317 pCardType->setHDHRdoesDVB (HDHRdoesDVB);
334 throw( QString(
"The Card ID is invalid."));
346 const QString &sAudioDevice,
347 const QString &sVBIDevice,
349 const uint nAudioRateLimit,
350 const QString &sHostName,
351 const uint nDVBSWFilter,
352 const uint nDVBSatType,
353 bool bDVBWaitForSeqStart,
356 const uint nDVBDiSEqCType,
357 const uint nFirewireSpeed,
358 const QString &sFirewireModel,
359 const uint nFirewireConnection,
360 const uint nSignalTimeout,
361 const uint nChannelTimeout,
362 const uint nDVBTuningDelay,
363 const uint nContrast,
364 const uint nBrightness,
367 const uint nDiSEqCId,
370 if ( sVideoDevice.isEmpty() ||
CardType.isEmpty() || sHostName.isEmpty() )
371 throw( QString(
"This API requires at least a video device node, a card type, "
372 "and a hostname." ));
375 sVBIDevice,
CardType, nAudioRateLimit,
376 sHostName, nDVBSWFilter, nDVBSatType, bDVBWaitForSeqStart,
377 bSkipBTAudio, bDVBOnDemand, nDVBDiSEqCType, nFirewireSpeed,
378 sFirewireModel, nFirewireConnection, std::chrono::milliseconds(nSignalTimeout),
379 std::chrono::milliseconds(nChannelTimeout), nDVBTuningDelay, nContrast, nBrightness,
380 nColour, nHue, nDiSEqCId, bDVBEITScan);
383 throw( QString(
"Unable to create capture device." ));
391 const QString &sSetting,
392 const QString &sValue )
394 if ( nCardId < 1 || sSetting.isEmpty() )
395 throw( QString(
"Card ID and Setting Name are required." ));
404 if ( nCardInputId < 1 )
405 throw( QString(
"The Input ID is invalid."));
413 const uint nSourceId,
414 const QString &sInputName,
415 const QString &sExternalCommand,
416 const QString &sChangerDevice,
417 const QString &sChangerModel,
418 const QString &sHostName,
419 const QString &sTuneChan,
420 const QString &sStartChan,
421 const QString &sDisplayName,
423 const uint nRecPriority,
424 const uint nQuicktune,
425 const uint nSchedOrder,
426 const uint nLiveTVOrder)
428 if ( nCardId < 1 || nSourceId < 1 ||
429 sInputName.isEmpty() || sInputName ==
"None" )
430 throw( QString(
"This API requires at least a card ID, a source ID, "
431 "and an input name." ));
434 throw QString(
" DisplayName is not set or is not unique.");
437 sExternalCommand, sChangerDevice, sChangerModel,
438 sHostName, sTuneChan, sStartChan, sDisplayName,
439 bDishnetEIT, nRecPriority, nQuicktune, nSchedOrder,
446 const QString &sSetting,
447 const QString &sValue )
449 if ( nCardInputId < 1 || sSetting.isEmpty() || sValue.isEmpty() )
450 throw( QString(
"Input ID, Setting Name, and Value are required." ));
460 pCardTypeList->AddCardType(
461 QObject::tr(
"DVB-T/S/C, ATSC or ISDB-T tuner card"),
"DVB");
465 pCardTypeList->AddCardType(
466 QObject::tr(
"V4L2 encoder"),
"V4L2ENC");
467 pCardTypeList->AddCardType(
468 QObject::tr(
"HD-PVR H.264 encoder"),
"HDPVR");
472 pCardTypeList->AddCardType(
473 QObject::tr(
"HDHomeRun networked tuner"),
"HDHOMERUN");
477 pCardTypeList->AddCardType(
478 QObject::tr(
"Sat>IP networked tuner"),
"SATIP");
482 pCardTypeList->AddCardType(
483 QObject::tr(
"V@Box TV Gateway networked tuner"),
"VBOX");
487 pCardTypeList->AddCardType(
488 QObject::tr(
"FireWire cable box"),
"FIREWIRE");
492 pCardTypeList->AddCardType(
493 QObject::tr(
"Ceton Cablecard tuner"),
"CETON");
497 pCardTypeList->AddCardType(QObject::tr(
"IPTV recorder"),
"FREEBOX");
501 pCardTypeList->AddCardType(
502 QObject::tr(
"Analog to MPEG-2 encoder card (PVR-150/250/350, etc)"),
"MPEG");
503 pCardTypeList->AddCardType(
504 QObject::tr(
"Analog to MJPEG encoder card (Matrox G200, DC10, etc)"),
"MJPEG");
505 pCardTypeList->AddCardType(
506 QObject::tr(
"Analog to MPEG-4 encoder (Plextor ConvertX USB, etc)"),
508 pCardTypeList->AddCardType(
509 QObject::tr(
"Analog capture card"),
"V4L");
513 pCardTypeList->AddCardType(QObject::tr(
"DVEO ASI recorder"),
"ASI");
516 pCardTypeList->AddCardType(QObject::tr(
"Import test recorder"),
"IMPORT");
517 pCardTypeList->AddCardType(QObject::tr(
"Demo test recorder"),
"DEMO");
519 pCardTypeList->AddCardType(QObject::tr(
"External (black box) recorder"),
522 return pCardTypeList;
532 throw( QString(
"Database not open while trying to list "
535 QString q =
"SELECT cardinputid,inputgroupid,inputgroupname "
536 "FROM inputgroup WHERE inputgroupname LIKE 'user:%' "
537 "ORDER BY inputgroupid, cardinputid";
543 return pInputGroupList;
548 pInputGroupList->AddInputGroup(query.
value(0).toUInt(),
549 query.
value(1).toUInt(),
550 query.
value(2).toString());
553 return pInputGroupList;
559 throw( QString(
"Input group name cannot be empty." ) );
561 QString new_name = QString(
"user:") +
Name;
565 if (inputgroupid == 0)
567 throw( QString(
"Failed to add or retrieve %1" ).arg(new_name) );
574 const uint InputGroupId)
577 throw( QString (
"Failed to link input %1 to group %2" )
578 .arg(InputId).arg(InputGroupId));
584 const uint InputGroupId)
587 throw( QString (
"Failed to unlink input %1 from group %2" )
588 .arg(InputId).arg(InputGroupId));
600static QString remove_chaff(
const QString &name)
603 QString short_name = name;
604 if (short_name.startsWith(
"LG Electronics"))
605 short_name = short_name.right(short_name.length() - 15);
606 if (short_name.startsWith(
"Oren"))
607 short_name = short_name.right(short_name.length() - 5);
608 if (short_name.startsWith(
"Nextwave"))
609 short_name = short_name.right(short_name.length() - 9);
610 if (short_name.startsWith(
"frontend", Qt::CaseInsensitive))
611 short_name = short_name.left(short_name.length() - 9);
612 if (short_name.endsWith(
"VSB/QAM"))
613 short_name = short_name.left(short_name.length() - 8);
614 if (short_name.endsWith(
"VSB"))
615 short_name = short_name.left(short_name.length() - 4);
616 if (short_name.endsWith(
"DVB-T"))
617 short_name = short_name.left(short_name.length() - 6);
623 short_name = short_name.simplified();
624 if (short_name.startsWith(
"or51211", Qt::CaseInsensitive))
625 short_name =
"pcHDTV HD-2000";
626 else if (short_name.startsWith(
"or51132", Qt::CaseInsensitive))
627 short_name =
"pcHDTV HD-3000";
628 else if (short_name.startsWith(
"bcm3510", Qt::CaseInsensitive))
629 short_name =
"Air2PC v1";
630 else if (short_name.startsWith(
"nxt2002", Qt::CaseInsensitive) ||
631 short_name.startsWith(
"nxt200x", Qt::CaseInsensitive))
632 short_name =
"Air2PC v2";
633 else if (short_name.startsWith(
"lgdt3302", Qt::CaseInsensitive))
634 short_name =
"DViCO HDTV3";
635 else if (short_name.startsWith(
"lgdt3303", Qt::CaseInsensitive))
636 short_name =
"DViCO v2 or Air2PC v3 or pcHDTV HD-5500";
648 QRegularExpression drv {
"^(?!ivtv|hdpvr|(saa7164(.*))).*$" };
652 QRegularExpression drv {
"^hdpvr$" };
663 for (
const auto & it : std::as_const(sdevs))
665 auto* pDev = pList->AddCaptureDevice();
667 pDev->setVideoDevice (it);
676 int signalTimeout = 0;
677 int channelTimeout = 0;
679 QString err_open = tr(
"Could not open card %1").arg(it);
680 QString err_other = tr(
"Could not get card info for card %1").arg(it);
685 frontendName = err_open;
686 subType = strerror(errno);
689 frontendName = err_other;
690 subType =
"Unknown error";
693 frontendName = err_other;
694 subType = strerror(errno);
698 signalTimeout = 7000;
699 channelTimeout = 10000;
703 signalTimeout = 7000;
704 channelTimeout = 10000;
708 signalTimeout = 3000;
709 channelTimeout = 6000;
713 signalTimeout = 3000;
714 channelTimeout = 6000;
719 signalTimeout = 3000;
720 channelTimeout = 6000;
721 if (frontendName.toLower().indexOf(
"usb") >= 0)
723 signalTimeout = 40000;
724 channelTimeout = 42500;
728 if ((frontendName ==
"DiBcom 3000P/M-C DVB-T") ||
730 "TerraTec/qanu USB2.0 Highspeed DVB-T Receiver"))
738 QString short_name = remove_chaff(frontendName);
740 frontendName = short_name;
741 signalTimeout = 2000;
742 channelTimeout = 4000;
746 if (frontendName ==
"Nextwave NXT200X VSB/QAM frontend")
748 signalTimeout = 3000;
749 channelTimeout = 5500;
757 pDev->setFrontendName ( frontendName );
758 pDev->setSubType ( subType );
759 pDev->setSignalTimeout ( signalTimeout );
760 pDev->setChannelTimeout ( channelTimeout );
761 pDev->setTuningDelay ( tuningDelay );
766 pDev->setSignalTimeout ( 3000 );
767 pDev->setChannelTimeout ( 6000 );
772 pDev->setSignalTimeout ( 7000 );
773 pDev->setChannelTimeout ( 10000 );
776 auto word = it.split(
' ');
778 if (word.size() == 5) {
779 pDev->setVideoDevice(QString(
"%1:%2:%3").arg(word[0], word[4], word[3]));
780 pDev->setVideoDevicePrompt(QString(
"%1, %2, Tuner #%3").arg(word[0], word[4], word[3]));
781 pDev->setDescription(word[1]);
782 pDev->setIPAddress(word[2]);
783 pDev->setTunerType(word[4]);
784 pDev->setTunerNumber(word[3].toUInt());
791 pDev->setSignalTimeout ( 7000 );
792 pDev->setChannelTimeout ( 10000 );
795 auto word = it.split(
" ");
796 if (word.size() == 4) {
797 QString device = QString(
"%1-%2-%3").arg(word[0], word[2], word[3]);
798 pDev->setVideoDevice(device);
799 pDev->setVideoDevicePrompt(device);
801 pDev->setDescription(desc);
802 pDev->setIPAddress(word[1]);
803 pDev->setTunerType(word[3]);
804 pDev->setTunerNumber(word[2].toUInt());
819 throw( QString(
"Database not open while trying to list "
822 QString str =
"SELECT diseqcid, "
841 "FROM diseqc_tree ORDER BY diseqcid";
848 throw( QString(
"Database Error executing query." ));
859 auto *pRec = pList->AddDiseqcTree();
860 pRec->setDiSEqCId ( query.
value( 0 ).toUInt() );
861 pRec->setParentId ( query.
value( 1 ).toUInt() );
862 pRec->setOrdinal ( query.
value( 2 ).toUInt() );
863 pRec->setType ( query.
value( 3 ).toString() );
864 pRec->setSubType ( query.
value( 4 ).toString() );
865 pRec->setDescription ( query.
value( 5 ).toString() );
866 pRec->setSwitchPorts ( query.
value( 6 ).toUInt() );
867 pRec->setRotorHiSpeed ( query.
value( 7 ).toFloat() );
868 pRec->setRotorLoSpeed ( query.
value( 8 ).toFloat() );
869 pRec->setRotorPositions ( query.
value( 9 ).toString() );
870 pRec->setLnbLofSwitch ( query.
value( 10 ).toInt() );
871 pRec->setLnbLofHi ( query.
value( 11 ).toInt() );
872 pRec->setLnbLofLo ( query.
value( 12 ).toInt() );
873 pRec->setCmdRepeat ( query.
value( 13 ).toInt() );
874 pRec->setLnbPolInv ( query.
value( 14 ).toBool() );
875 pRec->setAddress ( query.
value( 15 ).toInt() );
876 pRec->setScrUserband ( query.
value( 16 ).toUInt() );
877 pRec->setScrFrequency ( query.
value( 17 ).toUInt() );
878 pRec->setScrPin ( query.
value( 18 ).toInt() );
887 const QString& SubType,
888 const QString& Description,
892 const QString& RotorPositions,
906 "INSERT INTO diseqc_tree "
947#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
948 query.
bindValue(
":PARENTID", QVariant(QVariant::UInt));
950 query.
bindValue(
":PARENTID", QVariant(QMetaType(QMetaType::UInt)));
960 query.
bindValue(
":DESCRIPTION", Description);
961 query.
bindValue(
":SWITCH_PORTS", SwitchPorts);
962 query.
bindValue(
":ROTOR_HI_SPEED", RotorHiSpeed);
963 query.
bindValue(
":ROTOR_LO_SPEED", RotorLoSpeed);
964 query.
bindValue(
":ROTOR_POSITIONS", RotorPositions);
965 query.
bindValue(
":LNB_LOF_SWITCH", LnbLofSwitch);
966 query.
bindValue(
":LNB_LOF_HI", LnbLofHi);
967 query.
bindValue(
":LNB_LOF_LO", LnbLofLo);
968 query.
bindValue(
":CMD_REPEAT", CmdRepeat);
969 query.
bindValue(
":LNB_POL_INV", LnbPolInv);
971 query.
bindValue(
":SCR_USERBAND", ScrUserband);
972 query.
bindValue(
":SCR_FREQUENCY", ScrFrequency);
978 throw( QString(
"Database Error executing query." ));
988 const QString& SubType,
989 const QString& Description,
993 const QString& RotorPositions,
1007 "UPDATE diseqc_tree SET "
1008 "parentid = :PARENTID, "
1009 "ordinal = :ORDINAL, "
1011 "subtype = :SUBTYPE, "
1012 "description = :DESCRIPTION, "
1013 "switch_ports = :SWITCH_PORTS, "
1014 "rotor_hi_speed = :ROTOR_HI_SPEED, "
1015 "rotor_lo_speed = :ROTOR_LO_SPEED, "
1016 "rotor_positions = :ROTOR_POSITIONS, "
1017 "lnb_lof_switch = :LNB_LOF_SWITCH, "
1018 "lnb_lof_hi = :LNB_LOF_HI, "
1019 "lnb_lof_lo = :LNB_LOF_LO, "
1020 "cmd_repeat = :CMD_REPEAT, "
1021 "lnb_pol_inv = :LNB_POL_INV, "
1022 "address = :ADDRESS, "
1023 "scr_userband = :SCR_USERBAND, "
1024 "scr_frequency = :SCR_FREQUENCY, "
1025 "scr_pin = :SCR_PIN "
1026 "WHERE diseqcid = :DISEQCID " );
1031#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
1032 query.
bindValue(
":PARENTID", QVariant(QVariant::UInt));
1034 query.
bindValue(
":PARENTID", QVariant(QMetaType(QMetaType::UInt)));
1044 query.
bindValue(
":DESCRIPTION", Description);
1045 query.
bindValue(
":SWITCH_PORTS", SwitchPorts);
1046 query.
bindValue(
":ROTOR_HI_SPEED", RotorHiSpeed);
1047 query.
bindValue(
":ROTOR_LO_SPEED", RotorLoSpeed);
1048 query.
bindValue(
":ROTOR_POSITIONS", RotorPositions);
1049 query.
bindValue(
":LNB_LOF_SWITCH", LnbLofSwitch);
1050 query.
bindValue(
":LNB_LOF_HI", LnbLofHi);
1051 query.
bindValue(
":LNB_LOF_LO", LnbLofLo);
1052 query.
bindValue(
":CMD_REPEAT", CmdRepeat);
1053 query.
bindValue(
":LNB_POL_INV", LnbPolInv);
1055 query.
bindValue(
":SCR_USERBAND", ScrUserband);
1056 query.
bindValue(
":SCR_FREQUENCY", ScrFrequency);
1062 throw( QString(
"Database Error executing query." ));
1071 query.
prepare(
"SELECT diseqcid FROM diseqc_tree WHERE parentid = :PARENTID ");
1077 throw( QString(
"Database Error executing query." ));
1080 bool childOK =
true;
1081 while (query.
next())
1088 query2.
prepare(
"DELETE FROM diseqc_tree WHERE diseqcid = :DISEQCID ");
1089 query2.
bindValue(
":DISEQCID", DiSEqCId);
1093 throw( QString(
"Database Error executing query." ));
1096 return numrows > 0 && childOK;
1106 throw( QString(
"Database not open while trying to list "
1109 QString str =
"SELECT cardinputid, "
1112 "FROM diseqc_config ORDER BY cardinputid, diseqcid";
1119 throw( QString(
"Database Error executing query." ));
1128 while (query.
next())
1130 auto *pRec = pList->AddDiseqcConfig();
1131 pRec->setCardId ( query.
value( 0 ).toUInt() );
1132 pRec->setDiSEqCId ( query.
value( 1 ).toUInt() );
1133 pRec->setValue ( query.
value( 2 ).toString() );
1140 const QString& Value)
1145 "INSERT INTO diseqc_config "
1161 throw( QString(
"Database Error executing query." ));
1170 query.
prepare(
"DELETE FROM diseqc_config WHERE cardinputid = :CARDID ");
1175 throw( QString(
"Database Error executing query." ));
1187 "SELECT profilegroups.id, profilegroups.name, cardtype, recordingprofiles.id, recordingprofiles.name, "
1188 "videocodec, audiocodec, "
1189 "codecparams.name, codecparams.value "
1190 "FROM profilegroups "
1191 "INNER JOIN recordingprofiles on profilegroups.id = recordingprofiles.profilegroup "
1192 "LEFT OUTER JOIN codecparams on codecparams.profile = recordingprofiles.id ";
1193 QString where =
"WHERE ";
1196 str.append(where).append(
"CARDTYPE = 'TRANSCODE' OR (cardtype in (SELECT cardtype FROM capturecard)) ");
1201 str.append(where).append(
"profilegroups.id = :GROUPID ");
1206 str.append(where).append(
"recordingprofiles.id = :PROFILEID ");
1211 "ORDER BY IF(cardtype = 'TRANSCODE', 9999, profilegroups.id), recordingprofiles.id, codecparams.name ");
1218 query.
bindValue(
":PROFILEID", ProfileId);
1223 throw( QString(
"Database Error executing query." ));
1232 int prevGroupId = -1;
1233 int prevProfileId = -1;
1238 while (query.
next())
1240 int groupId = query.
value(0).toInt();
1241 if (groupId != prevGroupId)
1243 pGroup = pList->AddProfileGroup();
1244 pGroup->setId ( groupId );
1245 pGroup->setName ( query.
value(1).toString() );
1246 pGroup->setCardType ( query.
value(2).toString() );
1247 prevGroupId = groupId;
1249 int profileId = query.
value(3).toInt();
1253 if (profileId != prevProfileId && pGroup !=
nullptr)
1256 pProfile->setId ( profileId );
1257 pProfile->setName ( query.
value(4).toString() );
1258 pProfile->setVideoCodec ( query.
value(5).toString() );
1259 pProfile->setAudioCodec ( query.
value(6).toString() );
1260 prevProfileId = profileId;
1265 if (!query.
isNull(7) && pProfile !=
nullptr)
1267 auto *pParam = pProfile->
AddParam();
1268 pParam->setName ( query.
value(7).toString() );
1269 pParam->setValue ( query.
value(8).toString() );
1277 const QString& VideoCodec,
const QString& AudioCodec )
1279 if (GroupId == 0 || ProfileName.isEmpty())
1281 LOG(VB_GENERAL, LOG_ERR,
1282 QString(
"AddRecProfile: GroupId and ProfileName are required." ));
1291 "FROM recordingprofiles "
1292 "WHERE name = :NAME AND profilegroup = :PROFILEGROUP;");
1294 query.
bindValue(
":PROFILEGROUP", GroupId);
1298 throw( QString(
"Database Error executing SELECT." ));
1302 int id = query.
value(0).toInt();
1303 LOG(VB_GENERAL, LOG_ERR,
1304 QString(
"Profile %1 already exists in group id %2 with id %3").arg(ProfileName).arg(GroupId).arg(
id));
1309 "INSERT INTO recordingprofiles "
1310 "(name, videocodec, audiocodec, profilegroup) "
1312 "(:NAME, :VIDEOCODEC, :AUDIOCODEC, :PROFILEGROUP);");
1314 query.
bindValue(
":VIDEOCODEC", VideoCodec);
1315 query.
bindValue(
":AUDIOCODEC", AudioCodec);
1316 query.
bindValue(
":PROFILEGROUP", GroupId);
1320 throw( QString(
"Database Error executing INSERT." ));
1331 const QString& VideoCodec,
1332 const QString& AudioCodec )
1336 "SELECT id from recordingprofiles "
1337 "WHERE id = :ID; ");
1342 throw( QString(
"Database Error executing SELECT." ));
1347 id = query.
value(0).toUInt();
1349 if (
id != ProfileId)
1351 LOG(VB_GENERAL, LOG_ERR,
1352 QString(
"UpdateRecProfile: Profile id %1 does not exist").arg(ProfileId));
1356 "UPDATE recordingprofiles "
1357 "SET videocodec = :VIDEOCODEC, "
1358 "audiocodec = :AUDIOCODEC "
1359 "WHERE id = :ID; ");
1360 query.
bindValue(
":VIDEOCODEC", VideoCodec);
1361 query.
bindValue(
":AUDIOCODEC", AudioCodec);
1366 throw( QString(
"Database Error executing UPDATE." ));
1380 "DELETE from codecparams "
1381 "WHERE profile = :ID; ");
1386 throw( QString(
"Database Error executing DELETE." ));
1390 "DELETE from recordingprofiles "
1391 "WHERE id = :ID; ");
1396 throw( QString(
"Database Error executing DELETE." ));
1407 "REPLACE INTO codecparams "
1408 "(profile, name, value) "
1410 "(:PROFILE, :NAME, :VALUE);");
1417 throw( QString(
"Database Error executing REPLACE." ));
bool set_on_input(const QString &to_set, uint inputid, const QString &value)
static INPUT_TYPES toInputType(const QString &name)
static uint CreateInputGroup(const QString &name)
static bool HDHRdoesDVB(const QString &device)
If the device is valid, check if the model does DVB.
static QString ProbeDVBFrontendName(const QString &device)
Returns the input type from the video device.
static QString ProbeDVBType(const QString &device)
INPUT_TYPES
all the different inputs
static bool InputSetMaxRecordings(uint parentid, uint max_recordings)
static QStringList ProbeDeliverySystems(const QString &device)
static QString GetVBoxdesc(const QString &id, const QString &ip, const QString &tunerNo, const QString &tunerType)
Get a nicely formatted string describing the device.
static bool UnlinkInputGroup(uint inputid, uint inputgroupid)
static bool LinkInputGroup(uint inputid, uint inputgroupid)
static QString GetVideoDevice(uint inputid)
static bool HDHRdoesDVBC(const QString &device)
If the device is valid, check if the model does DVB-C.
static bool DeleteInput(uint inputid)
static QString ProbeDefaultDeliverySystem(const QString &device)
static QStringList ProbeVideoDevices(const QString &rawtype)
static bool IsUniqueDisplayName(const QString &name, uint exclude_inputid)
static int CreateCardInput(uint inputid, uint sourceid, const QString &inputname, const QString &externalcommand, const QString &changer_device, const QString &changer_model, const QString &hostname, const QString &tunechan, const QString &startchan, const QString &displayname, bool dishnet_eit, uint recpriority, uint quicktune, uint schedorder, uint livetvorder)
static QString ProbeSubTypeName(uint inputid)
static bool DeleteAllInputs(void)
static int CreateCaptureCard(const QString &videodevice, const QString &audiodevice, const QString &vbidevice, const QString &inputtype, uint audioratelimit, const QString &hostname, uint dvb_swfilter, uint dvb_sat_type, bool dvb_wait_for_seqstart, bool skipbtaudio, bool dvb_on_demand, uint dvb_diseqc_type, uint firewire_speed, const QString &firewire_model, uint firewire_connection, std::chrono::milliseconds signal_timeout, std::chrono::milliseconds channel_timeout, uint dvb_tuning_delay, uint contrast, uint brightness, uint colour, uint hue, uint diseqcid, bool dvb_eitscan)
QSqlQuery wrapper that fetches a DB connection from the connection pool.
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.
bool isNull(int field) const
QVariant value(int i) const
int numRowsAffected() const
bool isConnected(void) const
Only updated once during object creation.
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
void bindValue(const QString &placeholder, const QVariant &val)
Add a single binding.
QVariant lastInsertId()
Return the id of the last inserted row.
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
static MSqlQueryInfo InitCon(ConnectionReuse _reuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
static void DBError(const QString &where, const MSqlQuery &query)
static CardUtil::INPUT_TYPES toDVBInputType(const QString &deviceid)
static bool UpdateCardInput(int CardInputId, const QString &Setting, const QString &Value)
static int AddUserInputGroup(const QString &Name)
static bool LinkInputGroup(uint InputId, uint InputGroupId)
static bool UpdateCaptureCard(int CardId, const QString &Setting, const QString &Value)
static void RegisterCustomTypes()
static bool RemoveCaptureCard(int CardId)
static V2RecProfileGroupList * GetRecProfileGroupList(uint GroupId, uint ProfileId, bool OnlyInUse)
static V2CaptureCardList * GetCaptureCardList(const QString &HostName, const QString &CardType)
static int AddCaptureCard(const QString &VideoDevice, const QString &AudioDevice, const QString &VBIDevice, const QString &CardType, uint AudioRateLimit, const QString &HostName, uint DVBSWFilter, uint DVBSatType, bool DVBWaitForSeqStart, bool SkipBTAudio, bool DVBOnDemand, uint DVBDiSEqCType, uint FirewireSpeed, const QString &FirewireModel, uint FirewireConnection, uint SignalTimeout, uint ChannelTimeout, uint DVBTuningDelay, uint Contrast, uint Brightness, uint Colour, uint Hue, uint DiSEqCId, bool DVBEITScan)
static V2CardSubType * GetCardSubType(int CardId)
static V2CardTypeList * GetCardTypeList(void)
static bool UpdateDiseqcTree(uint DiSEqCId, uint ParentId, uint Ordinal, const QString &Type, const QString &SubType, const QString &Description, uint SwitchPorts, float RotorHiSpeed, float RotorLoSpeed, const QString &RotorPositions, int LnbLofSwitch, int LnbLofHi, int LnbLofLo, int CmdRepeat, bool LnbPolInv, int Address, uint ScrUserband, uint ScrFrequency, int ScrPin)
static bool RemoveDiseqcConfig(uint CardId)
static int AddCardInput(uint CardId, uint SourceId, const QString &InputName, const QString &ExternalCommand, const QString &ChangerDevice, const QString &ChangerModel, const QString &HostName, const QString &TuneChan, const QString &StartChan, const QString &DisplayName, bool DishnetEIT, uint RecPriority, uint Quicktune, uint SchedOrder, uint LiveTVOrder)
static bool UnlinkInputGroup(uint InputId, uint InputGroupId)
static bool RemoveCardInput(int CardInputId)
static bool DeleteRecProfile(uint ProfileId)
static int AddDiseqcTree(uint ParentId, uint Ordinal, const QString &Type, const QString &SubType, const QString &Description, uint SwitchPorts, float RotorHiSpeed, float RotorLoSpeed, const QString &RotorPositions, int LnbLofSwitch, int LnbLofHi, int LnbLofLo, int CmdRepeat, bool LnbPolInv, int Address, uint ScrUserband, uint ScrFrequency, int ScrPin)
static V2CaptureDeviceList * GetCaptureDeviceList(const QString &CardType)
static V2CaptureCard * GetCaptureCard(int CardId)
static bool RemoveDiseqcTree(uint DiSEqCId)
static int AddRecProfile(uint GroupId, const QString &ProfileName, const QString &VideoCodec, const QString &AudioCodec)
static V2DiseqcConfigList * GetDiseqcConfigList(void)
static V2InputGroupList * GetUserInputGroupList(void)
static bool UpdateRecProfileParam(uint ProfileId, const QString &Name, const QString &Value)
static bool SetInputMaxRecordings(uint InputId, uint Max)
static bool RemoveAllCaptureCards(void)
static bool UpdateRecProfile(uint ProfileId, const QString &VideoCodec, const QString &AudioCodec)
static V2DiseqcTreeList * GetDiseqcTreeList(void)
static bool AddDiseqcConfig(uint CardId, uint DiSEqCId, const QString &Value)
V2RecProfile * AddProfile()
V2RecProfParam * AddParam()
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Q_GLOBAL_STATIC_WITH_ARGS(MythHTTPMetaService, s_service,(CAPTURE_HANDLE, V2Capture::staticMetaObject, &V2Capture::RegisterCustomTypes)) void V2Capture
V2CaptureDeviceList * getV4l2List(const QRegularExpression &driver, const QString &cardType)
V2CaptureDeviceList * getFirewireList(const QString &cardType)