[vlc-devel] [PATCH] RFC: attempt to fix the NowPlaying issue #9960 #11796 #12850

Ludovic Fauvet etix at videolan.org
Wed Dec 17 14:48:51 CET 2014


Based on a discussion with Courmisch I splitted the NowPlaying meta in
two. ItemNowPlaying for the input and ESNowPlaying for the elementary
stream. The new function input_item_GetNowPlaying is in charge of
returning the preferred meta.
---
 include/vlc_input_item.h           |  4 +++-
 include/vlc_meta.h                 |  7 ++++---
 lib/media.c                        | 25 +++++++++++++++++--------
 modules/access/http.c              |  2 +-
 modules/demux/mp4/meta.c           |  2 +-
 modules/demux/playlist/b4s.c       |  2 +-
 modules/demux/playlist/shoutcast.c |  2 +-
 modules/lua/libs/input.c           |  4 ++--
 modules/lua/libs/sd.c              |  2 +-
 modules/lua/vlc.c                  |  2 +-
 src/input/es_out.c                 | 10 +++++-----
 src/input/input.c                  |  3 ++-
 src/input/item.c                   | 11 +++++++++++
 src/input/meta.c                   |  3 ++-
 src/libvlccore.sym                 |  1 +
 src/text/strings.c                 | 36 +++++++++++++++++++++++++++---------
 16 files changed, 80 insertions(+), 36 deletions(-)

