[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