From: Clément Stenac Date: Mon, 7 Aug 2006 17:26:02 +0000 (+0000) Subject: Fix sort by artist X-Git-Tag: 0.9.0-test0~10674 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=a5df65a280d747e837e95690064d4fa082706e4f;p=vlc Fix sort by artist --- diff --git a/include/vlc_playlist.h b/include/vlc_playlist.h index 3cdf4eb9bc..03e8adc8c5 100644 --- a/include/vlc_playlist.h +++ b/include/vlc_playlist.h @@ -185,7 +185,7 @@ struct playlist_add_t #define SORT_ID 0 #define SORT_TITLE 1 #define SORT_TITLE_NODES_FIRST 2 -#define SORT_AUTHOR 3 +#define SORT_ARTIST 3 #define SORT_GENRE 4 #define SORT_RANDOM 5 #define SORT_DURATION 6 @@ -341,13 +341,7 @@ static inline playlist_item_t *playlist_LockItemGetByInput( VLC_EXPORT( int, playlist_LiveSearchUpdate, (playlist_t *, playlist_item_t *, const char *) ); /* Playlist sorting */ -#define playlist_SortID(p, i) playlist_Sort( p, SORT_ID, i) -#define playlist_SortTitle(p, i) playlist_Sort( p, SORT_TITLE, i) -#define playlist_SortAuthor(p, i) playlist_Sort( p, SORT_AUTHOR, i) -#define playlist_SortAlbum(p, i) playlist_Sort( p, SORT_ALBUM, i) -#define playlist_SortGroup(p, i) playlist_Sort( p, SORT_GROUP, i) VLC_EXPORT( int, playlist_TreeMove, ( playlist_t *, playlist_item_t *, playlist_item_t *, int ) ); -VLC_EXPORT( int, playlist_NodeGroup, ( playlist_t *, playlist_item_t *,playlist_item_t **,int, int, int ) ); VLC_EXPORT( int, playlist_NodeSort, ( playlist_t *, playlist_item_t *,int, int ) ); VLC_EXPORT( int, playlist_RecursiveNodeSort, ( playlist_t *, playlist_item_t *,int, int ) ); diff --git a/include/vlc_symbols.h b/include/vlc_symbols.h index 4a5a5abe10..32d604e32d 100644 --- a/include/vlc_symbols.h +++ b/include/vlc_symbols.h @@ -309,7 +309,7 @@ struct module_symbols_t void (*playlist_ItemAddOption_inner) (playlist_item_t *, const char *); void *playlist_Sort_deprecated; void *playlist_Move_deprecated; - int (*playlist_NodeGroup_inner) (playlist_t *, playlist_item_t *,playlist_item_t **,int, int, int); + void *playlist_NodeGroup_deprecated; int (*playlist_NodeSort_inner) (playlist_t *, playlist_item_t *,int, int); int (*playlist_RecursiveNodeSort_inner) (playlist_t *, playlist_item_t *,int, int); int (*playlist_Import_inner) (playlist_t *, const char *, playlist_item_t *, vlc_bool_t); @@ -791,7 +791,6 @@ struct module_symbols_t # define playlist_ItemGetById (p_symbols)->playlist_ItemGetById_inner # define playlist_ItemGetByInput (p_symbols)->playlist_ItemGetByInput_inner # define playlist_ItemAddOption (p_symbols)->playlist_ItemAddOption_inner -# define playlist_NodeGroup (p_symbols)->playlist_NodeGroup_inner # define playlist_NodeSort (p_symbols)->playlist_NodeSort_inner # define playlist_RecursiveNodeSort (p_symbols)->playlist_RecursiveNodeSort_inner # define playlist_Import (p_symbols)->playlist_Import_inner @@ -1261,7 +1260,6 @@ struct module_symbols_t ((p_symbols)->playlist_ItemGetById_inner) = playlist_ItemGetById; \ ((p_symbols)->playlist_ItemGetByInput_inner) = playlist_ItemGetByInput; \ ((p_symbols)->playlist_ItemAddOption_inner) = playlist_ItemAddOption; \ - ((p_symbols)->playlist_NodeGroup_inner) = playlist_NodeGroup; \ ((p_symbols)->playlist_NodeSort_inner) = playlist_NodeSort; \ ((p_symbols)->playlist_RecursiveNodeSort_inner) = playlist_RecursiveNodeSort; \ ((p_symbols)->playlist_Import_inner) = playlist_Import; \ @@ -1486,6 +1484,7 @@ struct module_symbols_t (p_symbols)->playlist_GetPositionById_deprecated = NULL; \ (p_symbols)->playlist_Sort_deprecated = NULL; \ (p_symbols)->playlist_Move_deprecated = NULL; \ + (p_symbols)->playlist_NodeGroup_deprecated = NULL; \ (p_symbols)->playlist_NodeRemoveParent_deprecated = NULL; \ (p_symbols)->__intf_Interact_deprecated = NULL; \ (p_symbols)->__intf_UserProgress_deprecated = NULL; \ diff --git a/modules/control/http/macro.c b/modules/control/http/macro.c index 41c239f949..c3bec179cf 100644 --- a/modules/control/http/macro.c +++ b/modules/control/http/macro.c @@ -452,7 +452,7 @@ void E_(MacroDo)( httpd_file_sys_t *p_args, { playlist_RecursiveNodeSort( p_sys->p_playlist, /*playlist_ItemGetById( p_sys->p_playlist, i_item ),*/ p_sys->p_playlist->p_root_onelevel, - SORT_AUTHOR, + SORT_ARTIST, ( i_order == 0 ) ? ORDER_NORMAL : ORDER_REVERSE ); msg_Dbg( p_intf, "requested playlist sort by author (%d)" , i_order ); } diff --git a/modules/control/rc.c b/modules/control/rc.c index 832c1ae7a7..200ad49579 100644 --- a/modules/control/rc.c +++ b/modules/control/rc.c @@ -360,6 +360,8 @@ static void RegisterCallbacks( intf_thread_t *p_intf ) var_AddCallback( p_intf, "add", Playlist, NULL ); var_Create( p_intf, "playlist", VLC_VAR_VOID | VLC_VAR_ISCOMMAND ); var_AddCallback( p_intf, "playlist", Playlist, NULL ); + var_Create( p_intf, "sort", VLC_VAR_VOID | VLC_VAR_ISCOMMAND ); + var_AddCallback( p_intf, "sort", Playlist, NULL ); var_Create( p_intf, "play", VLC_VAR_VOID | VLC_VAR_ISCOMMAND ); var_AddCallback( p_intf, "play", Playlist, NULL ); var_Create( p_intf, "stop", VLC_VAR_VOID | VLC_VAR_ISCOMMAND ); @@ -1280,9 +1282,16 @@ static int Playlist( vlc_object_t *p_this, char const *psz_cmd, } else if( !strcmp( psz_cmd, "playlist" ) ) { + msg_Dbg( p_playlist, "Dumping category" ); playlist_NodeDump( p_playlist, p_playlist->p_root_category, 0 ); + msg_Dbg( p_playlist, "Dumping Onelevel" ); playlist_NodeDump( p_playlist, p_playlist->p_root_onelevel, 0 ); } + else if( !strcmp( psz_cmd, "sort" )) + { + playlist_RecursiveNodeSort( p_playlist, p_playlist->p_root_onelevel, + SORT_ARTIST, ORDER_NORMAL ); + } else if( !strcmp( psz_cmd, "status" ) ) { if( p_playlist->p_input ) diff --git a/modules/gui/macosx/playlist.m b/modules/gui/macosx/playlist.m index 96dcc9e5f0..cfebbe8c3a 100644 --- a/modules/gui/macosx/playlist.m +++ b/modules/gui/macosx/playlist.m @@ -919,7 +919,7 @@ NSLog( @"expandable" ); - (IBAction)sortNodeByAuthor:(id)sender { - [self sortNode: SORT_AUTHOR]; + [self sortNode: SORT_ARTIST]; } - (void)sortNode:(int)i_mode @@ -1390,7 +1390,7 @@ NSLog( @"expandable" ); } else if( o_tc == o_tc_author ) { - i_mode = SORT_AUTHOR; + i_mode = SORT_ARTIST; } if( b_isSortDescending ) diff --git a/src/playlist/sort.c b/src/playlist/sort.c index 6d6e25f85b..1c33143bc6 100644 --- a/src/playlist/sort.c +++ b/src/playlist/sort.c @@ -43,29 +43,26 @@ int playlist_ItemArraySort( playlist_t *p_playlist, int i_items, * * \param p_playlist the playlist * \param p_node the node to sort - * \param i_mode: SORT_ID, SORT_TITLE, SORT_AUTHOR, SORT_ALBUM, SORT_RANDOM + * \param i_mode: SORT_ID, SORT_TITLE, SORT_ARTIST, SORT_ALBUM, SORT_RANDOM * \param i_type: ORDER_NORMAL or ORDER_REVERSE (reversed order) * \return VLC_SUCCESS on success */ int playlist_NodeSort( playlist_t * p_playlist , playlist_item_t *p_node, int i_mode, int i_type ) { - playlist_ItemArraySort( p_playlist,p_node->i_children, p_node->pp_children, i_mode, i_type ); - return VLC_SUCCESS; } /** - * * Sort a node recursively. * * This function must be entered with the playlist lock ! * * \param p_playlist the playlist * \param p_node the node to sort - * \param i_mode: SORT_ID, SORT_TITLE, SORT_AUTHOR, SORT_ALBUM, SORT_RANDOM + * \param i_mode: SORT_ID, SORT_TITLE, SORT_ARTIST, SORT_ALBUM, SORT_RANDOM * \param i_type: ORDER_NORMAL or ORDER_REVERSE (reversed order) * \return VLC_SUCCESS on success */ @@ -73,7 +70,6 @@ int playlist_RecursiveNodeSort( playlist_t *p_playlist, playlist_item_t *p_node, int i_mode, int i_type ) { int i; - playlist_NodeSort( p_playlist, p_node, i_mode, i_type ); for( i = 0 ; i< p_node->i_children; i++ ) { @@ -83,15 +79,13 @@ int playlist_RecursiveNodeSort( playlist_t *p_playlist, playlist_item_t *p_node, i_mode,i_type ); } } - return VLC_SUCCESS; - } int playlist_ItemArraySort( playlist_t *p_playlist, int i_items, - playlist_item_t **pp_items, int i_mode, - int i_type ) + playlist_item_t **pp_items, int i_mode, + int i_type ) { int i , i_small , i_position; playlist_item_t *p_temp; @@ -116,6 +110,41 @@ int playlist_ItemArraySort( playlist_t *p_playlist, int i_items, return VLC_SUCCESS; } +#define DO_META_SORT( node ) { \ + char *psz_a = pp_items[i]->p_input->p_meta ? \ + pp_items[i]->p_input->p_meta->psz_##node : NULL ; \ + char *psz_b = pp_items[i_small]->p_input->p_meta ? \ + pp_items[i_small]->p_input->p_meta->psz_##node : NULL; \ + /* Nodes go first */ \ + if( pp_items[i]->i_children == -1 && pp_items[i_small]->i_children >= 0 ) \ + i_test = 1;\ + else if( pp_items[i]->i_children >= 0 &&\ + pp_items[i_small]->i_children == -1 ) \ + i_test = -1; \ + /* Both are nodes, sort by name */ \ + else if( pp_items[i]->i_children >= 0 && \ + pp_items[i_small]->i_children >= 0 ) \ + { \ + i_test = strcasecmp( pp_items[i]->p_input->psz_name, \ + pp_items[i_small]->p_input->psz_name ); \ + } \ + /* Both are items */ \ + else if( psz_a == NULL && psz_b != NULL ) \ + i_test = 1; \ + else if( psz_a != NULL && psz_b == NULL ) \ + i_test = -1;\ + /* No meta, sort by name */ \ + else if( psz_a == NULL && psz_b == NULL ) \ + { \ + i_test = strcasecmp( pp_items[i]->p_input->psz_name, \ + pp_items[i_small]->p_input->psz_name ); \ + } \ + else \ + { \ + i_test = strcmp( psz_b, psz_a ); \ + } \ +} + for( i_position = 0; i_position < i_items -1 ; i_position ++ ) { i_small = i_position; @@ -126,7 +155,7 @@ int playlist_ItemArraySort( playlist_t *p_playlist, int i_items, if( i_mode == SORT_TITLE ) { i_test = strcasecmp( pp_items[i]->p_input->psz_name, - pp_items[i_small]->p_input->psz_name ); + pp_items[i_small]->p_input->psz_name ); } else if( i_mode == SORT_TITLE_NUMERIC ) { @@ -138,83 +167,13 @@ int playlist_ItemArraySort( playlist_t *p_playlist, int i_items, i_test = pp_items[i]->p_input->i_duration - pp_items[i_small]->p_input->i_duration; } - else if( i_mode == SORT_AUTHOR ) + else if( i_mode == SORT_ARTIST ) { - char *psz_a = pp_items[i]->p_input->p_meta->psz_artist; - char *psz_b = pp_items[i_small]->p_input->p_meta->psz_artist; - if( pp_items[i]->i_children == -1 && - pp_items[i_small]->i_children >= 0 ) - { - i_test = 1; - } - else if( pp_items[i]->i_children >= 0 && - pp_items[i_small]->i_children == -1 ) - { - i_test = -1; - } - // both are nodes - else if( pp_items[i]->i_children >= 0 && - pp_items[i_small]->i_children >= 0 ) - { - i_test = strcasecmp( pp_items[i]->p_input->psz_name, - pp_items[i_small]->p_input->psz_name ); - } - else if( psz_a == NULL && psz_b != NULL ) - { - i_test = 1; - } - else if( psz_a != NULL && psz_b == NULL ) - { - i_test = -1; - } - else if( psz_a == NULL && psz_b == NULL ) - { - i_test = strcasecmp( pp_items[i]->p_input->psz_name, - pp_items[i_small]->p_input->psz_name ); - } - else - { - i_test = strcmp( psz_b, psz_a ); - } + DO_META_SORT( artist ); } else if( i_mode == SORT_ALBUM ) { - char *psz_a = pp_items[i]->p_input->p_meta->psz_album; - char *psz_b = pp_items[i_small]->p_input->p_meta->psz_album; - if( pp_items[i]->i_children == -1 && - pp_items[i_small]->i_children >= 0 ) - { - i_test = 1; - } - else if( pp_items[i]->i_children >= 0 && - pp_items[i_small]->i_children == -1 ) - { - i_test = -1; - } - // both are nodes - else if( pp_items[i]->i_children >= 0 && - pp_items[i_small]->i_children >= 0 ) - { - i_test = strcasecmp( pp_items[i]->p_input->psz_name, - pp_items[i_small]->p_input->psz_name ); - } - else if( psz_a == NULL && psz_b != NULL ) - { - i_test = 1; - } - else if( psz_a != NULL && psz_b == NULL ) - { - i_test = -1; - } - else if( psz_a == NULL && psz_b == NULL ) - { - i_test = strcasecmp( pp_items[i]->p_input->psz_name, - pp_items[i_small]->p_input->psz_name ); - } - else - { - i_test = strcmp( psz_b, psz_a ); - } + DO_META_SORT( album ); } else if( i_mode == SORT_TITLE_NODES_FIRST ) { @@ -249,73 +208,3 @@ int playlist_ItemArraySort( playlist_t *p_playlist, int i_items, } return VLC_SUCCESS; } - - -int playlist_NodeGroup( playlist_t * p_playlist , playlist_item_t *p_root, - playlist_item_t **pp_items,int i_item, - int i_mode, int i_type ) -{ - char *psz_search = NULL; - int i_nodes = 0; - playlist_item_t **pp_nodes = NULL; - playlist_item_t *p_node; - vlc_bool_t b_found; - int i,j; - for( i = 0; i< i_item ; i++ ) - { - if( psz_search ) free( psz_search ); - if( i_mode == SORT_TITLE ) - { - psz_search = strdup( pp_items[i]->p_input->psz_name ); - } - else if ( i_mode == SORT_AUTHOR ) - { - psz_search = pp_items[i]->p_input->p_meta->psz_artist; - } - else if ( i_mode == SORT_ALBUM ) - { - psz_search = pp_items[i]->p_input->p_meta->psz_album; - } - else if ( i_mode == SORT_GENRE ) - { - psz_search = pp_items[i]->p_input->p_meta->psz_genre; - } - - if( psz_search && !strcmp( psz_search, "" ) ) - { - free( psz_search ); - psz_search = strdup( _("Undefined") ); - } - - b_found = VLC_FALSE; - for( j = 0 ; j< i_nodes; j++ ) - { - if( !strcasecmp( psz_search, pp_nodes[j]->p_input->psz_name ) ) - { - playlist_NodeAppend( p_playlist, pp_items[i], pp_nodes[j] ); - b_found = VLC_TRUE; - break; - } - } - if( !b_found ) - { - p_node = playlist_NodeCreate( p_playlist, psz_search, NULL ); - INSERT_ELEM( pp_nodes, i_nodes, i_nodes, p_node ); - playlist_NodeAppend( p_playlist, pp_items[i],p_node ); - } - } - - /* Now, sort the nodes by name */ - playlist_ItemArraySort( p_playlist, i_nodes, pp_nodes, SORT_TITLE, - i_type ); - - /* Now, sort each node and append it to the root node*/ - for( i = 0 ; i< i_nodes ; i++ ) - { - playlist_ItemArraySort( p_playlist, pp_nodes[i]->i_children, - pp_nodes[i]->pp_children, SORT_TITLE, i_type ); - - playlist_NodeAppend( p_playlist, pp_nodes[i], p_root ); - } - return VLC_SUCCESS; -}