[easytag/wip/musicbrainz-support] Added support for one level synchronous searching of Artist and Album



commit 13fdaef669ec6d16fedad72ea8a03539e685dbff
Author: Abhinav <abhijangda hotmail com>
Date:   Fri May 16 20:07:30 2014 +0530

    Added support for one level synchronous searching of Artist and Album

 data/musicbrainz_dialog.ui |   21 +++--
 src/mbentityview.c         |   11 +-
 src/mbentityview.h         |    2 +-
 src/musicbrainz_dialog.c   |  243 ++++++++++++++++++++++++++++++++++++++++++--
 4 files changed, 253 insertions(+), 24 deletions(-)
---
diff --git a/data/musicbrainz_dialog.ui b/data/musicbrainz_dialog.ui
index 92126dd..bcc49cd 100755
--- a/data/musicbrainz_dialog.ui
+++ b/data/musicbrainz_dialog.ui
@@ -6,6 +6,11 @@
     <property name="can_focus">False</property>
     <property name="stock">gtk-find</property>
   </object>
+  <object class="GtkImage" id="image13">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-stop</property>
+  </object>
   <object class="GtkImage" id="image10">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
@@ -21,11 +26,6 @@
     <property name="can_focus">False</property>
     <property name="stock">gtk-find</property>
   </object>
-  <object class="GtkImage" id="image13">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="stock">gtk-stop</property>
-  </object>
   <object class="GtkImage" id="image14">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
@@ -239,9 +239,15 @@
                               <object class="GtkComboBoxText" id="cbManualSearch">
                                 <property name="width_request">240</property>
                                 <property name="visible">True</property>
-                                <property name="can_focus">False</property>
+                                <property name="can_focus">True</property>
+                                <property name="has_entry">True</property>
                                 <property name="entry_text_column">0</property>
                                 <property name="id_column">1</property>
+                                <child internal-child="entry">
+                                  <object class="GtkEntry" id="combobox-entry">
+                                    <property name="can_focus">True</property>
+                                  </object>
+                                </child>
                               </object>
                               <packing>
                                 <property name="expand">False</property>
@@ -263,7 +269,7 @@
                               </packing>
                             </child>
                             <child>
-                              <object class="GtkComboBox" id="cbManualSearchIn">
+                              <object class="GtkComboBoxText" id="cbManualSearchIn">
                                 <property name="width_request">120</property>
                                 <property name="height_request">26</property>
                                 <property name="visible">True</property>
@@ -319,6 +325,7 @@
                   <object class="GtkLabel" id="label13">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
+                    <property name="margin_right">1</property>
                     <property name="label" translatable="yes">Manual Search</property>
                   </object>
                   <packing>
diff --git a/src/mbentityview.c b/src/mbentityview.c
index 22b9dd2..fa6a4ad 100644
--- a/src/mbentityview.c
+++ b/src/mbentityview.c
@@ -190,12 +190,12 @@ add_iter_to_list_store (GtkListStore *list_store, GNode *node)
                 break;
 
             case MB_ENTITY_TYPE_ALBUM:
-                mb5_releasegroup_get_title ((Mb5ReleaseGroup)entity, name, sizeof (name));
+                mb5_release_get_title ((Mb5Release)entity, name, sizeof (name));
                 gtk_list_store_append (list_store, &iter);
                 gtk_list_store_set (list_store, &iter, 
-                                     MB_ALBUM_COLUMNS_NAME, name, -1);
+                                    MB_ALBUM_COLUMNS_NAME, name, -1);
 
-                artist_credit = mb5_releasegroup_get_artistcredit ((Mb5ReleaseGroup)entity);
+                artist_credit = mb5_release_get_artistcredit ((Mb5Release)entity);
                 name_list = mb5_artistcredit_get_namecreditlist (artist_credit);
                 gstring = g_string_new ("");
 
@@ -218,11 +218,12 @@ add_iter_to_list_store (GtkListStore *list_store, GNode *node)
                                     MB_ALBUM_COLUMNS_ARTIST, gstring->str, -1);
                 g_string_free (gstring, TRUE);
 
-                release_list = mb5_releasegroup_get_releaselist ((Mb5ReleaseGroup)entity);
+                //TODO: Correct below code
+                /*release_list = mb5_release_get_releaselist ((Mb5Release)entity);
                 gtk_list_store_set (list_store, &iter,
                                     MB_ALBUM_COLUMNS_RELEASES,
                                     mb5_release_list_get_count (release_list), -1);
-                mb5_release_list_delete (release_list);
+                mb5_release_list_delete (release_list);*/
                 break;
 
             case MB_ENTITY_TYPE_TRACK:
diff --git a/src/mbentityview.h b/src/mbentityview.h
index eeb08d5..05e7b9d 100644
--- a/src/mbentityview.h
+++ b/src/mbentityview.h
@@ -86,7 +86,7 @@ enum MB_ALBUM_COLUMNS
 {
     MB_ALBUM_COLUMNS_NAME,
     MB_ALBUM_COLUMNS_ARTIST,
-    MB_ALBUM_COLUMNS_RELEASES,
+    MB_ALBUM_COLUMNS_TRACKS,
     MB_ALBUM_COLUMNS_TYPE,
     MB_ALBUM_COLUMNS_N
 };
