Author: hobbes1069
Update of /cvs/free/rpms/mythtv/F-19
In directory old02.ovh.rpmfusion.lan:/tmp/cvs-serv18322
Modified Files:
ChangeLog mythtv-0.26-fixes.patch mythtv.spec
Added Files:
mythtv-0.26-libcec2.patch
Log Message:
* Tue Oct 1 2013 Richard Shaw <hobbes1069(a)gmail.com> - 0.26.1-4
- Update to latest bugfix release.
- Add patch for libcec 2.
- Update to latest bugfix release.
- Add udisks as a requirement as it is required for ejecting cd/dvds.
mythtv-0.26-libcec2.patch:
configure | 4
libs/libmythui/cecadapter.cpp | 267 +++++++++++++++++++++++++++++++-----------
libs/libmythui/cecadapter.h | 1
3 files changed, 205 insertions(+), 67 deletions(-)
--- NEW FILE mythtv-0.26-libcec2.patch ---
diff --git a/mythtv/configure b/mythtv/configure
index 7ab8aa7..7d5e39d 100755
--- a/mythtv/configure
+++ b/mythtv/configure
@@ -5178,10 +5178,12 @@ using namespace std;
using namespace CEC;
#include <libcec/cecloader.h>
int main(void) {
+ if (CEC_LIB_VERSION_MAJOR == 2)
+ return 1;
if (CEC_LIB_VERSION_MAJOR < 1 || (CEC_LIB_VERSION_MAJOR == 1 &&
CEC_LIB_VERSION_MINOR < 5))
return 0;
- return (long) LibCecInit;
+ return 1;
}
EOF
fi
diff --git a/mythtv/libs/libmythui/cecadapter.cpp b/mythtv/libs/libmythui/cecadapter.cpp
index edad8f6..5987d5d 100644
--- a/mythtv/libs/libmythui/cecadapter.cpp
+++ b/mythtv/libs/libmythui/cecadapter.cpp
@@ -14,9 +14,28 @@
#include "cecadapter.h"
#include <vector>
-#define MIN_LIBCEC_VERSION 1
+#ifdef CEC_CLIENT_VERSION_CURRENT // 2.0.3 and up
+#define CEC_CONFIG_VERSION CEC_CLIENT_VERSION_CURRENT;
+#else
+#ifdef LIBCEC_VERSION_CURRENT // 1.6.2 and up
+#define CEC_CONFIG_VERSION LIBCEC_VERSION_CURRENT;
+#else
+#define CEC_CONFIG_VERSION 0;
+#endif
+#endif
+
#define MAX_CEC_DEVICES 10
#define LOC QString("CECAdapter: ")
+#define OSDNAME "MythTv"
+
+// TODO remove if we have a ui.
+// hard code logical and physical address
+#define CEC_DEFAULT_DEVICE_TYPE CEC_DEVICE_TYPE_RECORDING_DEVICE
+#undef CEC_DEFAULT_HDMI_PORT
+#define CEC_DEFAULT_HDMI_PORT 2
+#undef CEC_DEFAULT_BASE_DEVICE
+#define CEC_DEFAULT_BASE_DEVICE CECDEVICE_AUDIOSYSTEM
+#define CEC_DEFAULT_PHYSICALADDRESS (quint16)0x2200
#include <libcec/cec.h>
#include <iostream>
@@ -25,17 +44,26 @@ using namespace std;
#include <libcec/cecloader.h>
QMutex* CECAdapter::gLock = new QMutex(QMutex::Recursive);
+bool resetSafe = false;
class CECAdapterPriv
{
public:
CECAdapterPriv()
- : adapter(NULL), defaultDevice("auto"), defaultHDMIPort(1),
- defaultDeviceID(CECDEVICE_PLAYBACKDEVICE1), timer(NULL), valid(false),
+ : adapter(NULL), defaultDevice("auto"),
defaultHDMIPort(CEC_DEFAULT_HDMI_PORT),
+ defaultDeviceID(CEC_DEFAULT_DEVICE_TYPE), timer(NULL), valid(false),
powerOffTV(false), powerOffTVAllowed(false), powerOffTVOnExit(false),
powerOnTV(false), powerOnTVAllowed(false), powerOnTVOnStart(false),
switchInput(false), switchInputAllowed(true)
{
+ callbacks.Clear();
+ callbacks.CBCecLogMessage = LogMessages;
+ callbacks.CBCecKeyPress = HandleKeyPresses;
+ callbacks.CBCecCommand = HandleCommands;
+ callbacks.CBCecConfigurationChanged = HandleConfigurationChanged;
+ callbacks.CBCecAlert = HandleAlerts;
+ callbacks.CBCecMenuStateChanged = HandleMenuStateChanged;
+ callbacks.CBCecSourceActivated = HandleSourceActivated;
}
static QString addressToString(enum cec_logical_address addr, bool source)
@@ -69,14 +97,15 @@ class CECAdapterPriv
static QStringList GetDeviceList(void)
{
QStringList results;
- cec_device_type_list list;
- list.Clear();
- list.Add(CEC_DEVICE_TYPE_PLAYBACK_DEVICE);
- ICECAdapter *adapter = LibCecInit("MythTV", list);
+ libcec_configuration configuration;
+ configuration.Clear();
+ ICECAdapter *adapter = LibCecInitialise(&configuration);
if (!adapter)
return results;
cec_adapter *devices = new cec_adapter[MAX_CEC_DEVICES];
uint8_t num_devices = adapter->FindAdapters(devices, MAX_CEC_DEVICES, NULL);
+ LOG(VB_GENERAL, LOG_INFO, LOC + QString("GetDeviceList() found %1
devices(s).")
+ .arg(num_devices));
if (num_devices < 1)
return results;
for (uint8_t i = 0; i < num_devices; i++)
@@ -89,39 +118,112 @@ class CECAdapterPriv
{
// get settings
// N.B. these do not currently work as there is no UI
+
+ // There is no way current CEC adapters can find their physical address
+ // on their own. The are only connected to the CEC pin of the HDMI connector.
+ // To construct a valid physical address libCEC needs:
+ // - the HDMI port (number) Myth is connected to
+ // - the HDMI device (TV, Receiver) Myth is connected to (the logical address)
+
+ //The CEC adapter we want to connect to
defaultDevice = gCoreContext->GetSetting(LIBCEC_DEVICE,
"auto").trimmed();
+ // The number of the HDMI port Myth is connected to
QString hdmi_port = gCoreContext->GetSetting(LIBCEC_PORT, "auto");
+ // The logical address of the HDMI device Myth is connected to
+ QString base_dev = gCoreContext->GetSetting(LIBCEC_BASE, "auto");
+ // Device type we want Myth to use
QString device_id = gCoreContext->GetSetting(LIBCEC_DEVICEID,
"auto");
powerOffTVAllowed = (bool)gCoreContext->GetNumSetting(POWEROFFTV_ALLOWED, 1);
powerOffTVOnExit = (bool)gCoreContext->GetNumSetting(POWEROFFTV_ONEXIT, 1);
powerOnTVAllowed = (bool)gCoreContext->GetNumSetting(POWERONTV_ALLOWED, 1);
powerOnTVOnStart = (bool)gCoreContext->GetNumSetting(POWERONTV_ONSTART, 1);
- defaultHDMIPort = 1;
if ("auto" != hdmi_port)
{
defaultHDMIPort = hdmi_port.toInt();
- if (defaultHDMIPort < 1 || defaultHDMIPort > 3)
- defaultHDMIPort = 1;
+ if (defaultHDMIPort < CEC_MIN_HDMI_PORTNUMBER || defaultHDMIPort >
CEC_MAX_HDMI_PORTNUMBER)
+ defaultHDMIPort = CEC_DEFAULT_HDMI_PORT;
+ }
+ else
+ {
+ defaultHDMIPort = CEC_DEFAULT_HDMI_PORT;
}
- defaultHDMIPort = defaultHDMIPort << 12;
- defaultDeviceID = CECDEVICE_PLAYBACKDEVICE1;
if ("auto" != device_id)
{
int id = device_id.toInt();
- if (id < 1 || id > 3)
- id = 1;
- defaultDeviceID = (id == 1) ? CECDEVICE_PLAYBACKDEVICE1 :
- ((id == 2) ? CECDEVICE_PLAYBACKDEVICE2 :
- CECDEVICE_PLAYBACKDEVICE3);
+ switch (id)
+ {
+ case CEC_DEVICE_TYPE_TV:
+ case CEC_DEVICE_TYPE_RECORDING_DEVICE:
+ case CEC_DEVICE_TYPE_RESERVED:
+ case CEC_DEVICE_TYPE_TUNER:
+ case CEC_DEVICE_TYPE_PLAYBACK_DEVICE:
+ case CEC_DEVICE_TYPE_AUDIO_SYSTEM:
+ defaultDeviceID = (cec_device_type)id;
+ break;
+ default:
+ defaultDeviceID = CEC_DEFAULT_DEVICE_TYPE;
+ break;
+ }
+ }
+ else
+ {
+ defaultDeviceID = CEC_DEFAULT_DEVICE_TYPE;
}
+ LOG(VB_GENERAL, LOG_INFO, LOC + QString("base_dev= %1.")
+ .arg(base_dev));
+ if ("auto" != base_dev)
+ {
+ base_device = (cec_logical_address)base_dev.toInt();
+ LOG(VB_GENERAL, LOG_INFO, LOC + QString("base_device= %1.")
+ .arg(base_device));
+ switch (base_device)
+ {
+ case CECDEVICE_TV:
+ case CECDEVICE_RECORDINGDEVICE1:
+ case CECDEVICE_RECORDINGDEVICE2:
+ case CECDEVICE_TUNER1:
+ case CECDEVICE_PLAYBACKDEVICE1:
+ case CECDEVICE_AUDIOSYSTEM:
+ case CECDEVICE_TUNER2:
+ case CECDEVICE_TUNER3:
+ case CECDEVICE_PLAYBACKDEVICE2:
+ case CECDEVICE_RECORDINGDEVICE3:
+ case CECDEVICE_TUNER4:
+ case CECDEVICE_PLAYBACKDEVICE3:
+ case CECDEVICE_FREEUSE:
+ break;
+ case CECDEVICE_UNKNOWN:
+ case CECDEVICE_RESERVED1:
+ case CECDEVICE_RESERVED2:
+ case CECDEVICE_BROADCAST:
+ default:
+ base_device = (cec_logical_address)CEC_DEFAULT_BASE_DEVICE;
+ break;
+ }
+ }
+ else
+ {
+ base_device = (cec_logical_address)CEC_DEFAULT_BASE_DEVICE;
+ }
+
// create adapter interface
- cec_device_type_list list;
- list.Clear();
- list.Add(CEC_DEVICE_TYPE_PLAYBACK_DEVICE);
- adapter = LibCecInit("MythTV", list);
+ libcec_configuration configuration;
+ configuration.Clear();
+ configuration.clientVersion = LIBCEC_VERSION_CURRENT;
+ snprintf(configuration.strDeviceName, 13, "MythTV");
+ configuration.deviceTypes.Add(defaultDeviceID);
+ configuration.iPhysicalAddress = CEC_DEFAULT_PHYSICALADDRESS;
+ configuration.iHDMIPort = defaultHDMIPort;
+ LOG(VB_GENERAL, LOG_INFO, LOC + QString("using HDMI port %1.")
+ .arg(defaultHDMIPort));
+ configuration.baseDevice = base_device;
+ LOG(VB_GENERAL, LOG_INFO, LOC + QString("using base device %1.")
+ .arg(configuration.baseDevice));
+ configuration.callbacks = &callbacks;
+ ICECAdapter *adapter = LibCecInitialise(&configuration);
if (!adapter)
{
@@ -129,12 +231,12 @@ class CECAdapterPriv
return false;
}
- if (adapter->GetMinLibVersion() > MIN_LIBCEC_VERSION)
+ if ((configuration.serverVersion >> 12) > CEC_MIN_LIB_VERSION)
{
LOG(VB_GENERAL, LOG_ERR, LOC +
QString("The installed libCEC supports version %1 and above. "
"This version of MythTV only supports version %2.")
- .arg(adapter->GetMinLibVersion()).arg(MIN_LIBCEC_VERSION));
+ .arg(configuration.serverVersion).arg(CEC_MIN_LIB_VERSION));
return false;
}
@@ -185,12 +287,6 @@ class CECAdapterPriv
// get the vendor ID (for non-standard implementations)
adapter->GetDeviceVendorId(CECDEVICE_TV);
- // set the physical address
- adapter->SetPhysicalAddress(defaultHDMIPort);
-
- // set the logical address
- adapter->SetLogicalAddress(defaultDeviceID);
-
// switch input (if configured)
switchInput = true;
HandleActions();
@@ -210,7 +306,6 @@ class CECAdapterPriv
// delete adapter
adapter->Close();
- LogMessages();
UnloadLibCec(adapter);
LOG(VB_GENERAL, LOG_INFO, LOC + "Closing down CEC.");
@@ -219,14 +314,12 @@ class CECAdapterPriv
adapter = NULL;
}
- void LogMessages(void)
+ #if CEC_LIB_VERSION_MAJOR < 2
+ static int LogMessages(void *, const cec_log_message &message)
+ #else
+ static int LogMessages(void *, const cec_log_message message)
+ #endif
{
- if (!adapter || !valid)
- return;
-
- cec_log_message message;
- while (adapter->GetNextLogMessage(&message))
- {
QString msg(message.message);
int lvl = LOG_UNKNOWN;
switch (message.level)
@@ -237,19 +330,15 @@ class CECAdapterPriv
case CEC_LOG_DEBUG: lvl = LOG_DEBUG; break;
}
LOG(VB_GENERAL, lvl, LOC + QString("%1").arg(msg));
- }
+ return 0;
}
- void HandleCommands(void)
+ #if CEC_LIB_VERSION_MAJOR < 2
+ static int HandleCommands(void * /*cbParam*/, const cec_command &command)
+ #else
+ static int HandleCommands(void * /*cbParam*/, const cec_command command)
+ #endif
{
- if (!adapter || !valid)
- return;
-
- LogMessages();
-
- cec_command command;
- while (adapter->GetNextCommand(&command))
- {
LOG(VB_GENERAL, LOG_DEBUG, LOC +
QString("Command %1 from '%2' (%3) - destination
'%4' (%5)")
.arg(command.opcode)
@@ -260,27 +349,76 @@ class CECAdapterPriv
switch (command.opcode)
{
- // TODO
+ // TODO handle CEC commands.
default:
break;
}
- }
+ return 0;
+ }
- LogMessages();
+ #if CEC_LIB_VERSION_MAJOR < 2
+ static int HandleConfigurationChanged(void * /*cbParam*/, const libcec_configuration
&config)
+ #else
+ static int HandleConfigurationChanged(void * /*cbParam*/, const libcec_configuration
config)
+ #endif
+ {
+ LOG(VB_GENERAL, LOG_INFO, LOC + "Adapter configuration changed.");
+ return 1;
}
- void HandleKeyPresses(void)
+ #if CEC_LIB_VERSION_MAJOR < 2
+ static int HandleAlerts(void * /*cbParam*/, const libcec_alert type, const
libcec_parameter & /*param*/)
+ #else
+ static int HandleAlerts(void * /*cbParam*/, const libcec_alert type, const
libcec_parameter /*param*/)
+ #endif
{
- if (!adapter || !valid)
- return;
+ switch (type) // TODO Handle alerts.
+ {
+ case CEC_ALERT_CONNECTION_LOST:
+ LOG(VB_GENERAL, LOG_ERR, LOC + "Connection lost - TODO: need to handle
this!");
+ break;
+ default:
+ LOG(VB_GENERAL, LOG_ERR, LOC + "Received unknown alert.");
+ break;
+ }
+ return 0;
+ }
- cec_keypress key;
- if (!adapter->GetNextKeypress(&key))
- return;
+ #if CEC_LIB_VERSION_MAJOR < 2
+ static int HandleMenuStateChanged(void * /*cbParam*/, const cec_menu_state
&state)
+ #else
+ static int HandleMenuStateChanged(void * /*cbParam*/, const cec_menu_state state)
+ #endif
+ {
+ LOG(VB_GENERAL, LOG_INFO, LOC + QString("CEC menu state %1")
+ .arg(state == CEC_MENU_STATE_ACTIVATED ? "Activated" :
"Deactivated"));
+ return 1;
+ }
+ #if CEC_LIB_VERSION_MAJOR < 2
+ static void HandleSourceActivated(void * /*cbParam*/, const cec_logical_address
&address, const &uint8_t activated)
+ #else
+ static void HandleSourceActivated(void * /*cbParam*/, const cec_logical_address
address, const uint8_t activated)
+ #endif
+ {
+ LOG(VB_GENERAL, LOG_INFO, LOC + QString("Source %1 %2")
+ .arg(address).arg(activated ? "Activated" :
"Deactivated"));
+
+ if (activated && resetSafe)
+ GetMythUI()->ResetScreensaver();
+ else
+ resetSafe = true;
+ }
+
+ #if CEC_LIB_VERSION_MAJOR < 2
+ static int HandleKeyPresses(void * /*cbParam*/, const cec_keypress &key)
+ #else
+ static int HandleKeyPresses(void * /*cbParam*/, const cec_keypress key)
+ #endif
+ {
// Ignore key down events and wait for the key 'up'
if (key.duration < 1)
- return;
+ return 0;
QString code;
int action = 0;
@@ -595,13 +733,12 @@ class CECAdapterPriv
.arg(code).arg(0 == action ? "(Not actioned)" : ""));
if (0 == action)
- return;
+ return 0;
GetMythUI()->ResetScreensaver();
QKeyEvent* ke = new QKeyEvent(QEvent::KeyPress, action, Qt::NoModifier);
qApp->postEvent(GetMythMainWindow(), (QEvent*)ke);
-
- LogMessages();
+ return 0;
}
void HandleActions(void)
@@ -629,7 +766,7 @@ class CECAdapterPriv
// HDMI input
if (switchInput && switchInputAllowed)
{
- if (adapter->SetActiveView())
+ if (adapter->SetActiveSource())
LOG(VB_GENERAL, LOG_INFO, LOC + "Asked TV to switch to this
input.");
else
LOG(VB_GENERAL, LOG_ERR, LOC + "Failed to switch to this
input.");
@@ -638,14 +775,14 @@ class CECAdapterPriv
powerOffTV = false;
powerOnTV = false;
switchInput = false;
-
- LogMessages();
}
ICECAdapter *adapter;
+ ICECCallbacks callbacks;
QString defaultDevice;
int defaultHDMIPort;
- cec_logical_address defaultDeviceID;
+ cec_device_type defaultDeviceID;
+ cec_logical_address base_device;
QTimer *timer;
bool valid;
bool powerOffTV;
@@ -728,8 +865,6 @@ void CECAdapter::Action(const QString &action)
void CECAdapter::Process(void)
{
gLock->lock();
- m_priv->HandleCommands();
- m_priv->HandleKeyPresses();
m_priv->HandleActions();
gLock->unlock();
}
diff --git a/mythtv/libs/libmythui/cecadapter.h b/mythtv/libs/libmythui/cecadapter.h
index e9cf6d6..bb5eba8 100644
--- a/mythtv/libs/libmythui/cecadapter.h
+++ b/mythtv/libs/libmythui/cecadapter.h
@@ -7,6 +7,7 @@
#define LIBCEC_ENABLED QString("libCECEnabled")
#define LIBCEC_DEVICE QString("libCECDevice")
#define LIBCEC_PORT QString("libCECPort")
+#define LIBCEC_BASE QString("libCECBase")
#define LIBCEC_DEVICEID QString("libCECDeviceID")
#define POWEROFFTV_ALLOWED QString("PowerOffTVAllowed")
#define POWEROFFTV_ONEXIT QString("PowerOffTVOnExit")
Index: ChangeLog
===================================================================
RCS file: /cvs/free/rpms/mythtv/F-19/ChangeLog,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- ChangeLog 23 Aug 2013 18:25:30 -0000 1.9
+++ ChangeLog 3 Oct 2013 12:05:01 -0000 1.10
@@ -1,19 +1,36 @@
-commit 6a46ea014907ac0ee010bed9d8896cb2ee09bc2d
-Author: Stuart Morgan <smorgan(a)mythtv.org>
-Date: Mon Aug 19 14:25:56 2013 +0100
+commit 33f0177459ded1ed3ca63c319bb825e3ee3a6d56
+Author: Martin Bene <myth(a)bene.priv.at>
+Date: Sat Sep 14 16:27:22 2013 -0400
- Disable database logging by default.
+ Fix MythWeb's date/time handling
- It can be re-enabled using --enable-dblog
+ The code in question has partially changed so I am applying part of Martin's
patch
+ (the section that clears to session variables) to fix the problem.
- Until we actually start using this data somewhere there is not much
- point in storing it. Since it's already known that writing to the
- database can affect I/O performance, especially where drives are
- shared with recordings, this could potentially even cause a positive
- feedback loop. The I/O starvation causes the backend to start logging
- slow read/write warnings, which in turn increase the writes to the
- database exacerbating the problems.
-
- The same problem is also true, to a greater or lesser extent with file
- based logging but we actually need the file logs so there isn't much
- we can do there.
+ Thank you Martin!
+
+ Refs #9833
+
+ Signed-off-by: Nicolas Riendeau <nriendeau(a)mythtv.org>
+
+commit 7326d7ef70fb86037d9c30ca7e0762d0cb01b7ff
+Author: Scott Shawcroft <scott.shawcroft(a)gmail.com>
+Date: Tue Aug 27 22:34:55 2013 -0400
+
+ Fix the problem of MythWeb failing to load translations
+
+ Refs #11513
+
+ Signed-off-by: Nicolas Riendeau <nriendeau(a)mythtv.org>
+
+commit 5d8ffe109286269ada87390a2b74e142ec36e364
+Author: Karl Dietz <dekarl(a)mythtv.org>
+Date: Mon Aug 26 22:39:35 2013 +0200
+
+ fix merge in schedule templates added in f97529656
+
+ if (!$this->$name) ends up as if(!0)...
+
+ Fixes #11775
+
+ (cherry picked from commit 08b94cea6346ebeb94edf98ecb5d7b7dd8555560)
mythtv-0.26-fixes.patch:
b/mythtv/bindings/python/MythTV/database.py | 2
b/mythtv/bindings/python/MythTV/dataheap.py | 6
b/mythtv/bindings/python/MythTV/logging.py | 6
b/mythtv/bindings/python/MythTV/system.py | 11
b/mythtv/bindings/python/setup.py | 4
b/mythtv/bindings/python/tmdb3/scripts/pytmdb3.py | 7
b/mythtv/bindings/python/tmdb3/tmdb3/pager.py | 5
b/mythtv/bindings/python/tmdb3/tmdb3/tmdb_api.py | 2
b/mythtv/i18n/mythfrontend_de.qm |binary
b/mythtv/i18n/mythfrontend_de.ts | 22
b/mythtv/libs/libmythbase/logging.cpp | 4
b/mythtv/libs/libmythbase/mythcommandlineparser.cpp | 6
b/mythtv/libs/libmythmetadata/metadatadownload.cpp | 8
b/mythtv/libs/libmythtv/avformatdecoder.cpp | 2
b/mythtv/libs/libmythtv/decoderbase.cpp | 5
b/mythtv/libs/libmythtv/eithelper.cpp | 29
b/mythtv/programs/mythfrontend/commandlineparser.cpp | 2
b/mythtv/programs/scripts/hardwareprofile/config.py | 5
b/mythtv/programs/scripts/hardwareprofile/distros/mythtv_data/data_mythtv.py | 16
b/mythtv/programs/scripts/hardwareprofile/os_detect.py | 5
b/mythtv/programs/scripts/metadata/Movie/tmdb3.py | 8
mythtv/bindings/python/MythTV/tmdb/XSLT/tmdbQuery.xsl | 99
mythtv/bindings/python/MythTV/tmdb/XSLT/tmdbVideo.xsl | 157 -
mythtv/bindings/python/MythTV/tmdb/tmdb_api.py | 1317
----------
mythtv/bindings/python/MythTV/tmdb/tmdb_exceptions.py | 45
mythtv/bindings/python/MythTV/tmdb/tmdb_ui.py | 266 --
mythtv/programs/scripts/metadata/Movie/tmdb.py | 640 ----
27 files changed, 114 insertions(+), 2565 deletions(-)
View full diff with command:
/usr/bin/cvs -f diff -kk -u -N -r 1.7 -r 1.8 mythtv-0.26-fixes.patch
Index: mythtv-0.26-fixes.patch
===================================================================
RCS file: /cvs/free/rpms/mythtv/F-19/mythtv-0.26-fixes.patch,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- mythtv-0.26-fixes.patch 23 Aug 2013 18:25:30 -0000 1.7
+++ mythtv-0.26-fixes.patch 3 Oct 2013 12:05:01 -0000 1.8
@@ -1,11 +1,2198 @@
- mythtv/libs/libmythbase/logging.cpp | 2 +-
- mythtv/libs/libmythbase/mythcommandlineparser.cpp | 6 +++---
- 2 files changed, 4 insertions(+), 4 deletions(-)
+ mythtv/bindings/python/MythTV/database.py | 2 +-
+ mythtv/bindings/python/MythTV/dataheap.py | 6 +-
+ mythtv/bindings/python/MythTV/logging.py | 6 +-
+ mythtv/bindings/python/MythTV/system.py | 11 +-
+ .../bindings/python/MythTV/tmdb/XSLT/tmdbQuery.xsl | 99 --
+ .../bindings/python/MythTV/tmdb/XSLT/tmdbVideo.xsl | 157 ---
+ mythtv/bindings/python/MythTV/tmdb/__init__.py | 0
+ mythtv/bindings/python/MythTV/tmdb/tmdb_api.py | 1317 --------------------
+ .../bindings/python/MythTV/tmdb/tmdb_exceptions.py | 45 -
+ mythtv/bindings/python/MythTV/tmdb/tmdb_ui.py | 266 ----
+ mythtv/bindings/python/setup.py | 4 +-
+ mythtv/bindings/python/tmdb3/scripts/pytmdb3.py | 7 +-
+ mythtv/bindings/python/tmdb3/tmdb3/pager.py | 5 +-
+ mythtv/bindings/python/tmdb3/tmdb3/tmdb_api.py | 2 +-
+ mythtv/i18n/mythfrontend_de.qm | Bin 630506 -> 630506 bytes
+ mythtv/i18n/mythfrontend_de.ts | 22 +-
+ mythtv/libs/libmythbase/logging.cpp | 4 +-
+ mythtv/libs/libmythbase/mythcommandlineparser.cpp | 6 +-
+ mythtv/libs/libmythmetadata/metadatadownload.cpp | 8 +-
+ mythtv/libs/libmythtv/avformatdecoder.cpp | 2 +-
+ mythtv/libs/libmythtv/decoderbase.cpp | 5 +-
+ mythtv/libs/libmythtv/eithelper.cpp | 29 +-
+ mythtv/programs/mythfrontend/commandlineparser.cpp | 2 +-
+ mythtv/programs/scripts/hardwareprofile/config.py | 5 +
+ .../distros/mythtv_data/data_mythtv.py | 16 +-
+ .../programs/scripts/hardwareprofile/os_detect.py | 5 +
+ mythtv/programs/scripts/metadata/Movie/tmdb.py | 640 ----------
+ mythtv/programs/scripts/metadata/Movie/tmdb3.py | 8 +-
+ 28 files changed, 114 insertions(+), 2565 deletions(-)
+diff --git a/mythtv/bindings/python/MythTV/database.py
b/mythtv/bindings/python/MythTV/database.py
+index 525a213..368fb9e 100644
+--- a/mythtv/bindings/python/MythTV/database.py
++++ b/mythtv/bindings/python/MythTV/database.py
+@@ -835,7 +835,7 @@ class DatabaseConfig( object ):
+ database = QuickProperty('_database', 'mythconverg')
+
+ @QuickProperty('_profile', gethostname())
+- def profile(self, value):
++ def profile(value):
+ if value == 'my-unique-identifier-goes-here':
+ raise Exception
+ return value
+diff --git a/mythtv/bindings/python/MythTV/dataheap.py
b/mythtv/bindings/python/MythTV/dataheap.py
+index 4a17d6b..268d007 100644
+--- a/mythtv/bindings/python/MythTV/dataheap.py
++++ b/mythtv/bindings/python/MythTV/dataheap.py
+@@ -1136,7 +1136,7 @@ class VideoGrabber( Grabber ):
+ def __init__(self, mode, lang='en', db=None):
+ dbvalue = {'tv':'TelevisionGrabber',
'movie':'MovieGrabber'}
+ path = {'tv':'metadata/Television/ttvdb.py',
+- 'movie':'metadata/Movie/tmdb.py'}
++ 'movie':'metadata/Movie/tmdb3.py'}
+ self.mode = mode.lower()
+ try:
+ Grabber.__init__(self, setting=dbvalue[self.mode], db=db,
+@@ -1144,6 +1144,10 @@ class VideoGrabber( Grabber ):
+ prefix=os.path.join(INSTALL_PREFIX, 'share/mythtv'))
+ except KeyError:
+ raise MythError('Invalid MythVideo grabber')
++
++ if self.path[-7:] == 'tmdb.py':
++ self.path = self.path[:-7] + 'tmdb3.py'
++
+ self.append('-l',lang)
+
+ #### MYTHNETVISION ####
+diff --git a/mythtv/bindings/python/MythTV/logging.py
b/mythtv/bindings/python/MythTV/logging.py
+index f27387f..45ace32 100644
+--- a/mythtv/bindings/python/MythTV/logging.py
++++ b/mythtv/bindings/python/MythTV/logging.py
+@@ -409,11 +409,15 @@ class MythLog( LOGLEVEL, LOGMASK, LOGFACILITY ):
+ def _logdatabase(self, mask, level, message, detail):
+ if self.db and self._DBLOG:
+ with self.db.cursor(DummyLogger()) as cursor:
++ application = argv[0]
++ if '/' in application:
++ application = application.rsplit('/', 1)[1]
++
+ cursor.execute("""INSERT INTO logging
+ (host, application, pid, thread,
+ msgtime, level, message)
+ VALUES (?, ?, ?, ?, ?, ?, ?)""",
+- (self.db.gethostname(), argv[0].rsplit('/', 1)[1],
++ (self.db.gethostname(), application,
+ os.getpid(), self.module, self.time(), level,
+ message + (' -- {0}'.format(detail) if detail else
'')))
+
+diff --git a/mythtv/bindings/python/MythTV/system.py
b/mythtv/bindings/python/MythTV/system.py
+index f24c8a9..44803bd 100644
+--- a/mythtv/bindings/python/MythTV/system.py
++++ b/mythtv/bindings/python/MythTV/system.py
+@@ -79,10 +79,17 @@ class System( DBCache ):
+ self.path = None
+
+ if setting is not None:
+- # pull setting from database, substitute from argument if needed
++ # pull local setting from database
+ host = self.gethostname()
+ self.path = self.settings[host][setting]
+- if (self.path is None) and (path is None):
++ if self.path is None:
++ # see if that setting is applied globally
++ self.path = self.settings['NULL'][setting]
++ if self.path is None:
++ # not set globally either, use supplied default
++ self.path = path
++ if self.path is None:
++ # no default supplied, just error out
+ raise MythDBError(MythError.DB_SETTING, setting, host)
+
+ if self.path is None:
+diff --git a/mythtv/bindings/python/MythTV/tmdb/XSLT/tmdbQuery.xsl
b/mythtv/bindings/python/MythTV/tmdb/XSLT/tmdbQuery.xsl
+deleted file mode 100644
+index f87b72a..0000000
+--- a/mythtv/bindings/python/MythTV/tmdb/XSLT/tmdbQuery.xsl
++++ /dev/null
+@@ -1,99 +0,0 @@
+-<?xml version="1.0" encoding="UTF-8"?>
+-<!--
+-
themoviedb.org query result conversion to MythTV Universal Metadata Format
+- See:
http://www.mythtv.org/wiki/MythTV_Universal_Metadata_Format
+--->
+-<xsl:stylesheet version="1.0"
+-
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+-
xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"
+-
xmlns:tmdbXpath="http://www.mythtv.org/wiki/MythTV_Universal_Metadat...
+-
+- <xsl:output method="xml" indent="yes" version="1.0"
encoding="UTF-8" omit-xml-declaration="yes"/>
+-
+- <!--
+- This template calls all other templates which allows for multiple sources to be
processed
+- within a single Xslt file
+- -->
+- <xsl:template match="/">
+- <xsl:if
test="not(string(opensearch:totalResults)='0')">
+- <metadata>
+- <xsl:call-template name='movieQuery'/>
+- </metadata>
+- </xsl:if>
+- </xsl:template>
+-
+- <xsl:template name="movieQuery">
+- <xsl:for-each select="//movie">
+- <item>
+- <language><xsl:value-of
select="normalize-space(language)"/></language>
+- <xsl:for-each
select="tmdbXpath:titleElement(string(name))">
+- <title><xsl:value-of
select="normalize-space(./@title)"/></title>
+- <xsl:if test="./@subtitle">
+- <subtitle><xsl:value-of
select="normalize-space(./@subtitle)"/></subtitle>
+- </xsl:if>
+- </xsl:for-each>
+- <inetref><xsl:value-of
select="normalize-space(id)"/></inetref>
+- <imdb><xsl:value-of
select="normalize-space(substring-after(string(imdb_id),
'tt'))"/></imdb>
+- <userrating><xsl:value-of
select="normalize-space(rating)"/></userrating>
+- <xsl:if test="./certification/text() != ''">
+- <certifications>
+- <!--
+- This code will need to be modified when multiple country
cerification
+- information is supported. Right now it assumes ONLY ratings
from the US.
+- -->
+- <xsl:for-each select=".//certification">
+- <xsl:element name="certification">
+- <xsl:attribute
name="locale">us</xsl:attribute>
+- <xsl:attribute
name="name"><xsl:value-of
select="normalize-space(.)"/></xsl:attribute>
+- </xsl:element>
+- </xsl:for-each>
+- </certifications>
+- </xsl:if>
+- <description><xsl:value-of
select="normalize-space(overview)"/></description>
+- <releasedate><xsl:value-of
select="normalize-space(released)"/></releasedate>
+- <xsl:if test=".//image[@type='poster'] or
.//image[@type='backdrop']">
+- <images>
+- <xsl:if
test=".//image[@type='poster']">
+- <xsl:element name="image">
+- <xsl:attribute
name="type">coverart</xsl:attribute>
+- <xsl:if test=".//image[@type='poster'
and @size='original']">
+- <xsl:attribute
name="url"><xsl:value-of
select="normalize-space(.//image[@type='poster' and
@size='original']/@url)"/></xsl:attribute>
+- <xsl:if
test=".//image[@type='poster' and @size='original']/@width !=
''">
+- <xsl:attribute
name="width"><xsl:value-of
select="normalize-space(.//image[@type='poster' and
@size='original']/@width)"/></xsl:attribute>
+- </xsl:if>
+- <xsl:if
test=".//image[@type='poster' and @size='original']/@height !=
''">
+- <xsl:attribute
name="height"><xsl:value-of
select="normalize-space(.//image[@type='poster' and
@size='original']/@height)"/></xsl:attribute>
+- </xsl:if>
+- </xsl:if>
+- <xsl:if test=".//image[@type='poster'
and @size='cover']">
+- <xsl:attribute
name="thumb"><xsl:value-of
select="normalize-space(.//image[@type='poster' and
@size='cover']/@url)"/></xsl:attribute>
+- </xsl:if>
[...2678 lines suppressed...]
+- return
+- sys.stdout.write(u'%s:%s\n' % (u'Name', data[u'name']))
+- keys = sorted(data.keys())
+- images = {}
+- for key in keys:
+- if key == u'name':
+- continue
+- if key in ['also_known_as', 'filmography', 'images'
]:
+- if key == 'images':
+- images = {}
+- for k in data[key].keys():
+- images[k] = u''
+- if key == 'also_known_as':
+- alias = u''
+- for k in data[key]:
+- alias+=u'%s|' % k.replace(u'|', u' ')
+- if alias:
+- sys.stdout.write(u'%s:%s\n' % (self.camelcase(key),
alias[:-1]))
+- continue
+- for k in data[key]:
+- if key == 'filmography':
+- kys = sorted(k.keys())
+- filmography = u''
+- for c in kys:
+- if c == u'name':
+- continue
+- filmography+=u'%s:%s|' %
(self.camelcase(c.replace(u'|', u' ')), k[c].replace(u'|', u'
'))
+- if filmography:
+- sys.stdout.write(u'%s:%s|%s\n' %
(self.camelcase(key), k[u'name'].replace(u'|', u' '),
filmography[:-1]))
+- elif key == 'images':
+- sys.stdout.write(u'%s:%s\n' % (self.camelcase(k),
data[key][k]))
+- else:
+- sys.stdout.write(u'%s:%s\n' % (self.camelcase(key), data[key]))
+- # end peopleData()
+-
+- def hashData(self, hash_value):
+- '''Get Movie data by Hash value and display "key:value"
pairs to stdout
+- '''
+- try:
+-
self.displayMovieData(self.config['moviedb'].searchHash(hash_value))
+- except TmdbMovieOrPersonNotFound, msg:
+- #sys.stderr.write(u"%s\n" % msg)
+- return
+- except TmdHttpError, msg:
+- sys.stderr.write(self.error_messages['TmdHttpError'] % msg)
+- sys.exit(1)
+- except TmdXmlError, msg:
+- sys.stderr.write(self.error_messages['TmdXmlError'] % msg)
+- sys.exit(1)
+- except TmdBaseError, msg:
+- sys.stderr.write(self.error_messages['TmdBaseError'] % msg)
+- sys.exit(1)
+- except TmdbUiAbort, msg:
+- sys.stderr.write(self.error_messages['TmdbUiAbort'] % msg)
+- sys.exit(1)
+- except Exception, e:
+- sys.stderr.write(u"! Error: Unknown error during a Hash value Movie
information display for (%s)\nError(%s)\n" % (hash_value, e))
+- sys.exit(1)
+- # end hashData()
+-
+-# end Class moviedbQueries()
+-
+-
+-def main():
+- """Gets movie details using an IMDB# and a TMDB# OR get People
information using a name
+- """
+- #
themoviedb.org api key given by Travis Bell for Mythtv
+- apikey = "c27cb71cff5bd76e1a7a009380562c62"
+-
+- parser = OptionParser(usage=u"%prog usage: tmdb -hdruviomMPFBDS [parameters]\n
<series name or 'series and season number' or 'series and season number and
episode number'>\n\nFor details on using tmdb with Mythvideo see the tmdb wiki page
at:\nhttp://www.mythtv.org/wiki/tmdb.py")
+-
+- parser.add_option( "-d", "--debug",
action="store_true", default=False, dest="debug",
+- help=u"Show debugging info")
+- parser.add_option( "-r", "--raw",
action="store_true",default=False, dest="raw",
+- help=u"Dump raw data only")
+- parser.add_option( "-u", "--usage",
action="store_true", default=False, dest="usage",
+- help=u"Display examples for executing the tmdb
script")
+- parser.add_option( "-v", "--version",
action="store_true", default=False, dest="version",
+- help=u"Display version and author")
+- parser.add_option( "-i", "--interactive",
action="store_true", default=False, dest="interactive",
+- help=u"Interaction mode (allows selection of a specific
Movie or Person)")
+- parser.add_option( "-l", "--language",
metavar="LANGUAGE", default=u'en', dest="language",
+- help=u"Select data that matches the specified language fall
back to english if nothing found (e.g. 'es' EspaƱol, 'de' Deutsch ...
etc)")
+- parser.add_option( "-M", "--movielist",
action="store_true", default=False, dest="movielist",
+- help=u"Get matching Movie list")
+- parser.add_option( "-D", "--moviedata",
action="store_true", default=False, dest="moviedata",
+- help=u"Get Movie metadata including graphic URLs")
+- parser.add_option( "-H", "--moviehash",
action="store_true", default=False, dest="moviehash",
+- help=u"Get Movie metadata including graphic URLs using a
Hash value.\nSee:
http://api.themoviedb.org/2.1/methods/Hash.getInfo")
+- parser.add_option( "-P", "--peoplelist",
action="store_true", default=False, dest="peoplelist",
+- help=u"Get matching People list")
+- parser.add_option( "-I", "--peopleinfo",
action="store_true", default=False, dest="peopleinfo",
+- help=u"Get A Person's metadata including graphic
URLs")
+- parser.add_option( "-t", action="store_true", default=False,
dest="test",
+- help=u"Test for the availability of runtime
dependencies")
+-
+- opts, args = parser.parse_args()
+-
+- # Test mode, if we've made it here, everything is ok
+- if opts.test:
+- print "Everything appears to be in order"
+- sys.exit(0)
+-
+- # Make all command line arguments unicode utf8
+- for index in range(len(args)):
+- args[index] = unicode(args[index], 'utf8')
+-
+- if opts.debug:
+- sys.stdout.write("\nopts: %s\n" % opts)
+- sys.stdout.write("\nargs: %s\n\n" % args)
+-
+- # Process version command line requests
+- if opts.version:
+- version = etree.XML(u'<grabber></grabber>')
+- etree.SubElement(version, "name").text = __title__
+- etree.SubElement(version, "author").text = __author__
+- etree.SubElement(version, "thumbnail").text = 'tmdb.png'
+- etree.SubElement(version, "command").text = 'tmdb.py'
+- etree.SubElement(version, "type").text = 'movie'
+- etree.SubElement(version, "description").text = 'Search and
metadata downloads for themoviedb.org'
+- etree.SubElement(version, "version").text = __version__
+- sys.stdout.write(etree.tostring(version, encoding='UTF-8',
pretty_print=True))
+- sys.exit(0)
+-
+- # Process usage command line requests
+- if opts.usage:
+- sys.stdout.write(__usage_examples__)
+- sys.exit(0)
+-
+- if not len(args) == 1:
+- sys.stderr.write("! Error: There must be one value for any option. Your
options are (%s)\n" % (args))
+- sys.exit(1)
+-
+- if args[0] == u'':
+- sys.stderr.write("! Error: There must be a non-empty argument, yours is
empty.\n")
+- sys.exit(1)
+-
+- Queries = moviedbQueries(apikey,
+- mythtv = True,
+- interactive = opts.interactive,
+- select_first = False,
+- debug = opts.debug,
+- custom_ui = None,
+- language = opts.language,
+- search_all_languages = False,)
+-
+- # Display in XML format
+- # See:
http://www.mythtv.org/wiki/MythTV_Universal_Metadata_Format
+- Queries.config['moviedb'].xml = True
+-
+- # Process requested option
+- if opts.movielist: # Movie Search -M
+- Queries.movieSearch(args[0])
+- elif opts.moviedata: # Movie metadata -D
+- Queries.movieData(args[0])
+- elif opts.peoplelist: # People Search -P
+- Queries.peopleSearch(args[0])
+- elif opts.peopleinfo: # Person metadata -I
+- Queries.peopleData(args[0])
+- elif opts.moviehash: # Movie metadata using a hash value -H
+- Queries.hashData(args[0])
+-
+- sys.exit(0)
+-# end main()
+-
+-if __name__ == '__main__':
+- main()
+diff --git a/mythtv/programs/scripts/metadata/Movie/tmdb3.py
b/mythtv/programs/scripts/metadata/Movie/tmdb3.py
+index cc1ca16..9e4edcb 100755
+--- a/mythtv/programs/scripts/metadata/Movie/tmdb3.py
++++ b/mythtv/programs/scripts/metadata/Movie/tmdb3.py
+@@ -11,7 +11,7 @@
+ #-----------------------
+ __title__ = "TheMovieDB.org V3"
+ __author__ = "Raymond Wagner"
+-__version__ = "0.3.5"
++__version__ = "0.3.6"
+ # 0.1.0 Initial version
+ # 0.2.0 Add language support, move cache to home directory
+ # 0.3.0 Enable version detection to allow use in MythTV
+@@ -21,6 +21,9 @@ __version__ = "0.3.5"
+ # 0.3.3 Use translated title if available
+ # 0.3.4 Add support for finding by IMDB under -D (simulate previous version)
+ # 0.3.5 Add debugging mode
++# 0.3.6 Add handling for TMDB site and library returning null results in
++# search. This should only need to be a temporary fix, and should be
++# resolved upstream.
+
+ from optparse import OptionParser
+ import sys
+@@ -116,6 +119,9 @@ def buildList(query, opts):
+
+ count = 0
+ for res in results:
++ if res is None:
++ continue
++
+ m = VideoMetadata()
+ for i,j in mapping:
+ if getattr(res, j):
Index: mythtv.spec
===================================================================
RCS file: /cvs/free/rpms/mythtv/F-19/mythtv.spec,v
retrieving revision 1.123
retrieving revision 1.124
diff -u -r1.123 -r1.124
--- mythtv.spec 23 Aug 2013 18:25:30 -0000 1.123
+++ mythtv.spec 3 Oct 2013 12:05:01 -0000 1.124
@@ -60,7 +60,7 @@
%define desktop_vendor RPMFusion
# Git revision and branch ID
-%define _gitrev v0.26.1-1-g6a46ea0
+%define _gitrev v0.26.1-24-g9fd7c61
%define branch fixes/0.26
#
@@ -76,7 +76,7 @@
%if "%{branch}" == "master"
Release: 0.1.git.%{_gitrev}%{?dist}
%else
-Release: 1%{?dist}
+Release: 4%{?dist}
%endif
# The primary license is GPLv2+, but bits are borrowed from a number of
@@ -102,10 +102,12 @@
%if 0%{?rhel}
%define with_crystalhd %{?_without_crystalhd: 1} %{?!_without_crystalhd: 0}
%define with_systemd %{?_without_systemd: 1} %{?!_without_systemd: 0}
+%define with_vpx %{?_without_vpx: 1} %{?!_without_vpx: 0}
%else
%define with_crystalhd %{?_without_crystalhd: 0} %{?!_without_crystalhd: 1}
%define with_systemd %{?_without_systemd: 0} %{?!_without_systemd: 1}
+%define with_vpx %{?_without_vpx: 0} %{?!_without_vpx: 1}
%endif
%define with_perl %{?_without_perl: 0} %{!?_without_perl: 1}
@@ -139,6 +141,8 @@
Patch1: mythlogserver-segv.patch
Patch2: mythtv-0.26.0-types_h.patch
Patch3: mythtv-0.26.1-libva_121.patch
+#
http://code.mythtv.org/trac/ticket/11338
+Patch4: mythtv-0.26-libcec2.patch
Source10: PACKAGE-LICENSING
Source11: ChangeLog
@@ -181,8 +185,10 @@
BuildRequires: qt-devel >= 4.6
BuildRequires: phonon-devel phonon-backend-gstreamer
BuildRequires: libuuid-devel
+%if 0%{?fedora}
BuildRequires: libcec-devel
BuildRequires: libvpx-devel
+%endif
BuildRequires: lm_sensors-devel
BuildRequires: lirc-devel
@@ -361,6 +367,7 @@
Requires: mysql-server >= 5, mysql >= 5
%endif
Requires: xmltv
+Requires: udisks
# Generate the required mythtv-frontend-api version string here so we only
# have to do it once.
@@ -837,6 +844,7 @@
%patch1 -p1 -b .mythlogserver
%patch2 -p1 -b .types_h
%patch3 -p1 -b .libva
+%patch4 -p1 -b .libcec
# Install ChangeLog
install -m 0644 %{SOURCE11} .
@@ -909,7 +917,9 @@
--enable-libx264 \
--enable-libtheora --enable-libvorbis \
--enable-libxvid \
+%if %{with_vpx}
--enable-libvpx \
+%endif
%if %{with_vdpau}
--enable-vdpau \
%endif
@@ -948,9 +958,11 @@
%endif
--enable-debug
-# Insert rpm version-release for mythbackend --version output
- echo 'SOURCE_VERSION="%{version}-%{release} (%_gitrev)"' >
VERSION
- echo 'BRANCH="%{branch}"' >>
VERSION
+# Set the mythtv --version string
+ cat > VERSION <<EOF
+SOURCE_VERSION=%{_gitrev}
+BRANCH=%{branch}
+EOF
# Make
make %{?_smp_mflags}
@@ -1168,6 +1180,7 @@
usermod -a -G audio,video mythtv
exit 0
+%if %{with_mythmusic}
%pre -n mythmusic
# Add the "mythtv" user, with membership in the audio and video group
getent group mythtv >/dev/null || groupadd -r mythtv
@@ -1178,6 +1191,7 @@
# or new installs.
usermod -a -G audio,video mythtv
exit 0
+%endif
%post backend
%if %{with_systemd}
@@ -1459,6 +1473,15 @@
%changelog
+* Tue Oct 1 2013 Richard Shaw <hobbes1069(a)gmail.com> - 0.26.1-4
+- Update to latest bugfix release.
+- Add patch for libcec 2.
+- Update to latest bugfix release.
+- Add udisks as a requirement as it is required for ejecting cd/dvds.
+
+* Mon Sep 30 2013 Nicolas Chauvet <kwizart(a)gmail.com> - 0.26.1-2
+- Rebuilt
+
* Thu Aug 22 2013 Richard Shaw <hobbes1069(a)gmail.com> - 0.26.1-1
- Update to latest bugfix release.
- Add patch for new libva 1.2.1 version in rawhide.