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 = ""); |