diff --git a/src/musicbrainz_dialog.c b/src/musicbrainz_dialog.c
index 6548360..a1a0895 100644
--- a/src/musicbrainz_dialog.c
+++ b/src/musicbrainz_dialog.c
@@ -25,20 +25,14 @@
 #include <glib/gi18n.h>
 
 #include "gtk2_compat.h"
-#include "cddb.h"
 #include "easytag.h"
-#include "et_core.h"
-#include "browser.h"
-#include "scan_dialog.h"
 #include "log.h"
-#include "misc.h"
-#include "setting.h"
-#include "id3_tag.h"
-#include "setting.h"
-#include "charset.h"
 #include "musicbrainz_dialog.h"
 #include "mbentityview.h"
 
+#define SEARCH_LIMIT_STR "5"
+#define SEARCH_LIMIT_INT 5
+ 
 /***************
  * Declaration *
  ***************/
@@ -46,11 +40,226 @@
 static GtkBuilder *builder;
 static GtkWidget *mbDialog;
 static GtkWidget *entityView;
+static GNode *mb_tree_root;
+
+/**************
+ * Prototypes *
+ **************/
+
+static void
+et_musicbrainz_search_in_entity (gchar *string, enum MB_ENTITY_TYPE child_type,
+                                 enum MB_ENTITY_TYPE parent_type,
+                                 gchar *parent_mbid, GNode *root);
+static void
+et_musicbrainz_search (gchar *string, enum MB_ENTITY_TYPE type, GNode *root);
 
 /*************
  * Functions *
  *************/
 