diff --git a/include/vlc_input_item.h b/include/vlc_input_item.h
index 1bfb2f9..5d82d33 100644
--- a/include/vlc_input_item.h
+++ b/include/vlc_input_item.h
@@ -192,6 +192,7 @@ VLC_API char * input_item_GetMeta( input_item_t *p_i, vlc_meta_type_t meta_type
 VLC_API char * input_item_GetName( input_item_t * p_i ) VLC_USED;
 VLC_API char * input_item_GetTitleFbName( input_item_t * p_i ) VLC_USED;
 VLC_API char * input_item_GetURI( input_item_t * p_i ) VLC_USED;
+VLC_API char * input_item_GetNowPlaying( input_item_t *p_item ) VLC_USED;
 VLC_API void input_item_SetURI( input_item_t * p_i, const char *psz_uri );
 VLC_API mtime_t input_item_GetDuration( input_item_t * p_i );
 VLC_API void input_item_SetDuration( input_item_t * p_i, mtime_t i_duration );
@@ -222,7 +223,8 @@ INPUT_META(Date)
 INPUT_META(Setting)
 INPUT_META(URL)
 INPUT_META(Language)
-INPUT_META(NowPlaying)
+INPUT_META(ItemNowPlaying)
+INPUT_META(ESNowPlaying)
 INPUT_META(Publisher)
 INPUT_META(EncodedBy)
 INPUT_META(ArtworkURL)
diff --git a/include/vlc_meta.h b/include/vlc_meta.h
index c87643e..f6593bf 100644
--- a/include/vlc_meta.h
+++ b/include/vlc_meta.h
@@ -44,7 +44,8 @@ typedef enum vlc_meta_type_t
     vlc_meta_Setting,
     vlc_meta_URL,
     vlc_meta_Language,
-    vlc_meta_NowPlaying,
+    vlc_meta_ItemNowPlaying,
+    vlc_meta_ESNowPlaying,
     vlc_meta_Publisher,
     vlc_meta_EncodedBy,
     vlc_meta_ArtworkURL,
@@ -128,7 +129,7 @@ VLC_API int input_item_WriteMeta(vlc_object_t *, input_item_t *);
 #define vlc_meta_SetSetting( meta, b )     vlc_meta_Set( meta, vlc_meta_Setting, b )
 #define vlc_meta_SetURL( meta, b )         vlc_meta_Set( meta, vlc_meta_URL, b )
 #define vlc_meta_SetLanguage( meta, b )    vlc_meta_Set( meta, vlc_meta_Language, b )
-#define vlc_meta_SetNowPlaying( meta, b )  vlc_meta_Set( meta, vlc_meta_NowPlaying, b )
+#define vlc_meta_SetItemNowPlaying( meta, b )  vlc_meta_Set( meta, vlc_meta_ItemNowPlaying, b )
 #define vlc_meta_SetPublisher( meta, b )   vlc_meta_Set( meta, vlc_meta_Publisher, b )
 #define vlc_meta_SetEncodedBy( meta, b )   vlc_meta_Set( meta, vlc_meta_EncodedBy, b )
 #define vlc_meta_SetArtURL( meta, b )      vlc_meta_Set( meta, vlc_meta_ArtworkURL, b )
@@ -154,7 +155,7 @@ VLC_API int input_item_WriteMeta(vlc_object_t *, input_item_t *);
 #define VLC_META_SETTING            vlc_meta_TypeToLocalizedString( vlc_meta_Setting )
 #define VLC_META_URL                vlc_meta_TypeToLocalizedString( vlc_meta_URL )
 #define VLC_META_LANGUAGE           vlc_meta_TypeToLocalizedString( vlc_meta_Language )
-#define VLC_META_NOW_PLAYING        vlc_meta_TypeToLocalizedString( vlc_meta_NowPlaying )
+#define VLC_META_NOW_PLAYING        vlc_meta_TypeToLocalizedString( vlc_meta_ItemNowPlaying )
 #define VLC_META_PUBLISHER          vlc_meta_TypeToLocalizedString( vlc_meta_Publisher )
 #define VLC_META_ENCODED_BY         vlc_meta_TypeToLocalizedString( vlc_meta_EncodedBy )
 #define VLC_META_ART_URL            vlc_meta_TypeToLocalizedString( vlc_meta_ArtworkURL )
diff --git a/lib/media.c b/lib/media.c
index 5e406a4..4201013 100644
--- a/lib/media.c
+++ b/lib/media.c
@@ -58,7 +58,7 @@ static const vlc_meta_type_t libvlc_to_vlc_meta[] =
     [libvlc_meta_Setting]      = vlc_meta_Setting,
     [libvlc_meta_URL]          = vlc_meta_URL,
     [libvlc_meta_Language]     = vlc_meta_Language,
-    [libvlc_meta_NowPlaying]   = vlc_meta_NowPlaying,
+    [libvlc_meta_NowPlaying]   = vlc_meta_ItemNowPlaying,
     [libvlc_meta_Publisher]    = vlc_meta_Publisher,
     [libvlc_meta_EncodedBy]    = vlc_meta_EncodedBy,
     [libvlc_meta_ArtworkURL]   = vlc_meta_ArtworkURL,
@@ -87,7 +87,8 @@ static const libvlc_meta_t vlc_to_libvlc_meta[] =
     [vlc_meta_Setting]      = libvlc_meta_Setting,
     [vlc_meta_URL]          = libvlc_meta_URL,
     [vlc_meta_Language]     = libvlc_meta_Language,
-    [vlc_meta_NowPlaying]   = libvlc_meta_NowPlaying,
+    [vlc_meta_ItemNowPlaying]  = libvlc_meta_NowPlaying,
+    [vlc_meta_ESNowPlaying] = libvlc_meta_NowPlaying,
     [vlc_meta_Publisher]    = libvlc_meta_Publisher,
     [vlc_meta_EncodedBy]    = libvlc_meta_EncodedBy,
     [vlc_meta_ArtworkURL]   = libvlc_meta_ArtworkURL,
@@ -495,13 +496,21 @@ libvlc_media_get_mrl( libvlc_media_t * p_md )
 
 char *libvlc_media_get_meta( libvlc_media_t *p_md, libvlc_meta_t e_meta )
 {
-    char *psz_meta = input_item_GetMeta( p_md->p_input_item,
-                                         libvlc_to_vlc_meta[e_meta] );
-    /* Should be integrated in core */
-    if( psz_meta == NULL && e_meta == libvlc_meta_Title
-     && p_md->p_input_item->psz_name != NULL )
-        psz_meta = strdup( p_md->p_input_item->psz_name );
+    char *psz_meta = NULL;
 
+    if( e_meta == libvlc_meta_NowPlaying )
+    {
+        psz_meta = input_item_GetNowPlaying( p_md->p_input_item );
+    }
+    else
+    {
+        psz_meta = input_item_GetMeta( p_md->p_input_item,
+                                             libvlc_to_vlc_meta[e_meta] );
+        /* Should be integrated in core */
+        if( psz_meta == NULL && e_meta == libvlc_meta_Title
+         && p_md->p_input_item->psz_name != NULL )
+            psz_meta = strdup( p_md->p_input_item->psz_name );
+    }
     return psz_meta;
 }
 
diff --git a/modules/access/http.c b/modules/access/http.c
index ee5a875..2e7cfb5 100644
--- a/modules/access/http.c
+++ b/modules/access/http.c
@@ -855,7 +855,7 @@ static int ReadICYMeta( access_t *p_access )
             {
                 input_item_t *p_input_item = input_GetItem( p_access->p_input );
                 if( p_input_item )
-                    input_item_SetMeta( p_input_item, vlc_meta_NowPlaying, p_sys->psz_icy_title );
+                    input_item_SetMeta( p_input_item, vlc_meta_ItemNowPlaying, p_sys->psz_icy_title );
                 vlc_object_release( p_input );
             }
         }
