Blame src/gom-media-server-miner.c

Packit f01ec2
/*
Packit f01ec2
 * GNOME Online Miners - crawls through your online content
Packit f01ec2
 * Copyright (c) 2014, 2015 Pranav Kant
Packit f01ec2
 *
Packit f01ec2
 * This program is free software; you can redistribute it and/or
Packit f01ec2
 * modify it under the terms of the GNU General Public License
Packit f01ec2
 * as published by the Free Software Foundation; either version 2
Packit f01ec2
 * of the License, or (at your option) any later version.
Packit f01ec2
 *
Packit f01ec2
 * This program is distributed in the hope that it will be useful,
Packit f01ec2
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit f01ec2
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit f01ec2
 * GNU General Public License for more details.
Packit f01ec2
 *
Packit f01ec2
 * You should have received a copy of the GNU General Public License
Packit f01ec2
 * along with this program; if not, write to the Free Software
Packit f01ec2
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
Packit f01ec2
 * 02110-1301, USA.
Packit f01ec2
 *
Packit f01ec2
 * Author: Pranav Kant <pranavk@gnome.org>
Packit f01ec2
 *
Packit f01ec2
 */
Packit f01ec2
Packit f01ec2
#include "config.h"
Packit f01ec2
Packit f01ec2
#include <goa/goa.h>
Packit f01ec2
Packit f01ec2
#include "gom-dlna-server.h"
Packit f01ec2
#include "gom-dlna-servers-manager.h"
Packit f01ec2
#include "gom-media-server-miner.h"
Packit f01ec2
Packit f01ec2
#define MINER_IDENTIFIER "gd:media-server:miner:a4a47a3e-eb55-11e3-b983-14feb59cfa0e"
Packit f01ec2
Packit f01ec2
struct _GomMediaServerMinerPrivate {
Packit f01ec2
  GomDlnaServersManager *mngr;
Packit f01ec2
};
Packit f01ec2
Packit f01ec2
G_DEFINE_TYPE_WITH_PRIVATE (GomMediaServerMiner, gom_media_server_miner, GOM_TYPE_MINER)
Packit f01ec2
Packit f01ec2
Packit f01ec2
static gboolean
Packit f01ec2
account_miner_job_process_photo (GomAccountMinerJob *job,
Packit f01ec2
                                 TrackerSparqlConnection *connection,
Packit f01ec2
                                 GHashTable *previous_resources,
Packit f01ec2
                                 const gchar *datasource_urn,
Packit f01ec2
                                 GomDlnaPhotoItem *photo,
Packit f01ec2
                                 GCancellable *cancellable,
Packit f01ec2
                                 GError **error)
Packit f01ec2
{
Packit f01ec2
  const gchar *photo_id;
Packit f01ec2
  gchar *identifier;
Packit f01ec2
  const gchar *class = "nmm:Photo";
Packit f01ec2
  gchar *resource = NULL;
Packit f01ec2
  gboolean resource_exists;
Packit f01ec2
  gchar **tmp_arr;
Packit f01ec2
Packit f01ec2
  tmp_arr = g_strsplit_set (photo->path, "/", -1);
Packit f01ec2
  photo_id = tmp_arr[g_strv_length (tmp_arr) - 1];
Packit f01ec2
  identifier = g_strdup_printf ("media-server:%s", photo_id);
Packit f01ec2
Packit f01ec2
  /* remove from the list of the previous resources */
Packit f01ec2
  g_hash_table_remove (previous_resources, identifier);
Packit f01ec2
Packit f01ec2
  resource = gom_tracker_sparql_connection_ensure_resource
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     &resource_exists,
Packit f01ec2
     datasource_urn, identifier,
Packit f01ec2
     "nfo:RemoteDataObject", class, NULL);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  gom_tracker_update_datasource (connection, datasource_urn,
Packit f01ec2
                                 resource_exists, identifier, resource,
Packit f01ec2
                                 cancellable, error);
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  /* the resource changed - just set all the properties again */
Packit f01ec2
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nie:url", photo->url);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nie:mimeType", photo->mimetype);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
  gom_tracker_sparql_connection_insert_or_replace_triple
Packit f01ec2
    (connection,
Packit f01ec2
     cancellable, error,
Packit f01ec2
     datasource_urn, resource,
Packit f01ec2
     "nie:title", photo->name);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    goto out;
Packit f01ec2
Packit f01ec2
 out:
Packit f01ec2
  g_free (resource);
Packit f01ec2
  g_free (identifier);
Packit f01ec2
  g_strfreev (tmp_arr);
Packit f01ec2
Packit f01ec2
  if (*error != NULL)
Packit f01ec2
    return FALSE;
