Patches for Xbox hack

Tom Wilson
2011-10-07
2013-05-30
  • Tom Wilson

    Tom Wilson - 2011-10-07

    Hi, I have some patches to make mediatomb work with an xbox.
    I can get video (avi files) and pictures (jpeg) to work serve from my mac to an xbox 360.
    Audio will not work with media tomb do to missing search function.
    Thanks to work on jem  and information at http://code.google.com/p/jems/wiki/XBox360Notes for background info.
    As always these patches worked for me, your mileage may vary.

    These are code  diffs

    diff -Naur mediatomb-0.12.1.orig/src/common.h mediatomb-0.12.1/src/common.h
    --- mediatomb-0.12.1.orig/src/common.h  2010-03-25 10:58:11.000000000 -0400
    +++ mediatomb-0.12.1/src/common.h       2011-07-31 12:32:25.000000000 -0400
    @@ -50,7 +50,7 @@
     #define UPNP_E_NOT_EXIST                706
     // UPnP default classes
    -#define UPNP_DEFAULT_CLASS_CONTAINER    "object.container"
    +#define UPNP_DEFAULT_CLASS_CONTAINER    "object.container.StorageFolder"
     #define UPNP_DEFAULT_CLASS_ITEM         "object.item"
     #define UPNP_DEFAULT_CLASS_VIDEO_ITEM   "object.item.videoItem"
     #define UPNP_DEFAULT_CLASS_IMAGE_ITEM   "object.item.imageItem"
    diff -Naur mediatomb-0.12.1.orig/src/storage/sql_storage.cc mediatomb-0.12.1/src/storage/sql_storage.cc
    --- mediatomb-0.12.1.orig/src/storage/sql_storage.cc    2010-03-25 11:28:10.000000000 -0400
    +++ mediatomb-0.12.1/src/storage/sql_storage.cc 2011-10-07 07:18:08.000000000 -0400
    @@ -2322,6 +2322,8 @@
             throw _Exception(_("could not load lastID (row==nil)"));
         lastID = row->col(0).toInt();
    +    if (lastID < 1000)
    +         lastID = 1000; // reset lastId to avoid creating id in microsoft defined space
         if (lastID < CDS_ID_FS_ROOT)
             throw _Exception(_("could not load correct lastID (db not initialized?)"));
     }
    diff -Naur mediatomb-0.12.1.orig/src/upnp_cds_actions.cc mediatomb-0.12.1/src/upnp_cds_actions.cc
    --- mediatomb-0.12.1.orig/src/upnp_cds_actions.cc       2010-03-25 10:58:11.000000000 -0400
    +++ mediatomb-0.12.1/src/upnp_cds_actions.cc    2011-10-07 07:19:35.000000000 -0400
    @@ -55,13 +55,43 @@
         String RequestedCount = req->getChildText(_("RequestedCount"));
         // String SortCriteria; // not yet supported
    -    //log_debug("Browse received parameters: ObjectID [%s] BrowseFlag [%s] StartingIndex [%s] RequestedCount [%s]\n",
    -//            ObjectID.c_str(), BrowseFlag.c_str(), StartingIndex.c_str(), RequestedCount.c_str());
    +//  log_debug("Browse received parameters: objID [%s] BrowseFlag [%s] StartingIndex [%s] RequestedCount [%s]\n",
    +//            objID.c_str(), BrowseFlag.c_str(), StartingIndex.c_str(), RequestedCount.c_str());
    -
    -    if (objID == nil)
    -        throw UpnpException(UPNP_E_NO_SUCH_ID, _("empty object id"));
    -    else
    +
    +    if (objID == nil) {
    +       String containerID = req->getChildText(_("ContainerID"));
    +        if (containerID == nil) {
    +               throw UpnpException(UPNP_E_NO_SUCH_ID, _("empty container id"));
    +        } else {
    +
    +               String category_title = "";
    +               if (containerID == "15") { /* XBOX Video request */
    +                  category_title = "Video";
    +               } else if (containerID == "14") { /* XBOX Audio Request */
    +                  category_title = "Audio";
    +               } else if (containerID == "16") { /* XBOX Photo Request */
    +                  category_title = "Photos";
    +               }
    +                       if (category_title != "") {
    +                           unsigned int flag = BROWSE_ITEMS | BROWSE_CONTAINERS | BROWSE_DIRECT_CHILDREN;
    +                       Ref<BrowseParam> param(new BrowseParam(0, flag));
    +                       Ref<Array<CdsObject> > arr;
    +
    +                               arr = storage->browse(param);
    +                               for(int i = 0; i < arr->size(); i++) {
    +                                       Ref<CdsObject> obj = arr->get(i);
    +                                       String title = obj->getTitle();
    +                                       if (category_title == title) {
    +                                               objectID = obj->getID();
    +                                               break;
    +                                       }
    +                               }
    +                       } else {
    +                         objectID = containerID.toInt();
    +                       }
    +        }
    +    } else
             objectID = objID.toInt();
         unsigned int flag = BROWSE_ITEMS | BROWSE_CONTAINERS | BROWSE_EXACT_CHILDCOUNT;
    

    There are the config.xml differs required for xbox to see media tomb and mime types
    Important changes are <modelName> and : in <name>

    --- config.xml.orig     2011-10-06 09:25:42.000000000 -0400
    +++ config.xml  2011-10-07 07:23:54.000000000 -0400
    @@ -6,33 +6,35 @@
             <account user="mediatomb" password="mediatomb"/>
           </accounts>
         </ui>
    -    <name>Tom Mac : MediaTomb</name>
    -    <udn>uuid:aee906d6-dcb7-463b-b3e3-62e8ba1caf88</udn>
    +    <name>MediaTomb</name>
    +    <udn>uuid:0827a32a-2432-43fc-bc22-56f929ac6ff0</udn>
         <home>/Users/tomcwilson/.mediatomb</home>
    -    <webroot>/opt/local/share/mediatomb/web</webroot>
    -    <storage caching="yes">
    +    <webroot>/usr/local/share/mediatomb/web</webroot>
    +    <storage>
           <sqlite3 enabled="yes">
             <database-file>mediatomb.db</database-file>
           </sqlite3>
         </storage>
    -    <protocolInfo extend="no"/><!-- For PS3 support change to "yes" --><!--
    +    <protocolInfo extend="no"/><!-- For PS3 support change to "yes" -->
    +    <!--
            Uncomment the lines below to get rid of jerky avi playback on the
            DSM320 or to enable subtitles support on the DSM units
    +    -->
    +    <!--
         <custom-http-headers>
           <add header="X-User-Agent: redsonic"/>
         </custom-http-headers>
    -    -->
    -    <manufacturerURL>tomcwilson.com</manufacturerURL>
    -    <friendlyName>Tom Wilson : TombMedia</friendlyName>
    -    <modelName>Windows Media Connect</modelName>
    -    <modelNumber>100</modelNumber>
    -    <!-- Uncomment the line below if you have a Telegent TG100 --><!--
    +    <manufacturerURL>redsonic.com</manufacturerURL>
    +    <modelNumber>105</modelNumber>
    +    -->
    +    <!-- Uncomment the line below if you have a Telegent TG100 -->
    +    <!--
            <upnp-string-limit>101</upnp-string-limit>
         -->
         <extended-runtime-options>
           <mark-played-items enabled="no" suppress-cds-updates="yes">
    -        <string mode="prepend">•</string>
    +        <string mode="prepend">*</string>
             <mark>
               <content>video</content>
             </mark>
    @@ -41,16 +43,20 @@
       </server>
       <import hidden-files="no">
         <scripting script-charset="UTF-8">
    -      <common-script>/opt/local/share/mediatomb/js/common.js</common-script>
    -      <playlist-script>/opt/local/share/mediatomb/js/playlists.js</playlist-script>
    -      <virtual-layout type="js">
    -        <import-script>/opt/local/share/mediatomb/js/import.js</import-script>
    +      <common-script>/usr/local/share/mediatomb/js/common.js</common-script>
    +      <playlist-script>/usr/local/share/mediatomb/js/playlists.js</playlist-script>
    +      <virtual-layout type="builtin">
    +        <import-script>/usr/local/share/mediatomb/js/import.js</import-script>
           </virtual-layout>
         </scripting>
         <mappings>
           <extension-mimetype ignore-unknown="no">
             <map from="mp3" to="audio/mpeg"/>
    -        <map from="ogg" to="application/ogg"/>
    +        <map from="ogx" to="application/ogg"/>
    +        <map from="ogv" to="video/ogg"/>
    +        <map from="oga" to="audio/ogg"/>
    +        <map from="ogg" to="audio/ogg"/>
    +        <map from="ogm" to="video/ogg"/>
             <map from="asf" to="video/x-ms-asf"/>
             <map from="asx" to="video/x-ms-asf"/>
             <map from="wma" to="audio/x-ms-wma"/>
    @@ -61,14 +67,18 @@
             <map from="wmx" to="video/x-ms-wmx"/>
             <map from="m3u" to="audio/x-mpegurl"/>
             <map from="pls" to="audio/x-scpls"/>
    -        <map from="avi" to="video/avi"/>
    -        <map from="flv" to="video/x-flv"/><!-- Uncomment the line below for PS3 divx support --><!-- <map from="avi" to="video/divx"/> --><!-- Uncomment the line below for D-Link DSM / ZyXEL DMA-1000 -->
    +        <map from="flv" to="video/x-flv"/>
    +        <map from="mkv" to="video/x-matroska"/>
    +        <map from="mka" to="audio/x-matroska"/>
    +        <!-- Uncomment the line below for PS3 divx support -->
    +        <!-- <map from="avi" to="video/divx"/> -->
    +        <!-- Uncomment the line below for D-Link DSM / ZyXEL DMA-1000 -->
             <!-- <map from="avi" to="video/avi"/> -->
           </extension-mimetype>
           <mimetype-upnpclass>
             <map from="audio/*" to="object.item.audioItem.musicTrack"/>
             <map from="video/*" to="object.item.videoItem"/>
    -        <map from="image/*" to="object.item.imageItem.photo"/>
    +        <map from="image/*" to="object.item.imageItem"/>
           </mimetype-upnpclass>
           <mimetype-contenttype>
             <treat mimetype="audio/mpeg" as="mp3"/>
    @@ -79,7 +89,11 @@
             <treat mimetype="audio/x-scpls" as="playlist"/>
             <treat mimetype="audio/x-wav" as="pcm"/>
             <treat mimetype="audio/L16" as="pcm"/>
    -        <treat mimetype="video/x-msvideo" as="video/avi"/>
    +        <treat mimetype="video/x-msvideo" as="avi"/>
    +        <treat mimetype="video/mp4" as="mp4"/>
    +        <treat mimetype="audio/mp4" as="mp4"/>
    +        <treat mimetype="application/x-iso9660" as="dvd"/>
    +        <treat mimetype="application/x-iso9660-image" as="dvd"/>
           </mimetype-contenttype>
         </mappings>
         <online-content>
    @@ -105,7 +119,7 @@
             <accept-url>no</accept-url>
             <first-resource>yes</first-resource>
             <accept-ogg-theora>no</accept-ogg-theora>
    -        <agent command="ogg123" arguments="-d raw -f %out %in"/>
    +        <agent command="ogg123" arguments="-d raw -o byteorder:big -f %out %in"/>
             <buffer size="1048576" chunk-size="131072" fill-size="262144"/>
           </profile>
           <profile name="vlcmpeg" enabled="no" type="external">
    @@ -118,4 +132,4 @@
           </profile>
         </profiles>
       </transcoding>
    -</config>
    +</config>
    
     
  • Leland Mills

    Leland Mills - 2012-06-21

    MediaTomb developers - thanks for the great program.
    Tom - thanks for the insightful patch.

    I've taken the patch Tom provided and worked it so that music works on my Xbox.  I took some shortcuts, and am sure that other renderers won't receive much benefit from this, but Xbox was my priority.

    --- mediatomb-0.12.1.orig/src/common.h  2010-03-25 09:58:11.000000000 -0500
    +++ mediatomb-0.12.1/src/common.h   2012-06-21 09:49:20.000000000 -0500
    @@ -50,7 +50,7 @@
     #define UPNP_E_NOT_EXIST                706
    
     // UPnP default classes
    -#define UPNP_DEFAULT_CLASS_CONTAINER    "object.container"
    +#define UPNP_DEFAULT_CLASS_CONTAINER    "object.container.storageFolder"
     #define UPNP_DEFAULT_CLASS_ITEM         "object.item"
     #define UPNP_DEFAULT_CLASS_VIDEO_ITEM   "object.item.videoItem"
     #define UPNP_DEFAULT_CLASS_IMAGE_ITEM   "object.item.imageItem"
    --- mediatomb-0.12.1.orig/src/config_manager.cc 2010-03-25 09:58:11.000000000 -0500
    +++ mediatomb-0.12.1/src/config_manager.cc  2012-06-21 09:49:28.000000000 -0500
    @@ -613,7 +613,7 @@
         mtupnp->appendElementChild(map_from_to(_("video/*"), 
                                    _(UPNP_DEFAULT_CLASS_VIDEO_ITEM)));
         mtupnp->appendElementChild(map_from_to(_("image/*"), 
    -                               _("object.item.imageItem")));
    +                               _("object.item.imageItem.photo")));
    
         mappings->appendElementChild(mtupnp);
    
    --- mediatomb-0.12.1.orig/src/tools.cc  2010-03-25 09:58:11.000000000 -0500
    +++ mediatomb-0.12.1/src/tools.cc   2012-06-19 17:14:09.000000000 -0500
    @@ -664,9 +664,9 @@
         m = seconds % 60;
         h = seconds / 60;
    
    -    // XXX:XX:XX
    -    char *str = (char *)malloc(10);
    -    sprintf(str, "%02d:%02d:%02d", h, m, s);
    +    // XXX:XX:XX.0 (Xbox wants decimal)
    +    char *str = (char *)malloc(12);
    +    sprintf(str, "%02d:%02d:%02d.0", h, m, s);
         return String::take(str);
     }
    
    --- mediatomb-0.12.1.orig/src/tools.h   2010-03-25 09:58:11.000000000 -0500
    +++ mediatomb-0.12.1/src/tools.h    2012-06-19 17:15:09.000000000 -0500
    @@ -194,7 +194,7 @@
     zmm::String getProtocol(zmm::String protocolInfo);
    
    -/// \brief Converts a number of seconds to H+:MM:SS representation as required by
    +/// \brief Converts a number of seconds to H+:MM:SS.0 representation as required by
     /// the UPnP spec
     zmm::String secondsToHMS(int seconds);
    
    --- mediatomb-0.12.1.orig/src/storage.h 2010-03-25 09:58:11.000000000 -0500
    +++ mediatomb-0.12.1/src/storage.h  2012-06-20 09:22:42.000000000 -0500
    @@ -59,6 +59,9 @@
         // output parameters
         int totalMatches;
         
    +    // For constraining search
    +    zmm::String title;
    +
     public:
         inline BrowseParam(int objectID, unsigned int flags)
         {
    @@ -66,6 +69,7 @@
             this->flags = flags;
             startingIndex = 0;
             requestedCount = 0;
    +        title = nil;
         }
         
         inline int getFlags() { return flags; }
    @@ -96,6 +100,10 @@
         inline void setTotalMatches(int totalMatches)
         { this->totalMatches = totalMatches; }
         
    +    inline zmm::String getTitle() { return title; }
    +    inline void setTitle(zmm::String title)
    +    { this->title = title; }
    +    
     };
    
     class Storage : public Singleton<Storage>
    --- mediatomb-0.12.1.orig/src/storage/sql_storage.cc    2010-03-25 10:28:10.000000000 -0500
    +++ mediatomb-0.12.1/src/storage/sql_storage.cc 2012-06-20 09:26:49.000000000 -0500
    @@ -748,6 +748,13 @@
             
             *qb << TQD('f',"parent_id") << '=' << objectID;
             
    +        String title = param->getTitle();
    +        if (title != nil) 
    +        {
    +            *qb << " AND " << TQD('f',"dc_title") << '='
    +                << quote (title);
    +        }
    +        
             if (objectID == CDS_ID_ROOT && hideFsRoot)
                 *qb << " AND " << TQD('f',"id") << "!="
                     << quote (CDS_ID_FS_ROOT);
    @@ -2322,6 +2329,8 @@
             throw _Exception(_("could not load lastID (row==nil)"));
         
         lastID = row->col(0).toInt();
    +    if (lastID < 1000)
    +         lastID = 1000; // reset lastId to avoid creating id in microsoft defined space
         if (lastID < CDS_ID_FS_ROOT)
             throw _Exception(_("could not load correct lastID (db not initialized?)"));
     }
    --- mediatomb-0.12.1.orig/src/upnp_xml.cc   2010-03-25 09:58:11.000000000 -0500
    +++ mediatomb-0.12.1/src/upnp_xml.cc    2012-06-21 10:38:52.000000000 -0500
    @@ -33,6 +33,7 @@
         #include "autoconfig.h"
     #endif
    
    +#include <unistd.h>
     #include "upnp_xml.h"
     #include "server.h"
     #include "cds_resource_manager.h"
    @@ -230,16 +231,36 @@
         else
             device->appendTextChild(_("presentationURL"), presentationURL);
    
    -    device->appendTextChild(_("friendlyName"), 
    -                              config->getOption(CFG_SERVER_NAME));
    +    String friendlyName = config->getOption(CFG_SERVER_NAME);
    +#if defined(ENABLE_MRREG)
    +    if (friendlyName.index(':') < 1)
    +    {
    +        // xbox really wants a colon in the name
    +        char machineName[32];
    +        if (gethostname(machineName, sizeof(machineName)) == 0)
    +        {
    +            String newName = friendlyName + ": " + _(machineName);
    +            friendlyName = newName;
    +        }
    +    }
    +#endif
    +    device->appendTextChild(_("friendlyName"), friendlyName);
    
         device->appendTextChild(_("manufacturer"), _(DESC_MANUFACTURER));
         device->appendTextChild(_("manufacturerURL"), 
                                    config->getOption(CFG_SERVER_MANUFACTURER_URL));
         device->appendTextChild(_("modelDescription"), 
                                   config->getOption(CFG_SERVER_MODEL_DESCRIPTION));
    -    device->appendTextChild(_("modelName"), 
    -                              config->getOption(CFG_SERVER_MODEL_NAME));
    +    String modelName = config->getOption(CFG_SERVER_MODEL_NAME);
    +#if defined(ENABLE_MRREG)
    +    // xbox needs this prefix
    +    if (!modelName.startsWith(_("Windows Media Connect")))
    +    {
    +        String newName = _("Windows Media Connect Compatible (") + modelName + ')';
    +        modelName = newName;
    +    }
    +#endif
    +    device->appendTextChild(_("modelName"), modelName);
         device->appendTextChild(_("modelNumber"), 
                                   config->getOption(CFG_SERVER_MODEL_NUMBER));
         device->appendTextChild(_("serialNumber"), 
    --- mediatomb-0.12.1.orig/src/upnp_cds_actions.cc   2010-03-25 09:58:11.000000000 -0500
    +++ mediatomb-0.12.1/src/upnp_cds_actions.cc    2012-06-21 11:45:02.000000000 -0500
    @@ -52,20 +52,95 @@
         String BrowseFlag = req->getChildText(_("BrowseFlag"));
         //String Filter; // not yet supported
         String StartingIndex = req->getChildText(_("StartingIndex"));
    +    int startingIndex = StartingIndex.toInt();
    +    int idIncrement = 0;
         String RequestedCount = req->getChildText(_("RequestedCount"));
    +    String OverrideClass = nil;
         // String SortCriteria; // not yet supported
    +    unsigned int flag = BROWSE_ITEMS | BROWSE_CONTAINERS | BROWSE_EXACT_CHILDCOUNT;
    
         //log_debug("Browse received parameters: ObjectID [%s] BrowseFlag [%s] StartingIndex [%s] RequestedCount [%s]\n",
     //            ObjectID.c_str(), BrowseFlag.c_str(), StartingIndex.c_str(), RequestedCount.c_str());
    
    -    if (objID == nil)
    +    if (objID == nil) {
    +#if !defined(ENABLE_MRREG)
             throw UpnpException(UPNP_E_NO_SUCH_ID, _("empty object id"));
    -    else
    +#else
    +        // xbox support
    +        String containerID = req->getChildText(_("ContainerID"));
    +        String SearchCriteria = req->getChildText(_("SearchCriteria"));
    +        if (BrowseFlag == nil) {
    +            BrowseFlag = "BrowseDirectChildren";
    +        }
    +        if (containerID == nil) {
    +            throw UpnpException(UPNP_E_NO_SUCH_ID, _("empty container id"));
    +        } else {
    +            Ref<Array<StringBase> > categoryTree(new Array<StringBase>());
    +            if (containerID == "15") {
    +                categoryTree->append(_("Video"));
    +            } else if (containerID == "14") {
    +                categoryTree->append(_("Audio"));
    +            } else if (containerID == "16") {
    +                categoryTree->append(_("Photos"));
    +                if (SearchCriteria.find(_("upnp:class = \"object.item.imageItem.photo\"")) >= 0) {
    +                    categoryTree->append(_("All Photos"));       // Xbox wants all photos
    +                }
    +            } else if (containerID == "4") {
    +                categoryTree->append(_("Audio"));
    +                categoryTree->append(_("All Audio"));
    +            } else if (containerID == "5") {
    +                categoryTree->append(_("Audio"));
    +                categoryTree->append(_("Genres"));
    +            } else if (containerID == "6") {
    +                categoryTree->append(_("Audio"));
    +                categoryTree->append(_("Artists"));
    +                OverrideClass = UPNP_DEFAULT_CLASS_MUSIC_ARTIST;  // Xbox wants to see artists returned
    +                idIncrement = 1;                                  // Xbox uses the id of artist to get all songs
    +            } else if (containerID == "7") {
    +                categoryTree->append(_("Audio"));
    +                categoryTree->append(_("Albums"));
    +            } else if (containerID == "F") {
    +                categoryTree->append(_("Audio"));
    +                categoryTree->append(_("Playlists"));
    +#define XBOX_ARTIST_SEARCH "(upnp:artist = \""
    +            } else if (containerID == "1" && SearchCriteria.find(_(XBOX_ARTIST_SEARCH)) > 0) {
    +                // Xbox sux.  I've got a PS3 myself.  We told them the id already
    +                // but, they want to search all over again for the artist
    +                categoryTree->append(_("Audio"));
    +                categoryTree->append(_("Artists"));
    +                int startIndex = SearchCriteria.find(_(XBOX_ARTIST_SEARCH)) + strlen(XBOX_ARTIST_SEARCH);
    +                int endIndex = SearchCriteria.rindex('"');
    +                categoryTree->append(SearchCriteria.substring(startIndex, endIndex - startIndex));
    +                // Skip the 2 all categories
    +                startingIndex+=2;
    +            }
    +
    +            if (categoryTree->size() > 0) {
    +                unsigned int cflag = BROWSE_ITEMS | BROWSE_CONTAINERS | BROWSE_DIRECT_CHILDREN;
    +                objectID = 0;
    +                for (int i = 0; i < categoryTree->size(); i++) {
    +                    Ref<BrowseParam> param(new BrowseParam(objectID, cflag));
    +                    String title = categoryTree->get(i);
    +                    param->setTitle(title);
    +                    Ref<Array<CdsObject> > arr;
    +                    arr = storage->browse(param);
    +                    if (arr->size() == 1) {
    +                        Ref<CdsObject> obj = arr->get(0);
    +                        objectID = arr->get(0)->getID();
    +                    } else {
    +                        log_debug("Unable to find container by name of %s\n", title.c_str());
    +                        flag = 0;
    +                    }
    +                }
    +            } else {
    +                objectID = containerID.toInt();
    +            }
    +        }
    +#endif
    +    } else
             objectID = objID.toInt();
         
    -    unsigned int flag = BROWSE_ITEMS | BROWSE_CONTAINERS | BROWSE_EXACT_CHILDCOUNT;
    -    
         if(BrowseFlag == "BrowseDirectChildren")
             flag |= BROWSE_DIRECT_CHILDREN;
         else if (BrowseFlag != "BrowseMetadata")
    @@ -82,7 +157,7 @@
    
         Ref<BrowseParam> param(new BrowseParam(objectID, flag));
    
    -    param->setStartingIndex(StartingIndex.toInt());
    +    param->setStartingIndex(startingIndex);
         param->setRequestedCount(RequestedCount.toInt());
         
         Ref<Array<CdsObject> > arr;
    @@ -120,6 +195,14 @@
    
                 obj->setTitle(title);
             }
    +        if (OverrideClass != nil)
    +        {
    +            obj->setClass(OverrideClass);
    +        }
    +        if (idIncrement != 0)
    +        {
    +            obj->setID(obj->getID()+idIncrement);
    +        }
    
             Ref<Element> didl_object = UpnpXML_DIDLRenderObject(obj, false, stringLimit);
    
    @@ -181,7 +264,7 @@
     {
         log_debug("start\n");
    
    -    if (request->getActionName() == "Browse")
    +    if (request->getActionName() == "Browse" || request->getActionName() == "Search")
         {
             upnp_action_Browse(request);
         }
    
     
  • Anonymous - 2012-07-29

    Awesome!  When can we expect an official switch for this within MediaTomb?  It looks like some of the code can be put in verbatim, and the rest can be dependent on, say, a config.xml switch.

     
  • Anonymous - 2012-07-30

    Actually, it looks like most of the code is tied to the ENABLE_MRREG switch, anyway.

    I've compiled lelandmills' patch, and I'm trying to get the configuration to work the way it should for XBox 360.  I think transcoding needs to be turned on for certain formats.  I'll play around with it, look at some file format docs for the 360, and get back to you with some recommended XML settings.

     
  • jessendeen

    jessendeen - 2017-06-12
    Post awaiting moderation.

Log in to post a comment.