Ticket #303: 303.patch

File 303.patch, 11.8 KB (added by danielk, 14 years ago)

updated version of patch (not reviewed yet).

  • mythplugins/mythdvd/mythdvd/main.cpp

     
    273273void initKeys(void)
    274274{
    275275    REG_JUMP("Play DVD", "Play a DVD", "", playDVD);
    276     REG_MEDIA_HANDLER("MythDVD DVD Media Handler", "", "", handleDVDMedia, MEDIATYPE_DVD);
     276    REG_MEDIA_HANDLER("MythDVD DVD Media Handler", "", "",
     277                      handleDVDMedia, MEDIATYPE_DVD, NULL);
     278
    277279    REG_JUMP("Play VCD", "Play a VCD", "", playVCD);
    278     REG_MEDIA_HANDLER("MythDVD VCD Media Handler", "", "", handleVCDMedia, MEDIATYPE_VCD);
     280    REG_MEDIA_HANDLER("MythDVD VCD Media Handler", "", "",
     281                      handleVCDMedia, MEDIATYPE_VCD, NULL);
     282
    279283    REG_JUMP("Rip DVD", "Import a DVD into your MythVideo database", "",
    280284             startDVDRipper);
    281285}
  • mythplugins/mythmusic/mythmusic/main.cpp

     
    520520    REG_KEY("Music", "INCSEARCHNEXT", "Incremental search find next match", "Ctrl+N");
    521521
    522522    REG_MEDIA_HANDLER("MythMusic Media Handler", "", "", handleMedia,
    523                       MEDIATYPE_AUDIO | MEDIATYPE_MIXED);
     523                      MEDIATYPE_AUDIO | MEDIATYPE_MIXED, NULL);
    524524}
    525525
    526526int mythplugin_init(const char *libversion)
  • mythplugins/mythgallery/mythgallery/main.cpp

     
    9292    REG_KEY("Gallery", "DELETE", "Delete marked images or current image if none are marked", "D");
    9393    REG_KEY("Gallery", "MARK", "Mark image", "T");
    9494
    95     REG_MEDIA_HANDLER("MythGallery Media Handler", "", "", handleMedia, MEDIATYPE_DATA | MEDIATYPE_MIXED);
     95    REG_MEDIA_HANDLER("MythGallery Media Handler", "", "", handleMedia,
     96                      MEDIATYPE_DATA | MEDIATYPE_MIXED, NULL);
    9697}
    9798
    9899int mythplugin_init(const char *libversion)
  • mythtv/libs/libmythui/mythmainwindow.cpp

     
    908908                                          const QString &description,
    909909                                          const QString &key,
    910910                              void (*callback)(MythMediaDevice*mediadevice),
    911                                           int mediaType)
     911                                          int mediaType,
     912                                          const QString &extensions)
    912913{
    913914    (void)key;
    914915
     
    920921                                   .arg(destination));
    921922
    922923        d->mediaHandlerMap[destination] = mhd;
     924
     925        MediaMonitor *mon = NULL;
     926        if (!extensions.isEmpty() && (mon = MediaMonitor::GetMediaMonitor()))
     927            mon->MonitorRegisterExtensions(mediaType, extensions);
    923928    }
    924929    else
    925930    {
  • mythtv/libs/libmythui/mythmainwindow.h

     
    3636#define REG_KEY(a, b, c, d) GetMythMainWindow()->RegisterKey(a, b, c, d)
    3737#define GET_KEY(a, b) GetMythMainWindow()->GetKey(a, b)
    3838#define REG_JUMP(a, b, c, d) GetMythMainWindow()->RegisterJump(a, b, c, d)
    39 #define REG_MEDIA_HANDLER(a, b, c, d, e) GetMythMainWindow()->RegisterMediaHandler(a, b, c, d, e)
     39#define REG_MEDIA_HANDLER(a, b, c, d, e, f) GetMythMainWindow()->RegisterMediaHandler(a, b, c, d, e, f)
    4040#define REG_MEDIAPLAYER(a,b,c) GetMythMainWindow()->RegisterMediaPlugin(a, b, c)
    4141
    4242typedef  int (*MediaPlayCallback)(const char*,  const char*, const char*, const char*, int, const char*);
     
    7070    void RegisterMediaHandler(const QString &destination,
    7171                              const QString &description, const QString &key,
    7272                              void (*callback)(MythMediaDevice* mediadevice),
    73                               int mediaType);
     73                              int mediaType, const QString &extensions);
    7474
    7575    void RegisterMediaPlugin(const QString &name, const QString &desc,
    7676                             MediaPlayCallback fn);
  • mythtv/libs/libmyth/mythmedia.cpp

     
    77
    88// Qt Headers
    99#include <qfile.h>
     10#include <qdir.h>
    1011
    1112// MythTV headers
    1213#include "mythmedia.h"
     
    4243    "MEDIATYPE_MIXED",
    4344    "MEDIATYPE_AUDIO",
    4445    "MEDIATYPE_DVD",
    45     "MEDIATYPE_VCD"
     46    "MEDIATYPE_VCD",
     47    "MEDIATYPE_MMUSIC",
     48    "MEDIATYPE_MVIDEO",
     49    "MEDIATYPE_MGALLERY",
    4650};
    4751
    4852const char* MythMediaDevice::MediaErrorStrings[] =
     
    123127                isMounted(true);
    124128                m_Status = MEDIASTAT_MOUNTED;
    125129                onDeviceMounted();
     130                DetectMediaType();
    126131            }
    127132            else
    128133                onDeviceUnmounted();
     
    141146        // We just need to give derived classes a chance to perform their
    142147        // mount / unmount logic.
    143148        if (DoMount)
     149        {
    144150            onDeviceMounted();
     151            DetectMediaType();
     152        }
    145153        else
    146154            onDeviceUnmounted();
    147155        return true;
     
    149157    return false;
    150158}
    151159
     160//
     161// Try to make an educated guess about the type of data present on the Media.
     162// This fuction changes m_MediaType accordingly.
     163//
     164void MythMediaDevice::DetectMediaType(void)
     165{
     166    ScanMediaType(m_MountPath);
     167
     168    if (ExtensionArray.isEmpty())
     169    {
     170        VERBOSE(VB_GENERAL, QString("No files with extensions found in '%1'")
     171                .arg(m_MountPath));
     172        return;
     173    }
     174
     175    int score = 0, highscore = 0, type = 0;
     176
     177    const ExtensionMap *em;
     178    for (em = ExtensionMapList.first(); em; em = ExtensionMapList.next())
     179    {
     180        QStringList::const_iterator it;
     181        for (it = em->Extensions.begin(); it != em->Extensions.end(); ++it)
     182        {
     183            if (ExtensionArray.contains(*it))
     184                score += ExtensionArray[*it];
     185        }
     186
     187        VERBOSE(VB_ALL, QString("Looking for: '%1', Score: %2")
     188                .arg(MediaTypeStrings[ffs(em->Mediatype)])
     189                .arg(score));
     190
     191        if (score > highscore)
     192            type = em->Mediatype;
     193
     194        highscore = max(score, highscore);
     195
     196        score = 0;
     197    }
     198
     199    if (type != 0)
     200        m_MediaType = (MediaType)type;
     201
     202    ExtensionArray.clear();
     203}
     204
     205//
     206// Recursively scan directories and create an associative array with
     207// key: 'tolower(extension)' and value the number of times we've
     208// seen it.
     209//
     210void MythMediaDevice::ScanMediaType(const QString& directory)
     211{
     212    QDir d(directory);
     213
     214    d.setSorting(QDir::DirsFirst | QDir::Name | QDir::IgnoreCase);
     215    if (!d.exists())
     216            return;
     217
     218    const QFileInfoList *list = d.entryInfoList();
     219    if (!list)                       
     220        return;
     221
     222    QFileInfoListIterator it(*list);
     223    QFileInfo *fi;
     224
     225    while ((fi = it.current()) != 0)
     226    {
     227        ++it;
     228        if (fi->fileName() == "." || fi->fileName() == ".." )
     229                continue;
     230        if (!fi->isDir())
     231        {
     232            QString extension = fi->extension(false);
     233            if (!extension.isEmpty())
     234            {
     235                extension = extension.lower();
     236                if (ExtensionArray.contains(extension))
     237                    ExtensionArray[extension]++;
     238                else
     239                    ExtensionArray[extension] = 1;
     240            }
     241        }
     242        else ScanMediaType(fi->absFilePath());
     243    }
     244}
     245
     246//
     247// Allow Plugin's to register their supported MediaType and the file
     248// extensions that map to it.
     249// The extensions argument is a comma separated list of extensions like:
     250//    'mp3,ogg,flac'.
     251//
     252void MythMediaDevice::MediaRegisterExtensions(const int mediatype, const QString& extensions)
     253{
     254    ExtensionMap *eMap = new ExtensionMap;
     255    eMap->Mediatype  = mediatype;
     256    eMap->Extensions = QStringList::split(",", extensions, "");
     257
     258    if (eMap->Extensions.count() == 0)
     259    {
     260        VERBOSE(VB_IMPORTANT, QString("Empty setting for entry: '%1'")
     261                .arg(mediatype));
     262
     263        delete eMap;
     264        return;
     265    }
     266    ExtensionMapList.append(eMap);
     267}
     268
    152269MediaError MythMediaDevice::eject(bool open_close)
    153270{
    154271    (void) open_close;
  • mythtv/libs/libmyth/mythmediamonitor.h

     
    7070    // it is safe to dereference the pointer. When finished call Unlock()
    7171    QValueList<MythMediaDevice*> GetMedias(MediaType mediatype);
    7272
     73    void MonitorRegisterExtensions(int mediaType, const QString &extensions);
     74
    7375  public slots:
    7476    void mediaStatusChanged(MediaStatus oldStatus, MythMediaDevice* pMedia);
    7577
  • mythtv/libs/libmyth/mythmediamonitor.cpp

     
    842842    return medias;
    843843}
    844844
     845//
     846// Register the extension list on all known devices
     847//
     848void MediaMonitor::MonitorRegisterExtensions(int mediaType,
     849                                             const QString &extensions)
     850{
     851    QValueList<MythMediaDevice*>::iterator itr = m_Devices.begin();
     852    for (; itr != m_Devices.end(); ++itr)
     853    {
     854        if (*itr)
     855            (*itr)->MediaRegisterExtensions(mediaType, extensions);
     856    }
     857}
     858
    845859// Signal handler.
    846860void MediaMonitor::mediaStatusChanged(MediaStatus oldStatus,
    847861                                      MythMediaDevice* pMedia)
  • mythtv/libs/libmyth/mythmedia.h

     
    33
    44#include <qobject.h>
    55#include <qstring.h>
     6#include <qstringlist.h>
    67
    78typedef enum {
    89    MEDIASTAT_ERROR,
     
    2021    MEDIATYPE_MIXED=4,
    2122    MEDIATYPE_AUDIO=8,
    2223    MEDIATYPE_DVD=16,
    23     MEDIATYPE_VCD=32
     24    MEDIATYPE_VCD=32,
     25    MEDIATYPE_MMUSIC=64,
     26    MEDIATYPE_MVIDEO=128,
     27    MEDIATYPE_MGALLERY=256
    2428} MediaType;
    2529
    2630typedef enum {
     
    7680    bool mount() {  return performMountCmd(true); }
    7781    bool unmount() { return performMountCmd(false); }
    7882    bool isMounted(bool bVerify = false);
     83
     84    void MediaRegisterExtensions(const int mediatype,const QString& extensions);
     85
    7986   
    8087    static const char* MediaStatusStrings[];
    8188    static const char* MediaTypeStrings[];
     
    9198    virtual void onDeviceMounted() {};
    9299    virtual void onDeviceUnmounted() {};
    93100
     101    void DetectMediaType(void);
     102    void ScanMediaType(const QString& directory);
    94103    MediaStatus setStatus(MediaStatus newStat, bool CloseIt=false);
    95104
    96105    QString m_MountPath;        ///< The path to this media's mount point (i.e. /mnt/cdrom). Read only.
     
    104113    int m_DeviceHandle;         ///< A file handle for opening and closing the device.
    105114    MediaType m_MediaType;      ///< The type of media
    106115    bool m_SuperMount;          ///< Is this a supermount device?
     116    QMap<QString, int> ExtensionArray; ///< current tally of extensions on the disk
     117    typedef struct {
     118        int         Mediatype;
     119        QStringList Extensions;
     120    } ExtensionMap;
     121    QPtrList<ExtensionMap> ExtensionMapList; ///< Map extansions to a mediatype
     122
    107123};
    108124
    109125#endif