Packit f01ec2
Packit f01ec2
  return TRUE;
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
Packit f01ec2
static void
Packit f01ec2
query_media_server (GomAccountMinerJob *job,
Packit f01ec2
                    TrackerSparqlConnection *connection,
Packit f01ec2
                    GHashTable *previous_resources,
Packit f01ec2
                    const gchar *datasource_urn,
Packit f01ec2
                    GCancellable *cancellable,
Packit f01ec2
                    GError **error)
Packit f01ec2
{
Packit f01ec2
  GomMediaServerMiner *self = GOM_MEDIA_SERVER_MINER (job->miner);
Packit f01ec2
  GomMediaServerMinerPrivate *priv = self->priv;
Packit f01ec2
  GError *local_error = NULL;
Packit f01ec2
  GoaMediaServer *media_server;
Packit f01ec2
  GList *l;
Packit f01ec2
  GList *photos_list;
Packit f01ec2
  GoaObject *object;
Packit f01ec2
  GomDlnaServer *dlna_server;
Packit f01ec2
  const gchar *udn;
Packit f01ec2
Packit f01ec2
  object = GOA_OBJECT (g_hash_table_lookup (job->services, "photos"));
Packit f01ec2
  if (object == NULL)
Packit f01ec2
    {
Packit f01ec2
      /* FIXME: use proper #defines and enumerated types */
Packit f01ec2
      g_set_error (error,
Packit f01ec2
                   g_quark_from_static_string ("gom-error"),
Packit f01ec2
                   0,
Packit f01ec2
                   "Can not query without a service");
Packit f01ec2
      return;
Packit f01ec2
    }
Packit f01ec2
Packit f01ec2
  media_server = goa_object_get_media_server (object);
Packit f01ec2
  udn = goa_media_server_get_udn (media_server);
Packit f01ec2
  dlna_server = gom_dlna_servers_manager_get_server (priv->mngr, udn);
Packit f01ec2
  if (dlna_server == NULL)
Packit f01ec2
    return; /* Server is offline. */
Packit f01ec2
Packit f01ec2
  photos_list = gom_dlna_server_get_photos (dlna_server);
Packit f01ec2
  for (l = photos_list; l != NULL; l = l->next)
Packit f01ec2
    {
Packit f01ec2
      GomDlnaPhotoItem *photo = (GomDlnaPhotoItem *) l->data;
Packit f01ec2
Packit f01ec2
      account_miner_job_process_photo (job,
Packit f01ec2
                                       connection,
Packit f01ec2
                                       previous_resources,
Packit f01ec2
                                       datasource_urn,
Packit f01ec2
                                       photo,
Packit f01ec2
                                       cancellable,
Packit f01ec2
                                       &local_error);
Packit f01ec2
      if (local_error != NULL)
Packit f01ec2
        {
Packit f01ec2
          g_warning ("Unable to process photo: %s", local_error->message);
Packit f01ec2
          g_clear_error (&local_error);
Packit f01ec2
        }
Packit f01ec2
    }
Packit f01ec2
Packit f01ec2
  g_list_free_full (photos_list, (GDestroyNotify) gom_dlna_photo_item_free);
Packit f01ec2
  g_object_unref (media_server);
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
static GHashTable *
Packit f01ec2
create_services (GomMiner *self,
Packit f01ec2
                 GoaObject *object)
Packit f01ec2
{
Packit f01ec2
  GHashTable *services;
Packit f01ec2
Packit f01ec2
  services = g_hash_table_new_full (g_str_hash, g_str_equal,
Packit f01ec2
                                    NULL, (GDestroyNotify) g_object_unref);
Packit f01ec2
Packit f01ec2
  if (gom_miner_supports_type (self, "photos"))
Packit f01ec2
    g_hash_table_insert (services, "photos", g_object_ref (object));
Packit f01ec2
Packit f01ec2
  return services;
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
static void
Packit f01ec2
gom_media_server_miner_init (GomMediaServerMiner *miner)
Packit f01ec2
{
Packit f01ec2
  miner->priv = gom_media_server_miner_get_instance_private (miner);
Packit f01ec2
  miner->priv->mngr = gom_dlna_servers_manager_dup_singleton ();
Packit f01ec2
}
Packit f01ec2
Packit f01ec2
static void
Packit f01ec2
gom_media_server_miner_class_init (GomMediaServerMinerClass *klass)
Packit f01ec2
{
Packit f01ec2
  GomMinerClass *miner_class = GOM_MINER_CLASS (klass);
Packit f01ec2
Packit f01ec2
  miner_class->goa_provider_type = "media-server";
Packit f01ec2
  miner_class->miner_identifier = MINER_IDENTIFIER;
Packit f01ec2
  miner_class->version = 1;
Packit f01ec2
Packit f01ec2
  miner_class->create_services = create_services;
Packit f01ec2
  miner_class->query = query_media_server;
Packit f01ec2
}