diff options
author | Martyn Russell <martyn@lanedo.com> | 2010-03-08 16:27:44 +0000 |
---|---|---|
committer | Martyn Russell <martyn@lanedo.com> | 2010-03-09 17:43:58 +0000 |
commit | 86911d51577a558727038770b04c95501b3ea627 (patch) | |
tree | 9e878464745567f9da5cfc986d21f2580c6a32da /examples | |
parent | dcf338da51a2bc23a31b10e41873ceccfba1587c (diff) | |
download | tracker-86911d51577a558727038770b04c95501b3ea627.tar.gz |
libtracker-extract: Added example to examples/libtracker-extract
Moved mockup from src/tracker-extract/ to here.
Used MP3 source and added comments to detail what is going on
Diffstat (limited to 'examples')
-rw-r--r-- | examples/Makefile.am | 1 | ||||
-rw-r--r-- | examples/libtracker-extract/Makefile.am | 23 | ||||
-rw-r--r-- | examples/libtracker-extract/tracker-extract-mockup.c | 345 |
3 files changed, 369 insertions, 0 deletions
diff --git a/examples/Makefile.am b/examples/Makefile.am index 44c1e3fbd..41a8a6762 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -1,5 +1,6 @@ include $(top_srcdir)/Makefile.decl SUBDIRS = \ + libtracker-extract \ libtracker-miner \ rss-reader diff --git a/examples/libtracker-extract/Makefile.am b/examples/libtracker-extract/Makefile.am new file mode 100644 index 000000000..eb6987d94 --- /dev/null +++ b/examples/libtracker-extract/Makefile.am @@ -0,0 +1,23 @@ +include $(top_srcdir)/Makefile.decl + +module_flags = -module -avoid-version -no-undefined +modulesdir = $(libdir)/tracker-$(TRACKER_API_VERSION)/extract-modules + +INCLUDES = \ + -DLOCALEDIR=\""$(localedir)"\" \ + -DMODULESDIR=\"$(modulesdir)\" \ + -I$(top_srcdir)/src \ + $(WARN_CFLAGS) \ + $(GLIB2_CFLAGS) \ + $(GCOV_CFLAGS) + +modules_LTLIBRARIES = libextract-mockup.la + +libextract_mockup_la_SOURCES = tracker-extract-mockup.c +libextract_mockup_la_LDFLAGS = $(module_flags) +libextract_mockup_la_LIBADD = \ + $(top_builddir)/src/libtracker-extract/libtracker-extract-@TRACKER_API_VERSION@.la \ + $(top_builddir)/src/libtracker-common/libtracker-common.la \ + $(GLIB2_LIBS) \ + $(GCOV_LIBS) + diff --git a/examples/libtracker-extract/tracker-extract-mockup.c b/examples/libtracker-extract/tracker-extract-mockup.c new file mode 100644 index 000000000..03879cc22 --- /dev/null +++ b/examples/libtracker-extract/tracker-extract-mockup.c @@ -0,0 +1,345 @@ +/* + * Copyright (C) 2010, Your name <Your email address> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "config.h" + +#include <stdio.h> + +/* TODO: Include any 3rd party libraries here. */ + +/* #include <libtracker-common/tracker-file-utils.h> */ +/* #include <libtracker-common/tracker-utils.h> */ + +#include <gio/gio.h> + +#include <libtracker-extract/tracker-extract.h> +#include <libtracker-extract/tracker-utils.h> + +#include <libtracker-client/tracker.h> + +static void extract_mockup (const gchar *uri, + TrackerSparqlBuilder *preupdate, + TrackerSparqlBuilder *metadata); + +static TrackerExtractData data[] = { + /* TODO: Insert mime types and functions here. */ + { "audio/mpeg", extract_mockup }, + { "audio/x-mp3", extract_mockup }, + { NULL, NULL } +}; + +static void +extract_mockup (const gchar *uri, + TrackerSparqlBuilder *preupdate, + TrackerSparqlBuilder *metadata) +{ + /* File information */ + FILE *f; + GFileInfo *info; + GFile *file; + GError *error = NULL; + gchar *filename; + goffset size; + + /* Data input */ + gchar *title_tagv1; + gchar *title_tagv2; + gchar *title_tagv3; + gchar *title_unknown; + gchar *lyricist_tagv2; + gchar *lyricist_unknown; + + /* Coalesced input */ + gchar *title; + gchar *performer; + gchar *performer_uri; + gchar *lyricist; + gchar *lyricist_uri; + gchar *album; + gchar *album_uri; + gchar *genre; + gchar *text; + gchar *recording_time; + gchar *copyright; + gchar *publisher; + gchar *comment; + gchar *composer; + gchar *composer_uri; + gint track_number; + gint track_count; + guint32 duration; + + filename = g_filename_from_uri (uri, NULL, NULL); + + file = g_file_new_for_path (filename); + info = g_file_query_info (file, + G_FILE_ATTRIBUTE_STANDARD_SIZE, + G_FILE_QUERY_INFO_NONE, + NULL, + &error); + + if (G_UNLIKELY (error)) { + g_message ("Could not get size for '%s', %s", + filename, + error->message); + g_error_free (error); + size = 0; + } else { + size = g_file_info_get_size (info); + g_object_unref (info); + } + + g_object_unref (file); + + /* TODO: Do any pre-checks on the file + * (i.e check file size so we don't handle files of 0 size) + */ + if (size < 64) { + g_free (filename); + return; + } + + /* TODO: Open file */ + f = fopen (filename, "r"); + + if (!f) { + g_free (filename); + return; + } + + /* TODO: Get data from file. + * + * (We will use dummy data for this example) + */ + title_tagv1 = NULL; + title_tagv2 = g_strdup ("Burn The Witch"); + title_tagv3 = g_strdup (""); + title_unknown = g_strdup ("Unknown"); + + lyricist_tagv2 = g_strdup ("Someone"); + lyricist_unknown = g_strdup ("Someone"); + + /* TODO: Close file */ + fclose (f); + + /* TODO: Make sure we coalesce duplicate values */ + title = tracker_extract_coalesce (4, title_tagv1, title_tagv2, title_tagv3, title_unknown); + lyricist = tracker_extract_coalesce (2, lyricist_tagv2, lyricist_unknown); + + performer = g_strdup ("Stone Gods"); + composer = NULL; + album = g_strdup ("Silver Spoons And Broken Bones"); + genre = g_strdup ("Rock"); + recording_time = NULL; + publisher = NULL; + text = g_strdup ("Some description"); + copyright = g_strdup ("Who knows?"); + comment = g_strdup ("I love this track"); + track_number = 1; + track_count = 12; + duration = 32; + + /* TODO: Do any pre-updates + * + * (This involves creating any database nodes for consistent + * data objects, for example, an artist which might be used n times) + */ + if (performer) { + performer_uri = tracker_uri_printf_escaped ("urn:artist:%s", performer); + + tracker_sparql_builder_insert_open (preupdate, NULL); + tracker_sparql_builder_subject_iri (preupdate, performer_uri); + tracker_sparql_builder_predicate (preupdate, "a"); + tracker_sparql_builder_object (preupdate, "nmm:Artist"); + tracker_sparql_builder_predicate (preupdate, "nmm:artistName"); + tracker_sparql_builder_object_unvalidated (preupdate, performer); + tracker_sparql_builder_insert_close (preupdate); + } else { + performer_uri = NULL; + } + + if (composer) { + composer_uri = tracker_uri_printf_escaped ("urn:artist:%s", composer); + + tracker_sparql_builder_insert_open (preupdate, NULL); + tracker_sparql_builder_subject_iri (preupdate, composer_uri); + tracker_sparql_builder_predicate (preupdate, "a"); + tracker_sparql_builder_object (preupdate, "nmm:Artist"); + tracker_sparql_builder_predicate (preupdate, "nmm:artistName"); + tracker_sparql_builder_object_unvalidated (preupdate, composer); + tracker_sparql_builder_insert_close (preupdate); + } else { + composer_uri = NULL; + } + + if (lyricist) { + lyricist_uri = tracker_uri_printf_escaped ("urn:artist:%s", lyricist); + + tracker_sparql_builder_insert_open (preupdate, NULL); + tracker_sparql_builder_subject_iri (preupdate, lyricist_uri); + tracker_sparql_builder_predicate (preupdate, "a"); + tracker_sparql_builder_object (preupdate, "nmm:Artist"); + tracker_sparql_builder_predicate (preupdate, "nmm:artistName"); + tracker_sparql_builder_object_unvalidated (preupdate, lyricist); + tracker_sparql_builder_insert_close (preupdate); + } else { + lyricist_uri = NULL; + } + + if (album) { + album_uri = tracker_uri_printf_escaped ("urn:album:%s", album); + + tracker_sparql_builder_insert_open (preupdate, NULL); + tracker_sparql_builder_subject_iri (preupdate, album_uri); + tracker_sparql_builder_predicate (preupdate, "a"); + tracker_sparql_builder_object (preupdate, "nmm:MusicAlbum"); + tracker_sparql_builder_predicate (preupdate, "nmm:albumTitle"); + tracker_sparql_builder_object_unvalidated (preupdate, album); + tracker_sparql_builder_insert_close (preupdate); + + if (track_count > 0) { + tracker_sparql_builder_delete_open (preupdate, NULL); + tracker_sparql_builder_subject_iri (preupdate, album_uri); + tracker_sparql_builder_predicate (preupdate, "nmm:albumTrackCount"); + tracker_sparql_builder_object_variable (preupdate, "unknown"); + tracker_sparql_builder_delete_close (preupdate); + + tracker_sparql_builder_where_open (preupdate); + tracker_sparql_builder_subject_iri (preupdate, album_uri); + tracker_sparql_builder_predicate (preupdate, "nmm:albumTrackCount"); + tracker_sparql_builder_object_variable (preupdate, "unknown"); + tracker_sparql_builder_where_close (preupdate); + + tracker_sparql_builder_insert_open (preupdate, NULL); + tracker_sparql_builder_subject_iri (preupdate, album_uri); + tracker_sparql_builder_predicate (preupdate, "nmm:albumTrackCount"); + tracker_sparql_builder_object_int64 (preupdate, track_count); + tracker_sparql_builder_insert_close (preupdate); + } + } else { + album_uri = NULL; + } + + /* TODO: Do any metadata updates + * + * (This is where you can use entities created in the + * pre-updates part, like an artist). + */ + tracker_sparql_builder_predicate (metadata, "a"); + tracker_sparql_builder_object (metadata, "nmm:MusicPiece"); + tracker_sparql_builder_object (metadata, "nfo:Audio"); + + if (title) { + tracker_sparql_builder_predicate (metadata, "nie:title"); + tracker_sparql_builder_object_unvalidated (metadata, title); + g_free (title); + } + + if (lyricist_uri) { + tracker_sparql_builder_predicate (metadata, "nmm:lyricist"); + tracker_sparql_builder_object_iri (metadata, lyricist_uri); + g_free (lyricist_uri); + } + + if (performer_uri) { + tracker_sparql_builder_predicate (metadata, "nmm:performer"); + tracker_sparql_builder_object_iri (metadata, performer_uri); + g_free (performer_uri); + } + + if (composer_uri) { + tracker_sparql_builder_predicate (metadata, "nmm:composer"); + tracker_sparql_builder_object_iri (metadata, composer_uri); + g_free (composer_uri); + } + + if (album_uri) { + tracker_sparql_builder_predicate (metadata, "nmm:musicAlbum"); + tracker_sparql_builder_object_iri (metadata, album_uri); + g_free (album_uri); + } + + if (recording_time) { + tracker_sparql_builder_predicate (metadata, "nie:contentCreated"); + tracker_sparql_builder_object_unvalidated (metadata, recording_time); + g_free (recording_time); + } + + if (genre) { + tracker_sparql_builder_predicate (metadata, "nfo:genre"); + tracker_sparql_builder_object_unvalidated (metadata, genre); + g_free (genre); + } + + if (copyright) { + tracker_sparql_builder_predicate (metadata, "nie:copyright"); + tracker_sparql_builder_object_unvalidated (metadata, copyright); + g_free (copyright); + } + + if (comment) { + tracker_sparql_builder_predicate (metadata, "nie:comment"); + tracker_sparql_builder_object_unvalidated (metadata, comment); + g_free (comment); + } + + if (publisher) { + tracker_sparql_builder_predicate (metadata, "nco:publisher"); + tracker_sparql_builder_object_blank_open (metadata); + tracker_sparql_builder_predicate (metadata, "a"); + tracker_sparql_builder_object (metadata, "nco:Contact"); + tracker_sparql_builder_predicate (metadata, "nco:fullname"); + tracker_sparql_builder_object_unvalidated (metadata, publisher); + tracker_sparql_builder_object_blank_close (metadata); + g_free (publisher); + } + + if (track_number > 0) { + tracker_sparql_builder_predicate (metadata, "nmm:trackNumber"); + tracker_sparql_builder_object_int64 (metadata, track_number); + } + + if (duration > 0) { + tracker_sparql_builder_predicate (metadata, "nfo:duration"); + tracker_sparql_builder_object_int64 (metadata, duration); + } + + if (text) { + /* NOTE: This is for Full Text Search (FTS) indexing content */ + tracker_sparql_builder_predicate (metadata, "nie:plainTextContent"); + tracker_sparql_builder_object_unvalidated (metadata, text); + g_free (text); + } + + /* TODO: Clean up */ + g_free (album); + g_free (composer); + g_free (performer); + g_free (filename); +} + +TrackerExtractData * +tracker_extract_get_data (void) +{ + /* NOTE: This function has to exist, tracker-extract checks + * the symbole table for this function and if it doesn't + * exist, the module is not loaded to be used as an extractor. + */ + return data; +} |