@@ -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 ;
@@ -571,14 +570,26 @@ _create_item_tree_from_collection(const char *filter, scriptableItem_t *preset,
571570 needs_sort = 1 ;
572571 }
573572
573+ size_t sort_tf_size = 20000 ;
574+ size_t remaining = sort_tf_size ;
575+ char * sort_tf = calloc (1 , sort_tf_size );
576+
574577 if (count < 2 ) {
575578 track_tf = "[%tracknumber%. ]%title%" ;
579+ strncat (sort_tf , track_tf , remaining );
576580 }
577581 else {
578- item = scriptableItemNext (item );
579- track_tf = scriptableItemPropertyValueForKey (item , "name" );
582+ // Build sort tf from the remaining items, only for sorting purpose.
583+ // The result will still be only folder tree, + the last tf item as leaf.
584+ strncat (sort_tf , "$directory_path(%path%)" , remaining );
585+ while ((item = scriptableItemNext (item ))) {
586+ track_tf = scriptableItemPropertyValueForKey (item , "name" );
587+ strncat (sort_tf , "/" , remaining );
588+ strncat (sort_tf , track_tf , remaining );
589+ }
580590 }
581- _create_folder_tree (source , root , track_tf , selected , needs_sort );
591+ _create_folder_tree (source , root , sort_tf , track_tf , selected , needs_sort );
592+ free (sort_tf );
582593 }
583594 else {
584595 const char * * tfs = calloc (count , sizeof (char * ));
0 commit comments