[totem] plugins: Add autoload-subtitles plugin
- From: Bastien Nocera <hadess src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [totem] plugins: Add autoload-subtitles plugin
- Date: Sat, 21 Apr 2012 20:46:02 +0000 (UTC)
commit ad1cf67b07a1a3ebd6d43aec92996b54d710b80c
Author: Bastien Nocera <hadess hadess net>
Date: Sat Apr 21 21:42:11 2012 +0100
plugins: Add autoload-subtitles plugin
To autoload subtitles the same way we used to.
https://bugzilla.gnome.org/show_bug.cgi?id=674469
configure.in | 3 +-
src/plugins/autoload-subtitles/Makefile.am | 13 +
.../autoload-subtitles.plugin.in | 9 +
.../autoload-subtitles/totem-autoload-subtitles.c | 284 ++++++++++++++++++++
4 files changed, 308 insertions(+), 1 deletions(-)
---
diff --git a/configure.in b/configure.in
index beeaf4f..a78f51d 100644
--- a/configure.in
+++ b/configure.in
@@ -70,7 +70,7 @@ AC_SUBST(TOTEM_API_VERSION)
AC_DEFINE_UNQUOTED(TOTEM_API_VERSION, ["$TOTEM_API_VERSION"], [Define to the Totem plugin API version])
# The full list of plugins
-allowed_plugins="apple-trailers brasero-disc-recorder chapters dbusservice im-status gromit iplayer lirc media-player-keys ontop opensubtitles properties pythonconsole rotation save-file samplepython sample-vala screensaver screenshot sidebar-test skipto zeitgeist-dp grilo"
+allowed_plugins="apple-trailers autoload-subtitles brasero-disc-recorder chapters dbusservice im-status gromit iplayer lirc media-player-keys ontop opensubtitles properties pythonconsole rotation save-file samplepython sample-vala screensaver screenshot sidebar-test skipto zeitgeist-dp grilo"
PLUGINDIR='${libdir}/totem/plugins'
AC_SUBST(PLUGINDIR)
@@ -743,6 +743,7 @@ src/gst/Makefile
src/properties/Makefile
src/plugins/Makefile
src/plugins/apple-trailers/Makefile
+src/plugins/autoload-subtitles/Makefile
src/plugins/dbusservice/Makefile
src/plugins/screensaver/Makefile
src/plugins/screenshot/Makefile
diff --git a/src/plugins/autoload-subtitles/Makefile.am b/src/plugins/autoload-subtitles/Makefile.am
new file mode 100644
index 0000000..d7bc8f4
--- /dev/null
+++ b/src/plugins/autoload-subtitles/Makefile.am
@@ -0,0 +1,13 @@
+include $(top_srcdir)/src/plugins/Makefile.plugins
+
+plugindir = $(PLUGINDIR)/autoload-subtitles
+plugin_LTLIBRARIES = libautoload-subtitles.la
+
+plugin_in_files = autoload-subtitles.plugin.in
+
+libautoload_subtitles_la_SOURCES = totem-autoload-subtitles.c
+libautoload_subtitles_la_LDFLAGS = $(plugin_ldflags)
+libautoload_subtitles_la_LIBADD = $(plugin_libadd)
+libautoload_subtitles_la_CFLAGS = $(plugin_cflags)
+
+-include $(top_srcdir)/git.mk
diff --git a/src/plugins/autoload-subtitles/autoload-subtitles.plugin.in b/src/plugins/autoload-subtitles/autoload-subtitles.plugin.in
new file mode 100644
index 0000000..b0f7051
--- /dev/null
+++ b/src/plugins/autoload-subtitles/autoload-subtitles.plugin.in
@@ -0,0 +1,9 @@
+[Plugin]
+Module=autoload-subtitles
+IAge=1
+Builtin=true
+Name=Autoload subtitles
+Description=Autoloads text subtitles
+Authors=Bastien Nocera
+Copyright=Copyright  2012 Bastien Nocera
+Website=http://www.gnome.org/projects/totem/
diff --git a/src/plugins/autoload-subtitles/totem-autoload-subtitles.c b/src/plugins/autoload-subtitles/totem-autoload-subtitles.c
new file mode 100644
index 0000000..160a509
--- /dev/null
+++ b/src/plugins/autoload-subtitles/totem-autoload-subtitles.c
@@ -0,0 +1,284 @@
+/*
+ * Copyright (C) 2012 Bastien Nocera <hadess hadess net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ *
+ * The Totem project hereby grant permission for non-gpl compatible GStreamer
+ * plugins to be used and distributed together with GStreamer and Totem. This
+ * permission are above and beyond the permissions granted by the GPL license
+ * Totem is covered by.
+ *
+ * Monday 7th February 2005: Christian Schaller: Add exception clause.
+ * See license_change file for details.
+ *
+ */
+
+
+#include "config.h"
+
+#include <glib-object.h>
+#include <string.h>
+
+#include "totem-plugin.h"
+#include "totem.h"
+
+#define TOTEM_TYPE_AUTOLOAD_SUBTITLES_PLUGIN (totem_autoload_subtitles_plugin_get_type ())
+#define TOTEM_AUTOLOAD_SUBTITLES_PLUGIN(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TOTEM_TYPE_AUTOLOAD_SUBTITLES_PLUGIN, TotemAutoloadSubtitlesPlugin))
+
+typedef struct {
+ guint signal_id;
+ TotemObject *totem;
+ GSettings *settings;
+ gboolean autoload_subs;
+} TotemAutoloadSubtitlesPluginPrivate;
+
+TOTEM_PLUGIN_REGISTER(TOTEM_TYPE_AUTOLOAD_SUBTITLES_PLUGIN, TotemAutoloadSubtitlesPlugin, totem_autoload_subtitles_plugin)
+
+/* List from xine-lib's demux_sputext.c.
+ * Keep in sync with the list in totem_setup_file_filters() in this file.
+ * Don't add .txt extensions, as there are too many false positives. */
+static const char subtitle_ext[][4] = {
+ "sub",
+ "srt",
+ "smi",
+ "ssa",
+ "ass",
+ "asc"
+};
+
+static gboolean
+totem_uri_exists (const char *uri)
+{
+ GFile *file = g_file_new_for_uri (uri);
+ if (file != NULL) {
+ if (g_file_query_exists (file, NULL)) {
+ g_object_unref (file);
+ return TRUE;
+ }
+ g_object_unref (file);
+ }
+ return FALSE;
+}
+
+static char *
+totem_uri_get_subtitle_for_uri (const char *uri)
+{
+ char *subtitle;
+ guint len, i;
+ gint suffix;
+
+ g_return_val_if_fail (uri != NULL, NULL);
+
+ /* Find the filename suffix delimiter */
+ len = strlen (uri);
+ for (suffix = len - 1; suffix > 0; suffix--) {
+ if (uri[suffix] == G_DIR_SEPARATOR ||
+ (uri[suffix] == '/')) {
+ /* This filename has no extension; we'll need to add one */
+ suffix = len;
+ break;
+ }
+ if (uri[suffix] == '.') {
+ /* Found our extension marker */
+ break;
+ }
+ }
+ if (suffix < 0)
+ return NULL;
+
+ /* Generate a subtitle string with room at the end to store the
+ * 3 character extensions for which we want to search */
+ subtitle = g_malloc0 (suffix + 4 + 1);
+ g_return_val_if_fail (subtitle != NULL, NULL);
+ g_strlcpy (subtitle, uri, suffix + 4 + 1);
+ g_strlcpy (subtitle + suffix, ".???", 5);
+
+ /* Search for any files with one of our known subtitle extensions */
+ for (i = 0; i < G_N_ELEMENTS (subtitle_ext) ; i++) {
+ char *subtitle_ext_upper;
+ memcpy (subtitle + suffix + 1, subtitle_ext[i], 3);
+
+ if (totem_uri_exists (subtitle))
+ return subtitle;
+
+ /* Check with upper-cased extension */
+ subtitle_ext_upper = g_ascii_strup (subtitle_ext[i], -1);
+ memcpy (subtitle + suffix + 1, subtitle_ext_upper, 3);
+ g_free (subtitle_ext_upper);
+
+ if (totem_uri_exists (subtitle))
+ return subtitle;
+ }
+ g_free (subtitle);
+ return NULL;
+}
+
+static char *
+totem_uri_get_subtitle_in_subdir (GFile *file, const char *subdir)
+{
+ char *filename, *subtitle, *full_path_str;
+ GFile *parent, *full_path, *directory;
+
+ /* Get the sibling directory @subdir of the file @file */
+ parent = g_file_get_parent (file);
+ directory = g_file_get_child (parent, subdir);
+ g_object_unref (parent);
+
+ /* Get the file of the same name as @file in the @subdir directory */
+ filename = g_file_get_basename (file);
+ full_path = g_file_get_child (directory, filename);
+ g_object_unref (directory);
+ g_free (filename);
+
+ /* Get the subtitles from that URI */
+ full_path_str = g_file_get_uri (full_path);
+ g_object_unref (full_path);
+ subtitle = totem_uri_get_subtitle_for_uri (full_path_str);
+ g_free (full_path_str);
+
+ return subtitle;
+}
+
+static char *
+totem_uri_get_cached_subtitle_for_uri (const char *uri)
+{
+ char *filename, *basename, *fake_filename, *fake_uri, *ret;
+
+ filename = g_filename_from_uri (uri, NULL, NULL);
+ if (filename == NULL)
+ return NULL;
+
+ basename = g_path_get_basename (filename);
+ g_free (filename);
+ if (basename == NULL || strcmp (basename, ".") == 0) {
+ g_free (basename);
+ return NULL;
+ }
+
+ fake_filename = g_build_filename (g_get_user_cache_dir (),
+ "totem",
+ "subtitles",
+ basename,
+ NULL);
+ g_free (basename);
+ fake_uri = g_filename_to_uri (fake_filename, NULL, NULL);
+ g_free (fake_filename);
+
+ ret = totem_uri_get_subtitle_for_uri (fake_uri);
+ g_free (fake_uri);
+
+ return ret;
+}
+
+static char *
+totem_uri_get_subtitle_uri (const char *uri)
+{
+ GFile *file;
+ char *subtitle;
+
+ if (g_str_has_prefix (uri, "http") != FALSE ||
+ g_str_has_prefix (uri, "rtsp") != FALSE ||
+ g_str_has_prefix (uri, "rtmp") != FALSE)
+ return NULL;
+
+ /* Has the user specified a subtitle file manually? */
+ if (strstr (uri, "#subtitle:") != NULL)
+ return NULL;
+
+ /* Does the file exist? */
+ file = g_file_new_for_uri (uri);
+ if (g_file_query_exists (file, NULL) != TRUE) {
+ g_object_unref (file);
+ return NULL;
+ }
+
+ /* Try in the cached subtitles directory */
+ subtitle = totem_uri_get_cached_subtitle_for_uri (uri);
+ if (subtitle != NULL) {
+ g_object_unref (file);
+ return subtitle;
+ }
+
+ /* Try in the current directory */
+ subtitle = totem_uri_get_subtitle_for_uri (uri);
+ if (subtitle != NULL) {
+ g_object_unref (file);
+ return subtitle;
+ }
+
+ subtitle = totem_uri_get_subtitle_in_subdir (file, "subtitles");
+ g_object_unref (file);
+
+ return subtitle;
+}
+
+
+
+static char *
+get_text_subtitle_cb (TotemObject *totem,
+ const char *mrl,
+ TotemAutoloadSubtitlesPlugin *pi)
+{
+ char *sub;
+
+ if (pi->priv->autoload_subs == FALSE)
+ return NULL;
+
+ sub = totem_uri_get_subtitle_uri (mrl);
+
+ return sub;
+}
+
+static void
+autoload_subs_changed (GSettings *settings,
+ char *key,
+ TotemAutoloadSubtitlesPlugin *pi)
+{
+ pi->priv->autoload_subs = g_settings_get_boolean (settings, "autoload-subtitles");
+}
+
+static void
+impl_activate (PeasActivatable *plugin)
+{
+ TotemAutoloadSubtitlesPlugin *pi = TOTEM_AUTOLOAD_SUBTITLES_PLUGIN (plugin);
+
+ pi->priv->totem = g_object_ref (g_object_get_data (G_OBJECT (plugin), "object"));
+ pi->priv->settings = g_settings_new ("org.gnome.totem");
+ pi->priv->autoload_subs = g_settings_get_boolean (pi->priv->settings, "autoload-subtitles");
+ g_signal_connect (pi->priv->settings, "changed::autoload-subtitles",
+ G_CALLBACK (autoload_subs_changed), pi);
+ pi->priv->signal_id = g_signal_connect (G_OBJECT (pi->priv->totem), "get-text-subtitle",
+ G_CALLBACK (get_text_subtitle_cb), pi);
+}
+
+static void
+impl_deactivate (PeasActivatable *plugin)
+{
+ TotemAutoloadSubtitlesPlugin *pi = TOTEM_AUTOLOAD_SUBTITLES_PLUGIN (plugin);
+
+ if (pi->priv->signal_id) {
+ g_signal_handler_disconnect (pi->priv->totem, pi->priv->signal_id);
+ pi->priv->signal_id = 0;
+ }
+ if (pi->priv->totem) {
+ g_object_unref (pi->priv->totem);
+ pi->priv->totem = NULL;
+ }
+ if (pi->priv->settings) {
+ g_object_unref (pi->priv->settings);
+ pi->priv->settings = NULL;
+ }
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]