static struct song * apply_song_metadata(struct song *dest, const struct song *src) { struct song *tmp; assert(dest != NULL); assert(src != NULL); if (src->tag == NULL && src->start_ms == 0 && src->end_ms == 0) return dest; if (song_in_database(dest)) { char *path_fs = map_song_fs(dest); if (path_fs == NULL) return dest; tmp = song_file_new(path_fs, NULL); g_free(path_fs); merge_song_metadata(tmp, dest, src); } else { tmp = song_file_new(dest->uri, NULL); merge_song_metadata(tmp, dest, src); song_free(dest); } return tmp; }
static struct song * apply_song_metadata(struct song *dest, const struct song *src) { struct song *tmp; assert(dest != NULL); assert(src != NULL); if (src->tag == NULL && src->start_ms == 0 && src->end_ms == 0) return dest; if (song_in_database(dest)) { char *path_fs = map_song_fs(dest); if (path_fs == NULL) return dest; char *path_utf8 = fs_charset_to_utf8(path_fs); if (path_utf8 != NULL) g_free(path_fs); else path_utf8 = path_fs; tmp = song_file_new(path_utf8, NULL); g_free(path_utf8); merge_song_metadata(tmp, dest, src); } else { tmp = song_file_new(dest->uri, NULL); merge_song_metadata(tmp, dest, src); } if (dest->tag != NULL && dest->tag->time > 0 && src->start_ms > 0 && src->end_ms == 0 && src->start_ms / 1000 < (unsigned)dest->tag->time) /* the range is open-ended, and the playlist plugin did not know the total length of the song file (e.g. last track on a CUE file); fix it up here */ tmp->tag->time = dest->tag->time - src->start_ms / 1000; song_free(dest); return tmp; }