# Tracking upstream YTSage SageTube keeps the full git history of [YTSage](https://github.com/oop7/YTSage) and the internal `ytsage` package name so upstream improvements can be merged. ## Syncing ```bash git fetch upstream # upstream = https://github.com/oop7/YTSage.git git merge upstream/main ``` ## Expected conflict zones Most SageTube features live in **new files** and merge cleanly. Conflicts are likely only in: | File | Reason | |---|---| | `ytsage/gui/ytsage_gui_main.py` | tab-shell edit in `init_ui` (`_setup_main_tabs`), closeEvent hook | | `ytsage/gui/ytsage_gui_analysis.py` | delegates subprocess execution to `YtdlpClient` | | `ytsage/utils/ytsage_constants.py` | SageTube data dirs, PATH prepend for managed binaries | | `ytsage/utils/ytsage_config_manager.py` | atomic save, defaults merge, player/feed/advanced keys | | `pyproject.toml` | name, version, deps (python-mpv), URLs | | `ytsage/languages/en.json` | added sections: player, cards, main_tabs, search, watch, browse, feed | Bug fixes made in this fork (see git log between the merge commit and the first feature commit) may also conflict if upstream fixes them differently — prefer whichever version is stricter about verification and thread safety. ## SageTube-only modules (never conflict) - `ytsage/core/ytsage_client.py` — shared yt-dlp JSON invocation layer - `ytsage/core/ytsage_mpv.py` — libmpv probe - `ytsage/gui/ytsage_gui_player.py` — embedded mpv player - `ytsage/gui/ytsage_gui_watch.py` / `_search.py` / `_browse.py` / `_feed.py` — tabs - `ytsage/gui/ytsage_gui_router.py` / `_cards.py` — navigation + video cards - `ytsage/utils/ytsage_library_manager.py` — subscriptions/history/queue DB