[tracker] tracker-extract-gstreamer: Use TOC as "cue sheet" as a last resort



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]