commit 0d263282c84eb36e1e818c5f9d94698999c5bd50
Author: John Hoyt <john.hoyt@gmail.com>
Date:   Wed Jul 22 07:18:56 2026 -0400

    cmake: Fix macOS CPack variable scope isolation failures
    
      Recent CMake updates enforce strict sandbox isolation boundaries
      during nested CPack executions. This isolation strips out standard
      non-cache path variables like `CMAKE_CURRENT_BINARY_DIR` and relative
      bundle paths evaluating them to null.
    
      Introduce a dedicated `CPackOptions.cmake` project configuration
      file to resolve empty environment variable failures during the
      isolated CPack bundle packaging run.
    
    (cherry picked from commit 6c227b1634c83a1361001c226c8123e8a2e1e02b)

commit b328f43585fc4d9f8075e648a8e28bd6686993fb
Author: Nick Morrott <knowledgejunkie@gmail.com>
Date:   Mon Jul 27 05:48:36 2026 +0100

    Translations: Update mythfrontend translation binary file (French)

commit c715cb4066b6448de48cd38946ba6fc5b04fd9fb
Author: Ti Buntu <tibuntu974@gmail.com>
Date:   Mon Jul 27 05:47:52 2026 +0100

    Translations: Update mythfrontend translation source file (French)
    
    Signed-off-by: Nick Morrott <knowledgejunkie@gmail.com>

commit e120835b6948862377bfcb9431aa42330cb78f9f
Author: Klaas de Waal <klaas@kldo.nl>
Date:   Mon Jul 13 19:04:35 2026 +0200

    Restore old logic for duplicate PES packet
    
    As part of commit 3b14fdf the function returns true when a duplicate
    PES packet is detected. The original code did return false if the duplicate
    packet was correct.
    This change caused a regression as reported in the comments of commit 3b14fdf.
    For some broadcast channel the decoder logic would never synchronize becuase of this.
    The fix consists of removing the added return statement so the original logic
    is restored.
    
    (cherry picked from commit 662640242df9ecf236ea4722a36edf208f1f7108)

commit 7153bb6e34c973f7d19e44eb2cbead81d4236469
Author: David Hampton <mythtv@love2code.net>
Date:   Wed Jul 1 19:19:54 2026 -0400

    Add support for ECDSA (and other) TLS certificates
    
    (cherry picked from commit f63ab25f4b7da8ac22eaab88bdfa94e3809c1cbc)

commit a833aecd847ab9aa3d64c690ac2906273d9983fc
Author: David Hampton <mythtv@love2code.net>
Date:   Mon Jun 8 17:36:06 2026 -0400

    Fix test for whether or not a file might contain subtitles.
    
    The IsSubtitlePossible test should return true if the file extension
    isn't in a list of files know not to have subtitles.

commit d75e183a35d0ad3791b3002e727f269a1a5c89cd
Author: jhoyt4 <john.hoyt@gmail.com>
Date:   Fri May 22 09:42:41 2026 -0400

    macOS: address issue where maridb server requires ssl connection
    
      resolves an issue reported in the forums where frontend will not
      connect to a mariadb backend using ssl without a cert copied locally.
      https://forum.mythtv.org/viewtopic.php?t=6196
    
    (cherry picked from commit 2fa497c045129d765581c2c2aa560c7ae578979b)

commit eedec9ebb75e28590c16c7d71fb2f992e16abd1a
Author: David Hampton <mythtv@love2code.net>
Date:   Thu Apr 23 10:25:34 2026 -0400

    Fix parsing of UPnP ContentDirectory Browse requests.
    
    The parsing happens correctly, but the test of the result is inverted.
    This error appeared in 29d3a7ab6e which added code to track changes in
    Qt6.5.
    
    Fixes 1352.
    
    (cherry picked from commit cd905d10d63525ca5b6553bf1033de683e2b423a)

commit 4a9097b492c7ced258657fd7de980dce8b72b80e
Author: Klaas de Waal <klaas@kldo.nl>
Date:   Sun Apr 12 22:12:28 2026 +0200

    Subtitles: Fix segfault by making loop "as_const"
    
    Fix segfault in presenting subtitles by modernizing a loop construct
    and using "std:as_const". This prevents the list being modified
    while the loop is being executed.
    
    Refs #1351
    
    (cherry picked from commit 62d606ec471bcb70dc860120698417651704a11d)

