Restructure main window into a watch-first tab shell

The single-page downloader layout becomes the Downloads tab of a
SmoothTabWidget with Watch / Search / Feed / Browse / Downloads pages.
The init_ui edit is deliberately small (the old central widget is now
self.download_page); all new behavior lives in new modules:

- ytsage_gui_router.py: AppRouter signal hub (playVideo, queueVideo,
  downloadVideo, openChannel, openPlaylist). A card's Download button
  deep-links into the Downloads tab with the URL prefilled and analysis
  started automatically.
- ytsage_gui_cards.py: VideoCard (thumbnail with disk cache under
  APP_THUMBNAILS_DIR, title/channel/duration, Play/Queue/Download
  actions, double-click to play) and VideoCardGrid (responsive grid,
  Load more pagination).
- ytsage_gui_watch.py: WatchPage hosting the mpv PlayerPanel and a
  drag-reorderable play queue with auto-advance on end of file.
- ytsage_gui_search.py: SearchPage running YtdlpClient.search off the
  GUI thread with Load more pagination.
- Browse and Feed pages are placeholders, implemented next.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Jaroslav Beneš
2026-07-25 01:48:39 +02:00
parent f886125857
commit 16be4b4afa
8 changed files with 641 additions and 2 deletions
+19
View File
@@ -0,0 +1,19 @@
"""
AppRouter - cross-tab navigation signals
========================================
A tiny QObject signal hub connecting the watch-first pages (search, feed,
browse) with the player and the downloader tab. Pages emit; the main window
routes. Entry dicts are yt-dlp flat entries or the subset
{id, url, title, channel, channel_url, duration, thumbnail}.
"""
from PySide6.QtCore import QObject, Signal
class AppRouter(QObject):
playVideo = Signal(dict) # play immediately in the Watch tab
queueVideo = Signal(dict) # append to the play queue
downloadVideo = Signal(str) # open Downloads tab with URL prefilled + analyzed
openChannel = Signal(str) # open a channel URL in the Browse tab
openPlaylist = Signal(str) # open a playlist URL in the Browse tab