Index: mythplugins/mythdvd/mythdvd/main.cpp
===================================================================
--- mythplugins/mythdvd/mythdvd/main.cpp	(revision 9936)
+++ mythplugins/mythdvd/mythdvd/main.cpp	(working copy)
@@ -273,9 +273,13 @@
 void initKeys(void)
 {
     REG_JUMP("Play DVD", "Play a DVD", "", playDVD);
-    REG_MEDIA_HANDLER("MythDVD DVD Media Handler", "", "", handleDVDMedia, MEDIATYPE_DVD);
+    REG_MEDIA_HANDLER("MythDVD DVD Media Handler", "", "",
+                      handleDVDMedia, MEDIATYPE_DVD, NULL);
+
     REG_JUMP("Play VCD", "Play a VCD", "", playVCD);
-    REG_MEDIA_HANDLER("MythDVD VCD Media Handler", "", "", handleVCDMedia, MEDIATYPE_VCD);
+    REG_MEDIA_HANDLER("MythDVD VCD Media Handler", "", "",
+                      handleVCDMedia, MEDIATYPE_VCD, NULL);
+
     REG_JUMP("Rip DVD", "Import a DVD into your MythVideo database", "", 
              startDVDRipper);
 }
Index: mythplugins/mythmusic/mythmusic/main.cpp
===================================================================
--- mythplugins/mythmusic/mythmusic/main.cpp	(revision 9936)
+++ mythplugins/mythmusic/mythmusic/main.cpp	(working copy)
@@ -520,7 +520,7 @@
     REG_KEY("Music", "INCSEARCHNEXT", "Incremental search find next match", "Ctrl+N");
 
     REG_MEDIA_HANDLER("MythMusic Media Handler", "", "", handleMedia,
-                      MEDIATYPE_AUDIO | MEDIATYPE_MIXED);
+                      MEDIATYPE_AUDIO | MEDIATYPE_MIXED, NULL);
 }
 
 int mythplugin_init(const char *libversion)
Index: mythplugins/mythgallery/mythgallery/main.cpp
===================================================================
--- mythplugins/mythgallery/mythgallery/main.cpp	(revision 9936)
+++ mythplugins/mythgallery/mythgallery/main.cpp	(working copy)
@@ -92,7 +92,8 @@
     REG_KEY("Gallery", "DELETE", "Delete marked images or current image if none are marked", "D");
     REG_KEY("Gallery", "MARK", "Mark image", "T");
 
-    REG_MEDIA_HANDLER("MythGallery Media Handler", "", "", handleMedia, MEDIATYPE_DATA | MEDIATYPE_MIXED);
+    REG_MEDIA_HANDLER("MythGallery Media Handler", "", "", handleMedia,
+                      MEDIATYPE_DATA | MEDIATYPE_MIXED, NULL);
 }
 
 int mythplugin_init(const char *libversion)
Index: mythtv/libs/libmythui/mythmainwindow.cpp
===================================================================
--- mythtv/libs/libmythui/mythmainwindow.cpp	(revision 9998)
+++ mythtv/libs/libmythui/mythmainwindow.cpp	(working copy)
@@ -908,7 +908,8 @@
                                           const QString &description,
                                           const QString &key, 
                               void (*callback)(MythMediaDevice*mediadevice),
-                                          int mediaType)
+                                          int mediaType,
+                                          const QString &extensions)
 {
     (void)key;
 
@@ -920,6 +921,10 @@
                                    .arg(destination));
 
         d->mediaHandlerMap[destination] = mhd;
+
+        MediaMonitor *mon = NULL;
+        if (!extensions.isEmpty() && (mon = MediaMonitor::GetMediaMonitor()))
+            mon->MonitorRegisterExtensions(mediaType, extensions);
     }
     else 
     {
Index: mythtv/libs/libmythui/mythmainwindow.h
===================================================================
--- mythtv/libs/libmythui/mythmainwindow.h	(revision 9998)
+++ mythtv/libs/libmythui/mythmainwindow.h	(working copy)
@@ -36,7 +36,7 @@
 #define REG_KEY(a, b, c, d) GetMythMainWindow()->RegisterKey(a, b, c, d)
 #define GET_KEY(a, b) GetMythMainWindow()->GetKey(a, b)
 #define REG_JUMP(a, b, c, d) GetMythMainWindow()->RegisterJump(a, b, c, d)
-#define REG_MEDIA_HANDLER(a, b, c, d, e) GetMythMainWindow()->RegisterMediaHandler(a, b, c, d, e)
+#define REG_MEDIA_HANDLER(a, b, c, d, e, f) GetMythMainWindow()->RegisterMediaHandler(a, b, c, d, e, f)
 #define REG_MEDIAPLAYER(a,b,c) GetMythMainWindow()->RegisterMediaPlugin(a, b, c)
 
 typedef  int (*MediaPlayCallback)(const char*,  const char*, const char*, const char*, int, const char*);
@@ -70,7 +70,7 @@
     void RegisterMediaHandler(const QString &destination,
                               const QString &description, const QString &key,
                               void (*callback)(MythMediaDevice* mediadevice),
-                              int mediaType);
+                              int mediaType, const QString &extensions);
 
     void RegisterMediaPlugin(const QString &name, const QString &desc,
                              MediaPlayCallback fn);
