mirror of
https://github.com/owntone/owntone-server.git
synced 2025-02-25 12:29:18 -05:00
Merge branch 'audiobooks' into db_upgrade_14
This commit is contained in:
commit
fe16a9ca4e
@ -33,6 +33,12 @@ library {
|
|||||||
# /srv/music/Podcasts, you can set this to "/Podcasts".
|
# /srv/music/Podcasts, you can set this to "/Podcasts".
|
||||||
podcasts = { "/Podcasts" }
|
podcasts = { "/Podcasts" }
|
||||||
|
|
||||||
|
# Directories containing audiobooks
|
||||||
|
# For each directory that is indexed the path is matched against these
|
||||||
|
# names. If there is a match all items in the directory are marked as
|
||||||
|
# audiobooks.
|
||||||
|
audiobooks = { "/Audiobooks" }
|
||||||
|
|
||||||
# Directories containing compilations (eg soundtracks)
|
# Directories containing compilations (eg soundtracks)
|
||||||
# For each directory that is indexed the path is matched against these
|
# For each directory that is indexed the path is matched against these
|
||||||
# names. If there is a match all items in the directory are marked as
|
# names. If there is a match all items in the directory are marked as
|
||||||
@ -46,11 +52,12 @@ library {
|
|||||||
|
|
||||||
# There are 5 default playlists: "Library", "Music", "Movies", "TV Shows"
|
# There are 5 default playlists: "Library", "Music", "Movies", "TV Shows"
|
||||||
# and "Podcasts". Here you can change the names of these playlists.
|
# and "Podcasts". Here you can change the names of these playlists.
|
||||||
# name_library = "Library"
|
# name_library = "Library"
|
||||||
# name_music = "Music"
|
# name_music = "Music"
|
||||||
# name_movies = "Movies"
|
# name_movies = "Movies"
|
||||||
# name_tvshows = "TV Shows"
|
# name_tvshows = "TV Shows"
|
||||||
# name_podcasts = "Podcasts"
|
# name_podcasts = "Podcasts"
|
||||||
|
# name_audiobooks = "Audiobooks"
|
||||||
|
|
||||||
# Artwork file names (without file type extension)
|
# Artwork file names (without file type extension)
|
||||||
# forked-daapd will look for jpg and png files with these base names
|
# forked-daapd will look for jpg and png files with these base names
|
||||||
|
@ -61,6 +61,7 @@ static cfg_opt_t sec_library[] =
|
|||||||
CFG_STR("password", NULL, CFGF_NONE),
|
CFG_STR("password", NULL, CFGF_NONE),
|
||||||
CFG_STR_LIST("directories", NULL, CFGF_NONE),
|
CFG_STR_LIST("directories", NULL, CFGF_NONE),
|
||||||
CFG_STR_LIST("podcasts", NULL, CFGF_NONE),
|
CFG_STR_LIST("podcasts", NULL, CFGF_NONE),
|
||||||
|
CFG_STR_LIST("audiobooks", NULL, CFGF_NONE),
|
||||||
CFG_STR_LIST("compilations", NULL, CFGF_NONE),
|
CFG_STR_LIST("compilations", NULL, CFGF_NONE),
|
||||||
CFG_STR("compilation_artist", NULL, CFGF_NONE),
|
CFG_STR("compilation_artist", NULL, CFGF_NONE),
|
||||||
CFG_STR("name_library", "Library", CFGF_NONE),
|
CFG_STR("name_library", "Library", CFGF_NONE),
|
||||||
@ -68,6 +69,7 @@ static cfg_opt_t sec_library[] =
|
|||||||
CFG_STR("name_movies", "Movies", CFGF_NONE),
|
CFG_STR("name_movies", "Movies", CFGF_NONE),
|
||||||
CFG_STR("name_tvshows", "TV Shows", CFGF_NONE),
|
CFG_STR("name_tvshows", "TV Shows", CFGF_NONE),
|
||||||
CFG_STR("name_podcasts", "Podcasts", CFGF_NONE),
|
CFG_STR("name_podcasts", "Podcasts", CFGF_NONE),
|
||||||
|
CFG_STR("name_audiobooks", "Audiobooks", CFGF_NONE),
|
||||||
CFG_STR_LIST("artwork_basenames", "{artwork,cover,Folder}", CFGF_NONE),
|
CFG_STR_LIST("artwork_basenames", "{artwork,cover,Folder}", CFGF_NONE),
|
||||||
CFG_STR_LIST("filetypes_ignore", "{.db,.ini}", CFGF_NONE),
|
CFG_STR_LIST("filetypes_ignore", "{.db,.ini}", CFGF_NONE),
|
||||||
CFG_BOOL("itunes_overrides", cfg_false, CFGF_NONE),
|
CFG_BOOL("itunes_overrides", cfg_false, CFGF_NONE),
|
||||||
|
10
src/db.c
10
src/db.c
@ -598,8 +598,8 @@ static void
|
|||||||
db_set_cfg_names(void)
|
db_set_cfg_names(void)
|
||||||
{
|
{
|
||||||
#define Q_TMPL "UPDATE playlists SET title = '%q' WHERE type = 1 AND special_id = %d;"
|
#define Q_TMPL "UPDATE playlists SET title = '%q' WHERE type = 1 AND special_id = %d;"
|
||||||
char *cfg_item[5] = { "name_library", "name_music", "name_movies", "name_tvshows", "name_podcasts" };
|
char *cfg_item[6] = { "name_library", "name_music", "name_movies", "name_tvshows", "name_podcasts", "name_audiobooks" };
|
||||||
char special_id[5] = { 0, 6, 4, 5, 1 };
|
char special_id[6] = { 0, 6, 4, 5, 1, 7 };
|
||||||
cfg_t *lib;
|
cfg_t *lib;
|
||||||
char *query;
|
char *query;
|
||||||
char *title;
|
char *title;
|
||||||
@ -4352,10 +4352,13 @@ db_perthread_deinit(void)
|
|||||||
"INSERT INTO playlists (id, title, type, query, db_timestamp, path, idx, special_id)" \
|
"INSERT INTO playlists (id, title, type, query, db_timestamp, path, idx, special_id)" \
|
||||||
" VALUES(5, 'Podcasts', 1, 'f.media_kind = 4', 0, '', 0, 1);"
|
" VALUES(5, 'Podcasts', 1, 'f.media_kind = 4', 0, '', 0, 1);"
|
||||||
|
|
||||||
|
#define Q_PL6 \
|
||||||
|
"INSERT INTO playlists (id, title, type, query, db_timestamp, path, idx, special_id)" \
|
||||||
|
" VALUES(6, 'Audiobooks', 1, 'f.media_kind = 8', 0, '', 0, 7);"
|
||||||
|
|
||||||
/* These are the remaining automatically-created iTunes playlists, but
|
/* These are the remaining automatically-created iTunes playlists, but
|
||||||
* their query is unknown
|
* their query is unknown
|
||||||
" VALUES(6, 'iTunes U', 0, 'media_kind = 256', 0, '', 0, 13);"
|
" VALUES(6, 'iTunes U', 0, 'media_kind = 256', 0, '', 0, 13);"
|
||||||
" VALUES(7, 'Audiobooks', 0, 'media_kind = 512', 0, '', 0, 7);"
|
|
||||||
" VALUES(8, 'Purchased', 0, 'media_kind = 1024', 0, '', 0, 8);"
|
" VALUES(8, 'Purchased', 0, 'media_kind = 1024', 0, '', 0, 8);"
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -4409,6 +4412,7 @@ static const struct db_init_query db_init_queries[] =
|
|||||||
{ Q_PL3, "create default smart playlist 'Movies'" },
|
{ Q_PL3, "create default smart playlist 'Movies'" },
|
||||||
{ Q_PL4, "create default smart playlist 'TV Shows'" },
|
{ Q_PL4, "create default smart playlist 'TV Shows'" },
|
||||||
{ Q_PL5, "create default smart playlist 'Podcasts'" },
|
{ Q_PL5, "create default smart playlist 'Podcasts'" },
|
||||||
|
{ Q_PL6, "create default smart playlist 'Audiobooks'" },
|
||||||
|
|
||||||
{ Q_SCVER, "set schema version" },
|
{ Q_SCVER, "set schema version" },
|
||||||
};
|
};
|
||||||
|
@ -472,6 +472,8 @@ process_media_file(char *file, time_t mtime, off_t size, int type, struct extinf
|
|||||||
mfi.compilation = 1;
|
mfi.compilation = 1;
|
||||||
if (type & F_SCAN_TYPE_PODCAST)
|
if (type & F_SCAN_TYPE_PODCAST)
|
||||||
mfi.media_kind = 4; /* podcast */
|
mfi.media_kind = 4; /* podcast */
|
||||||
|
if (type & F_SCAN_TYPE_AUDIOBOOK)
|
||||||
|
mfi.media_kind = 8; /* audiobook */
|
||||||
|
|
||||||
if (!mfi.item_kind)
|
if (!mfi.item_kind)
|
||||||
mfi.item_kind = 2; /* music */
|
mfi.item_kind = 2; /* music */
|
||||||
@ -612,38 +614,17 @@ process_file(char *file, time_t mtime, off_t size, int type, int flags)
|
|||||||
|
|
||||||
/* Thread: scan */
|
/* Thread: scan */
|
||||||
static int
|
static int
|
||||||
check_podcast(char *path)
|
check_speciallib(char *path, const char *libtype)
|
||||||
{
|
{
|
||||||
cfg_t *lib;
|
cfg_t *lib;
|
||||||
int ndirs;
|
int ndirs;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
lib = cfg_getsec(cfg, "library");
|
lib = cfg_getsec(cfg, "library");
|
||||||
ndirs = cfg_size(lib, "podcasts");
|
ndirs = cfg_size(lib, libtype);
|
||||||
|
|
||||||
for (i = 0; i < ndirs; i++)
|
for (i = 0; i < ndirs; i++)
|
||||||
{
|
{
|
||||||
if (strstr(path, cfg_getnstr(lib, "podcasts", i)))
|
if (strstr(path, cfg_getnstr(lib, libtype, i)))
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Thread: scan */
|
|
||||||
static int
|
|
||||||
check_compilation(char *path)
|
|
||||||
{
|
|
||||||
cfg_t *lib;
|
|
||||||
int ndirs;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
lib = cfg_getsec(cfg, "library");
|
|
||||||
ndirs = cfg_size(lib, "compilations");
|
|
||||||
|
|
||||||
for (i = 0; i < ndirs; i++)
|
|
||||||
{
|
|
||||||
if (strstr(path, cfg_getnstr(lib, "compilations", i)))
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -698,10 +679,12 @@ process_directory(char *path, int flags)
|
|||||||
|
|
||||||
/* Check if compilation and/or podcast directory */
|
/* Check if compilation and/or podcast directory */
|
||||||
type = 0;
|
type = 0;
|
||||||
if (check_compilation(path))
|
if (check_speciallib(path, "compilations"))
|
||||||
type |= F_SCAN_TYPE_COMPILATION;
|
type |= F_SCAN_TYPE_COMPILATION;
|
||||||
if (check_podcast(path))
|
if (check_speciallib(path, "podcasts"))
|
||||||
type |= F_SCAN_TYPE_PODCAST;
|
type |= F_SCAN_TYPE_PODCAST;
|
||||||
|
if (check_speciallib(path, "audiobooks"))
|
||||||
|
type |= F_SCAN_TYPE_AUDIOBOOK;
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
@ -1160,10 +1143,12 @@ process_inotify_file(struct watch_info *wi, char *path, struct inotify_event *ie
|
|||||||
}
|
}
|
||||||
|
|
||||||
type = 0;
|
type = 0;
|
||||||
if (check_compilation(path))
|
if (check_speciallib(path, "compilations"))
|
||||||
type |= F_SCAN_TYPE_COMPILATION;
|
type |= F_SCAN_TYPE_COMPILATION;
|
||||||
if (check_podcast(path))
|
if (check_speciallib(path, "podcasts"))
|
||||||
type |= F_SCAN_TYPE_PODCAST;
|
type |= F_SCAN_TYPE_PODCAST;
|
||||||
|
if (check_speciallib(path, "audiobooks"))
|
||||||
|
type |= F_SCAN_TYPE_AUDIOBOOK;
|
||||||
|
|
||||||
process_file(file, sb.st_mtime, sb.st_size, type, 0);
|
process_file(file, sb.st_mtime, sb.st_size, type, 0);
|
||||||
|
|
||||||
|
@ -5,8 +5,9 @@
|
|||||||
#include "db.h"
|
#include "db.h"
|
||||||
|
|
||||||
#define F_SCAN_TYPE_PODCAST (1 << 0)
|
#define F_SCAN_TYPE_PODCAST (1 << 0)
|
||||||
#define F_SCAN_TYPE_COMPILATION (1 << 1)
|
#define F_SCAN_TYPE_AUDIOBOOK (1 << 1)
|
||||||
#define F_SCAN_TYPE_URL (1 << 2)
|
#define F_SCAN_TYPE_COMPILATION (1 << 2)
|
||||||
|
#define F_SCAN_TYPE_URL (1 << 3)
|
||||||
|
|
||||||
int
|
int
|
||||||
filescanner_init(void);
|
filescanner_init(void);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user