[vlc-commits] m3u export: write relative URLs sometimes (fixes #3095)

Rémi Denis-Courmont git at videolan.org
Wed Mar 1 19:17:05 CET 2017


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Wed Mar  1 20:14:39 2017 +0200| [c6163786db1533d379c6be8a521423a11105510e] | committer: Rémi Denis-Courmont

m3u export: write relative URLs sometimes (fixes #3095)

If the URL points within the same directory as the output playlist file
or descendent of that directory, use relative URL.

There are no ways to guess 100% how relative the URL should be. This is
purely a heuristic.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=c6163786db1533d379c6be8a521423a11105510e
---

 modules/misc/playlist/m3u.c | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/modules/misc/playlist/m3u.c b/modules/misc/playlist/m3u.c
index 4f7b308..6a31f14 100644
--- a/modules/misc/playlist/m3u.c
+++ b/modules/misc/playlist/m3u.c
@@ -50,6 +50,14 @@ int Export_M3U8( vlc_object_t * );
 static void DoChildren( playlist_export_t *p_export, playlist_item_t *p_root,
                         int (*pf_fprintf) (FILE *, const char *, ...) )
 {
+    size_t prefix_len = -1;
+    if( likely(p_export->base_url != NULL) )
+    {
+        const char *p = strrchr( p_export->base_url, '/' );
+        assert(p != NULL);
+        prefix_len = (p + 1) - p_export->base_url;
+    }
+
     /* Write header */
     fputs( "#EXTM3U\n", p_export->p_file );
 
@@ -104,7 +112,15 @@ static void DoChildren( playlist_export_t *p_export, playlist_item_t *p_root,
         }
         vlc_mutex_unlock( &p_current->p_input->lock );
 
-        fprintf( p_export->p_file, "%s\n", psz_uri );
+        /* We cannot really know if relative or absolute URL is better. As a
+         * heuristic, we write a relative URL if the item is in the same
+         * directory as the playlist, or a sub-directory thereof. */
+        size_t skip = 0;
+        if( likely(prefix_len != (size_t)-1)
+         && !strncmp( p_export->base_url, psz_uri, prefix_len ) )
+            skip = prefix_len;
+
+        fprintf( p_export->p_file, "%s\n", psz_uri + skip );
         free( psz_uri );
     }
 }



More information about the vlc-commits mailing list