kaffeine codecs autoinstallation patch
Sergey Rudchenko
sergey.rudchenko at gmail.com
Thu Nov 8 10:59:44 GMT 2007
diff -ur
base-kaffeine/kaffeine/src/player-parts/kaffeine-part/kaffeinepart.cpp
kaffeine-0.8.5/kaffeine/src/player-parts/kaffeine-part/kaffeinepart.cpp
---
base-kaffeine/kaffeine/src/player-parts/kaffeine-part/kaffeinepart.cpp
2007-07-28 19:45:37.000000000 +0300
+++
kaffeine-0.8.5/kaffeine/src/player-parts/kaffeine-part/kaffeinepart.cpp
2007-11-08 12:45:44.000000000 +0200
@@ -19,6 +19,12 @@
*/
#include "kaffeinepart.h"
+#include <kapplication.h>
+#include <kservice.h>
+#include <ktrader.h>
+#include <kmessagebox.h>
+#include <krun.h>
+#include <klocale.h>
#include "kaffeinepart.moc"
@@ -30,3 +36,34 @@
KaffeinePart::~KaffeinePart()
{
}
+
+bool KaffeinePart::installDistroCodec(QWidget* parent, const QString&
engine, const QString& codec)
+{
+ QString query = QString("[X-KDE-Kaffeine-codec] == '%1' and
[X-KDE-Kaffeine-engine] == '%2'").arg(codec).arg(engine);
+
+ KService::Ptr service = KTrader::self()->query(
"Kaffeine/CodecInstall", query).first();
+
+
+ if (service)
+ {
+ QString installScript = service->exec();
+
+ if (!installScript.isNull()) //just a sanity check
+ {
+ KGuiItem installButton("Install Codecs");
+
+ if (KMessageBox::questionYesNo(parent,
+ i18n("Kaffeine currently
cannot play opened files."),
+ i18n( "No codec Support" ),
+ installButton,
+ KStdGuiItem::no(),
+ "codecInstallWarning" ) ==
KMessageBox::Yes )
+ {
+ KRun::runCommand(installScript);
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
diff -ur
base-kaffeine/kaffeine/src/player-parts/kaffeine-part/kaffeinepart.h
kaffeine-0.8.5/kaffeine/src/player-parts/kaffeine-part/kaffeinepart.h
---
base-kaffeine/kaffeine/src/player-parts/kaffeine-part/kaffeinepart.h
2007-07-28 19:45:37.000000000 +0300
+++
kaffeine-0.8.5/kaffeine/src/player-parts/kaffeine-part/kaffeinepart.h
2007-11-08 12:47:14.000000000 +0200
@@ -199,6 +199,11 @@
virtual void slotMute()
{}
+ /*
+ * Execute distro-dependent actions to install codecs
+ */
+ static bool installDistroCodec(QWidget* parent, const QString&
engine, const QString& codec);
+
private:
/*
* Don't reimplement this, a player should be able to stream media
diff -ur
base-kaffeine/kaffeine/src/player-parts/xine-part/kxinewidget.cpp
kaffeine-0.8.5/kaffeine/src/player-parts/xine-part/kxinewidget.cpp
--- base-kaffeine/kaffeine/src/player-parts/xine-part/kxinewidget.cpp
2007-11-08 11:48:23.000000000 +0200
+++ kaffeine-0.8.5/kaffeine/src/player-parts/xine-part/kxinewidget.cpp
2007-11-07 22:54:17.000000000 +0200
@@ -37,6 +37,7 @@
#include <cmath>
#include "kxinewidget.h"
+#include "kaffeinepart.h"
#ifdef HAVE_XINERAMA
#include <X11/extensions/Xinerama.h>
@@ -762,6 +763,12 @@
parentWidget()->resize(m_newParentSize);
break;
}
+ case XINE_MSG_ENCRYPTED_SOURCE:
+ {
+ if (KaffeinePart::installDistroCodec(this, "xine-engine",
"ffmpeg"))
+ return;
+
+ }
default: break;
}
}
@@ -1918,6 +1925,14 @@
return;
}
+ if (!xine_get_stream_info(m_xineStream,
XINE_STREAM_INFO_AUDIO_HANDLED) ||
+ !xine_get_stream_info(m_xineStream,
XINE_STREAM_INFO_VIDEO_HANDLED))
+ {
+ errorOut("No codecs to handle media");
+ sendXineError();
+ return;
+ }
+
/**** use visualization ? ****/
#ifndef USE_QT_ONLY
unwireAudioFilters();
@@ -2136,6 +2151,9 @@
case XINE_ERROR_NO_INPUT_PLUGIN:
case XINE_ERROR_NO_DEMUX_PLUGIN:
{
+ if (m_trackURL.startsWith("dvd:/") &&
KaffeinePart::installDistroCodec(this, "xine-engine", "ffmpeg"))
+ return;
+
error = i18n("No plugin found to handle this resource") + "
" + addInfo;
break;
}
@@ -2156,6 +2174,13 @@
}
default:
{
+ if (!xine_get_stream_info(m_xineStream,
XINE_STREAM_INFO_AUDIO_HANDLED) ||
+ !xine_get_stream_info(m_xineStream,
XINE_STREAM_INFO_VIDEO_HANDLED))
+ {
+ if (KaffeinePart::installDistroCodec(this,
"xine-engine", "ffmpeg"))
+ return;
+ }
+
error = i18n("Generic error") + " (" + m_trackURL + ")";
break;
}
More information about the kubuntu-devel
mailing list