]> git.sesse.net Git - vlc/commitdiff
Fix broken NowPlaying (close #9960, #11796, #12850)
authorLudovic Fauvet <etix@videolan.org>
Wed, 17 Dec 2014 13:26:50 +0000 (14:26 +0100)
committerLudovic Fauvet <etix@videolan.org>
Thu, 18 Dec 2014 10:27:25 +0000 (11:27 +0100)
Prevent the es_out from overriding the NowPlaying state by splitting
the meta into NowPlaying and ESNowPlaying.

The function input_item_GetNowPlayingFb can be used to return the
preferred meta value.

12 files changed:
include/vlc_input_item.h
include/vlc_meta.h
lib/media.c
modules/notify/growl.m
src/input/es_out.c
src/input/input.c
src/input/item.c
src/input/meta.c
src/input/resource.c
src/libvlccore.sym
src/text/strings.c
src/video_output/video_epg.c

index 1bfb2f96f896665d32c344548e66eba9fb69b4f9..8502dd3899fabe7b1c04f0a4e783cc98922e17a4 100644 (file)
@@ -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_GetNowPlayingFb( 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 );
@@ -223,6 +224,7 @@ INPUT_META(Setting)
 INPUT_META(URL)
 INPUT_META(Language)
 INPUT_META(NowPlaying)
+INPUT_META(ESNowPlaying)
 INPUT_META(Publisher)
 INPUT_META(EncodedBy)
 INPUT_META(ArtworkURL)
index c87643e42324380230b0e49aa7f1b0c00f97848c..bb82c3be70df458820ce299a89f7fd7d405e21e4 100644 (file)
@@ -45,6 +45,7 @@ typedef enum vlc_meta_type_t
     vlc_meta_URL,
     vlc_meta_Language,
     vlc_meta_NowPlaying,
+    vlc_meta_ESNowPlaying,
     vlc_meta_Publisher,
     vlc_meta_EncodedBy,
     vlc_meta_ArtworkURL,
index 5e406a4a229e6a06415003c84d11e13c66711502..7d4bbb953804847812f0841ef8806091cd8c6cc4 100644 (file)
@@ -88,6 +88,7 @@ static const libvlc_meta_t vlc_to_libvlc_meta[] =
     [vlc_meta_URL]          = libvlc_meta_URL,
     [vlc_meta_Language]     = libvlc_meta_Language,
     [vlc_meta_NowPlaying]   = 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_GetNowPlayingFb( 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;
 }
 
index 95010833d2e72b82f62579ef613e9d3efc3a1f98..4c5c28106e4e83285c5d2ac9a08a8cecd6cc6ecc 100644 (file)
@@ -201,8 +201,8 @@ static int ItemChange( vlc_object_t *p_this, const char *psz_var,
     }
 
     /* Playing something ... */
-    if( input_item_GetNowPlaying( p_item ) )
-        psz_title = input_item_GetNowPlaying( p_item );
+    if( input_item_GetNowPlayingFb( p_item ) )
+        psz_title = input_item_GetNowPlayingFb( p_item );
     else
         psz_title = input_item_GetTitleFbName( p_item );
     if( EMPTY_STR( psz_title ) )
index 29fee9949bf7fd7457ab9357314b2bdb582cf007..33e226ac1f113cc6e28638d974d7bbcdd3cb24da 100644 (file)
@@ -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 );
index 6d64cdb08c652fdb9a7d4f9473237c48334c6706..aa5a835128fed3d90937a2c68067c86a5f243585 100644 (file)
@@ -448,6 +448,7 @@ 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_SetESNowPlaying( p_item, NULL );
     input_SendEventMeta( p_input );
 
     /* */
index 40b854e7ee2218c71f9a0ee00d881f63a8c917fb..33c7b26c06a58ec6bef9c981ce49b84692a0b5d8 100644 (file)
@@ -386,6 +386,17 @@ void input_item_SetDuration( input_item_t *p_i, mtime_t i_duration )
     }
 }
 
+char *input_item_GetNowPlayingFb( input_item_t *p_item )
+{
+    char *psz_meta = input_item_GetMeta( p_item, vlc_meta_NowPlaying );
+    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 )
 {
index f8d1ec9c9e35053768e60351dff262c063a760ce..50001ff317474cfc1937a473168c2ead8d3f56a3 100644 (file)
@@ -64,6 +64,7 @@ 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_ESNowPlaying]= N_("Now Playing"),
         [vlc_meta_NowPlaying]  = N_("Now Playing"),
         [vlc_meta_Publisher]   = N_("Publisher"),
         [vlc_meta_EncodedBy]   = N_("Encoded by"),
index 779c921a2c69a87cfee59de2071dcd49c4dba96e..34402885ec500db3ed22f7c8e431d96ed30d1cca 100644 (file)
@@ -158,7 +158,7 @@ static void DisplayVoutTitle( input_resource_t *p_resource,
 
     input_item_t *p_item = input_GetItem( p_resource->p_input );
 
-    char *psz_nowplaying = input_item_GetNowPlaying( p_item );
+    char *psz_nowplaying = input_item_GetNowPlayingFb( p_item );
     if( psz_nowplaying && *psz_nowplaying )
     {
         vout_DisplayTitle( p_vout, psz_nowplaying );
index 10e036a2295169e2c95f77c487e89a3fba0bf687..7f06ed69acdff7cc1c412c0d7c7a30559c5bcd92 100644 (file)
@@ -189,6 +189,7 @@ input_item_GetDuration
 input_item_GetInfo
 input_item_GetMeta
 input_item_GetName
+input_item_GetNowPlayingFb
 input_item_GetTitleFbName
 input_item_GetURI
 input_item_HasErrorWhenReading
index a57014b722119b4751964ef597ffc439b4a60462..fefc984309c8ad7835226751dea9fbbcb497598d 100644 (file)
@@ -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_GetNowPlayingFb(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_GetNowPlayingFb(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;
index 471d52c2fb859601ffb4bc2cd1435f5cc4ea8354..a0b5c6fe3eda0fc16ee3bbec64f1816631b51711 100644 (file)
@@ -263,7 +263,7 @@ static void OSDEpgDestroy(subpicture_t *subpic)
  */
 int vout_OSDEpg(vout_thread_t *vout, input_item_t *input)
 {
-    char *now_playing = input_item_GetNowPlaying(input);
+    char *now_playing = input_item_GetNowPlayingFb(input);
     vlc_epg_t *epg = NULL;
 
     vlc_mutex_lock(&input->lock);