[Xfce4-commits] <parole:master> Added manual subtitle selection support.

Sean Davis noreply at xfce.org
Fri Nov 16 04:44:01 CET 2012


Updating branch refs/heads/master
         to 0be88c319d2dd5cc6e95edcd5929f5e6d95d8b83 (commit)
       from bac215d9fad5753ed8f176e2f655a057c805c245 (commit)

commit 0be88c319d2dd5cc6e95edcd5929f5e6d95d8b83
Author: Sean Davis <smd.seandavis at gmail.com>
Date:   Thu Nov 15 22:41:37 2012 -0500

    Added manual subtitle selection support.

 src/gst/parole-gst.c   |   97 +++++++++++++++++++++++++++----------
 src/gst/parole-gst.h   |    4 ++
 src/misc/parole-file.c |   65 ++++++++++++++++++++++++-
 src/misc/parole-file.h |    5 ++
 src/parole-player.c    |  126 +++++++++++++++++++++++++++++++++++++++++++-----
 5 files changed, 257 insertions(+), 40 deletions(-)

diff --git a/src/gst/parole-gst.c b/src/gst/parole-gst.c
index bc8dee1..f023609 100644
--- a/src/gst/parole-gst.c
+++ b/src/gst/parole-gst.c
@@ -110,13 +110,16 @@ struct ParoleGstPrivate
     gboolean      buffering;
     gboolean      update_color_balance;
     
+    gboolean      use_custom_subtitles;
+    gchar*        custom_subtitles;
+    
     ParoleAspectRatio aspect_ratio;
     gulong	  state_change_id;
     
     gboolean	  scale_logo;
     
     /*
-     * xvimage sink has brightness+hue+aturation+contrast.
+     * xvimage sink has brightness+hue+saturation+contrast.
      */
     gboolean	  xvimage_sink;
     
@@ -1943,6 +1946,8 @@ parole_gst_init (ParoleGst *gst)
     gst->priv->with_vis = FALSE;
     gst->priv->vis_loaded = FALSE;
     gst->priv->scale_logo = TRUE;
+    gst->priv->use_custom_subtitles = FALSE;
+    gst->priv->custom_subtitles = NULL;
     
     gst->priv->conf = NULL;
     
@@ -2004,6 +2009,31 @@ parole_gst_play_idle (gpointer data)
     return FALSE;
 }
 
+void parole_gst_set_custom_subtitles (ParoleGst *gst, const gchar* sub_file)
+{
+    if ( sub_file == NULL )
+    {
+        gst->priv->use_custom_subtitles = FALSE;
+        gst->priv->custom_subtitles = NULL;
+    }
+    else
+    {
+        gst->priv->use_custom_subtitles = TRUE;
+        gst->priv->custom_subtitles = g_strdup(sub_file);
+    }
+}
+
+gchar * parole_gst_get_file_uri (ParoleGst *gst)
+{
+    gchar* uri;
+
+    g_object_get (G_OBJECT (gst->priv->stream),
+          "uri", &uri,
+          NULL);
+          
+    return uri;
+}
+
 void parole_gst_play_uri (ParoleGst *gst, const gchar *uri, const gchar *subtitles)
 {
     g_mutex_lock (&gst->priv->lock);
@@ -2015,7 +2045,7 @@ void parole_gst_play_uri (ParoleGst *gst, const gchar *uri, const gchar *subtitl
 	          "uri", uri,
 		  "subtitles", subtitles,
 		  NULL);
-
+		  
     g_mutex_unlock (&gst->priv->lock);
     
     if ( gst->priv->state_change_id == 0 )
@@ -2339,40 +2369,54 @@ gst_get_lang_list_for_type (ParoleGst * gst, const gchar * type_name)
     gint i, n = 0;
 
     g_object_get (G_OBJECT (gst->priv->playbin), "n-text", &n, NULL);
-    if (n == 0)
+    
+    if (n == 0 && gst->priv->use_custom_subtitles == FALSE)
       return NULL;
+      
+    if ( gst->priv->use_custom_subtitles == TRUE )
+        n--;
 
-    for (i = 0; i < n; i++) {
-      GstTagList *tags = NULL;
+    if (n != 0)
+    {
+        for (i = 0; i < n; i++) {
+          GstTagList *tags = NULL;
 
-      g_signal_emit_by_name (G_OBJECT (gst->priv->playbin), "get-text-tags",
-          i, &tags);
+          g_signal_emit_by_name (G_OBJECT (gst->priv->playbin), "get-text-tags",
+              i, &tags);
 
-      if (tags) {
-        gchar *lc = NULL, *cd = NULL;
+          if (tags) {
+            gchar *lc = NULL, *cd = NULL;
 
-	gst_tag_list_get_string (tags, GST_TAG_LANGUAGE_CODE, &lc);
-	gst_tag_list_get_string (tags, GST_TAG_CODEC, &lc);
+	    gst_tag_list_get_string (tags, GST_TAG_LANGUAGE_CODE, &lc);
+	    gst_tag_list_get_string (tags, GST_TAG_CODEC, &lc);
 	
-        if (lc) {
-	  ret = g_list_prepend (ret, lc);
-	  g_free (cd);
-	} else if (cd) {
-	  ret = g_list_prepend (ret, cd);
-	} else {
-	  ret = g_list_prepend (ret, g_strdup_printf (_("Subtitle #%d"), num++));
-	}
-	gst_tag_list_free (tags);
-      } else {
-	ret = g_list_prepend (ret, g_strdup_printf (_("Subtitle #%d"), num++));
-      }
+            if (lc) {
+	      ret = g_list_prepend (ret, lc);
+	      g_free (cd);
+	    } else if (cd) {
+	      ret = g_list_prepend (ret, cd);
+	    } else {
+	      ret = g_list_prepend (ret, g_strdup_printf (_("Subtitle #%d"), num++));
+	    }
+	    gst_tag_list_free (tags);
+          } else {
+	    ret = g_list_prepend (ret, g_strdup_printf (_("Subtitle #%d"), num++));
+          }
+        }
+    }
+    
+    ret = g_list_reverse (ret);
+    
+    if ( gst->priv->use_custom_subtitles == TRUE )
+    {
+        ret = g_list_prepend (ret, g_strdup_printf("%s",gst->priv->custom_subtitles));
     }
   } else {
     g_critical ("Invalid stream type '%s'", type_name);
     return NULL;
   }
 
-  return g_list_reverse (ret);
+  return ret;
 }
 
 gboolean
