@@ -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,30 +561,47 @@ _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 ;
569- const char * compareTf = compareItem != NULL ? scriptableItemPropertyValueForKey (compareItem , "name" ) : NULL ;
570- if (!needs_sort && (compareTf == NULL || strcmp (compareTf , tf ))) {
571- needs_sort = 1 ;
572- }
566+
567+ size_t sort_tf_size = 20000 ;
568+ char * sort_tf = calloc (1 , sort_tf_size + 1 );
569+
570+ const char * track_tf = NULL ;
573571
574572 if (count < 2 ) {
575573 track_tf = "[%tracknumber%. ]%title%" ;
574+ strncat (sort_tf , track_tf , sort_tf_size );
576575 }
577576 else {
578- item = scriptableItemNext (item );
579- track_tf = scriptableItemPropertyValueForKey (item , "name" );
577+ // Build sort tf from the remaining items, only for sorting purpose.
578+ // The result will still be only folder tree, + the last tf item as leaf.
579+ strncat (sort_tf , "$directory_path(%path%)" , sort_tf_size );
580+ while ((item = scriptableItemNext (item ))) {
581+ track_tf = scriptableItemPropertyValueForKey (item , "name" );
582+ strncat (sort_tf , "/" , sort_tf_size );
583+ strncat (sort_tf , track_tf , sort_tf_size );
584+ }
580585 }
581- _create_folder_tree (source , root , track_tf , selected , needs_sort );
586+ if (!needs_sort && (source -> folder_tree_sort_tf == NULL || strcmp (source -> folder_tree_sort_tf , sort_tf ))) {
587+ free (source -> folder_tree_sort_tf );
588+ source -> folder_tree_sort_tf = strdup (sort_tf );
589+ needs_sort = 1 ;
590+ }
591+
592+ _create_folder_tree (source , root , sort_tf , track_tf , selected , needs_sort );
593+ free (sort_tf );
582594 }
583595 else {
584596 const char * * tfs = calloc (count , sizeof (char * ));
585597
586598 scriptableItem_t * compareItem = source -> last_build_tree_preset != NULL ? scriptableItemChildren (source -> last_build_tree_preset ) : NULL ;
587599
588600 needs_sort = compareItem == NULL || source -> last_build_tree_playlist_modification_idx != source -> playlist_modification_idx ;
601+ if (!needs_sort && source -> folder_tree_sort_tf ) {
602+ free (source -> folder_tree_sort_tf );
603+ source -> folder_tree_sort_tf = NULL ;
604+ }
589605 int index = 0 ;
590606 do {
591607 // First item already obtained
0 commit comments