[library] New functions to support scan metadata for arbitrary path and

adding a mfi as a queue item
This commit is contained in:
chme 2017-02-18 06:55:51 +01:00 committed by ejurgensen
parent cc899651c7
commit e6f49b721f
2 changed files with 88 additions and 2 deletions

View File

@ -346,14 +346,14 @@ fixup_tags(struct media_file_info *mfi)
void void
library_add_media(struct media_file_info *mfi) library_add_media(struct media_file_info *mfi)
{ {
if (!mfi->path || !mfi->fname || !mfi->data_kind) if (!mfi->path || !mfi->fname)
{ {
DPRINTF(E_LOG, L_LIB, "Ignoring media file with missing values (path='%s', fname='%s', data_kind='%d')\n", DPRINTF(E_LOG, L_LIB, "Ignoring media file with missing values (path='%s', fname='%s', data_kind='%d')\n",
mfi->path, mfi->fname, mfi->data_kind); mfi->path, mfi->fname, mfi->data_kind);
return; return;
} }
if (!mfi->directory_id || mfi->virtual_path) if (!mfi->directory_id || !mfi->virtual_path)
{ {
// Missing informations for virtual_path and directory_id (may) lead to misplaced appearance in mpd clients // Missing informations for virtual_path and directory_id (may) lead to misplaced appearance in mpd clients
DPRINTF(E_WARN, L_LIB, "Media file with missing values (path='%s', directory='%d', virtual_path='%s')\n", DPRINTF(E_WARN, L_LIB, "Media file with missing values (path='%s', directory='%d', virtual_path='%s')\n",
@ -375,6 +375,50 @@ library_add_media(struct media_file_info *mfi)
db_file_update(mfi); db_file_update(mfi);
} }
int
library_scan_media(const char *path, struct media_file_info *mfi)
{
int i;
int ret;
DPRINTF(E_DBG, L_LIB, "Scan metadata for path '%s'\n", path);
ret = METADATA_PATH_INVALID;
for (i = 0; sources[i] && ret == METADATA_PATH_INVALID; i++)
{
if (sources[i]->disabled || !sources[i]->scan_metadata)
{
DPRINTF(E_DBG, L_LIB, "Library source '%s' is disabled or does not support scan_metadata\n", sources[i]->name);
continue;
}
ret = sources[i]->scan_metadata(path, mfi);
if (ret == METADATA_OK)
DPRINTF(E_DBG, L_LIB, "Got metadata for path '%s' from library source '%s'\n", path, sources[i]->name);
}
if (ret == METADATA_OK)
{
if (!mfi->virtual_path)
mfi->virtual_path = strdup(mfi->path);
if (!mfi->item_kind)
mfi->item_kind = 2; /* music */
if (!mfi->media_kind)
mfi->media_kind = MEDIA_KIND_MUSIC; /* music */
unicode_fixup_mfi(mfi);
fixup_tags(mfi);
}
else
{
DPRINTF(E_LOG, L_LIB, "Failed to read metadata for path '%s' (ret=%d)\n", path, ret);
}
return ret;
}
int int
library_add_playlist_info(const char *path, const char *title, const char *virtual_path, enum pl_type type, int parent_pl_id, int dir_id) library_add_playlist_info(const char *path, const char *title, const char *virtual_path, enum pl_type type, int parent_pl_id, int dir_id)
{ {
@ -443,6 +487,34 @@ library_add_playlist_info(const char *path, const char *title, const char *virtu
return plid; return plid;
} }
int
library_add_queue_item(struct media_file_info *mfi)
{
struct db_queue_item queue_item;
memset(&queue_item, 0, sizeof(struct db_queue_item));
if (mfi->id)
queue_item.file_id = mfi->id;
else
queue_item.file_id = 9999999;
queue_item.title = mfi->title;
queue_item.artist = mfi->artist;
queue_item.album_artist = mfi->album_artist;
queue_item.album = mfi->album;
queue_item.genre = mfi->genre;
queue_item.artist_sort = mfi->artist_sort;
queue_item.album_artist_sort = mfi->album_artist_sort;
queue_item.album_sort = mfi->album_sort;
queue_item.path = mfi->path;
queue_item.virtual_path = mfi->virtual_path;
queue_item.data_kind = mfi->data_kind;
queue_item.media_kind = mfi->media_kind;
return db_queue_add_item(&queue_item, 0, 0);
}
static void static void
purge_cruft(time_t start) purge_cruft(time_t start)
{ {

View File

@ -26,6 +26,10 @@
#include "commands.h" #include "commands.h"
#include "db.h" #include "db.h"
#define METADATA_OK 0
#define METADATA_ERROR -1
#define METADATA_PATH_INVALID -2
/* /*
* Definition of a library source * Definition of a library source
* *
@ -62,6 +66,10 @@ struct library_source
*/ */
int (*fullrescan)(void); int (*fullrescan)(void);
/*
* Scans metadata for the media file with the given path into the given mfi
*/
int (*scan_metadata)(const char *path, struct media_file_info *mfi);
}; };
@ -71,6 +79,12 @@ library_add_media(struct media_file_info *mfi);
int int
library_add_playlist_info(const char *path, const char *title, const char *virtual_path, enum pl_type type, int parent_pl_id, int dir_id); library_add_playlist_info(const char *path, const char *title, const char *virtual_path, enum pl_type type, int parent_pl_id, int dir_id);
int
library_scan_media(const char *path, struct media_file_info *mfi);
int
library_add_queue_item(struct media_file_info* mfi);
void void
library_rescan(); library_rescan();