@@ -2404,7 +2448,10 @@ gst_set_current_subtitle_track( ParoleGst *gst, gint track_no )
 		  "uri", &uri,
 		  NULL);
 		  
-	sub = (gchar*) parole_get_subtitle_path(uri);
+    if ( gst->priv->use_custom_subtitles == TRUE )
+        sub = gst->priv->custom_subtitles;
+    else
+	    sub = (gchar*) parole_get_subtitle_path(uri);
 
 	g_object_get (gst->priv->playbin, "flags", &flags, NULL);
 	
diff --git a/src/gst/parole-gst.h b/src/gst/parole-gst.h
index 680c928..a5e1208 100644
--- a/src/gst/parole-gst.h
+++ b/src/gst/parole-gst.h
@@ -84,6 +84,10 @@ GtkWidget      	       *parole_gst_new             	(gpointer conf_obj);
 
 GtkWidget	       *parole_gst_get 			(void);
 
+void parole_gst_set_custom_subtitles (ParoleGst *gst, const gchar* sub_file);
+
+gchar* parole_gst_get_file_uri (ParoleGst *gst);
+
 void		        parole_gst_play_uri        	(ParoleGst *gst,
 							 const gchar *uri,
 							 const gchar *subtitles);
diff --git a/src/misc/parole-file.c b/src/misc/parole-file.c
index 006a2e9..531948b 100644
--- a/src/misc/parole-file.c
+++ b/src/misc/parole-file.c
@@ -45,8 +45,9 @@ struct _ParoleFilePrivate
     gchar 	*filename;
     gchar 	*display_name;
     gchar 	*uri;
-    gchar       *content_type;
+    gchar   *content_type;
 	gchar	*directory;
+	gchar   *custom_subtitles;
     
 };
 
@@ -57,7 +58,8 @@ enum
     PROP_DISPLAY_NAME,
     PROP_URI,
     PROP_CONTENT_TYPE,
-	PROP_DIRECTORY
+	PROP_DIRECTORY,
+	PROP_CUSTOM_SUBTITLES
 };
 
 G_DEFINE_TYPE (ParoleFile, parole_file, G_TYPE_OBJECT)
@@ -85,6 +87,9 @@ parole_file_finalize (GObject *object)
 	
 	if ( priv->directory )
 	g_free (priv->directory);
+	
+	if ( priv->custom_subtitles )
+	g_free (priv->custom_subtitles);
     
     G_OBJECT_CLASS (parole_file_parent_class)->finalize (object);
 }