diff --git a/modules/demux/mp4/meta.c b/modules/demux/mp4/meta.c
index 2128107..0f39757 100644
--- a/modules/demux/mp4/meta.c
+++ b/modules/demux/mp4/meta.c
@@ -103,7 +103,7 @@ static const struct
     const char *psz_naming;
     const vlc_meta_type_t meta_type;
 } com_apple_quicktime_tometa[] = {
-    { "displayname",     vlc_meta_NowPlaying },
+    { "displayname",     vlc_meta_ItemNowPlaying },
     { "software",        vlc_meta_EncodedBy },
     { "Encoded_With",    vlc_meta_EncodedBy },
     { "album",           vlc_meta_Album },
diff --git a/modules/demux/playlist/b4s.c b/modules/demux/playlist/b4s.c
index d9c0465..d4020bb 100644
--- a/modules/demux/playlist/b4s.c
+++ b/modules/demux/playlist/b4s.c
@@ -194,7 +194,7 @@ static int Demux( demux_t *p_demux )
                     resolve_xml_special_chars( psz_mrl );
                     p_input = input_item_New( psz_mrl, psz_title );
                     if( psz_now )
-                        input_item_SetNowPlaying( p_input, psz_now );
+                        input_item_SetItemNowPlaying( p_input, psz_now );
                     if( psz_genre )
                         input_item_SetGenre( p_input, psz_genre );
                     if( psz_listeners )
diff --git a/modules/demux/playlist/shoutcast.c b/modules/demux/playlist/shoutcast.c
index 499ba3d..53b21e1 100644
--- a/modules/demux/playlist/shoutcast.c
+++ b/modules/demux/playlist/shoutcast.c
@@ -338,7 +338,7 @@ static int DemuxStation( demux_t *p_demux, xml_reader_t *p_xml_reader,
                         if( psz_genre )
                             input_item_SetGenre( p_input, psz_genre );
                         if( psz_ct )
-                            input_item_SetNowPlaying( p_input, psz_ct );
+                            input_item_SetItemNowPlaying( p_input, psz_ct );
                         if( psz_rt )
                             input_item_SetRating( p_input, psz_rt );
                         input_item_node_AppendItem( p_input_node, p_input );
diff --git a/modules/lua/libs/input.c b/modules/lua/libs/input.c
index a524a7d..5e8f7fa 100644
--- a/modules/lua/libs/input.c
+++ b/modules/lua/libs/input.c
@@ -143,7 +143,7 @@ static int vlclua_input_metas_internal( lua_State *L, input_item_t *p_item )
         PUSH_META( Setting, "setting" );
         PUSH_META( URL, "url" );
         PUSH_META( Language, "language" );
-        PUSH_META( NowPlaying, "now_playing" );
+        PUSH_META( ItemNowPlaying, "now_playing" );
         PUSH_META( Publisher, "publisher" );
         PUSH_META( EncodedBy, "encoded_by" );
         PUSH_META( ArtworkURL, "artwork_url" );
@@ -327,7 +327,7 @@ static int vlclua_input_item_set_meta( lua_State *L )
         META_TYPE( Setting, "setting" )
         META_TYPE( URL, "url" )
         META_TYPE( Language, "language" )
-        META_TYPE( NowPlaying, "now_playing" )
+        META_TYPE( ItemNowPlaying, "now_playing" )
         META_TYPE( Publisher, "publisher" )
         META_TYPE( EncodedBy, "encoded_by" )
         META_TYPE( ArtworkURL, "artwork_url" )
diff --git a/modules/lua/libs/sd.c b/modules/lua/libs/sd.c
index f162847..d3dcb60 100644
--- a/modules/lua/libs/sd.c
+++ b/modules/lua/libs/sd.c
@@ -85,7 +85,7 @@ vlclua_item_meta(date, Date)
 vlclua_item_meta(setting, Setting)
 vlclua_item_meta(url, URL)
 vlclua_item_meta(language, Language)
-vlclua_item_meta(nowplaying, NowPlaying)
+vlclua_item_meta(nowplaying, ItemNowPlaying)
 vlclua_item_meta(publisher, Publisher)
 vlclua_item_meta(encodedby, EncodedBy)
 vlclua_item_meta(arturl, ArtworkURL)
diff --git a/modules/lua/vlc.c b/modules/lua/vlc.c
index df235d0..fe8364c 100644
--- a/modules/lua/vlc.c
+++ b/modules/lua/vlc.c
@@ -378,7 +378,7 @@ void vlclua_read_meta_data( vlc_object_t *p_this, lua_State *L,
     TRY_META( "setting", Setting );
     TRY_META( "url", URL );
     TRY_META( "language",  Language );
-    TRY_META( "nowplaying", NowPlaying );
+    TRY_META( "nowplaying", ItemNowPlaying );
     TRY_META( "publisher",  Publisher );
     TRY_META( "encodedby",  EncodedBy );
     TRY_META( "arturl",     ArtURL );
diff --git a/src/input/es_out.c b/src/input/es_out.c
index 29fee99..33e226a 100644
--- a/src/input/es_out.c
+++ b/src/input/es_out.c
@@ -1012,7 +1012,7 @@ static void EsOutProgramSelect( es_out_t *out, es_out_pgrm_t *p_pgrm )
     }
 
     /* Update now playing */
-    input_item_SetNowPlaying( p_input->p->p_item, p_pgrm->psz_now_playing );
+    input_item_SetESNowPlaying( p_input->p->p_item, p_pgrm->psz_now_playing );
     input_item_SetPublisher( p_input->p->p_item, p_pgrm->psz_publisher );
 
     input_SendEventMeta( p_input );
@@ -1154,7 +1154,7 @@ static void EsOutProgramMeta( es_out_t *out, int i_group, const vlc_meta_t *p_me
 
     /* Check against empty meta data (empty for what we handle) */
     if( !vlc_meta_Get( p_meta, vlc_meta_Title) &&
-        !vlc_meta_Get( p_meta, vlc_meta_NowPlaying) &&
+        !vlc_meta_Get( p_meta, vlc_meta_ESNowPlaying) &&
         !vlc_meta_Get( p_meta, vlc_meta_Publisher) &&
         vlc_meta_GetExtraCount( p_meta ) <= 0 )
     {
@@ -1293,20 +1293,20 @@ static void EsOutProgramEpg( es_out_t *out, int i_group, const vlc_epg_t *p_epg
 
     if( p_pgrm == p_sys->p_pgrm )
     {
-        input_item_SetNowPlaying( p_input->p->p_item, p_pgrm->psz_now_playing );
+        input_item_SetESNowPlaying( p_input->p->p_item, p_pgrm->psz_now_playing );
         input_SendEventMeta( p_input );
     }
 
     if( p_pgrm->psz_now_playing )
     {
         input_Control( p_input, INPUT_ADD_INFO, psz_cat,
-            vlc_meta_TypeToLocalizedString(vlc_meta_NowPlaying), "%s",
+            vlc_meta_TypeToLocalizedString(vlc_meta_ESNowPlaying), "%s",
             p_pgrm->psz_now_playing );
     }
     else
     {
         input_Control( p_input, INPUT_DEL_INFO, psz_cat,
-            vlc_meta_TypeToLocalizedString(vlc_meta_NowPlaying) );
+            vlc_meta_TypeToLocalizedString(vlc_meta_ESNowPlaying) );
     }
 
     free( psz_cat );
diff --git a/src/input/input.c b/src/input/input.c
index 6d64cdb..c4a8d8d 100644
--- a/src/input/input.c
+++ b/src/input/input.c
@@ -447,7 +447,8 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item,
     }
 
     /* Remove 'Now playing' info as it is probably outdated */
-    input_item_SetNowPlaying( p_item, NULL );
+    input_item_SetItemNowPlaying( p_item, NULL );
+    input_item_SetESNowPlaying( p_item, NULL );
     input_SendEventMeta( p_input );
 
     /* */
diff --git a/src/input/item.c b/src/input/item.c
index 40b854e..c77d9bd 100644
--- a/src/input/item.c
+++ b/src/input/item.c
@@ -386,6 +386,17 @@ void input_item_SetDuration( input_item_t *p_i, mtime_t i_duration )
     }
 }
 
+char *input_item_GetNowPlaying( input_item_t *p_item )
+{
+    char *psz_meta = input_item_GetMeta( p_item, vlc_meta_ItemNowPlaying );
+    if( !psz_meta || strlen( psz_meta ) == 0 )
+    {
+        free( psz_meta );
+        return input_item_GetMeta( p_item, vlc_meta_ESNowPlaying );
+    }
+
+    return psz_meta;
+}
 
 bool input_item_IsPreparsed( input_item_t *p_item )
 {
diff --git a/src/input/meta.c b/src/input/meta.c
index f8d1ec9..260047a 100644
--- a/src/input/meta.c
+++ b/src/input/meta.c
@@ -64,7 +64,8 @@ const char * vlc_meta_TypeToLocalizedString( vlc_meta_type_t meta_type )
         [vlc_meta_Setting]     = N_("Setting"),
         [vlc_meta_URL]         = N_("URL"),
         [vlc_meta_Language]    = N_("Language"),
-        [vlc_meta_NowPlaying]  = N_("Now Playing"),
+        [vlc_meta_ESNowPlaying]    = N_("Now Playing"),
+        [vlc_meta_ItemNowPlaying]  = N_("Now Playing"),
         [vlc_meta_Publisher]   = N_("Publisher"),
         [vlc_meta_EncodedBy]   = N_("Encoded by"),
         [vlc_meta_ArtworkURL]  = N_("Artwork URL"),
diff --git a/src/libvlccore.sym b/src/libvlccore.sym
index 10e036a..ee0a8db 100644
--- a/src/libvlccore.sym
+++ b/src/libvlccore.sym
@@ -189,6 +189,7 @@ input_item_GetDuration
 input_item_GetInfo
 input_item_GetMeta
 input_item_GetName
+input_item_GetNowPlaying
 input_item_GetTitleFbName
 input_item_GetURI
 input_item_HasErrorWhenReading
diff --git a/src/text/strings.c b/src/text/strings.c
index a57014b..5eb3f57 100644
--- a/src/text/strings.c
+++ b/src/text/strings.c
@@ -603,7 +603,16 @@ char *str_format_meta(input_thread_t *input, const char *s)
                 write_meta(stream, item, vlc_meta_TrackNumber);
                 break;
             case 'p':
-                write_meta(stream, item, vlc_meta_NowPlaying);
+                if (item == NULL)
+                    break;
+                {
+                    char *value = input_item_GetNowPlaying(item);
+                    if (value == NULL)
+                        break;
+
+                    fputs(value, stream);
+                    free(value);
+                }
                 break;
             case 'r':
                 write_meta(stream, item, vlc_meta_Rating);
@@ -763,18 +772,27 @@ char *str_format_meta(input_thread_t *input, const char *s)
             case 'Z':
                 if (item == NULL)
                     break;
-                if (write_meta(stream, item, vlc_meta_NowPlaying) == EOF)
                 {
-                    char *title = input_item_GetTitleFbName(item);
+                    char *value = input_item_GetNowPlaying(item);
+                    if (value == NULL)
+                        break;
 
-                    if (write_meta(stream, item, vlc_meta_Artist) >= 0
-                     && title != NULL)
-                        fputs(" - ", stream);
+                    int ret = fputs(value, stream);
+                    free(value);
 
-                    if (title != NULL)
+                    if (ret == EOF)
                     {
-                        fputs(title, stream);
-                        free(title);
+                        char *title = input_item_GetTitleFbName(item);
+
+                        if (write_meta(stream, item, vlc_meta_Artist) >= 0
+                            && title != NULL)
+                            fputs(" - ", stream);
+
+                        if (title != NULL)
+                        {
+                            fputs(title, stream);
+                            free(title);
+                        }
                     }
                 }
                 break;
-- 
2.1.3




More information about the vlc-devel mailing list