feat: add 'Ask' quality option, language auto-select, and m4a audio remux
All checks were successful
CI / build (push) Successful in 47s

- Add 'ask' option to audio/video quality settings (stored as '' in DB)
- Auto-select when both media type AND quality are set; show filtered
  format picker when quality is Ask
- Auto-skip language picker when user has a matching language preference
- Remux audio-only downloads to m4a instead of webm for Telegram compat
- Update README to document the new flow and m4a audio output
This commit is contained in:
2026-06-28 12:17:08 +03:30
parent d0be877c0e
commit 3099244614
5 changed files with 85 additions and 12 deletions

View File

@@ -14,11 +14,11 @@ import (
func (h *Handler) buildSettingsKeyboard(userID int64, prefs *domain.UserPreferences) (string, models.InlineKeyboardMarkup) {
audioFmt := prefs.DefaultAudioFormat
if audioFmt == "" {
audioFmt = "best"
audioFmt = "ask"
}
videoFmt := prefs.DefaultVideoFormat
if videoFmt == "" {
videoFmt = "best"
videoFmt = "ask"
}
langLabel := prefs.DefaultLanguage
if langLabel == "" {
@@ -101,11 +101,13 @@ func (h *Handler) buildQualityAudioVideoPicker(prefs *domain.UserPreferences) (s
}
func (h *Handler) buildAudioQualityPicker(prefs *domain.UserPreferences) (string, models.InlineKeyboardMarkup) {
bitrates := []string{"best", "128k", "192k", "256k", "320k"}
bitrates := []string{"ask", "best", "128k", "192k", "256k", "320k"}
rows := [][]models.InlineKeyboardButton{}
for _, b := range bitrates {
label := b
if b == prefs.DefaultAudioFormat {
if b == "ask" && prefs.DefaultAudioFormat == "" {
label = "> " + label
} else if b != "ask" && b == prefs.DefaultAudioFormat {
label = "> " + label
}
rows = append(rows, []models.InlineKeyboardButton{
@@ -119,12 +121,14 @@ func (h *Handler) buildAudioQualityPicker(prefs *domain.UserPreferences) (string
}
func (h *Handler) buildVideoQualityPicker(prefs *domain.UserPreferences) (string, models.InlineKeyboardMarkup) {
resolutions := []string{"best", "2160p", "1440p", "1080p", "720p", "480p", "360p"}
resolutions := []string{"ask", "best", "2160p", "1440p", "1080p", "720p", "480p", "360p"}
rows := [][]models.InlineKeyboardButton{}
row := []models.InlineKeyboardButton{}
for i, r := range resolutions {
label := r
if r == prefs.DefaultVideoFormat {
if r == "ask" && prefs.DefaultVideoFormat == "" {
label = "> " + label
} else if r != "ask" && r == prefs.DefaultVideoFormat {
label = "> " + label
}
row = append(row, models.InlineKeyboardButton{
@@ -220,9 +224,15 @@ func (h *Handler) handleSettingsSet(ctx context.Context, chatID int64, msgID int
}
changed = true
case "audioquality":
if value == "ask" {
value = ""
}
prefs.DefaultAudioFormat = value
changed = true
case "videoquality":
if value == "ask" {
value = ""
}
prefs.DefaultVideoFormat = value
changed = true
case "language":