@@ -107,6 +112,9 @@ parole_file_set_property (GObject *object, guint prop_id,
 	case PROP_DIRECTORY:
 		PAROLE_FILE_GET_PRIVATE (file)->directory = g_value_dup_string (value);
 		break;
+	case PROP_CUSTOM_SUBTITLES:
+	    PAROLE_FILE_GET_PRIVATE (file)->custom_subtitles = g_value_dup_string (value);
+	    break;
 	default:
 	    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 	    break;
@@ -138,6 +146,9 @@ parole_file_get_property (GObject *object, guint prop_id,
 	case PROP_DIRECTORY:
 	    g_value_set_string (value, PAROLE_FILE_GET_PRIVATE (file)->directory);
 	    break;
+    case PROP_CUSTOM_SUBTITLES:
+        g_value_set_string (value, PAROLE_FILE_GET_PRIVATE (file)->custom_subtitles);
+        break;
 	default:
 	    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 	    break;
@@ -316,6 +327,22 @@ parole_file_class_init (ParoleFileClass *klass)
 							  NULL,
 							  G_PARAM_CONSTRUCT_ONLY|
 							  G_PARAM_READWRITE));
+							  
+    /**
+     * ParoleFile:custom_subtitles:
+     *
+     * The custom subtitles set by the user.
+     *
+     * Since: 0.3.0.4
+     **/
+    g_object_class_install_property (object_class,
+				     PROP_CUSTOM_SUBTITLES,
+				     g_param_spec_string ("custom_subtitles",
+							  "Custom Subtitles", 
+							  "The custom subtitles set by the user",
+							  NULL,
+							  G_PARAM_CONSTRUCT_ONLY|
+							  G_PARAM_READWRITE));
 
     g_type_class_add_private (klass, sizeof (ParoleFilePrivate));
 }
@@ -332,6 +359,7 @@ parole_file_init (ParoleFile *file)
     priv->uri          = NULL;
     priv->content_type    = NULL;
 	priv->directory			= NULL;
+	priv->custom_subtitles = NULL;
 }
 
 /**
@@ -457,3 +485,36 @@ parole_file_get_directory (const ParoleFile *file)
     
     return PAROLE_FILE_GET_PRIVATE (file)->directory;
 }
+
+/**
+ * parole_file_get_custom_subtitles:
+ * @file: a #ParoleFile.
+ *
+ *
+ * Returns: A string containing the custom subtitles file path.
+ *
+ * Since: 0.3.0.4
+ **/
+const gchar *
+parole_file_get_custom_subtitles (const ParoleFile *file)
+{
+    g_return_val_if_fail (PAROLE_IS_FILE (file), NULL);
+    
+    return PAROLE_FILE_GET_PRIVATE (file)->custom_subtitles;
+}
+
+void
+parole_file_set_custom_subtitles (const ParoleFile *file, gchar *suburi)
+{
+    GValue value = G_VALUE_INIT;
+    g_value_init (&value, G_TYPE_STRING);
+    g_value_set_static_string (&value, suburi);
+    
+    parole_file_set_property (G_OBJECT(file), PROP_CUSTOM_SUBTITLES, 
+			      &value, g_param_spec_string ("custom_subtitles",
+							  "Custom Subtitles", 
+							  "The custom subtitles set by the user",
+							  NULL,
+							  G_PARAM_CONSTRUCT_ONLY|
+							  G_PARAM_READWRITE));
+}
diff --git a/src/misc/parole-file.h b/src/misc/parole-file.h
index b286d82..7b55450 100644
--- a/src/misc/parole-file.h
+++ b/src/misc/parole-file.h
@@ -52,6 +52,9 @@ ParoleFile       	       *parole_file_new             	  (const gchar *filename)
 
 ParoleFile       	       *parole_file_new_with_display_name (const gchar *filename,
 								   const gchar *display_name);
+								   
+
+void parole_file_set_custom_subtitles (const ParoleFile *file, gchar *suburi);
                                    
 const gchar   G_CONST_RETURN   *parole_file_get_directory 	  (const ParoleFile *file) G_GNUC_PURE;
 
@@ -63,6 +66,8 @@ const gchar   G_CONST_RETURN   *parole_file_get_uri 		  (const ParoleFile *file)
 
 const gchar   G_CONST_RETURN   *parole_file_get_content_type      (const ParoleFile *file) G_GNUC_PURE;
 
+const gchar   G_CONST_RETURN   *parole_file_get_custom_subtitles (const ParoleFile *file) G_GNUC_PURE;
+
 G_END_DECLS
 
 #endif /* __PAROLE_MEDIA_FILE_H */
