satip: drop requirement of the lua script and simplify parsing
authorFelix Paul Kühne <fkuehne@videolan.org>
Fri, 12 Aug 2016 14:27:42 +0000 (16:27 +0200)
committerJean-Baptiste Kempf <jb@videolan.org>
Fri, 16 Sep 2016 13:37:01 +0000 (15:37 +0200)
Signed-off-by: Jean-Baptiste Kempf <jb@videolan.org>
modules/access/live555.cpp
modules/access/satip.c
modules/demux/playlist/m3u.c
modules/services_discovery/upnp.cpp
modules/services_discovery/upnp.hpp
share/Makefile.am
share/lua/playlist/satip.lua [deleted file]

index a609ce2..43335eb 100644 (file)
@@ -286,6 +286,22 @@ static int  Open ( vlc_object_t *p_this )
     int i_return;
     int i_error = VLC_EGENERIC;
 
+    /* if the rtsp URL may contain a sat.ip fake DNS, bail-out early and 
+     * let the SAT>IP module handle that */
+    if( !strncmp(p_demux->psz_location, "sat.ip", 6) )
+    {
+        msg_Err( p_demux, "SAT>IP server, bailing out");
+        return VLC_EGENERIC;
+    }
+    /* If satip-host is set on the item, we shall assume it is a rtsp for the
+     * SAT>IP module and bail-out early. */
+    char *psz_host = var_InheritString(p_demux, "satip-host");
+    if (psz_host != NULL) {
+        msg_Err( p_demux, "URL is for SAT>IP, bailing out");
+        free(psz_host);
+        return VLC_EGENERIC;
+    }
+
     if( p_demux->s )
     {
         /* See if it looks like a SDP
index 53abc78..081c94e 100644 (file)
@@ -60,6 +60,8 @@ static void satip_close(vlc_object_t *);
 #define MULTICAST_TEXT N_("Request multicast stream")
 #define MULTICAST_LONGTEXT N_("Request server to send stream as multicast")
 
+#define SATIP_HOST_TEXT N_("Host")
+
 vlc_module_begin()
     set_shortname("satip")
     set_description( N_("SAT>IP Receiver Plugin") )
@@ -69,7 +71,9 @@ vlc_module_begin()
     set_subcategory(SUBCAT_INPUT_ACCESS)
     add_integer("satip-buffer", 0x400000, BUFFER_TEXT, BUFFER_LONGTEXT, true)
     add_bool("satip-multicast", false, MULTICAST_TEXT, MULTICAST_LONGTEXT, true)
-    add_shortcut("satip")
+    add_string("satip-host", "", SATIP_HOST_TEXT, SATIP_HOST_TEXT, true)
+    change_safe()
+    add_shortcut("rtsp", "satip")
 vlc_module_end()
 
 enum rtsp_state {
@@ -625,6 +629,8 @@ static int satip_open(vlc_object_t *obj)
 
     msg_Dbg(access, "try to open '%s'", access->psz_url);
 
+    char *psz_host = var_InheritString(access, "satip-host");
+
     sys->udp_sock = -1;
     sys->rtcp_sock = -1;
 
@@ -647,17 +653,20 @@ static int satip_open(vlc_object_t *obj)
     vlc_UrlParse(&url, psz_lower_url);
     if (url.i_port <= 0)
         url.i_port = RTSP_DEFAULT_PORT;
+    if (psz_host == NULL) {
+        psz_host = strdup(url.psz_host);
+    }
 
-    msg_Dbg(access, "connect to host '%s'", url.psz_host);
-    sys->tcp_sock = net_ConnectTCP(access, url.psz_host, url.i_port);
+    msg_Dbg(access, "connect to host '%s'", psz_host);
+    sys->tcp_sock = net_ConnectTCP(access, psz_host, url.i_port);
     if (sys->tcp_sock < 0) {
         msg_Err(access, "Failed to connect to RTSP server %s:%d",
-                url.psz_host, url.i_port);
+                psz_host, url.i_port);
         goto error;
     }
     setsockopt (sys->tcp_sock, SOL_SOCKET, SO_KEEPALIVE, &(int){ 1 }, sizeof (int));
 
-    if (asprintf(&sys->content_base, "rtsp://%s:%d/", url.psz_host,
+    if (asprintf(&sys->content_base, "rtsp://%s:%d/", psz_host,
              url.i_port) < 0) {
         sys->content_base = NULL;
         goto error;
@@ -746,11 +755,13 @@ static int satip_open(vlc_object_t *obj)
     access->pf_control = satip_control;
     access->pf_block = satip_block;
 
+    free(psz_host);
     free(psz_lower_url);
     vlc_UrlClean(&url);
     return VLC_SUCCESS;
 
 error:
+    free(psz_host);
     free(psz_lower_url);
     vlc_UrlClean(&url);
 
index 656dda2..a3a23ef 100644 (file)
@@ -263,6 +263,7 @@ static int Demux( demux_t *p_demux )
             if( !p_input )
                 goto error;
             input_item_AddOptions( p_input, i_options, ppsz_options, 0 );
+            input_item_CopyOptions( p_input, p_current_input );
 
             if( !EMPTY_STR(psz_artist) )
                 input_item_SetArtist( p_input, psz_artist );
index 85a16b8..7a3c34a 100644 (file)
@@ -311,6 +311,14 @@ bool MediaServerList::addServer( MediaServerDesc* desc )
                                                 ITEM_NET );
 
         input_item_SetSetting( p_input_item, SATIP_SERVER_DEVICE_TYPE );
+
+        char *psz_playlist_option;
+
+        if (asprintf( &psz_playlist_option, "satip-host=%s",
+                     desc->satIpHost.c_str() ) >= 0 ) {
+            input_item_AddOption( p_input_item, psz_playlist_option, 0 );
+            free( psz_playlist_option );
+        }
     } else {
         char* psz_mrl;
         // We might already have some options specified in the location.
@@ -442,6 +450,9 @@ void MediaServerList::parseNewServer( IXML_Document *doc, const std::string &loc
         if ( !strncmp( SATIP_SERVER_DEVICE_TYPE, psz_device_type,
                 strlen( SATIP_SERVER_DEVICE_TYPE ) - 1 ) )
         {
+            vlc_url_t url;
+            vlc_UrlParse( &url, psz_base_url );
+
             /* Check for SAT>IP m3u list, which is provided by some off-standard devices */
             const char* psz_m3u_url = xml_getChildElementValue( p_device_element, "satip:X_SATIPM3U" );
             SD::MediaServerDesc* p_server = NULL;
@@ -461,7 +472,9 @@ void MediaServerList::parseNewServer( IXML_Document *doc, const std::string &loc
                 if ( unlikely( !p_server ) )
                     break;
 
+                p_server->satIpHost = url.psz_host;
                 p_server->isSatIp = true;
+
                 if ( !addServer( p_server ) )
                     delete p_server;
             } else {
@@ -472,28 +485,28 @@ void MediaServerList::parseNewServer( IXML_Document *doc, const std::string &loc
                     break;
                 }
                 char *psz_url;
-                vlc_url_t url;
-                vlc_UrlParse( &url, psz_base_url );
-
-                if (asprintf( &psz_url, "http/lua://www.satip.info/Playlists/%s.m3u?device=%s",
-                             psz_satellite,
-                             url.psz_host ) < 0 ) {
-                    vlc_UrlClean( &url );
+                if (asprintf( &psz_url, "http://www.satip.info/Playlists/%s.m3u",
+                             psz_satellite ) < 0 ) {
                     free( psz_satellite );
                     continue;
                 }
                 free( psz_satellite );
-                vlc_UrlClean( &url );
 
-                p_server = new(std::nothrow) SD::MediaServerDesc( psz_udn,
-                                                                  psz_friendly_name, psz_url, iconUrl );
+                p_server = new(std::nothrow) SD::MediaServerDesc( psz_udn, psz_friendly_name, psz_url, iconUrl );
 
-                p_server->isSatIp = true;
-                if( !addServer( p_server ) ) {
-                    delete p_server;
+                if ( likely( p_server ) )
+                {
+                    p_server->satIpHost = url.psz_host;
+                    p_server->isSatIp = true;
+
+                    if( !addServer( p_server ) ) {
+                        delete p_server;
+                    }
                 }
+
                 free( psz_url );
             }
+            vlc_UrlClean( &url );
 
             continue;
         }
index 77c41c5..465a3a5 100644 (file)
@@ -90,6 +90,7 @@ struct MediaServerDesc
     std::string iconUrl;
     input_item_t* inputItem;
     bool isSatIp;
+    std::string satIpHost;
 };
 
 
index b93e474..e404f2c 100644 (file)
@@ -152,7 +152,6 @@ nobase_vlclib_DATA = \
        lua/playlist/pinkbike.luac \
        lua/playlist/pluzz.luac \
        lua/playlist/rockbox_fm_presets.luac \
-       lua/playlist/satip.luac \
        lua/playlist/soundcloud.luac \
        lua/playlist/vimeo.luac \
        lua/playlist/youtube.luac \
@@ -245,7 +244,6 @@ EXTRA_DIST += \
        lua/playlist/pinkbike.lua \
        lua/playlist/pluzz.lua \
        lua/playlist/rockbox_fm_presets.lua \
-       lua/playlist/satip.lua \
        lua/playlist/soundcloud.lua \
        lua/playlist/vimeo.lua \
        lua/playlist/youtube.lua \
diff --git a/share/lua/playlist/satip.lua b/share/lua/playlist/satip.lua
deleted file mode 100644 (file)
index 6cb1323..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
---[[
- $Id$
-
- Copyright © 2015 Videolabs SAS
-
- Authors: Felix Paul Kühne (fkuehne@videolan.org)
-
- This program is free software; you can redistribute it and/or modify it
- under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software Foundation,
- Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
---]]
-
-function get_url_param( url, name )
-    local _, _, res = string.find( url, "[&?]"..name.."=([^&]*)" )
-    return res
-end
-
--- Probe function.
-function probe()
-        if vlc.access ~= "http" then
-        return false
-    end
-
-    return ( string.match( vlc.path, "www.satip.info" ) )
-end
-
--- Parse function.
-function parse()
-    local satiphost = get_url_param( vlc.path, "device")
-
-    vlc.msg.dbg("Parsing SAT>IP playlist for host "..satiphost)
-
-    -- Skip the prefix line
-    line = vlc.readline()
-
-    p = {}
-
-    while true do
-        name = vlc.readline()
-        if not name then break end
-
-        name = vlc.strings.from_charset( "ISO_8859-1", name )
-        name = string.gsub(name,"#EXTINF:0,","")
-
-        url = vlc.readline()
-        if not url then break end
-
-        finalurl = string.gsub(url,"sat.ip",satiphost)
-        finalurl = string.gsub(finalurl,"rtsp","satip")
-
-        table.insert( p, { path = finalurl, url = finalurl, name = name } )
-    end
-
-    return p
-end