Index: mythtv/libs/libmyth/mythmedia.cpp
===================================================================
--- mythtv/libs/libmyth/mythmedia.cpp	(revision 9998)
+++ mythtv/libs/libmyth/mythmedia.cpp	(working copy)
@@ -7,6 +7,7 @@
 
 // Qt Headers
 #include <qfile.h>
+#include <qdir.h>
 
 // MythTV headers
 #include "mythmedia.h"
@@ -42,7 +43,10 @@
     "MEDIATYPE_MIXED",
     "MEDIATYPE_AUDIO",
     "MEDIATYPE_DVD",
-    "MEDIATYPE_VCD"
+    "MEDIATYPE_VCD",
+    "MEDIATYPE_MMUSIC",
+    "MEDIATYPE_MVIDEO",
+    "MEDIATYPE_MGALLERY",
 };
 
 const char* MythMediaDevice::MediaErrorStrings[] =
@@ -123,6 +127,7 @@
                 isMounted(true);
                 m_Status = MEDIASTAT_MOUNTED;
                 onDeviceMounted();
+                DetectMediaType();
             }
             else
                 onDeviceUnmounted();
@@ -141,7 +146,10 @@
         // We just need to give derived classes a chance to perform their 
         // mount / unmount logic.
         if (DoMount)
+        {
             onDeviceMounted();
+            DetectMediaType();
+        }
         else
             onDeviceUnmounted();
         return true;
@@ -149,6 +157,115 @@
     return false;
 }
 
+//
+// Try to make an educated guess about the type of data present on the Media.
+// This fuction changes m_MediaType accordingly.
+//
+void MythMediaDevice::DetectMediaType(void)
+{
+    ScanMediaType(m_MountPath);
+
+    if (ExtensionArray.isEmpty())
+    {
+        VERBOSE(VB_GENERAL, QString("No files with extensions found in '%1'")
+                .arg(m_MountPath));
+        return;
+    }
+
+    int score = 0, highscore = 0, type = 0;
+
+    const ExtensionMap *em;
+    for (em = ExtensionMapList.first(); em; em = ExtensionMapList.next())
+    {
+        QStringList::const_iterator it;
+        for (it = em->Extensions.begin(); it != em->Extensions.end(); ++it)
+        {
+            if (ExtensionArray.contains(*it))
+                score += ExtensionArray[*it];
+        }
+
+        VERBOSE(VB_ALL, QString("Looking for: '%1', Score: %2")
+                .arg(MediaTypeStrings[ffs(em->Mediatype)])
+                .arg(score));
+
+        if (score > highscore)
+            type = em->Mediatype;
+
+        highscore = max(score, highscore);
+
+        score = 0;
+    }
+
+    if (type != 0)
+        m_MediaType = (MediaType)type;
+
+    ExtensionArray.clear();
+}
+
+//
+// Recursively scan directories and create an associative array with
+// key: 'tolower(extension)' and value the number of times we've
+// seen it.
+//
+void MythMediaDevice::ScanMediaType(const QString& directory)
+{
+    QDir d(directory);
+
+    d.setSorting(QDir::DirsFirst | QDir::Name | QDir::IgnoreCase);
+    if (!d.exists())
+            return;
+
+    const QFileInfoList *list = d.entryInfoList();
+    if (!list)                        
+        return;
+
+    QFileInfoListIterator it(*list);
+    QFileInfo *fi;
+
+    while ((fi = it.current()) != 0)
+    {
+        ++it;
+        if (fi->fileName() == "." || fi->fileName() == ".." )
+                continue;
+        if (!fi->isDir())
+        {
+            QString extension = fi->extension(false);
+            if (!extension.isEmpty())
+            {
+                extension = extension.lower();
+                if (ExtensionArray.contains(extension))
+                    ExtensionArray[extension]++;
+                else
+                    ExtensionArray[extension] = 1;
+            }
+        }
+        else ScanMediaType(fi->absFilePath());
+    }
+}
+
+//
+// Allow Plugin's to register their supported MediaType and the file
+// extensions that map to it.
+// The extensions argument is a comma separated list of extensions like:
+//    'mp3,ogg,flac'.
+//
+void MythMediaDevice::MediaRegisterExtensions(const int mediatype, const QString& extensions)
+{
+    ExtensionMap *eMap = new ExtensionMap;
+    eMap->Mediatype  = mediatype;
+    eMap->Extensions = QStringList::split(",", extensions, "");
+
+    if (eMap->Extensions.count() == 0)
+    {
+        VERBOSE(VB_IMPORTANT, QString("Empty setting for entry: '%1'")
+                .arg(mediatype));
+
+        delete eMap;
+        return;
+    }
+    ExtensionMapList.append(eMap);
+}
+
 MediaError MythMediaDevice::eject(bool open_close)
 {
     (void) open_close;
Index: mythtv/libs/libmyth/mythmediamonitor.h
===================================================================
--- mythtv/libs/libmyth/mythmediamonitor.h	(revision 9998)
+++ mythtv/libs/libmyth/mythmediamonitor.h	(working copy)
@@ -70,6 +70,8 @@
     // it is safe to dereference the pointer. When finished call Unlock()
     QValueList<MythMediaDevice*> GetMedias(MediaType mediatype);
 
+    void MonitorRegisterExtensions(int mediaType, const QString &extensions);
+
   public slots:
     void mediaStatusChanged(MediaStatus oldStatus, MythMediaDevice* pMedia);
 
Index: mythtv/libs/libmyth/mythmediamonitor.cpp
===================================================================
--- mythtv/libs/libmyth/mythmediamonitor.cpp	(revision 9998)
+++ mythtv/libs/libmyth/mythmediamonitor.cpp	(working copy)
@@ -842,6 +842,20 @@
     return medias;
 }
 
