Skip to content

Commit 3f2a056

Browse files
medialib: remove hardcoded title formatting when sorting folder tree (fixes #3301)
1 parent d087364 commit 3f2a056

1 file changed

Lines changed: 25 additions & 14 deletions

File tree

plugins/medialib/medialibtree.c

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -466,7 +466,7 @@ _create_sorted_folder_tree(ddb_playlist_t *plt, ml_tree_item_t *parent, int sele
466466
}
467467

468468
static 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

Comments
 (0)