refactor: settings format picker redesign with Audio/Video sub-pickers, fix delete routing
All checks were successful
CI / build (push) Successful in 48s

- Replace Type/Quality settings with single Format button -> Audio/Video sub-pickers
- Each sub-picker shows format options (bitrates for audio, resolutions for video)
- Replace DefaultQuality with DefaultAudioFormat/DefaultVideoFormat in UserPreferences
- Add DB migration 002 for new preference columns
- Update repo layer SQL queries for new schema
- Update playlist flow to use new preference fields
- Fix missing deleteaccount and delaccount_ callback routing
- Add back_format routing for format picker navigation
This commit is contained in:
2026-06-25 15:55:59 +03:30
parent 30a99ac2fd
commit e08ed77884
7 changed files with 89 additions and 68 deletions

View File

@@ -0,0 +1,7 @@
-- +goose Up
ALTER TABLE user_preferences ADD COLUMN default_audio_format TEXT NOT NULL DEFAULT 'best';
ALTER TABLE user_preferences ADD COLUMN default_video_format TEXT NOT NULL DEFAULT 'best';
-- +goose Down
ALTER TABLE user_preferences DROP COLUMN default_audio_format;
ALTER TABLE user_preferences DROP COLUMN default_video_format;

View File

@@ -75,12 +75,14 @@ func (s *Store) GetOrCreatePreferences(userID int64) (*domain.UserPreferences, e
func (s *Store) getPreferences(userID int64) (*domain.UserPreferences, error) {
row := s.db.QueryRow(`
SELECT default_media_type, default_quality, default_container, default_language
SELECT default_media_type, default_audio_format, default_video_format,
default_container, default_language
FROM user_preferences WHERE user_id = ?
`, userID)
var p domain.UserPreferences
var mediaType string
if err := row.Scan(&mediaType, &p.DefaultQuality, &p.DefaultContainer, &p.DefaultLanguage); err != nil {
if err := row.Scan(&mediaType, &p.DefaultAudioFormat, &p.DefaultVideoFormat,
&p.DefaultContainer, &p.DefaultLanguage); err != nil {
return nil, err
}
switch mediaType {
@@ -107,11 +109,11 @@ func mediaTypeToString(mt domain.MediaType) string {
func (s *Store) UpdatePreferences(userID int64, prefs *domain.UserPreferences) error {
_, err := s.db.Exec(`
UPDATE user_preferences SET default_media_type=?, default_quality=?,
default_container=?, default_language=?
UPDATE user_preferences SET default_media_type=?, default_audio_format=?,
default_video_format=?, default_container=?, default_language=?
WHERE user_id=?
`, mediaTypeToString(prefs.DefaultMediaType), prefs.DefaultQuality,
prefs.DefaultContainer, prefs.DefaultLanguage, userID)
`, mediaTypeToString(prefs.DefaultMediaType), prefs.DefaultAudioFormat,
prefs.DefaultVideoFormat, prefs.DefaultContainer, prefs.DefaultLanguage, userID)
return err
}

View File

@@ -64,7 +64,8 @@ func TestPreferences(t *testing.T) {
}
prefs.DefaultMediaType = domain.MediaTypeAudio
prefs.DefaultQuality = "best"
prefs.DefaultAudioFormat = "best"
prefs.DefaultVideoFormat = "1080p"
prefs.DefaultContainer = "mp3"
prefs.DefaultLanguage = "en"
if err := s.UpdatePreferences(userID, prefs); err != nil {
@@ -78,8 +79,11 @@ func TestPreferences(t *testing.T) {
if got.DefaultMediaType != domain.MediaTypeAudio {
t.Errorf("media type = %v, want Audio", got.DefaultMediaType)
}
if got.DefaultQuality != "best" {
t.Errorf("quality = %q, want best", got.DefaultQuality)
if got.DefaultAudioFormat != "best" {
t.Errorf("audio format = %q, want best", got.DefaultAudioFormat)
}
if got.DefaultVideoFormat != "1080p" {
t.Errorf("video format = %q, want 1080p", got.DefaultVideoFormat)
}
if got.DefaultContainer != "mp3" {
t.Errorf("container = %q, want mp3", got.DefaultContainer)