demux_playlist: use --directory-filter-types for --autocreate-playlist

This commit is contained in:
Kacper Michajłow 2024-08-09 17:06:04 +02:00
parent ff1f8baecd
commit 4e50da3ddc
3 changed files with 22 additions and 20 deletions

View File

@ -4147,14 +4147,13 @@ Demuxer
This is a string list option. See `List Options`_ for details. This is a string list option. See `List Options`_ for details.
``--autocreate-playlist=<no|any|filter|same>`` ``--autocreate-playlist=<no|filter|same>``
When opening a local file, act as if the parent directory is opened and When opening a local file, act as if the parent directory is opened and
create a playlist automatically. create a playlist automatically.
:no: Load a single file (default). :no: Load a single file (default).
:any: Create a playlist from the parent directory with any file type.
:filter: Create a playlist from the parent directory with files matching :filter: Create a playlist from the parent directory with files matching
extensions from any list ``*-exts``. ``--directory-filter-types``.
:same: Create a playlist from the parent directory with files matching the :same: Create a playlist from the parent directory with files matching the
same category as the currently loaded file. One of the same category as the currently loaded file. One of the
``*-exts`` is selected based on the input file ``*-exts`` is selected based on the input file

View File

@ -120,7 +120,7 @@ const struct m_sub_options demux_conf = {
M_RANGE(0, DBL_MAX)}, M_RANGE(0, DBL_MAX)},
{"metadata-codepage", OPT_STRING(meta_cp)}, {"metadata-codepage", OPT_STRING(meta_cp)},
{"autocreate-playlist", OPT_CHOICE(autocreate_playlist, {"autocreate-playlist", OPT_CHOICE(autocreate_playlist,
{"no", 0}, {"any", 1}, {"filter", 2}, {"same", 3})}, {"no", 0}, {"filter", 1}, {"same", 2})},
{0} {0}
}, },
.size = sizeof(struct demux_opts), .size = sizeof(struct demux_opts),

View File

@ -495,22 +495,33 @@ static bool scan_dir(struct pl_parser *p, char *path,
return true; return true;
} }
static enum autocreate_mode get_directory_filter(struct pl_parser *p)
{
enum autocreate_mode autocreate = AUTO_NONE;
if (!p->opts->directory_filter || !p->opts->directory_filter[0])
autocreate = AUTO_ANY;
if (str_in_list(bstr0("video"), p->opts->directory_filter))
autocreate |= AUTO_VIDEO;
if (str_in_list(bstr0("audio"), p->opts->directory_filter))
autocreate |= AUTO_AUDIO;
if (str_in_list(bstr0("image"), p->opts->directory_filter))
autocreate |= AUTO_IMAGE;
return autocreate;
}
static int parse_dir(struct pl_parser *p) static int parse_dir(struct pl_parser *p)
{ {
int ret = -1; int ret = -1;
struct stream *stream = p->real_stream; struct stream *stream = p->real_stream;
int autocreate = AUTO_NONE; enum autocreate_mode autocreate = AUTO_NONE;
p->pl->playlist_dir = NULL; p->pl->playlist_dir = NULL;
if (p->autocreate_playlist && p->real_stream->is_local_file && !p->real_stream->is_directory) { if (p->autocreate_playlist && p->real_stream->is_local_file && !p->real_stream->is_directory) {
bstr ext = bstr_get_ext(bstr0(p->real_stream->url)); bstr ext = bstr_get_ext(bstr0(p->real_stream->url));
switch (p->autocreate_playlist) { switch (p->autocreate_playlist) {
case 1: // any case 1: // filter
autocreate = AUTO_ANY; autocreate = get_directory_filter(p);
break; break;
case 2: // filter case 2: // same
autocreate = AUTO_VIDEO | AUTO_AUDIO | AUTO_IMAGE;
break;
case 3: // same
if (str_in_list(ext, p->mp_opts->video_exts)) { if (str_in_list(ext, p->mp_opts->video_exts)) {
autocreate = AUTO_VIDEO; autocreate = AUTO_VIDEO;
} else if (str_in_list(ext, p->mp_opts->audio_exts)) { } else if (str_in_list(ext, p->mp_opts->audio_exts)) {
@ -530,15 +541,7 @@ static int parse_dir(struct pl_parser *p)
p->pl->playlist_dir = bstrdup0(p->pl, dir); p->pl->playlist_dir = bstrdup0(p->pl, dir);
} }
} else { } else {
autocreate = AUTO_NONE; autocreate = get_directory_filter(p);
if (!p->opts->directory_filter || !p->opts->directory_filter[0])
autocreate = AUTO_ANY;
if (str_in_list(bstr0("video"), p->opts->directory_filter))
autocreate |= AUTO_VIDEO;
if (str_in_list(bstr0("audio"), p->opts->directory_filter))
autocreate |= AUTO_AUDIO;
if (str_in_list(bstr0("image"), p->opts->directory_filter))
autocreate |= AUTO_IMAGE;
} }
if (!stream->is_directory) if (!stream->is_directory)
goto done; goto done;