[easytag/wip/musicbrainz-support] Added support for Tracks in Manual Search



commit 9a7258d6b8876152e1aed4e6587e3d306be8d275
Author: Abhinav <abhijangda hotmail com>
Date:   Tue May 20 19:43:31 2014 +0530

    Added support for Tracks in Manual Search

 src/mb_search.c    |  118 ++++++++++++++++++++++++++++++++++++++++++++++++++--
 src/mbentityview.c |   69 +++++++++++++++++++++++++++----
 src/mbentityview.h |    4 +-
 3 files changed, 177 insertions(+), 14 deletions(-)
---
diff --git a/src/mb_search.c b/src/mb_search.c
index f40ac73..40ec92d 100644
--- a/src/mb_search.c
+++ b/src/mb_search.c
@@ -63,8 +63,8 @@ et_musicbrainz_search_in_entity (enum MB_ENTITY_TYPE child_type,
         parent_type == MB_ENTITY_TYPE_ARTIST)
     {
         param_values [0] = "releases";
-        metadata = mb5_query_query (query, "artist", parent_mbid, "", 1, param_names,
-                                    param_values);
+        metadata = mb5_query_query (query, "artist", parent_mbid, "", 1,
+                                    param_names, param_values);
         result = mb5_query_get_lastresult (query);
 
         if (result == eQuery_Success)
@@ -115,7 +115,68 @@ et_musicbrainz_search_in_entity (enum MB_ENTITY_TYPE child_type,
     else if (child_type == MB_ENTITY_TYPE_TRACK &&
              parent_type == MB_ENTITY_TYPE_ALBUM)
     {
-        
+        param_values [0] = "recordings";
+        metadata = mb5_query_query (query, "release", parent_mbid, "", 1,
+                                    param_names, param_values);
+        result = mb5_query_get_lastresult (query);
+
+        if (result == eQuery_Success)
+        {
+            if (metadata)
+            {
+                int i;
+                Mb5MediumList list;
+                Mb5Release release;
+                release = mb5_metadata_get_release (metadata);
+                list = mb5_release_get_mediumlist (release);
+                param_values[0] = "releases artists";
+
+                for (i = 0; i < mb5_medium_list_size (list); i++)
+                {
+                    Mb5Medium medium;
+                    medium = mb5_medium_list_item (list, i);
+
+                    if (medium)
+                    {
+                        Mb5Metadata metadata_recording;
+                        gchar recording_mbid [NAME_MAX_SIZE];
+                        GNode *node;
+                        EtMbEntity *entity;
+                        Mb5TrackList track_list;
+                        int j;
+
+                        track_list = mb5_medium_get_tracklist (medium);
+
+                        for (j = 0; j < mb5_track_list_size (track_list); j++)
+                        {
+                            Mb5Recording recording;
+
+                            recording = mb5_track_get_recording (mb5_track_list_item (track_list, j));
+                            mb5_recording_get_id (recording,
+                                                  recording_mbid,
+                                                  sizeof (recording_mbid));
+                            metadata_recording = mb5_query_query (query, "recording",
+                                                                  recording_mbid, "",
+                                                                  1, param_names,
+                                                                  param_values);
+                            entity = g_malloc (sizeof (EtMbEntity));
+                            entity->entity = mb5_recording_clone (mb5_metadata_get_recording 
(metadata_recording));
+                            entity->type = MB_ENTITY_TYPE_TRACK;
+                            entity->is_red_line = FALSE;
+                            node = g_node_new (entity);
+                            g_node_append (root, node);
+                            mb5_metadata_delete (metadata_recording);
+                        }
+                    }
+                }
+            }
+
+            mb5_metadata_delete (metadata);
+        }
+        else
+        {
+            goto err;
+        }
     }
 
     mb5_query_delete (query);
@@ -250,7 +311,7 @@ et_musicbrainz_search (gchar *string, enum MB_ENTITY_TYPE type, GNode *root,
                 Mb5ReleaseList list;
                 list = mb5_metadata_get_releaselist (metadata);
                 param_names [0] = "inc";
-                param_values [0] = "artists";
+                param_values [0] = "artists release-groups";
 
                 for (i = 0; i < mb5_release_list_size (list); i++)
                 {
@@ -291,6 +352,55 @@ et_musicbrainz_search (gchar *string, enum MB_ENTITY_TYPE type, GNode *root,
 
     else if (type == MB_ENTITY_TYPE_TRACK)
     {
+        param_values [0] = g_strconcat ("recordings:", string, NULL);
+        metadata = mb5_query_query (query, "recording", "", "", 2,
+                                    param_names, param_values);
+        result = mb5_query_get_lastresult (query);
+        g_free (param_values [0]);
+
+        if (result == eQuery_Success)
+        {
+            if (metadata)
+            {
+                int i;
+                Mb5RecordingList list;
+
+                list = mb5_metadata_get_recordinglist (metadata);
+                param_names [0] = "inc";
+                param_values[0] = "releases artists";
+
+                for (i = 0; i < mb5_recording_list_size (list); i++)
+                {
+                    Mb5Recording recording;
+                    Mb5Metadata metadata_recording;
+                    gchar recording_mbid [NAME_MAX_SIZE];
+                    GNode *node;
+                    EtMbEntity *entity;
+
+                    recording = mb5_recording_list_item (list, i);
+                    mb5_recording_get_id (recording,
+                                          recording_mbid,
+                                          sizeof (recording_mbid));
+                    metadata_recording = mb5_query_query (query, "recording",
+                                                          recording_mbid, "",
+                                                          1, param_names,
+                                                          param_values);
+                    entity = g_malloc (sizeof (EtMbEntity));
+                    entity->entity = mb5_recording_clone (mb5_metadata_get_recording (metadata_recording));
+                    entity->type = MB_ENTITY_TYPE_TRACK;
+                    entity->is_red_line = FALSE;
+                    node = g_node_new (entity);
+                    g_node_append (root, node);
+                    mb5_metadata_delete (metadata_recording);
+                }
+            }
+
+            mb5_metadata_delete (metadata);
+        }
+        else
+        {
+            goto err;
+        }
     }
 
     mb5_query_delete (query);
diff --git a/src/mbentityview.c b/src/mbentityview.c
index b3df048..74f0ff3 100644
--- a/src/mbentityview.c
+++ b/src/mbentityview.c
@@ -39,7 +39,7 @@
 char *columns [MB_ENTITY_TYPE_COUNT][8] = {
     {"Name", "Gender", "Type"},
     {"Name", "Artist", "Tracks", "Type"},
-    {"Name", "Country", "Album", "Date", "Time", "Number"},
+    {"Name", "Album", "Artist", "Time", "Number"},
     };
 
 static GSimpleAsyncResult *async_result;
@@ -176,7 +176,10 @@ add_iter_to_list_store (GtkListStore *list_store, GNode *node)
     Mb5ArtistCredit artist_credit;
     Mb5NameCreditList name_list;
     Mb5ReleaseGroup release_group;
+    Mb5ReleaseList release_list;
     int i;
+    int minutes;
+    int seconds;
     GString *gstring;
     GtkTreeIter iter;
     gchar name [NAME_MAX_SIZE];
@@ -266,18 +269,66 @@ add_iter_to_list_store (GtkListStore *list_store, GNode *node)
                 break;
 
             case MB_ENTITY_TYPE_TRACK:
-                mb5_recording_get_id ((Mb5Recording)entity, name, sizeof (name));
+                mb5_recording_get_title ((Mb5Recording)entity, name, sizeof (name));
                 gtk_list_store_append (list_store, &iter);
                 gtk_list_store_set (list_store, &iter, 
                                     MB_TRACK_COLUMNS_NAME, name, -1);
 
                 /* TODO: Get country and number */
-                gtk_list_store_set (list_store, &iter,
-                                    MB_TRACK_COLUMNS_COUNTRY, name, -1);
+                /*gtk_list_store_set (list_store, &iter,
+                                    MB_TRACK_COLUMNS_COUNTRY, name, -1);*/
+                artist_credit = mb5_recording_get_artistcredit ((Mb5Release)entity);
+                if (artist_credit)
+                {
+                    name_list = mb5_artistcredit_get_namecreditlist (artist_credit);
+                    gstring = g_string_new ("");
+
+                    for (i = 0; i < mb5_namecredit_list_size (name_list); i++)
+                    {
+                        Mb5NameCredit name_credit;
+                        Mb5Artist name_credit_artist;
+                        int size;
+                        name_credit = mb5_namecredit_list_item (name_list, i);
+                        name_credit_artist = mb5_namecredit_get_artist (name_credit);
+                        size = mb5_artist_get_name (name_credit_artist, name, sizeof (name));
+                        g_string_append_len (gstring, name, size);
+                        g_string_append_c (gstring, ' ');
+                    }
+                    gtk_list_store_set (list_store, &iter,
+                                        MB_TRACK_COLUMNS_ARTIST,
+                                        gstring->str, -1);
+                    g_string_free (gstring, TRUE);
+                }
+
+                release_list = mb5_recording_get_releaselist ((Mb5Recording)entity);
+                if (release_list)
+                {
+                    gstring = g_string_new ("");
+                    for (i = 0; i < mb5_release_list_size (release_list); i++)
+                    {
+                        Mb5Release release;
+                        int size;
+
+                        release = mb5_release_list_item (release_list, i);
+                        size = mb5_release_get_title (release, name, sizeof (name));
+                        g_string_append_len (gstring, name, size);
+                        g_string_append_c (gstring, ' ');
+                    }
 
+                    gtk_list_store_set (list_store, &iter,
+                                        MB_TRACK_COLUMNS_ALBUM,
+                                        gstring->str, -1);
+                    g_string_free (gstring, TRUE);
+                }
+
+                minutes = mb5_recording_get_length ((Mb5Recording)entity)/60000;
+                seconds = mb5_recording_get_length ((Mb5Recording)entity)%60000;
+                i = g_snprintf (name, NAME_MAX_SIZE, "%d:%d", minutes,
+                                seconds/1000);
+                name [i] = '\0';
                 gtk_list_store_set (list_store, &iter,
                                     MB_TRACK_COLUMNS_TIME,
-                                    mb5_recording_get_length ((Mb5Recording)entity), -1);
+                                    name, -1);
                 break;
 
             case MB_ENTITY_TYPE_COUNT:
@@ -571,13 +622,15 @@ et_mb_entity_view_init (EtMbEntityView *entity_view)
 {
     EtMbEntityViewPrivate *priv = ET_MB_ENTITY_VIEW_GET_PRIVATE (entity_view);
 
-    gtk_orientable_set_orientation (GTK_ORIENTABLE (entity_view), GTK_ORIENTATION_VERTICAL);
+    gtk_orientable_set_orientation (GTK_ORIENTABLE (entity_view),
+                                    GTK_ORIENTATION_VERTICAL);
 
-    /* Adding child widgets */    
+    /* Adding child widgets */
     priv->bread_crumb_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
     priv->tree_view = gtk_tree_view_new ();
     priv->scrolled_window = gtk_scrolled_window_new (NULL, NULL);
-    gtk_container_add (GTK_CONTAINER (priv->scrolled_window), priv->tree_view);
+    gtk_container_add (GTK_CONTAINER (priv->scrolled_window),
+                       priv->tree_view);
     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->scrolled_window),
                                     GTK_POLICY_ALWAYS, GTK_POLICY_ALWAYS);
     gtk_box_pack_start (GTK_BOX (entity_view), priv->bread_crumb_box,
diff --git a/src/mbentityview.h b/src/mbentityview.h
index a238781..46ba3fc 100644
--- a/src/mbentityview.h
+++ b/src/mbentityview.h
@@ -85,9 +85,9 @@ enum MB_ALBUM_COLUMNS
 enum MB_TRACK_COLUMNS
 {
     MB_TRACK_COLUMNS_NAME,
-    MB_TRACK_COLUMNS_COUNTRY,
+    MB_TRACK_COLUMNS_ALBUM,
+    MB_TRACK_COLUMNS_ARTIST,
     MB_TRACK_COLUMNS_TIME,
-    MB_TRACK_COLUMNS_NUMBER,
     MB_TRACK_COLUMNS_N
 };
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]