@@ -466,7 +466,7 @@ _create_sorted_folder_tree(ddb_playlist_t *plt, ml_tree_item_t *parent, int sele
466466}
467467
468468static void
469- _create_folder_tree (medialib_source_t * source , ml_tree_item_t * root , const char * track_tf , int selected , int needs_sort ) {
469+ _create_folder_tree (medialib_source_t * source , ml_tree_item_t * root , const char * sort_tf , const char * track_tf , int selected , int needs_sort ) {
470470 if (needs_sort ) {
471471 ddb_tf_context_t ctx = {
472472 ._size = sizeof (ddb_tf_context_t ),
@@ -475,19 +475,18 @@ _create_folder_tree(medialib_source_t *source, ml_tree_item_t *root, const char
475475 .idx = -1 ,
476476 };
477477
478- const char * tf_sort = "$directory_path(%path%)/[%album artist% - ]%album%/[%tracknumber%. ]%title%" ;
479- char * tf_bytecode = deadbeef -> tf_compile (tf_sort );
478+ char * tf_bytecode = deadbeef -> tf_compile (sort_tf );
480479
481- deadbeef -> plt_sort_v3 (& ctx , tf_bytecode , PL_MAIN , -1 , DDB_SORT_ASCENDING );
480+ deadbeef -> plt_sort_v3 (& ctx , tf_bytecode , PL_MAIN , -1 , DDB_SORT_ASCENDING );
482481
483- deadbeef -> tf_free (tf_bytecode );
482+ deadbeef -> tf_free (tf_bytecode );
484483 }
485484
486- char * track_tf_bc = deadbeef -> tf_compile (track_tf );
485+ char * track_tf_bc = deadbeef -> tf_compile (track_tf );
487486
488- _create_sorted_folder_tree (source -> ml_playlist , root , selected , track_tf_bc , NULL , 0 );
487+ _create_sorted_folder_tree (source -> ml_playlist , root , selected , track_tf_bc , NULL , 0 );
489488
490- deadbeef -> tf_free (track_tf_bc );
489+ deadbeef -> tf_free (track_tf_bc );
491490
492491 // squash single-item tree nodes
493492 ml_tree_item_t * prev = NULL ;
@@ -497,13 +496,13 @@ _create_folder_tree(medialib_source_t *source, ml_tree_item_t *root, const char
497496 new_head -> next = head -> next ;
498497
499498 if (head -> track ) {
500- deadbeef -> pl_item_unref (head -> track );
499+ deadbeef -> pl_item_unref (head -> track );
501500 }
502501 if (head -> text ) {
503- deadbeef -> metacache_remove_string (head -> text );
502+ deadbeef -> metacache_remove_string (head -> text );
504503 }
505504 if (head -> path ) {
506- deadbeef -> metacache_remove_string (head -> path );
505+ deadbeef -> metacache_remove_string (head -> path );
507506 }
508507 free (head );
509508 head = new_head ;
@@ -562,23 +561,34 @@ _create_item_tree_from_collection(const char *filter, scriptableItem_t *preset,
562561
563562 const char * tf = scriptableItemPropertyValueForKey (item , "name" );
564563 if (!strcmp (tf , "%folder_tree%" )) {
565- const char * track_tf = NULL ;
566-
567564 scriptableItem_t * compareItem = source -> last_build_tree_preset != NULL ? scriptableItemChildren (source -> last_build_tree_preset ) : NULL ;
568565 needs_sort = compareItem == NULL || source -> last_build_tree_playlist_modification_idx != source -> playlist_modification_idx ;
569566 const char * compareTf = compareItem != NULL ? scriptableItemPropertyValueForKey (compareItem , "name" ) : NULL ;
570567 if (!needs_sort && (compareTf == NULL || strcmp (compareTf , tf ))) {
571568 needs_sort = 1 ;
572569 }
573570
571+ size_t sort_tf_size = 20000 ;
572+ char * sort_tf = calloc (1 , sort_tf_size + 1 );
573+
574+ const char * track_tf = NULL ;
575+
574576 if (count < 2 ) {
575577 track_tf = "[%tracknumber%. ]%title%" ;
578+ strncat (sort_tf , track_tf , sort_tf_size );
576579 }
577580 else {
578- item = scriptableItemNext (item );
579- track_tf = scriptableItemPropertyValueForKey (item , "name" );
581+ // Build sort tf from the remaining items, only for sorting purpose.
582+ // The result will still be only folder tree, + the last tf item as leaf.
583+ strncat (sort_tf , "$directory_path(%path%)" , sort_tf_size );
584+ while ((item = scriptableItemNext (item ))) {
585+ track_tf = scriptableItemPropertyValueForKey (item , "name" );
586+ strncat (sort_tf , "/" , sort_tf_size );
587+ strncat (sort_tf , track_tf , sort_tf_size );
588+ }
580589 }
581- _create_folder_tree (source , root , track_tf , selected , needs_sort );
590+ _create_folder_tree (source , root , sort_tf , track_tf , selected , needs_sort );
591+ free (sort_tf );
582592 }
583593 else {
584594 const char * * tfs = calloc (count , sizeof (char * ));
0 commit comments