aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-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 />"