commit 0fb9e4f3159594893fc8d93a76aa94c877a1e9b9
Author: Scott Theisen <scott.the.elm@gmail.com>
Date:   Wed Apr 8 16:26:40 2026 -0400

    Qt6: Revise the fix for OpenGL on Wayland and xcb EGL integration
    
    The original fix, 373bce861d0b00ee972f3882e8386664b37fd93b,
    broke the GUI for the eglfs QPA platform.
    
    Setting the surface type in the MythPainterWindowOpenGL
    constructor before creating the QWindow, which both winId()
    and setVisible(true) would do, is simpler and avoids the
    delay caused by destroying and creating a new surface.
    
    References:
    https://github.com/MythTV/mythtv/issues/754
    https://github.com/MythTV/mythtv/issues/1099
    https://github.com/MythTV/mythtv/issues/1334
    https://github.com/MythTV/mythtv/pull/1341
    (cherry picked from commit 7fb14ca0d296ef54d566efed621a364cf52b2364)

commit e07cdacbf960351ad8342db44217a3d5eaf92d2a
Author: Scott Theisen <scott.the.elm@gmail.com>
Date:   Sun Apr 5 20:57:17 2026 -0400

    Qt6: Fix OpenGL on Wayland and xcb EGL integration
    
    On Wayland, it previously deadlocked in QWaylandGLContext::makeCurrent()
    when MythRenderOpenGL::makeCurrent() is called in MythRenderOpenGL::Init().
    
    Forcing the xcb QPA with the environment variable QT_QPA_PLATFORM=xcb
    or the `--platform xcb` command-line flag causes
    `QEGLPlatformContext: eglMakeCurrent failed: 300d` (EGL_BAD_SURFACE)
    and a subsequent segmentation fault.
    
    The original code never destroyed the original QWindow::RasterSurface
    surface after setting the surface type to QWindow::OpenGLSurface, so
    Qt thought the QWindow::RasterSurface was a QWindow::OpenGLSurface
    which are incompatible.
    
    Destroying and then creating a new surface immediately after setting
    the surface type destroys the QWindow::RasterSurface and creates
    the desired QWindow::OpenGLSurface.
    
    Fixes:
    https://github.com/MythTV/mythtv/issues/754
    https://github.com/MythTV/mythtv/issues/1334
    (cherry picked from commit 373bce861d0b00ee972f3882e8386664b37fd93b)

commit b8e0499f8624e701b7e09cebce2612fbb55467ff
Author: Klaas de Waal <klaas@kldo.nl>
Date:   Wed Apr 8 16:22:48 2026 +0200

    Include QtSystemDetection for Qt version >= 6.5.0
    
    Change the include condition from Qt 6.0.0 to Qt 6.5.0
    The include file QtSystemDetection, and many more, are split off
    from QtGlobal since Qt version 6.5.0 and not since 6.0.0.
    This is documented in https://doc.qt.io/qt-6/qtglobal.html
    This fixes compilation on Ubuntu 24.04.4 LTS which has
    Qt version 6.4.2.
    
    (cherry picked from commit 248f321d77926eecaf69be4f506a99d80e8ed781)

commit eda2abc46cc4e523bb1ff42ab19f4d09eb4e0f8f
Author: Scott Theisen <scott.the.elm@gmail.com>
Date:   Tue Apr 7 16:23:38 2026 -0400

    Qt6: Fix abort from QChar in LIRC code
    
    The values of Qt::Key <= 0xFFFF correspond to Unicode
    code points. The Qt 6 QChar constructor aborts on any
    input value > 0xFFFF, so only attempt to create a QChar
    from keycode when it is a valid Unicode code point.
    
    Fixes:
    https://github.com/MythTV/mythtv/issues/1340
    (cherry picked from commit bcfa6436b170733f937b2e1acb4ae235943e55cf)

commit 756930d702565e3b2b8bc75a8fd96b35091852bf
Author: David Hampton <mythtv@love2code.net>
Date:   Wed Apr 8 12:55:03 2026 -0400

    Update cmake for Qt6.10 changes to private components.
    
    Prior to Qt6.10, checking for the qt "Gui" component would properly
    set both the "Gui" and the "GuiPrivate" targets.  Starting in 6.10,
    the code must explicitly check for the GuiPrivate component.
    
    This change is not backward compatible, so the code must currently
    check for the presence of Qt and the Gui component, obtain the version
    number from the results, and then perform an additional check for the
    GuiPrivate component.
    
    (cherry picked from commit c8886e6d8f87805c6be6db29f812f7053c5a10b6)

