16be4b4afa
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>
20 lines
795 B
Python
20 lines
795 B
Python
"""
|
|
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
|