diff --git a/src/parole-player.c b/src/parole-player.c
index 2e3d010..3573965 100644
--- a/src/parole-player.c
+++ b/src/parole-player.c
@@ -103,6 +103,9 @@ static void parole_player_disc_selected_cb (ParoleDisc *disc,
 					    const gchar *uri, 
 					    const gchar *device, 
 					    ParolePlayer *player);
+					    
+
+static void parole_player_select_custom_subtitle (GtkMenuItem *widget, gpointer data);
 
 /*
  * GtkBuilder Callbacks
@@ -256,6 +259,7 @@ static void parole_player_audiotrack_radio_menu_item_changed_cb(GtkWidget *widge
 
 static void parole_player_subtitles_radio_menu_item_changed_cb(GtkWidget *widget, ParolePlayer *player);
 
+
 gboolean	parole_player_key_press 		(GtkWidget *widget, 
 							 GdkEventKey *ev, 
 							 ParolePlayer *player);
@@ -326,7 +330,9 @@ struct ParolePlayerPrivate
     GList			*audio_list;
     GList			*subtitle_list;
     gboolean		update_languages;
+    gboolean        updated_subs;
     GtkWidget		*subtitles_group;
+    GtkWidget       *subtitles_menu_custom;
     GtkWidget		*audio_group;
     
     GtkWidget		*subtitles_menu;
@@ -445,6 +451,8 @@ typedef enum
     PAROLE_ISO_IMAGE_CD
 } ParoleIsoImage;
 
+
+
 static void
 iso_files_folder_changed_cb (GtkFileChooser *widget, gpointer data)
 {
@@ -558,6 +566,8 @@ parole_player_reset (ParolePlayer *player)
     }
 }
 
+
+
 static gboolean
 parole_sublang_equal_lists (GList *orig, GList *new)
 {
@@ -769,16 +779,16 @@ parole_player_update_subtitles (ParolePlayer *player, ParoleGst *gst)
 	if (sub_enabled)
 	sub_index = 1;
 	
-	if (parole_sublang_equal_lists (player->priv->subtitle_list, list) == TRUE)
-	{
-		if (g_list_length (list) == 0)
-		{
-			parole_player_clear_subtitles(player);
-		}
-		return;
-	}
-	
-	parole_player_set_subtitles_list (player, list);
+    if (parole_sublang_equal_lists (player->priv->subtitle_list, list) == TRUE)
+    {
+	    if (g_list_length (list) == 0)
+	    {
+		    parole_player_clear_subtitles(player);
+	    }
+	    return;
+    }
+
+    parole_player_set_subtitles_list (player, list);
 	
 	gtk_combo_box_set_active( GTK_COMBO_BOX(player->priv->combobox_subtitles), sub_index );
 	
@@ -799,12 +809,94 @@ parole_player_update_languages (ParolePlayer *player, ParoleGst *gst)
 		{
 			parole_player_update_audio_tracks(player, gst);
 			parole_player_update_subtitles(player, gst);
+			gtk_widget_set_sensitive(player->priv->subtitles_menu_custom, TRUE);
 		}
+		else
+		    gtk_widget_set_sensitive(player->priv->subtitles_menu_custom, FALSE);
 		player->priv->update_languages = FALSE;
 	}
 }
 
 static void
+parole_player_select_custom_subtitle (GtkMenuItem *widget, gpointer data)
+{
+    ParolePlayer *player;
+    GtkWidget *chooser;
+    GtkFileFilter *filter;
+    gchar *sub = NULL;
+    const gchar *folder;
+    gint response;
+    gchar *uri = NULL;
+    
+    GtkTreeRowReference *row;
+    
+    player = PAROLE_PLAYER(data);
+    row = parole_media_list_get_selected_row (player->priv->list);
+    
+    ParoleFile *file;
+    GtkTreeIter iter;
+    GtkTreeModel *model;
+
+    chooser = gtk_file_chooser_dialog_new (_("Select Subtitle (.srt) File"), NULL,
+					   GTK_FILE_CHOOSER_ACTION_OPEN,
+					   GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+					   GTK_STOCK_OPEN, GTK_RESPONSE_OK,
+					   NULL);
+				
+    gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (chooser), FALSE);
+    
+    folder = parole_rc_read_entry_string ("iso-image-folder", PAROLE_RC_GROUP_GENERAL, NULL);
+    
+    if ( folder )
+	gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (chooser), folder);
+    
+    filter = gtk_file_filter_new ();
+    gtk_file_filter_set_name (filter, "SubRip Text");
+    gtk_file_filter_add_mime_type (filter, "application/x-subrip");
+    gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
+
+    gtk_window_set_default_size (GTK_WINDOW (chooser), 680, 480);
+    response = gtk_dialog_run (GTK_DIALOG (chooser));
+    
+    if ( response == GTK_RESPONSE_OK )
+	    sub = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser));
+    
+    gtk_widget_destroy (chooser);
+    
+    if ( sub )
+    {
+    uri = parole_gst_get_file_uri(PAROLE_GST (player->priv->gst));
+    
+    parole_player_reset(player);
+    
+    if ( g_str_has_prefix (uri, "file:/") )
+    {
+	    TRACE ("Trying to play media file %s", uri);
+	    TRACE ("Trying to use subtitle file %s", sub);
+	    player->priv->updated_subs = TRUE;
+	    
+	    player->priv->row = gtk_tree_row_reference_copy (row);
+    
+        model = gtk_tree_row_reference_get_model (row);
+        
+        if ( gtk_tree_model_get_iter (model, &iter, gtk_tree_row_reference_get_path (row)) )
+        {
+	    gtk_tree_model_get (model, &iter, DATA_COL, &file, -1);
+	
+	    parole_file_set_custom_subtitles(file, sub);
+	    
+	    parole_gst_set_custom_subtitles(PAROLE_GST (player->priv->gst), sub);
+	    parole_gst_play_uri (PAROLE_GST (player->priv->gst), 
+				 uri,
+				 sub);
+	    }
+    }
+
+	g_free (sub);
+	g_free (uri);
+}}
+
+static void
 parole_player_media_activated_cb (ParoleMediaList *list, GtkTreeRowReference *row, ParolePlayer *player)
 {
     ParoleFile *file;
@@ -823,7 +915,7 @@ parole_player_media_activated_cb (ParoleMediaList *list, GtkTreeRowReference *ro
 	
 	if ( file )
 	{
-	    gchar *sub = NULL;
+	    const gchar *sub = NULL;
 	    const gchar *uri;
 	    
 	    uri = parole_file_get_uri (file);
@@ -832,7 +924,10 @@ parole_player_media_activated_cb (ParoleMediaList *list, GtkTreeRowReference *ro
 	    {
 		if ( parole_file_filter (player->priv->video_filter, file) )
 		{
-		    sub = parole_get_subtitle_path (uri);
+		    sub = parole_file_get_custom_subtitles (file);
+		    parole_gst_set_custom_subtitles(PAROLE_GST(player->priv->gst), sub);
+		    if (sub == NULL)
+		        sub = parole_get_subtitle_path (uri);
 		}
 	    }
 	    TRACE ("Trying to play media file %s", uri);
@@ -841,7 +936,6 @@ parole_player_media_activated_cb (ParoleMediaList *list, GtkTreeRowReference *ro
 	    parole_gst_play_uri (PAROLE_GST (player->priv->gst), 
 				 parole_file_get_uri (file),
 				 sub);
-	    g_free (sub);
 	    
 	    gtk_window_set_title (GTK_WINDOW (player->priv->window), parole_file_get_display_name(file));
 		parole_rc_write_entry_string ("media-chooser-folder", PAROLE_RC_GROUP_GENERAL, parole_file_get_directory(file));
@@ -2459,6 +2553,11 @@ parole_player_init (ParolePlayer *player)
     player->priv->languages_menu = GTK_WIDGET (gtk_builder_get_object (builder, "languages-menu"));
     
     player->priv->subtitles_group = GTK_WIDGET (gtk_builder_get_object (builder, "subtitles-menu-none"));
+    player->priv->subtitles_menu_custom = GTK_WIDGET (gtk_builder_get_object (builder, "subtitles-menu-custom"));
+    
+    g_signal_connect (player->priv->subtitles_menu_custom, "activate",
+		      G_CALLBACK (parole_player_select_custom_subtitle), player);
+    
     player->priv->audio_group = NULL;
    
     player->priv->main_nt = GTK_WIDGET (gtk_builder_get_object (builder, "main-notebook"));
@@ -2526,6 +2625,7 @@ parole_player_init (ParolePlayer *player)
                                
 	gtk_box_pack_start( GTK_BOX( player->priv->hbox_infobar ), player->priv->infobar, TRUE, TRUE, 0);
 	player->priv->update_languages = FALSE;
+	player->priv->updated_subs = FALSE;
 	
     gtk_scale_button_set_value (GTK_SCALE_BUTTON (player->priv->volume), 
 			 (gdouble) (parole_rc_read_entry_int ("volume", PAROLE_RC_GROUP_GENERAL, 100)/100.));


More information about the Xfce4-commits mailing list