[totem-pl-parser/wip/hadess/add-ignored-extensions: 12/13] plparser: Add totem_pl_parser_add_ignored_glob()



commit a6f21e789f125d9e8b1aa73b5d530211224584d5
Author: Bastien Nocera <hadess hadess net>
Date:   Thu Nov 7 17:28:20 2019 +0100

    plparser: Add totem_pl_parser_add_ignored_glob()
    
    Add a way to ignore globs, such as "*.txt", as ignoring mime-types
    doesn't do everything that we might want to do with files, eg. even
    if "text/plain" text files could be a playlist, a "*.txt" file would
    almost never be.

 docs/reference/totem-pl-parser-sections.txt |  1 +
 plparse/plparser.map                        |  1 +
 plparse/totem-pl-parser.c                   | 55 +++++++++++++++++++++++++++++
 plparse/totem-pl-parser.h                   |  2 ++
 4 files changed, 59 insertions(+)
---
diff --git a/docs/reference/totem-pl-parser-sections.txt b/docs/reference/totem-pl-parser-sections.txt
index b8bede0..23b77af 100644
--- a/docs/reference/totem-pl-parser-sections.txt
+++ b/docs/reference/totem-pl-parser-sections.txt
@@ -18,6 +18,7 @@ totem_pl_parser_parse_duration
 totem_pl_parser_parse_date
 totem_pl_parser_add_ignored_scheme
 totem_pl_parser_add_ignored_mimetype
+totem_pl_parser_add_ignored_glob
 totem_pl_parser_can_parse_from_data
 totem_pl_parser_can_parse_from_filename
 totem_pl_parser_can_parse_from_uri
diff --git a/plparse/plparser.map b/plparse/plparser.map
index de28e97..280308b 100644
--- a/plparse/plparser.map
+++ b/plparse/plparser.map
@@ -10,6 +10,7 @@ LIBTOTEM_PL_PARSER_MINI_1.0 {
     totem_disc_media_type_quark;
     totem_pl_parser_add_ignored_mimetype;
     totem_pl_parser_add_ignored_scheme;
+    totem_pl_parser_add_ignored_glob;
     totem_pl_parser_can_parse_from_data;
     totem_pl_parser_can_parse_from_filename;
     totem_pl_parser_can_parse_from_uri;
diff --git a/plparse/totem-pl-parser.c b/plparse/totem-pl-parser.c
index 0d34ceb..e63a191 100644
--- a/plparse/totem-pl-parser.c
+++ b/plparse/totem-pl-parser.c
@@ -124,6 +124,7 @@
 #include "config.h"
 
 #include <string.h>
+#include <fnmatch.h>
 #include <glib.h>
 #include <glib/gstdio.h>
 #include <glib/gi18n-lib.h>
@@ -257,6 +258,7 @@ static void totem_pl_parser_get_property (GObject *object,
 struct TotemPlParserPrivate {
        GHashTable *ignore_schemes; /* key = char *, value = boolean */
        GHashTable *ignore_mimetypes; /*key = char *, value = boolean */
+       GHashTable *ignore_globs; /*key = char *, value = boolean */
        GMutex ignore_mutex;
        GThread *main_thread; /* see CALL_ASYNC() in *-private.h */
 
@@ -1281,6 +1283,7 @@ totem_pl_parser_init (TotemPlParser *parser)
        g_mutex_init (&parser->priv->ignore_mutex);
        parser->priv->ignore_schemes = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
        parser->priv->ignore_mimetypes = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+       parser->priv->ignore_globs = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
 }
 
 static void
@@ -1293,6 +1296,7 @@ totem_pl_parser_finalize (GObject *object)
 
        g_clear_pointer (&priv->ignore_schemes, g_hash_table_destroy);
        g_clear_pointer (&priv->ignore_mimetypes, g_hash_table_destroy);
+       g_clear_pointer (&priv->ignore_globs, g_hash_table_destroy);
 
        g_mutex_clear (&priv->ignore_mutex);
 
@@ -1584,6 +1588,28 @@ totem_pl_parser_mimetype_is_ignored (TotemPlParser *parser,
        return ret;
 }
 
+static gboolean
+totem_pl_parser_glob_is_ignored (TotemPlParser *parser,
+                                const char *filename)
+{
+       GHashTableIter iter;
+       gpointer key;
+       int ret;
+
+       g_mutex_lock (&parser->priv->ignore_mutex);
+       g_hash_table_iter_init (&iter, parser->priv->ignore_globs);
+       while (g_hash_table_iter_next (&iter, &key, NULL)) {
+               const char *glob = key;
+
+               ret = fnmatch (glob, filename, 0);
+               if (ret == 0)
+                       break;
+       }
+       g_mutex_unlock (&parser->priv->ignore_mutex);
+
+       return (ret == 0);
+}
+
 /**
  * totem_pl_parser_ignore:
  * @parser: a #TotemPlParser
@@ -1608,6 +1634,9 @@ totem_pl_parser_ignore (TotemPlParser *parser, const char *uri)
        g_autoptr(GFile) file;
        guint i;
 
+       if (totem_pl_parser_glob_is_ignored (parser, uri) != FALSE)
+               return TRUE;
+
        file = g_file_new_for_path (uri);
        if (totem_pl_parser_scheme_is_ignored (parser, file) != FALSE)
                return TRUE;
@@ -1822,6 +1851,11 @@ totem_pl_parser_parse_internal (TotemPlParser *parser,
                }
        }
 
+       if (uri != NULL) {
+               if (totem_pl_parser_glob_is_ignored (parser, uri))
+                       return TOTEM_PL_PARSER_RESULT_IGNORED;
+       }
+
        /* In force mode we want to get the data */
        if (parse_data->force != FALSE) {
                mimetype = my_g_file_info_get_mime_type_with_data (file, &data, parser);
@@ -2227,6 +2261,27 @@ totem_pl_parser_add_ignored_mimetype (TotemPlParser *parser,
        g_mutex_unlock (&parser->priv->ignore_mutex);
 }
 
+/**
+ * totem_pl_parser_add_ignored_glob:
+ * @parser: a #TotemPlParser
+ * @glob: a glob to ignore
+ *
+ * Adds a glob to the list of mimetypes to ignore, so that
+ * any URI of that glob is ignored during playlist parsing.
+ *
+ * Since: 3.26.4
+ **/
+void
+totem_pl_parser_add_ignored_glob (TotemPlParser *parser,
+                                 const char    *glob)
+{
+       g_return_if_fail (TOTEM_IS_PL_PARSER (parser));
+
+       g_mutex_lock (&parser->priv->ignore_mutex);
+       g_hash_table_insert (parser->priv->ignore_globs, g_strdup (glob), GINT_TO_POINTER (1));
+       g_mutex_unlock (&parser->priv->ignore_mutex);
+}
+
 /**
  * totem_pl_parser_parse_duration:
  * @duration: the duration string to parse
diff --git a/plparse/totem-pl-parser.h b/plparse/totem-pl-parser.h
index 924fc4c..7e83401 100644
--- a/plparse/totem-pl-parser.h
+++ b/plparse/totem-pl-parser.h
@@ -352,6 +352,8 @@ void           totem_pl_parser_add_ignored_scheme (TotemPlParser *parser,
                                               const char *scheme);
 void       totem_pl_parser_add_ignored_mimetype (TotemPlParser *parser,
                                                 const char *mimetype);
+void       totem_pl_parser_add_ignored_glob (TotemPlParser *parser,
+                                            const char *glob);
 
 TotemPlParserResult totem_pl_parser_parse (TotemPlParser *parser,
                                           const char *uri, gboolean fallback);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]