diff --git a/mythtv/libs/libmythtv/channelinfo.cpp b/mythtv/libs/libmythtv/channelinfo.cpp index 54966b072a7..2d6ea18e6b6 100644 --- a/mythtv/libs/libmythtv/channelinfo.cpp +++ b/mythtv/libs/libmythtv/channelinfo.cpp @@ -44,6 +44,7 @@ ChannelInfo::ChannelInfo(const ChannelInfo &other) m_useonairguide = other.m_useonairguide; m_mplexid = (other.m_mplexid == 32767) ? 0 : other.m_mplexid; m_serviceid = other.m_serviceid; + m_service_type = other.m_service_type; m_atsc_major_chan = other.m_atsc_major_chan; m_atsc_minor_chan = other.m_atsc_minor_chan; m_last_record = other.m_last_record; diff --git a/mythtv/libs/libmythtv/channelinfo.h b/mythtv/libs/libmythtv/channelinfo.h index 6be9ec37f6d..6cce8f1b6a1 100644 --- a/mythtv/libs/libmythtv/channelinfo.h +++ b/mythtv/libs/libmythtv/channelinfo.h @@ -99,6 +99,7 @@ class MTV_PUBLIC ChannelInfo uint m_mplexid {0}; uint m_serviceid {0}; + uint m_service_type {0}; uint m_atsc_major_chan {0}; uint m_atsc_minor_chan {0}; @@ -150,7 +151,7 @@ class MTV_PUBLIC ChannelInsertInfo bool _is_encrypted, bool _is_data_service, bool _is_audio_service, bool _is_opencable, bool _could_be_opencable, int _decryption_status, - const QString& _default_authority) : + const QString& _default_authority, uint _service_type) : m_db_mplexid(_db_mplexid), m_source_id(_source_id), m_channel_id(_channel_id), @@ -158,6 +159,7 @@ class MTV_PUBLIC ChannelInsertInfo m_service_name(_service_name), m_chan_num(_chan_num), m_service_id(_service_id), + m_service_type(_service_type), m_atsc_major_channel(_atsc_major_channel), m_atsc_minor_channel(_atsc_minor_channel), m_use_on_air_guide(_use_on_air_guide), @@ -205,6 +207,7 @@ class MTV_PUBLIC ChannelInsertInfo QString m_service_name; QString m_chan_num; uint m_service_id {0}; + uint m_service_type {0}; uint m_atsc_major_channel {0}; uint m_atsc_minor_channel {0}; bool m_use_on_air_guide {false}; diff --git a/mythtv/libs/libmythtv/channelscan/channelimporter.cpp b/mythtv/libs/libmythtv/channelscan/channelimporter.cpp index 150cb9ba5e8..375bf612bc4 100644 --- a/mythtv/libs/libmythtv/channelscan/channelimporter.cpp +++ b/mythtv/libs/libmythtv/channelscan/channelimporter.cpp @@ -656,7 +656,8 @@ ScanDTVTransportList ChannelImporter::InsertChannels( QString(), chan.m_format, QString(), - chan.m_default_authority); + chan.m_default_authority, + chan.m_service_type); if (!transports[i].m_iptv_tuning.GetDataURL().isEmpty()) ChannelUtil::CreateIPTVTuningData(chan.m_channel_id, @@ -825,7 +826,8 @@ ScanDTVTransportList ChannelImporter::UpdateChannels( QString(), chan.m_format, QString(), - chan.m_default_authority); + chan.m_default_authority, + chan.m_service_type); } if (updated) diff --git a/mythtv/libs/libmythtv/channelscan/channelscan_sm.cpp b/mythtv/libs/libmythtv/channelscan/channelscan_sm.cpp index 724bfdbadab..d9a10141f5d 100644 --- a/mythtv/libs/libmythtv/channelscan/channelscan_sm.cpp +++ b/mythtv/libs/libmythtv/channelscan/channelscan_sm.cpp @@ -1192,6 +1192,18 @@ static void update_info(ChannelInsertInfo &info, service_name = desc->ServiceName(); if (service_name.trimmed().isEmpty()) service_name.clear(); + + info.m_service_type = desc->ServiceType(); + info.m_is_data_service = + (desc && !desc->IsDTV() && !desc->IsDigitalAudio()); + info.m_is_audio_service = (desc && desc->IsDigitalAudio()); + delete desc; + } + else + { + LOG(VB_CHANSCAN, LOG_INFO, "ChannelScanSM: " + + QString("No ServiceDescriptor for onid %1 tid %2 sid %3") + .arg(sdt->OriginalNetworkID()).arg(sdt->TSID()).arg(sdt->ServiceID(i))); } if (info.m_callsign.isEmpty()) @@ -1206,16 +1218,10 @@ static void update_info(ChannelInsertInfo &info, info.m_hidden = false; info.m_hidden_in_guide = false; - - info.m_is_data_service = - (desc && !desc->IsDTV() && !desc->IsDigitalAudio()); - info.m_is_audio_service = (desc && desc->IsDigitalAudio()); - delete desc; - - info.m_service_id = sdt->ServiceID(i); - info.m_sdt_tsid = sdt->TSID(); - info.m_orig_netid = sdt->OriginalNetworkID(); - info.m_in_sdt = true; + info.m_service_id = sdt->ServiceID(i); + info.m_sdt_tsid = sdt->TSID(); + info.m_orig_netid = sdt->OriginalNetworkID(); + info.m_in_sdt = true; desc_list_t parsed = MPEGDescriptor::Parse(sdt->ServiceDescriptors(i), diff --git a/mythtv/libs/libmythtv/channelscan/scaninfo.cpp b/mythtv/libs/libmythtv/channelscan/scaninfo.cpp index afb75189ffe..ec5ef262150 100644 --- a/mythtv/libs/libmythtv/channelscan/scaninfo.cpp +++ b/mythtv/libs/libmythtv/channelscan/scaninfo.cpp @@ -118,7 +118,8 @@ ScanDTVTransportList LoadScan(uint scanid) " in_pat, in_pmt, in_vct, " " in_nit, in_sdt, is_encrypted, " " is_data_service, is_audio_service, is_opencable, " - " could_be_opencable, decryption_status, default_authority " + " could_be_opencable, decryption_status, default_authority, " + " service_type " "FROM channelscan_channel " "WHERE transportid = :TRANSPORTID"); query2.bindValue(":TRANSPORTID", query.value(15).toUInt()); @@ -178,7 +179,8 @@ ScanDTVTransportList LoadScan(uint scanid) query2.value(32).toBool()/*is_opencable*/, query2.value(33).toBool()/*could_be_opencable*/, query2.value(34).toInt()/*decryption_status*/, - query2.value(35).toString()/*default_authority*/); + query2.value(35).toString()/*default_authority*/, + query2.value(36).toUInt()/*service_type*/); mux.m_channels.push_back(chan); } diff --git a/mythtv/libs/libmythtv/channelutil.cpp b/mythtv/libs/libmythtv/channelutil.cpp index 18644525d66..8eabaa86956 100644 --- a/mythtv/libs/libmythtv/channelutil.cpp +++ b/mythtv/libs/libmythtv/channelutil.cpp @@ -1482,7 +1482,8 @@ bool ChannelUtil::CreateChannel(uint db_mplexid, QString icon, QString format, QString xmltvid, - QString default_authority) + QString default_authority, + uint service_type) { MSqlQuery query(MSqlQuery::InitCon()); @@ -1498,7 +1499,8 @@ bool ChannelUtil::CreateChannel(uint db_mplexid, qstr += " atsc_major_chan, atsc_minor_chan, " " useonairguide, visible, tvformat, " - " icon, xmltvid, default_authority) " + " icon, xmltvid, default_authority, " + " service_type) " "VALUES " " (:CHANID, :CHANNUM, :SOURCEID, " " :CALLSIGN, :NAME, :SERVICEID, "; @@ -1507,7 +1509,8 @@ bool ChannelUtil::CreateChannel(uint db_mplexid, qstr += " :MAJORCHAN, :MINORCHAN, " " :USEOAG, :VISIBLE, :TVFORMAT, " - " :ICON, :XMLTVID, :AUTHORITY) "; + " :ICON, :XMLTVID, :AUTHORITY, " + " :SERVICETYPE ) "; query.prepare(qstr); @@ -1531,10 +1534,11 @@ bool ChannelUtil::CreateChannel(uint db_mplexid, query.bindValue(":FREQID", freqid); QString tvformat = (atsc_minor_channel > 0) ? "ATSC" : std::move(format); - query.bindValueNoNull(":TVFORMAT", tvformat); - query.bindValueNoNull(":ICON", icon); - query.bindValueNoNull(":XMLTVID", xmltvid); - query.bindValueNoNull(":AUTHORITY", default_authority); + query.bindValueNoNull(":TVFORMAT", tvformat); + query.bindValueNoNull(":ICON", icon); + query.bindValueNoNull(":XMLTVID", xmltvid); + query.bindValueNoNull(":AUTHORITY", default_authority); + query.bindValue (":SERVICETYPE", service_type); if (!query.exec() || !query.isActive()) { @@ -1560,7 +1564,8 @@ bool ChannelUtil::UpdateChannel(uint db_mplexid, const QString& icon, QString format, const QString& xmltvid, - const QString& default_authority) + const QString& default_authority, + uint service_type) { if (!channel_id) return false; @@ -1574,7 +1579,7 @@ bool ChannelUtil::UpdateChannel(uint db_mplexid, " atsc_major_chan = :MAJORCHAN, atsc_minor_chan = :MINORCHAN, " " callsign = :CALLSIGN, name = :NAME, " " sourceid = :SOURCEID, useonairguide = :USEOAG, " - " visible = :VISIBLE " + " visible = :VISIBLE, service_type = :SERVICETYPE " "WHERE chanid=:CHANID") .arg((!set_channum) ? "" : "channum = :CHANNUM, ") .arg((freqid.isEmpty()) ? "" : "freqid = :FREQID, ") @@ -1596,13 +1601,14 @@ bool ChannelUtil::UpdateChannel(uint db_mplexid, query.bindValueNoNull(":CALLSIGN", callsign); query.bindValueNoNull(":NAME", service_name); - query.bindValue(":MPLEXID", db_mplexid); + query.bindValue(":MPLEXID", db_mplexid); + query.bindValue(":SERVICEID", service_id); + query.bindValue(":MAJORCHAN", atsc_major_channel); + query.bindValue(":MINORCHAN", atsc_minor_channel); + query.bindValue(":USEOAG", use_on_air_guide); + query.bindValue(":VISIBLE", !hidden); + query.bindValue(":SERVICETYPE", service_type); - query.bindValue(":SERVICEID", service_id); - query.bindValue(":MAJORCHAN", atsc_major_channel); - query.bindValue(":MINORCHAN", atsc_minor_channel); - query.bindValue(":USEOAG", use_on_air_guide); - query.bindValue(":VISIBLE", !hidden); (void) hidden_in_guide; // MythTV can't hide the channel in just the guide. if (!freqid.isEmpty()) diff --git a/mythtv/libs/libmythtv/channelutil.h b/mythtv/libs/libmythtv/channelutil.h index 758807ac3e2..f999f4d98bf 100644 --- a/mythtv/libs/libmythtv/channelutil.h +++ b/mythtv/libs/libmythtv/channelutil.h @@ -117,7 +117,8 @@ class MTV_PUBLIC ChannelUtil QString icon = QString(), QString format = "Default", QString xmltvid = QString(), - QString default_authority = QString()); + QString default_authority = QString(), + uint service_type = 0); static bool UpdateChannel(uint db_mplexid, uint source_id, @@ -135,7 +136,8 @@ class MTV_PUBLIC ChannelUtil const QString& icon = QString(), QString format = QString(), const QString& xmltvid = QString(), - const QString& default_authority = QString()); + const QString& default_authority = QString(), + uint service_type = 0); static bool CreateIPTVTuningData( uint channel_id, const IPTVTuningData &tuning) diff --git a/mythtv/libs/libmythtv/dtvmultiplex.cpp b/mythtv/libs/libmythtv/dtvmultiplex.cpp index cc364409085..5cd092095bb 100644 --- a/mythtv/libs/libmythtv/dtvmultiplex.cpp +++ b/mythtv/libs/libmythtv/dtvmultiplex.cpp @@ -569,7 +569,8 @@ bool ScanDTVTransport::FillFromDB(DTVTunerType type, uint mplexid) " c.serviceid, c.atsc_major_chan, c.atsc_minor_chan, " " c.useonairguide, c.visible, c.freqid, " " c.icon, c.tvformat, c.xmltvid, " - " d.transportid, d.networkid, c.default_authority " + " d.transportid, d.networkid, c.default_authority," + " c.service_type " "FROM channel AS c, dtv_multiplex AS d " "WHERE c.mplexid = :MPLEXID AND" " c.mplexid = d.mplexid"); @@ -600,7 +601,8 @@ bool ScanDTVTransport::FillFromDB(DTVTunerType type, uint mplexid) false, false, false, false, false, false, false, false, false, false, false, 0, - query.value(17).toString() /* default_authority */); + query.value(17).toString(), /* default_authority */ + query.value(18).toUInt()); /* service_type */ m_channels.push_back(chan); }