[scan] Probe remote streams async
This commit is contained in:
parent
21c80fbf10
commit
9b76eb72d0
|
@ -141,10 +141,41 @@ exttag_read(struct media_file_info *mfi, const char *tag)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum command_state
|
||||||
|
probe_async(void *arg, int *retval)
|
||||||
|
{
|
||||||
|
char *vpath = arg;
|
||||||
|
struct media_file_info *mfi;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
mfi = db_file_fetch_byvirtualpath(vpath);
|
||||||
|
if (!mfi)
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_SCAN, "Item '%s' disappeared from the database before probe\n", vpath);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = scan_metadata_ffmpeg(mfi, mfi->path);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_SCAN, "Item '%s' is unavailable for probe/metadata, using defaults\n", vpath);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
library_media_save(mfi);
|
||||||
|
|
||||||
|
out:
|
||||||
|
free_mfi(mfi, 0);
|
||||||
|
|
||||||
|
*retval = 0;
|
||||||
|
return COMMAND_END;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
scan_metadata_stream(struct media_file_info *mfi, const char *path)
|
scan_metadata_stream(struct media_file_info *mfi, const char *path)
|
||||||
{
|
{
|
||||||
char *pos;
|
char *pos;
|
||||||
|
char *vpathcpy;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
mfi->path = strdup(path);
|
mfi->path = strdup(path);
|
||||||
|
@ -160,13 +191,20 @@ scan_metadata_stream(struct media_file_info *mfi, const char *path)
|
||||||
mfi->time_modified = time(NULL);
|
mfi->time_modified = time(NULL);
|
||||||
mfi->directory_id = DIR_HTTP;
|
mfi->directory_id = DIR_HTTP;
|
||||||
|
|
||||||
ret = scan_metadata_ffmpeg(mfi, path);
|
// Assume MP3 encoding, the async probe should give the real encoding
|
||||||
|
mfi->type = strdup("mp3");
|
||||||
|
mfi->codectype = strdup("mpeg");
|
||||||
|
mfi->description = strdup("Assumed MPEG audio file");
|
||||||
|
|
||||||
|
// If this is a new item then the mfi->id is not known yet, so instead we pass
|
||||||
|
// the virtual path to the async scan, thus serving as a key so we can find
|
||||||
|
// and update the item in the db.
|
||||||
|
vpathcpy = strdup(mfi->virtual_path);
|
||||||
|
ret = library_exec_async(probe_async, vpathcpy); // Will free vpathcpy after exec via command_cb_async()
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_SCAN, "Playlist URL '%s' is unavailable for probe/metadata, assuming MP3 encoding\n", path);
|
free(vpathcpy);
|
||||||
mfi->type = strdup("mp3");
|
DPRINTF(E_LOG, L_SCAN, "Async probe of '%s' failed, using defaults\n", path);
|
||||||
mfi->codectype = strdup("mpeg");
|
|
||||||
mfi->description = strdup("MPEG audio file");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mfi->title)
|
if (!mfi->title)
|
||||||
|
|
|
@ -486,6 +486,8 @@ rss_save(struct playlist_info *pli, int *count, enum rss_scan_type scan_type)
|
||||||
time_added = 0;
|
time_added = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This will also probe the url with ffmpeg, which gives us additional
|
||||||
|
// metadata, plus information about existence of embedded artwork
|
||||||
scan_metadata_stream(&mfi, ri.url);
|
scan_metadata_stream(&mfi, ri.url);
|
||||||
|
|
||||||
mfi_metadata_fixup(&mfi, &ri, feed_title, feed_author, time_added);
|
mfi_metadata_fixup(&mfi, &ri, feed_title, feed_author, time_added);
|
||||||
|
|
Loading…
Reference in New Issue