diff options
Diffstat (limited to 'src/et_core.c')
-rw-r--r-- | src/et_core.c | 99 |
1 files changed, 97 insertions, 2 deletions
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 : ""); |