mirror of
https://github.com/owntone/owntone-server.git
synced 2025-01-15 16:53:18 -05:00
Merge branch 'artwork_mediakind1'
This commit is contained in:
commit
d0738aabae
@ -103,6 +103,7 @@ struct artwork_ctx {
|
|||||||
struct db_media_file_info *dbmfi;
|
struct db_media_file_info *dbmfi;
|
||||||
int id;
|
int id;
|
||||||
uint32_t data_kind;
|
uint32_t data_kind;
|
||||||
|
uint32_t media_kind;
|
||||||
// Input data for group handlers
|
// Input data for group handlers
|
||||||
int64_t persistentid;
|
int64_t persistentid;
|
||||||
|
|
||||||
@ -121,8 +122,11 @@ struct artwork_source {
|
|||||||
// The handler
|
// The handler
|
||||||
int (*handler)(struct artwork_ctx *ctx);
|
int (*handler)(struct artwork_ctx *ctx);
|
||||||
|
|
||||||
// What data_kinds the handler can work with, combined with (1 << A) | (1 << B)
|
// data_kinds the handler can work with, combined with (1 << A) | (1 << B)
|
||||||
int data_kinds;
|
uint32_t data_kinds;
|
||||||
|
|
||||||
|
// media_kinds the handler supports, combined with A | B
|
||||||
|
uint32_t media_kinds;
|
||||||
|
|
||||||
// When should results from the source be cached?
|
// When should results from the source be cached?
|
||||||
enum artwork_cache cache;
|
enum artwork_cache cache;
|
||||||
@ -231,66 +235,77 @@ static struct artwork_source artwork_item_source[] =
|
|||||||
.name = "cache",
|
.name = "cache",
|
||||||
.handler = source_item_cache_get,
|
.handler = source_item_cache_get,
|
||||||
.data_kinds = (1 << DATA_KIND_FILE) | (1 << DATA_KIND_SPOTIFY),
|
.data_kinds = (1 << DATA_KIND_FILE) | (1 << DATA_KIND_SPOTIFY),
|
||||||
|
.media_kinds = MEDIA_KIND_ALL,
|
||||||
.cache = ON_FAILURE,
|
.cache = ON_FAILURE,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "embedded",
|
.name = "embedded",
|
||||||
.handler = source_item_embedded_get,
|
.handler = source_item_embedded_get,
|
||||||
.data_kinds = (1 << DATA_KIND_FILE) | (1 << DATA_KIND_HTTP),
|
.data_kinds = (1 << DATA_KIND_FILE) | (1 << DATA_KIND_HTTP),
|
||||||
|
.media_kinds = MEDIA_KIND_ALL,
|
||||||
.cache = ON_SUCCESS | ON_FAILURE,
|
.cache = ON_SUCCESS | ON_FAILURE,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "own",
|
.name = "own",
|
||||||
.handler = source_item_own_get,
|
.handler = source_item_own_get,
|
||||||
.data_kinds = (1 << DATA_KIND_FILE),
|
.data_kinds = (1 << DATA_KIND_FILE),
|
||||||
|
.media_kinds = MEDIA_KIND_ALL,
|
||||||
.cache = ON_SUCCESS | ON_FAILURE,
|
.cache = ON_SUCCESS | ON_FAILURE,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "stream",
|
.name = "stream",
|
||||||
.handler = source_item_stream_get,
|
.handler = source_item_stream_get,
|
||||||
.data_kinds = (1 << DATA_KIND_HTTP),
|
.data_kinds = (1 << DATA_KIND_HTTP),
|
||||||
|
.media_kinds = MEDIA_KIND_MUSIC,
|
||||||
.cache = STASH,
|
.cache = STASH,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "pipe",
|
.name = "pipe",
|
||||||
.handler = source_item_pipe_get,
|
.handler = source_item_pipe_get,
|
||||||
.data_kinds = (1 << DATA_KIND_PIPE),
|
.data_kinds = (1 << DATA_KIND_PIPE),
|
||||||
|
.media_kinds = MEDIA_KIND_ALL,
|
||||||
.cache = NEVER,
|
.cache = NEVER,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Spotify track web api",
|
.name = "Spotify track web api",
|
||||||
.handler = source_item_spotifywebapi_track_get,
|
.handler = source_item_spotifywebapi_track_get,
|
||||||
.data_kinds = (1 << DATA_KIND_SPOTIFY),
|
.data_kinds = (1 << DATA_KIND_SPOTIFY),
|
||||||
|
.media_kinds = MEDIA_KIND_ALL,
|
||||||
.cache = ON_SUCCESS | ON_FAILURE,
|
.cache = ON_SUCCESS | ON_FAILURE,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "playlist own",
|
.name = "playlist own",
|
||||||
.handler = source_item_ownpl_get,
|
.handler = source_item_ownpl_get,
|
||||||
.data_kinds = (1 << DATA_KIND_HTTP),
|
.data_kinds = (1 << DATA_KIND_HTTP),
|
||||||
|
.media_kinds = MEDIA_KIND_ALL,
|
||||||
.cache = ON_SUCCESS | ON_FAILURE,
|
.cache = ON_SUCCESS | ON_FAILURE,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Spotify search web api (files)",
|
.name = "Spotify search web api (files)",
|
||||||
.handler = source_item_spotifywebapi_search_get,
|
.handler = source_item_spotifywebapi_search_get,
|
||||||
.data_kinds = (1 << DATA_KIND_FILE),
|
.data_kinds = (1 << DATA_KIND_FILE),
|
||||||
|
.media_kinds = MEDIA_KIND_MUSIC,
|
||||||
.cache = ON_SUCCESS | ON_FAILURE,
|
.cache = ON_SUCCESS | ON_FAILURE,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Spotify search web api (streams)",
|
.name = "Spotify search web api (streams)",
|
||||||
.handler = source_item_spotifywebapi_search_get,
|
.handler = source_item_spotifywebapi_search_get,
|
||||||
.data_kinds = (1 << DATA_KIND_HTTP) | (1 << DATA_KIND_PIPE),
|
.data_kinds = (1 << DATA_KIND_HTTP) | (1 << DATA_KIND_PIPE),
|
||||||
|
.media_kinds = MEDIA_KIND_MUSIC,
|
||||||
.cache = STASH,
|
.cache = STASH,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Discogs (files)",
|
.name = "Discogs (files)",
|
||||||
.handler = source_item_discogs_get,
|
.handler = source_item_discogs_get,
|
||||||
.data_kinds = (1 << DATA_KIND_FILE),
|
.data_kinds = (1 << DATA_KIND_FILE),
|
||||||
|
.media_kinds = MEDIA_KIND_MUSIC,
|
||||||
.cache = ON_SUCCESS | ON_FAILURE,
|
.cache = ON_SUCCESS | ON_FAILURE,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "Discogs (streams)",
|
.name = "Discogs (streams)",
|
||||||
.handler = source_item_discogs_get,
|
.handler = source_item_discogs_get,
|
||||||
.data_kinds = (1 << DATA_KIND_HTTP) | (1 << DATA_KIND_PIPE),
|
.data_kinds = (1 << DATA_KIND_HTTP) | (1 << DATA_KIND_PIPE),
|
||||||
|
.media_kinds = MEDIA_KIND_MUSIC,
|
||||||
.cache = STASH,
|
.cache = STASH,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -298,6 +313,7 @@ static struct artwork_source artwork_item_source[] =
|
|||||||
.name = "Cover Art Archive (files)",
|
.name = "Cover Art Archive (files)",
|
||||||
.handler = source_item_coverartarchive_get,
|
.handler = source_item_coverartarchive_get,
|
||||||
.data_kinds = (1 << DATA_KIND_FILE),
|
.data_kinds = (1 << DATA_KIND_FILE),
|
||||||
|
.media_kinds = MEDIA_KIND_MUSIC,
|
||||||
.cache = ON_SUCCESS | ON_FAILURE,
|
.cache = ON_SUCCESS | ON_FAILURE,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -305,6 +321,7 @@ static struct artwork_source artwork_item_source[] =
|
|||||||
.name = "Cover Art Archive (streams)",
|
.name = "Cover Art Archive (streams)",
|
||||||
.handler = source_item_coverartarchive_get,
|
.handler = source_item_coverartarchive_get,
|
||||||
.data_kinds = (1 << DATA_KIND_HTTP) | (1 << DATA_KIND_PIPE),
|
.data_kinds = (1 << DATA_KIND_HTTP) | (1 << DATA_KIND_PIPE),
|
||||||
|
.media_kinds = MEDIA_KIND_MUSIC,
|
||||||
.cache = STASH,
|
.cache = STASH,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -1500,15 +1517,8 @@ source_item_stream_get(struct artwork_ctx *ctx)
|
|||||||
char *url;
|
char *url;
|
||||||
char *ext;
|
char *ext;
|
||||||
int len;
|
int len;
|
||||||
int media_kind;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = safe_atoi32(ctx->dbmfi->media_kind, &media_kind);
|
|
||||||
if (ret != 0 || media_kind != MEDIA_KIND_MUSIC)
|
|
||||||
{
|
|
||||||
DPRINTF(E_SPAM, L_ART, "Ignoring internet stream artwork request for media_kind != music: %s\n", ctx->dbmfi->path);
|
|
||||||
return ART_E_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
DPRINTF(E_SPAM, L_ART, "Trying internet stream artwork in %s\n", ctx->dbmfi->path);
|
DPRINTF(E_SPAM, L_ART, "Trying internet stream artwork in %s\n", ctx->dbmfi->path);
|
||||||
|
|
||||||
@ -1574,19 +1584,11 @@ static int
|
|||||||
source_item_discogs_get(struct artwork_ctx *ctx)
|
source_item_discogs_get(struct artwork_ctx *ctx)
|
||||||
{
|
{
|
||||||
char *url;
|
char *url;
|
||||||
int media_kind;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!online_source_is_enabled(&discogs_source))
|
if (!online_source_is_enabled(&discogs_source))
|
||||||
return ART_E_NONE;
|
return ART_E_NONE;
|
||||||
|
|
||||||
ret = safe_atoi32(ctx->dbmfi->media_kind, &media_kind);
|
|
||||||
if (ret != 0 || media_kind != MEDIA_KIND_MUSIC)
|
|
||||||
{
|
|
||||||
DPRINTF(E_SPAM, L_ART, "Ignoring internet stream artwork request for media_kind != music: %s\n", ctx->dbmfi->path);
|
|
||||||
return ART_E_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
url = online_source_search(&discogs_source, ctx);
|
url = online_source_search(&discogs_source, ctx);
|
||||||
if (!url)
|
if (!url)
|
||||||
return ART_E_NONE;
|
return ART_E_NONE;
|
||||||
@ -1603,19 +1605,11 @@ static int
|
|||||||
source_item_coverartarchive_get(struct artwork_ctx *ctx)
|
source_item_coverartarchive_get(struct artwork_ctx *ctx)
|
||||||
{
|
{
|
||||||
char *url;
|
char *url;
|
||||||
int media_kind;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!online_source_is_enabled(&musicbrainz_source))
|
if (!online_source_is_enabled(&musicbrainz_source))
|
||||||
return ART_E_NONE;
|
return ART_E_NONE;
|
||||||
|
|
||||||
ret = safe_atoi32(ctx->dbmfi->media_kind, &media_kind);
|
|
||||||
if (ret != 0 || media_kind != MEDIA_KIND_MUSIC)
|
|
||||||
{
|
|
||||||
DPRINTF(E_SPAM, L_ART, "Ignoring internet stream artwork request for media_kind != music: %s\n", ctx->dbmfi->path);
|
|
||||||
return ART_E_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// We search Musicbrainz to get the Musicbrainz ID, which we need to get the
|
// We search Musicbrainz to get the Musicbrainz ID, which we need to get the
|
||||||
// artwork from the Cover Art Archive
|
// artwork from the Cover Art Archive
|
||||||
url = online_source_search(&musicbrainz_source, ctx);
|
url = online_source_search(&musicbrainz_source, ctx);
|
||||||
@ -1655,19 +1649,11 @@ source_item_spotifywebapi_search_get(struct artwork_ctx *ctx)
|
|||||||
{
|
{
|
||||||
struct spotifywebapi_access_token info;
|
struct spotifywebapi_access_token info;
|
||||||
char *url;
|
char *url;
|
||||||
int media_kind;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!online_source_is_enabled(&spotify_source))
|
if (!online_source_is_enabled(&spotify_source))
|
||||||
return ART_E_NONE;
|
return ART_E_NONE;
|
||||||
|
|
||||||
ret = safe_atoi32(ctx->dbmfi->media_kind, &media_kind);
|
|
||||||
if (ret != 0 || media_kind != MEDIA_KIND_MUSIC)
|
|
||||||
{
|
|
||||||
DPRINTF(E_SPAM, L_ART, "Ignoring internet stream artwork request for media_kind != music: %s\n", ctx->dbmfi->path);
|
|
||||||
return ART_E_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
spotifywebapi_access_token_get(&info);
|
spotifywebapi_access_token_get(&info);
|
||||||
if (!info.token)
|
if (!info.token)
|
||||||
return ART_E_ERROR;
|
return ART_E_ERROR;
|
||||||
@ -1797,10 +1783,11 @@ process_items(struct artwork_ctx *ctx, int item_mode)
|
|||||||
|
|
||||||
ret = (safe_atoi32(dbmfi.id, &ctx->id) < 0) ||
|
ret = (safe_atoi32(dbmfi.id, &ctx->id) < 0) ||
|
||||||
(safe_atou32(dbmfi.data_kind, &ctx->data_kind) < 0) ||
|
(safe_atou32(dbmfi.data_kind, &ctx->data_kind) < 0) ||
|
||||||
|
(safe_atou32(dbmfi.media_kind, &ctx->media_kind) < 0) ||
|
||||||
(ctx->data_kind > 30);
|
(ctx->data_kind > 30);
|
||||||
if (ret)
|
if (ret)
|
||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_ART, "Error converting dbmfi id or data_kind to number\n");
|
DPRINTF(E_LOG, L_ART, "Error converting dbmfi id, data_kind or media_kind to number for '%s'\n", dbmfi.path);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1809,6 +1796,9 @@ process_items(struct artwork_ctx *ctx, int item_mode)
|
|||||||
if ((artwork_item_source[i].data_kinds & (1 << ctx->data_kind)) == 0)
|
if ((artwork_item_source[i].data_kinds & (1 << ctx->data_kind)) == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if ((artwork_item_source[i].media_kinds & ctx->media_kind) == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
// If just one handler says we should not cache a negative result then we obey that
|
// If just one handler says we should not cache a negative result then we obey that
|
||||||
if ((artwork_item_source[i].cache & ON_FAILURE) == 0)
|
if ((artwork_item_source[i].cache & ON_FAILURE) == 0)
|
||||||
ctx->cache = NEVER;
|
ctx->cache = NEVER;
|
||||||
|
3
src/db.h
3
src/db.h
@ -5,6 +5,7 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
#include "outputs.h"
|
#include "outputs.h"
|
||||||
|
|
||||||
@ -121,6 +122,8 @@ enum media_kind {
|
|||||||
MEDIA_KIND_TVSHOW = 64,
|
MEDIA_KIND_TVSHOW = 64,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define MEDIA_KIND_ALL USHRT_MAX
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
db_media_kind_label(enum media_kind media_kind);
|
db_media_kind_label(enum media_kind media_kind);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user