Skip to content

Commit 10f4c9c

Browse files
medialib: remove hardcoded title formatting when sorting folder tree (fixes #3301)
+ better default folders preset
1 parent d087364 commit 10f4c9c

4 files changed

Lines changed: 41 additions & 21 deletions

File tree

plugins/medialib/medialibsource.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,9 @@ ml_free_source (ddb_mediasource_source_t *_source) {
209209
json_decref (source->musicpaths_json);
210210
source->musicpaths_json = NULL;
211211
}
212+
213+
free (source->folder_tree_sort_tf);
214+
source->folder_tree_sort_tf = NULL;
212215
}
213216

214217
void

plugins/medialib/medialibsource.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ typedef struct medialib_source_s {
7373

7474
struct scriptableItem_s *last_build_tree_preset;
7575
int last_build_tree_playlist_modification_idx;
76+
char *folder_tree_sort_tf;
7677
} medialib_source_t;
7778

7879
ddb_mediasource_source_t *

plugins/medialib/medialibtree.c

Lines changed: 36 additions & 20 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;
@@ -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

plugins/medialib/scriptable_tfquery.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ static const char _default_config[] =
5151
"]},"
5252
"{\"name\":\"Folders\",\"items\":["
5353
"\"%folder_tree%\","
54-
"\"[%tracknumber%. ]%title%\""
54+
"\"[%album artist% - ][%album% - ][%tracknumber%. ]%title%\""
5555
"]}"
5656
"]}";
5757

0 commit comments

Comments
 (0)