# pear-desktop-ytdlp-patch

> 🇬🇧 [English](#english) | 🇷🇺 [Русский](#русский)

---

## English

### 📖 Description

A patch for [Pear Desktop (YouTube Music)](https://github.com/th-ch/youtube-music) that replaces the built-in downloader with the system [`yt-dlp`](https://github.com/yt-dlp/yt-dlp).

The default downloader uses the internal `youtubei.js` library to stream audio directly. This library periodically goes out of date and stops working with a `non 2xx status code` error. This patch replaces the download logic with a call to the system `yt-dlp`, which can be updated independently and stays current.

### ✨ What the patch does

- Uses the system `yt-dlp` instead of the built-in streamer
- Converts tracks to **MP3** (high quality)
- Embeds **album artwork** into ID3 tags using the app's existing mechanism
- Preserves metadata: artist, title, album, track number
- Displays download progress directly in the app UI

### 📋 Requirements

| Component | Version |
|-----------|---------|
| [Pear Desktop](https://github.com/th-ch/youtube-music) | 3.11.0 |
| [yt-dlp](https://github.com/yt-dlp/yt-dlp) | Latest |
| [Node.js](https://nodejs.org) | 18+ |
| [@electron/asar](https://www.npmjs.com/package/@electron/asar) | Any |
| Windows | 10/11 |

> ⚠️ This patch targets version **3.11.0** specifically. Other versions may not work due to changes in the minified bundle.

### 🚀 Installation

#### 1. Install dependencies

```powershell
# yt-dlp (if not installed)
pip install yt-dlp

# asar (for repacking the app)
npm install -g @electron/asar
```

#### 2. Download the patch

Download `patch-downloader.ps1` from [Releases](../../releases) or clone the repo:

```powershell
git clone https://github.com/YOUR_USERNAME/pear-desktop-ytdlp-patch.git
cd pear-desktop-ytdlp-patch
```

#### 3. Apply the patch

```powershell
Set-ExecutionPolicy -Scope Process Bypass
.\patch-downloader.ps1
```
#### 4. Repack the asar archive

```powershell
asar pack "C:\Users\$env:USERNAME\scoop\apps\pear-desktop\3.11.0\resources\app" `
         "C:\Users\$env:USERNAME\scoop\apps\pear-desktop\3.11.0\resources\app.asar"
```

#### 5. Restart Pear Desktop

Close and reopen the app. You're done!

### 🔄 Rollback

The script automatically creates a backup at `downloader-DC5ffWkk.js.bak`. To restore:

```powershell
$base = "C:\Users\$env:USERNAME\scoop\apps\pear-desktop\3.11.0\resources\app\dist\main"
Copy-Item "$base\downloader-DC5ffWkk.js.bak" "$base\downloader-DC5ffWkk.js"

asar pack "C:\Users\$env:USERNAME\scoop\apps\pear-desktop\3.11.0\resources\app" `
         "C:\Users\$env:USERNAME\scoop\apps\pear-desktop\3.11.0\resources\app.asar"
```

### 🛠 How it works

Pear Desktop is an Electron app that stores all its code inside `resources/app.asar`. The patch:

1. Unpacks `app.asar` into an `app/` folder
2. Locates the `downloadSongUnsafe` function in the minified `downloader-*.js` file using string markers
3. Replaces the function body with a new implementation using `child_process.spawn("yt-dlp", [...])`
4. Preserves the existing `writeID3` call — the app's built-in function for writing cover art and metadata
5. Repacks `app.asar` with the modified files

### ⚙️ Tech stack

- **PowerShell** — patching script
- **@electron/asar** — unpacking and repacking the Electron archive
- **yt-dlp** — audio downloading and conversion
- **node-id3** (bundled in the app) — ID3 tag and cover art writing

### ❓ Troubleshooting

**`Original code not found`** — your app version differs from 3.11.0 or the file has already been patched.

**`Failed to start yt-dlp`** — make sure `yt-dlp` is installed and available in `PATH`:
```powershell
yt-dlp --version
```

**File downloads but has no cover art** — make sure you are signed into YouTube Music inside Pear Desktop.

### 📄 License

MIT

---

## Русский

### 📖 Описание

Патч для [Pear Desktop (YouTube Music)](https://github.com/th-ch/youtube-music) — заменяет встроенный загрузчик на системный [`yt-dlp`](https://github.com/yt-dlp/yt-dlp).

Стандартный загрузчик использует внутреннюю библиотеку `youtubei.js` для стриминга аудио напрямую, которая периодически устаревает и перестаёт работать с ошибкой `non 2xx status code`. Этот патч заменяет логику загрузки на вызов системного `yt-dlp`, который обновляется независимо и всегда актуален.

### ✨ Что делает патч

- Использует системный `yt-dlp` вместо встроенного стримера
- Конвертирует треки в **MP3** (высокое качество)
- Встраивает **обложку альбома** в ID3-теги через существующий механизм приложения
- Сохраняет метаданные: исполнитель, название, альбом, номер трека
- Показывает прогресс загрузки прямо в интерфейсе приложения

### 📋 Требования

| Компонент | Версия |
|-----------|--------|
| [Pear Desktop](https://github.com/th-ch/youtube-music) | 3.11.0 |
| [yt-dlp](https://github.com/yt-dlp/yt-dlp) | Последняя |
| [Node.js](https://nodejs.org) | 18+ |
| [@electron/asar](https://www.npmjs.com/package/@electron/asar) | Любая |
| Windows | 10/11 |

> ⚠️ Патч написан под версию **3.11.0**. На других версиях может не работать из-за изменений в минифицированном коде.

### 🚀 Установка

#### 1. Установите зависимости

```powershell
# yt-dlp (если не установлен)
pip install yt-dlp

# asar (для переупаковки приложения)
npm install -g @electron/asar
```

#### 2. Скачайте патч

Скачайте `patch-downloader.ps1` из [релизов](../../releases) или клонируйте репозиторий:

```powershell
git clone https://github.com/YOUR_USERNAME/pear-desktop-ytdlp-patch.git
cd pear-desktop-ytdlp-patch
```

#### 3. Примените патч

```powershell
Set-ExecutionPolicy -Scope Process Bypass
.\patch-downloader.ps1
```

#### 4. Переупакуйте asar

```powershell
asar pack "C:\Users\$env:USERNAME\scoop\apps\pear-desktop\3.11.0\resources\app" `
         "C:\Users\$env:USERNAME\scoop\apps\pear-desktop\3.11.0\resources\app.asar"
```

#### 5. Перезапустите Pear Desktop

Закройте и откройте приложение заново. Готово!

### 🔄 Откат

Если что-то пошло не так, скрипт автоматически создаёт бэкап `downloader-DC5ffWkk.js.bak`. Чтобы восстановить:

```powershell
$base = "C:\Users\$env:USERNAME\scoop\apps\pear-desktop\3.11.0\resources\app\dist\main"
Copy-Item "$base\downloader-DC5ffWkk.js.bak" "$base\downloader-DC5ffWkk.js"

asar pack "C:\Users\$env:USERNAME\scoop\apps\pear-desktop\3.11.0\resources\app" `
         "C:\Users\$env:USERNAME\scoop\apps\pear-desktop\3.11.0\resources\app.asar"
```

### 🛠 Как это работает

Pear Desktop упакован в Electron и хранит весь код в `resources/app.asar`. Патч:

1. Распаковывает `app.asar` в папку `app/`
2. Находит функцию `downloadSongUnsafe` в минифицированном файле `downloader-*.js` по маркерам
3. Заменяет тело функции на новую реализацию через `child_process.spawn("yt-dlp", [...])`
4. Сохраняет вызов `writeID3` — встроенной функции приложения для записи обложки и метаданных
5. Переупаковывает `app.asar` с изменёнными файлами

### ⚙️ Технический стек

- **PowerShell** — скрипт патчинга
- **@electron/asar** — распаковка и упаковка Electron-архива
- **yt-dlp** — загрузка и конвертация аудио
- **node-id3** (встроен в приложение) — запись ID3-тегов и обложки

### ❓ Частые проблемы

**`Original code not found`** — версия приложения отличается от 3.11.0 или файл уже пропатчен.

**`Failed to start yt-dlp`** — убедитесь что `yt-dlp` установлен и доступен в `PATH`:
```powershell
yt-dlp --version
```

**Файл скачивается, но без обложки** — убедитесь что вы залогинены в YouTube Music внутри Pear Desktop.

### 📄 Лицензия

MIT