diff options
-rw-r--r-- | src/bar.c | 4 | ||||
-rw-r--r-- | src/bar.h | 2 | ||||
-rw-r--r-- | src/browser.c | 57 | ||||
-rw-r--r-- | src/browser.h | 1 | ||||
-rw-r--r-- | src/easytag.c | 121 | ||||
-rw-r--r-- | src/easytag.h | 3 | ||||
-rw-r--r-- | src/et_core.c | 99 | ||||
-rw-r--r-- | src/et_core.h | 5 | ||||
-rw-r--r-- | src/id3_tag.c | 20 | ||||
-rw-r--r-- | src/id3v24_tag.c | 11 | ||||
-rw-r--r-- | src/misc.c | 62 | ||||
-rw-r--r-- | src/scan.c | 40 | ||||
-rw-r--r-- | src/setting.c | 2 | ||||
-rw-r--r-- | src/setting.h | 1 | ||||
-rw-r--r-- | src/ui_manager.h | 6 |
15 files changed, 353 insertions, 81 deletions
@@ -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) }, @@ -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 * *********/ @@ -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]); @@ -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 />" |