commit d1e2bb930e5adaae6a7b8b0252a6c5301942e385
Author: Ian Campbell <ijc@hellion.org.uk>
Date:   Sun Mar 15 08:40:47 2026 +0000

    Use `QWindow::devicePixelRatio()` when possible
    
    From the [Qt6 docs][]:
    
    > This function may return a value that differs from
    > QWindow::devicePixelRatio(), for instance on Wayland when using fractional
    > scaling, or if window properties that affect surface resolution are set.
    > Prefer using QWindow::devicePixelRatio().
    
    [Qt6 docs]: https://doc.qt.io/qt-6/qscreen.html#devicePixelRatio-prop
    
    (cherry picked from commit 2e8394160293455888afff6365bef43455bb52a8)

commit d9f5a98858788c48df1e0b3156cc56b3771839fb
Author: Ian Campbell <ijc@hellion.org.uk>
Date:   Wed Mar 11 18:18:43 2026 +0000

    Refactor signals relating to the screen changing
    
    There are several (`ScreenChanged`, `PhysicalDPIChanged`) taking arguments
    related to their naming but the recipients don't actually care about the
    details and just want to probe the current state.
    
    So simplify things into a single `DisplayChanged` signal.
    
    (cherry picked from commit 510478e8fcb71ce66444b1d0cbeff57e5698e5c8)

