Compare commits
3 Commits
a8ebe89cc1
...
v5.4.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
b3772ff484
|
|||
| b4ff618d41 | |||
| 8a05d5ff8f |
@@ -0,0 +1,23 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
Kept as the work happens, not assembled at release time. Format is
|
||||||
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versions follow
|
||||||
|
[SemVer](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
**The `vX.Y.Z` tags already on this repository are upstream YTSage's**, inherited
|
||||||
|
with its history. SageTube's own versions start below and are the ones this file
|
||||||
|
records.
|
||||||
|
|
||||||
|
## Unreleased
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- The documentation left the repository: `docs/BUILDING.md`, `docs/UPSTREAM.md`
|
||||||
|
and `docs/UPSTREAM_README.md` are now the
|
||||||
|
[wiki](https://git.houmeres.sk/Houmeres/SageTube/wiki).
|
||||||
|
- **The history was deliberately not rewritten.** Every other repository in this
|
||||||
|
org had its documentation removed from every commit on 2026-08-08. SageTube is
|
||||||
|
a fork that still merges from `oop7/YTSage`, and a rewrite changes every commit
|
||||||
|
id — which would end that. The files leave in an ordinary commit instead.
|
||||||
|
- `.github/` and `readme-translations/` are upstream's and were left alone, so
|
||||||
|
the next merge does not conflict over them.
|
||||||
@@ -1,12 +1,45 @@
|
|||||||
# SageTube
|
# SageTube
|
||||||
|
|
||||||
A watch-first YouTube client for the desktop — search, browse channels and playlists, follow subscriptions, and stream videos in an embedded mpv player, with full yt-dlp download capability inherited from [YTSage](https://github.com/oop7/YTSage).
|
A watch-first YouTube client for the desktop. Search, browse channels and
|
||||||
|
playlists, follow subscriptions, and stream videos in an embedded mpv player —
|
||||||
|
with the full yt-dlp download feature set inherited from
|
||||||
|
[YTSage](https://github.com/oop7/YTSage).
|
||||||
|
|
||||||
SageTube is a fork of [YTSage](https://github.com/oop7/YTSage) by [oop7](https://github.com/oop7) (MIT). The original YTSage documentation is preserved at [docs/UPSTREAM_README.md](docs/UPSTREAM_README.md).
|
## Features
|
||||||
|
|
||||||
## Status
|
**Watching**
|
||||||
|
- 📺 Embedded mpv player (Wayland/X11/Windows/macOS) with quality selector,
|
||||||
|
speed, volume, subtitles, fullscreen
|
||||||
|
- 🔍 In-app YouTube search with thumbnail card grid
|
||||||
|
- 📂 Channel browsing (Videos / Shorts / Live) and playlist views
|
||||||
|
- 🔔 Local subscriptions — no Google account needed — with an aggregated feed;
|
||||||
|
optional real account feed via browser cookies
|
||||||
|
- ⏯️ Watch history with resume positions and a persistent play queue
|
||||||
|
- ⬇️ One click from any video card into the downloader
|
||||||
|
|
||||||
Under active development. See the upstream README for the downloader feature set, which remains fully functional.
|
**Downloading** (from YTSage)
|
||||||
|
- Format table, audio extraction, subtitles, SponsorBlock, chapters,
|
||||||
|
playlists, trimming, speed limits, proxies, cookies, custom yt-dlp commands,
|
||||||
|
download history — see the [upstream README](https://git.houmeres.sk/Houmeres/SageTube/wiki/Upstream-README)
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install .
|
||||||
|
sagetube
|
||||||
|
```
|
||||||
|
|
||||||
|
Requires **libmpv** for playback (Arch: `pacman -S mpv`) — see
|
||||||
|
[Building](https://git.houmeres.sk/Houmeres/SageTube/wiki/Building). Without it the app works as a downloader.
|
||||||
|
|
||||||
|
## Fork notes
|
||||||
|
|
||||||
|
SageTube is a fork of [YTSage](https://github.com/oop7/YTSage) by
|
||||||
|
[oop7](https://github.com/oop7) (MIT). The internal package keeps the
|
||||||
|
`ytsage` name so upstream fixes remain mergeable — see
|
||||||
|
[Tracking upstream](https://git.houmeres.sk/Houmeres/SageTube/wiki/Tracking-upstream). The fork also fixes a number of
|
||||||
|
upstream bugs (unsafe partial-file cleanup, unverified binary updates,
|
||||||
|
thread-safety issues, PATH corruption on Windows — see the git log).
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
|||||||
@@ -1,624 +0,0 @@
|
|||||||
<div align="center">
|
|
||||||
|
|
||||||
<img src="branding/svg/ytsage-wordmark.svg" width="400" alt="ytsage-wordmark">
|
|
||||||
<img src="branding/screenshots/main.png" width="800" alt="YTSage Interface"/>
|
|
||||||
|
|
||||||
[](https://www.python.org/downloads/)
|
|
||||||
[](https://pepy.tech/project/ytsage)
|
|
||||||
[](https://github.com/oop7/YTSage/releases)
|
|
||||||
[](https://opensource.org/licenses/MIT)
|
|
||||||
[](https://github.com/oop7/YTSage/releases)
|
|
||||||
[](https://github.com/oop7/YTSage/stargazers)
|
|
||||||
[](https://pypi.org/project/ytsage/)
|
|
||||||
[](https://github.com/sponsors/oop7)
|
|
||||||
|
|
||||||
**Modern YouTube downloader with a clean PySide6 interface.**
|
|
||||||
Download videos in any quality, extract audio, fetch subtitles, and more.
|
|
||||||
|
|
||||||
### 🌍 README Languages
|
|
||||||
|
|
||||||
English: [EN](README.md)
|
|
||||||
| Arabic: [AR](readme-translations/README.ar.md)
|
|
||||||
| German: [DE](readme-translations/README.de.md)
|
|
||||||
| Spanish: [ES](readme-translations/README.es.md)
|
|
||||||
| French: [FR](readme-translations/README.fr.md)
|
|
||||||
| Hindi: [HI](readme-translations/README.hi.md)
|
|
||||||
| Indonesian: [ID](readme-translations/README.id.md)
|
|
||||||
| Italian: [IT](readme-translations/README.it.md)
|
|
||||||
| Japanese: [JA](readme-translations/README.ja.md)
|
|
||||||
| Polish: [PL](readme-translations/README.pl.md)
|
|
||||||
| Portuguese: [PT](readme-translations/README.pt.md)
|
|
||||||
| Russian: [RU](readme-translations/README.ru.md)
|
|
||||||
| Turkish: [TR](readme-translations/README.tr.md)
|
|
||||||
| Chinese: [ZH](readme-translations/README.zh.md)
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<a href="#installation">Installation</a> •
|
|
||||||
<a href="#features">Features</a> •
|
|
||||||
<a href="#usage">Usage</a> •
|
|
||||||
<a href="#screenshots">Screenshots</a> •
|
|
||||||
<a href="#troubleshooting">Troubleshooting</a> •
|
|
||||||
<a href="#sponsor">Sponsor</a> •
|
|
||||||
<a href="#contributing">Contributing</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<a id="why-ytsage"></a>
|
|
||||||
## ❓ Why YTSage?
|
|
||||||
|
|
||||||
YTSage is designed for users who want a **simple yet powerful YouTube downloader**. Unlike other tools, it offers:
|
|
||||||
|
|
||||||
- A modern and clean PySide6 interface
|
|
||||||
- One-click downloads for video, audio, and subtitles
|
|
||||||
- Advanced features like SponsorBlock, subtitle merging, and playlist selection
|
|
||||||
- Optional Generic Mode for sites supported by yt-dlp beyond YouTube
|
|
||||||
- Cross-platform support and easy installation
|
|
||||||
|
|
||||||
<a id="features"></a>
|
|
||||||
## ✨ Features
|
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
|
|
||||||
| Core Features | Advanced Features | Extra Features |
|
|
||||||
|-----------------------------------|-----------------------------------------|------------------------------------|
|
|
||||||
| 🎥 Format Table | 🚫 SponsorBlock Integration | 🎞️ FPS/HDR Display |
|
|
||||||
| 🎵 Audio Extraction | 📝 Subtitle Selection & Merging | 🔄 Auto Update yt-dlp |
|
|
||||||
| ✨ Simple UI | 💾 Save Description & Thumbnail | 🛠️ FFmpeg/yt-dlp/Deno Detection |
|
|
||||||
| 📋 Playlist Support & Selector | 🚀 Speed Limiter | ⚙️ Custom Commands |
|
|
||||||
| 📑 Chapter Integration | ✂️ Video Section Trimming | 🍪 Login with Cookies |
|
|
||||||
| 📜 Download History | 🔄 Version Channel Selection | 🌐 Proxy Support |
|
|
||||||
| 🎚️ Audio Format Conversion | 🎬 Video Format Settings | 🆙 Built-in Updater Tab |
|
|
||||||
| 🌍 Generic Mode | 🔊 Audio Normalization (EBU R128) | 🌍 Localized in 14 Languages |
|
|
||||||
| 💾 Playlist Export | ⚙️ Default Quality & Subtitles | |
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<a id="installation"></a>
|
|
||||||
## 🚀 Installation
|
|
||||||
|
|
||||||
### ⚡ Quick Install (Recommended)
|
|
||||||
|
|
||||||
Install YTSage via PyPI:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pip install ytsage
|
|
||||||
```
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>🔄 Update existing installation</summary>
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pip install --upgrade ytsage
|
|
||||||
```
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
Then launch the application:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
ytsage
|
|
||||||
```
|
|
||||||
|
|
||||||
### 📦 Pre-built Executables
|
|
||||||
|
|
||||||
> [👉 Download Latest Release](https://github.com/oop7/YTSage/releases/latest)
|
|
||||||
|
|
||||||
#### 🪟 Windows
|
|
||||||
|
|
||||||
| Format | Description |
|
|
||||||
|--------|-------------|
|
|
||||||
|  | Standard Installer |
|
|
||||||
|  | With FFmpeg Included |
|
|
||||||
|  | Portable version, no installation needed |
|
|
||||||
|  | Portable with FFmpeg, zipped |
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>🛠️ Installation Steps</summary>
|
|
||||||
|
|
||||||
1. **EXE Installer (`.exe`)**: Double-click the file and follow the setup wizard.
|
|
||||||
2. **Portable Version (`.zip`)**: Extract the archive to your desired location and launch `ytsage.exe`.
|
|
||||||
3. **FFmpeg Included**: Choose versions with FFmpeg included if you don't have FFmpeg installed on your system.
|
|
||||||
</details>
|
|
||||||
|
|
||||||
#### 🐧 Linux
|
|
||||||
|
|
||||||
| Format | Description |
|
|
||||||
|--------|-------------|
|
|
||||||
|  | Debian Package |
|
|
||||||
|  | AppImage, Portable |
|
|
||||||
|  | RPM Package |
|
|
||||||
|  | Flatpak Bundle |
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>🛠️ Installation Steps</summary>
|
|
||||||
|
|
||||||
- **DEB (`.deb`)**:
|
|
||||||
```bash
|
|
||||||
sudo dpkg -i ytsage_*.deb
|
|
||||||
sudo apt-get install -f # Fix missing dependencies if needed
|
|
||||||
```
|
|
||||||
- **RPM (`.rpm`)**:
|
|
||||||
```bash
|
|
||||||
sudo rpm -i ytsage-*.rpm
|
|
||||||
```
|
|
||||||
- **AppImage (`.AppImage`)**:
|
|
||||||
```bash
|
|
||||||
chmod +x YTSage-*.AppImage
|
|
||||||
./YTSage-*.AppImage
|
|
||||||
```
|
|
||||||
- **Flatpak**: Follow instructions on Flathub or run:
|
|
||||||
```bash
|
|
||||||
flatpak install flathub io.github.oop7.ytsage
|
|
||||||
```
|
|
||||||
</details>
|
|
||||||
|
|
||||||
#### 🍎 macOS
|
|
||||||
|
|
||||||
| Format | Description |
|
|
||||||
|--------|-------------|
|
|
||||||
|  | Zipped Application for Apple Silicon |
|
|
||||||
|  | Disk Image Installer for Apple Silicon |
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>🛠️ Installation Steps</summary>
|
|
||||||
|
|
||||||
- **DMG Installer (`.dmg`)**: Double-click to mount, then drag `YTSage.app` to your Applications folder.
|
|
||||||
- **Application Archive (`.zip`)**: Extract the zip and move `YTSage.app` to your Applications folder.
|
|
||||||
|
|
||||||
*Note: If you encounter an "Application is damaged" error, see the macOS troubleshooting section below.*
|
|
||||||
</details>
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>💻 Manual Source Installation</summary>
|
|
||||||
|
|
||||||
### 1. Clone the repository
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git clone https://github.com/oop7/YTSage.git
|
|
||||||
cd YTSage
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Install dependencies
|
|
||||||
|
|
||||||
#### ⚡ Using uv
|
|
||||||
|
|
||||||
```bash
|
|
||||||
uv pip install .
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 📦 Or using standard pip
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pip install .
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. Run the application
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python -m ytsage.main
|
|
||||||
```
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<a id="screenshots"></a>
|
|
||||||
## 📸 Screenshots
|
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
<table>
|
|
||||||
<tr>
|
|
||||||
<td><img src="branding/screenshots/Download-Settings.png" alt="Download Settings" width="400"/></td>
|
|
||||||
<td><img src="branding/screenshots/playlist.png" alt="Playlist Download" width="400"/></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center"><em>Download Settings</em></td>
|
|
||||||
<td align="center"><em>Playlist Download</em></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><img src="branding/screenshots/audio_format.png" alt="Audio Format Selection" width="400"/></td>
|
|
||||||
<td><img src="branding/screenshots/Custom-Option.png" alt="Custom Options" width="400"/></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center"><em>Audio Format</em></td>
|
|
||||||
<td align="center"><em>Custom Options</em></td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<a id="usage"></a>
|
|
||||||
## 📖 Usage
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>🎯 Basic Usage</summary>
|
|
||||||
|
|
||||||
1. **Launch YTSage**
|
|
||||||
2. **Paste YouTube URL** (or use "Paste URL" button)
|
|
||||||
3. **Click "Analyze"**
|
|
||||||
4. **Select Format:**
|
|
||||||
- `Video` for video downloads
|
|
||||||
- `Audio Only` for audio extraction
|
|
||||||
5. **Choose Options:**
|
|
||||||
- Enable Subtitles and select language
|
|
||||||
- Enable Subtitle Merging
|
|
||||||
- Save Thumbnail
|
|
||||||
- Remove Sponsored Segments
|
|
||||||
- Save Description
|
|
||||||
- Embed Chapters
|
|
||||||
6. **Select Output Directory**
|
|
||||||
7. **Click "Download"**
|
|
||||||
|
|
||||||
> 💡 Default download directory is the user's "Downloads" folder.
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>📋 Playlist Download</summary>
|
|
||||||
|
|
||||||
1. **Paste Playlist URL**
|
|
||||||
2. **Click "Analyze"**
|
|
||||||
3. **Select videos from the playlist selector (optional, defaults to all)**
|
|
||||||
4. **Choose desired format/quality**
|
|
||||||
5. **Click "Download"**
|
|
||||||
|
|
||||||
> 💡 The application automatically handles the download queue, and you can export playlist entries as `.txt`, `.csv`, `.m3u`, or `.json`.
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>🌍 Generic Mode for Non-YouTube Sites</summary>
|
|
||||||
|
|
||||||
Use Generic Mode when you want YTSage to accept URLs from sites supported by yt-dlp, such as Dailymotion, CBC Gem, TikTok, and others.
|
|
||||||
|
|
||||||
How to use it:
|
|
||||||
|
|
||||||
1. Open `Download Settings`.
|
|
||||||
2. Toggle on `Generic Mode`.
|
|
||||||
3. Paste a supported video or playlist URL that is not from YouTube.
|
|
||||||
4. Click `Analyze`.
|
|
||||||
5. Choose a format and download as usual.
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
|
|
||||||
- Generic mode only changes the URL validation inside YTSage. The target site must still be supported by your installed version of yt-dlp.
|
|
||||||
- Some sites require cookies, login sessions, proxy, or extra yt-dlp arguments depending on the extractor.
|
|
||||||
- If a site fails, update yt-dlp from the built-in updater tab first before reporting an issue.
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>🧰 Media & Download Options</summary>
|
|
||||||
|
|
||||||
- **Subtitle Options:** Filter languages and embed subtitles into the video file.
|
|
||||||
- **Subtitle Merging:** Merge subtitles into the video file for hardcoded/burned-in subtitles.
|
|
||||||
- **Save Description:** Save the video description as a text file.
|
|
||||||
- **Save Thumbnail:** Save the video thumbnail as an image file.
|
|
||||||
- **Embed Chapters:** Embed chapter markers as metadata for compatible video players.
|
|
||||||
- **Remove Sponsored Segments:** Remove sponsored segments from the video using SponsorBlock.
|
|
||||||
- **Trim Video:** Download only specific parts of a video by specifying time ranges in `HH:MM:SS` format.
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>⚙️ Output & File Settings</summary>
|
|
||||||
|
|
||||||
- **Speed Limiter:** Limit download speed, e.g., `500K` for 500 KB/s.
|
|
||||||
- **Save Download Path:** Saves the default download path for future downloads. Available in **Download Settings → Download Path**.
|
|
||||||
- **Default Video Resolution:** Set your preferred default video resolution for auto-selection (e.g., 1080p, 720p). Available in **Download Settings → Default Video Resolution**.
|
|
||||||
- **Default Subtitle Languages:** Set default subtitle languages for auto-selection (comma-separated, e.g., `en,es`). Available in **Download Settings → Default Subtitle Languages**.
|
|
||||||
- **Output Filename Format:** Customize the output filename format using variables like `%(title)s`, `%(uploader)s`, `%(playlist_index)s`, and `%(resolution)s`. Available in **Download Settings → Filename Format**.
|
|
||||||
- **Force Output Format:** Force video downloads into a specific container format like `mp4`, `webm`, or `mkv`. Available in **Download Settings → Output Format Settings**.
|
|
||||||
- **Audio Format Conversion:** Convert audio-only downloads into preferred formats such as `AAC`, `MP3`, `FLAC`, `WAV`, `Opus`, `M4A`, `Vorbis`, or `Best`. Available in **Download Settings → Audio Format Settings**.
|
|
||||||
- **Audio Normalization:** Standardize volume for audio-only downloads using EBU R128.
|
|
||||||
- **Concurrent Connections:** Dramatically increase download speed by downloading files in multiple fragments simultaneously. Available in **Download Settings → General → Concurrent Connections** (Default is 1, maximum recommended is 8-10 to avoid IP throttling).
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>🌐 Access & Network</summary>
|
|
||||||
|
|
||||||
- **Login with Cookies:** Log in to YouTube using cookies to access private content.
|
|
||||||
How to use it:
|
|
||||||
1. **Recommended:** Use the built-in `Extract cookies from browser` option in the app, then select your browser and optionally a profile.
|
|
||||||
2. Alternatively, extract cookies manually:
|
|
||||||
a. Export browser cookies using an extension like [cookie-editor](https://github.com/moustachauve/cookie-editor?tab=readme-ov-file)
|
|
||||||
b. Copy cookies in Netscape format
|
|
||||||
c. Create a file named `cookies.txt` and paste cookies
|
|
||||||
d. Select the `cookies.txt` file in the app
|
|
||||||
- **Proxy Support:** Use a proxy server for downloads, e.g., `http://<proxy-server>:<port>`
|
|
||||||
- **Generic Mode:** Allows YTSage to analyze and download from non-YouTube sites supported by yt-dlp. Enable from **Download Settings → Generic Mode**.
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>🛠️ Tools & Maintenance</summary>
|
|
||||||
|
|
||||||
- **Custom Commands:** Access advanced yt-dlp features via command-line arguments.
|
|
||||||
- **Updater Tab:** Manage built-in update tools from one place in Custom Options:
|
|
||||||
- **yt-dlp Updates:** Check for updates and toggle between Stable and Nightly release channels.
|
|
||||||
- **FFmpeg Version Checker:** Check your FFmpeg version and open installation guides.
|
|
||||||
- **Deno Updates:** Check and update the Deno runtime.
|
|
||||||
- **FFmpeg/yt-dlp/Deno Detection:** Automatically detects paths and versions for FFmpeg, yt-dlp, and Deno from the About dialog.
|
|
||||||
- **Download History:** View past downloads with thumbnails and statuses from the **History** button.
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>🌍 Localization</summary>
|
|
||||||
|
|
||||||
YTSage supports **14 languages** for global accessibility. Select your preferred language in **Custom Options → Language**.
|
|
||||||
|
|
||||||
### Supported Languages
|
|
||||||
|
|
||||||
| Language | Code | Language | Code |
|
|
||||||
|----------|------|----------|------|
|
|
||||||
| 🇺🇸 English | `en` | 🇪🇸 Spanish | `es` |
|
|
||||||
| 🇸🇦 Arabic | `ar` | 🇫🇷 French | `fr` |
|
|
||||||
| 🇩🇪 German | `de` | 🇮🇳 Hindi | `hi` |
|
|
||||||
| 🇮🇩 Indonesian | `id` | 🇮🇹 Italian | `it` |
|
|
||||||
| 🇯🇵 Japanese | `ja` | 🇵🇱 Polish | `pl` |
|
|
||||||
| 🇧🇷 Portuguese | `pt` | 🇷🇺 Russian | `ru` |
|
|
||||||
| 🇹🇷 Turkish | `tr` | 🇨🇳 Chinese | `zh` |
|
|
||||||
|
|
||||||
### README Translations
|
|
||||||
|
|
||||||
| Language | File | Language | File |
|
|
||||||
|----------|------|----------|------|
|
|
||||||
| 🇺🇸 English | [README.md](README.md) | 🇪🇸 Spanish | [readme-translations/README.es.md](readme-translations/README.es.md) |
|
|
||||||
| 🇸🇦 Arabic | [readme-translations/README.ar.md](readme-translations/README.ar.md) | 🇫🇷 French | [readme-translations/README.fr.md](readme-translations/README.fr.md) |
|
|
||||||
| 🇩🇪 German | [readme-translations/README.de.md](readme-translations/README.de.md) | 🇮🇳 Hindi | [readme-translations/README.hi.md](readme-translations/README.hi.md) |
|
|
||||||
| 🇮🇩 Indonesian | [readme-translations/README.id.md](readme-translations/README.id.md) | 🇮🇹 Italian | [readme-translations/README.it.md](readme-translations/README.it.md) |
|
|
||||||
| 🇯🇵 Japanese | [readme-translations/README.ja.md](readme-translations/README.ja.md) | 🇵🇱 Polish | [readme-translations/README.pl.md](readme-translations/README.pl.md) |
|
|
||||||
| 🇧🇷 Portuguese | [readme-translations/README.pt.md](readme-translations/README.pt.md) | 🇷🇺 Russian | [readme-translations/README.ru.md](readme-translations/README.ru.md) |
|
|
||||||
| 🇹🇷 Turkish | [readme-translations/README.tr.md](readme-translations/README.tr.md) | 🇨🇳 Chinese | [readme-translations/README.zh.md](readme-translations/README.zh.md) |
|
|
||||||
|
|
||||||
> 💡 **Want to contribute a translation?** Check out the [Contributing](#contributing) section to help us add more languages!
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<a id="troubleshooting"></a>
|
|
||||||
## 🛠️ Troubleshooting
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Click to view common issues and solutions</summary>
|
|
||||||
|
|
||||||
- **Format table not appearing:** Update yt-dlp to latest version and switch to nightly yt-dlp.
|
|
||||||
- **Download failed:** Check your internet connection and ensure the video is available.
|
|
||||||
- **Specific Download Errors:**
|
|
||||||
- **Private Videos:** Use cookie authentication to access private content.
|
|
||||||
- **Age-Restricted Content:** Log in to your YouTube account to view age-restricted videos.
|
|
||||||
- **Geo-Blocked Videos:** Consider using a VPN to bypass regional restrictions.
|
|
||||||
- **Deleted Videos:** Video is no longer available on YouTube.
|
|
||||||
- **Live Streams:** Live streams cannot be downloaded; wait for the broadcast to end.
|
|
||||||
- **Network Errors:** Check your internet connection and try again.
|
|
||||||
- **Invalid URLs:** Ensure the URL is correct and from a supported platform.
|
|
||||||
- **Premium Content:** Requires a YouTube Premium subscription.
|
|
||||||
- **Copyright Blocks:** Content is blocked due to copyright restrictions.
|
|
||||||
- **Video and Audio Files separate after download:** This happens when FFmpeg is missing or not detected. YTSage requires FFmpeg to merge high-quality video and audio streams.
|
|
||||||
- **Solution:** Ensure FFmpeg is installed and accessible in your system's PATH. For Windows users, the easiest option is to download the `YTSage-v<version>-ffmpeg.exe` file, which comes bundled with FFmpeg.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
#### 🛡️ Windows Defender / Antivirus Warning
|
|
||||||
|
|
||||||
Some antivirus software may flag `.exe` files as false positives. This is a **known limitation** of packaged applications.
|
|
||||||
|
|
||||||
**Why this happens:**
|
|
||||||
- Antivirus heuristics can mistakenly identify packaged executables as suspicious.
|
|
||||||
|
|
||||||
**Safe Alternatives:**
|
|
||||||
- ✅ **Use pip install:** `pip install ytsage` (Recommended)
|
|
||||||
- ✅ **Build from Source**: by following this [guide](.github/CI_CD_README.md)
|
|
||||||
- ✅ **Whitelist the app** in your antivirus software.
|
|
||||||
|
|
||||||
#### 🍎 macOS: "Application is damaged and cannot be opened"
|
|
||||||
If you see this error on macOS Sonoma or newer, you need to remove the quarantine attribute.
|
|
||||||
|
|
||||||
1. **Open Terminal** (you can find this using Spotlight).
|
|
||||||
2. **Type the following command** but **do not** press Enter yet. Make sure to include the space at the end:
|
|
||||||
```bash
|
|
||||||
xattr -d com.apple.quarantine
|
|
||||||
```
|
|
||||||
3. **Drag the `YTSage.app` file** from your Finder window and drop it directly into the Terminal window. This will automatically paste the correct file path.
|
|
||||||
4. **Press Enter** to run the command.
|
|
||||||
5. **Try opening YTSage.app again.** It should now launch correctly.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
#### **Config Locations (Advanced)**
|
|
||||||
- **Windows:** `%LOCALAPPDATA%\YTSage`
|
|
||||||
- **macOS:** `~/Library/Application Support/YTSage`
|
|
||||||
- **Linux:** `~/.local/share/YTSage`
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<a id="sponsor"></a>
|
|
||||||
## 💖 Sponsor
|
|
||||||
|
|
||||||
If YTSage saves you time, please consider sponsoring the project. Sponsoring helps cover development time, testing across all platforms, and future improvements.
|
|
||||||
|
|
||||||
- GitHub Sponsors: https://github.com/sponsors/oop7
|
|
||||||
- Sponsorship link is also available directly in the app via the About dialog.
|
|
||||||
|
|
||||||
[](https://github.com/sponsors/oop7)
|
|
||||||
|
|
||||||
<a id="contributing"></a>
|
|
||||||
## 👥 Contributing
|
|
||||||
|
|
||||||
We welcome contributions! Here’s how you can help:
|
|
||||||
|
|
||||||
1. 🍴 Fork the repository
|
|
||||||
2. 🌿 Create your feature branch:
|
|
||||||
```bash
|
|
||||||
git checkout -b feature/AmazingFeature
|
|
||||||
```
|
|
||||||
3. 💾 Commit your changes:
|
|
||||||
```bash
|
|
||||||
git commit -m 'Add some AmazingFeature'
|
|
||||||
```
|
|
||||||
4. 📤 Push to the branch:
|
|
||||||
```bash
|
|
||||||
git push origin feature/AmazingFeature
|
|
||||||
```
|
|
||||||
5. 🔄 Open a Pull Request
|
|
||||||
|
|
||||||
### 🌍 Contributing Translations
|
|
||||||
|
|
||||||
- Update the relevant localized README file (e.g., `readme-translations/README.fr.md`)
|
|
||||||
- Keep app strings synced by editing `ytsage/languages/<code>.json`
|
|
||||||
- If your language is missing, start from `README.md` and create `readme-translations/README.<code>.md`
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>📂 Project Structure</summary>
|
|
||||||
|
|
||||||
## YTSage - Project Structure
|
|
||||||
|
|
||||||
This document describes the organized folder structure of YTSage.
|
|
||||||
|
|
||||||
### 📁 Project Structure
|
|
||||||
|
|
||||||
```
|
|
||||||
YTSage/
|
|
||||||
├── 📁 .github/ # GitHub configuration
|
|
||||||
│ ├── 📁 ISSUE_TEMPLATE/ # Issue templates
|
|
||||||
│ │ └── 🐛-bug-report.md # Bug report template
|
|
||||||
│ ├─── 📁 workflows/ # GitHub Actions workflows
|
|
||||||
│ │ ├── build-linux.yml # Linux build workflow
|
|
||||||
│ │ ├── build-macos.yml # macOS build workflow
|
|
||||||
│ │ │── build-windows.yml # Windows build workflow
|
|
||||||
| | └── release-all.yml # Release master workflow
|
|
||||||
│ └── 📄 CI_CD_README.md # CI/CD documentation
|
|
||||||
├── 📁 branding/ # Branding assets (Screenshots, SVGs)
|
|
||||||
│ ├── 📁 icons/ # App icons
|
|
||||||
│ ├── 📁 screenshots/ # Documentation screenshots
|
|
||||||
│ └── 📁 svg/ # SVG assets
|
|
||||||
├── 📄 LICENSE # License file
|
|
||||||
├── 📄 pyproject.toml # Project metadata and dependencies
|
|
||||||
├── 📄 README.md # Project documentation
|
|
||||||
├── 📄 requirements.txt # Python dependencies (dev)
|
|
||||||
└── 📁 ytsage/ # Source package
|
|
||||||
├── 📁 assets/ # Runtime assets
|
|
||||||
│ ├── 📁 Icon/ # App icons
|
|
||||||
│ └── 📁 sound/ # Sound files
|
|
||||||
├── 📁 languages/ # Localization files
|
|
||||||
│ ├── 📄 ar.json # Arabic translation
|
|
||||||
│ ├── 📄 de.json # German translation
|
|
||||||
│ ├── 📄 en.json # English translation
|
|
||||||
│ └── ... # Other languages
|
|
||||||
├── 📁 core/ # Core business logic
|
|
||||||
│ ├── 📄 __init__.py # Core package init
|
|
||||||
│ ├── 📄 ytsage_deno.py # Deno integration
|
|
||||||
│ ├── 📄 ytsage_downloader.py # Download functionality
|
|
||||||
│ ├── 📄 ytsage_ffmpeg.py # FFmpeg integration
|
|
||||||
│ ├── 📄 ytsage_utils.py # Utility functions
|
|
||||||
│ └── 📄 ytsage_yt_dlp.py # yt-dlp integration
|
|
||||||
├── 📁 gui/ # UI components
|
|
||||||
│ ├── 📄 __init__.py # GUI package init
|
|
||||||
│ ├── 📄 ytsage_gui_main.py # Main app window
|
|
||||||
│ └── 📁 ytsage_gui_dialogs/ # Dialog classes
|
|
||||||
├── 📁 utils/ # Utility modules
|
|
||||||
│ ├── 📄 __init__.py # Utils package init
|
|
||||||
│ ├── 📄 ytsage_config_manager.py # Config management
|
|
||||||
│ └── 📄 ytsage_logger.py # Logging utilities
|
|
||||||
├── 📄 __init__.py # Package entry point
|
|
||||||
└── 📄 main.py # Main execution script
|
|
||||||
```
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
## ⭐️ Star History
|
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
|
|
||||||
## Star History
|
|
||||||
|
|
||||||
<a href="https://www.star-history.com/#oop7/YTSage&Date">
|
|
||||||
<picture>
|
|
||||||
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=oop7/YTSage&type=Date&theme=dark" />
|
|
||||||
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=oop7/YTSage&type=Date" />
|
|
||||||
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=oop7/YTSage&type=Date" />
|
|
||||||
</picture>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
## 📜 License
|
|
||||||
|
|
||||||
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
|
||||||
|
|
||||||
## 🙏 Acknowledgments
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Show Acknowledgments</summary>
|
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
|
|
||||||
<p>A big thanks to everyone who contributed to this project by opening an issue to suggest an improvement or report a bug.</p>
|
|
||||||
|
|
||||||
<table>
|
|
||||||
<tr class="section"><th colspan="2">Core Components</th></tr>
|
|
||||||
<tr>
|
|
||||||
<td width="35%"><a href="https://github.com/yt-dlp/yt-dlp">yt-dlp</a></td>
|
|
||||||
<td>Download Engine</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><a href="https://ffmpeg.org/">FFmpeg</a></td>
|
|
||||||
<td>Media Processing</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><a href="https://deno.com/">Deno</a></td>
|
|
||||||
<td>Runtime for yt-dlp plugins</td>
|
|
||||||
</tr>
|
|
||||||
<tr class="section"><th colspan="2">Libraries & Frameworks</th></tr>
|
|
||||||
<tr>
|
|
||||||
<td><a href="https://wiki.qt.io/Qt_for_Python">PySide6</a></td>
|
|
||||||
<td>GUI Framework</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><a href="https://python-pillow.org/">Pillow</a></td>
|
|
||||||
<td>Image Processing</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><a href="https://requests.readthedocs.io/">requests</a></td>
|
|
||||||
<td>HTTP Requests</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><a href="https://packaging.python.org/">packaging</a></td>
|
|
||||||
<td>Version/Package Management</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><a href="https://python-markdown.github.io/">markdown</a></td>
|
|
||||||
<td>Markdown Rendering</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><a href="https://github.com/Delgan/loguru">loguru</a></td>
|
|
||||||
<td>Logging</td>
|
|
||||||
</tr>
|
|
||||||
<tr class="section"><th colspan="2">Assets & Contributors</th></tr>
|
|
||||||
<tr>
|
|
||||||
<td><a href="https://pixabay.com/sound-effects/new-notification-09-352705/">New Notification 09 by Universfield</a></td>
|
|
||||||
<td>Notification Sound</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><a href="https://github.com/viru185">viru185</a></td>
|
|
||||||
<td>Code Contributor</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
## ⚠️ Disclaimer
|
|
||||||
|
|
||||||
This tool is for personal use only. Please respect YouTube's Terms of Service and content creator rights.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
|
|
||||||
Made with ❤️ by [oop7](https://github.com/oop7)
|
|
||||||
|
|
||||||
</div>
|
|
||||||
+9
-7
@@ -3,11 +3,12 @@ requires = ["setuptools"]
|
|||||||
build-backend = "setuptools.build_meta"
|
build-backend = "setuptools.build_meta"
|
||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "ytsage"
|
name = "sagetube"
|
||||||
version = "5.2.0"
|
version = "0.1.0"
|
||||||
description = "Modern YouTube downloader with a clean PySide6 interface."
|
description = "Watch-first YouTube client with embedded mpv playback and yt-dlp downloading. Fork of YTSage."
|
||||||
authors = [
|
authors = [
|
||||||
{ name = "oop7", email = "oop7_support@proton.me" },
|
{ name = "Houmeres", email = "admin@ecoposta.sk" },
|
||||||
|
{ name = "oop7 (YTSage upstream)", email = "oop7_support@proton.me" },
|
||||||
]
|
]
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"PySide6>=6.10.1",
|
"PySide6>=6.10.1",
|
||||||
@@ -48,12 +49,13 @@ keywords = ["youtube", "downloader", "video", "audio", "PySide6", "yt-dlp", "GUI
|
|||||||
|
|
||||||
|
|
||||||
[project.scripts]
|
[project.scripts]
|
||||||
|
sagetube = "ytsage.main:main"
|
||||||
ytsage = "ytsage.main:main"
|
ytsage = "ytsage.main:main"
|
||||||
|
|
||||||
[project.urls]
|
[project.urls]
|
||||||
Homepage = "https://github.com/oop7/YTSage"
|
Homepage = "https://git.houmeres.sk/Houmeres/SageTube"
|
||||||
Bug-Tracker = "https://github.com/oop7/YTSage/issues"
|
Bug-Tracker = "https://git.houmeres.sk/Houmeres/SageTube/issues"
|
||||||
Reddit = "https://www.reddit.com/r/NO-N_A_M_E/"
|
Upstream = "https://github.com/oop7/YTSage"
|
||||||
|
|
||||||
[tool.setuptools]
|
[tool.setuptools]
|
||||||
include-package-data = true
|
include-package-data = true
|
||||||
|
|||||||
+1
-1
@@ -4,5 +4,5 @@ YTSage - YouTube Video Downloader
|
|||||||
A modern, user-friendly YouTube video downloader built with PySide6.
|
A modern, user-friendly YouTube video downloader built with PySide6.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
__version__ = "5.2.0"
|
__version__ = "0.1.0"
|
||||||
__author__ = "oop7"
|
__author__ = "oop7"
|
||||||
|
|||||||
@@ -226,24 +226,27 @@ class AboutDialog(QDialog):
|
|||||||
info_layout = QHBoxLayout()
|
info_layout = QHBoxLayout()
|
||||||
info_layout.setSpacing(15)
|
info_layout.setSpacing(15)
|
||||||
|
|
||||||
author_link = '<a href="https://github.com/oop7/" style="color: #c90000; text-decoration: none;">oop7</a>'
|
author_link = '<a href="https://git.houmeres.sk/Houmeres" style="color: #c90000; text-decoration: none;">Houmeres</a>'
|
||||||
author_label = QLabel(
|
author_label = QLabel(
|
||||||
f"{_('about.author', author=author_link)}"
|
f"{_('about.author', author=author_link)}"
|
||||||
)
|
)
|
||||||
author_label.setOpenExternalLinks(True)
|
author_label.setOpenExternalLinks(True)
|
||||||
info_layout.addWidget(author_label)
|
info_layout.addWidget(author_label)
|
||||||
|
|
||||||
repo_link = '<a href="https://github.com/oop7/YTSage/" style="color: #c90000; text-decoration: none;">YTSage</a>'
|
repo_link = '<a href="https://git.houmeres.sk/Houmeres/SageTube" style="color: #c90000; text-decoration: none;">SageTube</a>'
|
||||||
repo_label = QLabel(
|
repo_label = QLabel(
|
||||||
f"{_('about.github', repo=repo_link)}"
|
f"{_('about.github', repo=repo_link)}"
|
||||||
)
|
)
|
||||||
repo_label.setOpenExternalLinks(True)
|
repo_label.setOpenExternalLinks(True)
|
||||||
info_layout.addWidget(repo_label)
|
info_layout.addWidget(repo_label)
|
||||||
|
|
||||||
sponsor_link = '<a href="https://github.com/sponsors/oop7" style="color: #c90000; text-decoration: none;">❤️ Sponsor</a>'
|
upstream_link = (
|
||||||
sponsor_label = QLabel(sponsor_link)
|
'<a href="https://github.com/oop7/YTSage" style="color: #c90000; text-decoration: none;">'
|
||||||
sponsor_label.setOpenExternalLinks(True)
|
"Based on YTSage by oop7</a>"
|
||||||
info_layout.addWidget(sponsor_label)
|
)
|
||||||
|
upstream_label = QLabel(upstream_link)
|
||||||
|
upstream_label.setOpenExternalLinks(True)
|
||||||
|
info_layout.addWidget(upstream_label)
|
||||||
|
|
||||||
# Center the info layout
|
# Center the info layout
|
||||||
info_container = QHBoxLayout()
|
info_container = QHBoxLayout()
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
"restart_notice": "Language change will take effect after restarting the application."
|
"restart_notice": "Language change will take effect after restarting the application."
|
||||||
},
|
},
|
||||||
"app": {
|
"app": {
|
||||||
"title": "YTSage",
|
"title": "SageTube",
|
||||||
"version": "v{version}",
|
"version": "v{version}",
|
||||||
"ready": "Ready"
|
"ready": "Ready"
|
||||||
},
|
},
|
||||||
@@ -240,9 +240,9 @@
|
|||||||
"update_in_progress_message": "yt-dlp is currently updating. Please wait a moment."
|
"update_in_progress_message": "yt-dlp is currently updating. Please wait a moment."
|
||||||
},
|
},
|
||||||
"about": {
|
"about": {
|
||||||
"title": "About YTSage",
|
"title": "About SageTube",
|
||||||
"version": "Version {version}",
|
"version": "Version {version}",
|
||||||
"description": "Modern YouTube downloader with clean PySide6 interface.",
|
"description": "Watch-first YouTube client with embedded mpv playback and yt-dlp downloading. Fork of YTSage by oop7 (MIT).",
|
||||||
"author": "By: {author}",
|
"author": "By: {author}",
|
||||||
"github": "GitHub: {repo}",
|
"github": "GitHub: {repo}",
|
||||||
"system_info": "System Information",
|
"system_info": "System Information",
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ def main():
|
|||||||
try:
|
try:
|
||||||
logger.info("Starting YTSage application")
|
logger.info("Starting YTSage application")
|
||||||
app = QApplication(sys.argv)
|
app = QApplication(sys.argv)
|
||||||
|
app.setApplicationName("SageTube")
|
||||||
|
app.setDesktopFileName("sagetube")
|
||||||
|
|
||||||
window = YTSageApp() # Instantiate the main application class
|
window = YTSageApp() # Instantiate the main application class
|
||||||
window.show()
|
window.show()
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ class ConfigManager:
|
|||||||
"geo_proxy_url": None,
|
"geo_proxy_url": None,
|
||||||
"auto_update_ytdlp": True,
|
"auto_update_ytdlp": True,
|
||||||
"auto_update_frequency": "daily",
|
"auto_update_frequency": "daily",
|
||||||
"check_app_updates": True,
|
"check_app_updates": False, # fork updates come from Gitea, not the upstream PyPI package
|
||||||
"check_beta_updates": False,
|
"check_beta_updates": False,
|
||||||
"last_update_check": 0,
|
"last_update_check": 0,
|
||||||
"concurrent_fragments": 1,
|
"concurrent_fragments": 1,
|
||||||
|
|||||||
@@ -91,11 +91,11 @@ if OS_NAME == "Windows":
|
|||||||
|
|
||||||
# Always use user data directory for app data, logs, config, and binaries
|
# Always use user data directory for app data, logs, config, and binaries
|
||||||
# Even when frozen, we don't want to create these folders next to the executable
|
# Even when frozen, we don't want to create these folders next to the executable
|
||||||
APP_DIR: Path = Path(os.environ.get("LOCALAPPDATA", USER_HOME_DIR / "AppData" / "Local")) / "YTSage"
|
APP_DIR: Path = Path(os.environ.get("LOCALAPPDATA", USER_HOME_DIR / "AppData" / "Local")) / "SageTube"
|
||||||
APP_BIN_DIR: Path = APP_DIR / "bin"
|
APP_BIN_DIR: Path = APP_DIR / "bin"
|
||||||
APP_DATA_DIR: Path = APP_DIR / "data"
|
APP_DATA_DIR: Path = APP_DIR / "data"
|
||||||
APP_LOG_DIR: Path = APP_DIR / "logs"
|
APP_LOG_DIR: Path = APP_DIR / "logs"
|
||||||
APP_CONFIG_FILE: Path = APP_DATA_DIR / "ytsage_config.json"
|
APP_CONFIG_FILE: Path = APP_DATA_DIR / "sagetube_config.json"
|
||||||
APP_HISTORY_FILE: Path = APP_DATA_DIR / "ytsage_history.json"
|
APP_HISTORY_FILE: Path = APP_DATA_DIR / "ytsage_history.json"
|
||||||
APP_THUMBNAILS_DIR: Path = APP_DATA_DIR / "thumbnails"
|
APP_THUMBNAILS_DIR: Path = APP_DATA_DIR / "thumbnails"
|
||||||
|
|
||||||
@@ -110,11 +110,11 @@ elif OS_NAME == "Darwin": # macOS
|
|||||||
|
|
||||||
# Always use user data directory for app data, logs, config, and binaries
|
# Always use user data directory for app data, logs, config, and binaries
|
||||||
# Even when frozen, we don't want to create these folders next to the executable
|
# Even when frozen, we don't want to create these folders next to the executable
|
||||||
APP_DIR: Path = USER_HOME_DIR / "Library" / "Application Support" / "YTSage"
|
APP_DIR: Path = USER_HOME_DIR / "Library" / "Application Support" / "SageTube"
|
||||||
APP_BIN_DIR: Path = APP_DIR / "bin"
|
APP_BIN_DIR: Path = APP_DIR / "bin"
|
||||||
APP_DATA_DIR: Path = APP_DIR / "data"
|
APP_DATA_DIR: Path = APP_DIR / "data"
|
||||||
APP_LOG_DIR: Path = APP_DIR / "logs"
|
APP_LOG_DIR: Path = APP_DIR / "logs"
|
||||||
APP_CONFIG_FILE: Path = APP_DATA_DIR / "ytsage_config.json"
|
APP_CONFIG_FILE: Path = APP_DATA_DIR / "sagetube_config.json"
|
||||||
APP_HISTORY_FILE: Path = APP_DATA_DIR / "ytsage_history.json"
|
APP_HISTORY_FILE: Path = APP_DATA_DIR / "ytsage_history.json"
|
||||||
APP_THUMBNAILS_DIR: Path = APP_DATA_DIR / "thumbnails"
|
APP_THUMBNAILS_DIR: Path = APP_DATA_DIR / "thumbnails"
|
||||||
|
|
||||||
@@ -129,11 +129,11 @@ else: # Linux and other UNIX-like
|
|||||||
|
|
||||||
# Always use user data directory for app data, logs, config, and binaries
|
# Always use user data directory for app data, logs, config, and binaries
|
||||||
# Even when frozen, we don't want to create these folders next to the executable
|
# Even when frozen, we don't want to create these folders next to the executable
|
||||||
APP_DIR: Path = USER_HOME_DIR / ".local" / "share" / "YTSage"
|
APP_DIR: Path = USER_HOME_DIR / ".local" / "share" / "SageTube"
|
||||||
APP_BIN_DIR: Path = APP_DIR / "bin"
|
APP_BIN_DIR: Path = APP_DIR / "bin"
|
||||||
APP_DATA_DIR: Path = APP_DIR / "data"
|
APP_DATA_DIR: Path = APP_DIR / "data"
|
||||||
APP_LOG_DIR: Path = APP_DIR / "logs"
|
APP_LOG_DIR: Path = APP_DIR / "logs"
|
||||||
APP_CONFIG_FILE: Path = APP_DATA_DIR / "ytsage_config.json"
|
APP_CONFIG_FILE: Path = APP_DATA_DIR / "sagetube_config.json"
|
||||||
APP_HISTORY_FILE: Path = APP_DATA_DIR / "ytsage_history.json"
|
APP_HISTORY_FILE: Path = APP_DATA_DIR / "ytsage_history.json"
|
||||||
APP_THUMBNAILS_DIR: Path = APP_DATA_DIR / "thumbnails"
|
APP_THUMBNAILS_DIR: Path = APP_DATA_DIR / "thumbnails"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user