mirror of
https://github.com/owntone/owntone-server.git
synced 2025-01-28 15:06:02 -05:00
Merge pull request #1105 from chme/rescan-metadata
[spotify] Force metadata update on library "metarescan" update
This commit is contained in:
commit
3395773c9f
@ -38,6 +38,12 @@
|
|||||||
#include "spotify.h"
|
#include "spotify.h"
|
||||||
|
|
||||||
|
|
||||||
|
enum spotify_request_type {
|
||||||
|
SPOTIFY_REQUEST_TYPE_DEFAULT,
|
||||||
|
SPOTIFY_REQUEST_TYPE_RESCAN,
|
||||||
|
SPOTIFY_REQUEST_TYPE_METARESCAN,
|
||||||
|
};
|
||||||
|
|
||||||
struct spotify_album
|
struct spotify_album
|
||||||
{
|
{
|
||||||
const char *added_at;
|
const char *added_at;
|
||||||
@ -503,7 +509,7 @@ request_endpoint_with_token_refresh(const char *href)
|
|||||||
}
|
}
|
||||||
|
|
||||||
typedef int (*paging_request_cb)(void *arg);
|
typedef int (*paging_request_cb)(void *arg);
|
||||||
typedef int (*paging_item_cb)(json_object *item, int index, int total, void *arg);
|
typedef int (*paging_item_cb)(json_object *item, int index, int total, enum spotify_request_type request_type, void *arg);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Request the spotify endpoint at 'href'
|
* Request the spotify endpoint at 'href'
|
||||||
@ -533,7 +539,7 @@ typedef int (*paging_item_cb)(json_object *item, int index, int total, void *arg
|
|||||||
* @return 0 on success, -1 on failure
|
* @return 0 on success, -1 on failure
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
request_pagingobject_endpoint(const char *href, paging_item_cb item_cb, paging_request_cb pre_request_cb, paging_request_cb post_request_cb, bool with_market, void *arg)
|
request_pagingobject_endpoint(const char *href, paging_item_cb item_cb, paging_request_cb pre_request_cb, paging_request_cb post_request_cb, bool with_market, enum spotify_request_type request_type, void *arg)
|
||||||
{
|
{
|
||||||
char *next_href;
|
char *next_href;
|
||||||
json_object *response;
|
json_object *response;
|
||||||
@ -594,7 +600,7 @@ request_pagingobject_endpoint(const char *href, paging_item_cb item_cb, paging_r
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = item_cb(item, (i + offset), total, arg);
|
ret = item_cb(item, (i + offset), total, request_type, arg);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_SPOTIFY, "Unexpected JSON: error processing item at index %d '%s' (API endpoint: '%s')\n",
|
DPRINTF(E_LOG, L_SPOTIFY, "Unexpected JSON: error processing item at index %d '%s' (API endpoint: '%s')\n",
|
||||||
@ -1097,7 +1103,7 @@ struct queue_add_album_param {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static int
|
static int
|
||||||
queue_add_album_tracks(json_object *item, int index, int total, void *arg)
|
queue_add_album_tracks(json_object *item, int index, int total, enum spotify_request_type request_type, void *arg)
|
||||||
{
|
{
|
||||||
struct queue_add_album_param *param;
|
struct queue_add_album_param *param;
|
||||||
struct spotify_track track;
|
struct spotify_track track;
|
||||||
@ -1142,7 +1148,7 @@ queue_add_album(const char *uri, int position, char reshuffle, uint32_t item_id,
|
|||||||
|
|
||||||
endpoint_uri = get_album_tracks_endpoint_uri(uri);
|
endpoint_uri = get_album_tracks_endpoint_uri(uri);
|
||||||
|
|
||||||
ret = request_pagingobject_endpoint(endpoint_uri, queue_add_album_tracks, NULL, NULL, true, ¶m);
|
ret = request_pagingobject_endpoint(endpoint_uri, queue_add_album_tracks, NULL, NULL, true, SPOTIFY_REQUEST_TYPE_DEFAULT, ¶m);
|
||||||
|
|
||||||
ret = db_queue_add_end(¶m.queue_add_info, reshuffle, item_id, ret);
|
ret = db_queue_add_end(¶m.queue_add_info, reshuffle, item_id, ret);
|
||||||
if (ret == 0 && count)
|
if (ret == 0 && count)
|
||||||
@ -1157,7 +1163,7 @@ queue_add_album(const char *uri, int position, char reshuffle, uint32_t item_id,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
queue_add_albums(json_object *item, int index, int total, void *arg)
|
queue_add_albums(json_object *item, int index, int total, enum spotify_request_type request_type, void *arg)
|
||||||
{
|
{
|
||||||
struct db_queue_add_info *param;
|
struct db_queue_add_info *param;
|
||||||
struct queue_add_album_param param_add_album;
|
struct queue_add_album_param param_add_album;
|
||||||
@ -1170,7 +1176,7 @@ queue_add_albums(json_object *item, int index, int total, void *arg)
|
|||||||
parse_metadata_album(item, ¶m_add_album.album, ART_DEFAULT_WIDTH);
|
parse_metadata_album(item, ¶m_add_album.album, ART_DEFAULT_WIDTH);
|
||||||
|
|
||||||
endpoint_uri = get_album_tracks_endpoint_uri(param_add_album.album.uri);
|
endpoint_uri = get_album_tracks_endpoint_uri(param_add_album.album.uri);
|
||||||
ret = request_pagingobject_endpoint(endpoint_uri, queue_add_album_tracks, NULL, NULL, true, ¶m_add_album);
|
ret = request_pagingobject_endpoint(endpoint_uri, queue_add_album_tracks, NULL, NULL, true, SPOTIFY_REQUEST_TYPE_DEFAULT, ¶m_add_album);
|
||||||
|
|
||||||
*param = param_add_album.queue_add_info;
|
*param = param_add_album.queue_add_info;
|
||||||
|
|
||||||
@ -1191,7 +1197,7 @@ queue_add_artist(const char *uri, int position, char reshuffle, uint32_t item_id
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
endpoint_uri = get_artist_albums_endpoint_uri(uri);
|
endpoint_uri = get_artist_albums_endpoint_uri(uri);
|
||||||
ret = request_pagingobject_endpoint(endpoint_uri, queue_add_albums, NULL, NULL, true, &queue_add_info);
|
ret = request_pagingobject_endpoint(endpoint_uri, queue_add_albums, NULL, NULL, true, SPOTIFY_REQUEST_TYPE_DEFAULT, &queue_add_info);
|
||||||
|
|
||||||
ret = db_queue_add_end(&queue_add_info, reshuffle, item_id, ret);
|
ret = db_queue_add_end(&queue_add_info, reshuffle, item_id, ret);
|
||||||
if (ret == 0 && count)
|
if (ret == 0 && count)
|
||||||
@ -1202,7 +1208,7 @@ queue_add_artist(const char *uri, int position, char reshuffle, uint32_t item_id
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
queue_add_playlist_tracks(json_object *item, int index, int total, void *arg)
|
queue_add_playlist_tracks(json_object *item, int index, int total, enum spotify_request_type request_type, void *arg)
|
||||||
{
|
{
|
||||||
struct db_queue_add_info *queue_add_info;
|
struct db_queue_add_info *queue_add_info;
|
||||||
struct spotify_track track;
|
struct spotify_track track;
|
||||||
@ -1250,7 +1256,7 @@ queue_add_playlist(const char *uri, int position, char reshuffle, uint32_t item_
|
|||||||
|
|
||||||
endpoint_uri = get_playlist_tracks_endpoint_uri(uri);
|
endpoint_uri = get_playlist_tracks_endpoint_uri(uri);
|
||||||
|
|
||||||
ret = request_pagingobject_endpoint(endpoint_uri, queue_add_playlist_tracks, NULL, NULL, true, &queue_add_info);
|
ret = request_pagingobject_endpoint(endpoint_uri, queue_add_playlist_tracks, NULL, NULL, true, SPOTIFY_REQUEST_TYPE_DEFAULT, &queue_add_info);
|
||||||
|
|
||||||
ret = db_queue_add_end(&queue_add_info, reshuffle, item_id, ret);
|
ret = db_queue_add_end(&queue_add_info, reshuffle, item_id, ret);
|
||||||
if (ret == 0 && count)
|
if (ret == 0 && count)
|
||||||
@ -1418,7 +1424,7 @@ map_track_to_mfi(struct media_file_info *mfi, const struct spotify_track *track,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
track_add(struct spotify_track *track, struct spotify_album *album, const char *pl_name, int dir_id)
|
track_add(struct spotify_track *track, struct spotify_album *album, const char *pl_name, int dir_id, enum spotify_request_type request_type)
|
||||||
{
|
{
|
||||||
struct media_file_info mfi;
|
struct media_file_info mfi;
|
||||||
int ret;
|
int ret;
|
||||||
@ -1434,7 +1440,7 @@ track_add(struct spotify_track *track, struct spotify_album *album, const char *
|
|||||||
DPRINTF(E_DBG, L_SPOTIFY, "Track '%s' (%s) linked from %s\n", track->name, track->uri, track->linked_from_uri);
|
DPRINTF(E_DBG, L_SPOTIFY, "Track '%s' (%s) linked from %s\n", track->name, track->uri, track->linked_from_uri);
|
||||||
|
|
||||||
ret = db_file_ping_bypath(track->uri, track->mtime);
|
ret = db_file_ping_bypath(track->uri, track->mtime);
|
||||||
if (ret == 0)
|
if (ret == 0 || request_type == SPOTIFY_REQUEST_TYPE_METARESCAN)
|
||||||
{
|
{
|
||||||
DPRINTF(E_DBG, L_SPOTIFY, "Track '%s' (%s) is new or modified (mtime is %" PRIi64 ")\n",
|
DPRINTF(E_DBG, L_SPOTIFY, "Track '%s' (%s) is new or modified (mtime is %" PRIi64 ")\n",
|
||||||
track->name, track->uri, (int64_t)track->mtime);
|
track->name, track->uri, (int64_t)track->mtime);
|
||||||
@ -1481,7 +1487,7 @@ playlist_add_or_update(struct playlist_info *pli)
|
|||||||
* Add a saved album to the library
|
* Add a saved album to the library
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
saved_album_add(json_object *item, int index, int total, void *arg)
|
saved_album_add(json_object *item, int index, int total, enum spotify_request_type request_type, void *arg)
|
||||||
{
|
{
|
||||||
json_object *jsonalbum;
|
json_object *jsonalbum;
|
||||||
struct spotify_album album;
|
struct spotify_album album;
|
||||||
@ -1531,7 +1537,7 @@ saved_album_add(json_object *item, int index, int total, void *arg)
|
|||||||
parse_metadata_track(jsontrack, &track, 0);
|
parse_metadata_track(jsontrack, &track, 0);
|
||||||
track.mtime = album.mtime;
|
track.mtime = album.mtime;
|
||||||
|
|
||||||
ret = track_add(&track, &album, NULL, dir_id);
|
ret = track_add(&track, &album, NULL, dir_id, request_type);
|
||||||
|
|
||||||
if (ret == 0 && spotify_saved_plid)
|
if (ret == 0 && spotify_saved_plid)
|
||||||
db_pl_add_item_bypath(spotify_saved_plid, track.uri);
|
db_pl_add_item_bypath(spotify_saved_plid, track.uri);
|
||||||
@ -1551,11 +1557,11 @@ saved_album_add(json_object *item, int index, int total, void *arg)
|
|||||||
* Scan users saved albums into the library
|
* Scan users saved albums into the library
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
scan_saved_albums()
|
scan_saved_albums(enum spotify_request_type request_type)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = request_pagingobject_endpoint(spotify_albums_uri, saved_album_add, NULL, NULL, true, NULL);
|
ret = request_pagingobject_endpoint(spotify_albums_uri, saved_album_add, NULL, NULL, true, request_type, NULL);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -1565,7 +1571,7 @@ scan_saved_albums()
|
|||||||
* Add a saved playlist tracks to the library
|
* Add a saved playlist tracks to the library
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
saved_playlist_tracks_add(json_object *item, int index, int total, void *arg)
|
saved_playlist_tracks_add(json_object *item, int index, int total, enum spotify_request_type request_type, void *arg)
|
||||||
{
|
{
|
||||||
struct spotify_track track;
|
struct spotify_track track;
|
||||||
struct spotify_album album;
|
struct spotify_album album;
|
||||||
@ -1603,7 +1609,7 @@ saved_playlist_tracks_add(json_object *item, int index, int total, void *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
dir_id = prepare_directories(track.album_artist, track.album);
|
dir_id = prepare_directories(track.album_artist, track.album);
|
||||||
ret = track_add(&track, &album, NULL, dir_id);
|
ret = track_add(&track, &album, NULL, dir_id, request_type);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
db_pl_add_item_bypath(*plid, track.uri);
|
db_pl_add_item_bypath(*plid, track.uri);
|
||||||
|
|
||||||
@ -1612,11 +1618,11 @@ saved_playlist_tracks_add(json_object *item, int index, int total, void *arg)
|
|||||||
|
|
||||||
/* Thread: library */
|
/* Thread: library */
|
||||||
static int
|
static int
|
||||||
scan_playlist_tracks(const char *playlist_tracks_endpoint_uri, int plid)
|
scan_playlist_tracks(const char *playlist_tracks_endpoint_uri, int plid, enum spotify_request_type request_type)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = request_pagingobject_endpoint(playlist_tracks_endpoint_uri, saved_playlist_tracks_add, transaction_start, transaction_end, true, &plid);
|
ret = request_pagingobject_endpoint(playlist_tracks_endpoint_uri, saved_playlist_tracks_add, transaction_start, transaction_end, true, request_type, &plid);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -1643,7 +1649,7 @@ map_playlist_to_pli(struct playlist_info *pli, struct spotify_playlist *playlist
|
|||||||
* Add a saved playlist to the library
|
* Add a saved playlist to the library
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
saved_playlist_add(json_object *item, int index, int total, void *arg)
|
saved_playlist_add(json_object *item, int index, int total, enum spotify_request_type request_type, void *arg)
|
||||||
{
|
{
|
||||||
struct spotify_playlist playlist;
|
struct spotify_playlist playlist;
|
||||||
struct playlist_info pli;
|
struct playlist_info pli;
|
||||||
@ -1667,7 +1673,7 @@ saved_playlist_add(json_object *item, int index, int total, void *arg)
|
|||||||
free_pli(&pli, 1);
|
free_pli(&pli, 1);
|
||||||
|
|
||||||
if (pl_id > 0)
|
if (pl_id > 0)
|
||||||
scan_playlist_tracks(playlist.tracks_href, pl_id);
|
scan_playlist_tracks(playlist.tracks_href, pl_id, request_type);
|
||||||
else
|
else
|
||||||
DPRINTF(E_LOG, L_SPOTIFY, "Error adding playlist: '%s' (%s) \n", playlist.name, playlist.uri);
|
DPRINTF(E_LOG, L_SPOTIFY, "Error adding playlist: '%s' (%s) \n", playlist.name, playlist.uri);
|
||||||
|
|
||||||
@ -1682,11 +1688,11 @@ saved_playlist_add(json_object *item, int index, int total, void *arg)
|
|||||||
* Scan users saved playlists into the library
|
* Scan users saved playlists into the library
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
scan_playlists()
|
scan_playlists(enum spotify_request_type request_type)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = request_pagingobject_endpoint(spotify_playlists_uri, saved_playlist_add, NULL, NULL, false, NULL);
|
ret = request_pagingobject_endpoint(spotify_playlists_uri, saved_playlist_add, NULL, NULL, false, request_type, NULL);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -1747,7 +1753,7 @@ create_base_playlist()
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
scan()
|
scan(enum spotify_request_type request_type)
|
||||||
{
|
{
|
||||||
time_t start;
|
time_t start;
|
||||||
time_t end;
|
time_t end;
|
||||||
@ -1764,8 +1770,8 @@ scan()
|
|||||||
db_directory_enable_bypath("/spotify:");
|
db_directory_enable_bypath("/spotify:");
|
||||||
create_base_playlist();
|
create_base_playlist();
|
||||||
create_saved_tracks_playlist();
|
create_saved_tracks_playlist();
|
||||||
scan_saved_albums();
|
scan_saved_albums(request_type);
|
||||||
scan_playlists();
|
scan_playlists(request_type);
|
||||||
|
|
||||||
scanning = false;
|
scanning = false;
|
||||||
end = time(NULL);
|
end = time(NULL);
|
||||||
@ -1812,7 +1818,7 @@ initscan()
|
|||||||
/*
|
/*
|
||||||
* Scan saved tracks from the web api
|
* Scan saved tracks from the web api
|
||||||
*/
|
*/
|
||||||
scan();
|
scan(SPOTIFY_REQUEST_TYPE_RESCAN);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1821,7 +1827,15 @@ initscan()
|
|||||||
static int
|
static int
|
||||||
rescan()
|
rescan()
|
||||||
{
|
{
|
||||||
scan();
|
scan(SPOTIFY_REQUEST_TYPE_RESCAN);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Thread: library */
|
||||||
|
static int
|
||||||
|
metarescan()
|
||||||
|
{
|
||||||
|
scan(SPOTIFY_REQUEST_TYPE_METARESCAN);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1830,7 +1844,7 @@ static int
|
|||||||
fullrescan()
|
fullrescan()
|
||||||
{
|
{
|
||||||
db_spotify_purge();
|
db_spotify_purge();
|
||||||
scan();
|
scan(SPOTIFY_REQUEST_TYPE_RESCAN);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1881,7 +1895,7 @@ webapi_pl_save(void *arg, int *ret)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
*ret = saved_playlist_add(response, 0, 1, NULL);
|
*ret = saved_playlist_add(response, 0, 1, SPOTIFY_REQUEST_TYPE_DEFAULT, NULL);
|
||||||
|
|
||||||
jparse_free(response);
|
jparse_free(response);
|
||||||
|
|
||||||
@ -2063,7 +2077,7 @@ struct library_source spotifyscanner =
|
|||||||
.init = spotifywebapi_init,
|
.init = spotifywebapi_init,
|
||||||
.deinit = spotifywebapi_deinit,
|
.deinit = spotifywebapi_deinit,
|
||||||
.rescan = rescan,
|
.rescan = rescan,
|
||||||
.metarescan = rescan,
|
.metarescan = metarescan,
|
||||||
.initscan = initscan,
|
.initscan = initscan,
|
||||||
.fullrescan = fullrescan,
|
.fullrescan = fullrescan,
|
||||||
.queue_item_add = queue_item_add,
|
.queue_item_add = queue_item_add,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user