commit cd2c7cd21c67193bcb065e61f9ee2ff199cbb897
Author: Ian Campbell <ijc@hellion.org.uk>
Date:   Sat Feb 28 09:46:38 2026 +0000

    Use devicePixelRatio consistently,
    
    ... rather than a mix of pixel ratio and DPI from two different sources.
    
    The code was initially setting `m_pixelRatio` based on
    `MythMainWindow::devicePixelRatioF()`.
    
    It was then updating it based on `MythDisplay::CurrentDPIChanged` signal which
    is forwarding `QScreen::physicalDotsPerInchChanged` from the `QScreen
    underlying the `MythDisplay` behind the `MythMainWindow`.
    
    This seems wrong/inconsistent in two ways:
    
    Firstly a `devicePixelRatio` is a different thing from a DPI. A pixel ratio is
    (from [QT 6 docs][qt6-ratio]):
    
    > This property holds the screen's ratio between physical pixels and
    > device-independent pixels.
    
    The [QT 5][qt5-ratio] says ~the same but also notes:
    
    > Common values are 1.0 on normal displays and 2.0 on "retina" displays. Higher
    > values are also possible.
    
    (QT 6's `QWindow` docs have similar wording)
    
    While DPI is (per [QT 6 docs][qt6-dpi]):
    
    > This property holds the number of physical dots or pixels per inch
    >
    > This value represents the pixel density on the screen's display
    
    (again [QT 5][qt5-dpi] says much the same). A DPI is in the tens-hundreds range
    depending on the display. e.g. on my UHD display at 1920x1080 it is ~110 and at
    3840x2160 it is ~55.
    
    Scaling the display by the pixel ratio (1.0-2.0) at some points and by the DPI
    (tens-hundreds) at others, based only on whether the resolution has changed
    makes no sense.
    
    Secondly taking the properies from two different places (initially the display
    and later the screen) at two different times is inconsistent. I believe scaling
    by the device pixel ratio makes sense so consistently set `m_pixelRatio` to
    that. Also retain the DPI as a new `m_DPI` although currently nothing is using
    it.
    
    Note that [QT 6][qt6-ratio] says of the ratio:
    
    > This function may return a value that differs from
    > QWindow::devicePixelRatio(), for instance on Wayland when using fractional
    > scaling, or if window properties that affect surface resolution are set.
    > Prefer using QWindow::devicePixelRatio().
    
    The code here does not currently have easy access to the `QWindow` so I have
    decided in the first pass to standardise on the properties of the `QScreen`.
    Accessing a `QWindow` and getting the appropriate events for it will take some
    replumbing since `MythDisplay::m_window` can change and can be null. Also there
    is no signal for DPI or ratio changes in this case, a handler for
    `QEvent::DevicePixelRatioChange` would be needed. Since the existing code also
    does not use a `QWindow` under any circumstances this change I feel is at least
    an improvement.
    
    This fixes https://github.com/MythTV/mythtv/issues/1300, I think it might also
    have a positive impact on the scaling issue described in
    https://github.com/MythTV/mythtv/issues/754#issuecomment-356838787a4.
    
    [qt6-ratio]: https://doc.qt.io/qt-6/qscreen.html#devicePixelRatio-prop
    [qt6-dpi]: https://doc.qt.io/qt-6/qscreen.html#logicalDotsPerInch-prop
    [qt5-ratio]: https://doc.qt.io/archives/qt-5.15/qscreen.html#devicePixelRatio-prop
    [qt5-dpi]: https://doc.qt.io/archives/qt-5.15/qscreen.html#logicalDotsPerInch-prop
    
    (cherry picked from commit 122a6d8880642f8a4b3073a716fc2eefe7180259)

commit 1b2cba948306d2899030e6319fb215c89b67ada4
Author: David Hampton <mythtv@love2code.net>
Date:   Mon Apr 6 00:59:05 2026 -0400

    Fix parsing of ATSC Multiple String Structures.
    
    The code to parse mode 3F (straight UTF-16 characters) didn't properly
    create a value between 0 and 0xFFFF, but had additional high bits set.
    Qt5 silently truncated these high bits, but Qt6 throws an error.
    
    (cherry picked from commit 3948fca2bab9561000fad75e7215ff2cd70d7a9b)

commit ababe58b73dc5f506ac42bed05f2bc45e80f87d1
Author: Klaas de Waal <klaas@kldo.nl>
Date:   Tue Mar 3 21:05:24 2026 +0100

    Skip low priority PIDs for SatIP -- v2
    
    Create a PID list without the low priority PIDs. This does leave
    all the PIDs that are needed to receive the requested channel.
    This does fix a problem with the Telestar Digibit SatIP server
    boxes; they cannot handle PID lists with more than 32 PIDs.
    The number of PIDs of a single channel is generally below 32 but
    with all the PMT PIDs of multiplex added the number of PIDs can
    be far more than 32.
    
    The low priority PIDs are used to receive the PMTs of the other
    programs in the same multiplex. This is theoretically somewhat useful
    when using Live TV to decrease channel switching time. This will
    however only be the case when the next channel is on the same
    multiplex as the current channel. Given that channels are usually
    ordered using Logical Channel Numbers and not on multiplex the
    feature of receiving all PMTs is rather useless and can possibly
    be removed from all the MythTV code.
    
    Fixed handling of special pid value 0x2000 which is used to
    signal that the whole transport stream has to be captured.
    
    Fixes #1292
    
    (cherry picked from commit 55a21cba94124fc7e22161ccd385151d92e5f3fd)

commit 5c144a2522cb72c300a708d79f0613b7dbd63299
Author: Nick Morrott <knowledgejunkie@gmail.com>
Date:   Thu Mar 5 01:45:23 2026 +0000

    Translations: Refresh mythplugins translation binary files [de]

commit c014a325bedba27451eb8da83f61f6856e256f92
Author: Nick Morrott <knowledgejunkie@gmail.com>
Date:   Thu Mar 5 01:44:21 2026 +0000

    Translations: Refresh mythfrontend translation binary file [de]

commit dd1a9b5ffb19fe056b7592dd639219fb8ae36240
Author: Roland Ernst <rcrernst@gmail.com>
Date:   Sun Mar 1 22:21:04 2026 +0100

    Remove German translation literal linefeed (`\n`) in text
    
    e.g.: The file `i18n/mythfrontend_de.ts` has these characters embedded,
    other ts files don't have this.
    Those files are xml files, and a linefeed in xml is either a real
    linefeed (`0xA`) or replaced by `&#xA;`.
    
    The resulting string comparison of a "Schedule Recordings" window
    in MythTV frontend:
    
    Dok 1
    Heute 20:15-21:10\n\"Sparen, Streichen, Schließen - Gemeinde unter
    Druck\"
    
    in opposite to applied patch
    Dok 1
    Heute 20:15-21:10
    "Sparen, Streichen, Schließen - Gemeinde unter Druck"
    
    Note the missing '\n\' sequence.
    
    (cherry picked from commit 794f7a6be2b9ae457cb3fff762a47ffa6bdf3baf)

commit 12f51d7b0727871de8f8ffbdde2095b3a8c7f7ca
Author: Klaas de Waal <klaas@kldo.nl>
Date:   Mon Mar 2 21:48:16 2026 +0100

    Revert "Skip low priority PIDs for SatIP"
    
    This reverts commit b58edb5e890a86019b30f3d4d52ca4ab26fa2028.
    
    Reason is that it breaks multirec on SatIP tuners.

