diff --git mythtv/libs/libmythupnp/upnpcds.cpp mythtv/libs/libmythupnp/upnpcds.cpp
index eadf9e7..046d74a 100644
|
|
|
void UPnpCDS::HandleSearch( HTTPRequest *pRequest )
|
| 531 | 531 | // ---------------------------------------------------------------------- |
| 532 | 532 | // -=>TODO: Need to process all expressions in searchCriteria... for now, |
| 533 | 533 | // Just focus on the "upnp:class derivedfrom" expression |
| | 534 | // and the "upnp:class =" expression |
| 534 | 535 | // ---------------------------------------------------------------------- |
| 535 | 536 | |
| 536 | 537 | for ( QStringList::Iterator it = request.m_sSearchList.begin(); |
| 537 | 538 | it != request.m_sSearchList.end(); |
| 538 | 539 | ++it ) |
| 539 | 540 | { |
| 540 | | if ((*it).contains("upnp:class derivedfrom", Qt::CaseInsensitive)) |
| | 541 | if ((*it).contains("upnp:class derivedfrom", Qt::CaseInsensitive) || |
| | 542 | (*it).contains("upnp:class =", Qt::CaseInsensitive)) |
| 541 | 543 | { |
| 542 | 544 | QStringList sParts = (*it).split(' ', QString::SkipEmptyParts); |
| 543 | 545 | |
| … |
… |
void UPnpCDS::HandleSearch( HTTPRequest *pRequest )
|
| 545 | 547 | { |
| 546 | 548 | request.m_sSearchClass = sParts[2].trimmed(); |
| 547 | 549 | request.m_sSearchClass.remove( '"' ); |
| | 550 | request.m_sSearchClass.remove( ')' ); |
| 548 | 551 | |
| 549 | 552 | break; |
| 550 | 553 | } |
| … |
… |
UPnpCDSExtensionResults *UPnpCDSExtension::Search( UPnpCDSRequest *pRequest )
|
| 822 | 825 | |
| 823 | 826 | UPnpCDSExtensionResults *pResults = new UPnpCDSExtensionResults(); |
| 824 | 827 | |
| 825 | | CreateItems( pRequest, pResults, 0, "", false ); |
| | 828 | QString sKey = ""; |
| | 829 | if (IsOurContainerPrefix(pRequest->m_sContainerID)) |
| | 830 | { |
| | 831 | sKey = RemoveContainerPrefix(pRequest->m_sContainerID); |
| | 832 | } |
| | 833 | CreateItems( pRequest, pResults, 0, sKey, false ); |
| 826 | 834 | |
| 827 | 835 | return pResults; |
| 828 | 836 | } |
| … |
… |
void UPnpCDSExtension::CreateItems( UPnpCDSRequest *pRequest,
|
| 1324 | 1332 | pResults->m_nTotalMatches = 0; |
| 1325 | 1333 | pResults->m_nUpdateID = 1; |
| 1326 | 1334 | |
| 1327 | | UPnpCDSRootInfo *pInfo = GetRootInfo( nNodeIdx ); |
| | 1335 | UPnpCDSRootInfo *pInfo = GetRootInfo( nNodeIdx, pRequest->m_sContainerID ); |
| 1328 | 1336 | |
| 1329 | 1337 | if (pInfo == NULL) |
| 1330 | 1338 | return; |
diff --git mythtv/libs/libmythupnp/upnpcds.h mythtv/libs/libmythupnp/upnpcds.h
index 446f232..30bf8d0 100644
|
|
|
class UPNP_PUBLIC UPnpCDSExtension
|
| 167 | 167 | |
| 168 | 168 | protected: |
| 169 | 169 | |
| | 170 | virtual bool IsOurContainerPrefix(QString sContainerID) { return false; }; |
| | 171 | virtual QString RemoveContainerPrefix(QString sContainerID) { return sContainerID; }; |
| 170 | 172 | QString RemoveToken ( const QString &sToken, const QString &sStr, int num ); |
| 171 | 173 | |
| 172 | 174 | virtual UPnpCDSExtensionResults *ProcessRoot ( UPnpCDSRequest *pRequest, |
| … |
… |
class UPNP_PUBLIC UPnpCDSExtension
|
| 202 | 204 | |
| 203 | 205 | // ------------------------------------------------------------------ |
| 204 | 206 | |
| 205 | | virtual UPnpCDSRootInfo *GetRootInfo ( int nIdx) = 0; |
| | 207 | virtual UPnpCDSRootInfo *GetRootInfo ( int nIdx, QString sContainerId = "" ) = 0; |
| 206 | 208 | virtual int GetRootCount ( ) = 0; |
| 207 | 209 | virtual QString GetTableName ( QString sColumn ) = 0; |
| 208 | 210 | virtual QString GetItemListSQL( QString sColumn = "" ) = 0; |
diff --git mythtv/programs/mythbackend/mediaserver.cpp mythtv/programs/mythbackend/mediaserver.cpp
index c039017..0c2946a 100644
|
|
|
|
| 16 | 16 | #include "upnpcdstv.h" |
| 17 | 17 | #include "upnpcdsmusic.h" |
| 18 | 18 | #include "upnpcdsvideo.h" |
| | 19 | #include "upnpcdsmusicalbum.h" |
| 19 | 20 | |
| 20 | 21 | #include <QScriptEngine> |
| 21 | 22 | |
| … |
… |
void MediaServer::Init(bool bIsMaster, bool bDisableUPnp /* = FALSE */)
|
| 229 | 230 | "MediaServer::Registering UPnpCDSVideo Extension"); |
| 230 | 231 | |
| 231 | 232 | RegisterExtension(new UPnpCDSVideo()); |
| | 233 | |
| | 234 | LOG(VB_UPNP, LOG_INFO, |
| | 235 | "MediaServer::Registering UPnpCDSMusicAlbum Extension"); |
| | 236 | |
| | 237 | RegisterExtension(new UPnpCDSMusicAlbum()); |
| 232 | 238 | } |
| 233 | 239 | |
| 234 | 240 | #if 0 |
diff --git mythtv/programs/mythbackend/mythbackend.pro mythtv/programs/mythbackend/mythbackend.pro
index ac8742c..46a9866 100644
|
|
|
HEADERS += playbacksock.h scheduler.h server.h housekeeper.h backendutil.h
|
| 23 | 23 | HEADERS += upnpcdstv.h upnpcdsmusic.h upnpcdsvideo.h mediaserver.h |
| 24 | 24 | HEADERS += internetContent.h main_helpers.h backendcontext.h |
| 25 | 25 | HEADERS += httpconfig.h mythsettings.h commandlineparser.h |
| | 26 | HEADERS += upnpcdsmusicalbum.h |
| 26 | 27 | |
| 27 | 28 | HEADERS += serviceHosts/mythServiceHost.h serviceHosts/guideServiceHost.h |
| 28 | 29 | HEADERS += serviceHosts/contentServiceHost.h serviceHosts/dvrServiceHost.h |
| … |
… |
SOURCES += housekeeper.cpp backendutil.cpp
|
| 37 | 38 | SOURCES += upnpcdstv.cpp upnpcdsmusic.cpp upnpcdsvideo.cpp mediaserver.cpp |
| 38 | 39 | SOURCES += internetContent.cpp main_helpers.cpp backendcontext.cpp |
| 39 | 40 | SOURCES += httpconfig.cpp mythsettings.cpp commandlineparser.cpp |
| | 41 | SOURCES += upnpcdsmusicalbum.cpp |
| 40 | 42 | |
| 41 | 43 | SOURCES += services/myth.cpp services/guide.cpp services/content.cpp |
| 42 | 44 | SOURCES += services/dvr.cpp services/channel.cpp services/video.cpp |
diff --git mythtv/programs/mythbackend/upnpcdsmusic.cpp mythtv/programs/mythbackend/upnpcdsmusic.cpp
index 57cc570..c2aa0a7 100644
|
|
|
UPnpCDSRootInfo UPnpCDSMusic::g_RootNodes[] =
|
| 109 | 109 | |
| 110 | 110 | int UPnpCDSMusic::g_nRootCount = sizeof( g_RootNodes ) / sizeof( UPnpCDSRootInfo ); |
| 111 | 111 | |
| | 112 | UPnpCDSRootInfo UPnpCDSMusic::g_Containers[] = |
| | 113 | { |
| | 114 | { |
| | 115 | "musicalbum", |
| | 116 | "song.album_id", |
| | 117 | "SELECT song_id as id, " |
| | 118 | "name, " |
| | 119 | "1 as children " |
| | 120 | "FROM music_songs song " |
| | 121 | "%1 " |
| | 122 | "ORDER BY name", |
| | 123 | "WHERE album_id = :KEY" |
| | 124 | } |
| | 125 | }; |
| | 126 | |
| | 127 | int UPnpCDSMusic::g_nContainersCount = sizeof( g_Containers ) / sizeof( UPnpCDSRootInfo ); |
| | 128 | |
| 112 | 129 | ///////////////////////////////////////////////////////////////////////////// |
| 113 | 130 | // |
| 114 | 131 | ///////////////////////////////////////////////////////////////////////////// |
| 115 | 132 | |
| 116 | | UPnpCDSRootInfo *UPnpCDSMusic::GetRootInfo( int nIdx ) |
| | 133 | UPnpCDSRootInfo *UPnpCDSMusic::GetRootInfo( int nIdx, QString sContainerId ) |
| 117 | 134 | { |
| | 135 | for(int i=0; i<g_nContainersCount; i++) |
| | 136 | { |
| | 137 | if (sContainerId.startsWith(g_Containers[ i ].title)) |
| | 138 | { |
| | 139 | return &(g_Containers[ i ]); |
| | 140 | } |
| | 141 | } |
| | 142 | |
| 118 | 143 | if ((nIdx >=0 ) && ( nIdx < g_nRootCount )) |
| 119 | 144 | return &(g_RootNodes[ nIdx ]); |
| 120 | 145 | |
| … |
… |
void UPnpCDSMusic::BuildItemQuery( MSqlQuery &query, const QStringMap &mapParams
|
| 175 | 200 | // |
| 176 | 201 | ///////////////////////////////////////////////////////////////////////////// |
| 177 | 202 | |
| | 203 | bool UPnpCDSMusic::IsOurContainerPrefix(QString sContainerId) |
| | 204 | { |
| | 205 | for(int i=0; i<g_nContainersCount; i++) |
| | 206 | { |
| | 207 | if (sContainerId.startsWith(g_Containers[ i ].title)) |
| | 208 | { |
| | 209 | return true; |
| | 210 | } |
| | 211 | } |
| | 212 | return false; |
| | 213 | } |
| | 214 | |
| | 215 | ///////////////////////////////////////////////////////////////////////////// |
| | 216 | // |
| | 217 | ///////////////////////////////////////////////////////////////////////////// |
| | 218 | |
| | 219 | QString UPnpCDSMusic::RemoveContainerPrefix(QString sContainerId) |
| | 220 | { |
| | 221 | for(int i=0; i<g_nContainersCount; i++) |
| | 222 | { |
| | 223 | if (sContainerId.startsWith(g_Containers[ i ].title)) |
| | 224 | { |
| | 225 | return sContainerId.right(sContainerId.length() - strlen(g_Containers[ i ].title)); |
| | 226 | } |
| | 227 | } |
| | 228 | return sContainerId; |
| | 229 | } |
| | 230 | |
| | 231 | ///////////////////////////////////////////////////////////////////////////// |
| | 232 | // |
| | 233 | ///////////////////////////////////////////////////////////////////////////// |
| | 234 | |
| 178 | 235 | bool UPnpCDSMusic::IsBrowseRequestForUs( UPnpCDSRequest *pRequest ) |
| 179 | 236 | { |
| 180 | 237 | // ---------------------------------------------------------------------- |
| … |
… |
bool UPnpCDSMusic::IsBrowseRequestForUs( UPnpCDSRequest *pRequest )
|
| 182 | 239 | // ---------------------------------------------------------------------- |
| 183 | 240 | |
| 184 | 241 | // Xbox360 compatibility code. |
| 185 | | |
| | 242 | /* |
| 186 | 243 | if (pRequest->m_eClient == CDS_ClientXBox && |
| 187 | 244 | pRequest->m_sContainerID == "7") |
| 188 | 245 | { |
| … |
… |
bool UPnpCDSMusic::IsBrowseRequestForUs( UPnpCDSRequest *pRequest )
|
| 193 | 250 | |
| 194 | 251 | return true; |
| 195 | 252 | } |
| 196 | | |
| | 253 | */ |
| 197 | 254 | if ((pRequest->m_sObjectId.isEmpty()) && |
| 198 | 255 | (!pRequest->m_sContainerID.isEmpty())) |
| 199 | 256 | pRequest->m_sObjectId = pRequest->m_sContainerID; |
| … |
… |
bool UPnpCDSMusic::IsSearchRequestForUs( UPnpCDSRequest *pRequest )
|
| 215 | 272 | // ---------------------------------------------------------------------- |
| 216 | 273 | |
| 217 | 274 | // XBox 360 compatibility code |
| 218 | | |
| | 275 | /* |
| 219 | 276 | if (pRequest->m_eClient == CDS_ClientXBox && |
| 220 | 277 | pRequest->m_sContainerID == "7") |
| 221 | 278 | { |
| … |
… |
bool UPnpCDSMusic::IsSearchRequestForUs( UPnpCDSRequest *pRequest )
|
| 227 | 284 | |
| 228 | 285 | return true; |
| 229 | 286 | } |
| 230 | | |
| | 287 | */ |
| 231 | 288 | if (pRequest->m_sContainerID == "4") |
| 232 | 289 | { |
| 233 | 290 | pRequest->m_sObjectId = "Music"; |
| … |
… |
void UPnpCDSMusic::AddItem( const UPnpCDSRequest *pRequest,
|
| 308 | 365 | .arg( sServerIp ) |
| 309 | 366 | .arg( sPort ); |
| 310 | 367 | |
| 311 | | QString sURIParams = QString( "?Id=%1" ) |
| | 368 | QString sURIParams = QString( "\%3FId\%3D%1" ) |
| 312 | 369 | .arg( nId ); |
| 313 | 370 | |
| 314 | 371 | |
| … |
… |
void UPnpCDSMusic::AddItem( const UPnpCDSRequest *pRequest,
|
| 366 | 423 | .arg( sURIParams ); |
| 367 | 424 | |
| 368 | 425 | Resource *pRes = pItem->AddResource( sProtocol, sURI ); |
| 369 | | |
| 370 | | nLength /= 1000; |
| 371 | | |
| 372 | 426 | QString sDur; |
| 373 | 427 | |
| 374 | | sDur.sprintf("%02d:%02d:%02d", |
| 375 | | (nLength / 3600) % 24, |
| 376 | | (nLength / 60) % 60, |
| 377 | | nLength % 60); |
| | 428 | sDur.sprintf("%02d:%02d:%02d.%03d", |
| | 429 | (nLength / 3600000) % 24, |
| | 430 | (nLength / 60000) % 60, |
| | 431 | (nLength / 1000) % 60, |
| | 432 | nLength % 1000 |
| | 433 | ); |
| 378 | 434 | |
| 379 | 435 | pRes->AddAttribute( "duration" , sDur ); |
| 380 | 436 | } |
diff --git mythtv/programs/mythbackend/upnpcdsmusic.h mythtv/programs/mythbackend/upnpcdsmusic.h
index 5cc28a6..815d38e 100644
|
|
|
class UPnpCDSMusic : public UPnpCDSExtension
|
| 24 | 24 | private: |
| 25 | 25 | |
| 26 | 26 | static UPnpCDSRootInfo g_RootNodes[]; |
| | 27 | static UPnpCDSRootInfo g_Containers[]; |
| 27 | 28 | static int g_nRootCount; |
| | 29 | static int g_nContainersCount; |
| 28 | 30 | |
| 29 | 31 | protected: |
| 30 | 32 | |
| | 33 | virtual bool IsOurContainerPrefix ( QString sContainerId ); |
| | 34 | virtual QString RemoveContainerPrefix ( QString sContainerId ); |
| 31 | 35 | virtual bool IsBrowseRequestForUs( UPnpCDSRequest *pRequest ); |
| 32 | 36 | virtual bool IsSearchRequestForUs( UPnpCDSRequest *pRequest ); |
| 33 | 37 | |
| 34 | | virtual UPnpCDSRootInfo *GetRootInfo (int nIdx); |
| | 38 | virtual UPnpCDSRootInfo *GetRootInfo ( int nIdx, QString sContainerId = "" ); |
| 35 | 39 | virtual int GetRootCount ( ); |
| 36 | 40 | virtual QString GetTableName ( QString sColumn ); |
| 37 | 41 | virtual QString GetItemListSQL( QString sColumn = "" ); |
diff --git mythtv/programs/mythbackend/upnpcdstv.cpp mythtv/programs/mythbackend/upnpcdstv.cpp
index a29c2ff..6da5e66 100644
|
|
|
int UPnpCDSTv::g_nRootCount = sizeof( g_RootNodes ) / sizeof( UPnpCDSRootInfo );
|
| 111 | 111 | // |
| 112 | 112 | ///////////////////////////////////////////////////////////////////////////// |
| 113 | 113 | |
| 114 | | UPnpCDSRootInfo *UPnpCDSTv::GetRootInfo( int nIdx ) |
| | 114 | UPnpCDSRootInfo *UPnpCDSTv::GetRootInfo( int nIdx, QString sContainerId ) |
| 115 | 115 | { |
| 116 | 116 | if ((nIdx >=0 ) && ( nIdx < g_nRootCount )) |
| 117 | 117 | return &(g_RootNodes[ nIdx ]); |
diff --git mythtv/programs/mythbackend/upnpcdstv.h mythtv/programs/mythbackend/upnpcdstv.h
index 9b4e620..b3970cc 100644
|
|
|
class UPnpCDSTv : public UPnpCDSExtension
|
| 32 | 32 | virtual bool IsBrowseRequestForUs( UPnpCDSRequest *pRequest ); |
| 33 | 33 | virtual bool IsSearchRequestForUs( UPnpCDSRequest *pRequest ); |
| 34 | 34 | |
| 35 | | virtual UPnpCDSRootInfo *GetRootInfo (int nIdx); |
| | 35 | virtual UPnpCDSRootInfo *GetRootInfo ( int nIdx, QString sContainerId = "" ); |
| 36 | 36 | virtual int GetRootCount ( ); |
| 37 | 37 | virtual QString GetTableName ( QString sColumn ); |
| 38 | 38 | virtual QString GetItemListSQL( QString sColumn = "" ); |
diff --git mythtv/programs/mythbackend/upnpcdsvideo.cpp mythtv/programs/mythbackend/upnpcdsvideo.cpp
index b0b12b3..88637a0 100644
|
|
|
int UPnpCDSVideo::g_nRootCount = 1;
|
| 44 | 44 | // |
| 45 | 45 | ///////////////////////////////////////////////////////////////////////////// |
| 46 | 46 | |
| 47 | | UPnpCDSRootInfo *UPnpCDSVideo::GetRootInfo( int nIdx ) |
| | 47 | UPnpCDSRootInfo *UPnpCDSVideo::GetRootInfo( int nIdx, QString sContainerId ) |
| 48 | 48 | { |
| 49 | 49 | if ((nIdx >=0 ) && ( nIdx < g_nRootCount )) |
| 50 | 50 | return &(g_RootNodes[ nIdx ]); |
diff --git mythtv/programs/mythbackend/upnpcdsvideo.h mythtv/programs/mythbackend/upnpcdsvideo.h
index 56e98d5..b547035 100644
|
|
|
class UPnpCDSVideo : public UPnpCDSExtension
|
| 37 | 37 | |
| 38 | 38 | virtual int GetDistinctCount( UPnpCDSRootInfo *pInfo ); |
| 39 | 39 | |
| 40 | | virtual UPnpCDSRootInfo *GetRootInfo (int nIdx); |
| | 40 | virtual UPnpCDSRootInfo *GetRootInfo ( int nIdx, QString sContainerId = "" ); |
| 41 | 41 | virtual int GetRootCount ( ); |
| 42 | 42 | virtual QString GetTableName ( QString sColumn ); |
| 43 | 43 | virtual QString GetItemListSQL( QString sColumn = ""); |