vlc | branch: master | Jean-Baptiste Kempf <[email protected]> | Sun Jul 29 18:28:48 2018 +0200| [b1fb710176ddca879fab52d6b15c2fbe467ed16a] | committer: Jean-Baptiste Kempf
UPnP: split sat>ip parsing function And add an Auto mode, that works as one would expect Close #19751 > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=b1fb710176ddca879fab52d6b15c2fbe467ed16a --- modules/services_discovery/upnp.cpp | 210 +++++++++++++++++++----------------- modules/services_discovery/upnp.hpp | 1 + 2 files changed, 114 insertions(+), 97 deletions(-) diff --git a/modules/services_discovery/upnp.cpp b/modules/services_discovery/upnp.cpp index e4183a1486..b138fef4f4 100644 --- a/modules/services_discovery/upnp.cpp +++ b/modules/services_discovery/upnp.cpp @@ -53,10 +53,10 @@ const char* SATIP_SERVER_DEVICE_TYPE = "urn:ses-com:device:SatIPServer:1"; #define SATIP_CHANNEL_LIST N_("SAT>IP channel list") #define SATIP_CHANNEL_LIST_URL N_("Custom SAT>IP channel list URL") static const char *const ppsz_satip_channel_lists[] = { - "ASTRA_19_2E", "ASTRA_28_2E", "ASTRA_23_5E", "MasterList", "ServerList", "CustomList" + "Auto", "ASTRA_19_2E", "ASTRA_28_2E", "ASTRA_23_5E", "MasterList", "ServerList", "CustomList" }; static const char *const ppsz_readible_satip_channel_lists[] = { - "Astra 19.2°E", "Astra 28.2°E", "Astra 23.5°E", N_("Master List"), N_("Server List"), N_("Custom List") + N_("Auto"), "Astra 19.2°E", "Astra 28.2°E", "Astra 23.5°E", N_("Master List"), N_("Server List"), N_("Custom List") }; namespace { @@ -445,102 +445,9 @@ void MediaServerList::parseNewServer( IXML_Document *doc, const std::string &loc // We now have basic info, we need to get the content browsing url // so the access module can browse without fetching the manifest again - if ( !strncmp( SATIP_SERVER_DEVICE_TYPE, psz_device_type, - strlen( SATIP_SERVER_DEVICE_TYPE ) - 1 ) ) - { - SD::MediaServerDesc* p_server = NULL; - - vlc_url_t url; - vlc_UrlParse( &url, psz_base_url ); - - char *psz_satip_channellist = config_GetPsz("satip-channelist"); - if( !psz_satip_channellist ) { - break; - } - - /* a user may have provided a custom playlist url */ - if (strncmp(psz_satip_channellist, "CustomList", 10) == 0) { - char *psz_satip_playlist_url = config_GetPsz( "satip-channellist-url" ); - if ( psz_satip_playlist_url ) { - p_server = new(std::nothrow) SD::MediaServerDesc( psz_udn, psz_friendly_name, psz_satip_playlist_url, iconUrl ); - - if( likely( p_server ) ) { - p_server->satIpHost = url.psz_host; - p_server->isSatIp = true; - if( !addServer( p_server ) ) { - delete p_server; - } - } - - /* to comply with the SAT>IP specification, we don't fall back on another channel list if this path failed */ - free( psz_satip_playlist_url ); - vlc_UrlClean( &url ); - continue; - } - } - - /* If requested by the user, check for a SAT>IP m3u list, which may be provided by some rare devices */ - if (strncmp(psz_satip_channellist, "ServerList", 10) == 0) { - const char* psz_m3u_url = xml_getChildElementValue( p_device_element, "satip:X_SATIPM3U" ); - if ( psz_m3u_url ) { - if ( strncmp( "http", psz_m3u_url, 4) ) - { - char* psz_url = NULL; - if ( UpnpResolveURL2( psz_base_url, psz_m3u_url, &psz_url ) == UPNP_E_SUCCESS ) - { - p_server = new(std::nothrow) SD::MediaServerDesc( psz_udn, psz_friendly_name, psz_url, iconUrl ); - free(psz_url); - } - } else { - p_server = new(std::nothrow) SD::MediaServerDesc( psz_udn, psz_friendly_name, psz_m3u_url, iconUrl ); - } - - if ( unlikely( !p_server ) ) - { - free( psz_satip_channellist ); - break; - } - - p_server->satIpHost = url.psz_host; - p_server->isSatIp = true; - if ( !addServer( p_server ) ) - delete p_server; - } else { - msg_Warn( m_sd, "SAT>IP server '%s' did not provide a playlist", url.psz_host); - } - - /* to comply with the SAT>IP specifications, we don't fallback on another channel list if this path failed */ - free(psz_satip_channellist); - vlc_UrlClean( &url ); - continue; - } - - /* Normally, fetch a playlist from the web, - * which will be processed by a lua script a bit later */ - char *psz_url; - if (asprintf( &psz_url, "http://www.satip.info/Playlists/%s.m3u", - psz_satip_channellist ) < 0 ) { - vlc_UrlClean( &url ); - free( psz_satip_channellist ); - continue; - } - - p_server = new(std::nothrow) SD::MediaServerDesc( psz_udn, - psz_friendly_name, psz_url, iconUrl ); - - if( likely( p_server ) ) { - p_server->satIpHost = url.psz_host; - p_server->isSatIp = true; - if( !addServer( p_server ) ) { - delete p_server; - } - } - free( psz_url ); - free( psz_satip_channellist ); - vlc_UrlClean( &url ); - - continue; + strlen( SATIP_SERVER_DEVICE_TYPE ) - 1 ) ) { + parseSatipServer( p_device_element, psz_base_url, psz_udn, psz_friendly_name, iconUrl ); } /* Check for ContentDirectory service. */ @@ -652,6 +559,115 @@ std::string MediaServerList::getIconURL( IXML_Element* p_device_elem, const char return res; } +void +MediaServerList::parseSatipServer( IXML_Element* p_device_element, const char *psz_base_url, const char *psz_udn, const char *psz_friendly_name, std::string iconUrl ) +{ + SD::MediaServerDesc* p_server = NULL; + + vlc_url_t url; + vlc_UrlParse( &url, psz_base_url ); + + char *psz_satip_channellist = config_GetPsz("satip-channelist"); + if( !psz_satip_channellist ) { + psz_satip_channellist = strdup("Auto"); + } + + /* Part 1: a user may have provided a custom playlist url */ + if (strncmp(psz_satip_channellist, "CustomList", 10) == 0) { + char *psz_satip_playlist_url = config_GetPsz( "satip-channellist-url" ); + if ( psz_satip_playlist_url ) { + p_server = new(std::nothrow) SD::MediaServerDesc( psz_udn, psz_friendly_name, psz_satip_playlist_url, iconUrl ); + + if( likely( p_server ) ) { + p_server->satIpHost = url.psz_host; + p_server->isSatIp = true; + if( !addServer( p_server ) ) { + delete p_server; + } + } + + /* to comply with the SAT>IP specification, we don't fall back on another channel list if this path failed */ + free( psz_satip_playlist_url ); + vlc_UrlClean( &url ); + return; + } + } + + /* Part 2: device playlist + * In Automatic mode, or if requested by the user, check for a SAT>IP m3u list on the device */ + if (strncmp(psz_satip_channellist, "ServerList", 10) == 0 || + strncmp(psz_satip_channellist, "Auto", strlen ("Auto") == 0 )) { + const char* psz_m3u_url = xml_getChildElementValue( p_device_element, "satip:X_SATIPM3U" ); + if ( psz_m3u_url ) { + if ( strncmp( "http", psz_m3u_url, 4) ) + { + char* psz_url = NULL; + if ( UpnpResolveURL2( psz_base_url, psz_m3u_url, &psz_url ) == UPNP_E_SUCCESS ) + { + p_server = new(std::nothrow) SD::MediaServerDesc( psz_udn, psz_friendly_name, psz_url, iconUrl ); + free(psz_url); + } + } else { + p_server = new(std::nothrow) SD::MediaServerDesc( psz_udn, psz_friendly_name, psz_m3u_url, iconUrl ); + } + + if ( unlikely( !p_server ) ) + { + free( psz_satip_channellist ); + vlc_UrlClean( &url ); + return; + } + + p_server->satIpHost = url.psz_host; + p_server->isSatIp = true; + if ( !addServer( p_server ) ) + delete p_server; + } else { + msg_Dbg( m_sd, "SAT>IP server '%s' did not provide a playlist", url.psz_host); + } + + if(strncmp(psz_satip_channellist, "ServerList", 10) == 0) { + /* to comply with the SAT>IP specifications, we don't fallback on another channel list if this path failed, + * but in Automatic mode, we continue */ + free(psz_satip_channellist); + vlc_UrlClean( &url ); + return; + } + } + + /* Part 3: satip.info playlist + * In the normal case, fetch a playlist from the satip website, + * which will be processed by a lua script a bit later, to make it work sanely + * MasterList is a list of usual Satellites */ + + /* In Auto mode, default to MasterList list from satip.info */ + if( strncmp(psz_satip_channellist, "Auto", strlen ("Auto") == 0 ) ) { + psz_satip_channellist = strdup( "MasterList" ); + } + + char *psz_url; + if (asprintf( &psz_url, "http://www.satip.info/Playlists/%s.m3u", + psz_satip_channellist ) < 0 ) { + vlc_UrlClean( &url ); + free( psz_satip_channellist ); + return; + } + + p_server = new(std::nothrow) SD::MediaServerDesc( psz_udn, + psz_friendly_name, psz_url, iconUrl ); + + if( likely( p_server ) ) { + p_server->satIpHost = url.psz_host; + p_server->isSatIp = true; + if( !addServer( p_server ) ) { + delete p_server; + } + } + free( psz_url ); + free( psz_satip_channellist ); + vlc_UrlClean( &url ); +} + void MediaServerList::removeServer( const std::string& udn ) { MediaServerDesc* p_server = getServer( udn ); diff --git a/modules/services_discovery/upnp.hpp b/modules/services_discovery/upnp.hpp index 3e6a1bc585..47560ae624 100644 --- a/modules/services_discovery/upnp.hpp +++ b/modules/services_discovery/upnp.hpp @@ -70,6 +70,7 @@ public: private: void parseNewServer( IXML_Document* doc, const std::string& location ); + void parseSatipServer( IXML_Element* p_device_elem, const char *psz_base_url, const char *psz_udn, const char *psz_friendly_name, std::string iconUrl ); std::string getIconURL( IXML_Element* p_device_elem , const char* psz_base_url ); private: _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
