From 996d581a07eafe59e5de2a8b9dbd7f7a8b28eabb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaroslav=20Bene=C5=A1?= Date: Sun, 9 Aug 2026 01:38:07 +0200 Subject: [PATCH] Show the account feed after it loads Refresh fetched the account feed correctly -- the status line said "60 videos in feed" -- and the page stayed empty with "No subscriptions yet" on it. The empty-state hint added in 5.5.0 hides the grid so it can sit centred rather than pinned under a large blank area. Every path that changes the grid re-runs that check afterwards and shows it again; the account path was the one that did not, so the grid stayed hidden from startup no matter what was loaded into it. The local feed re-runs it and was unaffected, which is why this only showed up for someone signed in. Two related things while here. The empty-state message was written for local subscriptions and is wrong advice in account mode, which does not use them -- it now says to press Refresh rather than to go and subscribe to something. And the Subscriptions panel, which lists local subscriptions, is hidden in account mode instead of sitting empty beside a full feed and implying something failed. Co-Authored-By: Claude Opus 5 (1M context) --- CHANGELOG.md | 15 +++++++++++++++ pyproject.toml | 2 +- ytsage/__init__.py | 2 +- ytsage/gui/ytsage_gui_feed.py | 30 +++++++++++++++++++++++------ ytsage/languages/en.json | 3 ++- ytsage/utils/ytsage_localization.py | 3 ++- 6 files changed, 45 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e4de83..a992711 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,21 @@ Kept as the work happens, not assembled at release time. Format is with its history. SageTube's own versions start below and are the ones this file records. +## 5.5.2 — 2026-08-09 + +### Fixed + +- **The account feed loaded but never appeared.** Refresh reported "60 videos in + feed" above a "No subscriptions yet" message and an empty page: the empty-state + hint hides the grid so it can sit centred, and the account path set its entries + without re-running that check — so the grid stayed hidden from startup. The + local feed was unaffected, which is why it went unnoticed. +- The empty-state message was written for local subscriptions and was wrong + advice in account mode, where local subscriptions are not used at all. It now + says to press Refresh instead of telling you to go and subscribe to something. +- The Subscriptions panel is hidden in account mode rather than sitting empty + beside a full feed, implying something failed. + ## 5.5.1 — 2026-08-09 ### Fixed diff --git a/pyproject.toml b/pyproject.toml index e47a74f..e65ba01 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "sagetube" -version = "5.5.1" +version = "5.5.2" description = "Watch-first YouTube client with embedded mpv playback and yt-dlp downloading. Fork of YTSage." authors = [ { name = "Houmeres", email = "admin@ecoposta.sk" }, diff --git a/ytsage/__init__.py b/ytsage/__init__.py index f050ecf..cfaa348 100644 --- a/ytsage/__init__.py +++ b/ytsage/__init__.py @@ -10,5 +10,5 @@ match `version` in pyproject.toml and the repository's latest signed tag -- this package's tag line continues YTSage's, which is why it starts at 5.x. """ -__version__ = "5.5.1" +__version__ = "5.5.2" __author__ = "Houmeres" diff --git a/ytsage/gui/ytsage_gui_feed.py b/ytsage/gui/ytsage_gui_feed.py index 9987a20..a90ed61 100644 --- a/ytsage/gui/ytsage_gui_feed.py +++ b/ytsage/gui/ytsage_gui_feed.py @@ -148,7 +148,10 @@ class FeedPage(QWidget): splitter = QSplitter(Qt.Orientation.Horizontal, self) layout.addWidget(splitter, stretch=1) - side = QWidget() + # Kept as an attribute: account mode does not use local subscriptions, + # so the panel is hidden there rather than sitting empty beside a full + # feed and implying something is missing. + self.subs_panel = side = QWidget() side_layout = QVBoxLayout(side) side_layout.setContentsMargins(0, 0, 4, 0) subs_label = QLabel(_("feed.subscriptions")) @@ -352,16 +355,26 @@ class FeedPage(QWidget): Feed is the first tab now, so an empty one is the first thing a new user sees. Say what to do about it rather than showing a blank grid. """ + account_mode = (self.mode_combo.currentData() or "local") == "account" + self.subs_panel.setVisible(not account_mode) + self.grid.empty_label.hide() if self.grid.card_count() > 0: self.empty_hint.hide() self.grid.show() return - self.empty_hint.setText( - _("feed.empty_no_subscriptions") - if not LibraryManager.subscriptions() - else _("feed.empty_not_refreshed") - ) + + # The message depends on the mode: account mode does not use local + # subscriptions at all, so telling someone to go and subscribe to + # something would be wrong advice. + if account_mode: + message = _("feed.empty_account") + elif not LibraryManager.subscriptions(): + message = _("feed.empty_no_subscriptions") + else: + message = _("feed.empty_not_refreshed") + self.empty_hint.setText(message) + # Hide the empty grid so the hint sits in the middle of the page # rather than pinned under a large blank area. self.grid.hide() @@ -383,10 +396,15 @@ class FeedPage(QWidget): def _on_account_feed(self, entries: List[Dict[str, Any]]) -> None: self.grid.set_entries(entries) self.status_label.setText(_("feed.refreshed", count=len(entries))) + # Without this the grid stays hidden behind the empty-state hint that + # was shown at startup, so a successful refresh reported "60 videos in + # feed" above a "No subscriptions yet" message and no videos. + self._update_empty_state() def _on_account_error(self, message: str) -> None: logger.error(f"Account feed failed: {message}") self.status_label.setText(_("feed.account_failed", error=message[:200])) + self._update_empty_state() def _on_account_finished(self) -> None: self.refresh_btn.setEnabled(True) diff --git a/ytsage/languages/en.json b/ytsage/languages/en.json index 3ec3e80..90e48a5 100644 --- a/ytsage/languages/en.json +++ b/ytsage/languages/en.json @@ -760,7 +760,8 @@ "empty_not_refreshed": "Nothing here yet.\n\nPress Refresh to fetch the latest uploads from your subscriptions.", "sign_in": "Sign in with cookies…", "sign_in_tooltip": "Use your YouTube account via browser cookies, which enables the account feed", - "account_requires_cookies": "Requires signing in with cookies" + "account_requires_cookies": "Requires signing in with cookies", + "empty_account": "Nothing loaded yet.\n\nPress Refresh to fetch your YouTube subscription feed." }, "account": { "signed_out": "Not signed in", diff --git a/ytsage/utils/ytsage_localization.py b/ytsage/utils/ytsage_localization.py index 3eccd3e..4b49b35 100644 --- a/ytsage/utils/ytsage_localization.py +++ b/ytsage/utils/ytsage_localization.py @@ -143,7 +143,8 @@ class LocalizationManager: "empty_not_refreshed": "Nothing here yet.\n\nPress Refresh to fetch the latest uploads from your subscriptions.", "sign_in": "Sign in with cookies…", "sign_in_tooltip": "Use your YouTube account via browser cookies, which enables the account feed", - "account_requires_cookies": "Requires signing in with cookies" + "account_requires_cookies": "Requires signing in with cookies", + "empty_account": "Nothing loaded yet.\n\nPress Refresh to fetch your YouTube subscription feed." }, "cards": { "play": "▶ Play",