Ticket #13472: 20190724-keep-channum-ok-all.patch

File 20190724-keep-channum-ok-all.patch, 14.1 KB (added by Klaas de Waal, 11 months ago)

Keep channel numbers after resecan; added "OK All" button; remove check on service ID

  • mythtv/libs/libmythtv/channelscan/channelimporter.cpp

    diff --git a/mythtv/libs/libmythtv/channelscan/channelimporter.cpp b/mythtv/libs/libmythtv/channelscan/channelimporter.cpp
    index 243c8e2cc2..2ce66a2b4a 100644
    a b ScanDTVTransportList ChannelImporter::InsertChannels( 
    388388    ScanDTVTransportList next_list;
    389389
    390390    bool ignore_rest = false;
     391    bool ok_all = false;
    391392
    392393    // insert all channels with non-conflicting channum
    393394    // and complete tuning information.
    ScanDTVTransportList ChannelImporter::InsertChannels( 
    481482                if (m_is_interactive && !asked &&
    482483                    (conflicting || (kChannelTypeConflictingFirst <= type)))
    483484                {
    484                     OkCancelType rc =
    485                         QueryUserResolve(info, transports[i], chan);
    486 
    487                     conflicting = true;
    488                     if (kOCTCancelAll == rc)
    489                         ignore_rest = true;
    490                     else if (kOCTOk == rc)
    491                         conflicting = false;
     485                    bool ok_done = false;
     486                    if (ok_all)
     487                    {
     488                        QString val = ComputeSuggestedChannelNum(chan);
     489                        bool ok = CheckChannelNumber(val, chan);
     490                        if (ok)
     491                        {
     492                            chan.m_chan_num = val;
     493                            conflicting = false;
     494                            ok_done = true;
     495                        }
     496                    }
     497                    if (!ok_done)
     498                    {
     499                        OkCancelType rc =
     500                            QueryUserResolve(info, transports[i], chan);
     501
     502                        conflicting = true;
     503                        if (kOCTCancelAll == rc)
     504                        {
     505                            ignore_rest = true;
     506                        }
     507                        else if (kOCTOk == rc)
     508                        {
     509                            conflicting = false;
     510                        }
     511                        else if (kOCTOkAll == rc)
     512                        {
     513                            conflicting = false;
     514                            ok_all = true;
     515                        }
     516                    }
    492517                }
    493518
    494519                if (conflicting)
    ScanDTVTransportList ChannelImporter::UpdateChannels( 
    635660            {
    636661                bool conflicting = false;
    637662
     663                if (m_keep_channel_numbers)
     664                {
     665                    ChannelUtil::UpdateChannelNumberFromDB(chan);
     666                }
    638667                if (chan.m_chan_num.isEmpty() || renameChannels ||
    639668                    ChannelUtil::IsConflicting(
    640669                        chan.m_chan_num, chan.m_source_id, chan.m_channel_id))
    bool ChannelImporter::IsType( 
    12511280                                        (chan.m_atsc_minor_channel)] == 1));
    12521281
    12531282        case kDVBNonConflicting:
    1254             return ((chan.m_si_standard == "dvb") &&
    1255                     (info.m_prognum_cnt[chan.m_service_id] == 1));
     1283            return ((chan.m_si_standard == "dvb") /* &&
     1284                    (info.m_prognum_cnt[chan.m_service_id] == 1) */);
    12561285
    12571286        case kMPEGNonConflicting:
    12581287            return ((chan.m_si_standard == "mpeg") &&
    void ChannelImporter::CountChannels( 
    13241353 * with an existing channel number. If so, fall back to incrementing a
    13251354 * per-source number to find an unused value.
    13261355 *
    1327  * \param info       Unused.
    1328  * \param transport  Unused.
    13291356 * \param chan       Info describing a channel
    13301357 * \return Returns a simple name for the channel.
    13311358 */
    13321359QString ChannelImporter::ComputeSuggestedChannelNum(
    1333     const ChannelImporterBasicStats &/*info*/,
    1334     const ScanDTVTransport          &/*transport*/,
    13351360    const ChannelInsertInfo         &chan)
    13361361{
    13371362    static QMutex          last_free_lock;
    OkCancelType ChannelImporter::ShowManualChannelPopup( 
    16571682        ((2 == dc) ? kOCTCancel : kOCTCancelAll);
    16581683}
    16591684
     1685OkCancelType ChannelImporter::ShowResolveChannelPopup(
     1686    MythMainWindow *parent, const QString& title,
     1687    const QString& message, QString &text)
     1688{
     1689    int dc = -1;
     1690    MythScreenStack *popupStack = parent->GetStack("popup stack");
     1691    MythDialogBox *popup = new MythDialogBox(title, message, popupStack,
     1692                                             "resolvechannelpopup");
     1693
     1694    if (popup->Create())
     1695    {
     1696        popup->AddButton(QCoreApplication::translate("(Common)", "OK"));
     1697        popup->AddButton(QCoreApplication::translate("(Common)", "OK All"));
     1698        popup->AddButton(tr("Edit"));
     1699        popup->AddButton(QCoreApplication::translate("(Common)", "Cancel"));
     1700        popup->AddButton(QCoreApplication::translate("(Common)", "Cancel All"));
     1701        QObject::connect(popup, &MythDialogBox::Closed,
     1702                         [&](const QString & /*resultId*/, int result)
     1703                         {
     1704                             dc = result;
     1705                             m_eventLoop.quit();
     1706                         });
     1707        popupStack->AddScreen(popup);
     1708        m_eventLoop.exec();
     1709    }
     1710    else
     1711    {
     1712        delete popup;
     1713        popup = nullptr;
     1714    }
     1715
     1716    // Choice "Edit"
     1717    if (2 == dc)
     1718    {
     1719        MythTextInputDialog *textEdit =
     1720            new MythTextInputDialog(popupStack,
     1721                                    tr("Please enter a unique channel number."),
     1722                                    FilterNone, false, text);
     1723        if (textEdit->Create())
     1724        {
     1725            QObject::connect(textEdit, &MythTextInputDialog::haveResult,
     1726                             [&](QString result)
     1727                             {
     1728                                 dc = 0;
     1729                                 text = std::move(result);
     1730                             });
     1731            QObject::connect(textEdit, &MythTextInputDialog::Exiting,
     1732                             [&]()
     1733                             {
     1734                                 m_eventLoop.quit();
     1735                             });
     1736
     1737            popupStack->AddScreen(textEdit);
     1738            m_eventLoop.exec();
     1739        }
     1740        else
     1741            delete textEdit;
     1742    }
     1743
     1744    OkCancelType rval = kOCTCancel;
     1745    switch (dc) {
     1746        case 0: rval = kOCTOk;        break;
     1747        case 1: rval = kOCTOkAll;     break;
     1748        case 2: rval = kOCTCancel;    break;    // "Edit" is done already
     1749        case 3: rval = kOCTCancel;    break;
     1750        case 4: rval = kOCTCancelAll; break;
     1751    }
     1752    return rval;
     1753}
     1754
    16601755OkCancelType ChannelImporter::QueryUserResolve(
    16611756    const ChannelImporterBasicStats &info,
    16621757    const ScanDTVTransport          &transport,
    OkCancelType ChannelImporter::QueryUserResolve( 
    16781773            msg2 += "\n";
    16791774            msg2 += tr("Please enter a unique channel number.");
    16801775
    1681             QString val = ComputeSuggestedChannelNum(info, transport, chan);
     1776            QString val = ComputeSuggestedChannelNum(chan);
    16821777            msg2 += "\n";
    16831778            msg2 += tr("Default value is %1.").arg(val);
    1684             ret = ShowManualChannelPopup(
     1779            ret = ShowResolveChannelPopup(
    16851780                GetMythMainWindow(), tr("Channel Importer"),
    16861781                msg2, val);
    16871782
    1688             if (kOCTOk != ret)
     1783            if (kOCTOk != ret && kOCTOkAll != ret)
    16891784                break; // user canceled..
    16901785
    1691             bool ok = (val.length() >= 1);
    1692             ok = ok && ((val[0] >= '0') && (val[0] <= '9'));
    1693             ok = ok && !ChannelUtil::IsConflicting(
    1694                 val, chan.m_source_id, chan.m_channel_id);
    1695 
    1696             chan.m_chan_num = (ok) ? val : chan.m_chan_num;
     1786            bool ok = CheckChannelNumber(val, chan);
    16971787            if (ok)
     1788            {
     1789                chan.m_chan_num = val;
    16981790                break;
     1791            }
    16991792        }
    17001793    }
    17011794    else if (m_is_interactive)
    OkCancelType ChannelImporter::QueryUserResolve( 
    17271820                break; // user canceled..
    17281821            }
    17291822
    1730             bool ok = (val.length() >= 1);
    1731             ok = ok && ((val[0] >= '0') && (val[0] <= '9'));
    1732             ok = ok && !ChannelUtil::IsConflicting(
    1733                 val, chan.m_source_id, chan.m_channel_id);
    1734 
    1735             chan.m_chan_num = (ok) ? val : chan.m_chan_num;
     1823            bool ok = CheckChannelNumber(val, chan);
    17361824            if (ok)
    17371825            {
     1826                chan.m_chan_num = val;
    17381827                ret = kOCTOk;
    17391828                break;
    17401829            }
    OkCancelType ChannelImporter::QueryUserInsert( 
    17621851            msg2 += " ";
    17631852            msg2 += tr("Please enter a unique channel number.");
    17641853
    1765             QString val = ComputeSuggestedChannelNum(info, transport, chan);
     1854            QString val = ComputeSuggestedChannelNum(chan);
    17661855            msg2 += " ";
    17671856            msg2 += tr("Default value is %1").arg(val);
    17681857            ret = ShowManualChannelPopup(
    OkCancelType ChannelImporter::QueryUserInsert( 
    17721861            if (kOCTOk != ret)
    17731862                break; // user canceled..
    17741863
    1775             bool ok = (val.length() >= 1);
    1776             ok = ok && ((val[0] >= '0') && (val[0] <= '9'));
    1777             ok = ok && !ChannelUtil::IsConflicting(
    1778                 val, chan.m_source_id, chan.m_channel_id);
    1779 
    1780             chan.m_chan_num = (ok) ? val : chan.m_chan_num;
     1864            bool ok = CheckChannelNumber(val, chan);
    17811865            if (ok)
    17821866            {
     1867                chan.m_chan_num = val;
    17831868                ret = kOCTOk;
    17841869                break;
    17851870            }
    OkCancelType ChannelImporter::QueryUserInsert( 
    18161901                break; // user canceled..
    18171902            }
    18181903
    1819             bool ok = (val.length() >= 1);
    1820             ok = ok && ((val[0] >= '0') && (val[0] <= '9'));
    1821             ok = ok && !ChannelUtil::IsConflicting(
    1822                 val, chan.m_source_id, chan.m_channel_id);
    1823 
    1824             chan.m_chan_num = (ok) ? val : chan.m_chan_num;
     1904            bool ok = CheckChannelNumber(val, chan);
    18251905            if (ok)
    18261906            {
     1907                chan.m_chan_num = val;
    18271908                ret = kOCTOk;
    18281909                break;
    18291910            }
    OkCancelType ChannelImporter::QueryUserInsert( 
    18321913
    18331914    return ret;
    18341915}
     1916
     1917// Check validity of a new channel number.
     1918// The channel number is not a number but it is a string that starts with a digit.
     1919// The channel number should not yet exist in this video source.
     1920//
     1921bool ChannelImporter::CheckChannelNumber(
     1922    const QString           &num,
     1923    const ChannelInsertInfo &chan)
     1924{
     1925    bool ok = (num.length() >= 1);
     1926    ok = ok && ((num[0] >= '0') && (num[0] <= '9'));
     1927    ok = ok && !ChannelUtil::IsConflicting(
     1928        num, chan.m_source_id, chan.m_channel_id);
     1929    return ok;
     1930}
     1931 No newline at end of file
  • mythtv/libs/libmythtv/channelscan/channelimporter.h

    diff --git a/mythtv/libs/libmythtv/channelscan/channelimporter.h b/mythtv/libs/libmythtv/channelscan/channelimporter.h
    index a433dcbd30..0017535694 100644
    a b typedef enum { 
    2727    kOCTCancelAll = -1,
    2828    kOCTCancel    = +0,
    2929    kOCTOk        = +1,
     30    kOCTOkAll     = +2,
    3031} OkCancelType;
    3132
    3233class ChannelImporterBasicStats
    class MTV_PUBLIC ChannelImporter 
    182183        ChannelInsertInfo               &chan);
    183184
    184185    static QString ComputeSuggestedChannelNum(
    185         const ChannelImporterBasicStats &info,
    186         const ScanDTVTransport          &transport,
    187186        const ChannelInsertInfo         &chan);
    188187
    189188    OkCancelType ShowManualChannelPopup(
    190189        MythMainWindow *parent, const QString& title,
    191190        const QString& message, QString &text);
    192191
     192    OkCancelType ShowResolveChannelPopup(
     193        MythMainWindow *parent, const QString& title,
     194        const QString& message, QString &text);
     195
    193196    static void FixUpOpenCable(ScanDTVTransportList &transports);
    194197
    195198    static ChannelImporterBasicStats CollectStats(
    class MTV_PUBLIC ChannelImporter 
    226229        const ChannelImporterBasicStats &info,
    227230        ChannelType type, uint &new_chan, uint &old_chan);
    228231
     232    static bool CheckChannelNumber(
     233        const QString           &num,
     234        const ChannelInsertInfo &chan);
     235
    229236  private:
    230237    bool                m_use_gui;
    231238    bool                m_is_interactive;
    class MTV_PUBLIC ChannelImporter 
    238245    bool                m_lcn_only;
    239246    /// Only services with complete scandata desired post scan?
    240247    bool                m_complete_only;
     248    /// Keep existing channel numbers on channel update
     249    bool                m_keep_channel_numbers      {true};
    241250    /// To pass information IPTV channel scan succeeded
    242251    bool                m_success {false};
    243252    /// Services desired post scan
  • mythtv/libs/libmythtv/channelutil.cpp

    diff --git a/mythtv/libs/libmythtv/channelutil.cpp b/mythtv/libs/libmythtv/channelutil.cpp
    index 607df001ee..05f0df06b3 100644
    a b bool ChannelUtil::UpdateChannel(uint db_mplexid, 
    16261626    return true;
    16271627}
    16281628
     1629void ChannelUtil::UpdateChannelNumberFromDB(ChannelInsertInfo &chan)
     1630{
     1631    MSqlQuery query(MSqlQuery::InitCon());
     1632    query.prepare(
     1633        "SELECT channum "
     1634        "FROM channel "
     1635        "WHERE chanid = :ID");
     1636    query.bindValue(":ID", chan.m_channel_id);
     1637
     1638    if (!query.exec())
     1639    {
     1640        MythDB::DBError("UpdateChannelNumberFromDB", query);
     1641        return;
     1642    }
     1643
     1644    if (query.next())
     1645    {
     1646        QString channum = query.value(0).toString();
     1647
     1648        if (!channum.isEmpty())
     1649        {
     1650            chan.m_chan_num = channum;
     1651        }
     1652    }
     1653}
     1654
    16291655void ChannelUtil::UpdateInsertInfoFromDB(ChannelInsertInfo &chan)
    16301656{
    16311657    MSqlQuery query(MSqlQuery::InitCon());
  • mythtv/libs/libmythtv/channelutil.h

    diff --git a/mythtv/libs/libmythtv/channelutil.h b/mythtv/libs/libmythtv/channelutil.h
    index 792563f8f1..d611db34ac 100644
    a b class MTV_PUBLIC ChannelUtil 
    147147        uint channel_id, const IPTVTuningData &tuning);
    148148
    149149    static void    UpdateInsertInfoFromDB(ChannelInsertInfo &chan);
     150    static void    UpdateChannelNumberFromDB(ChannelInsertInfo &chan);
    150151
    151152    static bool    DeleteChannel(uint channel_id);
    152153