diff options
Diffstat (limited to 'src/tracker-extract/tracker-extract-libav.c')
-rw-r--r-- | src/tracker-extract/tracker-extract-libav.c | 232 |
1 files changed, 58 insertions, 174 deletions
diff --git a/src/tracker-extract/tracker-extract-libav.c b/src/tracker-extract/tracker-extract-libav.c index 500d7d8d4..cd8147bf8 100644 --- a/src/tracker-extract/tracker-extract-libav.c +++ b/src/tracker-extract/tracker-extract-libav.c @@ -34,107 +34,12 @@ #include <libavformat/avformat.h> #include <libavutil/mathematics.h> -static void -open_insert (TrackerSparqlBuilder *preupdate, - const char *graph, - const gchar *iri, - const gchar *type) -{ - tracker_sparql_builder_insert_open (preupdate, NULL); - if (graph) { - tracker_sparql_builder_graph_open (preupdate, graph); - } - - tracker_sparql_builder_subject_iri (preupdate, iri); - tracker_sparql_builder_predicate (preupdate, "a"); - tracker_sparql_builder_object (preupdate, type); -} - -static void -close_insert (TrackerSparqlBuilder *preupdate, const char *graph) -{ - if (graph) { - tracker_sparql_builder_graph_close (preupdate); - } - tracker_sparql_builder_insert_close (preupdate); -} - -static void -delete_value (TrackerSparqlBuilder *preupdate, - const gchar *iri, - const gchar *predicate, - const char *value) -{ - tracker_sparql_builder_delete_open (preupdate, NULL); - tracker_sparql_builder_subject_iri (preupdate, iri); - tracker_sparql_builder_predicate (preupdate, predicate); - tracker_sparql_builder_object_variable (preupdate, value); - tracker_sparql_builder_delete_close (preupdate); - - tracker_sparql_builder_where_open (preupdate); - tracker_sparql_builder_subject_iri (preupdate, iri); - tracker_sparql_builder_predicate (preupdate, predicate); - tracker_sparql_builder_object_variable (preupdate, value); - tracker_sparql_builder_where_close (preupdate); -} - -static void -set_value_iri (TrackerSparqlBuilder *metadata, - const gchar *predicate, - const gchar *iri) -{ - tracker_sparql_builder_predicate (metadata, predicate); - tracker_sparql_builder_object_iri (metadata, iri); -} - -static void -set_value_double (TrackerSparqlBuilder *metadata, - const gchar *predicate, - gdouble value) -{ - tracker_sparql_builder_predicate (metadata, predicate); - tracker_sparql_builder_object_double (metadata, value); -} - -static void -set_value_int64 (TrackerSparqlBuilder *metadata, - const gchar *predicate, - gint64 value) -{ - tracker_sparql_builder_predicate (metadata, predicate); - tracker_sparql_builder_object_int64 (metadata, value); -} - -static void -set_value_string (TrackerSparqlBuilder *metadata, - const gchar *predicate, - const gchar *value) -{ - tracker_sparql_builder_predicate (metadata, predicate); - tracker_sparql_builder_object_unvalidated (metadata, value); -} - -static gchar * -create_artist (TrackerSparqlBuilder *preupdate, - const gchar *graph, - const char *name) -{ - gchar *uri = tracker_sparql_escape_uri_printf ("urn:artist:%s", name); - - open_insert (preupdate, graph, uri, "nmm:Artist"); - set_value_string (preupdate, "nmm:artistName", name); - close_insert (preupdate, graph); - - return uri; -} G_MODULE_EXPORT gboolean tracker_extract_get_metadata (TrackerExtractInfo *info) { GFile *file; - TrackerSparqlBuilder *metadata; - TrackerSparqlBuilder *preupdate; - const gchar *graph; + TrackerResource *metadata; gchar *absolute_file_path; gchar *uri; AVFormatContext *format = NULL; @@ -148,9 +53,6 @@ tracker_extract_get_metadata (TrackerExtractInfo *info) av_register_all (); file = tracker_extract_info_get_file (info); - metadata = tracker_extract_info_get_metadata_builder (info); - preupdate = tracker_extract_info_get_preupdate_builder (info); - graph = tracker_extract_info_get_graph (info); uri = g_file_get_uri (file); @@ -180,78 +82,77 @@ tracker_extract_get_metadata (TrackerExtractInfo *info) return FALSE; } + metadata = tracker_resource_new (NULL); + if (audio_stream) { if (audio_stream->codec->sample_rate > 0) { - set_value_int64 (metadata, "nfo:sampleRate", audio_stream->codec->sample_rate); + tracker_resource_set_int64 (metadata, "nfo:sampleRate", audio_stream->codec->sample_rate); } if (audio_stream->codec->channels > 0) { - set_value_int64 (metadata, "nfo:channels", audio_stream->codec->channels); + tracker_resource_set_int64 (metadata, "nfo:channels", audio_stream->codec->channels); } } if (video_stream) { - tracker_sparql_builder_predicate (metadata, "a"); - tracker_sparql_builder_object (metadata, "nmm:Video"); + tracker_resource_add_uri(metadata, "rdf:type", "nmm:Video"); if (video_stream->codec->width > 0 && video_stream->codec->height > 0) { - set_value_int64 (metadata, "nfo:width", video_stream->codec->width); - set_value_int64 (metadata, "nfo:height", video_stream->codec->height); + tracker_resource_set_int64 (metadata, "nfo:width", video_stream->codec->width); + tracker_resource_set_int64 (metadata, "nfo:height", video_stream->codec->height); } if (video_stream->avg_frame_rate.num > 0) { gdouble frame_rate = (gdouble) video_stream->avg_frame_rate.num / video_stream->avg_frame_rate.den; - set_value_double (metadata, "nfo:frameRate", frame_rate); + tracker_resource_set_double (metadata, "nfo:frameRate", frame_rate); } if (video_stream->duration > 0) { gint64 duration = av_rescale(video_stream->duration, video_stream->time_base.num, video_stream->time_base.den); - set_value_int64 (metadata, "nfo:duration", duration); + tracker_resource_set_int64 (metadata, "nfo:duration", duration); } if (video_stream->sample_aspect_ratio.num > 0) { gdouble aspect_ratio = (gdouble) video_stream->sample_aspect_ratio.num / video_stream->sample_aspect_ratio.den; - set_value_double (metadata, "nfo:aspectRatio", aspect_ratio); + tracker_resource_set_double (metadata, "nfo:aspectRatio", aspect_ratio); } if (video_stream->nb_frames > 0) { - set_value_int64 (metadata, "nfo:frameCount", video_stream->nb_frames); + tracker_resource_set_int64 (metadata, "nfo:frameCount", video_stream->nb_frames); } if ((tag = av_dict_get (format->metadata, "synopsis", NULL, 0))) { - set_value_string (metadata, "nmm:synopsis", tag->value); + tracker_resource_set_string (metadata, "nmm:synopsis", tag->value); } if ((tag = av_dict_get (format->metadata, "episode_sort", NULL, 0))) { - set_value_int64 (metadata, "nmm:episodeNumber", atoi(tag->value)); + tracker_resource_set_int64 (metadata, "nmm:episodeNumber", atoi(tag->value)); } if ((tag = av_dict_get (format->metadata, "season_number", NULL, 0))) { - set_value_int64 (metadata, "nmm:season", atoi(tag->value)); + tracker_resource_set_int64 (metadata, "nmm:season", atoi(tag->value)); } } else if (audio_stream) { - const char *album_title = NULL; - const char *album_artist = NULL; - gchar *album_artist_uri = NULL; - gchar *performer_uri = NULL; + TrackerResource *album_artist = NULL, *performer = NULL; + char *album_artist_name = NULL; + char *album_title = NULL; - tracker_sparql_builder_predicate (metadata, "a"); - tracker_sparql_builder_object (metadata, "nmm:MusicPiece"); - tracker_sparql_builder_object (metadata, "nfo:Audio"); + tracker_resource_add_uri (metadata, "rdf:type", "nmm:MusicPiece"); + tracker_resource_add_uri (metadata, "rdf:type", "nfo:Audio"); if (audio_stream->duration > 0) { gint64 duration = av_rescale(audio_stream->duration, audio_stream->time_base.num, audio_stream->time_base.den); - set_value_int64 (metadata, "nfo:duration", duration); + tracker_resource_set_int64 (metadata, "nfo:duration", duration); } if ((tag = av_dict_get (format->metadata, "track", NULL, 0))) { int track = atoi(tag->value); if (track > 0) { - set_value_int64 (metadata, "nmm:trackNumber", track); + tracker_resource_set_int64 (metadata, "nmm:trackNumber", track); } } @@ -260,73 +161,52 @@ tracker_extract_get_metadata (TrackerExtractInfo *info) } if (album_title && (tag = av_dict_get (format->metadata, "album_artist", NULL, 0))) { - album_artist_uri = create_artist (preupdate, graph, tag->value); - album_artist = tag->value; + album_artist_name = tag->value; + album_artist = tracker_extract_new_artist (album_artist_name); } if ((tag = av_dict_get (format->metadata, "artist", tag, 0))) { - performer_uri = create_artist (preupdate, graph, tag->value); + performer = tracker_extract_new_artist (tag->value); if (!album_artist) { - album_artist = tag->value; + album_artist_name = tag->value; + album_artist = performer; } } - if (!performer_uri && (tag = av_dict_get (format->metadata, "performer", tag, 0))) { - performer_uri = create_artist (preupdate, graph, tag->value); + if (!performer && (tag = av_dict_get (format->metadata, "performer", tag, 0))) { + performer = tracker_extract_new_artist (tag->value); if (!album_artist) { - album_artist = tag->value; + album_artist_name = tag->value; + album_artist = performer; } } - if (performer_uri) { - set_value_iri (metadata, "nmm:performer", performer_uri); - } else if (album_artist_uri) { - set_value_iri (metadata, "nmm:performer", album_artist_uri); + if (performer) { + tracker_resource_set_relation (metadata, "nmm:performer", performer); + } else if (album_artist) { + tracker_resource_set_relation (metadata, "nmm:performer", album_artist); } if ((tag = av_dict_get (format->metadata, "composer", tag, 0))) { - gchar *composer_uri = create_artist (preupdate, graph, tag->value); - set_value_iri (metadata, "nmm:composer", composer_uri); - g_free(composer_uri); + TrackerResource *composer = tracker_extract_new_artist (tag->value); + tracker_resource_set_relation (metadata, "nmm:composer", composer); + g_object_unref (composer); } - if (album_title) { - int disc = 1; - gchar *disc_uri; - gchar *album_uri = tracker_sparql_escape_uri_printf ("urn:album:%s", album_title); - - open_insert (preupdate, graph, album_uri, "nmm:MusicAlbum"); - set_value_string (preupdate, "nmm:albumTitle", album_title); - if (album_artist_uri) { - set_value_iri (preupdate, "nmm:albumArtist", album_artist_uri); - } else if (performer_uri) { - set_value_iri (preupdate, "nmm:albumArtist", performer_uri); - } - close_insert (preupdate, graph); - + int disc_number = 1; + TrackerResource *album_disc; if ((tag = av_dict_get (format->metadata, "disc", NULL, 0))) { - disc = atoi (tag->value); + disc_number = atoi (tag->value); } - disc_uri = tracker_sparql_escape_uri_printf ("urn:album-disc:%s:Disc%d", - album_title, - disc); - - delete_value (preupdate, disc_uri, "nmm:setNumber", "unknown"); - delete_value (preupdate, disc_uri, "nmm:albumDiscAlbum", "unknown"); + album_disc = tracker_extract_new_music_album_disc (album_title, album_artist, disc_number); - open_insert (preupdate, graph, disc_uri, "nmm:MusicAlbumDisc"); - set_value_int64 (preupdate, "nmm:setNumber", disc); - set_value_iri (preupdate, "nmm:albumDiscAlbum", album_uri); - close_insert (preupdate, graph); + tracker_resource_set_relation (metadata, "nmm:musicAlbumDisc", album_disc); + tracker_resource_set_relation (metadata, "nmm:musicAlbum", tracker_resource_get_first_relation (album_disc, "nmm:albumDiscAlbum")); - set_value_iri (metadata, "nmm:musicAlbumDisc", disc_uri); - set_value_iri (metadata, "nmm:musicAlbum", album_uri); - - g_free (disc_uri); - g_free (album_uri); + g_object_unref (album_disc); } #ifdef HAVE_LIBMEDIAART @@ -353,51 +233,55 @@ tracker_extract_get_metadata (TrackerExtractInfo *info) } #endif - g_free(performer_uri); + if (performer) + g_object_unref (performer); } if (format->bit_rate > 0) { - set_value_int64 (metadata, "nfo:averageBitrate", format->bit_rate); + tracker_resource_set_int64 (metadata, "nfo:averageBitrate", format->bit_rate); } if ((tag = av_dict_get (format->metadata, "comment", NULL, 0))) { - set_value_string (metadata, "nie:comment", tag->value); + tracker_resource_set_string (metadata, "nie:comment", tag->value); } if ((tag = av_dict_get (format->metadata, "copyright", NULL, 0))) { - set_value_string (metadata, "nie:copyright", tag->value); + tracker_resource_set_string (metadata, "nie:copyright", tag->value); } if ((tag = av_dict_get (format->metadata, "creation_time", NULL, 0))) { gchar *content_created = tracker_date_guess (tag->value); if (content_created) { - set_value_string (metadata, "nie:contentCreated", content_created); + tracker_resource_set_string (metadata, "nie:contentCreated", content_created); g_free (content_created); } } if ((tag = av_dict_get (format->metadata, "description", NULL, 0))) { - set_value_string (metadata, "nie:description", tag->value); + tracker_resource_set_string (metadata, "nie:description", tag->value); } if ((tag = av_dict_get (format->metadata, "genre", NULL, 0))) { - set_value_string (metadata, "nfo:genre", tag->value); + tracker_resource_set_string (metadata, "nfo:genre", tag->value); } if ((tag = av_dict_get (format->metadata, "language", NULL, 0))) { - set_value_string (metadata, "nfo:language", tag->value); + tracker_resource_set_string (metadata, "nfo:language", tag->value); } if ((tag = av_dict_get (format->metadata, "title", NULL, 0))) { title = tag->value; } - tracker_guarantee_title_from_file (metadata, "nie:title", title, uri, NULL); + tracker_guarantee_resource_title_from_file (metadata, "nie:title", title, uri, NULL); g_free (uri); avformat_free_context (format); + tracker_extract_info_set_resource (info, metadata); + g_object_unref (metadata); + return TRUE; } |