Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37813260
en ru br
Репозитории ALT

Группа :: Звук
Пакет: grilo-plugins

 Главная   Изменения   Спек   Патчи   Sources   Загрузить   Gear   Bugs and FR  Repocop 

Патч: grilo-plugins-snapshot.patch
Скачать


 Makefile.am                                        |    2 +-
 configure.ac                                       |   23 ++-
 src/media/apple-trailers/grl-apple-trailers.c      |    2 +-
 src/media/bliptv/grl-bliptv.c                      |    1 +
 src/media/bookmarks/grl-bookmarks.c                |    2 +-
 src/media/flickr/gflickr.h                         |    2 +-
 src/media/flickr/grl-flickr.c                      |    2 +-
 src/media/jamendo/grl-jamendo.c                    |    2 +-
 src/media/shoutcast/grl-shoutcast.c                |  172 +++++++++++++++-----
 src/media/shoutcast/grl-shoutcast.h                |    5 +-
 src/media/tracker/grl-tracker-media-api.c          |    1 +
 src/media/tracker/grl-tracker-media-api.h          |    1 +
 src/media/tracker/grl-tracker-media-notif.c        |    1 +
 src/media/tracker/grl-tracker-media-priv.h         |    1 +
 src/media/tracker/grl-tracker-metadata.c           |    1 +
 src/media/tracker/grl-tracker-utils.c              |    1 +
 src/media/upnp/grl-upnp.c                          |   50 ++----
 src/media/vimeo/grl-vimeo.c                        |    2 +-
 src/media/vimeo/gvimeo.c                           |    2 +-
 src/media/youtube/grl-youtube.c                    |    2 +-
 src/metadata/fake-metadata/grl-fake-metadata.c     |    2 +-
 src/metadata/gravatar/grl-gravatar.c               |    2 +-
 src/metadata/lastfm-albumart/grl-lastfm-albumart.c |    2 +-
 src/metadata/metadata-store/grl-metadata-store.c   |    2 +-
 test/Makefile.am                                   |    2 +-
 test/main.c                                        |    2 +-
 26 files changed, 183 insertions(+), 104 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index 5d0af2b..88b3866 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -3,7 +3,7 @@
 #
 # Author: Iago Toral Quiroga <itoral@igalia.com>
 #
-# Copyright (C) 2010 Igalia S.L. All rights reserved.
+# Copyright (C) 2010, 2011 Igalia S.L. All rights reserved.
 
 ACLOCAL_AMFLAGS = -I m4
 
diff --git a/configure.ac b/configure.ac
index 79e6791..71aceed 100644
--- a/configure.ac
+++ b/configure.ac
@@ -134,11 +134,17 @@ PKG_CHECK_MODULES(GMIME, gmime-2.6,
                                                    HAVE_GMIME=yes,
                                                    HAVE_GMIME=no)])
 
