[tracker] tracker-extract-gstreamer: Use TOC as "cue sheet" as a last resort
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker] tracker-extract-gstreamer: Use TOC as "cue sheet" as a last resort
- Date: Sat, 7 May 2016 17:07:08 +0000 (UTC)
commit 99ab02a78125e5a496e500e3048abcaa8d977887
Author: Carlos Garnacho <carlosg gnome org>
Date: Sat May 7 16:41:41 2016 +0200
tracker-extract-gstreamer: Use TOC as "cue sheet" as a last resort
The CUESHEET block in flac files is only meant to allow applications
to figure out CDDB references and whatnot, so it will basically contain
track durations and ISRCs. Other information like title/performer/genre
is not meant to be stored here:
https://xiph.org/flac/faq.html#general__no_cuesheet_tags
The other methods supported here could be considered non-standard,
but will be definitely more complete than this CUESHEET block, so
the lookup order is:
- Embedded cue file as a "CUESHEET=" vorbis comment
- External cue file
- This CUESHEET block
src/tracker-extract/tracker-cue-sheet.c | 22 +++++++--
src/tracker-extract/tracker-cue-sheet.h | 6 +++
src/tracker-extract/tracker-extract-gstreamer.c | 52 +++++++++++++++++++++++
3 files changed, 75 insertions(+), 5 deletions(-)
---
diff --git a/src/tracker-extract/tracker-cue-sheet.c b/src/tracker-extract/tracker-cue-sheet.c
index 435f6cb..544de29 100644
--- a/src/tracker-extract/tracker-cue-sheet.c
+++ b/src/tracker-extract/tracker-cue-sheet.c
@@ -39,9 +39,7 @@
#include "tracker-cue-sheet.h"
-#if defined(HAVE_LIBCUE)
-
-static TrackerToc *
+TrackerToc *
tracker_toc_new (void)
{
TrackerToc *toc;
@@ -53,8 +51,6 @@ tracker_toc_new (void)
return toc;
}
-#endif /* HAVE_LIBCUE */
-
void
tracker_toc_free (TrackerToc *toc)
{
@@ -77,6 +73,22 @@ tracker_toc_free (TrackerToc *toc)
g_slice_free (TrackerToc, toc);
}
+void
+tracker_toc_add_entry (TrackerToc *toc,
+ GstTagList *tags,
+ gdouble start,
+ gdouble duration)
+{
+ TrackerTocEntry *toc_entry;
+
+ toc_entry = g_slice_new (TrackerTocEntry);
+ toc_entry->tag_list = gst_tag_list_ref (tags);
+ toc_entry->start = start;
+ toc_entry->duration = duration;
+
+ toc->entry_list = g_list_append (toc->entry_list, toc_entry);
+}
+
#if defined(HAVE_LIBCUE)
static void
diff --git a/src/tracker-extract/tracker-cue-sheet.h b/src/tracker-extract/tracker-cue-sheet.h
index 6486120..efe0b46 100644
--- a/src/tracker-extract/tracker-cue-sheet.h
+++ b/src/tracker-extract/tracker-cue-sheet.h
@@ -41,6 +41,12 @@ typedef struct {
} TrackerToc;
void tracker_toc_free (TrackerToc *toc);
+TrackerToc *tracker_toc_new (void);
+
+void tracker_toc_add_entry (TrackerToc *toc,
+ GstTagList *tags,
+ gdouble start,
+ gdouble duration);
TrackerToc *tracker_cue_sheet_parse (const gchar *cue_sheet);
TrackerToc *tracker_cue_sheet_parse_uri (const gchar *uri);
diff --git a/src/tracker-extract/tracker-extract-gstreamer.c b/src/tracker-extract/tracker-extract-gstreamer.c
index a419b54..bc5ee62 100644
--- a/src/tracker-extract/tracker-extract-gstreamer.c
+++ b/src/tracker-extract/tracker-extract-gstreamer.c
@@ -101,6 +101,7 @@ typedef enum {
typedef struct {
ExtractMime mime;
GstTagList *tagcache;
+ GstToc *gst_toc;
TrackerToc *toc;
gboolean is_content_encrypted;
@@ -455,6 +456,46 @@ get_embedded_cue_sheet_data (GstTagList *tag_list)
return NULL;
}
+static TrackerToc *
+translate_discoverer_toc (GstToc *gst_toc)
+{
+ const GList *entries, *l;
+ TrackerToc *toc;
+ gint i = 0;
+
+ entries = gst_toc_get_entries (gst_toc);
+ if (!entries)
+ return NULL;
+
+ toc = tracker_toc_new ();
+
+ for (l = entries; l; l = l->next) {
+ GstTocEntry *entry = l->data;
+ GstTagList *tags, *copy = NULL;
+ gint64 start, stop;
+
+ tags = gst_toc_entry_get_tags (entry);
+
+ if (tags) {
+ copy = gst_tag_list_copy (tags);
+
+ if (gst_tag_list_get_tag_size (copy, GST_TAG_TRACK_NUMBER) == 0) {
+ gst_tag_list_add (copy, GST_TAG_MERGE_REPLACE,
+ GST_TAG_TRACK_NUMBER, i + 1,
+ NULL);
+ }
+ }
+
+ gst_toc_entry_get_start_stop_times (entry, &start, &stop);
+ tracker_toc_add_entry (toc, copy, (gdouble) start / GST_SECOND,
+ (gdouble) (stop - start) / GST_SECOND);
+ gst_tag_list_unref (copy);
+ i++;
+ }
+
+ return toc;
+}
+
#ifdef HAVE_LIBMEDIAART
static gboolean
@@ -1546,6 +1587,10 @@ discoverer_init_and_run (MetadataExtractor *extractor,
}
#endif
+ extractor->gst_toc = gst_discoverer_info_get_toc (info);
+ if (extractor->gst_toc)
+ gst_toc_ref (extractor->gst_toc);
+
extractor->duration = gst_discoverer_info_get_duration (info) / GST_SECOND;
/* Retrieve global tags */
@@ -1661,6 +1706,10 @@ tracker_extract_gstreamer (const gchar *uri,
extractor->toc = tracker_cue_sheet_parse_uri (uri);
}
+ if (extractor->toc == NULL) {
+ extractor->toc = translate_discoverer_toc (extractor->gst_toc);
+ }
+
extract_metadata (extractor,
uri,
preupdate,
@@ -1724,6 +1773,9 @@ tracker_extract_gstreamer (const gchar *uri,
tracker_toc_free (extractor->toc);
+ if (extractor->gst_toc)
+ gst_toc_unref (extractor->gst_toc);
+
g_slist_foreach (extractor->artist_list, (GFunc)g_free, NULL);
g_slist_free (extractor->artist_list);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]