diff -urN 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 14:08:57.000000000 +0200 @@ -19,6 +19,12 @@ */ #include "kaffeinepart.h" +#include +#include +#include +#include +#include +#include #include "kaffeinepart.moc" @@ -30,3 +36,33 @@ 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 -urN 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 -urN 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 #include "kxinewidget.h" +#include "kaffeinepart.h" #ifdef HAVE_XINERAMA #include @@ -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; }