mirror of
https://github.com/mpv-player/mpv
synced 2025-01-03 13:32:16 +00:00
sub: respect detected language for fuzzy-matched external subtitles
Solve this by passing through the language to the player, which then uses the generic subtitle selection code to make a choice. Fixes #367.
This commit is contained in:
parent
78fa766fcc
commit
ce4d1f461a
@ -697,20 +697,23 @@ static void open_subtitles_from_options(struct MPContext *mpctx)
|
|||||||
mp_add_subtitles(mpctx, mpctx->opts->sub_name[i]);
|
mp_add_subtitles(mpctx, mpctx->opts->sub_name[i]);
|
||||||
}
|
}
|
||||||
if (mpctx->opts->sub_auto) { // auto load sub file ...
|
if (mpctx->opts->sub_auto) { // auto load sub file ...
|
||||||
char **tmp = find_text_subtitles(mpctx->opts, mpctx->filename);
|
struct subfn *list = find_text_subtitles(mpctx->opts, mpctx->filename);
|
||||||
int nsub = MP_TALLOC_ELEMS(tmp);
|
for (int i = 0; list[i].fname; i++) {
|
||||||
for (int i = 0; i < nsub; i++) {
|
char *filename = list[i].fname;
|
||||||
char *filename = tmp[i];
|
char *lang = list[i].lang;
|
||||||
for (int n = 0; n < mpctx->num_sources; n++) {
|
for (int n = 0; n < mpctx->num_sources; n++) {
|
||||||
if (strcmp(mpctx->sources[n]->stream->url, filename) == 0)
|
if (strcmp(mpctx->sources[n]->stream->url, filename) == 0)
|
||||||
goto skip;
|
goto skip;
|
||||||
}
|
}
|
||||||
struct track *track = mp_add_subtitles(mpctx, filename);
|
struct track *track = mp_add_subtitles(mpctx, filename);
|
||||||
if (track)
|
if (track) {
|
||||||
track->auto_loaded = true;
|
track->auto_loaded = true;
|
||||||
|
if (!track->lang)
|
||||||
|
track->lang = talloc_strdup(track, lang);
|
||||||
|
}
|
||||||
skip:;
|
skip:;
|
||||||
}
|
}
|
||||||
talloc_free(tmp);
|
talloc_free(list);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,11 +41,6 @@ static struct bstr get_ext(struct bstr s)
|
|||||||
return bstr_splice(s, dotpos + 1, s.len);
|
return bstr_splice(s, dotpos + 1, s.len);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct subfn {
|
|
||||||
int priority;
|
|
||||||
char *fname;
|
|
||||||
};
|
|
||||||
|
|
||||||
static int compare_sub_filename(const void *a, const void *b)
|
static int compare_sub_filename(const void *a, const void *b)
|
||||||
{
|
{
|
||||||
const struct subfn *s1 = a;
|
const struct subfn *s1 = a;
|
||||||
@ -135,14 +130,15 @@ static void append_dir_subtitles(struct MPOpts *opts,
|
|||||||
|
|
||||||
// we have a (likely) subtitle file
|
// we have a (likely) subtitle file
|
||||||
int prio = 0;
|
int prio = 0;
|
||||||
|
char *found_lang = NULL;
|
||||||
if (opts->sub_lang) {
|
if (opts->sub_lang) {
|
||||||
if (bstr_startswith(tmp_fname_trim, f_fname_trim)) {
|
if (bstr_startswith(tmp_fname_trim, f_fname_trim)) {
|
||||||
struct bstr lang = guess_lang_from_filename(tmp_fname_trim);
|
struct bstr lang = guess_lang_from_filename(tmp_fname_trim);
|
||||||
if (lang.len) {
|
if (lang.len) {
|
||||||
for (int n = 0; opts->sub_lang[n]; n++) {
|
for (int n = 0; opts->sub_lang[n]; n++) {
|
||||||
if (bstr_startswith(lang,
|
if (bstr_startswith0(lang, opts->sub_lang[n])) {
|
||||||
bstr0(opts->sub_lang[n]))) {
|
|
||||||
prio = 4; // matches the movie name + lang extension
|
prio = 4; // matches the movie name + lang extension
|
||||||
|
found_lang = opts->sub_lang[n];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -177,6 +173,7 @@ static void append_dir_subtitles(struct MPOpts *opts,
|
|||||||
|
|
||||||
sub->priority = prio;
|
sub->priority = prio;
|
||||||
sub->fname = subpath;
|
sub->fname = subpath;
|
||||||
|
sub->lang = found_lang;
|
||||||
} else
|
} else
|
||||||
talloc_free(subpath);
|
talloc_free(subpath);
|
||||||
}
|
}
|
||||||
@ -217,9 +214,10 @@ static void filter_subidx(struct subfn **slist, int *nsub)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
char **find_text_subtitles(struct MPOpts *opts, const char *fname)
|
// Return a list of subtitles found, sorted by priority.
|
||||||
|
// Last element is terminated with a fname==NULL entry.
|
||||||
|
struct subfn *find_text_subtitles(struct MPOpts *opts, const char *fname)
|
||||||
{
|
{
|
||||||
char **subnames = NULL;
|
|
||||||
struct subfn *slist = talloc_array_ptrtype(NULL, slist, 1);
|
struct subfn *slist = talloc_array_ptrtype(NULL, slist, 1);
|
||||||
int n = 0;
|
int n = 0;
|
||||||
|
|
||||||
@ -249,10 +247,8 @@ char **find_text_subtitles(struct MPOpts *opts, const char *fname)
|
|||||||
// Sort subs by priority and append them
|
// Sort subs by priority and append them
|
||||||
qsort(slist, n, sizeof(*slist), compare_sub_priority);
|
qsort(slist, n, sizeof(*slist), compare_sub_priority);
|
||||||
|
|
||||||
subnames = talloc_array_ptrtype(NULL, subnames, n);
|
struct subfn z = {0};
|
||||||
for (int i = 0; i < n; i++)
|
MP_TARRAY_APPEND(NULL, slist, n, z);
|
||||||
subnames[i] = talloc_strdup(subnames, slist[i].fname);
|
|
||||||
|
|
||||||
talloc_free(slist);
|
return slist;
|
||||||
return subnames;
|
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,12 @@
|
|||||||
|
|
||||||
struct MPOpts;
|
struct MPOpts;
|
||||||
|
|
||||||
char **find_text_subtitles(struct MPOpts *opts, const char *fname);
|
struct subfn {
|
||||||
|
int priority;
|
||||||
|
char *fname;
|
||||||
|
char *lang;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct subfn *find_text_subtitles(struct MPOpts *opts, const char *fname);
|
||||||
|
|
||||||
#endif /* MPLAYER_FINDFILES_H */
|
#endif /* MPLAYER_FINDFILES_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user