Commit bfabdb42 authored by Martyn Russell's avatar Martyn Russell

tracker-extract: Added 'max-media-art-width' config option

Allows all media/album art to be disabled with a setting of -1 or resized to a
width of choosing.

Based on the patch from Kiran Bhide <kiran.bhide@in.bosch.com>
parent 40afe58f
......@@ -41,5 +41,12 @@ Boston, MA 02110-1301, USA.
<range min="0" max="10485760"/>
<default>1048576</default>
</key>
<key name="max-media-art-width" type="i">
<_summary>Max media art width</_summary>
<_description>Maximum width in pixels for any media art extracted. Anything bigger is resized. Set to -1 to disable saving media art from files. Setting to 0 sets no limit on the media art width.</_description>
<range min="-1" max="2048"/>
<default>0</default>
</key>
</schema>
</schemalist>
......@@ -40,13 +40,15 @@ enum {
PROP_0,
PROP_VERBOSITY,
PROP_SCHED_IDLE,
PROP_MAX_BYTES
PROP_MAX_BYTES,
PROP_MAX_MEDIA_ART_WIDTH
};
static TrackerConfigMigrationEntry migration[] = {
{ G_TYPE_ENUM, "General", "Verbosity", "verbosity" },
{ G_TYPE_ENUM, "General", "SchedIdle", "sched-idle" },
{ G_TYPE_INT, "General", "MaxBytes", "max-bytes" },
{ G_TYPE_INT, "General", "MaxMediaArtWidth", "max-media-art-width" },
{ 0 }
};
......@@ -88,6 +90,16 @@ tracker_config_class_init (TrackerConfigClass *klass)
0, 1024 * 1024 * 10,
1024 * 1024,
G_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_MAX_MEDIA_ART_WIDTH,
g_param_spec_int ("max-media-art-width",
"Max Media Art Width",
" Maximum width of the Media Art to be generated (-1=disable, 0=original width, 1->2048=max pixel width)",
-1,
2048,
0,
G_PARAM_READWRITE));
}
static void
......@@ -117,6 +129,11 @@ config_set_property (GObject *object,
g_value_get_int (value));
break;
case PROP_MAX_MEDIA_ART_WIDTH:
g_settings_set_int (G_SETTINGS (object), "max-media-art-width",
g_value_get_int (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
break;
......@@ -145,6 +162,11 @@ config_get_property (GObject *object,
g_settings_get_int (G_SETTINGS (object), "max-bytes"));
break;
case PROP_MAX_MEDIA_ART_WIDTH:
g_value_set_int (value,
g_settings_get_int (G_SETTINGS (object), "max-media-art-width"));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
break;
......@@ -248,3 +270,24 @@ tracker_config_set_max_bytes (TrackerConfig *config,
g_object_set (G_OBJECT (config), "max-bytes", value, NULL);
}
gint
tracker_config_get_max_media_art_width (TrackerConfig *config)
{
gint max_media_art_width;
g_return_val_if_fail (TRACKER_IS_CONFIG (config), 0);
g_object_get (config, "max-media-art-width", &max_media_art_width, NULL);
return max_media_art_width;
}
void
tracker_config_set_max_media_art_width (TrackerConfig *config,
gint value)
{
g_return_if_fail (TRACKER_IS_CONFIG (config));
g_object_set (G_OBJECT (config), "max-media-art-width", value, NULL);
}
......@@ -45,18 +45,21 @@ struct TrackerConfigClass {
GSettingsClass parent_class;
};
GType tracker_config_get_type (void) G_GNUC_CONST;
GType tracker_config_get_type (void) G_GNUC_CONST;
TrackerConfig *tracker_config_new (void);
gint tracker_config_get_verbosity (TrackerConfig *config);
gint tracker_config_get_sched_idle (TrackerConfig *config);
gint tracker_config_get_max_bytes (TrackerConfig *config);
void tracker_config_set_verbosity (TrackerConfig *config,
gint value);
void tracker_config_set_sched_idle (TrackerConfig *config,
gint value);
void tracker_config_set_max_bytes (TrackerConfig *config,
gint value);
TrackerConfig *tracker_config_new (void);
gint tracker_config_get_verbosity (TrackerConfig *config);
gint tracker_config_get_sched_idle (TrackerConfig *config);
gint tracker_config_get_max_bytes (TrackerConfig *config);
gint tracker_config_get_max_media_art_width (TrackerConfig *config);
void tracker_config_set_verbosity (TrackerConfig *config,
gint value);
void tracker_config_set_sched_idle (TrackerConfig *config,
gint value);
void tracker_config_set_max_bytes (TrackerConfig *config,
gint value);
void tracker_config_set_max_media_art_width (TrackerConfig *config,
gint value);
G_END_DECLS
......
......@@ -24,6 +24,8 @@
#include "tracker-media-art-generic.h"
#include "tracker-main.h"
void
tracker_media_art_plugin_init (void)
{
......@@ -40,6 +42,15 @@ tracker_media_art_file_to_jpeg (const gchar *filename,
{
GdkPixbuf *pixbuf;
GError *error = NULL;
TrackerConfig *config = tracker_main_get_config ();
gint max_media_art_width = tracker_config_get_max_media_art_width (config);
if (max_media_art_width < 0) {
g_debug ("Not saving album art from file, disabled in config");
return TRUE;
}
/* TODO: Add resizing support */
pixbuf = gdk_pixbuf_new_from_file (filename, &error);
......@@ -60,6 +71,26 @@ tracker_media_art_file_to_jpeg (const gchar *filename,
return TRUE;
}
static void
size_prepared_cb (GdkPixbufLoader *loader,
gint width,
gint height,
gpointer user_data)
{
TrackerConfig *config = tracker_main_get_config ();
gint max_media_art_width = tracker_config_get_max_media_art_width (config);
gfloat scale;
if (max_media_art_width < 1 || width <= max_media_art_width) {
return;
}
g_debug ("Resizing media art to %d width", max_media_art_width);
scale = width / (gfloat) max_media_art_width;
gdk_pixbuf_loader_set_size (loader, (gint) (width / scale), (gint) (height / scale));
}
gboolean
tracker_media_art_buffer_to_jpeg (const unsigned char *buffer,
......@@ -67,24 +98,37 @@ tracker_media_art_buffer_to_jpeg (const unsigned char *buffer,
const gchar *buffer_mime,
const gchar *target)
{
/* FF D8 FF are the three first bytes of JPeg images */
if ((g_strcmp0 (buffer_mime, "image/jpeg") == 0 ||
g_strcmp0 (buffer_mime, "JPG") == 0) &&
(buffer && len > 2 && buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff)) {
TrackerConfig *config = tracker_main_get_config ();
gint max_media_art_width = tracker_config_get_max_media_art_width (config);
g_debug ("Saving album art using raw data as uri:'%s'",
target);
if (max_media_art_width < 0) {
g_debug ("Not saving album art from buffer, disabled in config");
return TRUE;
}
/* FF D8 FF are the three first bytes of JPeg images */
if (max_media_art_width == 0 &&
(g_strcmp0 (buffer_mime, "image/jpeg") == 0 ||
g_strcmp0 (buffer_mime, "JPG") == 0) &&
(buffer && len > 2 && buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff)) {
g_debug ("Saving album art using raw data as uri:'%s'", target);
g_file_set_contents (target, buffer, (gssize) len, NULL);
} else {
GdkPixbuf *pixbuf;
GdkPixbufLoader *loader;
GError *error = NULL;
g_debug ("Saving album art using GdkPixbufLoader for uri:'%s'",
target);
g_debug ("Saving album art using GdkPixbufLoader for uri:'%s' (max width:%d)",
target,
max_media_art_width);
loader = gdk_pixbuf_loader_new ();
if (max_media_art_width > 0) {
g_signal_connect (loader,
"size-prepared",
G_CALLBACK (size_prepared_cb),
NULL);
}
if (!gdk_pixbuf_loader_write (loader, buffer, len, &error)) {
g_warning ("Could not write with GdkPixbufLoader when setting album art, %s",
......
......@@ -59,6 +59,16 @@ gboolean
tracker_media_art_file_to_jpeg (const gchar *filename,
const gchar *target)
{
TrackerConfig *config = tracker_main_get_config ();
gint max_media_art_width = tracker_config_get_max_media_art_width (config);
if (max_media_art_width < 0) {
g_debug ("Not saving album art from file, disabled in config");
return TRUE;
}
/* TODO: Add resizing support */
QFile file (filename);
if (!file.open (QIODevice::ReadOnly)) {
......@@ -101,19 +111,28 @@ tracker_media_art_buffer_to_jpeg (const unsigned char *buffer,
const gchar *buffer_mime,
const gchar *target)
{
TrackerConfig *config = tracker_main_get_config ();
gint max_media_art_width = tracker_config_get_max_media_art_width (config);
if (max_media_art_width < 0) {
g_debug ("Not saving album art from buffer, disabled in config");
return TRUE;
}
/* FF D8 FF are the three first bytes of JPeg images */
if ((g_strcmp0 (buffer_mime, "image/jpeg") == 0 ||
g_strcmp0 (buffer_mime, "JPG") == 0) &&
if (max_media_art_width == 0 &&
(g_strcmp0 (buffer_mime, "image/jpeg") == 0 ||
g_strcmp0 (buffer_mime, "JPG") == 0) &&
(buffer && len > 2 && buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff)) {
g_debug ("Saving album art using raw data as uri:'%s'",
target);
g_file_set_contents (target, (const gchar*) buffer, (gssize) len, NULL);
} else {
QImageReader *reader = NULL;
QByteArray array;
/* TODO: Add resizing support */
array = QByteArray ((const char *) buffer, (int) len);
QBuffer qbuffer (&array);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment