Skip to content

Commit a84a444

Browse files
committed
feat(subtitles): Automatically select single subtitle track if only one available
Enhance subtitle track selection in MKV parsing by automatically selecting the track when only one is available. Retain interactive selection for multiple tracks, improving usability and user experience.
1 parent 2efc8d7 commit a84a444

File tree

1 file changed

+35
-29
lines changed

1 file changed

+35
-29
lines changed

internal/video/mkv.go

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -273,43 +273,49 @@ func ExtractSubtitlesFromMKV(mkvPath string) (string, error) {
273273
return "", errors.NewValidationError("no subtitle tracks found in MKV", nil)
274274
}
275275

276-
logger.Info("Available subtitle tracks:")
277-
for i, tr := range tracks {
278-
lines := len(tr.Entries)
279-
name := strings.TrimSpace(tr.Name)
280-
lang := tr.Language
281-
bcp := languages.BCP47FromMKV(lang)
282-
if bcp != "" {
283-
if name != "" {
284-
lang = fmt.Sprintf("%s (%s)", bcp, name)
285-
} else {
286-
lang = fmt.Sprintf("%s", bcp)
276+
var selectedIdx int
277+
if len(tracks) == 1 {
278+
// Only one subtitle track is available; select it automatically
279+
logger.Info("Only one subtitle track found; selecting it automatically.")
280+
selectedIdx = 0
281+
} else {
282+
logger.Info("Available subtitle tracks:")
283+
for i, tr := range tracks {
284+
lines := len(tr.Entries)
285+
name := strings.TrimSpace(tr.Name)
286+
lang := tr.Language
287+
bcp := languages.BCP47FromMKV(lang)
288+
if bcp != "" {
289+
if name != "" {
290+
lang = fmt.Sprintf("%s (%s)", bcp, name)
291+
} else {
292+
lang = fmt.Sprintf("%s", bcp)
293+
}
287294
}
295+
logger.Info(fmt.Sprintf("[%d] Language: %s, Lines:%d", i+1, lang, lines))
288296
}
289-
logger.Info(fmt.Sprintf("[%d] Language: %s, Lines:%d", i+1, lang, lines))
290-
}
291297

292-
var selectedIdx int
293-
for {
294-
input := logger.InputPrompt("Select track number to extract: ")
295-
input = strings.TrimSpace(input)
296-
if input == "" {
297-
best, errSel := parser.SelectBestEnglishTrack()
298-
if errSel == nil && best != nil {
299-
for i := range tracks {
300-
if tracks[i].Number == best.Number {
301-
selectedIdx = i
302-
break
298+
for {
299+
input := logger.InputPrompt("Select track number to extract: ")
300+
input = strings.TrimSpace(input)
301+
if input == "" {
302+
best, errSel := parser.SelectBestEnglishTrack()
303+
if errSel == nil && best != nil {
304+
for i := range tracks {
305+
if tracks[i].Number == best.Number {
306+
selectedIdx = i
307+
break
308+
}
303309
}
310+
break
304311
}
312+
}
313+
if n, errAtoi := strconv.Atoi(input); errAtoi == nil && n >= 1 && n <= len(tracks) {
314+
selectedIdx = n - 1
305315
break
306316
}
317+
logger.Warning("Invalid selection. Enter a valid number.")
307318
}
308-
if n, errAtoi := strconv.Atoi(input); errAtoi == nil && n >= 1 && n <= len(tracks) {
309-
selectedIdx = n - 1
310-
break
311-
}
312-
logger.Warning("Invalid selection. Enter a valid number.")
313319
}
314320

315321
selected := tracks[selectedIdx]

0 commit comments

Comments
 (0)