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

commit 0be88c319d2dd5cc6e95edcd5929f5e6d95d8b83
Author: Sean Davis <[email protected]>
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.));
_______________________________________________
Xfce4-commits mailing list
[email protected]
https://mail.xfce.org/mailman/listinfo/xfce4-commits

Reply via email to