-PKG_CHECK_MODULES(TRACKER_SPARQL, tracker-sparql-0.12,
+PKG_CHECK_MODULES(TRACKER_SPARQL, tracker-sparql-0.14,
                                   HAVE_TRACKER_SPARQL=yes,
                                   HAVE_TRACKER_SPARQL=no)
 
 if test "x$HAVE_TRACKER_SPARQL" = "xno"; then
+   PKG_CHECK_MODULES(TRACKER_SPARQL, tracker-sparql-0.12,
+                                     HAVE_TRACKER_SPARQL=yes,
+                                     HAVE_TRACKER_SPARQL=no)
+fi
+
+if test "x$HAVE_TRACKER_SPARQL" = "xno"; then
    PKG_CHECK_MODULES(TRACKER_SPARQL, tracker-sparql-0.11,
                                      HAVE_TRACKER_SPARQL=yes,
                                      HAVE_TRACKER_SPARQL=no)
@@ -498,7 +504,7 @@ AC_DEFINE_UNQUOTED([BOOKMARKS_PLUGIN_ID], ["$BOOKMARKS_PLUGIN_ID"], [Bookmarks p
 
 AC_ARG_ENABLE(shoutcast,
         AC_HELP_STRING([--enable-shoutcast],
-                [enable SHOUTcast plugin (default: no)]),
+                [enable SHOUTcast plugin (default: auto)]),
         [
                 case "$enableval" in
                      yes)
@@ -512,13 +518,12 @@ AC_ARG_ENABLE(shoutcast,
                 esac
         ],
         [
-                 enable_shoutcast=no
-#                Do not build SHOUTCast by default; it is broken
-#                if test "x$HAVE_GRLNET" = "xyes" -a "x$HAVE_XML" = "xyes"; then
-#                   enable_shoutcast=yes
-#                else
-#                   enable_shoutcast=no
-#                fi
+               Do not build SHOUTCast by default; it is broken
+               if test "x$HAVE_GRLNET" = "xyes" -a "x$HAVE_XML" = "xyes"; then
+                  enable_shoutcast=yes
+               else
+                  enable_shoutcast=no
+               fi
         ])
 
 AM_CONDITIONAL([SHOUTCAST_PLUGIN], [test "x$enable_shoutcast" = "xyes"])
diff --git a/src/media/apple-trailers/grl-apple-trailers.c b/src/media/apple-trailers/grl-apple-trailers.c
index 9977094..4ca2c4f 100644
--- a/src/media/apple-trailers/grl-apple-trailers.c
+++ b/src/media/apple-trailers/grl-apple-trailers.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Igalia S.L.
+ * Copyright (C) 2010, 2011 Igalia S.L.
  * Copyright (C) 2011 Intel Corporation.
  *
  * Contact: Iago Toral Quiroga <itoral@igalia.com>
diff --git a/src/media/bliptv/grl-bliptv.c b/src/media/bliptv/grl-bliptv.c
index 78685dd..a534c1c 100644
--- a/src/media/bliptv/grl-bliptv.c
+++ b/src/media/bliptv/grl-bliptv.c
@@ -1,4 +1,5 @@
 /*
+ * Copyright (C) 2011 Igalia S.L.
  * Copyright (C) 2011 Intel Corporation.
  *
  * Contact: Iago Toral Quiroga <itoral@igalia.com>
diff --git a/src/media/bookmarks/grl-bookmarks.c b/src/media/bookmarks/grl-bookmarks.c
index c6e5b16..482559c 100644
--- a/src/media/bookmarks/grl-bookmarks.c
+++ b/src/media/bookmarks/grl-bookmarks.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Igalia S.L.
+ * Copyright (C) 2010, 2011 Igalia S.L.
  *
  * Contact: Iago Toral Quiroga <itoral@igalia.com>
  *
diff --git a/src/media/flickr/gflickr.h b/src/media/flickr/gflickr.h
index dd583d8..fe0a679 100644
--- a/src/media/flickr/gflickr.h
+++ b/src/media/flickr/gflickr.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Igalia S.L.
+ * Copyright (C) 2010, 2011 Igalia S.L.
  *
  * Contact: Iago Toral Quiroga <itoral@igalia.com>
  *
diff --git a/src/media/flickr/grl-flickr.c b/src/media/flickr/grl-flickr.c
index a0d1e7f..cfc9c37 100644
--- a/src/media/flickr/grl-flickr.c
+++ b/src/media/flickr/grl-flickr.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Igalia S.L.
+ * Copyright (C) 2010, 2011 Igalia S.L.
  * Copyright (C) 2011 Intel Corporation.
  *
  *
diff --git a/src/media/jamendo/grl-jamendo.c b/src/media/jamendo/grl-jamendo.c
index 97bda5c..4d29ec4 100644
--- a/src/media/jamendo/grl-jamendo.c
+++ b/src/media/jamendo/grl-jamendo.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Igalia S.L.
+ * Copyright (C) 2010, 2011 Igalia S.L.
  *
  * Contact: Iago Toral Quiroga <itoral@igalia.com>
  *
diff --git a/src/media/shoutcast/grl-shoutcast.c b/src/media/shoutcast/grl-shoutcast.c
index 57b2240..35776e2 100644
--- a/src/media/shoutcast/grl-shoutcast.c
+++ b/src/media/shoutcast/grl-shoutcast.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Igalia S.L.
+ * Copyright (C) 2010, 2011 Igalia S.L.
  *
  * Contact: Iago Toral Quiroga <itoral@igalia.com>
  *
@@ -33,8 +33,15 @@
 
 #include "grl-shoutcast.h"
 
+#define GRL_SHOUTCAST_SOURCE_GET_PRIVATE(object)            \
+  (G_TYPE_INSTANCE_GET_PRIVATE((object),                    \
+                               GRL_SHOUTCAST_SOURCE_TYPE,   \
+                               GrlShoutcastSourcePriv))
+
 #define EXPIRE_CACHE_TIMEOUT 300
 
+#define SHOUTCAST_DEV_KEY "dev-key"
+
 /* --------- Logging  -------- */
 
 #define GRL_LOG_DOMAIN_DEFAULT shoutcast_log_domain
@@ -42,12 +49,13 @@ GRL_LOG_DOMAIN_STATIC(shoutcast_log_domain);
 
 /* ------ SHOUTcast API ------ */
 
-#define SHOUTCAST_BASE_ENTRY "http://yp.shoutcast.com"
+#define SHOUTCAST_API_BASE_ENTRY "http://api.shoutcast.com/legacy/"
+#define SHOUTCAST_YP_BASE_ENTRY  "http://yp.shoutcast.com/sbin/"
 
-#define SHOUTCAST_GET_GENRES    SHOUTCAST_BASE_ENTRY "/sbin/newxml.phtml"
-#define SHOUTCAST_GET_RADIOS    SHOUTCAST_GET_GENRES "?genre=%s&limit=%u"
-#define SHOUTCAST_SEARCH_RADIOS SHOUTCAST_GET_GENRES "?search=%s&limit=%u"
-#define SHOUTCAST_TUNE          SHOUTCAST_BASE_ENTRY "/sbin/tunein-station.pls?id=%s"
+#define SHOUTCAST_GET_GENRES    SHOUTCAST_API_BASE_ENTRY "genrelist?k=%s"
+#define SHOUTCAST_GET_RADIOS    SHOUTCAST_API_BASE_ENTRY "genresearch?k=%s&genre=%s&limit=%u"
+#define SHOUTCAST_SEARCH_RADIOS SHOUTCAST_API_BASE_ENTRY "stationsearch?k=%s&search=%s&limit=%u"
+#define SHOUTCAST_TUNE          SHOUTCAST_YP_BASE_ENTRY  "tunein-station.pls?id=%s"
 
 /* --- Plugin information --- */
 
@@ -57,6 +65,14 @@ GRL_LOG_DOMAIN_STATIC(shoutcast_log_domain);
 #define SOURCE_NAME "SHOUTcast"
 #define SOURCE_DESC "A source for browsing SHOUTcast radios"
 
+struct _GrlShoutcastSourcePriv {
+  gchar *dev_key;
+  GrlNetWc *wc;
+  GCancellable *cancellable;
+  gchar *cached_page;
+  gboolean cached_page_expired;
+};
+
 typedef struct {
   GrlMedia *media;
   GrlMediaSource *source;
@@ -76,12 +92,7 @@ typedef struct {
   xmlNodePtr xml_entries;
 } OperationData;
 
-static GrlNetWc *wc = NULL;
-static GCancellable *cancellable;
-static gchar *cached_page = NULL;
-static gboolean cached_page_expired = TRUE;
-
-static GrlShoutcastSource *grl_shoutcast_source_new (void);
+static GrlShoutcastSource *grl_shoutcast_source_new (const gchar *dev_key);
 
 gboolean grl_shoutcast_plugin_init (GrlPluginRegistry *registry,
                                     const GrlPluginInfo *plugin,
@@ -101,7 +112,9 @@ static void grl_shoutcast_source_search (GrlMediaSource *source,
 static void grl_shoutcast_source_cancel (GrlMetadataSource *source,
                                          guint operation_id);
 
-static void read_url_async (const gchar *url, OperationData *op_data);
+static void read_url_async (GrlShoutcastSource *source,
+                            const gchar *url,
+                            OperationData *op_data);
 
 static void grl_shoutcast_source_finalize (GObject *object);
 
@@ -112,15 +125,40 @@ grl_shoutcast_plugin_init (GrlPluginRegistry *registry,
                            const GrlPluginInfo *plugin,
                            GList *configs)
 {
+  gchar *dev_key;
+  GrlConfig *config;
+  gint config_count;
+  GrlShoutcastSource *source;
+
   GRL_LOG_DOMAIN_INIT (shoutcast_log_domain, "shoutcast");
 
   GRL_DEBUG ("shoutcast_plugin_init");
 
-  GrlShoutcastSource *source = grl_shoutcast_source_new ();
+  if (!configs) {
+    GRL_INFO ("Configuration not provided! Plugin not loaded");
+    return FALSE;
+  }
+
+  config_count = g_list_length (configs);
+  if (config_count > 1) {
+    GRL_INFO ("Provided %d configs, but will only use one", config_count);
+  }
+
+  config = GRL_CONFIG (configs->data);
+  dev_key = grl_config_get_string (config, SHOUTCAST_DEV_KEY);
+  if (!dev_key) {
+    GRL_INFO ("Missin API Dev Key, cannot load plugin");
+    return FALSE;
+  }
+
+  source = grl_shoutcast_source_new (dev_key);
   grl_plugin_registry_register_source (registry,
                                        plugin,
                                        GRL_MEDIA_PLUGIN (source),
                                        NULL);
+
+  g_free (dev_key);
+
   return TRUE;
 }
 
@@ -131,14 +169,21 @@ GRL_PLUGIN_REGISTER (grl_shoutcast_plugin_init,
 /* ================== SHOUTcast GObject ================ */
 
 static GrlShoutcastSource *
-grl_shoutcast_source_new (void)
+grl_shoutcast_source_new (const gchar *dev_key)
 {
+  GrlShoutcastSource *source;
+
   GRL_DEBUG ("grl_shoutcast_source_new");
-  return g_object_new (GRL_SHOUTCAST_SOURCE_TYPE,
-		       "source-id", SOURCE_ID,
-		       "source-name", SOURCE_NAME,
-		       "source-desc", SOURCE_DESC,
-		       NULL);
+
+  source =  g_object_new (GRL_SHOUTCAST_SOURCE_TYPE,
+                          "source-id", SOURCE_ID,
+                          "source-name", SOURCE_NAME,
+                          "source-desc", SOURCE_DESC,
+                          NULL);
+
+  source->priv->dev_key = g_strdup (dev_key);
+
+  return source;
 }
 
 static void
@@ -147,17 +192,24 @@ grl_shoutcast_source_class_init (GrlShoutcastSourceClass * klass)
   GrlMediaSourceClass *source_class = GRL_MEDIA_SOURCE_CLASS (klass);
   GrlMetadataSourceClass *metadata_class = GRL_METADATA_SOURCE_CLASS (klass);
   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
   source_class->metadata = grl_shoutcast_source_metadata;
   source_class->browse = grl_shoutcast_source_browse;
   source_class->search = grl_shoutcast_source_search;
+
   metadata_class->cancel = grl_shoutcast_source_cancel;
   metadata_class->supported_keys = grl_shoutcast_source_supported_keys;
+
   gobject_class->finalize = grl_shoutcast_source_finalize;
+
+  g_type_class_add_private (klass, sizeof (GrlShoutcastSourcePriv));
 }
 
 static void
 grl_shoutcast_source_init (GrlShoutcastSource *source)
 {
+  source->priv = GRL_SHOUTCAST_SOURCE_GET_PRIVATE (source);
+  source->priv->cached_page_expired = TRUE;
 }
 
 G_DEFINE_TYPE (GrlShoutcastSource, grl_shoutcast_source, GRL_TYPE_MEDIA_SOURCE);
@@ -165,11 +217,22 @@ G_DEFINE_TYPE (GrlShoutcastSource, grl_shoutcast_source, GRL_TYPE_MEDIA_SOURCE);
 static void
 grl_shoutcast_source_finalize (GObject *object)
 {
-  if (wc && GRL_IS_NET_WC (wc))
-    g_object_unref (wc);
+  GrlShoutcastSource *self = GRL_SHOUTCAST_SOURCE (object);
+
+  if (self->priv->wc && GRL_IS_NET_WC (self->priv->wc))
+    g_object_unref (self->priv->wc);
 
-  if (cancellable && G_IS_CANCELLABLE (cancellable))
-    g_cancellable_cancel (cancellable);
+  if (self->priv->cancellable && G_IS_CANCELLABLE (self->priv->cancellable))
+    g_cancellable_cancel (self->priv->cancellable);
+
+  if (self->priv->cached_page) {
+    g_free (self->priv->cached_page);
+    self->priv->cached_page = NULL;
+  }
+
+  if (self->priv->dev_key) {
+    g_free (self->priv->dev_key);
+  }
 
   G_OBJECT_CLASS (grl_shoutcast_source_parent_class)->finalize (object);
 }
@@ -469,8 +532,10 @@ xml_parse_result (const gchar *str, OperationData *op_data)
 static gboolean
 expire_cache (gpointer user_data)
 {
+  GrlShoutcastSource *source = GRL_SHOUTCAST_SOURCE (user_data);
+
   GRL_DEBUG ("Cached page expired");
-  cached_page_expired = TRUE;
+  source->priv->cached_page_expired = TRUE;
   return FALSE;
 }
 
@@ -482,6 +547,7 @@ read_done_cb (GObject *source_object,
   GError *error = NULL;
   GError *wc_error = NULL;
   OperationData *op_data = (OperationData *) user_data;
+  GrlShoutcastSource *source = GRL_SHOUTCAST_SOURCE (op_data->source);
   gboolean cache;
   gchar *content = NULL;
 
@@ -509,34 +575,39 @@ read_done_cb (GObject *source_object,
 
   cache = op_data->cache;
   xml_parse_result (content, op_data);
-  if (cache && cached_page_expired) {
+  if (cache && source->priv->cached_page_expired) {
     GRL_DEBUG ("Caching page");
-    g_free (cached_page);
-    cached_page = g_strdup (content);
-    cached_page_expired = FALSE;
-    g_timeout_add_seconds (EXPIRE_CACHE_TIMEOUT, expire_cache, NULL);
+    g_free (source->priv->cached_page);
+    source->priv->cached_page = g_strdup (content);
+    source->priv->cached_page_expired = FALSE;
+    g_timeout_add_seconds (EXPIRE_CACHE_TIMEOUT, expire_cache, source);
   }
 }
 
 static gboolean
 read_cached_page (OperationData *op_data)
 {
+  gchar *cached_page = GRL_SHOUTCAST_SOURCE (op_data->source)->priv->cached_page;
   xml_parse_result (cached_page, op_data);
   return FALSE;
 }
 
 static void
-read_url_async (const gchar *url, OperationData *op_data)
+read_url_async (GrlShoutcastSource *source,
+                const gchar *url,
+                OperationData *op_data)
 {
-  if (op_data->cache && !cached_page_expired) {
+  if (op_data->cache && !source->priv->cached_page_expired) {
     GRL_DEBUG ("Using cached page");
     g_idle_add ((GSourceFunc) read_cached_page, op_data);
   } else {
-    if (!wc)
-      wc = grl_net_wc_new ();
+    if (!source->priv->wc)
+      source->priv->wc = grl_net_wc_new ();
 
-    cancellable = g_cancellable_new ();
-    grl_net_wc_request_async (wc, url, cancellable, read_done_cb, op_data);
+    source->priv->cancellable = g_cancellable_new ();
+    grl_net_wc_request_async (source->priv->wc, url,
+                              source->priv->cancellable,
+                              read_done_cb, op_data);
   }
 }
 
@@ -566,6 +637,7 @@ grl_shoutcast_source_metadata (GrlMediaSource *source,
   gchar **id_tokens;
   gchar *url = NULL;
   OperationData *data = NULL;
+  GrlShoutcastSource *shoutcast_source = GRL_SHOUTCAST_SOURCE (source);
 
   /* Unfortunately, shoutcast does not have an API to get information about a
      station.  Thus, steps done to obtain the Content must be repeated. For
@@ -598,24 +670,27 @@ grl_shoutcast_source_metadata (GrlMediaSource *source,
       /* Check if result is from a previous search */
       if (id_tokens[0][0] == '?') {
         url = g_strdup_printf (SHOUTCAST_SEARCH_RADIOS,
+                               shoutcast_source->priv->dev_key,
                                id_tokens[0]+1,
                                G_MAXINT);
       } else {
         url = g_strdup_printf (SHOUTCAST_GET_RADIOS,
+                               shoutcast_source->priv->dev_key,
                                id_tokens[0],
                                G_MAXINT);
       }
     } else {
       data->filter_entry = g_strdup (id_tokens[0]);
       data->cache = TRUE;
-      url = g_strdup (SHOUTCAST_GET_GENRES);
+      url = g_strdup_printf (SHOUTCAST_GET_GENRES,
+                             shoutcast_source->priv->dev_key);
     }
 
     g_strfreev (id_tokens);
   }
 
   if (url) {
-    read_url_async (url, data);
+    read_url_async (shoutcast_source, url, data);
     g_free (url);
   } else {
     ms->callback (ms->source, ms->metadata_id, ms->media, ms->user_data, NULL);
@@ -629,6 +704,7 @@ grl_shoutcast_source_browse (GrlMediaSource *source,
   OperationData *data;
   const gchar *container_id;
   gchar *url;
+  GrlShoutcastSource *shoutcast_source = GRL_SHOUTCAST_SOURCE (source);
 
   GRL_DEBUG ("grl_shoutcast_source_browse");
 
@@ -646,9 +722,11 @@ grl_shoutcast_source_browse (GrlMediaSource *source,
   /* If it's root category send list of genres; else send list of radios */
   if (!container_id) {
     data->cache = TRUE;
-    url = g_strdup (SHOUTCAST_GET_GENRES);
+    url = g_strdup_printf (SHOUTCAST_GET_GENRES,
+                           shoutcast_source->priv->dev_key);
   } else {
     url = g_strdup_printf (SHOUTCAST_GET_RADIOS,
+                           shoutcast_source->priv->dev_key,
                            container_id,
                            bs->skip + bs->count);
     data->genre = g_strdup (container_id);
@@ -656,7 +734,7 @@ grl_shoutcast_source_browse (GrlMediaSource *source,
 
   grl_operation_set_data (bs->browse_id, data);
 
-  read_url_async (url, data);
+  read_url_async (shoutcast_source, url, data);
 
   g_free (url);
 }
@@ -668,6 +746,7 @@ grl_shoutcast_source_search (GrlMediaSource *source,
   GError *error;
   OperationData *data;
   gchar *url;
+  GrlShoutcastSource *shoutcast_source = GRL_SHOUTCAST_SOURCE (source);
 
   /* Check if there is text to search */
   if (!ss->text || ss->text[0] == '\0') {
@@ -697,10 +776,11 @@ grl_shoutcast_source_search (GrlMediaSource *source,
   grl_operation_set_data (ss->search_id, data);
 
   url = g_strdup_printf (SHOUTCAST_SEARCH_RADIOS,
+                         shoutcast_source->priv->dev_key,
                          ss->text,
                          ss->skip + ss->count);
 
-  read_url_async (url, data);
+  read_url_async (GRL_SHOUTCAST_SOURCE (source), url, data);
 
   g_free (url);
 }
@@ -709,12 +789,16 @@ static void
 grl_shoutcast_source_cancel (GrlMetadataSource *source, guint operation_id)
 {
   OperationData *op_data;
+  GrlShoutcastSourcePriv *priv;
 
   GRL_DEBUG ("grl_shoutcast_source_cancel");
 
-  if (cancellable && G_IS_CANCELLABLE (cancellable))
-    g_cancellable_cancel (cancellable);
-  cancellable = NULL;
+  priv = GRL_SHOUTCAST_SOURCE_GET_PRIVATE (source);
+
+  if (priv->cancellable && G_IS_CANCELLABLE (priv->cancellable)) {
+    g_cancellable_cancel (priv->cancellable);
+  }
+  priv->cancellable = NULL;
 
   op_data = (OperationData *) grl_operation_get_data (operation_id);
 
diff --git a/src/media/shoutcast/grl-shoutcast.h b/src/media/shoutcast/grl-shoutcast.h
index 741fac0..7e89c15 100644
--- a/src/media/shoutcast/grl-shoutcast.h
+++ b/src/media/shoutcast/grl-shoutcast.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Igalia S.L.
+ * Copyright (C) 2010, 2011 Igalia S.L.
  *
  * Contact: Iago Toral Quiroga <itoral@igalia.com>
  *
@@ -54,11 +54,12 @@
                               GrlShoutcastSourceClass))
 
 typedef struct _GrlShoutcastSource GrlShoutcastSource;
+typedef struct _GrlShoutcastSourcePriv GrlShoutcastSourcePriv;
 
 struct _GrlShoutcastSource {
 
   GrlMediaSource parent;
-
+  GrlShoutcastSourcePriv *priv;
 };
 
 typedef struct _GrlShoutcastSourceClass GrlShoutcastSourceClass;
diff --git a/src/media/tracker/grl-tracker-media-api.c b/src/media/tracker/grl-tracker-media-api.c
index 390e870..85de953 100644
--- a/src/media/tracker/grl-tracker-media-api.c
+++ b/src/media/tracker/grl-tracker-media-api.c
@@ -1,4 +1,5 @@
 /*
+ * Copyright (C) 2011 Igalia S.L.
  * Copyright (C) 2011 Intel Corporation.
  *
  * Contact: Iago Toral Quiroga <itoral@igalia.com>
diff --git a/src/media/tracker/grl-tracker-media-api.h b/src/media/tracker/grl-tracker-media-api.h
index da635e7..604bfbb 100644
--- a/src/media/tracker/grl-tracker-media-api.h
+++ b/src/media/tracker/grl-tracker-media-api.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright (C) 2011 Igalia S.L.
  * Copyright (C) 2011 Intel Corporation.
  *
  * Contact: Iago Toral Quiroga <itoral@igalia.com>
diff --git a/src/media/tracker/grl-tracker-media-notif.c b/src/media/tracker/grl-tracker-media-notif.c
index 593a00f..5f42746 100644
--- a/src/media/tracker/grl-tracker-media-notif.c
+++ b/src/media/tracker/grl-tracker-media-notif.c
@@ -1,4 +1,5 @@
 /*
+ * Copyright (C) 2011 Igalia S.L.
  * Copyright (C) 2011 Intel Corporation.
  *
  * Contact: Iago Toral Quiroga <itoral@igalia.com>
diff --git a/src/media/tracker/grl-tracker-media-priv.h b/src/media/tracker/grl-tracker-media-priv.h
index 5b4cffd..3836c99 100644
--- a/src/media/tracker/grl-tracker-media-priv.h
+++ b/src/media/tracker/grl-tracker-media-priv.h
@@ -1,4 +1,5 @@
 /*
+ * Copyright (C) 2011 Igalia S.L.
  * Copyright (C) 2011 Intel Corporation.
  *
  * Contact: Iago Toral Quiroga <itoral@igalia.com>
diff --git a/src/media/tracker/grl-tracker-metadata.c b/src/media/tracker/grl-tracker-metadata.c
index dc22759..1924a48 100644
--- a/src/media/tracker/grl-tracker-metadata.c
+++ b/src/media/tracker/grl-tracker-metadata.c
@@ -1,4 +1,5 @@
 /*
+ * Copyright (C) 2011 Igalia S.L.
  * Copyright (C) 2011 Intel Corporation.
  *
  * Contact: Iago Toral Quiroga <itoral@igalia.com>
diff --git a/src/media/tracker/grl-tracker-utils.c b/src/media/tracker/grl-tracker-utils.c
index 9c37c42..0832b21 100644
--- a/src/media/tracker/grl-tracker-utils.c
+++ b/src/media/tracker/grl-tracker-utils.c
@@ -1,4 +1,5 @@
 /*
+ * Copyright (C) 2011 Igalia S.L.
  * Copyright (C) 2011 Intel Corporation.
  *
  * Contact: Iago Toral Quiroga <itoral@igalia.com>
diff --git a/src/media/upnp/grl-upnp.c b/src/media/upnp/grl-upnp.c
index a8e990c..744fefb 100644
--- a/src/media/upnp/grl-upnp.c
+++ b/src/media/upnp/grl-upnp.c
@@ -925,7 +925,6 @@ gupnp_browse_cb (GUPnPServiceProxy *service,
   gchar *didl = NULL;
   guint returned = 0;
   guint matches = 0;
-  gboolean result;
   struct OperationSpec *os;
   GUPnPDIDLLiteParser *didl_parser;
 
@@ -934,31 +933,23 @@ gupnp_browse_cb (GUPnPServiceProxy *service,
   os = (struct OperationSpec *) user_data;
   didl_parser = gupnp_didl_lite_parser_new ();
 
-  result =
-    gupnp_service_proxy_end_action (service, action, &error,
-				    "Result", G_TYPE_STRING, &didl,
-				    "NumberReturned", G_TYPE_UINT, &returned,
-				    "TotalMatches", G_TYPE_UINT, &matches,
-				    NULL);
+  gupnp_service_proxy_end_action (service, action, &error,
+                                  "Result", G_TYPE_STRING, &didl,
+                                  "NumberReturned", G_TYPE_UINT, &returned,
+                                  "TotalMatches", G_TYPE_UINT, &matches,
+                                  NULL);
 
-  if (!result) {
-    GRL_WARNING ("Operation (browse, search or query) failed");
-    os->callback (os->source, os->operation_id, NULL, 0, os->user_data, error);
+  if (!didl || !returned) {
+    GRL_DEBUG ("Got no results");
+    os->callback (os->source, os->operation_id,
+                  NULL, 0, os->user_data, error? error: NULL);
     if (error) {
-      GRL_WARNING ("  Reason: %s", error->message);
       g_error_free (error);
     }
 
     goto free_resources;
   }
 
-  if (!didl || !returned) {
-    GRL_DEBUG ("Got no results");
-    os->callback (os->source, os->operation_id, NULL, 0, os->user_data, NULL);
-
-    goto free_resources;
-  }
-
   /* Use os->count to emit "remaining" information */
   if (os->count > returned) {
     os->count = returned;
@@ -1004,7 +995,6 @@ gupnp_metadata_cb (GUPnPServiceProxy *service,
 {
   GError *error = NULL;
   gchar *didl = NULL;
-  gboolean result;
   GrlMediaSourceMetadataSpec *ms;
   GUPnPDIDLLiteParser *didl_parser;
 
@@ -1013,29 +1003,21 @@ gupnp_metadata_cb (GUPnPServiceProxy *service,
   ms = (GrlMediaSourceMetadataSpec *) user_data;
   didl_parser = gupnp_didl_lite_parser_new ();
 
-  result =
-    gupnp_service_proxy_end_action (service, action, &error,
-				    "Result", G_TYPE_STRING, &didl,
-				    NULL);
+  gupnp_service_proxy_end_action (service, action, &error,
+                                  "Result", G_TYPE_STRING, &didl,
+                                  NULL);
 
-  if (!result) {
-    GRL_WARNING ("Metadata operation failed");
-    ms->callback (ms->source, ms->metadata_id, ms->media, ms->user_data, error);
+  if (!didl) {
+    GRL_DEBUG ("Got no metadata");
+    ms->callback (ms->source, ms->metadata_id,
+                  ms->media, ms->user_data, error? error: NULL);
     if (error) {
-      GRL_WARNING ("  Reason: %s", error->message);
       g_error_free (error);
     }
 
     goto free_resources;
   }
 
-  if (!didl) {
-    GRL_DEBUG ("Got no metadata");
-    ms->callback (ms->source, ms->metadata_id, ms->media,  ms->user_data, NULL);
-
-    goto free_resources;
-  }
-
   g_signal_connect (G_OBJECT (didl_parser),
                     "object-available",
                     G_CALLBACK (gupnp_metadata_result_cb),
diff --git a/src/media/vimeo/grl-vimeo.c b/src/media/vimeo/grl-vimeo.c
index 42edc8b..50c097f 100644
--- a/src/media/vimeo/grl-vimeo.c
+++ b/src/media/vimeo/grl-vimeo.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Igalia S.L.
+ * Copyright (C) 2010, 2011 Igalia S.L.
  * Copyright (C) 2011 Intel Corporation.
  *
  * Contact: Iago Toral Quiroga <itoral@igalia.com>
diff --git a/src/media/vimeo/gvimeo.c b/src/media/vimeo/gvimeo.c
index 3b7f2fc..4d77db6 100644
--- a/src/media/vimeo/gvimeo.c
+++ b/src/media/vimeo/gvimeo.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Igalia S.L.
+ * Copyright (C) 2010, 2011 Igalia S.L.
  *
  * Contact: Iago Toral Quiroga <itoral@igalia.com>
  *
diff --git a/src/media/youtube/grl-youtube.c b/src/media/youtube/grl-youtube.c
index 7f124ce..c6b2a70 100644
--- a/src/media/youtube/grl-youtube.c
+++ b/src/media/youtube/grl-youtube.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Igalia S.L.
+ * Copyright (C) 2010, 2011 Igalia S.L.
  * Copyright (C) 2011 Intel Corporation.
  *
  * Contact: Iago Toral Quiroga <itoral@igalia.com>
diff --git a/src/metadata/fake-metadata/grl-fake-metadata.c b/src/metadata/fake-metadata/grl-fake-metadata.c
index 770c7f6..aebce0e 100644
--- a/src/metadata/fake-metadata/grl-fake-metadata.c
+++ b/src/metadata/fake-metadata/grl-fake-metadata.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Igalia S.L.
+ * Copyright (C) 2010, 2011 Igalia S.L.
  *
  * Contact: Iago Toral Quiroga <itoral@igalia.com>
  *
diff --git a/src/metadata/gravatar/grl-gravatar.c b/src/metadata/gravatar/grl-gravatar.c
index 35e6885..fd2b326 100644
--- a/src/metadata/gravatar/grl-gravatar.c
+++ b/src/metadata/gravatar/grl-gravatar.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Igalia S.L.
+ * Copyright (C) 2010, 2011 Igalia S.L.
  *
  * Contact: Iago Toral Quiroga <itoral@igalia.com>
  *
diff --git a/src/metadata/lastfm-albumart/grl-lastfm-albumart.c b/src/metadata/lastfm-albumart/grl-lastfm-albumart.c
index b65c840..9559fa0 100644
--- a/src/metadata/lastfm-albumart/grl-lastfm-albumart.c
+++ b/src/metadata/lastfm-albumart/grl-lastfm-albumart.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Igalia S.L.
+ * Copyright (C) 2010, 2011 Igalia S.L.
  *
  * Contact: Iago Toral Quiroga <itoral@igalia.com>
  *
diff --git a/src/metadata/metadata-store/grl-metadata-store.c b/src/metadata/metadata-store/grl-metadata-store.c
index 50aaf8a..c8fff43 100644
--- a/src/metadata/metadata-store/grl-metadata-store.c
+++ b/src/metadata/metadata-store/grl-metadata-store.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Igalia S.L.
+ * Copyright (C) 2010, 2011 Igalia S.L.
  *
  * Contact: Iago Toral Quiroga <itoral@igalia.com>
  *
diff --git a/test/Makefile.am b/test/Makefile.am
index 63b2832..3b096af 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -3,7 +3,7 @@
 #
 # Author: Iago Toral <itoral@igalia.com>
 #
-# Copyright (C) 2010 Igalia S.L.
+# Copyright (C) 2010, 2011 Igalia S.L.
 
 INCLUDES = @DEPS_CFLAGS@
 
diff --git a/test/main.c b/test/main.c
index afe28e1..62352a0 100644
--- a/test/main.c
+++ b/test/main.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Igalia S.L.
+ * Copyright (C) 2010, 2011 Igalia S.L.
  *
  * Contact: Iago Toral Quiroga <itoral@igalia.com>
  *
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin