summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorBartłomiej Piotrowski2018-01-07 18:35:14 +0100
committerBartłomiej Piotrowski2018-01-07 18:35:14 +0100
commita7c0c9ee87f33624da7acb46b265d4c9dd0db477 (patch)
tree7a84e515070c5975c54cc0ad0ebb2923d7be25c1
downloadaur-a7c0c9ee87f33624da7acb46b265d4c9dd0db477.tar.gz
Import from official repositories
-rw-r--r--.SRCINFO66
-rw-r--r--99-mythbackend.rules6
-rw-r--r--PKGBUILD77
-rw-r--r--libcec4.patch551
-rw-r--r--loggingserver.patch11
-rw-r--r--mythbackend.service16
-rw-r--r--mythtv.install21
-rw-r--r--qt510.patch601
8 files changed, 1349 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO
new file mode 100644
index 000000000000..97eba96db391
--- /dev/null
+++ b/.SRCINFO
@@ -0,0 +1,66 @@
+pkgbase = mythtv
+ pkgdesc = A Homebrew PVR project
+ pkgver = 29.0
+ pkgrel = 5
+ epoch = 1
+ url = http://www.mythtv.org/
+ install = mythtv.install
+ arch = x86_64
+ license = GPL
+ makedepends = glew
+ makedepends = libcec
+ makedepends = libxml2
+ makedepends = mesa
+ makedepends = mesa-libgl
+ makedepends = openssl
+ makedepends = yasm
+ makedepends = x264
+ makedepends = gdb
+ depends = avahi
+ depends = fftw
+ depends = lame
+ depends = libass
+ depends = libavc1394
+ depends = libcdio
+ depends = libiec61883
+ depends = libgl
+ depends = libpulse
+ depends = libva
+ depends = libvpx
+ depends = libxinerama
+ depends = lirc
+ depends = mariadb-clients
+ depends = mysql-python
+ depends = perl-dbd-mysql
+ depends = perl-io-socket-inet6
+ depends = perl-libwww
+ depends = perl-net-upnp
+ depends = python2-lxml
+ depends = qt5-webkit
+ depends = qt5-script
+ depends = taglib
+ depends = urlgrabber
+ depends = libx264
+ depends = libvdpau
+ depends = exiv2
+ depends = libxrandr
+ depends = jack
+ optdepends = glew: for GPU commercial flagging
+ optdepends = libcec: for consumer electronics control capabilities
+ optdepends = libxml2: to read blu-ray metadata
+ optdepends = openssl: for AirTunes (RAOP) support
+ conflicts = myththemes
+ conflicts = mythplugins-mythvideo
+ replaces = myththemes
+ replaces = mythplugins-mythvideo
+ source = mythtv-29.0.tar.gz::https://github.com/MythTV/mythtv/archive/v29.0.tar.gz
+ source = mythbackend.service
+ source = 99-mythbackend.rules
+ source = qt510.patch
+ sha512sums = 6d79d943b95b1816b4fce52f3de3e01ebcdcc2779f852ec8cf5e3a81f8be4c730a254ff78b52e36ac522ff99b125501f0cba33a2d4c01571552e09fb4dba18c2
+ sha512sums = 41533da5d8ef694d8c12f60d956673d9e49fb6781ae58d6bfd0bf31e4f380fddb508f9cad3b91264a3ad55853c24c6932bdf83bb5b711c34c0836d71b46be02c
+ sha512sums = fc02c190f01dbfb803b87ea0a6cdf408ce7706dc1ed74fba939931c129fdeb5dab1105caf9f71f029843a4d74db888084f92173c3be240d8492454633311f7c8
+ sha512sums = 5070b4e8ad5ebd4208a3e8393ebabb55118615c2966cb1ba585e94084c4ad643dc5644bfca9267eb81e6c27be16b088e541aa8118a43cbebaf9d28c52e15a35c
+
+pkgname = mythtv
+
diff --git a/99-mythbackend.rules b/99-mythbackend.rules
new file mode 100644
index 000000000000..0c7cb1b59110
--- /dev/null
+++ b/99-mythbackend.rules
@@ -0,0 +1,6 @@
+#
+# Create systemd device units for capture devices
+#
+SUBSYSTEM=="video4linux", TAG+="systemd"
+SUBSYSTEM=="dvb", TAG+="systemd"
+SUBSYSTEM=="firewire", TAG+="systemd"
diff --git a/PKGBUILD b/PKGBUILD
new file mode 100644
index 000000000000..ddec3d0ad8ac
--- /dev/null
+++ b/PKGBUILD
@@ -0,0 +1,77 @@
+# $Id: PKGBUILD 277487 2017-12-30 21:51:59Z alucryd $
+# Maintainer: Jonathan Conder <jonno.conder@gmail.com>
+# Contributor: Giovanni Scafora <giovanni@archlinux.org>
+# Contributor: Juergen Hoetzel <juergen@archlinux.org>
+# Contributor: <kleptophobiac@gmail.com>
+# Contributor: dorphell <dorphell@archlinux.org>
+
+pkgname=mythtv
+pkgver=29.0
+pkgrel=5
+epoch=1
+pkgdesc="A Homebrew PVR project"
+arch=('x86_64')
+url="http://www.mythtv.org/"
+license=('GPL')
+depends=('avahi' 'fftw' 'lame' 'libass' 'libavc1394' 'libcdio' 'libiec61883'
+ 'libgl' 'libpulse' 'libva' 'libvpx' 'libxinerama' 'lirc' 'mariadb-clients'
+ 'mysql-python' 'perl-dbd-mysql' 'perl-io-socket-inet6' 'perl-libwww'
+ 'perl-net-upnp' 'python2-lxml' 'qt5-webkit' 'qt5-script' 'taglib' 'urlgrabber'
+ 'libx264' 'libvdpau' 'exiv2' 'libxrandr' 'jack')
+makedepends=('glew' 'libcec' 'libxml2' 'mesa' 'mesa-libgl' 'openssl' 'yasm' 'x264' 'gdb')
+optdepends=('glew: for GPU commercial flagging'
+ 'libcec: for consumer electronics control capabilities'
+ 'libxml2: to read blu-ray metadata'
+ 'openssl: for AirTunes (RAOP) support')
+conflicts=('myththemes' 'mythplugins-mythvideo')
+replaces=('myththemes' 'mythplugins-mythvideo')
+install='mythtv.install'
+source=("$pkgname-$pkgver.tar.gz::https://github.com/MythTV/$pkgname/archive/v$pkgver.tar.gz"
+ 'mythbackend.service' '99-mythbackend.rules' 'qt510.patch')
+sha512sums=('6d79d943b95b1816b4fce52f3de3e01ebcdcc2779f852ec8cf5e3a81f8be4c730a254ff78b52e36ac522ff99b125501f0cba33a2d4c01571552e09fb4dba18c2'
+ '41533da5d8ef694d8c12f60d956673d9e49fb6781ae58d6bfd0bf31e4f380fddb508f9cad3b91264a3ad55853c24c6932bdf83bb5b711c34c0836d71b46be02c'
+ 'fc02c190f01dbfb803b87ea0a6cdf408ce7706dc1ed74fba939931c129fdeb5dab1105caf9f71f029843a4d74db888084f92173c3be240d8492454633311f7c8'
+ '5070b4e8ad5ebd4208a3e8393ebabb55118615c2966cb1ba585e94084c4ad643dc5644bfca9267eb81e6c27be16b088e541aa8118a43cbebaf9d28c52e15a35c')
+
+prepare() {
+ cd $pkgname-$pkgver/$pkgname
+
+ patch -Np2 -i ../../qt510.patch
+
+ find 'bindings/python' 'contrib' 'programs/scripts' -type f | xargs sed -i 's@^#!.*python$@#!/usr/bin/python2@'
+}
+
+build() {
+ cd $pkgname-$pkgver/$pkgname
+
+ ARCH="${CARCH/_/-}"
+ ./configure --prefix=/usr \
+ --cpu="$ARCH" \
+ --disable-altivec \
+ --disable-audio-jack \
+ --disable-ccache \
+ --disable-distcc \
+ --enable-libfftw3 \
+ --enable-libmp3lame \
+ --enable-libvpx \
+ --enable-libx264 \
+ --enable-vaapi \
+ --python=python2 \
+ --perl-config-opts=INSTALLDIRS=vendor
+ make
+}
+
+package() {
+ cd $pkgname-$pkgver/$pkgname
+ make INSTALL_ROOT="$pkgdir" install
+
+ install -D -m644 "$srcdir/mythbackend.service" "$pkgdir/usr/lib/systemd/system/mythbackend.service"
+ install -D -m644 'database/mc.sql' "$pkgdir/usr/share/mythtv/mc.sql"
+
+ mkdir -p "$pkgdir/usr/share/mythtv"
+ cp -R 'contrib' "$pkgdir/usr/share/mythtv"
+ mkdir -p "$pkgdir/var/log/mythtv"
+
+# Install udev rules https://www.mythtv.org/wiki/Systemd_mythbackend_Configuration#Delay_starting_the_backend_until_tuners_have_initialized
+ install -Dm644 "$srcdir"/99-mythbackend.rules "$pkgdir"/usr/lib/udev/rules.d/99-mythbackend.rules
+}
diff --git a/libcec4.patch b/libcec4.patch
new file mode 100644
index 000000000000..93fa165cae39
--- /dev/null
+++ b/libcec4.patch
@@ -0,0 +1,551 @@
+diff --git a/mythtv/libs/libmythui/cecadapter.cpp b/mythtv/libs/libmythui/cecadapter.cpp
+index 00a8c73..06a8f3d 100644
+--- a/mythtv/libs/libmythui/cecadapter.cpp
++++ b/mythtv/libs/libmythui/cecadapter.cpp
+@@ -33,17 +33,31 @@ QWaitCondition* CECAdapter::gActionsReady = new QWaitCondition();
+ // libcec1's callback parameters are pass-by-ref
+ #define CEC_CALLBACK_PARAM_TYPE &
+ #else
+-// libcec2's callback parameters are pass-by-value
++#if CEC_LIB_VERSION_MAJOR <= 3
++// libcec2 and 3 callback parameters are pass-by-value
+ #define CEC_CALLBACK_PARAM_TYPE
+ #endif
++#endif
+
+ // The libCEC callback functions
++#if CEC_LIB_VERSION_MAJOR <= 3
+ static int CECLogMessageCallback(void *adapter, const cec_log_message CEC_CALLBACK_PARAM_TYPE message);
+ static int CECKeyPressCallback(void *adapter, const cec_keypress CEC_CALLBACK_PARAM_TYPE keypress);
+ static int CECCommandCallback(void *adapter, const cec_command CEC_CALLBACK_PARAM_TYPE command);
++#endif
++#if CEC_LIB_VERSION_MAJOR >= 4
++static void CECLogMessageCallback(void *adapter, const cec_log_message* message);
++static void CECKeyPressCallback(void *adapter, const cec_keypress* keypress);
++static void CECCommandCallback(void *adapter, const cec_command* command);
++#endif
+
+ #if CEC_LIB_VERSION_MAJOR >= 2
++#if CEC_LIB_VERSION_MAJOR <= 3
+ static int CECAlertCallback(void *adapter, const libcec_alert alert, const libcec_parameter CEC_CALLBACK_PARAM_TYPE data);
++#endif
++#if CEC_LIB_VERSION_MAJOR >= 4
++static void CECAlertCallback(void *adapter, const libcec_alert alert, const libcec_parameter data);
++#endif
+ static void CECSourceActivatedCallback(void *adapter, const cec_logical_address address, const uint8_t activated);
+ #endif
+
+@@ -107,13 +121,24 @@ class CECAdapterPriv
+ }
+
+ // Set up the callbacks
++#if CEC_LIB_VERSION_MAJOR <= 3
+ callbacks.CBCecLogMessage = &CECLogMessageCallback;
+ callbacks.CBCecKeyPress = &CECKeyPressCallback;
+ callbacks.CBCecCommand = &CECCommandCallback;
+-#if CEC_LIB_VERSION_MAJOR >= 2
++#endif
++#if CEC_LIB_VERSION_MAJOR >= 4
++ callbacks.logMessage = &CECLogMessageCallback;
++ callbacks.keyPress = &CECKeyPressCallback;
++ callbacks.commandReceived = &CECCommandCallback;
++#endif
++#if CEC_LIB_VERSION_MAJOR >= 2 && CEC_LIB_VERSION_MAJOR <= 3
+ callbacks.CBCecAlert = &CECAlertCallback;
+ callbacks.CBCecSourceActivated = &CECSourceActivatedCallback;
+ #endif
++#if CEC_LIB_VERSION_MAJOR >= 4
++ callbacks.alert = &CECAlertCallback;
++ callbacks.sourceActivated = &CECSourceActivatedCallback;
++#endif
+ configuration.callbackParam = this;
+ configuration.callbacks = &callbacks;
+
+@@ -127,8 +152,13 @@ class CECAdapterPriv
+ }
+
+ // find adapters
++#if CEC_LIB_VERSION_MAJOR >= 4
++ cec_adapter_descriptor *devices = new cec_adapter_descriptor[MAX_CEC_DEVICES];
++ uint8_t num_devices = adapter->DetectAdapters(devices, MAX_CEC_DEVICES, NULL, true);
++#else
+ cec_adapter *devices = new cec_adapter[MAX_CEC_DEVICES];
+ uint8_t num_devices = adapter->FindAdapters(devices, MAX_CEC_DEVICES, NULL);
++#endif
+ if (num_devices < 1)
+ {
+ LOG(VB_GENERAL, LOG_ERR, LOC + "Failed to find any CEC devices.");
+@@ -143,22 +173,37 @@ class CECAdapterPriv
+ .arg(num_devices));
+ for (uint8_t i = 0; i < num_devices; i++)
+ {
++#if CEC_LIB_VERSION_MAJOR >= 4
++ QString comm = QString::fromLatin1(devices[i].strComName);
++ QString path = QString::fromLatin1(devices[i].strComPath);
++#else
+ QString comm = QString::fromLatin1(devices[i].comm);
++ QString path = QString::fromLatin1(devices[i].path);
++#endif
+ bool match = find ? (comm == defaultDevice) : (i == 0);
+ devicenum = match ? i : devicenum;
+ LOG(VB_GENERAL, LOG_INFO, LOC +
+ QString("Device %1: path '%2' com port '%3' %4").arg(i + 1)
+- .arg(QString::fromLatin1(devices[i].path)).arg(comm)
++ .arg(path).arg(comm)
+ .arg(match ? "SELECTED" : ""));
+ }
+
+ // open adapter
+- QString path = QString::fromLatin1(devices[devicenum].path);
++#if CEC_LIB_VERSION_MAJOR >= 4
++ QString comm = QString::fromLatin1(devices[devicenum].strComName);
++ QString path = QString::fromLatin1(devices[devicenum].strComPath);
++#else
+ QString comm = QString::fromLatin1(devices[devicenum].comm);
++ QString path = QString::fromLatin1(devices[devicenum].path);
++#endif
+ LOG(VB_GENERAL, LOG_INFO, LOC + QString("Trying to open device %1 (%2).")
+ .arg(path).arg(comm));
+
++#if CEC_LIB_VERSION_MAJOR >= 4
++ if (!adapter->Open(devices[devicenum].strComName))
++#else
+ if (!adapter->Open(devices[devicenum].comm))
++#endif
+ {
+ LOG(VB_GENERAL, LOG_ERR, LOC + "Failed to open device.");
+ return false;
+@@ -213,6 +258,20 @@ class CECAdapterPriv
+ return 1;
+ }
+
++ void LogMessage(const cec_log_message* message)
++ {
++ QString msg(message->message);
++ int lvl = LOG_UNKNOWN;
++ switch (message->level)
++ {
++ case CEC_LOG_ERROR: lvl = LOG_ERR; break;
++ case CEC_LOG_WARNING: lvl = LOG_WARNING; break;
++ case CEC_LOG_NOTICE: lvl = LOG_INFO; break;
++ case CEC_LOG_DEBUG: lvl = LOG_DEBUG; break;
++ }
++ LOG(VB_GENERAL, lvl, LOC + QString("%1").arg(msg));
++ }
++
+ // NOTE - libcec2 changes the callbacks
+ // to be pass-by-value.
+ // For simplicity, this function remains as pass-by-ref
+@@ -241,6 +300,29 @@ class CECAdapterPriv
+ return 1;
+ }
+
++ void HandleCommand(const cec_command* command)
++ {
++ if (!adapter || !valid)
++ return;
++
++ LOG(VB_GENERAL, LOG_DEBUG, LOC +
++ QString("Command %1 from '%2' (%3) - destination '%4' (%5)")
++ .arg(command->opcode)
++ .arg(adapter->ToString(command->initiator))
++ .arg(command->initiator)
++ .arg(adapter->ToString(command->destination))
++ .arg(command->destination));
++
++ switch (command->opcode)
++ {
++ // TODO
++ default:
++ break;
++ }
++ gCoreContext->SendSystemEvent(QString("CEC_COMMAND_RECEIVED COMMAND %1")
++ .arg(command->opcode));
++ }
++
+ int HandleKeyPress(const cec_keypress &key)
+ {
+ if (!adapter || !valid)
+@@ -572,6 +654,335 @@ class CECAdapterPriv
+ return 1;
+ }
+
++ void HandleKeyPress(const cec_keypress* key)
++ {
++ if (!adapter || !valid)
++ return;
++
++ // Ignore key down events and wait for the key 'up'
++ if (key->duration < 1)
++ return;
++
++ QString code;
++ int action = 0;
++ switch (key->keycode)
++ {
++ case CEC_USER_CONTROL_CODE_NUMBER0:
++ action = Qt::Key_0;
++ code = "0";
++ break;
++ case CEC_USER_CONTROL_CODE_NUMBER1:
++ action = Qt::Key_1;
++ code = "1";
++ break;
++ case CEC_USER_CONTROL_CODE_NUMBER2:
++ action = Qt::Key_2;
++ code = "2";
++ break;
++ case CEC_USER_CONTROL_CODE_NUMBER3:
++ action = Qt::Key_3;
++ code = "3";
++ break;
++ case CEC_USER_CONTROL_CODE_NUMBER4:
++ action = Qt::Key_4;
++ code = "4";
++ break;
++ case CEC_USER_CONTROL_CODE_NUMBER5:
++ action = Qt::Key_5;
++ code = "5";
++ break;
++ case CEC_USER_CONTROL_CODE_NUMBER6:
++ action = Qt::Key_6;
++ code = "6";
++ break;
++ case CEC_USER_CONTROL_CODE_NUMBER7:
++ action = Qt::Key_7;
++ code = "7";
++ break;
++ case CEC_USER_CONTROL_CODE_NUMBER8:
++ action = Qt::Key_8;
++ code = "8";
++ break;
++ case CEC_USER_CONTROL_CODE_NUMBER9:
++ action = Qt::Key_9;
++ code = "9";
++ break;
++ case CEC_USER_CONTROL_CODE_SELECT:
++ action = Qt::Key_Select;
++ code = "SELECT";
++ break;
++ case CEC_USER_CONTROL_CODE_ENTER:
++ action = Qt::Key_Enter;
++ code = "ENTER";
++ break;
++ case CEC_USER_CONTROL_CODE_UP:
++ action = Qt::Key_Up;
++ code = "UP";
++ break;
++ case CEC_USER_CONTROL_CODE_DOWN:
++ action = Qt::Key_Down;
++ code = "DOWN";
++ break;
++ case CEC_USER_CONTROL_CODE_LEFT:
++ action = Qt::Key_Left;
++ code = "LEFT";
++ break;
++ case CEC_USER_CONTROL_CODE_LEFT_UP:
++ action = Qt::Key_Left;
++ code = "LEFT_UP";
++ break;
++ case CEC_USER_CONTROL_CODE_LEFT_DOWN:
++ action = Qt::Key_Left;
++ code = "LEFT_DOWN";
++ break;
++ case CEC_USER_CONTROL_CODE_RIGHT:
++ action = Qt::Key_Right;
++ code = "RIGHT";
++ break;
++ case CEC_USER_CONTROL_CODE_RIGHT_UP:
++ action = Qt::Key_Right;
++ code = "RIGHT_UP";
++ break;
++ case CEC_USER_CONTROL_CODE_RIGHT_DOWN:
++ action = Qt::Key_Right;
++ code = "RIGHT_DOWN";
++ break;
++ case CEC_USER_CONTROL_CODE_ROOT_MENU:
++ action = Qt::Key_M;
++ code = "ROOT_MENU";
++ break;
++ case CEC_USER_CONTROL_CODE_EXIT:
++ action = Qt::Key_Escape;
++ code = "EXIT";
++ break;
++ case CEC_USER_CONTROL_CODE_PREVIOUS_CHANNEL:
++ action = Qt::Key_H;
++ code = "PREVIOUS_CHANNEL";
++ break;
++ case CEC_USER_CONTROL_CODE_SOUND_SELECT:
++ action = Qt::Key_Plus;
++ code = "SOUND_SELECT";
++ break;
++ case CEC_USER_CONTROL_CODE_VOLUME_UP:
++ action = Qt::Key_VolumeUp;
++ code = "VOLUME_UP";
++ break;
++ case CEC_USER_CONTROL_CODE_VOLUME_DOWN:
++ action = Qt::Key_VolumeDown;
++ code = "VOLUME_DOWN";
++ break;
++ case CEC_USER_CONTROL_CODE_MUTE:
++ action = Qt::Key_VolumeMute;
++ code = "MUTE";
++ break;
++ case CEC_USER_CONTROL_CODE_PLAY:
++ action = Qt::Key_P;
++ code = "PLAY";
++ break;
++ case CEC_USER_CONTROL_CODE_PAUSE:
++ action = Qt::Key_P; // same as play
++ code = "PAUSE";
++ break;
++ case CEC_USER_CONTROL_CODE_STOP:
++ action = Qt::Key_Stop;
++ code = "STOP";
++ break;
++ case CEC_USER_CONTROL_CODE_RECORD:
++ action = Qt::Key_R;
++ code = "RECORD";
++ break;
++ case CEC_USER_CONTROL_CODE_CLEAR:
++ action = Qt::Key_Clear;
++ code = "CLEAR";
++ break;
++ case CEC_USER_CONTROL_CODE_DISPLAY_INFORMATION:
++ action = Qt::Key_I;
++ code = "DISPLAY_INFORMATION";
++ break;
++ case CEC_USER_CONTROL_CODE_PAGE_UP:
++ action = Qt::Key_PageUp;
++ code = "PAGE_UP";
++ break;
++ case CEC_USER_CONTROL_CODE_PAGE_DOWN:
++ action = Qt::Key_PageDown;
++ code = "PAGE_DOWN";
++ break;
++ case CEC_USER_CONTROL_CODE_EJECT:
++ action = Qt::Key_Eject;
++ code = "EJECT";
++ break;
++ case CEC_USER_CONTROL_CODE_FORWARD:
++ action = Qt::Key_Forward;
++ code = "FORWARD";
++ break;
++ case CEC_USER_CONTROL_CODE_BACKWARD:
++ action = Qt::Key_Back;
++ code = "BACKWARD";
++ break;
++ case CEC_USER_CONTROL_CODE_F1_BLUE:
++ action = Qt::Key_F5; // NB F1 is help and we normally map blue to F5
++ code = "F1_BLUE";
++ break;
++ case CEC_USER_CONTROL_CODE_F2_RED:
++ action = Qt::Key_F2;
++ code = "F2_RED";
++ break;
++ case CEC_USER_CONTROL_CODE_F3_GREEN:
++ action = Qt::Key_F3;
++ code = "F3_GREEN";
++ break;
++ case CEC_USER_CONTROL_CODE_F4_YELLOW:
++ action = Qt::Key_F4;
++ code = "F4_YELLOW";
++ break;
++ case CEC_USER_CONTROL_CODE_SETUP_MENU:
++ action = Qt::Key_M; // Duplicate of Root Menu
++ code = "SETUP_MENU";
++ break;
++ case CEC_USER_CONTROL_CODE_CONTENTS_MENU:
++ action = Qt::Key_M; // Duplicate of Root Menu
++ code = "CONTENTS_MENU";
++ break;
++ case CEC_USER_CONTROL_CODE_FAVORITE_MENU:
++ action = Qt::Key_M; // Duplicate of Root Menu
++ code = "FAVORITE_MENU";
++ break;
++ case CEC_USER_CONTROL_CODE_DOT:
++ action = Qt::Key_Period;
++ code = "DOT";
++ break;
++ case CEC_USER_CONTROL_CODE_NEXT_FAVORITE:
++ action = Qt::Key_Slash;
++ code = "NEXT_FAVORITE";
++ break;
++ case CEC_USER_CONTROL_CODE_INPUT_SELECT:
++ action = Qt::Key_C;
++ code = "INPUT_SELECT";
++ break;
++ case CEC_USER_CONTROL_CODE_HELP:
++ action = Qt::Key_F1;
++ code = "HELP";
++ break;
++ case CEC_USER_CONTROL_CODE_STOP_RECORD:
++ action = Qt::Key_R; // Duplicate of Record
++ code = "STOP_RECORD";
++ break;
++ case CEC_USER_CONTROL_CODE_SUB_PICTURE:
++ action = Qt::Key_V;
++ code = "SUB_PICTURE";
++ break;
++ case CEC_USER_CONTROL_CODE_ELECTRONIC_PROGRAM_GUIDE:
++ action = Qt::Key_S;
++ code = "ELECTRONIC_PROGRAM_GUIDE";
++ break;
++ case CEC_USER_CONTROL_CODE_POWER:
++ action = Qt::Key_PowerOff;
++ code = "POWER";
++ break;
++
++ // these codes have 'non-standard' Qt key mappings to ensure
++ // each code has a unique key mapping
++ case CEC_USER_CONTROL_CODE_CHANNEL_DOWN:
++ action = Qt::Key_F20; // to differentiate from Up
++ code = "CHANNEL_DOWN";
++ break;
++ case CEC_USER_CONTROL_CODE_CHANNEL_UP:
++ action = Qt::Key_F21; // to differentiate from Down
++ code = "CHANNEL_UP";
++ break;
++ case CEC_USER_CONTROL_CODE_REWIND:
++ action = Qt::Key_F22; // to differentiate from Left
++ code = "REWIND";
++ break;
++ case CEC_USER_CONTROL_CODE_FAST_FORWARD:
++ action = Qt::Key_F23; // to differentiate from Right
++ code = "FAST_FORWARD";
++ break;
++ case CEC_USER_CONTROL_CODE_ANGLE:
++ action = Qt::Key_F24;
++ code = "ANGLE";
++ break;
++ case CEC_USER_CONTROL_CODE_F5:
++ action = Qt::Key_F6; // NB!
++ code = "F5";
++ break;
++
++ // codes with no obvious MythTV action
++ case CEC_USER_CONTROL_CODE_INITIAL_CONFIGURATION:
++ code = "INITIAL_CONFIGURATION";
++ break;
++ case CEC_USER_CONTROL_CODE_PAUSE_RECORD:
++ code = "PAUSE_RECORD";
++ break;
++ case CEC_USER_CONTROL_CODE_VIDEO_ON_DEMAND:
++ code = "VIDEO_ON_DEMAND";
++ break;
++ case CEC_USER_CONTROL_CODE_TIMER_PROGRAMMING:
++ code = "TIMER_PROGRAMMING";
++ break;
++ case CEC_USER_CONTROL_CODE_UNKNOWN:
++ code = "UNKNOWN";
++ break;
++ case CEC_USER_CONTROL_CODE_DATA:
++ code = "DATA";
++ break;
++
++ // Functions aren't implemented (similar to macros?)
++ case CEC_USER_CONTROL_CODE_POWER_ON_FUNCTION:
++ code = "POWER_ON_FUNCTION";
++ break;
++ case CEC_USER_CONTROL_CODE_PLAY_FUNCTION:
++ code = "PLAY_FUNCTION";
++ break;
++ case CEC_USER_CONTROL_CODE_PAUSE_PLAY_FUNCTION:
++ code = "PAUSE_PLAY_FUNCTION";
++ break;
++ case CEC_USER_CONTROL_CODE_RECORD_FUNCTION:
++ code = "RECORD_FUNCTION";
++ break;
++ case CEC_USER_CONTROL_CODE_PAUSE_RECORD_FUNCTION:
++ code = "PAUSE_RECORD_FUNCTION";
++ break;
++ case CEC_USER_CONTROL_CODE_STOP_FUNCTION:
++ code = "STOP_FUNCTION";
++ break;
++ case CEC_USER_CONTROL_CODE_MUTE_FUNCTION:
++ code = "MUTE_FUNCTION";
++ break;
++ case CEC_USER_CONTROL_CODE_RESTORE_VOLUME_FUNCTION:
++ code = "RESTORE_VOLUME_FUNCTION";
++ break;
++ case CEC_USER_CONTROL_CODE_TUNE_FUNCTION:
++ code = "TUNE_FUNCTION";
++ break;
++ case CEC_USER_CONTROL_CODE_SELECT_MEDIA_FUNCTION:
++ code = "SELECT_MEDIA_FUNCTION";
++ break;
++ case CEC_USER_CONTROL_CODE_SELECT_AV_INPUT_FUNCTION:
++ code = "SELECT_AV_INPUT_FUNCTION";
++ break;
++ case CEC_USER_CONTROL_CODE_SELECT_AUDIO_INPUT_FUNCTION:
++ code = "SELECT_AUDIO_INPUT_FUNCTION";
++ break;
++ case CEC_USER_CONTROL_CODE_POWER_TOGGLE_FUNCTION:
++ code = "POWER_TOGGLE_FUNCTION";
++ break;
++ case CEC_USER_CONTROL_CODE_POWER_OFF_FUNCTION:
++ code = "POWER_OFF_FUNCTION";
++ break;
++ }
++
++ LOG(VB_GENERAL, LOG_DEBUG, LOC + QString("Keypress %1 %2")
++ .arg(code).arg(0 == action ? "(Not actioned)" : ""));
++
++ if (0 == action)
++ return;
++
++ GetMythUI()->ResetScreensaver();
++ QKeyEvent* ke = new QKeyEvent(QEvent::KeyPress, action, Qt::NoModifier);
++ qApp->postEvent(GetMythMainWindow(), (QEvent*)ke);
++ }
++
+ #if CEC_LIB_VERSION_MAJOR >= 2
+ int HandleAlert(const libcec_alert alert, const libcec_parameter &data)
+ {
+@@ -764,6 +1175,7 @@ void CECAdapter::Action(const QString &action)
+ gActionsReady->wakeAll();
+ }
+
++#if CEC_LIB_VERSION_MAJOR <= 3
+ static int CECLogMessageCallback(void *adapter, const cec_log_message CEC_CALLBACK_PARAM_TYPE message)
+ {
+ return ((CECAdapterPriv*)adapter)->LogMessage(message);
+@@ -778,13 +1190,37 @@ static int CECCommandCallback(void *adapter, const cec_command CEC_CALLBACK_PARA
+ {
+ return ((CECAdapterPriv*)adapter)->HandleCommand(command);
+ }
++#endif
++#if CEC_LIB_VERSION_MAJOR >= 4
++static void CECLogMessageCallback(void *adapter, const cec_log_message* message)
++{
++ ((CECAdapterPriv*)adapter)->LogMessage(message);
++}
++
++static void CECKeyPressCallback(void *adapter, const cec_keypress* keypress)
++{
++ ((CECAdapterPriv*)adapter)->HandleKeyPress(keypress);
++}
++
++static void CECCommandCallback(void *adapter, const cec_command* command)
++{
++ ((CECAdapterPriv*)adapter)->HandleCommand(command);
++}
++#endif
+
+ #if CEC_LIB_VERSION_MAJOR >= 2
++#if CEC_LIB_VERSION_MAJOR <= 3
+ static int CECAlertCallback(void *adapter, const libcec_alert alert, const libcec_parameter CEC_CALLBACK_PARAM_TYPE data)
+ {
+ return ((CECAdapterPriv*)adapter)->HandleAlert(alert, data);
+ }
+-
++#endif
++#if CEC_LIB_VERSION_MAJOR >= 4
++static void CECAlertCallback(void *adapter, const libcec_alert alert, const libcec_parameter data)
++{
++ ((CECAdapterPriv*)adapter)->HandleAlert(alert, data);
++}
++#endif
+ static void CECSourceActivatedCallback(void *adapter, const cec_logical_address address, const uint8_t activated)
+ {
+ ((CECAdapterPriv*)adapter)->HandleSourceActivated(address, activated);
diff --git a/loggingserver.patch b/loggingserver.patch
new file mode 100644
index 000000000000..7ec37626e3c0
--- /dev/null
+++ b/loggingserver.patch
@@ -0,0 +1,11 @@
+--- a/mythtv/libs/libmythbase/loggingserver.cpp 2017-02-13 21:15:14.150339977 +0100
++++ b/mythtv/libs/libmythbase/loggingserver.cpp 2017-02-13 21:15:08.738490693 +0100
+@@ -722,7 +722,7 @@
+ if (!item)
+ continue;
+
+- if (item->message()[0] != '\0')
++ if (item->message()[0] != QChar('\0'))
+ {
+ qLock.unlock();
+ bool logged = m_logger->logqmsg(*query, item);
diff --git a/mythbackend.service b/mythbackend.service
new file mode 100644
index 000000000000..2adbc3d07d2b
--- /dev/null
+++ b/mythbackend.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=MythTV Backend
+Wants=network-online.target
+After=network.target mysqld.service
+
+[Service]
+Type=simple
+Environment=HOME=/var/lib/mythtv
+User=mythtv
+ExecStart=/usr/bin/mythbackend --logpath /var/log/mythtv
+ExecStop=/usr/bin/mythshutdown --setscheduledwakeup
+#ExecStop=/usr/bin/mythshutdown --shutdown
+Restart=on-failure
+
+[Install]
+WantedBy=multi-user.target
diff --git a/mythtv.install b/mythtv.install
new file mode 100644
index 000000000000..9cc74a40b04f
--- /dev/null
+++ b/mythtv.install
@@ -0,0 +1,21 @@
+post_upgrade() {
+ if ! getent passwd mythtv &>/dev/null; then
+ getent group mythtv &>/dev/null || groupadd -r mythtv >/dev/null
+ useradd -rmd /var/lib/mythtv -g mythtv -G video,audio,optical -s /bin/bash mythtv >/dev/null
+ chmod 755 "$pkgdir/var/lib/mythtv"
+ fi
+
+ echo -e "You may need to load time zone tables in MySQL.\nSee http://www.mythtv.org/wiki/MySQL_Time_Zone_Tables"
+}
+
+post_install() {
+ echo -e "For installation information, visit:\nhttps://wiki.archlinux.org/index.php/MythTV"
+
+ post_upgrade
+}
+
+post_remove() {
+ echo -e "The MythTV database was not removed. To remove it, run:\n mysql -u root -e 'drop database mythconverg;'"
+ [ -d var/lib/mythtv ] && echo "The MythTV home directory /var/lib/mythtv can also be removed."
+ echo -e "The 'mythtv' user and group can also be removed."
+}
diff --git a/qt510.patch b/qt510.patch
new file mode 100644
index 000000000000..89c1e3201150
--- /dev/null
+++ b/qt510.patch
@@ -0,0 +1,601 @@
+diff --git a/mythtv/configure b/mythtv/configure
+index 8b7ba2ed6f..32fbe2bf60 100755
+--- a/mythtv/configure
++++ b/mythtv/configure
+@@ -6099,21 +6099,26 @@ enable_weak_pic() {
+
+ enabled pic && enable_weak_pic
+
+-is_qmake5(){
+- $1 --version 2>&1 | egrep -q -e "Qt version 5\.[2-9]\.[0-9]"
++version2string(){
++ # accepts version as in 1.10.4 and turns it into 0001.0010.0004.0000.0000 which can be compared as a string
++ echo $1 | awk -F. '{ printf("%04d.%04d.%04d.%04d.%04d", $1, $2, $3, $4, $5); };'
+ }
+
++# Minimum supported Qt version
++qt_minimum_version="5.2"
++
+ # qmake-qt5 /usr/lib64/qt5/bin/qmake /usr/lib/x86_64-linux-gnu/qt5/bin/qmake
+ if [ x"$qmake" = "xqmake" ]; then
+- CHECK_QMAKE=`which qmake-qt5 2>&1`" /usr/lib64/qt5/bin/qmake /usr/lib/x86_64-linux-gnu/qt5/bin/qmake /usr/lib/i386-linux-gnu/qt5/bin/qmake /usr/lib/arm-linux-gnueabihf/qt5/bin/qmake /usr/local/lib/qt5/bin/qmake `which $qmake 2>&1`"
++ CHECK_QMAKE=`which -a qmake-qt5 2>/dev/null`" /usr/lib64/qt5/bin/qmake /usr/lib/x86_64-linux-gnu/qt5/bin/qmake /usr/lib/i386-linux-gnu/qt5/bin/qmake /usr/lib/arm-linux-gnueabihf/qt5/bin/qmake /usr/local/lib/qt5/bin/qmake `which -a $qmake 2>/dev/null`"
+ else
+- CHECK_QMAKE=`which $qmake 2>&1`" "`which qmake-qt5 2>&1`" /usr/lib64/qt5/bin/qmake /usr/lib/x86_64-linux-gnu/qt5/bin/qmake /usr/lib/i386-linux-gnu/qt5/bin/qmake /usr/lib/arm-linux-gnueabihf/qt5/bin/qmake /usr/local/lib/qt5/bin/qmake"
++ CHECK_QMAKE=`which -a $qmake 2>/dev/null`" "`which -a qmake-qt5 2>/dev/null`" /usr/lib64/qt5/bin/qmake /usr/lib/x86_64-linux-gnu/qt5/bin/qmake /usr/lib/i386-linux-gnu/qt5/bin/qmake /usr/lib/arm-linux-gnueabihf/qt5/bin/qmake /usr/local/lib/qt5/bin/qmake"
+ fi
+ # try to find a qt5 qmake to use
+ found_qmake=''
+ for i in $CHECK_QMAKE; do
+ if test -e $i ; then
+- if is_qmake5 $i; then
++ qmake_version=`$i --version | sed -n "s/.*Qt version \([0-9]*\.[0-9]*\.[0-9]*\) .*/\1/p"`
++ if ! [ $(version2string $qmake_version) \< $(version2string $qt_minimum_version) ]; then
+ found_qmake=$i
+ check_cxxflags -DQT_DISABLE_DEPRECATED_BEFORE=0x050000
+ break;
+@@ -6124,7 +6129,7 @@ for i in $CHECK_QMAKE; do
+ fi
+ done
+ if [ x"$found_qmake" = "x" ]; then
+- die "qmake for Qt5.2 or newer not found.\nPlease specify the correct qmake with --qmake="
++ die "qmake for Qt version $qt_minimum_version or newer not found. Please specify the correct qmake with --qmake="
+ else
+ qmake=$found_qmake
+ fi
+diff --git a/mythtv/libs/libmyth/libmyth.pro b/mythtv/libs/libmyth/libmyth.pro
+index 24ec735b18..1fd5cc01c0 100644
+--- a/mythtv/libs/libmyth/libmyth.pro
++++ b/mythtv/libs/libmyth/libmyth.pro
+@@ -1,10 +1,8 @@
+ include ( ../../settings.pro )
+
+ QT += network xml sql script
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += widgets
+ android: QT += androidextras
+-}
+
+ TEMPLATE = lib
+ TARGET = myth-$$LIBVERSION
+@@ -177,11 +175,7 @@ unix:!cygwin {
+ SOURCES += mediamonitor-unix.cpp
+ HEADERS += mediamonitor-unix.h
+ !android {
+- contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ using_qtdbus: QT += dbus
+- } else {
+- using_qtdbus: CONFIG += qdbus
+- }
+ }
+ }
+
+diff --git a/mythtv/libs/libmyth/test/test_audioconvert/test_audioconvert.pro b/mythtv/libs/libmyth/test/test_audioconvert/test_audioconvert.pro
+index 9e73a8ca23..d0d77e8027 100644
+--- a/mythtv/libs/libmyth/test/test_audioconvert/test_audioconvert.pro
++++ b/mythtv/libs/libmyth/test/test_audioconvert/test_audioconvert.pro
+@@ -1,13 +1,7 @@
+ include ( ../../../../settings.pro )
+
+ QT += xml sql network
+-
+-contains(QT_VERSION, ^4\\.[0-9]\\..*) {
+-CONFIG += qtestlib
+-}
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += testlib
+-}
+
+ TEMPLATE = app
+ TARGET = test_audioconvert
+diff --git a/mythtv/libs/libmyth/test/test_audioutils/test_audioutils.pro b/mythtv/libs/libmyth/test/test_audioutils/test_audioutils.pro
+index 3d62f741cb..df659aeb19 100644
+--- a/mythtv/libs/libmyth/test/test_audioutils/test_audioutils.pro
++++ b/mythtv/libs/libmyth/test/test_audioutils/test_audioutils.pro
+@@ -1,13 +1,7 @@
+ include ( ../../../../settings.pro )
+
+ QT += xml sql network
+-
+-contains(QT_VERSION, ^4\\.[0-9]\\..*) {
+-CONFIG += qtestlib
+-}
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += testlib
+-}
+
+ TEMPLATE = app
+ TARGET = test_audioutils
+diff --git a/mythtv/libs/libmyth/test/test_programinfo/test_programinfo.pro b/mythtv/libs/libmyth/test/test_programinfo/test_programinfo.pro
+index bfd9d24287..e59584844d 100644
+--- a/mythtv/libs/libmyth/test/test_programinfo/test_programinfo.pro
++++ b/mythtv/libs/libmyth/test/test_programinfo/test_programinfo.pro
+@@ -1,13 +1,7 @@
+ include ( ../../../../settings.pro )
+
+ QT += xml sql network
+-
+-contains(QT_VERSION, ^4\\.[0-9]\\..*) {
+-CONFIG += qtestlib
+-}
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += testlib
+-}
+
+ TEMPLATE = app
+ TARGET = test_programinfo
+diff --git a/mythtv/libs/libmythbase/libmythbase.pro b/mythtv/libs/libmythbase/libmythbase.pro
+index aa7ac151db..444abea063 100644
+--- a/mythtv/libs/libmythbase/libmythbase.pro
++++ b/mythtv/libs/libmythbase/libmythbase.pro
+@@ -153,10 +153,7 @@ win32-msvc* {
+ }
+
+ QT += xml sql network
+-
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += widgets
+-}
+
+ include ( ../libs-targetfix.pro )
+
+diff --git a/mythtv/libs/libmythbase/test/test_mythsystem/test_mythsystem.pro b/mythtv/libs/libmythbase/test/test_mythsystem/test_mythsystem.pro
+index fee4e38226..159dcb28f3 100644
+--- a/mythtv/libs/libmythbase/test/test_mythsystem/test_mythsystem.pro
++++ b/mythtv/libs/libmythbase/test/test_mythsystem/test_mythsystem.pro
+@@ -1,13 +1,7 @@
+ include ( ../../../../settings.pro )
+
+ QT += xml sql network
+-
+-contains(QT_VERSION, ^4\\.[0-9]\\..*) {
+-CONFIG += qtestlib
+-}
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += testlib
+-}
+
+ TEMPLATE = app
+ TARGET = test_mythsystem
+diff --git a/mythtv/libs/libmythbase/test/test_mythsystemlegacy/test_mythsystemlegacy.pro b/mythtv/libs/libmythbase/test/test_mythsystemlegacy/test_mythsystemlegacy.pro
+index b116e7a5ae..d97c6c8112 100644
+--- a/mythtv/libs/libmythbase/test/test_mythsystemlegacy/test_mythsystemlegacy.pro
++++ b/mythtv/libs/libmythbase/test/test_mythsystemlegacy/test_mythsystemlegacy.pro
+@@ -1,13 +1,7 @@
+ include ( ../../../../settings.pro )
+
+ QT += xml sql network
+-
+-contains(QT_VERSION, ^4\\.[0-9]\\..*) {
+-CONFIG += qtestlib
+-}
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += testlib
+-}
+
+ TEMPLATE = app
+ TARGET = test_mythsystemlegacy
+diff --git a/mythtv/libs/libmythbase/test/test_mythtimer/test_mythtimer.pro b/mythtv/libs/libmythbase/test/test_mythtimer/test_mythtimer.pro
+index d0e332b74d..91c6a3f773 100644
+--- a/mythtv/libs/libmythbase/test/test_mythtimer/test_mythtimer.pro
++++ b/mythtv/libs/libmythbase/test/test_mythtimer/test_mythtimer.pro
+@@ -1,11 +1,6 @@
+ include ( ../../../../settings.pro )
+
+-contains(QT_VERSION, ^4\\.[0-9]\\..*) {
+-CONFIG += qtestlib
+-}
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += testlib
+-}
+
+ TEMPLATE = app
+ TARGET = test_mythtimer
+diff --git a/mythtv/libs/libmythbase/test/test_template/test_template.pro b/mythtv/libs/libmythbase/test/test_template/test_template.pro
+index 2cf0a3e615..c8229039b7 100644
+--- a/mythtv/libs/libmythbase/test/test_template/test_template.pro
++++ b/mythtv/libs/libmythbase/test/test_template/test_template.pro
+@@ -1,13 +1,7 @@
+ include ( ../../../../settings.pro )
+
+ QT += xml sql network
+-
+-contains(QT_VERSION, ^4\\.[0-9]\\..*) {
+-CONFIG += qtestlib
+-}
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += testlib
+-}
+
+ TEMPLATE = app
+ TARGET = test_template
+diff --git a/mythtv/libs/libmythmetadata/libmythmetadata.pro b/mythtv/libs/libmythmetadata/libmythmetadata.pro
+index d06405c930..695900c985 100644
+--- a/mythtv/libs/libmythmetadata/libmythmetadata.pro
++++ b/mythtv/libs/libmythmetadata/libmythmetadata.pro
+@@ -1,9 +1,7 @@
+ include ( ../../settings.pro )
+
+ QT += network xml sql
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += widgets
+-}
+
+ TEMPLATE = lib
+ TARGET = mythmetadata-$$LIBVERSION
+diff --git a/mythtv/libs/libmythmetadata/test/test_videometadata/test_videometadata.pro b/mythtv/libs/libmythmetadata/test/test_videometadata/test_videometadata.pro
+index 218378d363..cc283b73c0 100644
+--- a/mythtv/libs/libmythmetadata/test/test_videometadata/test_videometadata.pro
++++ b/mythtv/libs/libmythmetadata/test/test_videometadata/test_videometadata.pro
+@@ -1,13 +1,7 @@
+ include ( ../../../../settings.pro )
+
+ QT += xml sql network
+-
+-contains(QT_VERSION, ^4\\.[0-9]\\..*) {
+-CONFIG += qtestlib
+-}
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += testlib
+-}
+
+ TEMPLATE = app
+ TARGET = test_videometadata
+diff --git a/mythtv/libs/libmythprotoserver/libmythprotoserver.pro b/mythtv/libs/libmythprotoserver/libmythprotoserver.pro
+index d9c5643ec8..a1d2446cc1 100644
+--- a/mythtv/libs/libmythprotoserver/libmythprotoserver.pro
++++ b/mythtv/libs/libmythprotoserver/libmythprotoserver.pro
+@@ -1,9 +1,7 @@
+ include ( ../../settings.pro )
+
+ QT += network sql
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += widgets
+-}
+
+ TEMPLATE = lib
+ TARGET = mythprotoserver-$$LIBVERSION
+diff --git a/mythtv/libs/libmythtv/libmythtv.pro b/mythtv/libs/libmythtv/libmythtv.pro
+index 77dd7917a0..b88964a3ea 100644
+--- a/mythtv/libs/libmythtv/libmythtv.pro
++++ b/mythtv/libs/libmythtv/libmythtv.pro
+@@ -1,9 +1,7 @@
+ include ( ../../settings.pro )
+
+ QT += network xml sql
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += widgets
+-}
+
+ TEMPLATE = lib
+ TARGET = mythtv-$$LIBVERSION
+diff --git a/mythtv/libs/libmythtv/test/test_copyframes/test_copyframes.pro b/mythtv/libs/libmythtv/test/test_copyframes/test_copyframes.pro
+index b365d57cd3..15a39d0986 100644
+--- a/mythtv/libs/libmythtv/test/test_copyframes/test_copyframes.pro
++++ b/mythtv/libs/libmythtv/test/test_copyframes/test_copyframes.pro
+@@ -1,13 +1,7 @@
+ include ( ../../../../settings.pro )
+
+ QT += xml sql network
+-
+-contains(QT_VERSION, ^4\\.[0-9]\\..*) {
+-CONFIG += qtestlib
+-}
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += testlib
+-}
+
+ TEMPLATE = app
+ TARGET = test_copyframes
+diff --git a/mythtv/libs/libmythtv/test/test_eitfixups/test_eitfixups.pro b/mythtv/libs/libmythtv/test/test_eitfixups/test_eitfixups.pro
+index 6e8881b4eb..a6be44cc62 100644
+--- a/mythtv/libs/libmythtv/test/test_eitfixups/test_eitfixups.pro
++++ b/mythtv/libs/libmythtv/test/test_eitfixups/test_eitfixups.pro
+@@ -1,13 +1,7 @@
+ include ( ../../../../settings.pro )
+
+ QT += xml sql network
+-
+-contains(QT_VERSION, ^4\\.[0-9]\\..*) {
+-CONFIG += qtestlib
+-}
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += testlib
+-}
+
+ TEMPLATE = app
+ TARGET = test_eitfixups
+diff --git a/mythtv/libs/libmythtv/test/test_iptvrecorder/test_iptvrecorder.pro b/mythtv/libs/libmythtv/test/test_iptvrecorder/test_iptvrecorder.pro
+index c051d80319..bbc9e89a46 100644
+--- a/mythtv/libs/libmythtv/test/test_iptvrecorder/test_iptvrecorder.pro
++++ b/mythtv/libs/libmythtv/test/test_iptvrecorder/test_iptvrecorder.pro
+@@ -1,13 +1,7 @@
+ include ( ../../../../settings.pro )
+
+ QT += xml sql network
+-
+-contains(QT_VERSION, ^4\\.[0-9]\\..*) {
+-CONFIG += qtestlib
+-}
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += testlib
+-}
+
+ TEMPLATE = app
+ TARGET = test_iptvrecorder
+diff --git a/mythtv/libs/libmythtv/test/test_mpegtables/test_mpegtables.pro b/mythtv/libs/libmythtv/test/test_mpegtables/test_mpegtables.pro
+index 62f3124bb5..b280b0eaa7 100644
+--- a/mythtv/libs/libmythtv/test/test_mpegtables/test_mpegtables.pro
++++ b/mythtv/libs/libmythtv/test/test_mpegtables/test_mpegtables.pro
+@@ -1,13 +1,7 @@
+ include ( ../../../../settings.pro )
+
+ QT += xml sql network
+-
+-contains(QT_VERSION, ^4\\.[0-9]\\..*) {
+-CONFIG += qtestlib
+-}
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += testlib
+-}
+
+ TEMPLATE = app
+ TARGET = test_mpegtables
+diff --git a/mythtv/libs/libmythui/libmythui.pro b/mythtv/libs/libmythui/libmythui.pro
+index 6b534ad2c2..092098dd4a 100644
+--- a/mythtv/libs/libmythui/libmythui.pro
++++ b/mythtv/libs/libmythui/libmythui.pro
+@@ -1,10 +1,7 @@
+ include ( ../../settings.pro )
+
+ QT += xml sql network opengl
+-contains(QT_VERSION, ^4\\.[0-9]\\..*) {
+-QT += webkit
+-}
+-contains(QT_VERSION, ^5\\.[0-9]\\..*):using_qtwebkit {
++using_qtwebkit {
+ QT += widgets
+ QT += webkitwidgets
+ android: QT += androidextras
+diff --git a/mythtv/programs/mythavtest/mythavtest.pro b/mythtv/programs/mythavtest/mythavtest.pro
+index b993647179..35ed274fd9 100644
+--- a/mythtv/programs/mythavtest/mythavtest.pro
++++ b/mythtv/programs/mythavtest/mythavtest.pro
+@@ -3,9 +3,7 @@ include ( ../../version.pro )
+ include ( ../programs-libs.pro )
+
+ QT += network xml sql
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += widgets
+-}
+
+ TEMPLATE = app
+ CONFIG += thread
+diff --git a/mythtv/programs/mythbackend/mythbackend.pro b/mythtv/programs/mythbackend/mythbackend.pro
+index ab59bcbbe1..5e54d3bfeb 100644
+--- a/mythtv/programs/mythbackend/mythbackend.pro
++++ b/mythtv/programs/mythbackend/mythbackend.pro
+@@ -10,9 +10,7 @@ mingw | win32-msvc* {
+ # need the following for QUrl::addQueryItem
+ DEFINES += QT_DISABLE_DEPRECATED_BEFORE
+ }
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += widgets
+-}
+
+ TEMPLATE = app
+ CONFIG += thread
+diff --git a/mythtv/programs/mythccextractor/mythccextractor.pro b/mythtv/programs/mythccextractor/mythccextractor.pro
+index fbe8c2e50a..a0e70a9ef7 100644
+--- a/mythtv/programs/mythccextractor/mythccextractor.pro
++++ b/mythtv/programs/mythccextractor/mythccextractor.pro
+@@ -2,9 +2,7 @@ include (../../settings.pro)
+ include ( ../programs-libs.pro )
+
+ QT += sql network
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += widgets
+-}
+
+ TEMPLATE = app
+ CONFIG += thread
+diff --git a/mythtv/programs/mythcommflag/mythcommflag.pro b/mythtv/programs/mythcommflag/mythcommflag.pro
+index 997966e295..a3fde4f4bd 100644
+--- a/mythtv/programs/mythcommflag/mythcommflag.pro
++++ b/mythtv/programs/mythcommflag/mythcommflag.pro
+@@ -2,9 +2,7 @@ include (../../settings.pro)
+ include (../../version.pro)
+ include ( ../programs-libs.pro )
+
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += widgets
+-}
+
+ TEMPLATE = app
+ CONFIG += thread
+diff --git a/mythtv/programs/mythfilerecorder/mythfilerecorder.pro b/mythtv/programs/mythfilerecorder/mythfilerecorder.pro
+index 73300742f1..ba568e091a 100644
+--- a/mythtv/programs/mythfilerecorder/mythfilerecorder.pro
++++ b/mythtv/programs/mythfilerecorder/mythfilerecorder.pro
+@@ -3,9 +3,7 @@ include (../../version.pro)
+ include ( ../programs-libs.pro )
+
+ QT += network xml sql script
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += widgets
+-}
+
+ TEMPLATE = app
+ CONFIG += thread
+diff --git a/mythtv/programs/mythfilldatabase/mythfilldatabase.pro b/mythtv/programs/mythfilldatabase/mythfilldatabase.pro
+index 52e6e0a256..0f4f944cf7 100644
+--- a/mythtv/programs/mythfilldatabase/mythfilldatabase.pro
++++ b/mythtv/programs/mythfilldatabase/mythfilldatabase.pro
+@@ -3,9 +3,7 @@ include ( ../../version.pro )
+ include ( ../programs-libs.pro )
+
+ QT += network xml sql
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += widgets
+-}
+
+ TEMPLATE = app
+ CONFIG += thread
+diff --git a/mythtv/programs/mythfrontend/mythfrontend.pro b/mythtv/programs/mythfrontend/mythfrontend.pro
+index 744fe1f2bb..2e5f313243 100644
+--- a/mythtv/programs/mythfrontend/mythfrontend.pro
++++ b/mythtv/programs/mythfrontend/mythfrontend.pro
+@@ -7,11 +7,7 @@ mingw | win32-msvc* {
+ # script debugger currently only enabled for WIN32 builds
+ QT += scripttools
+ }
+-contains(QT_VERSION, ^4\\.[0-9]\\..*) {
+-QT += webkit
+-using_qtdbus: CONFIG += qdbus
+-}
+-contains(QT_VERSION, ^5\\.[0-9]\\..*):using_qtwebkit {
++using_qtwebkit {
+ QT += widgets
+ QT += webkitwidgets
+ using_qtdbus: QT += dbus
+diff --git a/mythtv/programs/mythjobqueue/mythjobqueue.pro b/mythtv/programs/mythjobqueue/mythjobqueue.pro
+index 9405ab597f..389eec7843 100644
+--- a/mythtv/programs/mythjobqueue/mythjobqueue.pro
++++ b/mythtv/programs/mythjobqueue/mythjobqueue.pro
+@@ -3,9 +3,7 @@ include ( ../../version.pro)
+ include ( ../programs-libs.pro)
+
+ QT += sql network
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += widgets
+-}
+
+ CONFIG -= opengl
+
+diff --git a/mythtv/programs/mythlcdserver/mythlcdserver.pro b/mythtv/programs/mythlcdserver/mythlcdserver.pro
+index fd0a98bf91..766715ee61 100644
+--- a/mythtv/programs/mythlcdserver/mythlcdserver.pro
++++ b/mythtv/programs/mythlcdserver/mythlcdserver.pro
+@@ -3,9 +3,8 @@ include ( ../../version.pro )
+ include ( ../programs-libs.pro )
+
+ QT += network xml sql
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += widgets
+-}
++
+ using_opengl:QT += opengl
+
+ TEMPLATE = app
+diff --git a/mythtv/programs/mythlogserver/mythlogserver.pro b/mythtv/programs/mythlogserver/mythlogserver.pro
+index fbe8c2e50a..a0e70a9ef7 100644
+--- a/mythtv/programs/mythlogserver/mythlogserver.pro
++++ b/mythtv/programs/mythlogserver/mythlogserver.pro
+@@ -2,9 +2,7 @@ include (../../settings.pro)
+ include ( ../programs-libs.pro )
+
+ QT += sql network
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += widgets
+-}
+
+ TEMPLATE = app
+ CONFIG += thread
+diff --git a/mythtv/programs/mythmediaserver/mythmediaserver.pro b/mythtv/programs/mythmediaserver/mythmediaserver.pro
+index 2f9a804939..e042941fba 100644
+--- a/mythtv/programs/mythmediaserver/mythmediaserver.pro
++++ b/mythtv/programs/mythmediaserver/mythmediaserver.pro
+@@ -3,9 +3,7 @@ include ( ../../version.pro )
+ include ( ../programs-libs.pro )
+
+ QT += network sql
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += widgets
+-}
+
+ TEMPLATE = app
+ CONFIG += thread
+diff --git a/mythtv/programs/mythpreviewgen/mythpreviewgen.pro b/mythtv/programs/mythpreviewgen/mythpreviewgen.pro
+index d21797ede9..3d085385ba 100644
+--- a/mythtv/programs/mythpreviewgen/mythpreviewgen.pro
++++ b/mythtv/programs/mythpreviewgen/mythpreviewgen.pro
+@@ -3,9 +3,7 @@ include ( ../../version.pro )
+ include ( ../programs-libs.pro )
+
+ QT += network sql
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += widgets
+-}
+
+ TEMPLATE = app
+ CONFIG += thread
+diff --git a/mythtv/programs/mythscreenwizard/mythscreenwizard.pro b/mythtv/programs/mythscreenwizard/mythscreenwizard.pro
+index 42c4669620..5a4d08d417 100644
+--- a/mythtv/programs/mythscreenwizard/mythscreenwizard.pro
++++ b/mythtv/programs/mythscreenwizard/mythscreenwizard.pro
+@@ -3,9 +3,7 @@ include ( ../../version.pro)
+ include ( ../programs-libs.pro)
+
+ QT += sql network
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += widgets
+-}
+
+ TEMPLATE = app
+ CONFIG += thread
+diff --git a/mythtv/programs/mythtranscode/mythtranscode.pro b/mythtv/programs/mythtranscode/mythtranscode.pro
+index 4d4c3bcbcb..1f66fade2b 100644
+--- a/mythtv/programs/mythtranscode/mythtranscode.pro
++++ b/mythtv/programs/mythtranscode/mythtranscode.pro
+@@ -3,9 +3,7 @@ include ( ../../version.pro)
+ include ( ../programs-libs.pro)
+
+ QT += network xml sql
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += widgets
+-}
+
+ TEMPLATE = app
+ CONFIG += thread
+diff --git a/mythtv/programs/mythtv-setup/mythtv-setup.pro b/mythtv/programs/mythtv-setup/mythtv-setup.pro
+index 24a9255fb7..9ef3f1c61a 100644
+--- a/mythtv/programs/mythtv-setup/mythtv-setup.pro
++++ b/mythtv/programs/mythtv-setup/mythtv-setup.pro
+@@ -3,9 +3,7 @@ include ( ../../version.pro )
+ include ( ../programs-libs.pro )
+
+ QT += network xml sql
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += widgets
+-}
+
+ INCLUDEPATH += ../../libs/libmythtv/channelscan
+ DEPENDPATH += ../../libs/libmythtv/channelscan
+diff --git a/mythtv/programs/mythutil/mythutil.pro b/mythtv/programs/mythutil/mythutil.pro
+index ab8897f17c..0ad14ef856 100644
+--- a/mythtv/programs/mythutil/mythutil.pro
++++ b/mythtv/programs/mythutil/mythutil.pro
+@@ -3,9 +3,7 @@ include ( ../../version.pro )
+ include ( ../programs-libs.pro )
+
+ QT += network sql xml
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += widgets
+-}
+
+ TEMPLATE = app
+ CONFIG += thread
+diff --git a/mythtv/programs/mythwelcome/mythwelcome.pro b/mythtv/programs/mythwelcome/mythwelcome.pro
+index edddbf18a6..fa83a39852 100644
+--- a/mythtv/programs/mythwelcome/mythwelcome.pro
++++ b/mythtv/programs/mythwelcome/mythwelcome.pro
+@@ -3,9 +3,7 @@ include (../../version.pro)
+ include (../programs-libs.pro)
+
+ QT += xml sql network
+-contains(QT_VERSION, ^5\\.[0-9]\\..*) {
+ QT += widgets
+-}
+
+ TEMPLATE = app
+ CONFIG += thread