+//
+// Register the extension list on all known devices
+//
+void MediaMonitor::MonitorRegisterExtensions(int mediaType,
+                                             const QString &extensions)
+{
+    QValueList<MythMediaDevice*>::iterator itr = m_Devices.begin();
+    for (; itr != m_Devices.end(); ++itr)
+    {
+        if (*itr)
+            (*itr)->MediaRegisterExtensions(mediaType, extensions);
+    }
+}
+
 // Signal handler.
 void MediaMonitor::mediaStatusChanged(MediaStatus oldStatus, 
                                       MythMediaDevice* pMedia)
Index: mythtv/libs/libmyth/mythmedia.h
===================================================================
--- mythtv/libs/libmyth/mythmedia.h	(revision 9998)
+++ mythtv/libs/libmyth/mythmedia.h	(working copy)
@@ -3,6 +3,7 @@
 
 #include <qobject.h>
 #include <qstring.h>
+#include <qstringlist.h>
 
 typedef enum {
     MEDIASTAT_ERROR,
@@ -20,7 +21,10 @@
     MEDIATYPE_MIXED=4,
     MEDIATYPE_AUDIO=8,
     MEDIATYPE_DVD=16,
-    MEDIATYPE_VCD=32
+    MEDIATYPE_VCD=32,
+    MEDIATYPE_MMUSIC=64,
+    MEDIATYPE_MVIDEO=128,
+    MEDIATYPE_MGALLERY=256
 } MediaType;
 
 typedef enum {
@@ -76,6 +80,9 @@
     bool mount() {  return performMountCmd(true); }
     bool unmount() { return performMountCmd(false); }
     bool isMounted(bool bVerify = false);
+
+    void MediaRegisterExtensions(const int mediatype,const QString& extensions);
+
     
     static const char* MediaStatusStrings[];
     static const char* MediaTypeStrings[];
@@ -91,6 +98,8 @@
     virtual void onDeviceMounted() {};
     virtual void onDeviceUnmounted() {};
 
+    void DetectMediaType(void);
+    void ScanMediaType(const QString& directory);
     MediaStatus setStatus(MediaStatus newStat, bool CloseIt=false);
 
     QString m_MountPath;        ///< The path to this media's mount point (i.e. /mnt/cdrom). Read only.
@@ -104,6 +113,13 @@
     int m_DeviceHandle;         ///< A file handle for opening and closing the device.
     MediaType m_MediaType;      ///< The type of media
     bool m_SuperMount;          ///< Is this a supermount device?
+    QMap<QString, int> ExtensionArray; ///< current tally of extensions on the disk
+    typedef struct {
+        int         Mediatype;
+        QStringList Extensions;
+    } ExtensionMap;
+    QPtrList<ExtensionMap> ExtensionMapList; ///< Map extansions to a mediatype
+
 };
 
 #endif
