diff --git a/internal/database/migrations.go b/internal/database/migrations.go index 2ad4f1bf..f7c2bd06 100644 --- a/internal/database/migrations.go +++ b/internal/database/migrations.go @@ -937,4 +937,9 @@ var migrations = []func(tx *sql.Tx) error{ _, err = tx.Exec(sql) return err }, + func(tx *sql.Tx) (err error) { + sql := `ALTER TABLE users ADD COLUMN mark_read_on_media_player_completion bool default 'f';` + _, err = tx.Exec(sql) + return err + }, } diff --git a/internal/locale/translations/de_DE.json b/internal/locale/translations/de_DE.json index 3a4cf362..9f32999c 100644 --- a/internal/locale/translations/de_DE.json +++ b/internal/locale/translations/de_DE.json @@ -394,6 +394,9 @@ "form.prefs.label.default_home_page": "Standard-Startseite", "form.prefs.label.categories_sorting_order": "Kategorie-Sortierung", "form.prefs.label.mark_read_on_view": "Einträge automatisch als gelesen markieren, wenn sie angezeigt werden", + "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", + "form.prefs.label.mark_read_on_media_completion": "Only mark as read when audio/video playback reaches 90%% completion", + "form.prefs.label.mark_read_manually": "Mark entries as read manually", "form.prefs.fieldset.application_settings": "Anwendungseinstellungen", "form.prefs.fieldset.authentication_settings": "Authentifizierungseinstellungen", "form.prefs.fieldset.reader_settings": "Reader-Einstellungen", diff --git a/internal/locale/translations/el_EL.json b/internal/locale/translations/el_EL.json index d16ce7eb..b7047da0 100644 --- a/internal/locale/translations/el_EL.json +++ b/internal/locale/translations/el_EL.json @@ -394,6 +394,9 @@ "form.prefs.label.default_home_page": "Προεπιλεγμένη αρχική σελίδα", "form.prefs.label.categories_sorting_order": "Ταξινόμηση κατηγοριών", "form.prefs.label.mark_read_on_view": "Αυτόματη επισήμανση καταχωρήσεων ως αναγνωσμένων κατά την προβολή", + "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", + "form.prefs.label.mark_read_on_media_completion": "Only mark as read when audio/video playback reaches 90%% completion", + "form.prefs.label.mark_read_manually": "Mark entries as read manually", "form.prefs.fieldset.application_settings": "Application Settings", "form.prefs.fieldset.authentication_settings": "Authentication Settings", "form.prefs.fieldset.reader_settings": "Reader Settings", diff --git a/internal/locale/translations/en_US.json b/internal/locale/translations/en_US.json index 3ef5448e..f2fd6384 100644 --- a/internal/locale/translations/en_US.json +++ b/internal/locale/translations/en_US.json @@ -394,6 +394,9 @@ "form.prefs.label.default_home_page": "Default home page", "form.prefs.label.categories_sorting_order": "Categories sorting", "form.prefs.label.mark_read_on_view": "Automatically mark entries as read when viewed", + "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", + "form.prefs.label.mark_read_on_media_completion": "Only mark as read when audio/video playback reaches 90%% completion", + "form.prefs.label.mark_read_manually": "Mark entries as read manually", "form.prefs.fieldset.application_settings": "Application Settings", "form.prefs.fieldset.authentication_settings": "Authentication Settings", "form.prefs.fieldset.reader_settings": "Reader Settings", diff --git a/internal/locale/translations/es_ES.json b/internal/locale/translations/es_ES.json index 52386798..232d1a6c 100644 --- a/internal/locale/translations/es_ES.json +++ b/internal/locale/translations/es_ES.json @@ -394,6 +394,9 @@ "form.prefs.label.default_home_page": "Página de inicio por defecto", "form.prefs.label.categories_sorting_order": "Clasificación por categorías", "form.prefs.label.mark_read_on_view": "Marcar automáticamente las entradas como leídas cuando se vean", + "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", + "form.prefs.label.mark_read_on_media_completion": "Only mark as read when audio/video playback reaches 90%% completion", + "form.prefs.label.mark_read_manually": "Mark entries as read manually", "form.prefs.fieldset.application_settings": "Application Settings", "form.prefs.fieldset.authentication_settings": "Authentication Settings", "form.prefs.fieldset.reader_settings": "Reader Settings", diff --git a/internal/locale/translations/fi_FI.json b/internal/locale/translations/fi_FI.json index 4ff3316c..ec9de09a 100644 --- a/internal/locale/translations/fi_FI.json +++ b/internal/locale/translations/fi_FI.json @@ -394,6 +394,9 @@ "form.prefs.label.default_home_page": "Oletusarvoinen etusivu", "form.prefs.label.categories_sorting_order": "Kategorioiden lajittelu", "form.prefs.label.mark_read_on_view": "Merkitse kohdat automaattisesti luetuiksi, kun niitä tarkastellaan", + "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", + "form.prefs.label.mark_read_on_media_completion": "Only mark as read when audio/video playback reaches 90%% completion", + "form.prefs.label.mark_read_manually": "Mark entries as read manually", "form.prefs.fieldset.application_settings": "Application Settings", "form.prefs.fieldset.authentication_settings": "Authentication Settings", "form.prefs.fieldset.reader_settings": "Reader Settings", diff --git a/internal/locale/translations/fr_FR.json b/internal/locale/translations/fr_FR.json index 39fe2c05..125ca165 100644 --- a/internal/locale/translations/fr_FR.json +++ b/internal/locale/translations/fr_FR.json @@ -394,6 +394,9 @@ "form.prefs.label.default_home_page": "Page d'accueil par défaut", "form.prefs.label.categories_sorting_order": "Colonne de tri des catégories", "form.prefs.label.mark_read_on_view": "Marquer automatiquement les entrées comme lues lorsqu'elles sont consultées", + "form.prefs.label.mark_read_on_view_or_media_completion": "Marquer automatiquement les entrées comme lues lorsqu'elles sont consultées. Pour l'audio/vidéo, marquer comme lues après 90%%", + "form.prefs.label.mark_read_on_media_completion": "Marqué les entrées comme lues uniquement après 90%% de lecture de l'audio/vidéo", + "form.prefs.label.mark_read_manually": "Marqué les entrées comme lues manuellement", "form.prefs.fieldset.application_settings": "Paramètres de l'application", "form.prefs.fieldset.authentication_settings": "Paramètres d'authentification", "form.prefs.fieldset.reader_settings": "Paramètres du lecteur", diff --git a/internal/locale/translations/hi_IN.json b/internal/locale/translations/hi_IN.json index 5b501fa8..6c2ca393 100644 --- a/internal/locale/translations/hi_IN.json +++ b/internal/locale/translations/hi_IN.json @@ -394,6 +394,9 @@ "form.prefs.label.default_home_page": "डिफ़ॉल्ट होमपेज़", "form.prefs.label.categories_sorting_order": "श्रेणियाँ छँटाई", "form.prefs.label.mark_read_on_view": "देखे जाने पर स्वचालित रूप से प्रविष्टियों को पढ़ने के रूप में चिह्नित करें", + "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", + "form.prefs.label.mark_read_on_media_completion": "Only mark as read when audio/video playback reaches 90%% completion", + "form.prefs.label.mark_read_manually": "Mark entries as read manually", "form.prefs.fieldset.application_settings": "Application Settings", "form.prefs.fieldset.authentication_settings": "Authentication Settings", "form.prefs.fieldset.reader_settings": "Reader Settings", diff --git a/internal/locale/translations/id_ID.json b/internal/locale/translations/id_ID.json index 9cb3b8a1..555ed1ef 100644 --- a/internal/locale/translations/id_ID.json +++ b/internal/locale/translations/id_ID.json @@ -384,6 +384,9 @@ "form.prefs.label.default_home_page": "Beranda Baku", "form.prefs.label.categories_sorting_order": "Pengurutan Kategori", "form.prefs.label.mark_read_on_view": "Secara otomatis menandai entri sebagai telah dibaca saat dilihat", + "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", + "form.prefs.label.mark_read_on_media_completion": "Only mark as read when audio/video playback reaches 90%% completion", + "form.prefs.label.mark_read_manually": "Mark entries as read manually", "form.prefs.fieldset.application_settings": "Application Settings", "form.prefs.fieldset.authentication_settings": "Authentication Settings", "form.prefs.fieldset.reader_settings": "Reader Settings", diff --git a/internal/locale/translations/it_IT.json b/internal/locale/translations/it_IT.json index 907b9a54..d77f0357 100644 --- a/internal/locale/translations/it_IT.json +++ b/internal/locale/translations/it_IT.json @@ -394,6 +394,9 @@ "form.prefs.label.default_home_page": "Pagina iniziale predefinita", "form.prefs.label.categories_sorting_order": "Ordinamento delle categorie", "form.prefs.label.mark_read_on_view": "Contrassegna automaticamente le voci come lette quando visualizzate", + "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", + "form.prefs.label.mark_read_on_media_completion": "Only mark as read when audio/video playback reaches 90%% completion", + "form.prefs.label.mark_read_manually": "Mark entries as read manually", "form.prefs.fieldset.application_settings": "Application Settings", "form.prefs.fieldset.authentication_settings": "Authentication Settings", "form.prefs.fieldset.reader_settings": "Reader Settings", diff --git a/internal/locale/translations/ja_JP.json b/internal/locale/translations/ja_JP.json index 8a606813..57d62d7c 100644 --- a/internal/locale/translations/ja_JP.json +++ b/internal/locale/translations/ja_JP.json @@ -384,6 +384,9 @@ "form.prefs.label.default_home_page": "デフォルトのトップページ", "form.prefs.label.categories_sorting_order": "カテゴリの表示順", "form.prefs.label.mark_read_on_view": "表示時にエントリを自動的に既読としてマークします", + "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", + "form.prefs.label.mark_read_on_media_completion": "Only mark as read when audio/video playback reaches 90%% completion", + "form.prefs.label.mark_read_manually": "Mark entries as read manually", "form.prefs.fieldset.application_settings": "Application Settings", "form.prefs.fieldset.authentication_settings": "Authentication Settings", "form.prefs.fieldset.reader_settings": "Reader Settings", diff --git a/internal/locale/translations/nl_NL.json b/internal/locale/translations/nl_NL.json index 227f3760..30321a49 100644 --- a/internal/locale/translations/nl_NL.json +++ b/internal/locale/translations/nl_NL.json @@ -394,6 +394,9 @@ "form.prefs.label.default_home_page": "Standaard startpagina", "form.prefs.label.categories_sorting_order": "Categorieën sorteren", "form.prefs.label.mark_read_on_view": "Items automatisch markeren als gelezen wanneer ze worden bekeken", + "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", + "form.prefs.label.mark_read_on_media_completion": "Only mark as read when audio/video playback reaches 90%% completion", + "form.prefs.label.mark_read_manually": "Mark entries as read manually", "form.prefs.fieldset.application_settings": "Application Settings", "form.prefs.fieldset.authentication_settings": "Authentication Settings", "form.prefs.fieldset.reader_settings": "Reader Settings", diff --git a/internal/locale/translations/pl_PL.json b/internal/locale/translations/pl_PL.json index 809be253..35c99095 100644 --- a/internal/locale/translations/pl_PL.json +++ b/internal/locale/translations/pl_PL.json @@ -404,6 +404,9 @@ "form.prefs.label.default_home_page": "Domyślna strona główna", "form.prefs.label.categories_sorting_order": "Sortowanie kategorii", "form.prefs.label.mark_read_on_view": "Automatycznie oznaczaj wpisy jako przeczytane podczas przeglądania", + "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", + "form.prefs.label.mark_read_on_media_completion": "Only mark as read when audio/video playback reaches 90%% completion", + "form.prefs.label.mark_read_manually": "Mark entries as read manually", "form.prefs.fieldset.application_settings": "Application Settings", "form.prefs.fieldset.authentication_settings": "Authentication Settings", "form.prefs.fieldset.reader_settings": "Reader Settings", diff --git a/internal/locale/translations/pt_BR.json b/internal/locale/translations/pt_BR.json index 4fa22917..0a6f8566 100644 --- a/internal/locale/translations/pt_BR.json +++ b/internal/locale/translations/pt_BR.json @@ -394,6 +394,9 @@ "form.prefs.label.default_home_page": "Página inicial predefinida", "form.prefs.label.categories_sorting_order": "Classificação das categorias", "form.prefs.label.mark_read_on_view": "Marcar automaticamente as entradas como lidas quando visualizadas", + "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", + "form.prefs.label.mark_read_on_media_completion": "Only mark as read when audio/video playback reaches 90%% completion", + "form.prefs.label.mark_read_manually": "Mark entries as read manually", "form.prefs.fieldset.application_settings": "Application Settings", "form.prefs.fieldset.authentication_settings": "Authentication Settings", "form.prefs.fieldset.reader_settings": "Reader Settings", diff --git a/internal/locale/translations/ru_RU.json b/internal/locale/translations/ru_RU.json index 685e96d8..5818e237 100644 --- a/internal/locale/translations/ru_RU.json +++ b/internal/locale/translations/ru_RU.json @@ -404,6 +404,9 @@ "form.prefs.label.default_home_page": "Домашняя страница по умолчанию", "form.prefs.label.categories_sorting_order": "Сортировка категорий", "form.prefs.label.mark_read_on_view": "Автоматически отмечать записи как прочитанные при просмотре", + "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", + "form.prefs.label.mark_read_on_media_completion": "Only mark as read when audio/video playback reaches 90%% completion", + "form.prefs.label.mark_read_manually": "Mark entries as read manually", "form.prefs.fieldset.application_settings": "Application Settings", "form.prefs.fieldset.authentication_settings": "Authentication Settings", "form.prefs.fieldset.reader_settings": "Reader Settings", diff --git a/internal/locale/translations/tr_TR.json b/internal/locale/translations/tr_TR.json index 1da1f652..3366dc7d 100644 --- a/internal/locale/translations/tr_TR.json +++ b/internal/locale/translations/tr_TR.json @@ -304,6 +304,9 @@ "form.prefs.label.keyboard_shortcuts": "Klavye kısayollarını etkinleştir", "form.prefs.label.language": "Dil", "form.prefs.label.mark_read_on_view": "Makaleler görüntülendiğinde otomatik olarak okundu olarak işaretle", + "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", + "form.prefs.label.mark_read_on_media_completion": "Only mark as read when audio/video playback reaches 90%% completion", + "form.prefs.label.mark_read_manually": "Mark entries as read manually", "form.prefs.label.media_playback_rate": "Ses/video oynatma hızı", "form.prefs.label.show_reading_time": "Makaleler için tahmini okuma süresini göster", "form.prefs.label.theme": "Tema", diff --git a/internal/locale/translations/uk_UA.json b/internal/locale/translations/uk_UA.json index 200736d8..72fc9d34 100644 --- a/internal/locale/translations/uk_UA.json +++ b/internal/locale/translations/uk_UA.json @@ -404,6 +404,9 @@ "form.prefs.label.default_home_page": "Домашня сторінка за умовчанням", "form.prefs.label.categories_sorting_order": "Сортування за категоріями", "form.prefs.label.mark_read_on_view": "Автоматично позначати записи як прочитані під час перегляду", + "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", + "form.prefs.label.mark_read_on_media_completion": "Only mark as read when audio/video playback reaches 90%% completion", + "form.prefs.label.mark_read_manually": "Mark entries as read manually", "form.prefs.fieldset.application_settings": "Application Settings", "form.prefs.fieldset.authentication_settings": "Authentication Settings", "form.prefs.fieldset.reader_settings": "Reader Settings", diff --git a/internal/locale/translations/zh_CN.json b/internal/locale/translations/zh_CN.json index 57ab61ed..38b333d3 100644 --- a/internal/locale/translations/zh_CN.json +++ b/internal/locale/translations/zh_CN.json @@ -384,6 +384,9 @@ "form.prefs.label.default_home_page": "默认主页", "form.prefs.label.categories_sorting_order": "分类排序", "form.prefs.label.mark_read_on_view": "查看时自动将条目标记为已读", + "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", + "form.prefs.label.mark_read_on_media_completion": "Only mark as read when audio/video playback reaches 90%% completion", + "form.prefs.label.mark_read_manually": "Mark entries as read manually", "form.prefs.fieldset.application_settings": "应用设置", "form.prefs.fieldset.authentication_settings": "用户认证设置", "form.prefs.fieldset.reader_settings": "阅读器设置", diff --git a/internal/locale/translations/zh_TW.json b/internal/locale/translations/zh_TW.json index 4d479c1d..f0e2ea8b 100644 --- a/internal/locale/translations/zh_TW.json +++ b/internal/locale/translations/zh_TW.json @@ -384,6 +384,9 @@ "form.prefs.label.default_home_page": "預設主頁", "form.prefs.label.categories_sorting_order": "分類排序", "form.prefs.label.mark_read_on_view": "查看時自動將條目標記為已讀", + "form.prefs.label.mark_read_on_view_or_media_completion": "Mark entries as read when viewed. For audio/video, mark as read at 90%% completion", + "form.prefs.label.mark_read_on_media_completion": "Only mark as read when audio/video playback reaches 90%% completion", + "form.prefs.label.mark_read_manually": "Mark entries as read manually", "form.prefs.fieldset.application_settings": "應用程式設定", "form.prefs.fieldset.authentication_settings": "使用者認證設定", "form.prefs.fieldset.reader_settings": "閱讀器設定", diff --git a/internal/model/enclosure.go b/internal/model/enclosure.go index 6bb7734e..c9ec485f 100644 --- a/internal/model/enclosure.go +++ b/internal/model/enclosure.go @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 package model // import "miniflux.app/v2/internal/model" +import "strings" // Enclosure represents an attachment. type Enclosure struct { @@ -24,3 +25,12 @@ func (e Enclosure) Html5MimeType() string { // EnclosureList represents a list of attachments. type EnclosureList []*Enclosure + +func (el EnclosureList) ContainsAudioOrVideo() bool { + for _, enclosure := range el { + if strings.Contains(enclosure.MimeType, "audio/") || strings.Contains(enclosure.MimeType, "video/") { + return true + } + } + return false +} diff --git a/internal/model/entry.go b/internal/model/entry.go index 7631119a..db4958ca 100644 --- a/internal/model/entry.go +++ b/internal/model/entry.go @@ -50,6 +50,22 @@ func NewEntry() *Entry { } } +// ShouldMarkAsReadOnView Return whether the entry should be marked as viewed considering all user settings and entry state. +func (e *Entry) ShouldMarkAsReadOnView(user *User) bool { + // Already read, no need to mark as read again. Removed entries are not marked as read + if e.Status != EntryStatusUnread { + return false + } + + // There is an enclosure, markAsRead will happen at enclosure completion time, no need to mark as read on view + if user.MarkReadOnMediaPlayerCompletion && e.Enclosures.ContainsAudioOrVideo() { + return false + } + + // The user wants to mark as read on view + return user.MarkReadOnView +} + // Entries represents a list of entries. type Entries []*Entry diff --git a/internal/model/user.go b/internal/model/user.go index 3a1b7865..9a3428e9 100644 --- a/internal/model/user.go +++ b/internal/model/user.go @@ -11,33 +11,34 @@ import ( // User represents a user in the system. type User struct { - ID int64 `json:"id"` - Username string `json:"username"` - Password string `json:"-"` - IsAdmin bool `json:"is_admin"` - Theme string `json:"theme"` - Language string `json:"language"` - Timezone string `json:"timezone"` - EntryDirection string `json:"entry_sorting_direction"` - EntryOrder string `json:"entry_sorting_order"` - Stylesheet string `json:"stylesheet"` - GoogleID string `json:"google_id"` - OpenIDConnectID string `json:"openid_connect_id"` - EntriesPerPage int `json:"entries_per_page"` - KeyboardShortcuts bool `json:"keyboard_shortcuts"` - ShowReadingTime bool `json:"show_reading_time"` - EntrySwipe bool `json:"entry_swipe"` - GestureNav string `json:"gesture_nav"` - LastLoginAt *time.Time `json:"last_login_at"` - DisplayMode string `json:"display_mode"` - DefaultReadingSpeed int `json:"default_reading_speed"` - CJKReadingSpeed int `json:"cjk_reading_speed"` - DefaultHomePage string `json:"default_home_page"` - CategoriesSortingOrder string `json:"categories_sorting_order"` - MarkReadOnView bool `json:"mark_read_on_view"` - MediaPlaybackRate float64 `json:"media_playback_rate"` - BlockFilterEntryRules string `json:"block_filter_entry_rules"` - KeepFilterEntryRules string `json:"keep_filter_entry_rules"` + ID int64 `json:"id"` + Username string `json:"username"` + Password string `json:"-"` + IsAdmin bool `json:"is_admin"` + Theme string `json:"theme"` + Language string `json:"language"` + Timezone string `json:"timezone"` + EntryDirection string `json:"entry_sorting_direction"` + EntryOrder string `json:"entry_sorting_order"` + Stylesheet string `json:"stylesheet"` + GoogleID string `json:"google_id"` + OpenIDConnectID string `json:"openid_connect_id"` + EntriesPerPage int `json:"entries_per_page"` + KeyboardShortcuts bool `json:"keyboard_shortcuts"` + ShowReadingTime bool `json:"show_reading_time"` + EntrySwipe bool `json:"entry_swipe"` + GestureNav string `json:"gesture_nav"` + LastLoginAt *time.Time `json:"last_login_at"` + DisplayMode string `json:"display_mode"` + DefaultReadingSpeed int `json:"default_reading_speed"` + CJKReadingSpeed int `json:"cjk_reading_speed"` + DefaultHomePage string `json:"default_home_page"` + CategoriesSortingOrder string `json:"categories_sorting_order"` + MarkReadOnView bool `json:"mark_read_on_view"` + MarkReadOnMediaPlayerCompletion bool `json:"mark_read_on_media_player_completion"` + MediaPlaybackRate float64 `json:"media_playback_rate"` + BlockFilterEntryRules string `json:"block_filter_entry_rules"` + KeepFilterEntryRules string `json:"keep_filter_entry_rules"` } // UserCreationRequest represents the request to create a user. @@ -51,31 +52,32 @@ type UserCreationRequest struct { // UserModificationRequest represents the request to update a user. type UserModificationRequest struct { - Username *string `json:"username"` - Password *string `json:"password"` - Theme *string `json:"theme"` - Language *string `json:"language"` - Timezone *string `json:"timezone"` - EntryDirection *string `json:"entry_sorting_direction"` - EntryOrder *string `json:"entry_sorting_order"` - Stylesheet *string `json:"stylesheet"` - GoogleID *string `json:"google_id"` - OpenIDConnectID *string `json:"openid_connect_id"` - EntriesPerPage *int `json:"entries_per_page"` - IsAdmin *bool `json:"is_admin"` - KeyboardShortcuts *bool `json:"keyboard_shortcuts"` - ShowReadingTime *bool `json:"show_reading_time"` - EntrySwipe *bool `json:"entry_swipe"` - GestureNav *string `json:"gesture_nav"` - DisplayMode *string `json:"display_mode"` - DefaultReadingSpeed *int `json:"default_reading_speed"` - CJKReadingSpeed *int `json:"cjk_reading_speed"` - DefaultHomePage *string `json:"default_home_page"` - CategoriesSortingOrder *string `json:"categories_sorting_order"` - MarkReadOnView *bool `json:"mark_read_on_view"` - MediaPlaybackRate *float64 `json:"media_playback_rate"` - BlockFilterEntryRules *string `json:"block_filter_entry_rules"` - KeepFilterEntryRules *string `json:"keep_filter_entry_rules"` + Username *string `json:"username"` + Password *string `json:"password"` + Theme *string `json:"theme"` + Language *string `json:"language"` + Timezone *string `json:"timezone"` + EntryDirection *string `json:"entry_sorting_direction"` + EntryOrder *string `json:"entry_sorting_order"` + Stylesheet *string `json:"stylesheet"` + GoogleID *string `json:"google_id"` + OpenIDConnectID *string `json:"openid_connect_id"` + EntriesPerPage *int `json:"entries_per_page"` + IsAdmin *bool `json:"is_admin"` + KeyboardShortcuts *bool `json:"keyboard_shortcuts"` + ShowReadingTime *bool `json:"show_reading_time"` + EntrySwipe *bool `json:"entry_swipe"` + GestureNav *string `json:"gesture_nav"` + DisplayMode *string `json:"display_mode"` + DefaultReadingSpeed *int `json:"default_reading_speed"` + CJKReadingSpeed *int `json:"cjk_reading_speed"` + DefaultHomePage *string `json:"default_home_page"` + CategoriesSortingOrder *string `json:"categories_sorting_order"` + MarkReadOnView *bool `json:"mark_read_on_view"` + MarkReadOnMediaPlayerCompletion *bool `json:"mark_read_on_media_player_completion"` + MediaPlaybackRate *float64 `json:"media_playback_rate"` + BlockFilterEntryRules *string `json:"block_filter_entry_rules"` + KeepFilterEntryRules *string `json:"keep_filter_entry_rules"` } // Patch updates the User object with the modification request. @@ -168,6 +170,10 @@ func (u *UserModificationRequest) Patch(user *User) { user.MarkReadOnView = *u.MarkReadOnView } + if u.MarkReadOnMediaPlayerCompletion != nil { + user.MarkReadOnMediaPlayerCompletion = *u.MarkReadOnMediaPlayerCompletion + } + if u.MediaPlaybackRate != nil { user.MediaPlaybackRate = *u.MediaPlaybackRate } diff --git a/internal/storage/user.go b/internal/storage/user.go index f783348f..94bf4b6d 100644 --- a/internal/storage/user.go +++ b/internal/storage/user.go @@ -193,11 +193,12 @@ func (s *Storage) UpdateUser(user *model.User) error { default_home_page=$20, categories_sorting_order=$21, mark_read_on_view=$22, - media_playback_rate=$23, - block_filter_entry_rules=$24, - keep_filter_entry_rules=$25 + mark_read_on_media_player_completion=$23, + media_playback_rate=$24, + block_filter_entry_rules=$25, + keep_filter_entry_rules=$26 WHERE - id=$26 + id=$27 ` _, err = s.db.Exec( @@ -224,6 +225,7 @@ func (s *Storage) UpdateUser(user *model.User) error { user.DefaultHomePage, user.CategoriesSortingOrder, user.MarkReadOnView, + user.MarkReadOnMediaPlayerCompletion, user.MediaPlaybackRate, user.BlockFilterEntryRules, user.KeepFilterEntryRules, @@ -256,11 +258,12 @@ func (s *Storage) UpdateUser(user *model.User) error { default_home_page=$19, categories_sorting_order=$20, mark_read_on_view=$21, - media_playback_rate=$22, - block_filter_entry_rules=$23, - keep_filter_entry_rules=$24 + mark_read_on_media_player_completion=$22, + media_playback_rate=$23, + block_filter_entry_rules=$24, + keep_filter_entry_rules=$25 WHERE - id=$25 + id=$26 ` _, err := s.db.Exec( @@ -286,6 +289,7 @@ func (s *Storage) UpdateUser(user *model.User) error { user.DefaultHomePage, user.CategoriesSortingOrder, user.MarkReadOnView, + user.MarkReadOnMediaPlayerCompletion, user.MediaPlaybackRate, user.BlockFilterEntryRules, user.KeepFilterEntryRules, @@ -337,6 +341,7 @@ func (s *Storage) UserByID(userID int64) (*model.User, error) { default_home_page, categories_sorting_order, mark_read_on_view, + mark_read_on_media_player_completion, media_playback_rate, block_filter_entry_rules, keep_filter_entry_rules @@ -375,6 +380,7 @@ func (s *Storage) UserByUsername(username string) (*model.User, error) { default_home_page, categories_sorting_order, mark_read_on_view, + mark_read_on_media_player_completion, media_playback_rate, block_filter_entry_rules, keep_filter_entry_rules @@ -413,6 +419,7 @@ func (s *Storage) UserByField(field, value string) (*model.User, error) { default_home_page, categories_sorting_order, mark_read_on_view, + mark_read_on_media_player_completion, media_playback_rate, block_filter_entry_rules, keep_filter_entry_rules @@ -458,6 +465,7 @@ func (s *Storage) UserByAPIKey(token string) (*model.User, error) { u.default_home_page, u.categories_sorting_order, u.mark_read_on_view, + u.mark_read_on_media_player_completion, media_playback_rate, u.block_filter_entry_rules, u.keep_filter_entry_rules @@ -497,6 +505,7 @@ func (s *Storage) fetchUser(query string, args ...interface{}) (*model.User, err &user.DefaultHomePage, &user.CategoriesSortingOrder, &user.MarkReadOnView, + &user.MarkReadOnMediaPlayerCompletion, &user.MediaPlaybackRate, &user.BlockFilterEntryRules, &user.KeepFilterEntryRules, @@ -608,6 +617,7 @@ func (s *Storage) Users() (model.Users, error) { default_home_page, categories_sorting_order, mark_read_on_view, + mark_read_on_media_player_completion, media_playback_rate, block_filter_entry_rules, keep_filter_entry_rules @@ -648,6 +658,7 @@ func (s *Storage) Users() (model.Users, error) { &user.DefaultHomePage, &user.CategoriesSortingOrder, &user.MarkReadOnView, + &user.MarkReadOnMediaPlayerCompletion, &user.MediaPlaybackRate, &user.BlockFilterEntryRules, &user.KeepFilterEntryRules, diff --git a/internal/template/templates/views/entry.html b/internal/template/templates/views/entry.html index 85618954..a9a4b07b 100644 --- a/internal/template/templates/views/entry.html +++ b/internal/template/templates/views/entry.html @@ -173,6 +173,9 @@