commit b58edb5e890a86019b30f3d4d52ca4ab26fa2028
Author: Klaas de Waal <klaas@kldo.nl>
Date:   Sun Feb 8 15:15:47 2026 +0100

    Skip low priority PIDs for SatIP
    
    Create a PID list without the low priority PIDs. This does leave
    all the PIDs that are needed to receive the requested channel.
    This does fix a problem with the Telestar Digibit SatIP server
    boxes; they cannot handle PID lists with more than 32 PIDs.
    The number of PIDs of a single channel is generally below 32 but
    with all the PMT PIDs of multiplex added the number of PIDs can
    be far more than 32.
    
    The low priority PIDs are used to receive the PMTs of the other
    programs in the same multiplex. This is theoretically somewhat useful
    when using Live TV to decrease channel switching time. This will
    however only be the case when the next channel is on the same
    multiplex as the current channel. Given that channels are usually
    ordered using Logical Channel Numbers and not on multiplex the
    feature of receiving all PMTs is rather useless and can possibly
    be removed from all the MythTV code.
    
    Fixes #1292
    
    (cherry picked from commit c36db4e0dadb6a0807a1b533bba379f02909f950)

commit f3598325d42d552041f66b954225215f7b3a702b
Author: David Hampton <mythtv@love2code.net>
Date:   Sat Feb 14 13:24:09 2026 -0500

    tidy: Fix uninitialized variable warning.
    
    Give the volume the same default value as is passed to GetSetting().
    
    (cherry picked from commit 626463e693f2b48a83baf292d668f01efddaff11)

commit b5d8ffb8fefda1a2b97975db0c34607b76a11c39
Author: Steve Erlenborn <1751095+SteveErl@users.noreply.github.com>
Date:   Thu Feb 12 23:18:58 2026 -0600

    Properly set initial playback volume for PCM Mixer
    
    For PulseAudio, set the initial playback volume
    to PCMMixerVolume when MixerControl is set to PCM.
    
    Resolves #1297
    
    (cherry picked from commit 1aebcc5c9dc81a5865bf512b880fa3deb092281b)

commit 0987a092580121708077ada8aeeab713d7addebf
Author: Klaas de Waal <klaas@kldo.nl>
Date:   Sat Feb 14 21:45:52 2026 +0100

    Parse EXTINF IPTV channel name
    
    Change parsing of the IPTV channel name in an EXTINF record.
    When there is no "tvg-name" field use then the part of the
    line after the last comma.
    Previously the part of the name after the first comma was selected.
    It is still a good idea to write a proper parser.
    
    Refs #1287
    
    (cherry picked from commit 6d0009b6c98d6de4e051ab5bcd3dec1295ece2c1)

commit 45fce7035279533d7fa03f45f311ee72010eb502
Author: Klaas de Waal <klaas@kldo.nl>
Date:   Mon Feb 9 21:38:13 2026 +0100

    Remove priority setting in mythpreviewgen.cpp
    
    If needed, the priority should be set from where the mythpreviewgen
    is started; it should not be hard-coded in the application itself.
    Removing the hard-coded priority setting does also remove
    the error message that appeared when the caller had already set
    the priority to a lower value than the hard-coded value.
    
    Fixes #1296
    
    (cherry picked from commit 87d62a407c9c930b10037dc0eac1aa4ce2420829)

commit 662be785a833bb78c697d73f3f5f3bde277ab744
Author: Nick Morrott <knowledgejunkie@gmail.com>
Date:   Thu Feb 12 21:09:17 2026 +0000

    Translations: Update mythfrontend translation binary files
    
    (cherry picked from commit 6c5753df85fc37ea63135d553b61353c27f01cc3)

commit a1e5ec2f256feb938a15b1944695876e479f54b4
Author: Piotr Oniszczuk <piotr.oniszczuk@gmail.com>
Date:   Thu Feb 12 21:05:12 2026 +0000

    Translations: Update mythfrontend translation source file (Polish)
    
    Signed-off-by: Nick Morrott <knowledgejunkie@gmail.com>
    (cherry picked from commit 94292a877a9f9a7d3025a9f2ed55374e3898cde4)

commit 0bcc85b5906f0bcdd2af0af28b320e24d9e3a65f
Author: Steve Erlenborn <1751095+SteveErl@users.noreply.github.com>
Date:   Tue Jan 27 22:17:34 2026 -0600

    Restrict No window! error log to frontend
    
    MythVideoProfile::InitStatics() gets called for several
    applications, including mythfrontend, mythtranscode,
    mythcommflag, and mythpreviewgen. An error log gets
    generated when the application does not have
    control of the myth main window. However, this only
    makes sense for mythfrontend.
    
    This code change adds a test for the frontend,
    and will only generate the error log message if
    that test is true.
    
    Resolves: #1018
    (cherry picked from commit 28e6ea11c27403467a484a78f3ac0aa5ce33ebc5)
