From 2d149e007f0c5bb5a2e9717a268f538bf7618a40 Mon Sep 17 00:00:00 2001 From: dyphire Date: Sun, 6 Jul 2025 16:53:01 +0800 Subject: [PATCH] misc/language: parse default tag from external subtitle tracks --- common/common.h | 1 + misc/language.c | 4 ++++ player/command.c | 2 ++ player/loadfile.c | 1 + test/language.c | 13 +++++++++++++ 5 files changed, 21 insertions(+) diff --git a/common/common.h b/common/common.h index 49fee1202a..75083c4ea9 100644 --- a/common/common.h +++ b/common/common.h @@ -97,6 +97,7 @@ enum track_flags { TRACK_VISUAL_IMPAIRED = 1 << 3, TRACK_ATTACHED_PICTURE = 1 << 4, TRACK_FORCED = 1 << 5, + TRACK_DEFAULT = 1 << 6, }; #define VS_IS_DISP(x) ((x) == VS_DISP_RESAMPLE || \ diff --git a/misc/language.c b/misc/language.c index e15972f3a5..2b11ebb4bb 100644 --- a/misc/language.c +++ b/misc/language.c @@ -347,6 +347,10 @@ bstr mp_guess_lang_from_filename(bstr name, int *lang_start, enum track_flags *f *f |= TRACK_FORCED; matched = true; } + if (!bstrcasecmp0(tag, "default")) { + *f |= TRACK_DEFAULT; + matched = true; + } if (matched) { lang_length = 0; i -= (delimiter != '.') ? 2 : 1; diff --git a/player/command.c b/player/command.c index 102d49f18f..b477cdac8c 100644 --- a/player/command.c +++ b/player/command.c @@ -6315,6 +6315,7 @@ static void cmd_track_reload(void *p) flags |= t->hearing_impaired_track ? TRACK_HEARING_IMPAIRED : 0; flags |= t->visual_impaired_track ? TRACK_VISUAL_IMPAIRED : 0; flags |= t->forced_track ? TRACK_FORCED : 0; + flags |= t->default_track ? TRACK_DEFAULT : 0; mp_remove_track(mpctx, t); nt_num = mp_add_external_file(mpctx, filename, type, cmd->abort->cancel, flags); @@ -6335,6 +6336,7 @@ static void cmd_track_reload(void *p) nt->lang = bstrto0(nt, lang); nt->hearing_impaired_track = flags & TRACK_HEARING_IMPAIRED; nt->forced_track = flags & TRACK_FORCED; + nt->default_track = flags & TRACK_DEFAULT; } mp_switch_track(mpctx, nt->type, nt, 0); diff --git a/player/loadfile.c b/player/loadfile.c index b6ee926075..1fccdb9bbb 100644 --- a/player/loadfile.c +++ b/player/loadfile.c @@ -918,6 +918,7 @@ int mp_add_external_file(struct MPContext *mpctx, char *filename, t->hearing_impaired_track = flags & TRACK_HEARING_IMPAIRED; t->visual_impaired_track = flags & TRACK_VISUAL_IMPAIRED; t->forced_track = flags & TRACK_FORCED; + t->default_track = flags & TRACK_DEFAULT; // if we found video, and we are loading cover art, flag as such. t->attached_picture = t->type == STREAM_VIDEO && (flags & TRACK_ATTACHED_PICTURE); if (first_num < 0 && (filter == STREAM_TYPE_COUNT || sh->type == filter)) diff --git a/test/language.c b/test/language.c index cf8c647872..2106df2b55 100644 --- a/test/language.c +++ b/test/language.c @@ -81,6 +81,9 @@ int main(void) TEST_LANG_GUESS("foo.en-US.forced.srt", "en-US", 3, TRACK_FORCED); TEST_LANG_GUESS("foo.en-US.forced.sdh.srt", "en-US", 3, TRACK_HEARING_IMPAIRED | TRACK_FORCED); TEST_LANG_GUESS("foo.en-US.sdh.forced.srt", "en-US", 3, TRACK_HEARING_IMPAIRED | TRACK_FORCED); + TEST_LANG_GUESS("foo.en-US.default.srt", "en-US", 3, TRACK_DEFAULT); + TEST_LANG_GUESS("foo.en-US.default.sdh.srt", "en-US", 3, TRACK_HEARING_IMPAIRED | TRACK_DEFAULT); + TEST_LANG_GUESS("foo.en-US.sdh.default.srt", "en-US", 3, TRACK_HEARING_IMPAIRED | TRACK_DEFAULT); TEST_LANG_GUESS("foo.en-simple.srt", "en-simple", 3, 0); TEST_LANG_GUESS("foo.sgn-FSL.srt", "sgn-FSL", 3, 0); TEST_LANG_GUESS("foo.gsw-u-sd-chzh.srt", "gsw-u-sd-chzh", 3, 0); @@ -96,6 +99,9 @@ int main(void) TEST_LANG_GUESS("foo[en-US][forced].srt", "en-US", 3, TRACK_FORCED); TEST_LANG_GUESS("foo[en-US][forced][sdh].srt", "en-US", 3, TRACK_HEARING_IMPAIRED | TRACK_FORCED); TEST_LANG_GUESS("foo[en-US][sdh][forced].srt", "en-US", 3, TRACK_HEARING_IMPAIRED | TRACK_FORCED); + TEST_LANG_GUESS("foo[en-US][default].srt", "en-US", 3, TRACK_DEFAULT); + TEST_LANG_GUESS("foo[en-US][default][sdh].srt", "en-US", 3, TRACK_HEARING_IMPAIRED | TRACK_DEFAULT); + TEST_LANG_GUESS("foo[en-US][sdh][default].srt", "en-US", 3, TRACK_HEARING_IMPAIRED | TRACK_DEFAULT); TEST_LANG_GUESS("foo[].srt", "", -1, 0); TEST_LANG_GUESS("foo(en).srt", "en", 3, 0); @@ -105,12 +111,19 @@ int main(void) TEST_LANG_GUESS("foo(en-US)(forced).srt", "en-US", 3, TRACK_FORCED); TEST_LANG_GUESS("foo(en-US)(forced)(sdh).srt", "en-US", 3, TRACK_HEARING_IMPAIRED | TRACK_FORCED); TEST_LANG_GUESS("foo(en-US)(sdh)(forced).srt", "en-US", 3, TRACK_HEARING_IMPAIRED | TRACK_FORCED); + TEST_LANG_GUESS("foo(en-US)(default).srt", "en-US", 3, TRACK_DEFAULT); + TEST_LANG_GUESS("foo(en-US)(default)(sdh).srt", "en-US", 3, TRACK_HEARING_IMPAIRED | TRACK_DEFAULT); + TEST_LANG_GUESS("foo(en-US)(sdh)(default).srt", "en-US", 3, TRACK_HEARING_IMPAIRED | TRACK_DEFAULT); TEST_LANG_GUESS("foo().srt", "", -1, 0); TEST_LANG_GUESS("foo.hi.forced.srt", "", -1, TRACK_HEARING_IMPAIRED | TRACK_FORCED); TEST_LANG_GUESS("foo.forced.hi.srt", "", -1, TRACK_HEARING_IMPAIRED | TRACK_FORCED); + TEST_LANG_GUESS("foo.hi.default.srt", "", -1, TRACK_HEARING_IMPAIRED | TRACK_DEFAULT); + TEST_LANG_GUESS("foo.default.hi.srt", "", -1, TRACK_HEARING_IMPAIRED | TRACK_DEFAULT); + TEST_LANG_GUESS("foo.default.forced.srt", "", -1, TRACK_DEFAULT | TRACK_FORCED); TEST_LANG_GUESS("foo.hi.srt", "", -1, TRACK_HEARING_IMPAIRED); TEST_LANG_GUESS("foo.forced.srt", "", -1, TRACK_FORCED); + TEST_LANG_GUESS("foo.default.srt", "", -1, TRACK_DEFAULT); talloc_free(ta_ctx); }