diff options
Diffstat (limited to 'src/song_save.c')
-rw-r--r-- | src/song_save.c | 73 |
1 files changed, 11 insertions, 62 deletions
diff --git a/src/song_save.c b/src/song_save.c index d931849e5..731d59e86 100644 --- a/src/song_save.c +++ b/src/song_save.c @@ -31,8 +31,8 @@ #undef G_LOG_DOMAIN #define G_LOG_DOMAIN "song" -#define SONG_KEY "key: " #define SONG_MTIME "mtime: " +#define SONG_END "song_end" static GQuark song_save_quark(void) @@ -40,61 +40,25 @@ song_save_quark(void) return g_quark_from_static_string("song_save"); } -static void -song_save_uri(FILE *fp, struct song *song) -{ - if (song->parent != NULL && song->parent->path != NULL) - fprintf(fp, SONG_FILE "%s/%s\n", - directory_get_path(song->parent), song->uri); - else - fprintf(fp, SONG_FILE "%s\n", song->uri); -} - static int song_save(struct song *song, void *data) { FILE *fp = data; - fprintf(fp, SONG_KEY "%s\n", song->uri); - - song_save_uri(fp, song); + fprintf(fp, SONG_BEGIN "%s\n", song->uri); if (song->tag != NULL) tag_save(fp, song->tag); fprintf(fp, SONG_MTIME "%li\n", (long)song->mtime); + fprintf(fp, SONG_END "\n"); return 0; } void songvec_save(FILE *fp, struct songvec *sv) { - fprintf(fp, "%s\n", SONG_BEGIN); songvec_for_each(sv, song_save, fp); - fprintf(fp, "%s\n", SONG_END); -} - -static void -commit_song(struct songvec *sv, struct song *newsong) -{ - struct song *existing = songvec_find(sv, newsong->uri); - - if (!existing) { - songvec_add(sv, newsong); - if (newsong->tag) - tag_end_add(newsong->tag); - } else { /* prevent dupes, just update the existing song info */ - if (existing->mtime != newsong->mtime) { - if (existing->tag != NULL) - tag_free(existing->tag); - if (newsong->tag) - tag_end_add(newsong->tag); - existing->tag = newsong->tag; - existing->mtime = newsong->mtime; - newsong->tag = NULL; - } - song_free(newsong); - } } static char * @@ -115,33 +79,18 @@ parse_tag_value(char *buffer, enum tag_type *type_r) return NULL; } -bool -songvec_load(FILE *fp, struct songvec *sv, struct directory *parent, - GString *buffer, GError **error_r) +struct song * +song_load(FILE *fp, struct directory *parent, const char *uri, + GString *buffer, GError **error_r) { + struct song *song = song_file_new(uri, parent); char *line; - struct song *song = NULL; enum tag_type type; const char *value; while ((line = read_text_line(fp, buffer)) != NULL && strcmp(line, SONG_END) != 0) { - if (0 == strncmp(SONG_KEY, line, strlen(SONG_KEY))) { - if (song) - commit_song(sv, song); - - song = song_file_new(line + strlen(SONG_KEY), - parent); - } else if (*line == 0) { - /* ignore empty lines (starting with '\0') */ - } else if (song == NULL) { - g_set_error(error_r, song_save_quark(), 0, - "Problems reading song info"); - return false; - } else if (0 == strncmp(SONG_FILE, line, strlen(SONG_FILE))) { - /* we don't need this info anymore */ - } else if ((value = parse_tag_value(line, - &type)) != NULL) { + if ((value = parse_tag_value(line, &type)) != NULL) { if (!song->tag) { song->tag = tag_new(); tag_begin_add(song->tag); @@ -164,8 +113,8 @@ songvec_load(FILE *fp, struct songvec *sv, struct directory *parent, } } - if (song) - commit_song(sv, song); + if (song->tag != NULL) + tag_end_add(song->tag); - return true; + return song; } |