database: rescan after metadata_to_use change
Store a list of supported tag items in the database. When loading a database which does not have a matching list, we must rescan in order to get the missing information.
This commit is contained in:
parent
a434c35eb4
commit
e96dc9a14c
1
NEWS
1
NEWS
|
@ -47,6 +47,7 @@ ver 0.16 (20??/??/??)
|
||||||
- automatically update the database with Linux inotify
|
- automatically update the database with Linux inotify
|
||||||
- support .mpdignore files in the music directory
|
- support .mpdignore files in the music directory
|
||||||
- sort songs by album name first, then disc/track number
|
- sort songs by album name first, then disc/track number
|
||||||
|
- rescan after metadata_to_use change
|
||||||
* log unused/unknown block parameters
|
* log unused/unknown block parameters
|
||||||
* removed the deprecated "error_file" option
|
* removed the deprecated "error_file" option
|
||||||
* save state when stopped
|
* save state when stopped
|
||||||
|
|
|
@ -24,6 +24,8 @@
|
||||||
#include "path.h"
|
#include "path.h"
|
||||||
#include "stats.h"
|
#include "stats.h"
|
||||||
#include "text_file.h"
|
#include "text_file.h"
|
||||||
|
#include "tag.h"
|
||||||
|
#include "tag_internal.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
@ -44,6 +46,7 @@
|
||||||
#define DB_FORMAT_PREFIX "format: "
|
#define DB_FORMAT_PREFIX "format: "
|
||||||
#define DIRECTORY_MPD_VERSION "mpd_version: "
|
#define DIRECTORY_MPD_VERSION "mpd_version: "
|
||||||
#define DIRECTORY_FS_CHARSET "fs_charset: "
|
#define DIRECTORY_FS_CHARSET "fs_charset: "
|
||||||
|
#define DB_TAG_PREFIX "tag: "
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
DB_FORMAT = 1,
|
DB_FORMAT = 1,
|
||||||
|
@ -241,6 +244,11 @@ db_save(void)
|
||||||
fprintf(fp, DB_FORMAT_PREFIX "%u\n", DB_FORMAT);
|
fprintf(fp, DB_FORMAT_PREFIX "%u\n", DB_FORMAT);
|
||||||
fprintf(fp, "%s%s\n", DIRECTORY_MPD_VERSION, VERSION);
|
fprintf(fp, "%s%s\n", DIRECTORY_MPD_VERSION, VERSION);
|
||||||
fprintf(fp, "%s%s\n", DIRECTORY_FS_CHARSET, path_get_fs_charset());
|
fprintf(fp, "%s%s\n", DIRECTORY_FS_CHARSET, path_get_fs_charset());
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < TAG_NUM_OF_ITEM_TYPES; ++i)
|
||||||
|
if (!ignore_tag_items[i])
|
||||||
|
fprintf(fp, DB_TAG_PREFIX "%s\n", tag_item_names[i]);
|
||||||
|
|
||||||
fprintf(fp, "%s\n", DIRECTORY_INFO_END);
|
fprintf(fp, "%s\n", DIRECTORY_INFO_END);
|
||||||
|
|
||||||
if (directory_save(fp, music_root) < 0) {
|
if (directory_save(fp, music_root) < 0) {
|
||||||
|
@ -268,6 +276,7 @@ db_load(GError **error)
|
||||||
int format = 0;
|
int format = 0;
|
||||||
bool found_charset = false, found_version = false;
|
bool found_charset = false, found_version = false;
|
||||||
bool success;
|
bool success;
|
||||||
|
bool tags[TAG_NUM_OF_ITEM_TYPES];
|
||||||
|
|
||||||
assert(database_path != NULL);
|
assert(database_path != NULL);
|
||||||
assert(music_root != NULL);
|
assert(music_root != NULL);
|
||||||
|
@ -290,6 +299,8 @@ db_load(GError **error)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
memset(tags, false, sizeof(tags));
|
||||||
|
|
||||||
while ((line = read_text_line(fp, buffer)) != NULL &&
|
while ((line = read_text_line(fp, buffer)) != NULL &&
|
||||||
strcmp(line, DIRECTORY_INFO_END) != 0) {
|
strcmp(line, DIRECTORY_INFO_END) != 0) {
|
||||||
if (g_str_has_prefix(line, DB_FORMAT_PREFIX)) {
|
if (g_str_has_prefix(line, DB_FORMAT_PREFIX)) {
|
||||||
|
@ -330,6 +341,18 @@ db_load(GError **error)
|
||||||
g_string_free(buffer, true);
|
g_string_free(buffer, true);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
} else if (g_str_has_prefix(line, DB_TAG_PREFIX)) {
|
||||||
|
const char *name = line + sizeof(DB_TAG_PREFIX) - 1;
|
||||||
|
enum tag_type tag = tag_name_parse(name);
|
||||||
|
if (tag == TAG_NUM_OF_ITEM_TYPES) {
|
||||||
|
g_set_error(error, db_quark(), 0,
|
||||||
|
"Unrecognized tag '%s', "
|
||||||
|
"discarding database file",
|
||||||
|
name);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
tags[tag] = true;
|
||||||
} else {
|
} else {
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
g_set_error(error, db_quark(), 0,
|
g_set_error(error, db_quark(), 0,
|
||||||
|
@ -346,6 +369,15 @@ db_load(GError **error)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < TAG_NUM_OF_ITEM_TYPES; ++i) {
|
||||||
|
if (!ignore_tag_items[i] && !tags[i]) {
|
||||||
|
g_set_error(error, db_quark(), 0,
|
||||||
|
"Tag list mismatch, "
|
||||||
|
"discarding database file");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
g_debug("reading DB");
|
g_debug("reading DB");
|
||||||
|
|
||||||
success = directory_load(fp, music_root, buffer, error);
|
success = directory_load(fp, music_root, buffer, error);
|
||||||
|
|
Loading…
Reference in New Issue