diff options
author | Miika Pekkarinen <miipekk@ihme.org> | 2006-04-05 18:46:38 +0000 |
---|---|---|
committer | Miika Pekkarinen <miipekk@ihme.org> | 2006-04-05 18:46:38 +0000 |
commit | 35d213aec3718a76e1ac161cc0db10b5b5609456 (patch) | |
tree | cde2e5737a98ab3f27481ba5df82dcb307b3650e | |
parent | 1de1f5b141d5fdc0427877425928c77a9006e027 (diff) | |
download | rockbox-35d213aec3718a76e1ac161cc0db10b5b5609456.tar.gz rockbox-35d213aec3718a76e1ac161cc0db10b5b5609456.zip |
Tagcache engine: Better handling for track numbers and genre strings.
Browser: Don't jam if search string was not supplied. Don't show
incorrect track numbers.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9523 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | apps/tagcache.c | 36 | ||||
-rw-r--r-- | apps/tagtree.c | 15 |
2 files changed, 30 insertions, 21 deletions
diff --git a/apps/tagcache.c b/apps/tagcache.c index 25728fa6f1..1a47b10ba8 100644 --- a/apps/tagcache.c +++ b/apps/tagcache.c | |||
@@ -66,7 +66,7 @@ static const int numeric_tags[] = { tag_year, tag_tracknumber, tag_length, tag_b | |||
66 | #define TAGCACHE_FILE_INDEX ROCKBOX_DIR "/tagcache_%d.tcd" | 66 | #define TAGCACHE_FILE_INDEX ROCKBOX_DIR "/tagcache_%d.tcd" |
67 | 67 | ||
68 | /* Tag Cache Header version 'TCHxx' */ | 68 | /* Tag Cache Header version 'TCHxx' */ |
69 | #define TAGCACHE_MAGIC 0x54434801 | 69 | #define TAGCACHE_MAGIC 0x54434802 |
70 | 70 | ||
71 | /* Tag database structures. */ | 71 | /* Tag database structures. */ |
72 | 72 | ||
@@ -815,7 +815,7 @@ static inline void write_item(const char *item) | |||
815 | inline void check_if_empty(char **tag) | 815 | inline void check_if_empty(char **tag) |
816 | { | 816 | { |
817 | if (tag == NULL || *tag == NULL || *tag[0] == '\0') | 817 | if (tag == NULL || *tag == NULL || *tag[0] == '\0') |
818 | *tag = "Unknown"; | 818 | *tag = "<Untagged>"; |
819 | } | 819 | } |
820 | 820 | ||
821 | #define CRC_BUF_LEN 8 | 821 | #define CRC_BUF_LEN 8 |
@@ -831,6 +831,7 @@ static void add_tagcache(const char *path) | |||
831 | bool ret; | 831 | bool ret; |
832 | int fd; | 832 | int fd; |
833 | char tracknumfix[3]; | 833 | char tracknumfix[3]; |
834 | char *genrestr; | ||
834 | //uint32_t crcbuf[CRC_BUF_LEN]; | 835 | //uint32_t crcbuf[CRC_BUF_LEN]; |
835 | 836 | ||
836 | if (cachefd < 0) | 837 | if (cachefd < 0) |
@@ -870,17 +871,19 @@ static void add_tagcache(const char *path) | |||
870 | if (!ret) | 871 | if (!ret) |
871 | return ; | 872 | return ; |
872 | 873 | ||
874 | genrestr = id3_get_genre(&track.id3); | ||
875 | |||
873 | check_if_empty(&track.id3.title); | 876 | check_if_empty(&track.id3.title); |
874 | check_if_empty(&track.id3.artist); | 877 | check_if_empty(&track.id3.artist); |
875 | check_if_empty(&track.id3.album); | 878 | check_if_empty(&track.id3.album); |
876 | check_if_empty(&track.id3.genre_string); | 879 | check_if_empty(&genrestr); |
877 | check_if_empty(&track.id3.composer); | 880 | check_if_empty(&track.id3.composer); |
878 | 881 | ||
879 | entry.tag_length[tag_filename] = strlen(path) + 1; | 882 | entry.tag_length[tag_filename] = strlen(path) + 1; |
880 | entry.tag_length[tag_title] = strlen(track.id3.title) + 1; | 883 | entry.tag_length[tag_title] = strlen(track.id3.title) + 1; |
881 | entry.tag_length[tag_artist] = strlen(track.id3.artist) + 1; | 884 | entry.tag_length[tag_artist] = strlen(track.id3.artist) + 1; |
882 | entry.tag_length[tag_album] = strlen(track.id3.album) + 1; | 885 | entry.tag_length[tag_album] = strlen(track.id3.album) + 1; |
883 | entry.tag_length[tag_genre] = strlen(track.id3.genre_string) + 1; | 886 | entry.tag_length[tag_genre] = strlen(genrestr) + 1; |
884 | entry.tag_length[tag_composer] = strlen(track.id3.composer) + 1; | 887 | entry.tag_length[tag_composer] = strlen(track.id3.composer) + 1; |
885 | 888 | ||
886 | entry.tag_offset[tag_filename] = 0; | 889 | entry.tag_offset[tag_filename] = 0; |
@@ -899,21 +902,22 @@ static void add_tagcache(const char *path) | |||
899 | 902 | ||
900 | if (entry.tag_offset[tag_tracknumber] <= 0) | 903 | if (entry.tag_offset[tag_tracknumber] <= 0) |
901 | { | 904 | { |
902 | int start, i; | 905 | const char *p = strrchr(path, '.'); |
903 | 906 | ||
904 | for (start = 0; path[start] != '\0'; start++) | 907 | if (p == NULL) |
905 | if (isdigit(path[start])) | 908 | p = &path[strlen(path)-1]; |
906 | break ; | ||
907 | 909 | ||
908 | for (i = 0; i < (int)sizeof(tracknumfix)-1 | 910 | while (*p != '/') |
909 | && path[start+i] != '\0'; i++) | ||
910 | { | 911 | { |
911 | if (isdigit(path[start+i])) | 912 | if (isdigit(*p) && isdigit(*(p-1))) |
912 | tracknumfix[i] = path[start+i]; | 913 | { |
913 | else | 914 | tracknumfix[1] = *p--; |
914 | break ; | 915 | tracknumfix[0] = *p; |
916 | break; | ||
917 | } | ||
918 | p--; | ||
915 | } | 919 | } |
916 | 920 | ||
917 | if (tracknumfix[0] != '\0') | 921 | if (tracknumfix[0] != '\0') |
918 | entry.tag_offset[tag_tracknumber] = atoi(tracknumfix); | 922 | entry.tag_offset[tag_tracknumber] = atoi(tracknumfix); |
919 | else | 923 | else |
@@ -925,7 +929,7 @@ static void add_tagcache(const char *path) | |||
925 | write_item(track.id3.title); | 929 | write_item(track.id3.title); |
926 | write_item(track.id3.artist); | 930 | write_item(track.id3.artist); |
927 | write_item(track.id3.album); | 931 | write_item(track.id3.album); |
928 | write_item(track.id3.genre_string); | 932 | write_item(genrestr); |
929 | write_item(track.id3.composer); | 933 | write_item(track.id3.composer); |
930 | total_entry_count++; | 934 | total_entry_count++; |
931 | } | 935 | } |
diff --git a/apps/tagtree.c b/apps/tagtree.c index 7cae86a953..db35ee0d0c 100644 --- a/apps/tagtree.c +++ b/apps/tagtree.c | |||
@@ -426,12 +426,16 @@ int tagtree_load(struct tree_context* c) | |||
426 | dptr->newtable = tcs.result_seek; | 426 | dptr->newtable = tcs.result_seek; |
427 | if (!tcs.ramsearch || csi->tagorder[extra] == tag_title) | 427 | if (!tcs.ramsearch || csi->tagorder[extra] == tag_title) |
428 | { | 428 | { |
429 | int tracknum = -1; | ||
430 | |||
429 | dptr->name = &c->name_buffer[namebufused]; | 431 | dptr->name = &c->name_buffer[namebufused]; |
430 | if (csi->tagorder[extra] == tag_title) | 432 | if (csi->tagorder[extra] == tag_title) |
433 | tracknum = tagcache_get_numeric(&tcs, tag_tracknumber); | ||
434 | |||
435 | if (tracknum > 0) | ||
431 | { | 436 | { |
432 | snprintf(dptr->name, c->name_buffer_size - namebufused, "%02d. %s", | 437 | snprintf(dptr->name, c->name_buffer_size - namebufused, "%02d. %s", |
433 | tagcache_get_numeric(&tcs, tag_tracknumber), | 438 | tracknum, tcs.result); |
434 | tcs.result); | ||
435 | namebufused += strlen(dptr->name) + 1; | 439 | namebufused += strlen(dptr->name) + 1; |
436 | if (namebufused >= c->name_buffer_size) | 440 | if (namebufused >= c->name_buffer_size) |
437 | { | 441 | { |
@@ -518,8 +522,8 @@ int tagtree_enter(struct tree_context* c) | |||
518 | 522 | ||
519 | switch (c->currtable) { | 523 | switch (c->currtable) { |
520 | case root: | 524 | case root: |
521 | c->currtable = newextra; | ||
522 | c->currextra = newextra; | 525 | c->currextra = newextra; |
526 | |||
523 | if (newextra == navibrowse) | 527 | if (newextra == navibrowse) |
524 | { | 528 | { |
525 | int i, j; | 529 | int i, j; |
@@ -539,7 +543,7 @@ int tagtree_enter(struct tree_context* c) | |||
539 | if (rc == -1 || !searchstring[0]) | 543 | if (rc == -1 || !searchstring[0]) |
540 | { | 544 | { |
541 | c->dirlevel--; | 545 | c->dirlevel--; |
542 | break; | 546 | return 0; |
543 | } | 547 | } |
544 | 548 | ||
545 | if (csi->clause[i][j].numeric) | 549 | if (csi->clause[i][j].numeric) |
@@ -549,8 +553,9 @@ int tagtree_enter(struct tree_context* c) | |||
549 | sizeof(csi->clause[i][j].str)-1); | 553 | sizeof(csi->clause[i][j].str)-1); |
550 | } | 554 | } |
551 | } | 555 | } |
552 | |||
553 | } | 556 | } |
557 | |||
558 | c->currtable = newextra; | ||
554 | break; | 559 | break; |
555 | 560 | ||
556 | case navibrowse: | 561 | case navibrowse: |