|
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 |
}
|