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",