+static void
+et_musicbrainz_search_in_entity (gchar *string, enum MB_ENTITY_TYPE child_type,
+                                 enum MB_ENTITY_TYPE parent_type,
+                                 gchar *parent_mbid, GNode *root)
+{
+    Mb5Query query;
+    Mb5Metadata metadata;
+    char error_message[256];
+    tQueryResult result;
+    //int httpcode;
+    char *param_values[1];
+    char *param_names[1];
+
+    param_names [0] = "inc";
+    query = mb5_query_new ("easytag", NULL, 0);
+
+    if (child_type == MB_ENTITY_TYPE_ALBUM &&
+        parent_type == MB_ENTITY_TYPE_ARTIST)
+    {
+        param_values [0] = "releases";
+        metadata = mb5_query_query (query, "artist", parent_mbid, "", 1, param_names,
+                                    param_values);
+        result = mb5_query_get_lastresult (query);
+        //httpcode = mb5_query_get_lasthttpcode (query);
+        if (result == eQuery_Success)
+        {
+            if (metadata)
+            {
+                int i;
+                Mb5ReleaseList list;
+                Mb5Artist artist;
+                artist = mb5_metadata_get_artist (metadata);
+                list = mb5_artist_get_releaselist (artist);
+
+                for (i = 0; i < mb5_release_list_size (list); i++)
+                {
+                    Mb5Release release;
+                    release = mb5_artist_list_item (list, i);
+                    if (release)
+                    {
+                        GNode *node;
+                        EtMbEntity *entity;
+                        entity = g_malloc (sizeof (EtMbEntity));
+                        entity->entity = release;
+                        entity->type = MB_ENTITY_TYPE_ALBUM;
+                        node = g_node_new (entity);
+                        g_node_append (root, node);
+                    }
+                }
+            }
+
+            g_free (param_values [0]);
+        }
+        else
+        {
+            goto err;
+        }
+    }
+    else if (child_type == MB_ENTITY_TYPE_TRACK &&
+             parent_type == MB_ENTITY_TYPE_ALBUM)
+    {
+        
+    }
+
+    return;
+    err:
+    mb5_query_get_lasterrormessage (query, error_message,
+                                    sizeof(error_message));
+    printf ("Error searching MusicBrainz Database: '%s'\n", error_message);
+    mb5_query_delete (query);
+}
+
+static void
+et_musicbrainz_search (gchar *string, enum MB_ENTITY_TYPE type, GNode *root)
+{
+    /* TODO: to free metadata, first use mb5_<entity>_copy to copy that entity */
+    Mb5Query Query;
+    Mb5Metadata Metadata;
+    char ErrorMessage[256];
+    tQueryResult Result;
+    //int HTTPCode;
+    char *ParamValues[2];
+    char *ParamNames[2];
+
+    ParamNames [0] = "query";
+    ParamNames [1] = "limit";
+    ParamValues [1] = SEARCH_LIMIT_STR;
+    Query = mb5_query_new ("easytag", NULL, 0);
+
+    if (type == MB_ENTITY_TYPE_ARTIST)
+    {
+        ParamValues [0] = g_strconcat ("artist:", string, NULL);
+        Metadata = mb5_query_query (Query, "artist", "", "", 2, ParamNames,
+                                    ParamValues);
+        Result = mb5_query_get_lastresult (Query);
+        //HTTPCode = mb5_query_get_lasthttpcode (Query);
+        if (Result == eQuery_Success)
+        {
+            if (Metadata)
+            {
+                int i;
+                Mb5ArtistList ArtistList;
+                ArtistList = mb5_metadata_get_artistlist (Metadata);
+
+                for (i = 0; i < mb5_artist_list_size (ArtistList); i++)
+                {
+                    Mb5Artist Artist;
+                    Artist = mb5_artist_list_item (ArtistList, i);
+                    if (Artist)
+                    {
+                        GNode *node;
+                        EtMbEntity *entity;
+                        entity = g_malloc (sizeof (EtMbEntity));
+                        entity->entity = Artist;
+                        entity->type = MB_ENTITY_TYPE_ARTIST;
+                        node = g_node_new (entity);
+                        g_node_append (root, node);
+                    }
+                }
+            }
+
+            g_free (ParamValues [0]);
+        }
+        else
+        {
+            goto err;
+        }
+    }
+    else if (type == MB_ENTITY_TYPE_ALBUM)
+    {
+        ParamValues [0] = g_strconcat ("release:", string, NULL);
+        Metadata = mb5_query_query (Query, "release", "", "", 2, ParamNames,
+                                    ParamValues);
+        Result = mb5_query_get_lastresult (Query);
+        //HTTPCode = mb5_query_get_lasthttpcode (Query);
+        if (Result == eQuery_Success)
+        {
+            if (Metadata)
+            {
+                int i;
+                Mb5ReleaseList list;
+                list = mb5_metadata_get_releaselist (Metadata);
+
+                for (i = 0; i < mb5_release_list_size (list); i++)
+                {
+                    Mb5Release release;
+                    release = mb5_artist_list_item (list, i);
+                    if (release)
+                    {
+                        GNode *node;
+                        EtMbEntity *entity;
+                        entity = g_malloc (sizeof (EtMbEntity));
+                        entity->entity = release;
+                        entity->type = MB_ENTITY_TYPE_ALBUM;
+                        node = g_node_new (entity);
+                        g_node_append (root, node);
+                    }
+                }
+            }
+
+            g_free (ParamValues [0]);
+        }
+        else
+        {
+            goto err;
+        }
+    }
+    else if (type == MB_ENTITY_TYPE_TRACK)
+    {
+    }
+
+    return;
+    err:
+    mb5_query_get_lasterrormessage (Query, ErrorMessage,
+                                    sizeof(ErrorMessage));
+    printf ("Error searching MusicBrainz Database: '%s'\n", ErrorMessage);
+    mb5_query_delete (Query);
+}
+
+static void
+btn_manual_find_clicked (GtkWidget *btn, gpointer user_data)
+{
+    GtkWidget *cb_manual_search;
+    GtkWidget *cb_manual_search_in;
+    int type;
+
+    cb_manual_search = GTK_WIDGET (gtk_builder_get_object (builder,
+                                                           "cbManualSearch"));
+    cb_manual_search_in = GTK_WIDGET (gtk_builder_get_object (builder,
+                                                              "cbManualSearchIn"));
+    type = gtk_combo_box_get_active (GTK_COMBO_BOX (cb_manual_search_in));
+
+    if (g_node_first_child (mb_tree_root))
+    {
+        /* TODO: Clear the tree */
+    }
+
+    et_musicbrainz_search (gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (cb_manual_search)),
+                           type, mb_tree_root);
+    et_mb_entity_view_set_tree_root (ET_MB_ENTITY_VIEW (entityView),
+                                     mb_tree_root);
+}
+
 /*
  * et_open_musicbrainz_dialog:
  *
@@ -59,6 +268,9 @@ static GtkWidget *entityView;
 void
 et_open_musicbrainz_dialog ()
 {
+    GtkWidget *cb_manual_search_in;
+
+    mb_tree_root = g_node_new (NULL);
     entityView = et_mb_entity_view_new ();
     builder = gtk_builder_new ();
     /* TODO: Check the error. */
@@ -67,14 +279,23 @@ et_open_musicbrainz_dialog ()
                                    NULL);
 
     mbDialog = GTK_WIDGET (gtk_builder_get_object (builder, "mbDialog"));
-
     gtk_box_pack_start (GTK_BOX (gtk_builder_get_object (builder, "centralBox")),
                         entityView, TRUE, TRUE, 2);
     /* FIXME: This should not be needed. */
     gtk_box_reorder_child (GTK_BOX (gtk_builder_get_object (builder, "centralBox")),
                            entityView, 0);
+    g_signal_connect (gtk_builder_get_object (builder, "btnManualFind"),
+                      "clicked", G_CALLBACK (btn_manual_find_clicked),
+                      NULL);
+    cb_manual_search_in = GTK_WIDGET (gtk_builder_get_object (builder,
+                                                              "cbManualSearchIn"));
+
+    gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (cb_manual_search_in), "Artist");
+    gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (cb_manual_search_in), "Album");
+    gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (cb_manual_search_in), "Track");
+
     gtk_widget_show_all (mbDialog);
     gtk_dialog_run (GTK_DIALOG (mbDialog));
     gtk_widget_destroy (mbDialog);
     g_object_unref (G_OBJECT (builder));
-}
+}
\ No newline at end of file


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