aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Daniel <random.mister@gmail.com>2011-04-23 16:17:21 +0100
committerGravatar Alex Bennee <alex@bennee.com>2011-04-23 16:19:57 +0100
commit5e5aacfc7174aba9adfbd32238a5756b717e3490 (patch)
tree6304b36ac662e32e7b5b469945a6babae80b76a0
parent55e2c3d68d3ba31190c2484db496e09756852ee6 (diff)
Add "Album Artist" field to the list of potential fields to edit
Quoth Daniel (Random Mister): "I just found an extended patch which also includes support for the album-artist tag in the fill tags dialog. It is an update of the other, so if you only add this one to the git tree it should work. I've been using it for over half a year without bugs, so I think it can be merged into the Git tree." Written-By: Daniel <random.mister@gmail.com>
-rw-r--r--src/bar.c4
-rw-r--r--src/bar.h2
-rw-r--r--src/browser.c57
-rw-r--r--src/browser.h1
-rw-r--r--src/easytag.c121
-rw-r--r--src/easytag.h3
-rw-r--r--src/et_core.c99
-rw-r--r--src/et_core.h5
-rw-r--r--src/id3_tag.c20
-rw-r--r--src/id3v24_tag.c11
-rw-r--r--src/misc.c62
-rw-r--r--src/scan.c40
-rw-r--r--src/setting.c2
-rw-r--r--src/setting.h1
-rw-r--r--src/ui_manager.h6
15 files changed, 353 insertions, 81 deletions
diff --git a/src/bar.c b/src/bar.c
index ab6facc..e0cb1d0 100644
--- a/src/bar.c
+++ b/src/bar.c
@@ -83,6 +83,8 @@ void Menu_Sort_Action (GtkAction *item, gpointer data)
QCASE_DATA(AM_SORT_DESCENDING_TITLE, ET_Sort_Displayed_File_List_And_Update_UI, SORTING_BY_DESCENDING_TITLE);
QCASE_DATA(AM_SORT_ASCENDING_ARTIST, ET_Sort_Displayed_File_List_And_Update_UI, SORTING_BY_ASCENDING_ARTIST);
QCASE_DATA(AM_SORT_DESCENDING_ARTIST, ET_Sort_Displayed_File_List_And_Update_UI, SORTING_BY_DESCENDING_ARTIST);
+ QCASE_DATA(AM_SORT_ASCENDING_ALBUM_ARTIST, ET_Sort_Displayed_File_List_And_Update_UI, SORTING_BY_ASCENDING_ALBUM_ARTIST);
+ QCASE_DATA(AM_SORT_DESCENDING_ALBUM_ARTIST, ET_Sort_Displayed_File_List_And_Update_UI, SORTING_BY_DESCENDING_ALBUM_ARTIST);
QCASE_DATA(AM_SORT_ASCENDING_ALBUM, ET_Sort_Displayed_File_List_And_Update_UI, SORTING_BY_ASCENDING_ALBUM);
QCASE_DATA(AM_SORT_DESCENDING_ALBUM, ET_Sort_Displayed_File_List_And_Update_UI, SORTING_BY_DESCENDING_ALBUM);
QCASE_DATA(AM_SORT_ASCENDING_YEAR, ET_Sort_Displayed_File_List_And_Update_UI, SORTING_BY_ASCENDING_YEAR);
@@ -156,6 +158,8 @@ void Create_UI (GtkWidget **ppmenubar, GtkWidget **pptoolbar)
{ AM_SORT_DESCENDING_TITLE, GTK_STOCK_SORT_DESCENDING, _("Descending by title"), NULL, _("Descending by title"), G_CALLBACK(Menu_Sort_Action) },
{ AM_SORT_ASCENDING_ARTIST, GTK_STOCK_SORT_ASCENDING, _("Ascending by artist"), NULL, _("Ascending by artist"), G_CALLBACK(Menu_Sort_Action) },
{ AM_SORT_DESCENDING_ARTIST, GTK_STOCK_SORT_DESCENDING, _("Descending by artist"), NULL, _("Descending by artist"), G_CALLBACK(Menu_Sort_Action) },
+ { AM_SORT_ASCENDING_ALBUM_ARTIST, GTK_STOCK_SORT_ASCENDING, _("Ascending by album artist"), NULL, _("Ascending by album artist"), G_CALLBACK(Menu_Sort_Action) },
+ { AM_SORT_DESCENDING_ALBUM_ARTIST, GTK_STOCK_SORT_DESCENDING, _("Descending by album artist"), NULL, _("Descending by album artist"), G_CALLBACK(Menu_Sort_Action) },
{ AM_SORT_ASCENDING_ALBUM, GTK_STOCK_SORT_ASCENDING, _("Ascending by album"), NULL, _("Ascending by album"), G_CALLBACK(Menu_Sort_Action) },
{ AM_SORT_DESCENDING_ALBUM, GTK_STOCK_SORT_DESCENDING, _("Descending by album"), NULL, _("Descending by album"), G_CALLBACK(Menu_Sort_Action) },
{ AM_SORT_ASCENDING_YEAR, GTK_STOCK_SORT_ASCENDING, _("Ascending by year"), NULL, _("Ascending by year"), G_CALLBACK(Menu_Sort_Action) },
diff --git a/src/bar.h b/src/bar.h
index b167e05..bcbcf7b 100644
--- a/src/bar.h
+++ b/src/bar.h
@@ -117,6 +117,8 @@ GtkWidget *CheckMenuItemBrowseHiddenDirMainMenu;
#define AM_SORT_DESCENDING_TITLE "SortTitleDesc"
#define AM_SORT_ASCENDING_ARTIST "SortArtistAsc"
#define AM_SORT_DESCENDING_ARTIST "SortArtistDesc"
+#define AM_SORT_ASCENDING_ALBUM_ARTIST "SortAlbumArtistAsc"
+#define AM_SORT_DESCENDING_ALBUM_ARTIST "SortAlbumArtistDesc"
#define AM_SORT_ASCENDING_ALBUM "SortAlbumAsc"
#define AM_SORT_DESCENDING_ALBUM "SortAlbumDesc"
#define AM_SORT_ASCENDING_YEAR "SortYearAsc"
diff --git a/src/browser.c b/src/browser.c
index 7c86a41..ee154cf 100644
--- a/src/browser.c
+++ b/src/browser.c
@@ -1050,7 +1050,7 @@ void Browser_List_Load_File_List (GList *etfilelist, ET_File *etfile_to_select)
// File list displays the current filename (name on HardDisk) and tag fields
gtk_list_store_append(fileListModel, &rowIter);
track = g_strconcat(FileTag->track ? FileTag->track : "",FileTag->track_total ? "/" : NULL,FileTag->track_total,NULL);
-
+
gtk_list_store_set(fileListModel, &rowIter,
LIST_FILE_NAME, basename_utf8,
LIST_FILE_POINTER, etfilelist->data,
@@ -1058,7 +1058,8 @@ void Browser_List_Load_File_List (GList *etfilelist, ET_File *etfile_to_select)
LIST_FILE_OTHERDIR, activate_bg_color,
LIST_FILE_TITLE, FileTag->title,
LIST_FILE_ARTIST, FileTag->artist,
- LIST_FILE_ALBUM, FileTag->album,
+ LIST_FILE_ALBUM_ARTIST, FileTag->album_artist,
+ LIST_FILE_ALBUM, FileTag->album,
LIST_FILE_YEAR, FileTag->year,
LIST_FILE_TRACK, track,
LIST_FILE_GENRE, FileTag->genre,
@@ -1136,7 +1137,8 @@ void Browser_List_Refresh_Whole_List (void)
LIST_FILE_NAME, current_basename_utf8,
LIST_FILE_TITLE, FileTag->title,
LIST_FILE_ARTIST, FileTag->artist,
- LIST_FILE_ALBUM, FileTag->album,
+ LIST_FILE_ALBUM_ARTIST, FileTag->album_artist,
+ LIST_FILE_ALBUM, FileTag->album,
LIST_FILE_YEAR, FileTag->year,
LIST_FILE_TRACK, track,
LIST_FILE_GENRE, FileTag->genre,
@@ -1291,7 +1293,8 @@ void Browser_List_Refresh_File_In_List (ET_File *ETFile)
LIST_FILE_NAME, current_basename_utf8,
LIST_FILE_TITLE, FileTag->title,
LIST_FILE_ARTIST, FileTag->artist,
- LIST_FILE_ALBUM, FileTag->album,
+ LIST_FILE_ALBUM_ARTIST, FileTag->album_artist,
+ LIST_FILE_ALBUM, FileTag->album,
LIST_FILE_YEAR, FileTag->year,
LIST_FILE_TRACK, track,
LIST_FILE_GENRE, FileTag->genre,
@@ -1435,7 +1438,8 @@ void Browser_List_Set_Row_Appearance (GtkTreeIter *iter)
gtk_list_store_set(fileListModel, iter,
LIST_FILE_TITLE, FileTag->title,
LIST_FILE_ARTIST, FileTag->artist,
- LIST_FILE_ALBUM, FileTag->album,
+ LIST_FILE_ALBUM_ARTIST, FileTag->album_artist,
+ LIST_FILE_ALBUM, FileTag->album,
LIST_FILE_YEAR, FileTag->year,
LIST_FILE_TRACK, FileTag->track,
LIST_FILE_GENRE, FileTag->genre,
@@ -1831,6 +1835,12 @@ gint Browser_List_Sort_Func (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b
case SORTING_BY_DESCENDING_ARTIST:
result = ET_Comp_Func_Sort_File_By_Descending_Artist(ETFile1, ETFile2);
break;
+ case SORTING_BY_ASCENDING_ALBUM_ARTIST:
+ result = ET_Comp_Func_Sort_File_By_Ascending_Album_Artist(ETFile1, ETFile2);
+ break;
+ case SORTING_BY_DESCENDING_ALBUM_ARTIST:
+ result = ET_Comp_Func_Sort_File_By_Descending_Album_Artist(ETFile1, ETFile2);
+ break;
case SORTING_BY_ASCENDING_ALBUM:
result = ET_Comp_Func_Sort_File_By_Ascending_Album(ETFile1, ETFile2);
break;
@@ -3025,7 +3035,7 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
GtkTooltips *Tips;
GtkWidget *PopupMenu;
gchar *BrowserTree_Titles[] = {N_("Tree")};
- gchar *BrowserList_Titles[] = {N_("File Name"),N_("Title"),N_("Artist"),N_("Album"),
+ gchar *BrowserList_Titles[] = {N_("File Name"),N_("Title"),N_("Artist"),N_("Album Artist"),N_("Album"),
N_("Year"),N_("Track"),N_("Genre"),N_("Comment"),
N_("Composer"),N_("Orig. Artist"),N_("Copyright"),
N_("URL"),N_("Encoded By")};
@@ -3383,6 +3393,7 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
G_TYPE_STRING,
G_TYPE_STRING,
G_TYPE_STRING,
+ G_TYPE_STRING,
G_TYPE_STRING);
BrowserList = gtk_tree_view_new_with_model(GTK_TREE_MODEL(fileListModel));
@@ -3433,13 +3444,27 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(BrowserList), column);
- // Column for Album
+ // Column for Album Artist
column = gtk_tree_view_column_new();
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_column_pack_start(column, renderer, FALSE);
gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
gtk_tree_view_column_set_title(column, _(BrowserList_Titles[3]));
gtk_tree_view_column_set_attributes(column, renderer,
+ "text", LIST_FILE_ALBUM_ARTIST,
+ "weight", LIST_FONT_WEIGHT,
+ "background-gdk", LIST_ROW_BACKGROUND,
+ "foreground-gdk", LIST_ROW_FOREGROUND,
+ NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(BrowserList), column);
+
+ // Column for Album
+ column = gtk_tree_view_column_new();
+ renderer = gtk_cell_renderer_text_new();
+ gtk_tree_view_column_pack_start(column, renderer, FALSE);
+ gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
+ gtk_tree_view_column_set_title(column, _(BrowserList_Titles[4]));
+ gtk_tree_view_column_set_attributes(column, renderer,
"text", LIST_FILE_ALBUM,
"weight", LIST_FONT_WEIGHT,
"background-gdk", LIST_ROW_BACKGROUND,
@@ -3452,7 +3477,7 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_column_pack_start(column, renderer, FALSE);
gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_column_set_title(column, _(BrowserList_Titles[4]));
+ gtk_tree_view_column_set_title(column, _(BrowserList_Titles[5]));
gtk_tree_view_column_set_attributes(column, renderer,
"text", LIST_FILE_YEAR,
"weight", LIST_FONT_WEIGHT,
@@ -3466,7 +3491,7 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_column_pack_start(column, renderer, FALSE);
gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_column_set_title(column, _(BrowserList_Titles[5]));
+ gtk_tree_view_column_set_title(column, _(BrowserList_Titles[6]));
gtk_tree_view_column_set_attributes(column, renderer,
"text", LIST_FILE_TRACK,
"weight", LIST_FONT_WEIGHT,
@@ -3480,7 +3505,7 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_column_pack_start(column, renderer, FALSE);
gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_column_set_title(column, _(BrowserList_Titles[6]));
+ gtk_tree_view_column_set_title(column, _(BrowserList_Titles[7]));
gtk_tree_view_column_set_attributes(column, renderer,
"text", LIST_FILE_GENRE,
"weight", LIST_FONT_WEIGHT,
@@ -3494,7 +3519,7 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_column_pack_start(column, renderer, FALSE);
gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_column_set_title(column, _(BrowserList_Titles[7]));
+ gtk_tree_view_column_set_title(column, _(BrowserList_Titles[8]));
gtk_tree_view_column_set_attributes(column, renderer,
"text", LIST_FILE_COMMENT,
"weight", LIST_FONT_WEIGHT,
@@ -3508,7 +3533,7 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_column_pack_start(column, renderer, FALSE);
gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_column_set_title(column, _(BrowserList_Titles[8]));
+ gtk_tree_view_column_set_title(column, _(BrowserList_Titles[9]));
gtk_tree_view_column_set_attributes(column, renderer,
"text", LIST_FILE_COMPOSER,
"weight", LIST_FONT_WEIGHT,
@@ -3522,7 +3547,7 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_column_pack_start(column, renderer, FALSE);
gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_column_set_title(column, _(BrowserList_Titles[9]));
+ gtk_tree_view_column_set_title(column, _(BrowserList_Titles[10]));
gtk_tree_view_column_set_attributes(column, renderer,
"text", LIST_FILE_ORIG_ARTIST,
"weight", LIST_FONT_WEIGHT,
@@ -3536,7 +3561,7 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_column_pack_start(column, renderer, FALSE);
gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_column_set_title(column, _(BrowserList_Titles[10]));
+ gtk_tree_view_column_set_title(column, _(BrowserList_Titles[11]));
gtk_tree_view_column_set_attributes(column, renderer,
"text", LIST_FILE_COPYRIGHT,
"weight", LIST_FONT_WEIGHT,
@@ -3550,7 +3575,7 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_column_pack_start(column, renderer, FALSE);
gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_column_set_title(column, _(BrowserList_Titles[11]));
+ gtk_tree_view_column_set_title(column, _(BrowserList_Titles[12]));
gtk_tree_view_column_set_attributes(column, renderer,
"text", LIST_FILE_URL,
"weight", LIST_FONT_WEIGHT,
@@ -3564,7 +3589,7 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_column_pack_start(column, renderer, FALSE);
gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_column_set_title(column, _(BrowserList_Titles[12]));
+ gtk_tree_view_column_set_title(column, _(BrowserList_Titles[13]));
gtk_tree_view_column_set_attributes(column, renderer,
"text", LIST_FILE_ENCODED_BY,
"weight", LIST_FONT_WEIGHT,
diff --git a/src/browser.h b/src/browser.h
index 3ce9fa6..ee2d8d8 100644
--- a/src/browser.h
+++ b/src/browser.h
@@ -83,6 +83,7 @@ enum
// Tag fields
LIST_FILE_TITLE,
LIST_FILE_ARTIST,
+ LIST_FILE_ALBUM_ARTIST,
LIST_FILE_ALBUM,
LIST_FILE_YEAR,
LIST_FILE_TRACK,
diff --git a/src/easytag.c b/src/easytag.c
index baac362..d312f23 100644
--- a/src/easytag.c
+++ b/src/easytag.c
@@ -650,19 +650,37 @@ GtkWidget *Create_Tag_Area (void)
Attach_Popup_Menu_To_Tag_Entries(GTK_ENTRY(ArtistEntry));
g_object_set_data(G_OBJECT(ArtistEntry),"MButtonName",ArtistMButton);
+ /* Album Artist */
+ AlbumArtistLabel = gtk_label_new(_("Album Artist:"));
+ gtk_table_attach(GTK_TABLE(Table),AlbumArtistLabel,0,1,2,3,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
+ gtk_misc_set_alignment(GTK_MISC(AlbumArtistLabel),1,0.5);
+
+ AlbumArtistEntry = gtk_entry_new();
+ gtk_table_attach(GTK_TABLE(Table),AlbumArtistEntry,1,10,2,3,
+ GTK_EXPAND|GTK_FILL,GTK_EXPAND|GTK_FILL,TablePadding,TablePadding);
+
+ AlbumArtistMButton = gtk_button_new();
+ gtk_widget_set_size_request(AlbumArtistMButton,MButtonSize,MButtonSize);
+ gtk_table_attach(GTK_TABLE(Table),AlbumArtistMButton,10,11,2,3,0,0,TablePadding,TablePadding);
+ g_signal_connect(G_OBJECT(AlbumArtistMButton),"clicked", G_CALLBACK(Mini_Button_Clicked),NULL);
+ gtk_tooltips_set_tip(Tips,AlbumArtistMButton,_("Tag selected files with this album artist"),NULL);
+
+ Attach_Popup_Menu_To_Tag_Entries(GTK_ENTRY(AlbumArtistEntry));
+ g_object_set_data(G_OBJECT(AlbumArtistEntry),"MButtonName",AlbumArtistMButton);
+
/* Album */
AlbumLabel = gtk_label_new(_("Album:"));
- gtk_table_attach(GTK_TABLE(Table),AlbumLabel,0,1,2,3,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
+ gtk_table_attach(GTK_TABLE(Table),AlbumLabel,0,1,3,4,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
gtk_misc_set_alignment(GTK_MISC(AlbumLabel),1,0.5);
AlbumEntry = gtk_entry_new();
- gtk_table_attach(GTK_TABLE(Table),AlbumEntry,1,7,2,3,
+ gtk_table_attach(GTK_TABLE(Table),AlbumEntry,1,7,3,4,
GTK_EXPAND|GTK_FILL,GTK_EXPAND|GTK_FILL,TablePadding,TablePadding);
AlbumMButton = gtk_button_new();
//gtk_widget_set_size_request(AlbumMButton, 10, 10);
gtk_widget_set_size_request(AlbumMButton,MButtonSize,MButtonSize);
- gtk_table_attach(GTK_TABLE(Table),AlbumMButton,7,8,2,3,0,0,TablePadding,TablePadding);
+ gtk_table_attach(GTK_TABLE(Table),AlbumMButton,7,8,3,4,0,0,TablePadding,TablePadding);
g_signal_connect(G_OBJECT(AlbumMButton),"clicked",G_CALLBACK(Mini_Button_Clicked),NULL);
gtk_tooltips_set_tip(Tips,AlbumMButton,_("Tag selected files with this album name"),NULL);
@@ -671,11 +689,11 @@ GtkWidget *Create_Tag_Area (void)
/* Disc Number */
DiscNumberLabel = gtk_label_new(_("CD:"));
- gtk_table_attach(GTK_TABLE(Table),DiscNumberLabel,8,9,2,3,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
+ gtk_table_attach(GTK_TABLE(Table),DiscNumberLabel,8,9,3,4,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
gtk_misc_set_alignment(GTK_MISC(DiscNumberLabel),1,0.5);
DiscNumberEntry = gtk_entry_new();
- gtk_table_attach(GTK_TABLE(Table),DiscNumberEntry,9,10,2,3,
+ gtk_table_attach(GTK_TABLE(Table),DiscNumberEntry,9,10,3,4,
GTK_EXPAND|GTK_FILL,GTK_EXPAND|GTK_FILL,TablePadding,TablePadding);
gtk_widget_set_size_request(DiscNumberEntry,30,-1);
// FIX ME should allow to type only something like : 1/3
@@ -684,7 +702,7 @@ GtkWidget *Create_Tag_Area (void)
DiscNumberMButton = gtk_button_new();
//gtk_widget_set_size_request(DiscNumberMButton, 10, 10);
gtk_widget_set_size_request(DiscNumberMButton,MButtonSize,MButtonSize);
- gtk_table_attach(GTK_TABLE(Table),DiscNumberMButton,10,11,2,3,0,0,TablePadding,TablePadding);
+ gtk_table_attach(GTK_TABLE(Table),DiscNumberMButton,10,11,3,4,0,0,TablePadding,TablePadding);
g_signal_connect(G_OBJECT(DiscNumberMButton),"clicked",G_CALLBACK(Mini_Button_Clicked),NULL);
gtk_tooltips_set_tip(Tips,DiscNumberMButton,_("Tag selected files with this disc number"),NULL);
@@ -693,12 +711,12 @@ GtkWidget *Create_Tag_Area (void)
/* Year */
YearLabel = gtk_label_new(_("Year:"));
- gtk_table_attach(GTK_TABLE(Table),YearLabel,0,1,3,4,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
+ gtk_table_attach(GTK_TABLE(Table),YearLabel,0,1,4,5,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
gtk_misc_set_alignment(GTK_MISC(YearLabel),1,0.5);
YearEntry = gtk_entry_new();
gtk_entry_set_max_length(GTK_ENTRY(YearEntry), 4);
- gtk_table_attach(GTK_TABLE(Table),YearEntry,1,2,3,4,
+ gtk_table_attach(GTK_TABLE(Table),YearEntry,1,2,4,5,
GTK_EXPAND|GTK_FILL,GTK_EXPAND|GTK_FILL,TablePadding,TablePadding);
gtk_widget_set_size_request(YearEntry,37,-1);
g_signal_connect(G_OBJECT(YearEntry),"insert_text",G_CALLBACK(Insert_Only_Digit),NULL);
@@ -707,19 +725,19 @@ GtkWidget *Create_Tag_Area (void)
YearMButton = gtk_button_new();
gtk_widget_set_size_request(YearMButton,MButtonSize,MButtonSize);
- gtk_table_attach(GTK_TABLE(Table),YearMButton,2,3,3,4,0,0,TablePadding,TablePadding);
+ gtk_table_attach(GTK_TABLE(Table),YearMButton,2,3,4,5,0,0,TablePadding,TablePadding);
g_signal_connect(G_OBJECT(YearMButton),"clicked",G_CALLBACK(Mini_Button_Clicked),NULL);
gtk_tooltips_set_tip(Tips,YearMButton,_("Tag selected files with this year"),NULL);
/* Small vertical separator */
Separator = gtk_vseparator_new();
- gtk_table_attach(GTK_TABLE(Table),Separator,3,4,3,4,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
+ gtk_table_attach(GTK_TABLE(Table),Separator,3,4,4,5,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
/* Track and Track total */
TrackMButtonSequence = gtk_button_new();
gtk_widget_set_size_request(TrackMButtonSequence,MButtonSize,MButtonSize);
- gtk_table_attach(GTK_TABLE(Table),TrackMButtonSequence,4,5,3,4,0,0,TablePadding,TablePadding);
+ gtk_table_attach(GTK_TABLE(Table),TrackMButtonSequence,4,5,4,5,0,0,TablePadding,TablePadding);
g_signal_connect(G_OBJECT(TrackMButtonSequence),"clicked",G_CALLBACK(Mini_Button_Clicked),NULL);
gtk_tooltips_set_tip(Tips,TrackMButtonSequence,_("Number selected tracks sequentially. "
"Starts at 01 in each subdirectory."), NULL);
@@ -731,7 +749,7 @@ GtkWidget *Create_Tag_Area (void)
GTK_WIDGET_UNSET_FLAGS(TrackMButtonSequence,GTK_CAN_FOCUS); // To have enought space to display the icon
TrackLabel = gtk_label_new(_("Track #:"));
- gtk_table_attach(GTK_TABLE(Table),TrackLabel,5,6,3,4,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
+ gtk_table_attach(GTK_TABLE(Table),TrackLabel,5,6,4,5,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
gtk_misc_set_alignment(GTK_MISC(TrackLabel),1,0.5);
if (TrackEntryComboModel != NULL)
@@ -740,7 +758,7 @@ GtkWidget *Create_Tag_Area (void)
TrackEntryComboModel = gtk_list_store_new(MISC_COMBO_COUNT, G_TYPE_STRING);
TrackEntryCombo = gtk_combo_box_entry_new_with_model(GTK_TREE_MODEL(TrackEntryComboModel), MISC_COMBO_TEXT);
- gtk_table_attach(GTK_TABLE(Table),TrackEntryCombo,6,7,3,4,
+ gtk_table_attach(GTK_TABLE(Table),TrackEntryCombo,6,7,4,5,
GTK_EXPAND|GTK_FILL,GTK_EXPAND|GTK_FILL,TablePadding,TablePadding);
gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(TrackEntryCombo),3); // Three columns to display track numbers list
@@ -749,12 +767,12 @@ GtkWidget *Create_Tag_Area (void)
G_CALLBACK(Insert_Only_Digit),NULL);
Label = gtk_label_new("/");
- gtk_table_attach(GTK_TABLE(Table),Label,7,8,3,4,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
+ gtk_table_attach(GTK_TABLE(Table),Label,7,8,4,5,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
gtk_misc_set_alignment(GTK_MISC(Label),0.5,0.5);
TrackMButtonNbrFiles = gtk_button_new();
gtk_widget_set_size_request(TrackMButtonNbrFiles,MButtonSize,MButtonSize);
- gtk_table_attach(GTK_TABLE(Table),TrackMButtonNbrFiles,8,9,3,4,0,0,TablePadding,TablePadding);
+ gtk_table_attach(GTK_TABLE(Table),TrackMButtonNbrFiles,8,9,4,5,0,0,TablePadding,TablePadding);
g_signal_connect(G_OBJECT(TrackMButtonNbrFiles),"clicked",G_CALLBACK(Mini_Button_Clicked),NULL);
gtk_tooltips_set_tip(Tips,TrackMButtonNbrFiles,_("Set the number of files, in the same directory of the displayed file, to the selected tracks."), NULL);
// Pixmap into TrackMButtonNbrFiles button
@@ -765,7 +783,7 @@ GtkWidget *Create_Tag_Area (void)
GTK_WIDGET_UNSET_FLAGS(TrackMButtonNbrFiles,GTK_CAN_FOCUS); // To have enought space to display the icon
TrackTotalEntry = gtk_entry_new();
- gtk_table_attach(GTK_TABLE(Table),TrackTotalEntry,9,10,3,4,
+ gtk_table_attach(GTK_TABLE(Table),TrackTotalEntry,9,10,4,5,
GTK_EXPAND|GTK_FILL,GTK_EXPAND|GTK_FILL,TablePadding,TablePadding);
gtk_widget_set_size_request(TrackTotalEntry,30,-1);
g_signal_connect(G_OBJECT(GTK_ENTRY(TrackTotalEntry)),"insert_text",
@@ -773,7 +791,7 @@ GtkWidget *Create_Tag_Area (void)
TrackMButton = gtk_button_new();
gtk_widget_set_size_request(TrackMButton,MButtonSize,MButtonSize);
- gtk_table_attach(GTK_TABLE(Table),TrackMButton,10,11,3,4,0,0,TablePadding,TablePadding);
+ gtk_table_attach(GTK_TABLE(Table),TrackMButton,10,11,4,5,0,0,TablePadding,TablePadding);
g_signal_connect(G_OBJECT(TrackMButton),"clicked",G_CALLBACK(Mini_Button_Clicked),NULL);
gtk_tooltips_set_tip(Tips,TrackMButton,_("Tag selected files with this number of tracks"),NULL);
@@ -782,7 +800,7 @@ GtkWidget *Create_Tag_Area (void)
/* Genre */
GenreLabel = gtk_label_new(_("Genre:"));
- gtk_table_attach(GTK_TABLE(Table),GenreLabel,0,1,4,5,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
+ gtk_table_attach(GTK_TABLE(Table),GenreLabel,0,1,5,6,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
gtk_misc_set_alignment(GTK_MISC(GenreLabel),1,0.5);
if (GenreComboModel != NULL)
@@ -797,14 +815,14 @@ GtkWidget *Create_Tag_Area (void)
gtk_entry_completion_set_text_column(completion, 0);
gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(GenreComboModel), MISC_COMBO_TEXT, Combo_Alphabetic_Sort, NULL, NULL);
gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(GenreComboModel), MISC_COMBO_TEXT, GTK_SORT_ASCENDING);
- gtk_table_attach(GTK_TABLE(Table),GenreCombo,1,10,4,5,
+ gtk_table_attach(GTK_TABLE(Table),GenreCombo,1,10,5,6,
GTK_EXPAND|GTK_FILL,GTK_EXPAND|GTK_FILL,TablePadding,TablePadding);
Load_Genres_List_To_UI();
gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(GenreCombo),2); // Two columns to display genres list
GenreMButton = gtk_button_new();
gtk_widget_set_size_request(GenreMButton,MButtonSize,MButtonSize);
- gtk_table_attach(GTK_TABLE(Table),GenreMButton,10,11,4,5,0,0,TablePadding,TablePadding);
+ gtk_table_attach(GTK_TABLE(Table),GenreMButton,10,11,5,6,0,0,TablePadding,TablePadding);
g_signal_connect(G_OBJECT(GenreMButton),"clicked",G_CALLBACK(Mini_Button_Clicked),NULL);
gtk_tooltips_set_tip(Tips,GenreMButton,_("Tag selected files with this genre"),NULL);
@@ -813,11 +831,11 @@ GtkWidget *Create_Tag_Area (void)
/* Comment */
CommentLabel = gtk_label_new(_("Comment:"));
- gtk_table_attach(GTK_TABLE(Table),CommentLabel,0,1,5,6,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
+ gtk_table_attach(GTK_TABLE(Table),CommentLabel,0,1,6,7,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
gtk_misc_set_alignment(GTK_MISC(CommentLabel),1,0.5);
CommentEntry = gtk_entry_new();
- gtk_table_attach(GTK_TABLE(Table),CommentEntry,1,10,5,6,
+ gtk_table_attach(GTK_TABLE(Table),CommentEntry,1,10,6,7,
GTK_EXPAND|GTK_FILL,GTK_EXPAND|GTK_FILL,TablePadding,TablePadding);
// Use of a text view instead of an entry...
@@ -835,7 +853,7 @@ GtkWidget *Create_Tag_Area (void)
CommentMButton = gtk_button_new();
gtk_widget_set_size_request(CommentMButton,MButtonSize,MButtonSize);
- gtk_table_attach(GTK_TABLE(Table),CommentMButton,10,11,5,6,0,0,TablePadding,TablePadding);
+ gtk_table_attach(GTK_TABLE(Table),CommentMButton,10,11,6,7,0,0,TablePadding,TablePadding);
g_signal_connect(G_OBJECT(CommentMButton),"clicked",G_CALLBACK(Mini_Button_Clicked),NULL);
gtk_tooltips_set_tip(Tips,CommentMButton,_("Tag selected files with this comment"),NULL);
@@ -847,16 +865,16 @@ GtkWidget *Create_Tag_Area (void)
/* Composer (name of the composers) */
ComposerLabel = gtk_label_new(_("Composer:"));
- gtk_table_attach(GTK_TABLE(Table),ComposerLabel,0,1,6,7,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
+ gtk_table_attach(GTK_TABLE(Table),ComposerLabel,0,1,7,8,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
gtk_misc_set_alignment(GTK_MISC(ComposerLabel),1,0.5);
ComposerEntry = gtk_entry_new();
- gtk_table_attach(GTK_TABLE(Table),ComposerEntry,1,10,6,7,
+ gtk_table_attach(GTK_TABLE(Table),ComposerEntry,1,10,7,8,
GTK_EXPAND|GTK_FILL,GTK_EXPAND|GTK_FILL,TablePadding,TablePadding);
ComposerMButton = gtk_button_new();
gtk_widget_set_size_request(ComposerMButton,MButtonSize,MButtonSize);
- gtk_table_attach(GTK_TABLE(Table),ComposerMButton,10,11,6,7,0,0,TablePadding,TablePadding);
+ gtk_table_attach(GTK_TABLE(Table),ComposerMButton,10,11,7,8,0,0,TablePadding,TablePadding);
g_signal_connect(G_OBJECT(ComposerMButton),"clicked", G_CALLBACK(Mini_Button_Clicked),NULL);
gtk_tooltips_set_tip(Tips,ComposerMButton,_("Tag selected files with this composer"),NULL);
@@ -866,16 +884,16 @@ GtkWidget *Create_Tag_Area (void)
/* Original Artist / Performer */
OrigArtistLabel = gtk_label_new(_("Orig. Artist:"));
- gtk_table_attach(GTK_TABLE(Table),OrigArtistLabel,0,1,7,8,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
+ gtk_table_attach(GTK_TABLE(Table),OrigArtistLabel,0,1,8,9,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
gtk_misc_set_alignment(GTK_MISC(OrigArtistLabel),1,0.5);
OrigArtistEntry = gtk_entry_new();
- gtk_table_attach(GTK_TABLE(Table),OrigArtistEntry,1,10,7,8,
+ gtk_table_attach(GTK_TABLE(Table),OrigArtistEntry,1,10,8,9,
GTK_EXPAND|GTK_FILL,GTK_EXPAND|GTK_FILL,TablePadding,TablePadding);
OrigArtistMButton = gtk_button_new();
gtk_widget_set_size_request(OrigArtistMButton,MButtonSize,MButtonSize);
- gtk_table_attach(GTK_TABLE(Table),OrigArtistMButton,10,11,7,8,0,0,TablePadding,TablePadding);
+ gtk_table_attach(GTK_TABLE(Table),OrigArtistMButton,10,11,8,9,0,0,TablePadding,TablePadding);
g_signal_connect(G_OBJECT(OrigArtistMButton),"clicked", G_CALLBACK(Mini_Button_Clicked),NULL);
gtk_tooltips_set_tip(Tips,OrigArtistMButton,_("Tag selected files with this original artist"),NULL);
@@ -885,16 +903,16 @@ GtkWidget *Create_Tag_Area (void)
/* Copyright */
CopyrightLabel = gtk_label_new(_("Copyright:"));
- gtk_table_attach(GTK_TABLE(Table),CopyrightLabel,0,1,8,9,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
+ gtk_table_attach(GTK_TABLE(Table),CopyrightLabel,0,1,9,10,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
gtk_misc_set_alignment(GTK_MISC(CopyrightLabel),1,0.5);
CopyrightEntry = gtk_entry_new();
- gtk_table_attach(GTK_TABLE(Table),CopyrightEntry,1,10,8,9,
+ gtk_table_attach(GTK_TABLE(Table),CopyrightEntry,1,10,9,10,
GTK_EXPAND|GTK_FILL,GTK_EXPAND|GTK_FILL,TablePadding,TablePadding);
CopyrightMButton = gtk_button_new();
gtk_widget_set_size_request(CopyrightMButton,MButtonSize,MButtonSize);
- gtk_table_attach(GTK_TABLE(Table),CopyrightMButton,10,11,8,9,0,0,TablePadding,TablePadding);
+ gtk_table_attach(GTK_TABLE(Table),CopyrightMButton,10,11,9,10,0,0,TablePadding,TablePadding);
g_signal_connect(G_OBJECT(CopyrightMButton),"clicked", G_CALLBACK(Mini_Button_Clicked),NULL);
gtk_tooltips_set_tip(Tips,CopyrightMButton,_("Tag selected files with this copyright"),NULL);
@@ -904,16 +922,16 @@ GtkWidget *Create_Tag_Area (void)
/* URL */
URLLabel = gtk_label_new(_("URL:"));
- gtk_table_attach(GTK_TABLE(Table),URLLabel,0,1,9,10,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
+ gtk_table_attach(GTK_TABLE(Table),URLLabel,0,1,10,11,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
gtk_misc_set_alignment(GTK_MISC(URLLabel),1,0.5);
URLEntry = gtk_entry_new();
- gtk_table_attach(GTK_TABLE(Table),URLEntry,1,10,9,10,
+ gtk_table_attach(GTK_TABLE(Table),URLEntry,1,10,10,11,
GTK_EXPAND|GTK_FILL,GTK_EXPAND|GTK_FILL,TablePadding,TablePadding);
URLMButton = gtk_button_new();
gtk_widget_set_size_request(URLMButton,MButtonSize,MButtonSize);
- gtk_table_attach(GTK_TABLE(Table),URLMButton,10,11,9,10,0,0,TablePadding,TablePadding);
+ gtk_table_attach(GTK_TABLE(Table),URLMButton,10,11,10,11,0,0,TablePadding,TablePadding);
g_signal_connect(G_OBJECT(URLMButton),"clicked", G_CALLBACK(Mini_Button_Clicked),NULL);
gtk_tooltips_set_tip(Tips,URLMButton,_("Tag selected files with this URL"),NULL);
@@ -923,16 +941,16 @@ GtkWidget *Create_Tag_Area (void)
/* Encoded by */
EncodedByLabel = gtk_label_new(_("Encoded by:"));
- gtk_table_attach(GTK_TABLE(Table),EncodedByLabel,0,1,10,11,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
+ gtk_table_attach(GTK_TABLE(Table),EncodedByLabel,0,1,11,12,GTK_FILL,GTK_FILL,TablePadding,TablePadding);
gtk_misc_set_alignment(GTK_MISC(EncodedByLabel),1,0.5);
EncodedByEntry = gtk_entry_new();
- gtk_table_attach(GTK_TABLE(Table),EncodedByEntry,1,10,10,11,
+ gtk_table_attach(GTK_TABLE(Table),EncodedByEntry,1,10,11,12,
GTK_EXPAND|GTK_FILL,GTK_EXPAND|GTK_FILL,TablePadding,TablePadding);
EncodedByMButton = gtk_button_new();
gtk_widget_set_size_request(EncodedByMButton,MButtonSize,MButtonSize);
- gtk_table_attach(GTK_TABLE(Table),EncodedByMButton,10,11,10,11,0,0,TablePadding,TablePadding);
+ gtk_table_attach(GTK_TABLE(Table),EncodedByMButton,10,11,11,12,0,0,TablePadding,TablePadding);
g_signal_connect(G_OBJECT(EncodedByMButton),"clicked", G_CALLBACK(Mini_Button_Clicked),NULL);
gtk_tooltips_set_tip(Tips,EncodedByMButton,_("Tag selected files with this encoder name"),NULL);
@@ -954,7 +972,8 @@ GtkWidget *Create_Tag_Area (void)
g_signal_connect_swapped(G_OBJECT(OrigArtistEntry), "activate",G_CALLBACK(gtk_widget_grab_focus),G_OBJECT(CopyrightEntry));
g_signal_connect_swapped(G_OBJECT(CopyrightEntry), "activate",G_CALLBACK(gtk_widget_grab_focus),G_OBJECT(URLEntry));
g_signal_connect_swapped(G_OBJECT(URLEntry), "activate",G_CALLBACK(gtk_widget_grab_focus),G_OBJECT(EncodedByEntry));
- g_signal_connect_swapped(G_OBJECT(EncodedByEntry), "activate",G_CALLBACK(gtk_widget_grab_focus),G_OBJECT(TitleEntry));
+ g_signal_connect_swapped(G_OBJECT(EncodedByEntry), "activate",G_CALLBACK(gtk_widget_grab_focus),G_OBJECT(AlbumArtistEntry));
+ g_signal_connect_swapped(G_OBJECT(AlbumArtistEntry),"activate",G_CALLBACK(gtk_widget_grab_focus),G_OBJECT(TitleEntry));
// Set focus chain
focusable_widgets_list = g_list_append(focusable_widgets_list,TitleEntry);
@@ -986,6 +1005,8 @@ GtkWidget *Create_Tag_Area (void)
focusable_widgets_list = g_list_append(focusable_widgets_list,URLMButton);
focusable_widgets_list = g_list_append(focusable_widgets_list,EncodedByEntry);
focusable_widgets_list = g_list_append(focusable_widgets_list,EncodedByMButton);
+ focusable_widgets_list = g_list_append(focusable_widgets_list,AlbumArtistEntry);
+ focusable_widgets_list = g_list_append(focusable_widgets_list,AlbumArtistMButton);
focusable_widgets_list = g_list_append(focusable_widgets_list,TitleEntry); // To loop to the beginning
gtk_container_set_focus_chain(GTK_CONTAINER(Table),focusable_widgets_list);
@@ -1199,6 +1220,25 @@ void Mini_Button_Clicked (GObject *object)
else
msg = g_strdup(_("Removed artist from selected files."));
}
+ else if (object==G_OBJECT(AlbumArtistMButton))
+ {
+ string_to_set = gtk_editable_get_chars(GTK_EDITABLE(AlbumArtistEntry),0,-1);
+ while (etfilelist)
+ {
+ etfile = (ET_File *)etfilelist->data;
+ FileTag = ET_File_Tag_Item_New();
+ ET_Copy_File_Tag_Item(etfile,FileTag);
+ ET_Set_Field_File_Tag_Item(&FileTag->album_artist,string_to_set);
+ ET_Manage_Changes_Of_File_Data(etfile,NULL,FileTag);
+
+ if (!etfilelist->next) break;
+ etfilelist = g_list_next(etfilelist);
+ }
+ if (string_to_set != NULL && g_utf8_strlen(string_to_set, -1)>0)
+ msg = g_strdup_printf(_("Selected files tagged with album artist '%s'."),string_to_set);
+ else
+ msg = g_strdup(_("Removed album artist from selected files."));
+ }
else if (object==G_OBJECT(AlbumMButton))
{
string_to_set = gtk_editable_get_chars(GTK_EDITABLE(AlbumEntry),0,-1);
@@ -4082,6 +4122,8 @@ void Tag_Area_Display_Controls (ET_File *ETFile)
gtk_widget_show(GTK_WIDGET(TitleMButton));
gtk_widget_show(GTK_WIDGET(ArtistLabel));
gtk_widget_show(GTK_WIDGET(ArtistEntry));
+ gtk_widget_show(GTK_WIDGET(AlbumArtistLabel));
+ gtk_widget_show(GTK_WIDGET(AlbumArtistEntry));
gtk_widget_show(GTK_WIDGET(ArtistMButton));
gtk_widget_show(GTK_WIDGET(AlbumLabel));
gtk_widget_show(GTK_WIDGET(AlbumEntry));
@@ -4377,6 +4419,7 @@ void Clear_Tag_Entry_Fields (void)
gtk_entry_set_text(GTK_ENTRY(TitleEntry), "");
gtk_entry_set_text(GTK_ENTRY(ArtistEntry), "");
+ gtk_entry_set_text(GTK_ENTRY(AlbumArtistEntry), "");
gtk_entry_set_text(GTK_ENTRY(AlbumEntry), "");
gtk_entry_set_text(GTK_ENTRY(DiscNumberEntry), "");
gtk_entry_set_text(GTK_ENTRY(YearEntry), "");
diff --git a/src/easytag.h b/src/easytag.h
index 9823c75..742c702 100644
--- a/src/easytag.h
+++ b/src/easytag.h
@@ -88,6 +88,7 @@ GtkWidget *TagFrame;
GtkWidget *TagNoteBook;
GtkWidget *TitleEntry;
GtkWidget *ArtistEntry;
+GtkWidget *AlbumArtistEntry;
GtkWidget *AlbumEntry;
GtkWidget *DiscNumberEntry;
GtkWidget *YearEntry;
@@ -108,6 +109,7 @@ GtkListStore *PictureEntryModel;
// Labels
GtkWidget *TitleLabel;
GtkWidget *ArtistLabel;
+GtkWidget *AlbumArtistLabel;
GtkWidget *AlbumLabel;
GtkWidget *DiscNumberLabel;
GtkWidget *YearLabel;
@@ -123,6 +125,7 @@ GtkWidget *PictureLabel;
// Mini buttons
GtkWidget *TitleMButton;
GtkWidget *ArtistMButton;
+GtkWidget *AlbumArtistMButton;
GtkWidget *AlbumMButton;
GtkWidget *DiscNumberMButton;
GtkWidget *YearMButton;
diff --git a/src/et_core.c b/src/et_core.c
index d8d1930..e7075ba 100644
--- a/src/et_core.c
+++ b/src/et_core.c
@@ -377,6 +377,7 @@ void ET_Initialize_File_Tag_Item (File_Tag *FileTag)
FileTag->saved = FALSE;
FileTag->title = NULL;
FileTag->artist = NULL;
+ FileTag->album_artist= NULL;
FileTag->album = NULL;
FileTag->disc_number = NULL;
FileTag->track = NULL;
@@ -945,7 +946,13 @@ GList *ET_Sort_File_List (GList *ETFileList, ET_Sorting_Type Sorting_Type)
case SORTING_BY_DESCENDING_ARTIST:
etfilelist = g_list_sort(etfilelist,(GCompareFunc)ET_Comp_Func_Sort_File_By_Descending_Artist);
break;
- case SORTING_BY_ASCENDING_ALBUM:
+ case SORTING_BY_ASCENDING_ALBUM_ARTIST:
+ etfilelist = g_list_sort(etfilelist,(GCompareFunc)ET_Comp_Func_Sort_File_By_Ascending_Album_Artist);
+ break;
+ case SORTING_BY_DESCENDING_ALBUM_ARTIST:
+ etfilelist = g_list_sort(etfilelist,(GCompareFunc)ET_Comp_Func_Sort_File_By_Descending_Album_Artist);
+ break;
+ case SORTING_BY_ASCENDING_ALBUM:
etfilelist = g_list_sort(etfilelist,(GCompareFunc)ET_Comp_Func_Sort_File_By_Ascending_Album);
break;
case SORTING_BY_DESCENDING_ALBUM:
@@ -1228,9 +1235,50 @@ gint ET_Comp_Func_Sort_File_By_Ascending_Artist (ET_File *ETFile1, ET_File *ETFi
*/
gint ET_Comp_Func_Sort_File_By_Descending_Artist (ET_File *ETFile1, ET_File *ETFile2)
{
- return ET_Comp_Func_Sort_File_By_Ascending_Album(ETFile2,ETFile1);
+ return ET_Comp_Func_Sort_File_By_Ascending_Artist(ETFile2,ETFile1);
}
+/*
+ * Comparison function for sorting by ascending album artist.
+ */
+gint ET_Comp_Func_Sort_File_By_Ascending_Album_Artist (ET_File *ETFile1, ET_File *ETFile2)
+{
+ // Compare pointers just in case they are the same (e.g. both are NULL)
+ if ((ETFile1->FileTag->data == ETFile2->FileTag->data)
+ || (((File_Tag *)ETFile1->FileTag->data)->album_artist == ((File_Tag *)ETFile2->FileTag->data)->album_artist))
+ return 0;
+
+ if ( !ETFile1->FileTag->data || !((File_Tag *)ETFile1->FileTag->data)->album_artist )
+ return -1;
+ if ( !ETFile2->FileTag->data || !((File_Tag *)ETFile2->FileTag->data)->album_artist )
+ return 1;
+
+ if (SORTING_FILE_CASE_SENSITIVE)
+ {
+ if ( strcmp(((File_Tag *)ETFile1->FileTag->data)->album_artist,((File_Tag *)ETFile2->FileTag->data)->album_artist) == 0 )
+ // Second criterion
+ return ET_Comp_Func_Sort_File_By_Ascending_Artist(ETFile1,ETFile2);
+ else
+ // First criterion
+ return strcmp(((File_Tag *)ETFile1->FileTag->data)->album_artist,((File_Tag *)ETFile2->FileTag->data)->album_artist);
+ }else
+ {
+ if ( strcasecmp(((File_Tag *)ETFile1->FileTag->data)->album_artist,((File_Tag *)ETFile2->FileTag->data)->album_artist) == 0 )
+ // Second criterion
+ return ET_Comp_Func_Sort_File_By_Ascending_Artist(ETFile1,ETFile2);
+ else
+ // First criterion
+ return strcasecmp(((File_Tag *)ETFile1->FileTag->data)->album_artist,((File_Tag *)ETFile2->FileTag->data)->album_artist);
+ }
+}
+
+/*
+ * Comparison function for sorting by descending album artist.
+ */
+gint ET_Comp_Func_Sort_File_By_Descending_Album_Artist (ET_File *ETFile1, ET_File *ETFile2)
+{
+ return ET_Comp_Func_Sort_File_By_Ascending_Album_Artist(ETFile2,ETFile1);
+}
/*
* Comparison function for sorting by ascending album.
@@ -2107,6 +2155,7 @@ gboolean ET_Free_File_Tag_Item (File_Tag *FileTag)
g_free(FileTag->title);
g_free(FileTag->artist);
+ g_free(FileTag->album_artist);
g_free(FileTag->album);
g_free(FileTag->disc_number);
g_free(FileTag->year);
@@ -2277,6 +2326,15 @@ gboolean ET_Copy_File_Tag_Item (ET_File *ETFile, File_Tag *FileTag)
FileTag->artist = NULL;
}
+ if (FileTagCur->album_artist)
+ {
+ FileTag->album_artist = g_strdup(FileTagCur->album_artist);
+ }else
+ {
+ g_free(FileTag->album_artist);
+ FileTag->album_artist = NULL;
+ }
+
if (FileTagCur->album)
{
FileTag->album = g_strdup(FileTagCur->album);
@@ -2768,6 +2826,15 @@ gboolean ET_Display_File_Tag_To_UI (ET_File *ETFile)
}else
gtk_entry_set_text(GTK_ENTRY(ArtistEntry),"");
+ /* Show album artist */
+ if (FileTag && FileTag->album_artist)
+ {
+ gchar *tmp = Try_To_Validate_Utf8_String(FileTag->album_artist);
+ gtk_entry_set_text(GTK_ENTRY(AlbumArtistEntry), tmp);
+ g_free(tmp);
+ }else
+ gtk_entry_set_text(GTK_ENTRY(AlbumArtistEntry),"");
+
/* Show album */
if (FileTag && FileTag->album)
{
@@ -3255,6 +3322,18 @@ gboolean ET_Save_File_Tag_From_UI (File_Tag *FileTag)
g_free(buffer);
}
+ /* Album Artist */
+ buffer = g_strdup(gtk_entry_get_text(GTK_ENTRY(AlbumArtistEntry)));
+ Strip_String(buffer);
+
+ if ( g_utf8_strlen(buffer, -1) > 0 )
+ FileTag->album_artist = buffer;
+ else
+ {
+ FileTag->album_artist = NULL;
+ g_free(buffer);
+ }
+
/* Album */
buffer = g_strdup(gtk_entry_get_text(GTK_ENTRY(AlbumEntry)));
Strip_String(buffer);
@@ -3478,6 +3557,16 @@ gboolean ET_Save_File_Tag_Internal (ET_File *ETFile, File_Tag *FileTag)
FileTag->artist = NULL;
}
+ /* Album Artist */
+ if ( FileTagCur->album_artist && g_utf8_strlen(FileTagCur->album_artist, -1)>0 )
+ {
+ FileTag->album_artist = g_strdup(FileTagCur->album_artist);
+ Strip_String(FileTag->album_artist);
+ } else
+ {
+ FileTag->album_artist = NULL;
+ }
+
/* Album */
if ( FileTagCur->album && g_utf8_strlen(FileTagCur->album, -1)>0 )
@@ -3926,6 +4015,11 @@ gboolean ET_Detect_Changes_Of_File_Tag (File_Tag *FileTag1, File_Tag *FileTag2)
if (!FileTag1->artist && FileTag2->artist && g_utf8_strlen(FileTag2->artist, -1)>0 ) return TRUE;
if ( FileTag1->artist && FileTag2->artist && g_utf8_collate(FileTag1->artist,FileTag2->artist)!=0 ) return TRUE;
+ /* Album Artist */
+ if ( FileTag1->album_artist && !FileTag2->album_artist && g_utf8_strlen(FileTag1->album_artist, -1)>0 ) return TRUE;
+ if (!FileTag1->album_artist && FileTag2->album_artist && g_utf8_strlen(FileTag2->album_artist, -1)>0 ) return TRUE;
+ if ( FileTag1->album_artist && FileTag2->album_artist && g_utf8_collate(FileTag1->album_artist,FileTag2->album_artist)!=0 ) return TRUE;
+
/* Album */
if ( FileTag1->album && !FileTag2->album && g_utf8_strlen(FileTag1->album, -1)>0 ) return TRUE;
if (!FileTag1->album && FileTag2->album && g_utf8_strlen(FileTag2->album, -1)>0 ) return TRUE;
@@ -4755,6 +4849,7 @@ void ET_Debug_Print_File_List (GList *ETFileList, gchar *file, gint line, gchar
g_print("| |-> saved : '%d'\n",((File_Tag *)filetaglist->data)->saved);
g_print("| |-> title : '%s'\n",((File_Tag *)filetaglist->data)->title ? ((File_Tag *)filetaglist->data)->title : "");
g_print("| |-> artist : '%s'\n",((File_Tag *)filetaglist->data)->artist ? ((File_Tag *)filetaglist->data)->artist : "");
+ g_print("| |-> album_artist: '%s'\n",((File_Tag *)filetaglist->data)->album_artist? ((File_Tag *)filetaglist->data)->album_artist : "");
g_print("| |-> album : '%s'\n",((File_Tag *)filetaglist->data)->album ? ((File_Tag *)filetaglist->data)->album : "");
g_print("| |-> disc_number : '%s'\n",((File_Tag *)filetaglist->data)->disc_number ? ((File_Tag *)filetaglist->data)->disc_number : "");
g_print("| |-> year : '%s'\n",((File_Tag *)filetaglist->data)->year ? ((File_Tag *)filetaglist->data)->year : "");
diff --git a/src/et_core.h b/src/et_core.h
index 63f9565..1c701b9 100644
--- a/src/et_core.h
+++ b/src/et_core.h
@@ -74,6 +74,8 @@ typedef enum
SORTING_BY_DESCENDING_TITLE,
SORTING_BY_ASCENDING_ARTIST,
SORTING_BY_DESCENDING_ARTIST,
+ SORTING_BY_ASCENDING_ALBUM_ARTIST,
+ SORTING_BY_DESCENDING_ALBUM_ARTIST,
SORTING_BY_ASCENDING_ALBUM,
SORTING_BY_DESCENDING_ALBUM,
SORTING_BY_ASCENDING_YEAR,
@@ -181,6 +183,7 @@ struct _File_Tag
gchar *title; /* Title of track */
gchar *artist; /* Artist name */
+ gchar *album_artist; /* Album Artist */
gchar *album; /* Album name */
gchar *disc_number; /* Disc number */
gchar *year; /* Year of track */
@@ -430,6 +433,8 @@ gint ET_Comp_Func_Sort_File_By_Ascending_Title (ET_File *ETFile1, ET_
gint ET_Comp_Func_Sort_File_By_Descending_Title (ET_File *ETFile1, ET_File *ETFile2);
gint ET_Comp_Func_Sort_File_By_Ascending_Artist (ET_File *ETFile1, ET_File *ETFile2);
gint ET_Comp_Func_Sort_File_By_Descending_Artist (ET_File *ETFile1, ET_File *ETFile2);
+gint ET_Comp_Func_Sort_File_By_Ascending_Album_Artist (ET_File *ETFile1, ET_File *ETFile2);
+gint ET_Comp_Func_Sort_File_By_Descending_Album_Artist (ET_File *ETFile1, ET_File *ETFile2);
gint ET_Comp_Func_Sort_File_By_Ascending_Album (ET_File *ETFile1, ET_File *ETFile2);
gint ET_Comp_Func_Sort_File_By_Descending_Album (ET_File *ETFile1, ET_File *ETFile2);
gint ET_Comp_Func_Sort_File_By_Ascending_Year (ET_File *ETFile1, ET_File *ETFile2);
diff --git a/src/id3_tag.c b/src/id3_tag.c
index 61c95c0..4956179 100644
--- a/src/id3_tag.c
+++ b/src/id3_tag.c
@@ -100,6 +100,7 @@ gboolean Id3tag_Write_File_v23Tag (ET_File *ETFile)
gint number_of_frames;
gboolean has_title = FALSE;
gboolean has_artist = FALSE;
+ gboolean has_album_artist= FALSE;
gboolean has_album = FALSE;
gboolean has_disc_number = FALSE;
gboolean has_year = FALSE;
@@ -194,6 +195,18 @@ gboolean Id3tag_Write_File_v23Tag (ET_File *ETFile)
has_artist = TRUE;
}
+ /****************
+ * Album Artist *
+ ***************/
+ while ( (id3_frame = ID3Tag_FindFrameWithID(id3_tag,ID3FID_BAND)) )
+ ID3Tag_RemoveFrame(id3_tag,id3_frame);
+ if (FileTag->album_artist && g_utf8_strlen(FileTag->album_artist, -1) > 0)
+ {
+ id3_frame = ID3Frame_NewID(ID3FID_BAND);
+ ID3Tag_AttachFrame(id3_tag,id3_frame);
+ Id3tag_Set_Field(id3_frame, ID3FN_TEXT, FileTag->album_artist);
+ has_album_artist = TRUE;
+ }
/*********
* Album *
@@ -476,7 +489,7 @@ gboolean Id3tag_Write_File_v23Tag (ET_File *ETFile)
* is set to 1, we strip the ID3v1.x and ID3v2 tags. Else, write ID3v2 and/or ID3v1
*/
if ( STRIP_TAG_WHEN_EMPTY_FIELDS
- && !has_title && !has_artist && !has_album && !has_year && !has_track
+ && !has_title && !has_artist && !has_album_artist && !has_album && !has_year && !has_track
&& !has_genre && !has_composer && !has_orig_artist && !has_copyright && !has_url
&& !has_encoded_by && !has_picture && !has_comment && !has_disc_number)//&& !has_song_len )
{
@@ -1092,6 +1105,7 @@ void Id3tag_Prepare_ID3v1 (ID3Tag *id3_tag)
if (frameid != ID3FID_TITLE
&& frameid != ID3FID_LEADARTIST
+ && frameid != ID3FID_BAND
&& frameid != ID3FID_ALBUM
&& frameid != ID3FID_YEAR
&& frameid != ID3FID_TRACKNUM
@@ -1296,7 +1310,7 @@ gboolean Id3tag_Check_If_Id3lib_Is_Bugged (void)
// Use a Chinese character instead of the latin-1 character as in Id3tag_Set_Field()
// we try to convert the string to ISO-8859-1 even in the Unicode mode.
//Id3tag_Set_Field(id3_frame, ID3FN_TEXT, "é"); // This latin-1 character is written in Unicode as 'E9 FF' instead of 'E9 00' if bugged
- Id3tag_Set_Field(id3_frame, ID3FN_TEXT, "ã‚°"); // This Chinese character is written in Unicode as 'FF FE B0 FF' instead of 'FF FE B0 30' if bugged
+ Id3tag_Set_Field(id3_frame, ID3FN_TEXT, "ã°"); // This Chinese character is written in Unicode as 'FF FE B0 FF' instead of 'FF FE B0 30' if bugged
// Update the tag
ID3Tag_UpdateByTagType(id3_tag,ID3TT_ID3V2);
@@ -1318,7 +1332,7 @@ gboolean Id3tag_Check_If_Id3lib_Is_Bugged (void)
// Same string found? if yes => not bugged
//if ( result && strcmp(result,"é")!=0 )
- if ( result && strcmp(result,"ã‚°")!=0 )
+ if ( result && strcmp(result,"ã°")!=0 )
{
return TRUE;
}
diff --git a/src/id3v24_tag.c b/src/id3v24_tag.c
index 29cbb1f..823a5b6 100644
--- a/src/id3v24_tag.c
+++ b/src/id3v24_tag.c
@@ -220,6 +220,12 @@ gboolean Id3tag_Read_File_Tag (gchar *filename, File_Tag *FileTag)
if ( (frame = id3_tag_findframe(tag, ID3_FRAME_ARTIST, 0)) )
update |= libid3tag_Get_Frame_Str(frame, EASYTAG_ID3_FIELD_STRINGLIST, &FileTag->artist);
+ /*****************
+ * Album Artist (TPE2) *
+ *****************/
+ if ( (frame = id3_tag_findframe(tag, "TPE2", 0)) )
+ update |= libid3tag_Get_Frame_Str(frame, EASYTAG_ID3_FIELD_STRINGLIST, &FileTag->album_artist);
+
/****************
* Album (TALB) *
****************/
@@ -871,6 +877,11 @@ gboolean Id3tag_Write_File_v24Tag (ET_File *ETFile)
**********/
etag_set_tags(FileTag->artist, ID3_FRAME_ARTIST, ID3_FIELD_TYPE_STRINGLIST, v1tag, v2tag, &strip_tags);
+ /**********
+ * Album Artist *
+ **********/
+ etag_set_tags(FileTag->album_artist, "TPE2", ID3_FIELD_TYPE_STRINGLIST, NULL, v2tag, &strip_tags);
+
/*********
* Album *
*********/
diff --git a/src/misc.c b/src/misc.c
index 91eab11..476826a 100644
--- a/src/misc.c
+++ b/src/misc.c
@@ -82,6 +82,7 @@ enum
SEARCH_RESULT_FILENAME = 0,
SEARCH_RESULT_TITLE,
SEARCH_RESULT_ARTIST,
+ SEARCH_RESULT_ALBUM_ARTIST,
SEARCH_RESULT_ALBUM,
SEARCH_RESULT_DISC_NUMBER,
SEARCH_RESULT_YEAR,
@@ -98,6 +99,7 @@ enum
SEARCH_RESULT_FILENAME_WEIGHT,
SEARCH_RESULT_TITLE_WEIGHT,
SEARCH_RESULT_ARTIST_WEIGHT,
+ SEARCH_RESULT_ALBUM_ARTIST_WEIGHT,
SEARCH_RESULT_ALBUM_WEIGHT,
SEARCH_RESULT_DISC_NUMBER_WEIGHT,
SEARCH_RESULT_YEAR_WEIGHT,
@@ -114,6 +116,7 @@ enum
SEARCH_RESULT_FILENAME_FOREGROUND,
SEARCH_RESULT_TITLE_FOREGROUND,
SEARCH_RESULT_ARTIST_FOREGROUND,
+ SEARCH_RESULT_ALBUM_ARTIST_FOREGROUND,
SEARCH_RESULT_ALBUM_FOREGROUND,
SEARCH_RESULT_DISC_NUMBER_FOREGROUND,
SEARCH_RESULT_YEAR_FOREGROUND,
@@ -1911,6 +1914,7 @@ void Open_Search_File_Window (void)
gchar *SearchResultList_Titles[] = { N_("File Name"),
N_("Title"),
N_("Artist"),
+ N_("Album Artist"),
N_("Album"),
N_("CD"),
N_("Year"),
@@ -2007,7 +2011,8 @@ void Open_Search_File_Window (void)
G_TYPE_STRING, /* Filename */
G_TYPE_STRING, /* Title */
G_TYPE_STRING, /* Artist */
- G_TYPE_STRING, /* Album */
+ G_TYPE_STRING, /* Album Artist */
+ G_TYPE_STRING, /* Album */
G_TYPE_STRING, /* Disc Number */
G_TYPE_STRING, /* Year */
G_TYPE_STRING, /* Track + Track Total */
@@ -2022,7 +2027,8 @@ void Open_Search_File_Window (void)
G_TYPE_INT, /* Font Weight for Filename */
G_TYPE_INT, /* Font Weight for Title */
G_TYPE_INT, /* Font Weight for Artist */
- G_TYPE_INT, /* Font Weight for Album */
+ G_TYPE_INT, /* Font Weight for Album Artist */
+ G_TYPE_INT, /* Font Weight for Album */
G_TYPE_INT, /* Font Weight for Disc Number */
G_TYPE_INT, /* Font Weight for Year */
G_TYPE_INT, /* Font Weight for Track + Track Total */
@@ -2037,7 +2043,8 @@ void Open_Search_File_Window (void)
GDK_TYPE_COLOR, /* Color Weight for Filename */
GDK_TYPE_COLOR, /* Color Weight for Title */
GDK_TYPE_COLOR, /* Color Weight for Artist */
- GDK_TYPE_COLOR, /* Color Weight for Album */
+ GDK_TYPE_COLOR, /* Color Weight for Album Artist */
+ GDK_TYPE_COLOR, /* Color Weight for Album */
GDK_TYPE_COLOR, /* Color Weight for Disc Number */
GDK_TYPE_COLOR, /* Color Weight for Year */
GDK_TYPE_COLOR, /* Color Weight for Track + Track Total */
@@ -2079,8 +2086,17 @@ void Open_Search_File_Window (void)
gtk_tree_view_append_column(GTK_TREE_VIEW(SearchResultList), column);
gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- renderer = gtk_cell_renderer_text_new(); /* Album */
+ renderer = gtk_cell_renderer_text_new(); /* Album Artist */
column = gtk_tree_view_column_new_with_attributes(_(SearchResultList_Titles[3]), renderer,
+ "text", SEARCH_RESULT_ALBUM_ARTIST,
+ "weight", SEARCH_RESULT_ALBUM_ARTIST_WEIGHT,
+ "foreground-gdk", SEARCH_RESULT_ALBUM_ARTIST_FOREGROUND,
+ NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(SearchResultList), column);
+ gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
+
+ renderer = gtk_cell_renderer_text_new(); /* Album */
+ column = gtk_tree_view_column_new_with_attributes(_(SearchResultList_Titles[4]), renderer,
"text", SEARCH_RESULT_ALBUM,
"weight", SEARCH_RESULT_ALBUM_WEIGHT,
"foreground-gdk", SEARCH_RESULT_ALBUM_FOREGROUND,
@@ -2089,7 +2105,7 @@ void Open_Search_File_Window (void)
gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
renderer = gtk_cell_renderer_text_new(); /* Disc Number */
- column = gtk_tree_view_column_new_with_attributes(_(SearchResultList_Titles[4]), renderer,
+ column = gtk_tree_view_column_new_with_attributes(_(SearchResultList_Titles[5]), renderer,
"text", SEARCH_RESULT_DISC_NUMBER,
"weight", SEARCH_RESULT_DISC_NUMBER_WEIGHT,
"foreground-gdk", SEARCH_RESULT_DISC_NUMBER_FOREGROUND,
@@ -2098,7 +2114,7 @@ void Open_Search_File_Window (void)
gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
renderer = gtk_cell_renderer_text_new(); /* Year */
- column = gtk_tree_view_column_new_with_attributes(_(SearchResultList_Titles[5]), renderer,
+ column = gtk_tree_view_column_new_with_attributes(_(SearchResultList_Titles[6]), renderer,
"text", SEARCH_RESULT_YEAR,
"weight", SEARCH_RESULT_YEAR_WEIGHT,
"foreground-gdk", SEARCH_RESULT_YEAR_FOREGROUND,
@@ -2107,7 +2123,7 @@ void Open_Search_File_Window (void)
gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
renderer = gtk_cell_renderer_text_new(); /* Track */
- column = gtk_tree_view_column_new_with_attributes(_(SearchResultList_Titles[6]), renderer,
+ column = gtk_tree_view_column_new_with_attributes(_(SearchResultList_Titles[7]), renderer,
"text", SEARCH_RESULT_TRACK,
"weight", SEARCH_RESULT_TRACK_WEIGHT,
"foreground-gdk", SEARCH_RESULT_TRACK_FOREGROUND,
@@ -2116,7 +2132,7 @@ void Open_Search_File_Window (void)
gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
renderer = gtk_cell_renderer_text_new(); /* Genre */
- column = gtk_tree_view_column_new_with_attributes(_(SearchResultList_Titles[7]), renderer,
+ column = gtk_tree_view_column_new_with_attributes(_(SearchResultList_Titles[8]), renderer,
"text", SEARCH_RESULT_GENRE,
"weight", SEARCH_RESULT_GENRE_WEIGHT,
"foreground-gdk", SEARCH_RESULT_GENRE_FOREGROUND,
@@ -2125,7 +2141,7 @@ void Open_Search_File_Window (void)
gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
renderer = gtk_cell_renderer_text_new(); /* Comment */
- column = gtk_tree_view_column_new_with_attributes(_(SearchResultList_Titles[8]), renderer,
+ column = gtk_tree_view_column_new_with_attributes(_(SearchResultList_Titles[9]), renderer,
"text", SEARCH_RESULT_COMMENT,
"weight", SEARCH_RESULT_COMMENT_WEIGHT,
"foreground-gdk", SEARCH_RESULT_COMMENT_FOREGROUND,
@@ -2134,7 +2150,7 @@ void Open_Search_File_Window (void)
gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
renderer = gtk_cell_renderer_text_new(); /* Composer */
- column = gtk_tree_view_column_new_with_attributes(_(SearchResultList_Titles[9]), renderer,
+ column = gtk_tree_view_column_new_with_attributes(_(SearchResultList_Titles[10]), renderer,
"text", SEARCH_RESULT_COMPOSER,
"weight", SEARCH_RESULT_COMPOSER_WEIGHT,
"foreground-gdk", SEARCH_RESULT_COMPOSER_FOREGROUND,
@@ -2143,7 +2159,7 @@ void Open_Search_File_Window (void)
gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
renderer = gtk_cell_renderer_text_new(); /* Orig. Artist */
- column = gtk_tree_view_column_new_with_attributes(_(SearchResultList_Titles[10]), renderer,
+ column = gtk_tree_view_column_new_with_attributes(_(SearchResultList_Titles[11]), renderer,
"text", SEARCH_RESULT_ORIG_ARTIST,
"weight", SEARCH_RESULT_ORIG_ARTIST_WEIGHT,
"foreground-gdk", SEARCH_RESULT_ORIG_ARTIST_FOREGROUND,
@@ -2152,7 +2168,7 @@ void Open_Search_File_Window (void)
gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
renderer = gtk_cell_renderer_text_new(); /* Copyright */
- column = gtk_tree_view_column_new_with_attributes(_(SearchResultList_Titles[11]), renderer,
+ column = gtk_tree_view_column_new_with_attributes(_(SearchResultList_Titles[12]), renderer,
"text", SEARCH_RESULT_COPYRIGHT,
"weight", SEARCH_RESULT_COPYRIGHT_WEIGHT,
"foreground-gdk", SEARCH_RESULT_COPYRIGHT_FOREGROUND,
@@ -2161,7 +2177,7 @@ void Open_Search_File_Window (void)
gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
renderer = gtk_cell_renderer_text_new(); /* URL */
- column = gtk_tree_view_column_new_with_attributes(_(SearchResultList_Titles[12]), renderer,
+ column = gtk_tree_view_column_new_with_attributes(_(SearchResultList_Titles[13]), renderer,
"text", SEARCH_RESULT_URL,
"weight", SEARCH_RESULT_URL_WEIGHT,
"foreground-gdk", SEARCH_RESULT_URL_FOREGROUND,
@@ -2170,7 +2186,7 @@ void Open_Search_File_Window (void)
gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
renderer = gtk_cell_renderer_text_new(); /* Encoded by */
- column = gtk_tree_view_column_new_with_attributes(_(SearchResultList_Titles[13]), renderer,
+ column = gtk_tree_view_column_new_with_attributes(_(SearchResultList_Titles[14]), renderer,
"text", SEARCH_RESULT_ENCODED_BY,
"weight", SEARCH_RESULT_ENCODED_BY_WEIGHT,
"foreground-gdk", SEARCH_RESULT_ENCODED_BY_FOREGROUND,
@@ -2284,7 +2300,7 @@ void Search_File (GtkWidget *search_button)
ET_File *ETFile;
gchar *msg;
gchar *temp = NULL;
- gchar *title2, *artist2, *album2, *disc_number2, *year2, *track2,
+ gchar *title2, *artist2, *album_artist2, *album2, *disc_number2, *year2, *track2,
*track_total2, *genre2, *comment2, *composer2, *orig_artist2,
*copyright2, *url2, *encoded_by2, *string_to_search2;
gint resultCount = 0;
@@ -2351,6 +2367,7 @@ void Search_File (GtkWidget *search_button)
// Duplicate and convert the strings into UTF-8 in loxer case
if (FileTag->title) title2 = g_utf8_casefold(FileTag->title, -1); else title2 = NULL;
if (FileTag->artist) artist2 = g_utf8_casefold(FileTag->artist, -1); else artist2 = NULL;
+ if (FileTag->album_artist) album_artist2 = g_utf8_casefold(FileTag->album_artist, -1); else album_artist2= NULL;
if (FileTag->album) album2 = g_utf8_casefold(FileTag->album, -1); else album2 = NULL;
if (FileTag->disc_number) disc_number2 = g_utf8_casefold(FileTag->disc_number, -1); else disc_number2 = NULL;
if (FileTag->year) year2 = g_utf8_casefold(FileTag->year, -1); else year2 = NULL;
@@ -2370,6 +2387,7 @@ void Search_File (GtkWidget *search_button)
// Duplicate and convert the strings into UTF-8
title2 = g_strdup(FileTag->title);
artist2 = g_strdup(FileTag->artist);
+ album_artist2= g_strdup(FileTag->album_artist);
album2 = g_strdup(FileTag->album);
disc_number2 = g_strdup(FileTag->disc_number);
year2 = g_strdup(FileTag->year);
@@ -2388,6 +2406,7 @@ void Search_File (GtkWidget *search_button)
// FIX ME : should use UTF-8 functions?
if ( (title2 && strstr(title2, string_to_search2) )
|| (artist2 && strstr(artist2, string_to_search2) )
+ || (album_artist2 && strstr(album_artist2,string_to_search2) )
|| (album2 && strstr(album2, string_to_search2) )
|| (disc_number2 && strstr(disc_number2, string_to_search2) )
|| (year2 && strstr(year2, string_to_search2) )
@@ -2405,6 +2424,7 @@ void Search_File (GtkWidget *search_button)
}
g_free(title2);
g_free(artist2);
+ g_free(album_artist2);
g_free(album2);
g_free(disc_number2);
g_free(year2);
@@ -2468,7 +2488,9 @@ void Add_Row_To_Search_Result_List(ET_File *ETFile,const gchar *string_to_search
SearchResultList_Text[SEARCH_RESULT_TITLE] = g_strdup(((File_Tag *)ETFile->FileTag->data)->title);
// Artist
SearchResultList_Text[SEARCH_RESULT_ARTIST] = g_strdup(((File_Tag *)ETFile->FileTag->data)->artist);
- // Album
+ // Album Artist
+ SearchResultList_Text[SEARCH_RESULT_ALBUM_ARTIST]= g_strdup(((File_Tag *)ETFile->FileTag->data)->album_artist);
+ // Album
SearchResultList_Text[SEARCH_RESULT_ALBUM] = g_strdup(((File_Tag *)ETFile->FileTag->data)->album);
// Disc Number
SearchResultList_Text[SEARCH_RESULT_DISC_NUMBER] = g_strdup(((File_Tag *)ETFile->FileTag->data)->disc_number);
@@ -2552,6 +2574,7 @@ void Add_Row_To_Search_Result_List(ET_File *ETFile,const gchar *string_to_search
SEARCH_RESULT_FILENAME, SearchResultList_Text[SEARCH_RESULT_FILENAME],
SEARCH_RESULT_TITLE, SearchResultList_Text[SEARCH_RESULT_TITLE],
SEARCH_RESULT_ARTIST, SearchResultList_Text[SEARCH_RESULT_ARTIST],
+ SEARCH_RESULT_ALBUM_ARTIST,SearchResultList_Text[SEARCH_RESULT_ALBUM_ARTIST],
SEARCH_RESULT_ALBUM, SearchResultList_Text[SEARCH_RESULT_ALBUM],
SEARCH_RESULT_DISC_NUMBER, SearchResultList_Text[SEARCH_RESULT_DISC_NUMBER],
SEARCH_RESULT_YEAR, SearchResultList_Text[SEARCH_RESULT_YEAR],
@@ -2567,7 +2590,8 @@ void Add_Row_To_Search_Result_List(ET_File *ETFile,const gchar *string_to_search
SEARCH_RESULT_FILENAME_WEIGHT, SearchResultList_Weight[SEARCH_RESULT_FILENAME],
SEARCH_RESULT_TITLE_WEIGHT, SearchResultList_Weight[SEARCH_RESULT_TITLE],
SEARCH_RESULT_ARTIST_WEIGHT, SearchResultList_Weight[SEARCH_RESULT_ARTIST],
- SEARCH_RESULT_ALBUM_WEIGHT, SearchResultList_Weight[SEARCH_RESULT_ALBUM],
+ SEARCH_RESULT_ALBUM_ARTIST_WEIGHT, SearchResultList_Weight[SEARCH_RESULT_ALBUM_ARTIST],
+ SEARCH_RESULT_ALBUM_WEIGHT, SearchResultList_Weight[SEARCH_RESULT_ALBUM],
SEARCH_RESULT_DISC_NUMBER_WEIGHT, SearchResultList_Weight[SEARCH_RESULT_DISC_NUMBER],
SEARCH_RESULT_YEAR_WEIGHT, SearchResultList_Weight[SEARCH_RESULT_YEAR],
SEARCH_RESULT_TRACK_WEIGHT, SearchResultList_Weight[SEARCH_RESULT_TRACK],
@@ -2582,7 +2606,8 @@ void Add_Row_To_Search_Result_List(ET_File *ETFile,const gchar *string_to_search
SEARCH_RESULT_FILENAME_FOREGROUND, SearchResultList_Color[SEARCH_RESULT_FILENAME],
SEARCH_RESULT_TITLE_FOREGROUND, SearchResultList_Color[SEARCH_RESULT_TITLE],
SEARCH_RESULT_ARTIST_FOREGROUND, SearchResultList_Color[SEARCH_RESULT_ARTIST],
- SEARCH_RESULT_ALBUM_FOREGROUND, SearchResultList_Color[SEARCH_RESULT_ALBUM],
+ SEARCH_RESULT_ALBUM_ARTIST_FOREGROUND, SearchResultList_Color[SEARCH_RESULT_ALBUM_ARTIST],
+ SEARCH_RESULT_ALBUM_FOREGROUND, SearchResultList_Color[SEARCH_RESULT_ALBUM],
SEARCH_RESULT_DISC_NUMBER_FOREGROUND, SearchResultList_Color[SEARCH_RESULT_DISC_NUMBER],
SEARCH_RESULT_YEAR_FOREGROUND, SearchResultList_Color[SEARCH_RESULT_YEAR],
SEARCH_RESULT_TRACK_FOREGROUND, SearchResultList_Color[SEARCH_RESULT_TRACK],
@@ -2601,6 +2626,7 @@ void Add_Row_To_Search_Result_List(ET_File *ETFile,const gchar *string_to_search
g_free(SearchResultList_Text[SEARCH_RESULT_FILENAME]);
g_free(SearchResultList_Text[SEARCH_RESULT_TITLE]);
g_free(SearchResultList_Text[SEARCH_RESULT_ARTIST]);
+ g_free(SearchResultList_Text[SEARCH_RESULT_ALBUM_ARTIST]);
g_free(SearchResultList_Text[SEARCH_RESULT_ALBUM]);
g_free(SearchResultList_Text[SEARCH_RESULT_DISC_NUMBER]);
g_free(SearchResultList_Text[SEARCH_RESULT_YEAR]);
diff --git a/src/scan.c b/src/scan.c
index c0cb13f..b41769c 100644
--- a/src/scan.c
+++ b/src/scan.c
@@ -67,6 +67,7 @@ GtkListStore *ScanTagListModel;
GtkWidget *ProcessFileNameField;
GtkWidget *ProcessTitleField;
GtkWidget *ProcessArtistField;
+GtkWidget *ProcessAlbumArtistField;
GtkWidget *ProcessAlbumField;
GtkWidget *ProcessGenreField;
GtkWidget *ProcessCommentField;
@@ -1162,6 +1163,23 @@ void Scan_Process_Fields (ET_File *ETFile)
g_free(string);
}
+ // Album Artist field
+ if (st_filetag->album_artist && GTK_TOGGLE_BUTTON(ProcessAlbumArtistField)->active)
+ {
+ if (!FileTag)
+ {
+ FileTag = ET_File_Tag_Item_New();
+ ET_Copy_File_Tag_Item(ETFile,FileTag);
+ }
+
+ string = g_strdup(st_filetag->album_artist);
+
+ Scan_Process_Fields_Functions(&string);
+
+ ET_Set_Field_File_Tag_Item(&FileTag->album_artist,string);
+
+ g_free(string);
+ }
// Album field
if (st_filetag->album && GTK_TOGGLE_BUTTON(ProcessAlbumField)->active)
{
@@ -2238,6 +2256,8 @@ gchar **Scan_Return_File_Tag_Field_From_Mask_Code (File_Tag *FileTag, gchar code
return &FileTag->url;
case 'e': /* Encoded by */
return &FileTag->encoded_by;
+ case 'z': /* Album Artist */
+ return &FileTag->album_artist;
case 'i': /* Ignored */
return NULL;
default:
@@ -2550,7 +2570,10 @@ void Open_ScannerWindow (gint scanner_type)
// Advice for Translators : set the first letter of artist translated
ProcessArtistField = gtk_toggle_button_new_with_label( _("Ar"));
gtk_tooltips_set_tip(Tips,ProcessArtistField, _("Process file artist field"),NULL);
- // Advice for Translators : set the first letter of album translated
+ // Advice for Translators : set the first letter of album artist translated
+ ProcessAlbumArtistField = gtk_toggle_button_new_with_label( _("AA"));
+ gtk_tooltips_set_tip(Tips,ProcessAlbumArtistField, _("Process album artist field"),NULL);
+ // Advice for Translators : set the first letter of album translated
ProcessAlbumField = gtk_toggle_button_new_with_label( _("Al"));
gtk_tooltips_set_tip(Tips,ProcessAlbumField, _("Process album field"),NULL);
// Advice for Translators : set the first letter of genre translated
@@ -2577,6 +2600,7 @@ void Open_ScannerWindow (gint scanner_type)
gtk_box_pack_start(GTK_BOX(hbox),ProcessFileNameField, TRUE,TRUE,2);
gtk_box_pack_start(GTK_BOX(hbox),ProcessTitleField, TRUE,TRUE,2);
gtk_box_pack_start(GTK_BOX(hbox),ProcessArtistField, TRUE,TRUE,2);
+ gtk_box_pack_start(GTK_BOX(hbox),ProcessAlbumArtistField,TRUE,TRUE,2);
gtk_box_pack_start(GTK_BOX(hbox),ProcessAlbumField, TRUE,TRUE,2);
gtk_box_pack_start(GTK_BOX(hbox),ProcessGenreField, TRUE,TRUE,2);
gtk_box_pack_start(GTK_BOX(hbox),ProcessCommentField, TRUE,TRUE,2);
@@ -2588,6 +2612,7 @@ void Open_ScannerWindow (gint scanner_type)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ProcessFileNameField), PROCESS_FILENAME_FIELD);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ProcessTitleField), PROCESS_TITLE_FIELD);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ProcessArtistField), PROCESS_ARTIST_FIELD);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ProcessAlbumArtistField),PROCESS_ALBUM_ARTIST_FIELD);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ProcessAlbumField), PROCESS_ALBUM_FIELD);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ProcessGenreField), PROCESS_GENRE_FIELD);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ProcessCommentField), PROCESS_COMMENT_FIELD);
@@ -2599,6 +2624,7 @@ void Open_ScannerWindow (gint scanner_type)
g_signal_connect(G_OBJECT(ProcessFileNameField), "toggled",G_CALLBACK(Select_Fields_Set_Sensitive),NULL);
g_signal_connect(G_OBJECT(ProcessTitleField), "toggled",G_CALLBACK(Select_Fields_Set_Sensitive),NULL);
g_signal_connect(G_OBJECT(ProcessArtistField), "toggled",G_CALLBACK(Select_Fields_Set_Sensitive),NULL);
+ g_signal_connect(G_OBJECT(ProcessAlbumArtistField),"toggled",G_CALLBACK(Select_Fields_Set_Sensitive),NULL);
g_signal_connect(G_OBJECT(ProcessAlbumField), "toggled",G_CALLBACK(Select_Fields_Set_Sensitive),NULL);
g_signal_connect(G_OBJECT(ProcessGenreField), "toggled",G_CALLBACK(Select_Fields_Set_Sensitive),NULL);
g_signal_connect(G_OBJECT(ProcessCommentField), "toggled",G_CALLBACK(Select_Fields_Set_Sensitive),NULL);
@@ -2780,12 +2806,15 @@ void Open_ScannerWindow (gint scanner_type)
Label = gtk_label_new(_("%a : artist"));
gtk_table_attach_defaults(GTK_TABLE(Table),Label,0,1,0,1);
gtk_misc_set_alignment(GTK_MISC(Label),0,0.5);
- Label = gtk_label_new(_("%b : album"));
+ Label = gtk_label_new(_("%z : album artist"));
gtk_table_attach_defaults(GTK_TABLE(Table),Label,0,1,1,2);
gtk_misc_set_alignment(GTK_MISC(Label),0,0.5);
- Label = gtk_label_new(_("%c : comment"));
+ Label = gtk_label_new(_("%b : album"));
gtk_table_attach_defaults(GTK_TABLE(Table),Label,0,1,2,3);
gtk_misc_set_alignment(GTK_MISC(Label),0,0.5);
+ Label = gtk_label_new(_("%c : comment"));
+ gtk_table_attach_defaults(GTK_TABLE(Table),Label,0,1,3,4);
+ gtk_misc_set_alignment(GTK_MISC(Label),0,0.5);
Label = gtk_label_new(_("%p : composer"));
gtk_table_attach_defaults(GTK_TABLE(Table),Label,0,1,3,4);
gtk_misc_set_alignment(GTK_MISC(Label),0,0.5);
@@ -3092,6 +3121,7 @@ void ScannerWindow_Apply_Changes (void)
PROCESS_FILENAME_FIELD = GTK_TOGGLE_BUTTON(ProcessFileNameField)->active;
PROCESS_TITLE_FIELD = GTK_TOGGLE_BUTTON(ProcessTitleField)->active;
PROCESS_ARTIST_FIELD = GTK_TOGGLE_BUTTON(ProcessArtistField)->active;
+ PROCESS_ALBUM_ARTIST_FIELD= GTK_TOGGLE_BUTTON(ProcessAlbumArtistField)->active;
PROCESS_ALBUM_FIELD = GTK_TOGGLE_BUTTON(ProcessAlbumField)->active;
PROCESS_GENRE_FIELD = GTK_TOGGLE_BUTTON(ProcessGenreField)->active;
PROCESS_COMMENT_FIELD = GTK_TOGGLE_BUTTON(ProcessCommentField)->active;
@@ -3378,6 +3408,8 @@ void Select_Fields_Invert_Selection (void)
!GTK_TOGGLE_BUTTON(ProcessTitleField)->active);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ProcessArtistField),
!GTK_TOGGLE_BUTTON(ProcessArtistField)->active);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ProcessAlbumArtistField),
+ !GTK_TOGGLE_BUTTON(ProcessAlbumArtistField)->active);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ProcessAlbumField),
!GTK_TOGGLE_BUTTON(ProcessAlbumField)->active);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ProcessGenreField),
@@ -3402,6 +3434,7 @@ void Select_Fields_Select_Unselect_All (void)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ProcessFileNameField), state);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ProcessTitleField), state);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ProcessArtistField), state);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ProcessAlbumArtistField),state);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ProcessAlbumField), state);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ProcessGenreField), state);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ProcessCommentField), state);
@@ -3421,6 +3454,7 @@ void Select_Fields_Set_Sensitive (void)
if (GTK_TOGGLE_BUTTON(ProcessFileNameField)->active
|| GTK_TOGGLE_BUTTON(ProcessTitleField)->active
|| GTK_TOGGLE_BUTTON(ProcessArtistField)->active
+ || GTK_TOGGLE_BUTTON(ProcessAlbumArtistField)->active
|| GTK_TOGGLE_BUTTON(ProcessAlbumField)->active
|| GTK_TOGGLE_BUTTON(ProcessGenreField)->active
|| GTK_TOGGLE_BUTTON(ProcessCommentField)->active
diff --git a/src/setting.c b/src/setting.c
index 6e67d84..8a368d9 100644
--- a/src/setting.c
+++ b/src/setting.c
@@ -204,6 +204,7 @@ tConfigVariable Config_Variables[] =
{"process_filename_field", CV_TYPE_BOOL, &PROCESS_FILENAME_FIELD },
{"process_title_field", CV_TYPE_BOOL, &PROCESS_TITLE_FIELD },
{"process_artist_field", CV_TYPE_BOOL, &PROCESS_ARTIST_FIELD },
+ {"process_album_artist_field", CV_TYPE_BOOL, &PROCESS_ALBUM_ARTIST_FIELD },
{"process_album_field", CV_TYPE_BOOL, &PROCESS_ALBUM_FIELD },
{"process_genre_field", CV_TYPE_BOOL, &PROCESS_GENRE_FIELD },
{"process_comment_field", CV_TYPE_BOOL, &PROCESS_COMMENT_FIELD },
@@ -477,6 +478,7 @@ void Init_Config_Variables (void)
PROCESS_FILENAME_FIELD = 0;
PROCESS_TITLE_FIELD = 1;
PROCESS_ARTIST_FIELD = 1;
+ PROCESS_ALBUM_ARTIST_FIELD = 1;
PROCESS_ALBUM_FIELD = 1;
PROCESS_GENRE_FIELD = 1;
PROCESS_COMMENT_FIELD = 1;
diff --git a/src/setting.h b/src/setting.h
index 90c0df0..2d8d163 100644
--- a/src/setting.h
+++ b/src/setting.h
@@ -160,6 +160,7 @@ gint CONFIRM_DELETE_FILE;
gint PROCESS_FILENAME_FIELD;
gint PROCESS_TITLE_FIELD;
gint PROCESS_ARTIST_FIELD;
+gint PROCESS_ALBUM_ARTIST_FIELD;
gint PROCESS_ALBUM_FIELD;
gint PROCESS_GENRE_FIELD;
gint PROCESS_COMMENT_FIELD;
diff --git a/src/ui_manager.h b/src/ui_manager.h
index aed2235..fe8a82a 100644
--- a/src/ui_manager.h
+++ b/src/ui_manager.h
@@ -22,6 +22,9 @@ static const gchar *ui_xml =
" <menuitem action='SortArtistAsc' />"
" <menuitem action='SortArtistDesc' />"
" <separator />"
+" <menuitem action='SortAlbumArtistAsc' />"
+" <menuitem action='SortAlbumArtistDesc' />"
+" <separator />"
" <menuitem action='SortAlbumAsc' />"
" <menuitem action='SortAlbumDesc' />"
" <separator />"
@@ -231,6 +234,9 @@ static const gchar *ui_xml =
" <menuitem action='SortArtistAsc' />"
" <menuitem action='SortArtistDesc' />"
" <separator />"
+" <menuitem action='SortAlbumArtistAsc' />"
+" <menuitem action='SortAlbumArtistDesc' />"
+" <separator />"
" <menuitem action='SortAlbumAsc' />"
" <menuitem action='SortAlbumDesc' />"
" <separator />"