[tracker/cleanup-media-art: 1/2] tracker-extract, libtracker-common: Move sharable code to libtracker-common
- From: Philip Van Hoof <pvanhoof src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/cleanup-media-art: 1/2] tracker-extract, libtracker-common: Move sharable code to libtracker-common
- Date: Tue, 17 May 2011 13:14:24 +0000 (UTC)
commit e5ff6c5a85b78669abc1a6ba356dcb686e00f640
Author: Philip Van Hoof <philip codeminded be>
Date: Tue May 17 15:10:08 2011 +0200
tracker-extract, libtracker-common: Move sharable code to libtracker-common
src/libtracker-common/Makefile.am | 6 +-
src/libtracker-common/tracker-albumart.c | 293 ++++++++++++++++++++++++++++
src/libtracker-common/tracker-albumart.h | 42 ++++
src/tracker-extract/tracker-albumart.c | 304 +++---------------------------
4 files changed, 365 insertions(+), 280 deletions(-)
---
diff --git a/src/libtracker-common/Makefile.am b/src/libtracker-common/Makefile.am
index c75deba..5bcd345 100644
--- a/src/libtracker-common/Makefile.am
+++ b/src/libtracker-common/Makefile.am
@@ -28,7 +28,8 @@ libtracker_common_la_SOURCES = \
tracker-type-utils.c \
tracker-utils.c \
tracker-crc32.c \
- tracker-locale.c
+ tracker-locale.c \
+ tracker-albumart.c
noinst_HEADERS = \
tracker-dbus.h \
@@ -45,7 +46,8 @@ noinst_HEADERS = \
tracker-type-utils.h \
tracker-utils.h \
tracker-crc32.h \
- tracker-locale.h
+ tracker-locale.h \
+ tracker-albumart.h
if HAVE_TRACKER_FTS
libtracker_common_la_SOURCES += tracker-language.c
diff --git a/src/libtracker-common/tracker-albumart.c b/src/libtracker-common/tracker-albumart.c
new file mode 100644
index 0000000..c9c9e03
--- /dev/null
+++ b/src/libtracker-common/tracker-albumart.c
@@ -0,0 +1,293 @@
+/*
+ * Copyright (C) 2008, Nokia <ivan frade nokia com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+
+#include <string.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <sys/types.h>
+#include <utime.h>
+#include <time.h>
+
+#include <glib.h>
+#include <glib/gprintf.h>
+#include <glib/gstdio.h>
+#include <gio/gio.h>
+
+#include "tracker-file-utils.h"
+#include "tracker-date-time.h"
+#include "tracker-albumart.h"
+
+static gboolean
+albumart_strip_find_next_block (const gchar *original,
+ const gunichar open_char,
+ const gunichar close_char,
+ gint *open_pos,
+ gint *close_pos)
+{
+ const gchar *p1, *p2;
+
+ if (open_pos) {
+ *open_pos = -1;
+ }
+
+ if (close_pos) {
+ *close_pos = -1;
+ }
+
+ p1 = g_utf8_strchr (original, -1, open_char);
+ if (p1) {
+ if (open_pos) {
+ *open_pos = p1 - original;
+ }
+
+ p2 = g_utf8_strchr (g_utf8_next_char (p1), -1, close_char);
+ if (p2) {
+ if (close_pos) {
+ *close_pos = p2 - original;
+ }
+
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+gchar *
+tracker_albumart_strip_invalid_entities (const gchar *original)
+{
+ GString *str_no_blocks;
+ gchar **strv;
+ gchar *str;
+ gboolean blocks_done = FALSE;
+ const gchar *p;
+ const gchar *invalid_chars = "()[]<>{}_! #$^&*+=|\\/\"'?~";
+ const gchar *invalid_chars_delimiter = "*";
+ const gchar *convert_chars = "\t";
+ const gchar *convert_chars_delimiter = " ";
+ const gunichar blocks[5][2] = {
+ { '(', ')' },
+ { '{', '}' },
+ { '[', ']' },
+ { '<', '>' },
+ { 0, 0 }
+ };
+
+ str_no_blocks = g_string_new ("");
+
+ p = original;
+
+ while (!blocks_done) {
+ gint pos1, pos2, i;
+
+ pos1 = -1;
+ pos2 = -1;
+
+ for (i = 0; blocks[i][0] != 0; i++) {
+ gint start, end;
+
+ /* Go through blocks, find the earliest block we can */
+ if (albumart_strip_find_next_block (p, blocks[i][0], blocks[i][1], &start, &end)) {
+ if (pos1 == -1 || start < pos1) {
+ pos1 = start;
+ pos2 = end;
+ }
+ }
+ }
+
+ /* If either are -1 we didn't find any */
+ if (pos1 == -1) {
+ /* This means no blocks were found */
+ g_string_append (str_no_blocks, p);
+ blocks_done = TRUE;
+ } else {
+ /* Append the test BEFORE the block */
+ if (pos1 > 0) {
+ g_string_append_len (str_no_blocks, p, pos1);
+ }
+
+ p = g_utf8_next_char (p + pos2);
+
+ /* Do same again for position AFTER block */
+ if (*p == '\0') {
+ blocks_done = TRUE;
+ }
+ }
+ }
+
+ /* Now convert chars to lower case */
+ str = g_utf8_strdown (str_no_blocks->str, -1);
+ g_string_free (str_no_blocks, TRUE);
+
+ /* Now strip invalid chars */
+ g_strdelimit (str, invalid_chars, *invalid_chars_delimiter);
+ strv = g_strsplit (str, invalid_chars_delimiter, -1);
+ g_free (str);
+ str = g_strjoinv (NULL, strv);
+ g_strfreev (strv);
+
+ /* Now convert chars */
+ g_strdelimit (str, convert_chars, *convert_chars_delimiter);
+ strv = g_strsplit (str, convert_chars_delimiter, -1);
+ g_free (str);
+ str = g_strjoinv (convert_chars_delimiter, strv);
+ g_strfreev (strv);
+
+ while (g_strrstr (str, " ") != NULL) {
+ /* Now remove double spaces */
+ strv = g_strsplit (str, " ", -1);
+ g_free (str);
+ str = g_strjoinv (" ", strv);
+ g_strfreev (strv);
+ }
+
+ /* Now strip leading/trailing white space */
+ g_strstrip (str);
+
+ return str;
+}
+
+static gchar *
+albumart_checksum_for_data (GChecksumType checksum_type,
+ const guchar *data,
+ gsize length)
+{
+ GChecksum *checksum;
+ gchar *retval;
+
+ checksum = g_checksum_new (checksum_type);
+ if (!checksum) {
+ return NULL;
+ }
+
+ g_checksum_update (checksum, data, length);
+ retval = g_strdup (g_checksum_get_string (checksum));
+ g_checksum_free (checksum);
+
+ return retval;
+}
+
+void
+tracker_albumart_get_path (const gchar *artist,
+ const gchar *album,
+ const gchar *prefix,
+ const gchar *uri,
+ gchar **path,
+ gchar **local_uri)
+{
+ gchar *art_filename;
+ gchar *dir;
+ gchar *artist_down, *album_down;
+ gchar *artist_stripped, *album_stripped;
+ gchar *artist_checksum, *album_checksum;
+
+ /* http://live.gnome.org/MediaArtStorageSpec */
+
+ if (path) {
+ *path = NULL;
+ }
+
+ if (local_uri) {
+ *local_uri = NULL;
+ }
+
+ if (!artist && !album) {
+ return;
+ }
+
+ if (!artist) {
+ artist_stripped = g_strdup (" ");
+ } else {
+ artist_stripped = tracker_albumart_strip_invalid_entities (artist);
+ }
+
+ if (!album) {
+ album_stripped = g_strdup (" ");
+ } else {
+ album_stripped = tracker_albumart_strip_invalid_entities (album);
+ }
+
+ artist_down = g_utf8_strdown (artist_stripped, -1);
+ album_down = g_utf8_strdown (album_stripped, -1);
+
+ /* g_print ("[%s] [%s]\n", artist_down, album_down); */
+
+ g_free (artist_stripped);
+ g_free (album_stripped);
+
+ dir = g_build_filename (g_get_user_cache_dir (),
+ "media-art",
+ NULL);
+
+ if (!g_file_test (dir, G_FILE_TEST_EXISTS)) {
+ g_mkdir_with_parents (dir, 0770);
+ }
+
+ artist_checksum = albumart_checksum_for_data (G_CHECKSUM_MD5,
+ (const guchar *) artist_down,
+ strlen (artist_down));
+ album_checksum = albumart_checksum_for_data (G_CHECKSUM_MD5,
+ (const guchar *) album_down,
+ strlen (album_down));
+
+ g_free (artist_down);
+ g_free (album_down);
+
+ art_filename = g_strdup_printf ("%s-%s-%s.jpeg",
+ prefix ? prefix : "album",
+ artist_checksum,
+ album_checksum);
+
+ if (path) {
+ *path = g_build_filename (dir, art_filename, NULL);
+ }
+
+ if (local_uri) {
+ gchar *local_dir;
+ GFile *file, *parent;
+
+ if (strstr (uri, "://")) {
+ file = g_file_new_for_uri (uri);
+ } else {
+ file = g_file_new_for_path (uri);
+ }
+
+ parent = g_file_get_parent (file);
+ if (parent) {
+ local_dir = g_file_get_uri (parent);
+
+ /* This is a URI, don't use g_build_filename here */
+ *local_uri = g_strdup_printf ("%s/.mediaartlocal/%s", local_dir, art_filename);
+
+ g_free (local_dir);
+ g_object_unref (parent);
+ }
+ g_object_unref (file);
+ }
+
+ g_free (dir);
+ g_free (art_filename);
+ g_free (artist_checksum);
+ g_free (album_checksum);
+}
diff --git a/src/libtracker-common/tracker-albumart.h b/src/libtracker-common/tracker-albumart.h
new file mode 100644
index 0000000..90f461b
--- /dev/null
+++ b/src/libtracker-common/tracker-albumart.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2010 Nokia <ivan frade nokia com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __LIBTRACKER_COMMON_ALBUMART_H__
+#define __LIBTRACKER_COMMON_ALBUMART_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+#if !defined (__LIBTRACKER_COMMON_INSIDE__) && !defined (TRACKER_COMPILATION)
+#error "only <libtracker-common/tracker-common.h> must be included directly."
+#endif
+
+gchar * tracker_albumart_strip_invalid_entities (const gchar *original);
+void tracker_albumart_get_path (const gchar *artist,
+ const gchar *album,
+ const gchar *prefix,
+ const gchar *uri,
+ gchar **path,
+ gchar **local_uri);
+
+
+G_END_DECLS
+
+#endif /* __LIBTRACKER_COMMON_LOCALE_H__ */
diff --git a/src/tracker-extract/tracker-albumart.c b/src/tracker-extract/tracker-albumart.c
index 6b7ba24..963da3e 100644
--- a/src/tracker-extract/tracker-albumart.c
+++ b/src/tracker-extract/tracker-albumart.c
@@ -37,6 +37,7 @@
#include <libtracker-miner/tracker-miner.h>
#include <libtracker-common/tracker-file-utils.h>
#include <libtracker-common/tracker-date-time.h>
+#include <libtracker-common/tracker-albumart.h>
#include "tracker-albumart.h"
#include "tracker-extract.h"
@@ -65,259 +66,6 @@ albumart_queue_cb (GObject *source_object,
GAsyncResult *res,
gpointer user_data);
-static gboolean
-albumart_strip_find_next_block (const gchar *original,
- const gunichar open_char,
- const gunichar close_char,
- gint *open_pos,
- gint *close_pos)
-{
- const gchar *p1, *p2;
-
- if (open_pos) {
- *open_pos = -1;
- }
-
- if (close_pos) {
- *close_pos = -1;
- }
-
- p1 = g_utf8_strchr (original, -1, open_char);
- if (p1) {
- if (open_pos) {
- *open_pos = p1 - original;
- }
-
- p2 = g_utf8_strchr (g_utf8_next_char (p1), -1, close_char);
- if (p2) {
- if (close_pos) {
- *close_pos = p2 - original;
- }
-
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-static gchar *
-albumart_strip_invalid_entities (const gchar *original)
-{
- GString *str_no_blocks;
- gchar **strv;
- gchar *str;
- gboolean blocks_done = FALSE;
- const gchar *p;
- const gchar *invalid_chars = "()[]<>{}_! #$^&*+=|\\/\"'?~";
- const gchar *invalid_chars_delimiter = "*";
- const gchar *convert_chars = "\t";
- const gchar *convert_chars_delimiter = " ";
- const gunichar blocks[5][2] = {
- { '(', ')' },
- { '{', '}' },
- { '[', ']' },
- { '<', '>' },
- { 0, 0 }
- };
-
- str_no_blocks = g_string_new ("");
-
- p = original;
-
- while (!blocks_done) {
- gint pos1, pos2, i;
-
- pos1 = -1;
- pos2 = -1;
-
- for (i = 0; blocks[i][0] != 0; i++) {
- gint start, end;
-
- /* Go through blocks, find the earliest block we can */
- if (albumart_strip_find_next_block (p, blocks[i][0], blocks[i][1], &start, &end)) {
- if (pos1 == -1 || start < pos1) {
- pos1 = start;
- pos2 = end;
- }
- }
- }
-
- /* If either are -1 we didn't find any */
- if (pos1 == -1) {
- /* This means no blocks were found */
- g_string_append (str_no_blocks, p);
- blocks_done = TRUE;
- } else {
- /* Append the test BEFORE the block */
- if (pos1 > 0) {
- g_string_append_len (str_no_blocks, p, pos1);
- }
-
- p = g_utf8_next_char (p + pos2);
-
- /* Do same again for position AFTER block */
- if (*p == '\0') {
- blocks_done = TRUE;
- }
- }
- }
-
- /* Now convert chars to lower case */
- str = g_utf8_strdown (str_no_blocks->str, -1);
- g_string_free (str_no_blocks, TRUE);
-
- /* Now strip invalid chars */
- g_strdelimit (str, invalid_chars, *invalid_chars_delimiter);
- strv = g_strsplit (str, invalid_chars_delimiter, -1);
- g_free (str);
- str = g_strjoinv (NULL, strv);
- g_strfreev (strv);
-
- /* Now convert chars */
- g_strdelimit (str, convert_chars, *convert_chars_delimiter);
- strv = g_strsplit (str, convert_chars_delimiter, -1);
- g_free (str);
- str = g_strjoinv (convert_chars_delimiter, strv);
- g_strfreev (strv);
-
- while (g_strrstr (str, " ") != NULL) {
- /* Now remove double spaces */
- strv = g_strsplit (str, " ", -1);
- g_free (str);
- str = g_strjoinv (" ", strv);
- g_strfreev (strv);
- }
-
- /* Now strip leading/trailing white space */
- g_strstrip (str);
-
- return str;
-}
-
-static gchar *
-albumart_checksum_for_data (GChecksumType checksum_type,
- const guchar *data,
- gsize length)
-{
- GChecksum *checksum;
- gchar *retval;
-
- checksum = g_checksum_new (checksum_type);
- if (!checksum) {
- return NULL;
- }
-
- g_checksum_update (checksum, data, length);
- retval = g_strdup (g_checksum_get_string (checksum));
- g_checksum_free (checksum);
-
- return retval;
-}
-
-static void
-albumart_get_path (const gchar *artist,
- const gchar *album,
- const gchar *prefix,
- const gchar *uri,
- gchar **path,
- gchar **local_uri)
-{
- gchar *art_filename;
- gchar *dir;
- gchar *artist_down, *album_down;
- gchar *artist_stripped, *album_stripped;
- gchar *artist_checksum, *album_checksum;
-
- /* http://live.gnome.org/MediaArtStorageSpec */
-
- if (path) {
- *path = NULL;
- }
-
- if (local_uri) {
- *local_uri = NULL;
- }
-
- if (!artist && !album) {
- return;
- }
-
- if (!artist) {
- artist_stripped = g_strdup (" ");
- } else {
- artist_stripped = albumart_strip_invalid_entities (artist);
- }
-
- if (!album) {
- album_stripped = g_strdup (" ");
- } else {
- album_stripped = albumart_strip_invalid_entities (album);
- }
-
- artist_down = g_utf8_strdown (artist_stripped, -1);
- album_down = g_utf8_strdown (album_stripped, -1);
-
- /* g_print ("[%s] [%s]\n", artist_down, album_down); */
-
- g_free (artist_stripped);
- g_free (album_stripped);
-
- dir = g_build_filename (g_get_user_cache_dir (),
- "media-art",
- NULL);
-
- if (!g_file_test (dir, G_FILE_TEST_EXISTS)) {
- g_mkdir_with_parents (dir, 0770);
- }
-
- artist_checksum = albumart_checksum_for_data (G_CHECKSUM_MD5,
- (const guchar *) artist_down,
- strlen (artist_down));
- album_checksum = albumart_checksum_for_data (G_CHECKSUM_MD5,
- (const guchar *) album_down,
- strlen (album_down));
-
- g_free (artist_down);
- g_free (album_down);
-
- art_filename = g_strdup_printf ("%s-%s-%s.jpeg",
- prefix ? prefix : "album",
- artist_checksum,
- album_checksum);
-
- if (path) {
- *path = g_build_filename (dir, art_filename, NULL);
- }
-
- if (local_uri) {
- gchar *local_dir;
- GFile *file, *parent;
-
- if (strstr (uri, "://")) {
- file = g_file_new_for_uri (uri);
- } else {
- file = g_file_new_for_path (uri);
- }
-
- parent = g_file_get_parent (file);
- if (parent) {
- local_dir = g_file_get_uri (parent);
-
- /* This is a URI, don't use g_build_filename here */
- *local_uri = g_strdup_printf ("%s/.mediaartlocal/%s", local_dir, art_filename);
-
- g_free (local_dir);
- g_object_unref (parent);
- }
- g_object_unref (file);
- }
-
- g_free (dir);
- g_free (art_filename);
- g_free (artist_checksum);
- g_free (album_checksum);
-}
static gboolean
albumart_heuristic (const gchar *artist,
@@ -344,11 +92,11 @@ albumart_heuristic (const gchar *artist,
}
if (artist) {
- artist_stripped = albumart_strip_invalid_entities (artist);
+ artist_stripped = tracker_albumart_strip_invalid_entities (artist);
}
if (album) {
- album_stripped = albumart_strip_invalid_entities (album);
+ album_stripped = tracker_albumart_strip_invalid_entities (album);
}
/* Copy from local album art (.mediaartlocal) to spec */
@@ -361,10 +109,10 @@ albumart_heuristic (const gchar *artist,
g_debug ("Album art being copied from local (.mediaartlocal) file:'%s'",
local_uri);
- albumart_get_path (artist_stripped,
- album_stripped,
- "album", NULL,
- &target, NULL);
+ tracker_albumart_get_path (artist_stripped,
+ album_stripped,
+ "album", NULL,
+ &target, NULL);
if (target) {
file = g_file_new_for_path (target);
@@ -462,12 +210,12 @@ albumart_heuristic (const gchar *artist,
if (g_str_has_suffix (name_strdown, "jpeg") ||
g_str_has_suffix (name_strdown, "jpg")) {
if (!target) {
- albumart_get_path (artist_stripped,
- album_stripped,
- "album",
- NULL,
- &target,
- NULL);
+ tracker_albumart_get_path (artist_stripped,
+ album_stripped,
+ "album",
+ NULL,
+ &target,
+ NULL);
}
if (!file && target) {
@@ -493,12 +241,12 @@ albumart_heuristic (const gchar *artist,
gchar *found;
if (!target) {
- albumart_get_path (artist_stripped,
- album_stripped,
- "album",
- NULL,
- &target,
- NULL);
+ tracker_albumart_get_path (artist_stripped,
+ album_stripped,
+ "album",
+ NULL,
+ &target,
+ NULL);
}
found = g_build_filename (dirname, name, NULL);
@@ -552,7 +300,7 @@ albumart_set (const unsigned char *buffer,
return FALSE;
}
- albumart_get_path (artist, album, "album", NULL, &local_path, NULL);
+ tracker_albumart_get_path (artist, album, "album", NULL, &local_path, NULL);
retval = tracker_albumart_buffer_to_jpeg (buffer, len, mime, local_path);
@@ -808,12 +556,12 @@ tracker_albumart_process (const unsigned char *buffer,
mtime = tracker_file_get_mtime_uri (filename_uri);
- albumart_get_path (artist,
- album,
- "album",
- filename_uri,
- &art_path,
- &local_uri);
+ tracker_albumart_get_path (artist,
+ album,
+ "album",
+ filename_uri,
+ &art_path,
+ &local_uri);
if (!art_path) {
g_debug ("Album art path could not be obtained, not processing any further");
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]