Showing preview only (3,052K chars total). Download the full file or copy to clipboard to get everything.
Repository: pear-devs/pear-desktop
Branch: master
Commit: 83050dee388a
Files: 368
Total size: 2.8 MB
Directory structure:
gitextract_ctpw5b9v/
├── .devcontainer/
│ └── devcontainer.json
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yml
│ │ └── feature_request.yml
│ └── workflows/
│ ├── build.yml
│ ├── dependency-review.yml
│ ├── pr-build-artifacts.yml
│ ├── reviewdog.yml
│ ├── winget-cla.yml
│ └── winget-submission.yml
├── .gitignore
├── .npmrc
├── .prettierrc
├── .vscode/
│ └── launch.json
├── README.md
├── assets/
│ ├── error.html
│ ├── generated/
│ │ └── icons/
│ │ └── mac/
│ │ └── icon.icon/
│ │ └── icon.json
│ └── mdui.css
├── changelog.md
├── electron-builder.yml
├── electron.vite.config.mts
├── eslint.config.mjs
├── license
├── package.json
├── patches/
│ ├── @malept__flatpak-bundler@0.4.0.patch
│ ├── electron-is@3.0.0.patch
│ ├── file-type@16.5.4.patch
│ ├── kuromoji@0.1.2.patch
│ ├── mdui@2.1.4.patch
│ └── vudio@2.1.1.patch
├── renovate.json
├── src/
│ ├── config/
│ │ ├── defaults.ts
│ │ ├── index.ts
│ │ ├── plugins.ts
│ │ └── store.ts
│ ├── custom-electron-prompt.d.ts
│ ├── i18n/
│ │ ├── index.ts
│ │ └── resources/
│ │ ├── @types/
│ │ │ └── index.ts
│ │ ├── ar.json
│ │ ├── az.json
│ │ ├── be.json
│ │ ├── bg.json
│ │ ├── bn.json
│ │ ├── bs.json
│ │ ├── ca.json
│ │ ├── cs.json
│ │ ├── da.json
│ │ ├── de.json
│ │ ├── el.json
│ │ ├── en.json
│ │ ├── es.json
│ │ ├── et.json
│ │ ├── eu.json
│ │ ├── fa.json
│ │ ├── fi.json
│ │ ├── fil.json
│ │ ├── fr.json
│ │ ├── gl.json
│ │ ├── he.json
│ │ ├── hi.json
│ │ ├── hr.json
│ │ ├── hu.json
│ │ ├── id.json
│ │ ├── is.json
│ │ ├── it.json
│ │ ├── ja.json
│ │ ├── ka.json
│ │ ├── kmr.json
│ │ ├── kn.json
│ │ ├── ko.json
│ │ ├── lt.json
│ │ ├── lv.json
│ │ ├── ml.json
│ │ ├── ms.json
│ │ ├── nb.json
│ │ ├── ne.json
│ │ ├── nl.json
│ │ ├── pl.json
│ │ ├── pt-BR.json
│ │ ├── pt.json
│ │ ├── qu.json
│ │ ├── ro.json
│ │ ├── ru.json
│ │ ├── sah.json
│ │ ├── si.json
│ │ ├── sk.json
│ │ ├── sl.json
│ │ ├── sq.json
│ │ ├── sr.json
│ │ ├── sv.json
│ │ ├── ta.json
│ │ ├── te.json
│ │ ├── th.json
│ │ ├── tr.json
│ │ ├── uk.json
│ │ ├── ur.json
│ │ ├── vi.json
│ │ ├── zh-CN.json
│ │ └── zh-TW.json
│ ├── index.html
│ ├── index.ts
│ ├── loader/
│ │ ├── main.ts
│ │ ├── menu.ts
│ │ ├── preload.ts
│ │ └── renderer.ts
│ ├── menu.ts
│ ├── music-player.css
│ ├── navigation.d.ts
│ ├── pear-desktop.ts
│ ├── plugins/
│ │ ├── album-actions/
│ │ │ ├── index.tsx
│ │ │ └── templates/
│ │ │ ├── dislike-button.tsx
│ │ │ ├── index.ts
│ │ │ ├── like-button.tsx
│ │ │ ├── undislike-button.tsx
│ │ │ └── unlike-button.tsx
│ │ ├── album-color-theme/
│ │ │ ├── index.ts
│ │ │ └── style.css
│ │ ├── ambient-mode/
│ │ │ ├── index.ts
│ │ │ ├── menu.ts
│ │ │ ├── style.css
│ │ │ └── types.ts
│ │ ├── amuse/
│ │ │ ├── backend.ts
│ │ │ ├── index.ts
│ │ │ └── types.ts
│ │ ├── api-server/
│ │ │ ├── backend/
│ │ │ │ ├── api-version.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── main.ts
│ │ │ │ ├── routes/
│ │ │ │ │ ├── auth.ts
│ │ │ │ │ ├── control.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── websocket.ts
│ │ │ │ ├── scheme/
│ │ │ │ │ ├── auth.ts
│ │ │ │ │ ├── go-back.ts
│ │ │ │ │ ├── go-forward.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── queue.ts
│ │ │ │ │ ├── search.ts
│ │ │ │ │ ├── seek.ts
│ │ │ │ │ ├── set-fullscreen.ts
│ │ │ │ │ ├── set-volume.ts
│ │ │ │ │ ├── song-info.ts
│ │ │ │ │ └── switch-repeat.ts
│ │ │ │ └── types.ts
│ │ │ ├── config.ts
│ │ │ ├── index.ts
│ │ │ └── menu.ts
│ │ ├── audio-compressor.ts
│ │ ├── auth-proxy-adapter/
│ │ │ ├── backend/
│ │ │ │ ├── index.ts
│ │ │ │ └── types.ts
│ │ │ ├── config.ts
│ │ │ ├── index.ts
│ │ │ └── menu.ts
│ │ ├── blur-nav-bar/
│ │ │ ├── index.ts
│ │ │ └── style.css
│ │ ├── captions-selector/
│ │ │ ├── back.ts
│ │ │ ├── index.ts
│ │ │ ├── renderer.tsx
│ │ │ └── templates/
│ │ │ └── captions-settings-template.tsx
│ │ ├── clock/
│ │ │ ├── index.tsx
│ │ │ ├── style.css
│ │ │ └── types.ts
│ │ ├── compact-sidebar/
│ │ │ └── index.ts
│ │ ├── crossfade/
│ │ │ ├── fader.ts
│ │ │ └── index.ts
│ │ ├── custom-output-device/
│ │ │ ├── index.ts
│ │ │ └── renderer.ts
│ │ ├── disable-autoplay/
│ │ │ └── index.ts
│ │ ├── discord/
│ │ │ ├── constants.ts
│ │ │ ├── discord-service.ts
│ │ │ ├── index.ts
│ │ │ ├── main.ts
│ │ │ ├── menu.ts
│ │ │ ├── timer-manager.ts
│ │ │ └── utils.ts
│ │ ├── downloader/
│ │ │ ├── index.ts
│ │ │ ├── main/
│ │ │ │ ├── index.ts
│ │ │ │ └── utils.ts
│ │ │ ├── menu.ts
│ │ │ ├── renderer.tsx
│ │ │ ├── style.css
│ │ │ ├── templates/
│ │ │ │ └── download.tsx
│ │ │ └── types.ts
│ │ ├── equalizer/
│ │ │ ├── index.ts
│ │ │ └── presets.ts
│ │ ├── exponential-volume/
│ │ │ └── index.ts
│ │ ├── in-app-menu/
│ │ │ ├── constants.ts
│ │ │ ├── index.ts
│ │ │ ├── main.ts
│ │ │ ├── menu.ts
│ │ │ ├── renderer/
│ │ │ │ ├── IconButton.tsx
│ │ │ │ ├── MenuButton.tsx
│ │ │ │ ├── Panel.tsx
│ │ │ │ ├── PanelItem.tsx
│ │ │ │ ├── TitleBar.tsx
│ │ │ │ └── WindowController.tsx
│ │ │ ├── renderer.tsx
│ │ │ └── titlebar.css
│ │ ├── lumiastream/
│ │ │ └── index.ts
│ │ ├── music-together/
│ │ │ ├── connection.ts
│ │ │ ├── element.ts
│ │ │ ├── index.ts
│ │ │ ├── queue/
│ │ │ │ ├── client.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── queue.ts
│ │ │ │ ├── sha1hash.ts
│ │ │ │ ├── song.ts
│ │ │ │ └── utils.ts
│ │ │ ├── style.css
│ │ │ ├── templates/
│ │ │ │ ├── item.html
│ │ │ │ ├── popup.html
│ │ │ │ ├── setting.html
│ │ │ │ └── status.html
│ │ │ ├── types.ts
│ │ │ └── ui/
│ │ │ ├── guest.ts
│ │ │ ├── host.ts
│ │ │ ├── setting.ts
│ │ │ └── status.ts
│ │ ├── navigation/
│ │ │ └── index.tsx
│ │ ├── notifications/
│ │ │ ├── index.ts
│ │ │ ├── interactive.ts
│ │ │ ├── main.ts
│ │ │ ├── menu.ts
│ │ │ └── utils.ts
│ │ ├── performance-improvement/
│ │ │ ├── index.ts
│ │ │ └── scripts/
│ │ │ ├── cpu-tamer/
│ │ │ │ ├── cpu-tamer-by-animationframe.d.ts
│ │ │ │ ├── cpu-tamer-by-animationframe.js
│ │ │ │ ├── cpu-tamer-by-dom-mutation.d.ts
│ │ │ │ ├── cpu-tamer-by-dom-mutation.js
│ │ │ │ └── index.ts
│ │ │ └── rm3/
│ │ │ ├── index.ts
│ │ │ ├── rm3.d.ts
│ │ │ └── rm3.js
│ │ ├── picture-in-picture/
│ │ │ ├── index.ts
│ │ │ ├── keyboardevent-from-electron-accelerator.d.ts
│ │ │ ├── keyboardevents-areequal.d.ts
│ │ │ ├── main.ts
│ │ │ ├── menu.ts
│ │ │ ├── renderer.tsx
│ │ │ ├── style.css
│ │ │ └── templates/
│ │ │ └── picture-in-picture-button.tsx
│ │ ├── playback-speed/
│ │ │ ├── components/
│ │ │ │ └── slider.tsx
│ │ │ ├── index.ts
│ │ │ └── renderer.tsx
│ │ ├── precise-volume/
│ │ │ ├── index.ts
│ │ │ ├── override.ts
│ │ │ ├── renderer.ts
│ │ │ └── volume-hud.css
│ │ ├── quality-changer/
│ │ │ ├── index.tsx
│ │ │ └── templates/
│ │ │ └── quality-setting-button.tsx
│ │ ├── scrobbler/
│ │ │ ├── index.ts
│ │ │ ├── main.ts
│ │ │ ├── menu.ts
│ │ │ └── services/
│ │ │ ├── base.ts
│ │ │ ├── lastfm.ts
│ │ │ └── listenbrainz.ts
│ │ ├── shortcuts/
│ │ │ ├── index.ts
│ │ │ ├── main.ts
│ │ │ ├── menu.ts
│ │ │ ├── mpris-service.d.ts
│ │ │ └── mpris.ts
│ │ ├── skip-disliked-songs/
│ │ │ └── index.ts
│ │ ├── skip-silences/
│ │ │ ├── index.ts
│ │ │ └── renderer.ts
│ │ ├── sponsorblock/
│ │ │ ├── index.ts
│ │ │ ├── segments.ts
│ │ │ ├── tests/
│ │ │ │ └── segments.test.js
│ │ │ └── types.ts
│ │ ├── synced-lyrics/
│ │ │ ├── backend.ts
│ │ │ ├── index.ts
│ │ │ ├── menu.ts
│ │ │ ├── parsers/
│ │ │ │ ├── lrc.test.ts
│ │ │ │ └── lrc.ts
│ │ │ ├── providers/
│ │ │ │ ├── LRCLib.ts
│ │ │ │ ├── LyricsGenius.ts
│ │ │ │ ├── Megalobiz.ts
│ │ │ │ ├── MusixMatch.ts
│ │ │ │ ├── YTMusic.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── renderer.ts
│ │ │ ├── renderer/
│ │ │ │ ├── components/
│ │ │ │ │ ├── ErrorDisplay.tsx
│ │ │ │ │ ├── LoadingKaomoji.tsx
│ │ │ │ │ ├── LyricsPicker.tsx
│ │ │ │ │ ├── NotFoundKaomoji.tsx
│ │ │ │ │ ├── PlainLyrics.tsx
│ │ │ │ │ ├── SyncedLine.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── renderer.tsx
│ │ │ │ ├── store.ts
│ │ │ │ └── utils.tsx
│ │ │ ├── style.css
│ │ │ └── types.ts
│ │ ├── taskbar-mediacontrol/
│ │ │ └── index.ts
│ │ ├── touchbar/
│ │ │ └── index.ts
│ │ ├── transparent-player/
│ │ │ ├── index.ts
│ │ │ ├── style.css
│ │ │ └── types.ts
│ │ ├── tuna-obs/
│ │ │ └── index.ts
│ │ ├── unobtrusive-player/
│ │ │ ├── index.ts
│ │ │ └── style.css
│ │ ├── utils/
│ │ │ ├── common/
│ │ │ │ ├── index.ts
│ │ │ │ └── types.ts
│ │ │ ├── main/
│ │ │ │ ├── css.ts
│ │ │ │ ├── fetch.ts
│ │ │ │ ├── fs.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── types.ts
│ │ │ └── renderer/
│ │ │ ├── check.ts
│ │ │ ├── html.ts
│ │ │ └── index.ts
│ │ ├── video-toggle/
│ │ │ ├── button-switcher.css
│ │ │ ├── force-hide.css
│ │ │ ├── index.tsx
│ │ │ └── templates/
│ │ │ └── video-switch-button.tsx
│ │ └── visualizer/
│ │ ├── butterchurn.d.ts
│ │ ├── empty-player.css
│ │ ├── index.ts
│ │ ├── visualizers/
│ │ │ ├── butterchurn.ts
│ │ │ ├── index.ts
│ │ │ ├── visualizer.ts
│ │ │ ├── vudio.ts
│ │ │ └── wave.ts
│ │ └── vudio.d.ts
│ ├── preload.ts
│ ├── providers/
│ │ ├── app-controls.ts
│ │ ├── decorators.ts
│ │ ├── dom-elements.ts
│ │ ├── extracted-data.ts
│ │ ├── prompt-options.ts
│ │ ├── protocol-handler.ts
│ │ ├── song-controls.ts
│ │ ├── song-info-front.ts
│ │ └── song-info.ts
│ ├── renderer.ts
│ ├── reset.d.ts
│ ├── solit.tsx
│ ├── tray.ts
│ ├── ts-declarations/
│ │ ├── kuroshiro-analyzer-kuromoji.d.ts
│ │ └── kuroshiro.d.ts
│ ├── types/
│ │ ├── contexts.ts
│ │ ├── datahost-get-state.ts
│ │ ├── get-player-response.ts
│ │ ├── icons.ts
│ │ ├── media-icons.ts
│ │ ├── music-player-app-element.ts
│ │ ├── music-player-desktop-internal.ts
│ │ ├── music-player.ts
│ │ ├── player-api-events.ts
│ │ ├── plugins.ts
│ │ ├── queue.ts
│ │ ├── search-box-element.ts
│ │ ├── video-data-changed.ts
│ │ └── video-details.ts
│ ├── utils/
│ │ ├── custom-element.ts
│ │ ├── index.ts
│ │ ├── testing.ts
│ │ ├── trusted-types.ts
│ │ ├── type-utils.ts
│ │ └── wait-for-element.ts
│ ├── virtual-module.d.ts
│ └── yt-web-components.d.ts
├── tests/
│ └── index.test.js
├── tsconfig.json
├── tsconfig.test.json
└── vite-plugins/
├── i18n-importer.mts
├── plugin-importer.mts
└── plugin-loader.mts
================================================
FILE CONTENTS
================================================
================================================
FILE: .devcontainer/devcontainer.json
================================================
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/typescript-node
{
"name": "Pear Desktop - Dev Container",
// Keep in sync with `.github/workflows/build.yml`
"image": "mcr.microsoft.com/devcontainers/typescript-node:24",
// Features to add to the dev container. More info: https://containers.dev/features.
"features": {},
"postCreateCommand": "pnpm install --frozen-lockfile"
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],
// Configure tool-specific properties.
// "customizations": {},
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
// "remoteUser": "root"
}
================================================
FILE: .editorconfig
================================================
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
================================================
FILE: .gitattributes
================================================
* text=auto eol=lf
*.js text
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Bug Report
description: Report a Pear Desktop bug
title: "[Bug]: "
labels: "bug :beetle:"
body:
- type: checkboxes
attributes:
label: Preflight Checklist
description: Please ensure you've completed all of the following.
options:
- label: I use the latest version of Pear Desktop (Application).
required: true
- label: I have searched the [issue tracker](https://github.com/pear-devs/pear-desktop/issues) for a bug report that matches the one I want to file, without success.
required: true
- label: I understand that **pear-devs/pear-desktop has NO affiliation with Google or YouTube**
required: true
- type: input
attributes:
label: Pear Desktop (Application) Version
description: |
What version of the Pear Desktop Application are you using?
Note: Please check if this issue is reproducible with the latest stable release.
placeholder: 2.0.0
validations:
required: true
- type: checkboxes
attributes:
label: Checklists
options:
- label: I use the portable version of the Pear Desktop Application.
- label: I can reproduce this issue in the [official version of (WEB) YTM](https://music.youtube.com).
- type: dropdown
attributes:
label: What operating system are you using?
options:
- Windows
- macOS
- Ubuntu
- Other Linux
- Other (specify below)
validations:
required: true
- type: input
attributes:
label: Operating System Version
description: What operating system version are you using? On Windows, click the Start button > Settings > System > About. On macOS, click the Apple Menu > About This Mac. On Linux, use lsb_release or uname -a.
placeholder: "e.g. Windows 10 version 1909, macOS Catalina 10.15.7, or Ubuntu 20.04"
validations:
required: true
- type: dropdown
attributes:
label: What CPU architecture are you using?
options:
- x64
- ia32
- arm64 (including Apple Silicon)
- Other (specify below)
validations:
required: true
- type: input
attributes:
label: Last Known Working Pear Desktop (Application) version
description: (If applicable) What is the last version of Pear Desktop this worked in?
placeholder: 1.20.0
- type: textarea
attributes:
label: Reproduction steps
description: Provide steps to reproduce the issue.
placeholder: 1. Enable the X plugin.
validations:
required: true
- type: textarea
attributes:
label: Expected Behavior
description: A clear and concise description of what you expected to happen.
validations:
required: true
- type: textarea
attributes:
label: Actual Behavior
description: A clear description of what actually happens.
validations:
required: true
- type: textarea
attributes:
label: Enabled plugins
description: Provide the list of plugins you enabled.
placeholder: 1. Album Color Theme
validations:
required: true
- type: textarea
attributes:
label: Additional Information
description: If your problem needs further explanation, or if the issue you're seeing cannot be reproduced in a gist, please add more information here.
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: Feature Request
description: Suggest an idea for Pear Desktop
title: "[Feature Request]: "
labels: "enhancement :sparkles:"
body:
- type: checkboxes
attributes:
label: Preflight Checklist
description: Please ensure you've completed all of the following.
options:
- label: I use the latest version of Pear Desktop (Application).
required: true
- label: I have searched the [issue tracker](https://github.com/pear-devs/pear-desktop/issues) for a feature request that matches the one I want to file, without success.
required: true
- type: textarea
attributes:
label: Problem Description
description: A clear and concise description of the problem you are seeking to solve with this feature request.
validations:
required: true
- type: textarea
attributes:
label: Proposed Solution
description: Describe the solution you'd like in a clear and concise manner.
validations:
required: true
- type: textarea
attributes:
label: Alternatives Considered
description: A clear and concise description of any alternative solutions or features you've considered.
validations:
required: true
- type: textarea
attributes:
label: Additional Information
description: Any other context about the problem.
validations:
required: false
================================================
FILE: .github/workflows/build.yml
================================================
name: Build Pear Desktop
on:
push:
branches: [ master ]
pull_request:
env:
NODE_VERSION: "22.x"
jobs:
build:
if: github.event.pull_request.draft == false
name: Build Pear Desktop
runs-on: ${{ matrix.os }}
strategy:
fail-fast: true
matrix:
os: [ macos-26, ubuntu-latest, windows-latest ]
steps:
- uses: actions/checkout@v6
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10
run_install: false
- name: Setup NodeJS
if: startsWith(matrix.os, 'macOS') != true
uses: actions/setup-node@v6
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'pnpm'
- name: Setup NodeJS for macOS
if: startsWith(matrix.os, 'macOS')
uses: actions/setup-node@v6
with:
node-version: ${{ env.NODE_VERSION }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
# Only vite build without release if it is a fork, or it is a pull-request
- name: Vite Build
if: github.repository == 'pear-devs/pear-desktop' && github.event_name == 'pull_request'
run: |
pnpm build
# Build and release if it's the main repository and is not pull-request
- name: Build and release on Mac
if: startsWith(matrix.os, 'macOS') && (github.repository == 'pear-devs/pear-desktop' && github.event_name != 'pull_request')
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
pnpm release:mac
- name: Build and release on Linux
if: startsWith(matrix.os, 'ubuntu') && (github.repository == 'pear-devs/pear-desktop' && github.event_name != 'pull_request')
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
sudo snap install snapcraft --classic
sudo apt update
sudo apt install -y flatpak flatpak-builder
sudo flatpak remote-add --if-not-exists --system flathub https://flathub.org/repo/flathub.flatpakrepo
sudo flatpak install -y flathub org.freedesktop.Platform/x86_64/24.08
sudo flatpak install -y flathub org.freedesktop.Sdk/x86_64/24.08
sudo flatpak install -y flathub org.electronjs.Electron2.BaseApp/x86_64/24.08
pnpm release:linux
- name: Build and release on Windows
if: startsWith(matrix.os, 'windows') && (github.repository == 'pear-devs/pear-desktop' && github.event_name != 'pull_request')
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
pnpm release:win
- name: Test
uses: coactions/setup-xvfb@v1
env:
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
with:
run: pnpm test:debug
release:
runs-on: ubuntu-latest
name: Release Pear Desktop
if: github.repository == 'pear-devs/pear-desktop' && github.ref == 'refs/heads/master'
needs: build
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10
run_install: false
- name: Setup NodeJS
if: startsWith(matrix.os, 'macOS') != true
uses: actions/setup-node@v6
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'pnpm'
- name: Setup NodeJS for macOS
if: startsWith(matrix.os, 'macOS')
uses: actions/setup-node@v6
with:
node-version: ${{ env.NODE_VERSION }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Get version
run: |
echo "VERSION_TAG=v$(node -pe "require('./package.json').version")" >> $GITHUB_ENV
- name: Check if version already exists in tags
run: |
echo "VERSION_HASH=$(git rev-parse -q --verify 'refs/tags/${{ env.VERSION_TAG }}')" >> $GITHUB_ENV
echo "CHANGELOG_ANCHOR=$(echo $VERSION_TAG | sed -e 's/\.//g')" >> $GITHUB_ENV
- name: Fetch draft release
if: ${{ env.VERSION_HASH == '' }}
uses: cardinalby/git-get-release-action@v1
id: get_draft_release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
latest: true
draft: true
searchLimit: 1
- name: Publish Release (if it does not exist)
if: ${{ env.VERSION_HASH == '' }}
uses: irongut/EditRelease@v1.2.0
with:
token: ${{ secrets.GH_TOKEN }}
id: ${{ steps.get_draft_release.outputs.id }}
draft: false
prerelease: false
replacename: true
name: ${{ env.VERSION_TAG }}
replacebody: true
body: |
See [changelog](https://github.com/pear-devs/pear-desktop/blob/master/changelog.md#${{ env.CHANGELOG_ANCHOR }}) for the list of updates and the full diff.
Thanks to all contributors! 🏅
(Note for Windows: `Pear-Desktop-Web-Setup-${{ env.VERSION_TAG }}.exe` is an installer, and `Pear-Desktop-${{ env.VERSION_TAG }}.exe` is a portable version)
- name: Update changelog
if: ${{ env.VERSION_HASH == '' }}
run: |
pnpm changelog
- name: Commit changelog
if: ${{ env.VERSION_HASH == '' }}
uses: stefanzweifel/git-auto-commit-action@v7
with:
commit_message: Update changelog for ${{ env.VERSION_TAG }}
file_pattern: "changelog.md"
commit_user_name: CI
commit_user_email: th-ch@users.noreply.github.com
================================================
FILE: .github/workflows/dependency-review.yml
================================================
# Dependency Review Action
#
# This Action will scan dependency manifest files that change as part of a Pull Reqest, surfacing known-vulnerable versions of the packages declared or updated in the PR. Once installed, if the workflow run is marked as required, PRs introducing known-vulnerable packages will be blocked from merging.
#
# Source repository: https://github.com/actions/dependency-review-action
# Public documentation: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review#dependency-review-enforcement
name: "Dependency Review"
on: [ pull_request ]
permissions:
contents: read
jobs:
dependency-review:
if: github.event.pull_request.draft == false
runs-on: ubuntu-latest
steps:
- name: "Checkout Repository"
uses: actions/checkout@v6
- name: "Dependency Review"
uses: actions/dependency-review-action@v4
================================================
FILE: .github/workflows/pr-build-artifacts.yml
================================================
name: Build PR Artifacts
on:
pull_request:
types: [opened, synchronize, reopened]
env:
NODE_VERSION: "22.x"
jobs:
check-permissions:
if: github.event.pull_request.draft == false
name: Check if user has write access
runs-on: ubuntu-latest
outputs:
has-write-access: ${{ steps.check.outputs.require-result }}
steps:
- name: Check user permission
id: check
uses: actions-cool/check-user-permission@v2
with:
require: write
username: ${{ github.event.pull_request.user.login }}
build:
name: Build ${{ matrix.os }}
needs: check-permissions
if: needs.check-permissions.outputs.has-write-access == 'true'
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [macos-latest, ubuntu-latest, windows-latest]
steps:
- uses: actions/checkout@v6
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10
run_install: false
- name: Setup NodeJS
if: startsWith(matrix.os, 'macOS') != true
uses: actions/setup-node@v6
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'pnpm'
- name: Setup NodeJS for macOS
if: startsWith(matrix.os, 'macOS')
uses: actions/setup-node@v6
with:
node-version: ${{ env.NODE_VERSION }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build on macOS
if: startsWith(matrix.os, 'macOS')
run: |
pnpm dist:mac
pnpm dist:mac:arm64
- name: Install Linux dependencies
if: startsWith(matrix.os, 'ubuntu')
run: |
sudo snap install snapcraft --classic
sudo apt update
sudo apt install -y flatpak flatpak-builder
sudo flatpak remote-add --if-not-exists --system flathub https://flathub.org/repo/flathub.flatpakrepo
sudo flatpak install -y flathub org.freedesktop.Platform/x86_64/24.08
sudo flatpak install -y flathub org.freedesktop.Sdk/x86_64/24.08
sudo flatpak install -y flathub org.electronjs.Electron2.BaseApp/x86_64/24.08
- name: Build on Linux
if: startsWith(matrix.os, 'ubuntu')
run: |
pnpm dist:linux
pnpm dist:linux:deb-arm64
pnpm dist:linux:rpm-arm64
- name: Build on Windows
if: startsWith(matrix.os, 'windows')
run: |
pnpm dist:win
- name: Upload artifacts
uses: actions/upload-artifact@v6
with:
name: build-artifacts-${{ matrix.os }}
path: pack/
retention-days: 7
if-no-files-found: error
comment:
name: Comment on PR
needs: [check-permissions, build]
if: always() && needs.check-permissions.outputs.has-write-access == 'true'
runs-on: ubuntu-latest
permissions:
pull-requests: write
steps:
- name: Create comment
uses: actions/github-script@v8
with:
script: |
const runId = context.runId;
const runUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`;
const buildResult = '${{ needs.build.result }}';
let comment;
if (buildResult === 'success') {
comment = `## 🚀 Build Artifacts Ready!
The builds have completed successfully. You can download the artifacts from the workflow run:
**[📦 Download Artifacts](${runUrl})**
### Available builds:
- **Windows**: \`build-artifacts-windows-latest\`
- **macOS**: \`build-artifacts-macos-latest\`
- **Linux**: \`build-artifacts-ubuntu-latest\`
*Note: Artifacts are available for 7 days.*`;
} else if (buildResult === 'failure') {
comment = `## ❌ Build Failed
Unfortunately, one or more builds failed. Please check the workflow run for details:
**[View Workflow Run](${runUrl})**`;
} else {
comment = `## ⚠️ Build Status: ${buildResult}
The build process completed with status: **${buildResult}**
**[View Workflow Run](${runUrl})**`;
}
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: comment
});
================================================
FILE: .github/workflows/reviewdog.yml
================================================
name: reviewdog
on: [pull_request_target]
env:
NODE_VERSION: "22.x"
jobs:
eslint:
if: github.event.pull_request.draft == false
name: runner / eslint
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
checks: write
steps:
- uses: actions/checkout@v6
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10
run_install: false
- name: Setup NodeJS
uses: actions/setup-node@v6
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- uses: reviewdog/action-eslint@v1.34.0
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
reporter: github-pr-review # Change reporter.
eslint_flags: './src'
fail_level: error
================================================
FILE: .github/workflows/winget-cla.yml
================================================
name: Submit CLA to Winget PR
on:
workflow_dispatch:
inputs:
pr_url:
description: "Specific PR URL"
required: true
type: string
jobs:
comment:
name: Comment to PR
runs-on: ubuntu-latest
steps:
- name: Submit CLA to Windows Package Manager Community Repository Pull Request
run: gh pr comment $PR_URL --body "@microsoft-github-policy-service agree"
env:
GITHUB_TOKEN: ${{ secrets.WINGET_ACC_TOKEN }}
PR_URL: ${{ inputs.pr_url }}
================================================
FILE: .github/workflows/winget-submission.yml
================================================
name: Submit to Windows Package Manager Community Repository
on:
release:
types: [ released ]
workflow_dispatch:
inputs:
tag_name:
description: "Specific tag name"
required: true
type: string
jobs:
winget:
name: Publish winget package
runs-on: ubuntu-latest
steps:
- name: Set winget version env
env:
TAG_NAME: ${{ inputs.tag_name || github.event.release.tag_name }}
run: echo "WINGET_TAG_NAME=$(echo ${TAG_NAME#v})" >> $GITHUB_ENV
- name: Submit package to Windows Package Manager Community Repository
uses: vedantmgoyal2009/winget-releaser@main
with:
identifier: pear-devs.PearDesktop
installers-regex: '^Pear-Desktop-Web-Setup-[\d\.]+\.exe$'
version: ${{ env.WINGET_TAG_NAME }}
release-tag: ${{ inputs.tag_name || github.event.release.tag_name }}
token: ${{ secrets.WINGET_ACC_TOKEN }}
fork-user: pear-desktop-winget
================================================
FILE: .gitignore
================================================
node_modules
/dist
/pack
.vscode/settings.json
.idea
.pnp.*
.pnpm-store
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions
.vite-inspect
.DS_Store
================================================
FILE: .npmrc
================================================
engine-strict=true
scripts-prepend-node-path=true
================================================
FILE: .prettierrc
================================================
{
"tabWidth": 2,
"useTabs": false,
"singleQuote": true,
"trailingComma": "all",
"quoteProps": "consistent"
}
================================================
FILE: .vscode/launch.json
================================================
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node-terminal",
"name": "Run Script: dev (pear-desktop)",
"request": "launch",
"command": "pnpm run dev",
"cwd": "${workspaceFolder}"
}
]
}
================================================
FILE: README.md
================================================
<div align="center" markdown="1">
<sup>Special thanks to:</sup>
<br>
<br>
<a href="https://go.warp.dev/pear-desktop">
<img alt="Warp sponsorship" width="400" src="https://github.com/user-attachments/assets/8307ea56-e872-494a-8a9c-de0e296a06ed" />
</a>
### [Warp, built for coding with multiple AI agents](https://go.warp.dev/pear-desktop)
[Available for macOS, Linux, & Windows](https://go.warp.dev/pear-desktop)<br>
</div>
<hr>
<div align="center">
# :pear: Pear Desktop
[](https://github.com/pear-devs/pear-desktop/releases/)
[](https://github.com/pear-devs/pear-desktop/blob/master/license)
[](https://github.com/pear-devs/pear-desktop/blob/master/eslint.config.mjs)
[](https://GitHub.com/pear-devs/pear-desktop/releases/)
[](https://GitHub.com/pear-devs/pear-desktop/releases/)
<!--[](https://aur.archlinux.org/packages/pear-desktop-bin)-->
[](https://snyk.io/test/github/pear-devs/pear-desktop)
</div>
<!---->
- Native look & feel extension
> [!IMPORTANT]
> ⚠️ Disclaimer
>
> **No Affiliation**
>
> This project, and its contributors, are not affiliated with, authorized by, endorsed by, or in any way officially connected with Google LLC, YouTube, or any of their subsidiaries or affiliates. **This is an independent, non-profit, and unofficial extension developed by a team of volunteers with the goal of providing a desktop experience.**
>
> **Trademarks**
>
> The names "Google" and "YouTube Music", as well as related names, marks, emblems, and images, are registered trademarks of their respective owners. Any use of these trademarks is for identification and reference purposes only and does not imply any association with the trademark holder. We have no intention of infringing upon these trademarks or causing harm to the trademark holders.
>
> **Limitation of Liability**
>
> This application (extension) is provided "AS IS", and you use it at your own risk. In no event shall the developers or contributors be liable for any claim, damages, or other liability, including any legal consequences, arising from, out of, or in connection with the software or the use or other dealings in the software. The responsibility for any and all outcomes of using this software rests entirely with the user.
## Content
- [Features](#features)
- [Translation](#translation)
- [Download](#download)
- [Arch Linux](#arch-linux)
- [Solus](#solus)
- [MacOS](#macos)
- [Windows](#windows)
- [How to install without a network connection? (in Windows)](#how-to-install-without-a-network-connection-in-windows)
- [Themes](#themes)
- [Dev](#dev)
- [Build your own plugins](#build-your-own-plugins)
- [Creating a plugin](#creating-a-plugin)
- [Common use cases](#common-use-cases)
- [Build](#build)
- [Production Preview](#production-preview)
- [Tests](#tests)
- [License](#license)
- [FAQ](#faq)
## Translation
You can help with translation on [Hosted Weblate](https://bit.ly/48n5YF7).
<a href="https://bit.ly/48n5YF7">
<img src="https://bit.ly/4q83L6S" alt="translation status" />
<img src="https://bit.ly/4h3zBxo" alt="translation status 2" />
</a>
## Download
You can check out the [latest release](https://github.com/pear-devs/pear-desktop/releases/latest) to quickly find the
latest version.
### Arch Linux
Install the [`pear-desktop`](https://aur.archlinux.org/packages/pear-desktop) package from the AUR. For AUR installation instructions, take a look at
this [wiki page](https://wiki.archlinux.org/index.php/Arch_User_Repository#Installing_packages).
### [Solus](https://getsol.us/)
```bash
sudo eopkg install pear-desktop
```
### macOS
You can install the app using Homebrew (see the [cask definition](https://github.com/pear-devs/homebrew-pear)):
```bash
brew install pear-devs/pear/pear-desktop
```
If you install the app manually and get an error "is damaged and can’t be opened." when launching the app, run the following in the Terminal:
```bash
/usr/bin/xattr -cr /Applications/Pear\ Desktop.app
```
### Windows
You can use the [Scoop package manager](https://scoop.sh) to install the `pear-desktop` package from
the [`extras` bucket](https://github.com/ScoopInstaller/Extras).
```bash
scoop bucket add extras
scoop install extras/pear-desktop
```
Alternately you can use [Winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/), Windows 11s
official CLI package manager to install the `pear-devs.pear-desktop` package.
*Note: Microsoft Defender SmartScreen might block the installation since it is from an "unknown publisher". This is also
true for the manual installation when trying to run the executable(.exe) after a manual download here on github (same
file).*
```bash
winget install pear-devs.pear-desktop
```
#### How to install without a network connection? (in Windows)
- Download the `*.nsis.7z` file for _your device architecture_ in [release page](https://github.com/pear-devs/pear-desktop/releases/latest).
- `x64` for 64-bit Windows
- `ia32` for 32-bit Windows
- `arm64` for ARM64 Windows
- Download installer in release page. (`*-Setup.exe`)
- Place them in the **same directory**.
- Run the installer.
## Themes
You can load CSS files to change the look of the application (Options > Visual Tweaks > Themes).
Some predefined themes are available in https://github.com/kerichdev/themes-for-ytmdesktop-player.
## Dev
```bash
git clone https://github.com/pear-devs/pear-desktop
cd pear-desktop
pnpm install --frozen-lockfile
pnpm dev
```
Instead of installing pnpm on your system, you can also use [devcontainers](https://containers.dev/). You can use devcontainers either as a development environment in VS Code, or as a way to easily build the project without installing dependencies on your host system.
Note that this has it's own limitations (for example, GUI doesn't work on, at least some, Linux hosts).
## Build your own plugins
Using plugins, you can:
- manipulate the app - the `BrowserWindow` from electron is passed to the plugin handler
- change the front by manipulating the HTML/CSS
### Creating a plugin
Create a folder in `src/plugins/YOUR-PLUGIN-NAME`:
- `index.ts`: the main file of the plugin
```typescript
import style from './style.css?inline'; // import style as inline
import { createPlugin } from '@/utils';
export default createPlugin({
name: 'Plugin Label',
restartNeeded: true, // if value is true, ytmusic show restart dialog
config: {
enabled: false,
}, // your custom config
stylesheets: [style], // your custom style,
menu: async ({ getConfig, setConfig }) => {
// All *Config methods are wrapped Promise<T>
const config = await getConfig();
return [
{
label: 'menu',
submenu: [1, 2, 3].map((value) => ({
label: `value ${value}`,
type: 'radio',
checked: config.value === value,
click() {
setConfig({ value });
},
})),
},
];
},
backend: {
start({ window, ipc }) {
window.maximize();
// you can communicate with renderer plugin
ipc.handle('some-event', () => {
return 'hello';
});
},
// it fired when config changed
onConfigChange(newConfig) { /* ... */ },
// it fired when plugin disabled
stop(context) { /* ... */ },
},
renderer: {
async start(context) {
console.log(await context.ipc.invoke('some-event'));
},
// Only renderer available hook
onPlayerApiReady(api, context) {
// set plugin config easily
context.setConfig({ myConfig: api.getVolume() });
},
onConfigChange(newConfig) { /* ... */ },
stop(_context) { /* ... */ },
},
preload: {
async start({ getConfig }) {
const config = await getConfig();
},
onConfigChange(newConfig) {},
stop(_context) {},
},
});
```
### Common use cases
- injecting custom CSS: create a `style.css` file in the same folder then:
```typescript
// index.ts
import style from './style.css?inline'; // import style as inline
import { createPlugin } from '@/utils';
export default createPlugin({
name: 'Plugin Label',
restartNeeded: true, // if value is true, pear-desktop will show a restart dialog
config: {
enabled: false,
}, // your custom config
stylesheets: [style], // your custom style
renderer() {} // define renderer hook
});
```
- If you want to change the HTML:
```typescript
import { createPlugin } from '@/utils';
export default createPlugin({
name: 'Plugin Label',
restartNeeded: true, // if value is true, ytmusic will show the restart dialog
config: {
enabled: false,
}, // your custom config
renderer() {
console.log('hello from renderer');
} // define renderer hook
});
```
- communicating between the front and back: can be done using the ipcMain module from electron. See `index.ts` file and
example in `sponsorblock` plugin.
## Build
1. Clone the repo
2. Follow [this guide](https://pnpm.io/installation) to install `pnpm`
3. Run `pnpm install --frozen-lockfile` to install dependencies
4. Run `pnpm build:OS`
- `pnpm dist:win` - Windows
- `pnpm dist:linux` - Linux (amd64)
- `pnpm dist:linux:deb-arm64` - Linux (arm64 for Debian)
- `pnpm dist:linux:rpm-arm64` - Linux (arm64 for Fedora)
- `pnpm dist:mac` - macOS (amd64)
- `pnpm dist:mac:arm64` - macOS (arm64)
Builds the app for macOS, Linux, and Windows,
using [electron-builder](https://github.com/electron-userland/electron-builder).
### Building in devcontainer
1. Clone the repo;
2. Open the folder in VS Code;
3. Reopen in container when prompted;
4. Run `pnpm build` as above (choosing the desired target);
5. Collect the built files from the `dist` folder.
Since devcontainer uses a mount for the workspace, the built files will be available on the host system as well.
## Production Preview
```bash
pnpm start
```
## Tests
```bash
pnpm test
```
Uses [Playwright](https://playwright.dev/) to test the app.
## License
MIT © [pear-devs](https://github.com/pear-devs/pear-desktop)
## FAQ
### Why apps menu isn't showing up?
If `Hide Menu` option is on - you can show the menu with the <kbd>alt</kbd> key (or <kbd>\`</kbd> [backtick] if using
the in-app-menu plugin)
================================================
FILE: assets/error.html
================================================
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>Cannot load Pear Desktop</title>
<style>
body {
background: #000;
}
.container {
margin: 0;
font-family: Roboto, Arial, sans-serif;
font-size: 20px;
font-weight: 500;
color: rgba(255, 255, 255, 0.5);
position: absolute;
top: 50%;
left: 50%;
margin-right: -50%;
transform: translate(-50%, -50%);
text-align: center;
}
.button {
background: #065fd4;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: white;
font: inherit;
text-transform: uppercase;
text-decoration: none;
border-radius: 2px;
font-size: 16px;
font-weight: normal;
text-align: center;
padding: 8px 22px;
display: inline-block;
}
</style>
</head>
<body>
<div class="container">
<p>Cannot load Pear Desktop… Internet disconnected?</p>
<a class="button" href="#" onclick="reload()">Retry</a>
</div>
</body>
</html>
================================================
FILE: assets/generated/icons/mac/icon.icon/icon.json
================================================
{
"fill" : {
"linear-gradient" : [
"display-p3:1.00000,1.00000,1.00000,1.00000",
"srgb:0.84314,0.84314,0.84314,1.00000"
],
"orientation" : {
"start" : {
"x" : 0.5,
"y" : 0
},
"stop" : {
"x" : 0.5,
"y" : 0.7
}
}
},
"groups" : [
{
"blur-material" : null,
"hidden" : false,
"layers" : [
{
"blend-mode-specializations" : [
{
"appearance" : "dark",
"value" : "normal"
}
],
"image-name" : "SVG Image.svg",
"name" : "transparent-icon",
"opacity-specializations" : [
{
"value" : 1
},
{
"appearance" : "dark",
"value" : 1
}
]
}
],
"name" : "group",
"opacity-specializations" : [
{
"appearance" : "dark",
"value" : 0.8
}
],
"shadow" : {
"kind" : "layer-color",
"opacity" : 0.5
},
"specular" : true,
"translucency" : {
"enabled" : false,
"value" : 0.5
}
}
],
"supported-platforms" : {
"circles" : [
"watchOS"
],
"squares" : "shared"
}
}
================================================
FILE: assets/mdui.css
================================================
:root {
--mdui-breakpoint-xs: 0px;
--mdui-breakpoint-sm: 600px;
--mdui-breakpoint-md: 840px;
--mdui-breakpoint-lg: 1080px;
--mdui-breakpoint-xl: 1440px;
--mdui-breakpoint-xxl: 1920px;
}
:root {
--mdui-color-primary-light: 103, 80, 164;
--mdui-color-primary-container-light: 234, 221, 255;
--mdui-color-on-primary-light: 255, 255, 255;
--mdui-color-on-primary-container-light: 33, 0, 94;
--mdui-color-inverse-primary-light: 208, 188, 255;
--mdui-color-secondary-light: 98, 91, 113;
--mdui-color-secondary-container-light: 232, 222, 248;
--mdui-color-on-secondary-light: 255, 255, 255;
--mdui-color-on-secondary-container-light: 30, 25, 43;
--mdui-color-tertiary-light: 125, 82, 96;
--mdui-color-tertiary-container-light: 255, 216, 228;
--mdui-color-on-tertiary-light: 255, 255, 255;
--mdui-color-on-tertiary-container-light: 55, 11, 30;
--mdui-color-surface-light: 254, 247, 255;
--mdui-color-surface-dim-light: 222, 216, 225;
--mdui-color-surface-bright-light: 254, 247, 255;
--mdui-color-surface-container-lowest-light: 255, 255, 255;
--mdui-color-surface-container-low-light: 247, 242, 250;
--mdui-color-surface-container-light: 243, 237, 247;
--mdui-color-surface-container-high-light: 236, 230, 240;
--mdui-color-surface-container-highest-light: 230, 224, 233;
--mdui-color-surface-variant-light: 231, 224, 236;
--mdui-color-on-surface-light: 28, 27, 31;
--mdui-color-on-surface-variant-light: 73, 69, 78;
--mdui-color-inverse-surface-light: 49, 48, 51;
--mdui-color-inverse-on-surface-light: 244, 239, 244;
--mdui-color-background-light: 254, 247, 255;
--mdui-color-on-background-light: 28, 27, 31;
--mdui-color-error-light: 179, 38, 30;
--mdui-color-error-container-light: 249, 222, 220;
--mdui-color-on-error-light: 255, 255, 255;
--mdui-color-on-error-container-light: 65, 14, 11;
--mdui-color-outline-light: 121, 116, 126;
--mdui-color-outline-variant-light: 196, 199, 197;
--mdui-color-shadow-light: 0, 0, 0;
--mdui-color-surface-tint-color-light: 103, 80, 164;
--mdui-color-scrim-light: 0, 0, 0;
--mdui-color-primary-dark: 208, 188, 255;
--mdui-color-primary-container-dark: 79, 55, 139;
--mdui-color-on-primary-dark: 55, 30, 115;
--mdui-color-on-primary-container-dark: 234, 221, 255;
--mdui-color-inverse-primary-dark: 103, 80, 164;
--mdui-color-secondary-dark: 204, 194, 220;
--mdui-color-secondary-container-dark: 74, 68, 88;
--mdui-color-on-secondary-dark: 51, 45, 65;
--mdui-color-on-secondary-container-dark: 232, 222, 248;
--mdui-color-tertiary-dark: 239, 184, 200;
--mdui-color-tertiary-container-dark: 99, 59, 72;
--mdui-color-on-tertiary-dark: 73, 37, 50;
--mdui-color-on-tertiary-container-dark: 255, 216, 228;
--mdui-color-surface-dark: 20, 18, 24;
--mdui-color-surface-dim-dark: 20, 18, 24;
--mdui-color-surface-bright-dark: 59, 56, 62;
--mdui-color-surface-container-lowest-dark: 15, 13, 19;
--mdui-color-surface-container-low-dark: 29, 27, 32;
--mdui-color-surface-container-dark: 33, 31, 38;
--mdui-color-surface-container-high-dark: 43, 41, 48;
--mdui-color-surface-container-highest-dark: 54, 52, 59;
--mdui-color-surface-variant-dark: 73, 69, 79;
--mdui-color-on-surface-dark: 230, 225, 229;
--mdui-color-on-surface-variant-dark: 202, 196, 208;
--mdui-color-inverse-surface-dark: 230, 225, 229;
--mdui-color-inverse-on-surface-dark: 49, 48, 51;
--mdui-color-background-dark: 20, 18, 24;
--mdui-color-on-background-dark: 230, 225, 229;
--mdui-color-error-dark: 242, 184, 181;
--mdui-color-error-container-dark: 140, 29, 24;
--mdui-color-on-error-dark: 96, 20, 16;
--mdui-color-on-error-container-dark: 249, 222, 220;
--mdui-color-outline-dark: 147, 143, 153;
--mdui-color-outline-variant-dark: 68, 71, 70;
--mdui-color-shadow-dark: 0, 0, 0;
--mdui-color-surface-tint-color-dark: 208, 188, 255;
--mdui-color-scrim-dark: 0, 0, 0;
}
.mdui-theme-dark,
:root {
color-scheme: dark;
--mdui-color-primary: var(--mdui-color-primary-dark);
--mdui-color-primary-container: var(--mdui-color-primary-container-dark);
--mdui-color-on-primary: var(--mdui-color-on-primary-dark);
--mdui-color-on-primary-container: var(
--mdui-color-on-primary-container-dark
);
--mdui-color-inverse-primary: var(--mdui-color-inverse-primary-dark);
--mdui-color-secondary: var(--mdui-color-secondary-dark);
--mdui-color-secondary-container: var(--mdui-color-secondary-container-dark);
--mdui-color-on-secondary: var(--mdui-color-on-secondary-dark);
--mdui-color-on-secondary-container: var(
--mdui-color-on-secondary-container-dark
);
--mdui-color-tertiary: var(--mdui-color-tertiary-dark);
--mdui-color-tertiary-container: var(--mdui-color-tertiary-container-dark);
--mdui-color-on-tertiary: var(--mdui-color-on-tertiary-dark);
--mdui-color-on-tertiary-container: var(
--mdui-color-on-tertiary-container-dark
);
--mdui-color-surface: var(--mdui-color-surface-dark);
--mdui-color-surface-dim: var(--mdui-color-surface-dim-dark);
--mdui-color-surface-bright: var(--mdui-color-surface-bright-dark);
--mdui-color-surface-container-lowest: var(
--mdui-color-surface-container-lowest-dark
);
--mdui-color-surface-container-low: var(
--mdui-color-surface-container-low-dark
);
--mdui-color-surface-container: var(--mdui-color-surface-container-dark);
--mdui-color-surface-container-high: var(
--mdui-color-surface-container-high-dark
);
--mdui-color-surface-container-highest: var(
--mdui-color-surface-container-highest-dark
);
--mdui-color-surface-variant: var(--mdui-color-surface-variant-dark);
--mdui-color-on-surface: var(--mdui-color-on-surface-dark);
--mdui-color-on-surface-variant: var(--mdui-color-on-surface-variant-dark);
--mdui-color-inverse-surface: var(--mdui-color-inverse-surface-dark);
--mdui-color-inverse-on-surface: var(--mdui-color-inverse-on-surface-dark);
--mdui-color-background: var(--mdui-color-background-dark);
--mdui-color-on-background: var(--mdui-color-on-background-dark);
--mdui-color-error: var(--mdui-color-error-dark);
--mdui-color-error-container: var(--mdui-color-error-container-dark);
--mdui-color-on-error: var(--mdui-color-on-error-dark);
--mdui-color-on-error-container: var(--mdui-color-on-error-container-dark);
--mdui-color-outline: var(--mdui-color-outline-dark);
--mdui-color-outline-variant: var(--mdui-color-outline-variant-dark);
--mdui-color-shadow: var(--mdui-color-shadow-dark);
--mdui-color-surface-tint-color: var(--mdui-color-surface-tint-color-dark);
--mdui-color-scrim: var(--mdui-color-scrim-dark);
color: rgb(var(--mdui-color-on-background));
background-color: rgb(var(--mdui-color-background));
}
:root {
--mdui-elevation-level0: none;
--mdui-elevation-level1: 0 0.5px 1.5px 0 rgba(var(--mdui-color-shadow), 19%),
0 0 1px 0 rgba(var(--mdui-color-shadow), 3.9%);
--mdui-elevation-level2: 0 0.85px 3px 0 rgba(var(--mdui-color-shadow), 19%),
0 0.25px 1px 0 rgba(var(--mdui-color-shadow), 3.9%);
--mdui-elevation-level3: 0 1.25px 5px 0 rgba(var(--mdui-color-shadow), 19%),
0 0.3333px 1.5px 0 rgba(var(--mdui-color-shadow), 3.9%);
--mdui-elevation-level4: 0 1.85px 6.25px 0 rgba(var(--mdui-color-shadow), 19%),
0 0.5px 1.75px 0 rgba(var(--mdui-color-shadow), 3.9%);
--mdui-elevation-level5: 0 2.75px 9px 0 rgba(var(--mdui-color-shadow), 19%),
0 0.25px 3px 0 rgba(var(--mdui-color-shadow), 3.9%);
}
:root {
--mdui-motion-easing-linear: cubic-bezier(0, 0, 1, 1);
--mdui-motion-easing-standard: cubic-bezier(0.2, 0, 0, 1);
--mdui-motion-easing-standard-accelerate: cubic-bezier(0.3, 0, 1, 1);
--mdui-motion-easing-standard-decelerate: cubic-bezier(0, 0, 0, 1);
--mdui-motion-easing-emphasized: var(--mdui-motion-easing-standard);
--mdui-motion-easing-emphasized-accelerate: cubic-bezier(0.3, 0, 0.8, 0.15);
--mdui-motion-easing-emphasized-decelerate: cubic-bezier(0.05, 0.7, 0.1, 1);
--mdui-motion-duration-short1: 50ms;
--mdui-motion-duration-short2: 100ms;
--mdui-motion-duration-short3: 150ms;
--mdui-motion-duration-short4: 200ms;
--mdui-motion-duration-medium1: 250ms;
--mdui-motion-duration-medium2: 300ms;
--mdui-motion-duration-medium3: 350ms;
--mdui-motion-duration-medium4: 400ms;
--mdui-motion-duration-long1: 450ms;
--mdui-motion-duration-long2: 500ms;
--mdui-motion-duration-long3: 550ms;
--mdui-motion-duration-long4: 600ms;
--mdui-motion-duration-extra-long1: 700ms;
--mdui-motion-duration-extra-long2: 800ms;
--mdui-motion-duration-extra-long3: 900ms;
--mdui-motion-duration-extra-long4: 1000ms;
}
.mdui-prose {
line-height: 1.75;
word-wrap: break-word;
}
.mdui-prose :first-child {
margin-top: 0;
}
.mdui-prose :last-child {
margin-bottom: 0;
}
.mdui-prose code,
.mdui-prose kbd,
.mdui-prose pre,
.mdui-prose pre tt,
.mdui-prose samp {
font-family: Consolas, Courier, 'Courier New', monospace;
}
.mdui-prose caption {
text-align: left;
}
.mdui-prose [draggable='true'],
.mdui-prose [draggable] {
cursor: move;
}
.mdui-prose [draggable='false'] {
cursor: inherit;
}
.mdui-prose dl,
.mdui-prose form,
.mdui-prose ol,
.mdui-prose p,
.mdui-prose ul {
margin-top: 1.25em;
margin-bottom: 1.25em;
}
.mdui-prose a {
text-decoration: none;
outline: 0;
color: rgb(var(--mdui-color-primary));
}
.mdui-prose a:focus,
.mdui-prose a:hover {
border-bottom: 0.0625rem solid rgb(var(--mdui-color-primary));
}
.mdui-prose small {
font-size: 0.875em;
}
.mdui-prose strong {
font-weight: 600;
}
.mdui-prose blockquote {
margin: 1.6em 2em;
padding-left: 1em;
border-left: 0.25rem solid rgb(var(--mdui-color-surface-variant));
}
@media only screen and (max-width: 599.98px) {
.mdui-prose blockquote {
margin: 1.6em 0;
}
}
.mdui-prose blockquote footer {
font-size: 86%;
color: rgb(var(--mdui-color-on-surface-variant));
}
.mdui-prose mark {
color: inherit;
background-color: rgb(var(--mdui-color-secondary-container));
border-bottom: 0.0625rem solid rgb(var(--mdui-color-secondary));
margin: 0 0.375rem;
padding: 0.125rem;
}
.mdui-prose h1,
.mdui-prose h2,
.mdui-prose h3,
.mdui-prose h4,
.mdui-prose h5,
.mdui-prose h6 {
font-weight: 400;
}
.mdui-prose h1 small,
.mdui-prose h2 small,
.mdui-prose h3 small,
.mdui-prose h4 small,
.mdui-prose h5 small,
.mdui-prose h6 small {
font-weight: inherit;
font-size: 65%;
color: rgb(var(--mdui-color-on-surface-variant));
}
.mdui-prose h1 strong,
.mdui-prose h2 strong,
.mdui-prose h3 strong,
.mdui-prose h4 strong,
.mdui-prose h5 strong,
.mdui-prose h6 strong {
font-weight: 600;
}
.mdui-prose h1 {
font-size: 2.5em;
margin-top: 0;
margin-bottom: 1.25em;
line-height: 1.1111;
}
.mdui-prose h2 {
font-size: 1.875em;
margin-top: 2.25em;
margin-bottom: 1.125em;
line-height: 1.3333;
}
.mdui-prose h3 {
font-size: 1.5em;
margin-top: 2em;
margin-bottom: 1em;
line-height: 1.6;
}
.mdui-prose h4 {
font-size: 1.25em;
margin-top: 1.875em;
margin-bottom: 0.875em;
line-height: 1.5;
}
.mdui-prose h2 + *,
.mdui-prose h3 + *,
.mdui-prose h4 + *,
.mdui-prose hr + * {
margin-top: 0;
}
.mdui-prose code,
.mdui-prose kbd {
font-size: 0.875em;
color: rgb(var(--mdui-color-on-surface-container));
background-color: rgba(var(--mdui-color-surface-variant), 0.28);
padding: 0.125rem 0.375rem;
border-radius: var(--mdui-shape-corner-extra-small);
}
.mdui-prose kbd {
font-size: 0.9em;
}
.mdui-prose abbr[title] {
text-decoration: none;
cursor: help;
border-bottom: 0.0625rem dotted rgb(var(--mdui-color-on-surface-variant));
}
.mdui-prose ins,
.mdui-prose u {
text-decoration: none;
border-bottom: 0.0625rem solid rgb(var(--mdui-color-on-surface-variant));
}
.mdui-prose del {
text-decoration: line-through;
}
.mdui-prose hr {
margin-top: 3em;
margin-bottom: 3em;
border: none;
border-bottom: 0.0625rem solid rgb(var(--mdui-color-surface-variant));
}
.mdui-prose pre {
margin-top: 1.7143em;
margin-bottom: 1.7143em;
}
.mdui-prose pre code {
padding: 0.8571em 1.1429em;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
background-color: rgb(var(--mdui-color-surface-container));
color: rgb(var(--mdui-color-on-surface-container));
border-radius: var(--mdui-shape-corner-extra-small);
}
.mdui-prose ol,
.mdui-prose ul {
padding-left: 1.625em;
}
.mdui-prose ul {
list-style-type: disc;
}
.mdui-prose ol {
list-style-type: decimal;
}
.mdui-prose ol[type='A'] {
list-style-type: upper-alpha;
}
.mdui-prose ol[type='a'] {
list-style-type: lower-alpha;
}
.mdui-prose ol[type='I'] {
list-style-type: upper-roman;
}
.mdui-prose ol[type='i'] {
list-style-type: lower-roman;
}
.mdui-prose ol[type='1'] {
list-style-type: decimal;
}
.mdui-prose li {
margin-top: 0.5em;
margin-bottom: 0.5em;
}
.mdui-prose ol > li,
.mdui-prose ul > li {
padding-left: 0.375em;
}
.mdui-prose ol > li > p,
.mdui-prose ul > li > p {
margin-top: 0.75em;
margin-bottom: 0.75em;
}
.mdui-prose ol > li > :first-child,
.mdui-prose ul > li > :first-child {
margin-top: 1.25em;
}
.mdui-prose ol > li > :last-child,
.mdui-prose ul > li > :last-child {
margin-bottom: 1.25em;
}
.mdui-prose ol > li::marker {
font-weight: 400;
color: rgb(var(--mdui-color-on-surface-variant));
}
.mdui-prose ul > li::marker {
color: rgb(var(--mdui-color-on-surface-variant));
}
.mdui-prose ol ol,
.mdui-prose ol ul,
.mdui-prose ul ol,
.mdui-prose ul ul {
margin-top: 0.75em;
margin-bottom: 0.75em;
}
.mdui-prose fieldset,
.mdui-prose img {
border: none;
}
.mdui-prose figure,
.mdui-prose img,
.mdui-prose video {
margin-top: 2em;
margin-bottom: 2em;
max-width: 100%;
}
.mdui-prose figure > * {
margin-top: 0;
margin-bottom: 0;
}
.mdui-prose figcaption {
font-size: 0.875em;
line-height: 1.4286;
margin-top: 0.8571em;
color: rgb(var(--mdui-color-on-surface-variant));
}
.mdui-prose figcaption:empty::before {
z-index: -1;
cursor: text;
content: attr(placeholder);
color: rgb(var(--mdui-color-on-surface-variant));
}
.mdui-prose table {
margin-top: 2em;
margin-bottom: 2em;
border: 0.0625rem solid rgb(var(--mdui-color-surface-variant));
border-radius: var(--mdui-shape-corner-large);
}
.mdui-table {
width: 100%;
overflow-x: auto;
margin-top: 2em;
margin-bottom: 2em;
border: 0.0625rem solid rgb(var(--mdui-color-surface-variant));
border-radius: var(--mdui-shape-corner-large);
}
.mdui-table table {
margin-top: 0;
margin-bottom: 0;
border: none;
border-radius: 0;
}
.mdui-prose table,
.mdui-table table {
width: 100%;
text-align: left;
border-collapse: collapse;
border-spacing: 0;
}
.mdui-prose td,
.mdui-prose th,
.mdui-table td,
.mdui-table th {
border-top: 0.0625rem solid rgb(var(--mdui-color-surface-variant));
}
.mdui-prose td:not(:first-child),
.mdui-prose th:not(:first-child),
.mdui-table td:not(:first-child),
.mdui-table th:not(:first-child) {
border-left: 0.0625rem solid rgb(var(--mdui-color-surface-variant));
}
.mdui-prose td:not(:last-child),
.mdui-prose th:not(:last-child),
.mdui-table td:not(:last-child),
.mdui-table th:not(:last-child) {
border-right: 0.0625rem solid rgb(var(--mdui-color-surface-variant));
}
.mdui-prose tfoot td,
.mdui-prose tfoot th,
.mdui-prose thead td,
.mdui-prose thead th,
.mdui-table tfoot td,
.mdui-table tfoot th,
.mdui-table thead td,
.mdui-table thead th {
position: relative;
vertical-align: middle;
padding: 1.125rem 1rem;
font-weight: var(--mdui-typescale-title-medium-weight);
letter-spacing: var(--mdui-typescale-title-medium-tracking);
line-height: var(--mdui-typescale-title-medium-line-height);
color: rgb(var(--mdui-color-on-surface-variant));
box-shadow: var(--mdui-elevation-level1);
}
.mdui-prose tbody td,
.mdui-prose tbody th,
.mdui-table tbody td,
.mdui-table tbody th {
padding: 0.875rem 1rem;
}
.mdui-prose tbody th,
.mdui-table tbody th {
vertical-align: middle;
font-weight: inherit;
}
.mdui-prose tbody td,
.mdui-table tbody td {
vertical-align: baseline;
}
.mdui-prose tbody:first-child tr:first-child td,
.mdui-prose thead:first-child tr:first-child th,
.mdui-table tbody:first-child tr:first-child td,
.mdui-table thead:first-child tr:first-child th {
border-top: 0;
}
:root {
--mdui-shape-corner-none: 0;
--mdui-shape-corner-extra-small: 0.25rem;
--mdui-shape-corner-small: 0.5rem;
--mdui-shape-corner-medium: 0.75rem;
--mdui-shape-corner-large: 1rem;
--mdui-shape-corner-extra-large: 1.75rem;
--mdui-shape-corner-full: 1000rem;
}
:root {
--mdui-state-layer-hover: 0.08;
--mdui-state-layer-focus: 0.12;
--mdui-state-layer-pressed: 0.12;
--mdui-state-layer-dragged: 0.16;
}
:root {
--mdui-typescale-display-large-weight: 400;
--mdui-typescale-display-medium-weight: 400;
--mdui-typescale-display-small-weight: 400;
--mdui-typescale-display-large-line-height: 4rem;
--mdui-typescale-display-medium-line-height: 3.25rem;
--mdui-typescale-display-small-line-height: 2.75rem;
--mdui-typescale-display-large-size: 3.5625rem;
--mdui-typescale-display-medium-size: 2.8125rem;
--mdui-typescale-display-small-size: 2.25rem;
--mdui-typescale-display-large-tracking: 0rem;
--mdui-typescale-display-medium-tracking: 0rem;
--mdui-typescale-display-small-tracking: 0rem;
--mdui-typescale-headline-large-weight: 400;
--mdui-typescale-headline-medium-weight: 400;
--mdui-typescale-headline-small-weight: 400;
--mdui-typescale-headline-large-line-height: 2.5rem;
--mdui-typescale-headline-medium-line-height: 2.25rem;
--mdui-typescale-headline-small-line-height: 2rem;
--mdui-typescale-headline-large-size: 2rem;
--mdui-typescale-headline-medium-size: 1.75rem;
--mdui-typescale-headline-small-size: 1.5rem;
--mdui-typescale-headline-large-tracking: 0rem;
--mdui-typescale-headline-medium-tracking: 0rem;
--mdui-typescale-headline-small-tracking: 0rem;
--mdui-typescale-title-large-weight: 400;
--mdui-typescale-title-medium-weight: 500;
--mdui-typescale-title-small-weight: 500;
--mdui-typescale-title-large-line-height: 1.75rem;
--mdui-typescale-title-medium-line-height: 1.5rem;
--mdui-typescale-title-small-line-height: 1.25rem;
--mdui-typescale-title-large-size: 1.375rem;
--mdui-typescale-title-medium-size: 1rem;
--mdui-typescale-title-small-size: 0.875rem;
--mdui-typescale-title-large-tracking: 0rem;
--mdui-typescale-title-medium-tracking: 0.009375rem;
--mdui-typescale-title-small-tracking: 0.00625rem;
--mdui-typescale-label-large-weight: 500;
--mdui-typescale-label-medium-weight: 500;
--mdui-typescale-label-small-weight: 500;
--mdui-typescale-label-large-line-height: 1.25rem;
--mdui-typescale-label-medium-line-height: 1rem;
--mdui-typescale-label-small-line-height: 0.375rem;
--mdui-typescale-label-large-size: 0.875rem;
--mdui-typescale-label-medium-size: 0.75rem;
--mdui-typescale-label-small-size: 0.6875rem;
--mdui-typescale-label-large-tracking: 0.00625rem;
--mdui-typescale-label-medium-tracking: 0.03125rem;
--mdui-typescale-label-small-tracking: 0.03125rem;
--mdui-typescale-body-large-weight: 400;
--mdui-typescale-body-medium-weight: 400;
--mdui-typescale-body-small-weight: 400;
--mdui-typescale-body-large-line-height: 1.5rem;
--mdui-typescale-body-medium-line-height: 1.25rem;
--mdui-typescale-body-small-line-height: 1rem;
--mdui-typescale-body-large-size: 1rem;
--mdui-typescale-body-medium-size: 0.875rem;
--mdui-typescale-body-small-size: 0.75rem;
--mdui-typescale-body-large-tracking: 0.009375rem;
--mdui-typescale-body-medium-tracking: 0.015625rem;
--mdui-typescale-body-small-tracking: 0.025rem;
}
.mdui-lock-screen {
overflow: hidden !important;
}
================================================
FILE: changelog.md
================================================
### Changelog
All notable changes to this project will be documented in this file. Dates are displayed in UTC.
#### [v3.11.0](https://github.com/pear-devs/pear-desktop/compare/v3.10.0...v3.11.0)
- Fixed missing videochange dataupdated event when using shuffle [`#3659`](https://github.com/pear-devs/pear-desktop/pull/3659)
- feat(synced-lyrics): preferred provider (global/per-song) [`#3741`](https://github.com/pear-devs/pear-desktop/pull/3741)
- feat(api-server): send shuffle state over websocket [`#3837`](https://github.com/pear-devs/pear-desktop/pull/3837)
- feat(synced-lyrics): add new "spacer" [`#3742`](https://github.com/pear-devs/pear-desktop/pull/3742)
- feat(downloader): Add context menu button for playlists and albums [`#3768`](https://github.com/pear-devs/pear-desktop/pull/3768)
- feat(transparent-player): new plugin for Acrylic, Mica or Tabbed effects [`#3529`](https://github.com/pear-devs/pear-desktop/pull/3529)
- fix(audio-compressor): real-time behavior and duplicated audio bug [`#3786`](https://github.com/pear-devs/pear-desktop/pull/3786)
- fix: Added Min height and width to the window which doesnt breaks the UI responsiveness [`#3602`](https://github.com/pear-devs/pear-desktop/pull/3602)
- chore(deps): update dependency discord-api-types to v0.38.23 [`#3833`](https://github.com/pear-devs/pear-desktop/pull/3833)
- feat(plugin): Custom output device plugin [`#3789`](https://github.com/pear-devs/pear-desktop/pull/3789)
- chore(deps): update dependency @babel/runtime to v7.28.4 [`#3831`](https://github.com/pear-devs/pear-desktop/pull/3831)
- chore(deps): update eslint monorepo to v9.35.0 [`#3829`](https://github.com/pear-devs/pear-desktop/pull/3829)
- feat(api-server): Add websocket as `/api/v1/ws` route [`#3707`](https://github.com/pear-devs/pear-desktop/pull/3707)
- feat(api-server): Improved api-server volume and like/dislike state [`#3592`](https://github.com/pear-devs/pear-desktop/pull/3592)
- fix(deps): update dependency i18next to v25.5.2 [`#3826`](https://github.com/pear-devs/pear-desktop/pull/3826)
- fix(deps): update dependency virtua to v0.42.2 [`#3827`](https://github.com/pear-devs/pear-desktop/pull/3827)
- fix(exponential-volume): volume desync bug [`#3787`](https://github.com/pear-devs/pear-desktop/pull/3787)
- feat(synced-lyrics): thai romanization [`#3618`](https://github.com/pear-devs/pear-desktop/pull/3618)
- feat(discord): add option to display artist/title in status [`#3692`](https://github.com/pear-devs/pear-desktop/pull/3692)
- chore(deps): update playwright monorepo to v1.55.0 [`#3819`](https://github.com/pear-devs/pear-desktop/pull/3819)
- fix(deps): update dependency i18next to v25.5.1 [`#3820`](https://github.com/pear-devs/pear-desktop/pull/3820)
- fix(deps): update dependency virtua to v0.42.0 [`#3821`](https://github.com/pear-devs/pear-desktop/pull/3821)
- fix(deps): update dependency zod to v4.1.5 [`#3822`](https://github.com/pear-devs/pear-desktop/pull/3822)
- chore(deps): update eslint monorepo to v9.34.0 [`#3818`](https://github.com/pear-devs/pear-desktop/pull/3818)
- chore(deps): update actions/setup-node action to v5 [`#3823`](https://github.com/pear-devs/pear-desktop/pull/3823)
- chore(deps): update dependency electron to v38 [`#3824`](https://github.com/pear-devs/pear-desktop/pull/3824)
- chore(deps): update dependency @stylistic/eslint-plugin to v5.3.1 [`#3817`](https://github.com/pear-devs/pear-desktop/pull/3817)
- fix(deps): update dependency serve to v14.2.5 [`#3816`](https://github.com/pear-devs/pear-desktop/pull/3816)
- feat(discord): add song & artist URLs to rich presence [`#3737`](https://github.com/pear-devs/pear-desktop/pull/3737)
- fix: fix #3621 [`#3774`](https://github.com/pear-devs/pear-desktop/pull/3774)
- feat(refactor): PluginDefinition::platform [`#3665`](https://github.com/pear-devs/pear-desktop/pull/3665)
- chore(docs): update copyright footer year [`#3792`](https://github.com/pear-devs/pear-desktop/pull/3792)
- chore(deps): update dependency vite-plugin-inspect to v11.3.3 [`#3814`](https://github.com/pear-devs/pear-desktop/pull/3814)
- fix(deps): update dependency @floating-ui/dom to v1.7.4 [`#3815`](https://github.com/pear-devs/pear-desktop/pull/3815)
- fix(deps): update dependency @ghostery/adblocker-electron to v2.11.6 [`#3770`](https://github.com/pear-devs/pear-desktop/pull/3770)
- chore(deps): update dependency discord-api-types to v0.38.22 [`#3813`](https://github.com/pear-devs/pear-desktop/pull/3813)
- chore(deps): update dependency @types/semver to v7.7.1 [`#3812`](https://github.com/pear-devs/pear-desktop/pull/3812)
- fix(deps): update dependency @ghostery/adblocker-electron-preload to v2.11.6 [`#3771`](https://github.com/pear-devs/pear-desktop/pull/3771)
- fix(deps): update dependency @hono/node-server to v1.19.1 [`#3759`](https://github.com/pear-devs/pear-desktop/pull/3759)
- chore(deps): update dependency typescript-eslint to v8.42.0 [`#3761`](https://github.com/pear-devs/pear-desktop/pull/3761)
- chore(deps): update dependency node-gyp to v11.4.2 [`#3772`](https://github.com/pear-devs/pear-desktop/pull/3772)
- chore(deps): update actions/checkout action to v5 [`#3757`](https://github.com/pear-devs/pear-desktop/pull/3757)
- chore(deps): update dependency vite to v7.1.5 [`#3760`](https://github.com/pear-devs/pear-desktop/pull/3760)
- fix(deps): update dependency hono to v4.9.6 [security] [`#3807`](https://github.com/pear-devs/pear-desktop/pull/3807)
- chore(deps): update dependency electron to v37.3.1 [security] [`#3806`](https://github.com/pear-devs/pear-desktop/pull/3806)
- chore(deps): bump hono from 4.9.2 to 4.9.6 [`#3805`](https://github.com/pear-devs/pear-desktop/pull/3805)
- chore(deps): update playwright monorepo to v1.54.2 [`#3713`](https://github.com/pear-devs/pear-desktop/pull/3713)
- chore(deps): update dependency vite to v7.1.2 [`#3710`](https://github.com/pear-devs/pear-desktop/pull/3710)
- chore(deps): update dependency @stylistic/eslint-plugin to v5.2.3 [`#3754`](https://github.com/pear-devs/pear-desktop/pull/3754)
- chore(deps): update dependency @babel/runtime to v7.28.3 [`#3753`](https://github.com/pear-devs/pear-desktop/pull/3753)
- chore(deps): update dependency discord-api-types to v0.38.20 [`#3706`](https://github.com/pear-devs/pear-desktop/pull/3706)
- fix(deps): update dependency @floating-ui/dom to v1.7.3 [`#3714`](https://github.com/pear-devs/pear-desktop/pull/3714)
- chore(deps): update dependency vite-plugin-solid to v2.11.8 [`#3711`](https://github.com/pear-devs/pear-desktop/pull/3711)
- chore(deps): update dependency rollup to v4.46.2 [`#3709`](https://github.com/pear-devs/pear-desktop/pull/3709)
- chore(deps): update dependency @electron/universal to v3.0.1 [`#3705`](https://github.com/pear-devs/pear-desktop/pull/3705)
- chore(deps): update dependency electron to v37.3.0 [`#3708`](https://github.com/pear-devs/pear-desktop/pull/3708)
- chore(docs): Grammar mistakes [`#3722`](https://github.com/pear-devs/pear-desktop/pull/3722)
- Fixes the error 500 for /auth/ endpoint [`#3627`](https://github.com/pear-devs/pear-desktop/pull/3627)
- feat: add custom window title option [`#3656`](https://github.com/pear-devs/pear-desktop/pull/3656)
- fix(deps): update dependency zod to v4.0.10 [`#3686`](https://github.com/pear-devs/pear-desktop/pull/3686)
- chore(deps): update dependency @babel/runtime to v7.28.2 [`#3687`](https://github.com/pear-devs/pear-desktop/pull/3687)
- chore(deps): update dependency rollup to v4.46.1 [`#3632`](https://github.com/pear-devs/pear-desktop/pull/3632)
- chore(deps): update dependency electron to v38.0.0-alpha.10 [`#3681`](https://github.com/pear-devs/pear-desktop/pull/3681)
- chore(deps): update dependency eslint-config-prettier to v10.1.8 [`#3676`](https://github.com/pear-devs/pear-desktop/pull/3676)
- chore(deps): update dependency eslint-plugin-prettier to v5.5.3 [`#3678`](https://github.com/pear-devs/pear-desktop/pull/3678)
- fix(deps): update dependency @ghostery/adblocker-electron to v2.11.3 [`#3679`](https://github.com/pear-devs/pear-desktop/pull/3679)
- chore(deps): update dependency discord-api-types to v0.38.17 [`#3620`](https://github.com/pear-devs/pear-desktop/pull/3620)
- chore(deps): update dependency esbuild to v0.25.8 [`#3675`](https://github.com/pear-devs/pear-desktop/pull/3675)
- chore(deps): update dependency @stylistic/eslint-plugin to v5.2.2 [`#3636`](https://github.com/pear-devs/pear-desktop/pull/3636)
- fix(deps): update dependency @hono/node-server to v1.17.1 [`#3625`](https://github.com/pear-devs/pear-desktop/pull/3625)
- fix(deps): update dependency hono to v4.8.7 [`#3567`](https://github.com/pear-devs/pear-desktop/pull/3567)
- chore(deps): update dependency typescript-eslint to v8.38.0 [`#3628`](https://github.com/pear-devs/pear-desktop/pull/3628)
- chore(deps): update dependency electron to v38.0.0-alpha.9 [`#3626`](https://github.com/pear-devs/pear-desktop/pull/3626)
- fix(Skip Disliked Song): updated querySelector [`#3667`](https://github.com/pear-devs/pear-desktop/pull/3667)
- chore(deps): update dependency vite to v7.0.11 [`#3624`](https://github.com/pear-devs/pear-desktop/pull/3624)
- fix(deps): update dependency @hono/zod-validator to v0.7.1 [`#3616`](https://github.com/pear-devs/pear-desktop/pull/3616)
- fix(discord-rpc, scrobbler): Align artist and title with the last.fm's de facto standard [`#3358`](https://github.com/pear-devs/pear-desktop/issues/3358) [`#3641`](https://github.com/pear-devs/pear-desktop/issues/3641)
- fix: fix #3621 (#3774) [`#3621`](https://github.com/pear-devs/pear-desktop/issues/3621)
- fix: fix #3661 [`#3661`](https://github.com/pear-devs/pear-desktop/issues/3661)
- fix: fix #3613, fix #3651 [`#3613`](https://github.com/pear-devs/pear-desktop/issues/3613) [`#3651`](https://github.com/pear-devs/pear-desktop/issues/3651)
- chore: remove unused deps [`2a81a4e`](https://github.com/pear-devs/pear-desktop/commit/2a81a4e887cb5cc3c91a672302db6da3c15544e8)
- chore(i18n): Translated using Weblate (Swedish) [`0a6f244`](https://github.com/pear-devs/pear-desktop/commit/0a6f244035f17724ab1934f3cb2e011adf838e09)
- fix: bump dependencies [`5ba65ea`](https://github.com/pear-devs/pear-desktop/commit/5ba65ea1221236478efa8cb61bca3ffb1bb2d061)
#### [v3.10.0](https://github.com/pear-devs/pear-desktop/compare/v3.9.0...v3.10.0)
> 13 July 2025
- fix(deps): update dependency butterchurn to v3.0.0-beta.5 [`#3610`](https://github.com/pear-devs/pear-desktop/pull/3610)
- chore(deps): update eslint monorepo to v9.31.0 [`#3600`](https://github.com/pear-devs/pear-desktop/pull/3600)
- chore(deps): update dependency rollup to v4.45.0 [`#3568`](https://github.com/pear-devs/pear-desktop/pull/3568)
- feat: code splitting [`#3593`](https://github.com/pear-devs/pear-desktop/pull/3593)
- fix(deps): update dependency @ghostery/adblocker-electron-preload to v2.11.1 [`#3571`](https://github.com/pear-devs/pear-desktop/pull/3571)
- fix(deps): update dependency @ghostery/adblocker-electron to v2.11.1 [`#3570`](https://github.com/pear-devs/pear-desktop/pull/3570)
- chore(deps): update playwright monorepo to v1.54.1 [`#3599`](https://github.com/pear-devs/pear-desktop/pull/3599)
- chore(deps): update playwright monorepo to v1.54.0 [`#3591`](https://github.com/pear-devs/pear-desktop/pull/3591)
- chore(deps): update dependency electron to v37.2.1 [`#3559`](https://github.com/pear-devs/pear-desktop/pull/3559)
- fix(deps): update dependency socks to v2.8.6 [`#3598`](https://github.com/pear-devs/pear-desktop/pull/3598)
- fix(deps): update dependency zod to v4.0.5 [`#3594`](https://github.com/pear-devs/pear-desktop/pull/3594)
- chore(deps): update dependency vite to v7.0.8 [`#3597`](https://github.com/pear-devs/pear-desktop/pull/3597)
- chore(deps): update dependency vite to v7.0.7 [`#3590`](https://github.com/pear-devs/pear-desktop/pull/3590)
- chore(deps): update dependency @electron/universal to v3 [`#3565`](https://github.com/pear-devs/pear-desktop/pull/3565)
- fix(deps): update dependency electron-unhandled to v5 [`#2088`](https://github.com/pear-devs/pear-desktop/pull/2088)
- feat: enable the ESM for main [`#3588`](https://github.com/pear-devs/pear-desktop/pull/3588)
- fix(deps): update dependency zod to v4 [`#3587`](https://github.com/pear-devs/pear-desktop/pull/3587)
- feat: migrate from raw HTML to JSX (TSX / SolidJS) [`#3583`](https://github.com/pear-devs/pear-desktop/pull/3583)
- docs: add Unobtrusive Player in available plugins [`#3582`](https://github.com/pear-devs/pear-desktop/pull/3582)
- fix(deps): update dependency @hono/node-server to v1.15.0 [`#3557`](https://github.com/pear-devs/pear-desktop/pull/3557)
- chore(deps): update dependency vitefu to v1.1.1 [`#3564`](https://github.com/pear-devs/pear-desktop/pull/3564)
- chore(deps): update dependency discord-api-types to v0.38.15 [`#3562`](https://github.com/pear-devs/pear-desktop/pull/3562)
- fix(deps): update dependency es-hangul to v2.3.5 [`#3563`](https://github.com/pear-devs/pear-desktop/pull/3563)
- fix(deps): update dependency zod to v3.25.71 [`#3558`](https://github.com/pear-devs/pear-desktop/pull/3558)
- fix(deps): update dependency @ghostery/adblocker-electron to v2.9.2 [`#3560`](https://github.com/pear-devs/pear-desktop/pull/3560)
- fix(deps): update dependency @ghostery/adblocker-electron-preload to v2.9.2 [`#3561`](https://github.com/pear-devs/pear-desktop/pull/3561)
- fix(deps): update dependency @ghostery/adblocker-electron to v2.9.0 [`#3555`](https://github.com/pear-devs/pear-desktop/pull/3555)
- fix(deps): update dependency @ghostery/adblocker-electron-preload to v2.9.0 [`#3556`](https://github.com/pear-devs/pear-desktop/pull/3556)
- chore(deps): update eslint monorepo to v9.30.1 [`#3552`](https://github.com/pear-devs/pear-desktop/pull/3552)
- Fixed play/pause discord rich presence by fixing lastsonginfo tracking [`#3551`](https://github.com/pear-devs/pear-desktop/pull/3551)
- feat: enable rolldown native plugin [`#3502`](https://github.com/pear-devs/pear-desktop/pull/3502)
- fix(deps): update dependency virtua to v0.41.5 [`#3549`](https://github.com/pear-devs/pear-desktop/pull/3549)
- chore(deps): update dependency typescript-eslint to v8.35.1 [`#3545`](https://github.com/pear-devs/pear-desktop/pull/3545)
- chore(deps): update dependency discord-api-types to v0.38.14 [`#3546`](https://github.com/pear-devs/pear-desktop/pull/3546)
- chore(deps): update playwright monorepo to v1.53.2 [`#3547`](https://github.com/pear-devs/pear-desktop/pull/3547)
- fix(deps): update dependency i18next to v25.3.0 [`#3548`](https://github.com/pear-devs/pear-desktop/pull/3548)
- perf(synced-lyrics): virtual scrolling [`#3162`](https://github.com/pear-devs/pear-desktop/pull/3162)
- chore(deps): update dependency vite to v7 [`#3524`](https://github.com/pear-devs/pear-desktop/pull/3524)
- feat(synced-lyrics): Musixmatch [`#3261`](https://github.com/pear-devs/pear-desktop/pull/3261)
- feat(api-server): add optional params for search [`#3440`](https://github.com/pear-devs/pear-desktop/pull/3440)
- chore(deps): update dependency vite-plugin-inspect to v11.3.0 [`#3543`](https://github.com/pear-devs/pear-desktop/pull/3543)
- chore(deps): update eslint monorepo to v9.30.0 [`#3544`](https://github.com/pear-devs/pear-desktop/pull/3544)
- chore(deps): update dependency rollup to v4.44.1 [`#3537`](https://github.com/pear-devs/pear-desktop/pull/3537)
- chore(deps): update dependency ws to v8.18.3 [`#3538`](https://github.com/pear-devs/pear-desktop/pull/3538)
- fix(deps): update dependency @hono/zod-openapi to v0.19.9 [`#3540`](https://github.com/pear-devs/pear-desktop/pull/3540)
- fix(deps): update dependency @floating-ui/dom to v1.7.2 [`#3539`](https://github.com/pear-devs/pear-desktop/pull/3539)
- fix(deps): update dependency es-hangul to v2.3.4 [`#3541`](https://github.com/pear-devs/pear-desktop/pull/3541)
- fix(deps): update dependency hono to v4.8.3 [`#3542`](https://github.com/pear-devs/pear-desktop/pull/3542)
- fix(style): fix duplicated scrollbar [`#3483`](https://github.com/pear-devs/pear-desktop/pull/3483)
- chore(deps): update dependency typescript-eslint to v8.35.0 [`#3518`](https://github.com/pear-devs/pear-desktop/pull/3518)
- chore(deps): update dependency vite-plugin-solid to v2.11.7 [`#3520`](https://github.com/pear-devs/pear-desktop/pull/3520)
- chore(deps): update dependency discord-api-types to v0.38.13 [`#3517`](https://github.com/pear-devs/pear-desktop/pull/3517)
- chore(deps): update dependency eslint-import-resolver-typescript to v4.4.4 [`#3534`](https://github.com/pear-devs/pear-desktop/pull/3534)
- fix(deps): update dependency @ghostery/adblocker-electron to v2.8.0 [`#3521`](https://github.com/pear-devs/pear-desktop/pull/3521)
- chore(deps): update dependency eslint-plugin-prettier to v5.5.1 [`#3535`](https://github.com/pear-devs/pear-desktop/pull/3535)
- fix(deps): update dependency @ghostery/adblocker-electron-preload to v2.8.0 [`#3522`](https://github.com/pear-devs/pear-desktop/pull/3522)
- chore(deps): update dependency electron to v37 [`#3527`](https://github.com/pear-devs/pear-desktop/pull/3527)
- feat: Add instructional note to Swagger documentation [`#3532`](https://github.com/pear-devs/pear-desktop/pull/3532)
- chore(deps): update playwright monorepo to v1.53.1 [`#3504`](https://github.com/pear-devs/pear-desktop/pull/3504)
- chore(deps): update dependency rollup to v4.44.0 [`#3508`](https://github.com/pear-devs/pear-desktop/pull/3508)
- chore(deps): update dependency eslint-plugin-import to v2.32.0 [`#3513`](https://github.com/pear-devs/pear-desktop/pull/3513)
- fix(deps): update dependency hono to v4.8.2 [`#3509`](https://github.com/pear-devs/pear-desktop/pull/3509)
- chore(deps): update dependency electron to v36.5.0 [`#3503`](https://github.com/pear-devs/pear-desktop/pull/3503)
- chore(deps): update stefanzweifel/git-auto-commit-action action to v6 [`#3500`](https://github.com/pear-devs/pear-desktop/pull/3500)
- chore(deps): update dependency vite to v6.3.21 [`#3492`](https://github.com/pear-devs/pear-desktop/pull/3492)
- fix(deps): update dependency hono to v4.8.0 [`#3499`](https://github.com/pear-devs/pear-desktop/pull/3499)
- chore(deps): update playwright monorepo to v1.53.0 [`#3497`](https://github.com/pear-devs/pear-desktop/pull/3497)
- chore(deps): update eslint monorepo to v9.29.0 [`#3496`](https://github.com/pear-devs/pear-desktop/pull/3496)
- chore(deps): update dependency vite-plugin-inspect to v11.2.0 [`#3495`](https://github.com/pear-devs/pear-desktop/pull/3495)
- fix(deps): update dependency happy-dom to v18 [`#3501`](https://github.com/pear-devs/pear-desktop/pull/3501)
- fix(deps): update dependency electron-store to v10.1.0 [`#3498`](https://github.com/pear-devs/pear-desktop/pull/3498)
- chore(deps): update dependency eslint-plugin-prettier to v5.5.0 [`#3493`](https://github.com/pear-devs/pear-desktop/pull/3493)
- chore(deps): update dependency rollup to v4.43.0 [`#3494`](https://github.com/pear-devs/pear-desktop/pull/3494)
- fix(deps): update dependency @ghostery/adblocker-electron to v2.7.0 [`#3466`](https://github.com/pear-devs/pear-desktop/pull/3466)
- fix(deps): update dependency @hono/swagger-ui to v0.5.2 [`#3465`](https://github.com/pear-devs/pear-desktop/pull/3465)
- fix(deps): update dependency @ghostery/adblocker-electron-preload to v2.7.0 [`#3467`](https://github.com/pear-devs/pear-desktop/pull/3467)
- fix(deps): update dependency youtubei.js to v14 [`#3468`](https://github.com/pear-devs/pear-desktop/pull/3468)
- chore(deps): update dependency discord-api-types to v0.38.12 [`#3490`](https://github.com/pear-devs/pear-desktop/pull/3490)
- chore(deps): update dependency glob to v11.0.3 [`#3491`](https://github.com/pear-devs/pear-desktop/pull/3491)
- chore(deps): update dependency typescript-eslint to v8.34.1 [`#3469`](https://github.com/pear-devs/pear-desktop/pull/3469)
- fix(deps): update dependency socks to v2.8.5 [`#3470`](https://github.com/pear-devs/pear-desktop/pull/3470)
- fix(deps): update dependency zod to v3.25.67 [`#3471`](https://github.com/pear-devs/pear-desktop/pull/3471)
- chore(deps): update dependency @babel/runtime to v7.27.6 [`#3451`](https://github.com/pear-devs/pear-desktop/pull/3451)
- chore(deps): update dependency eslint-import-resolver-typescript to v4.4.3 [`#3453`](https://github.com/pear-devs/pear-desktop/pull/3453)
- fix(deps): update dependency zod to v3.25.56 [`#3454`](https://github.com/pear-devs/pear-desktop/pull/3454)
- fix(deps): update dependency @hono/node-server to v1.14.4 [`#3456`](https://github.com/pear-devs/pear-desktop/pull/3456)
- chore(deps): update dependency rollup to v4.42.0 [`#3457`](https://github.com/pear-devs/pear-desktop/pull/3457)
- fix(deps): update dependency conf to v14 [`#3458`](https://github.com/pear-devs/pear-desktop/pull/3458)
- fix(deps): update dependency peerjs to v1.5.5 [`#3460`](https://github.com/pear-devs/pear-desktop/pull/3460)
- chore(deps): update dependency @stylistic/eslint-plugin-js to v4.4.1 [`#3444`](https://github.com/pear-devs/pear-desktop/pull/3444)
- chore(deps): update dependency discord-api-types to v0.38.11 [`#3445`](https://github.com/pear-devs/pear-desktop/pull/3445)
- chore(deps): update dependency electron to v36.4.0 [`#3447`](https://github.com/pear-devs/pear-desktop/pull/3447)
- fix(deps): update dependency zod to v3.25.51 [`#3446`](https://github.com/pear-devs/pear-desktop/pull/3446)
- fix(deps): update dependency hono to v4.7.11 [`#3435`](https://github.com/pear-devs/pear-desktop/pull/3435)
- fix(deps): update dependency @floating-ui/dom to v1.7.1 [`#3434`](https://github.com/pear-devs/pear-desktop/pull/3434)
- chore(deps): update dependency eslint-import-resolver-typescript to v4.4.2 [`#3432`](https://github.com/pear-devs/pear-desktop/pull/3432)
- chore(deps): update dependency eslint-plugin-prettier to v5.4.1 [`#3433`](https://github.com/pear-devs/pear-desktop/pull/3433)
- fix(deps): update dependency zod to v3.25.50 [`#3443`](https://github.com/pear-devs/pear-desktop/pull/3443)
- fix(deps): update dependency happy-dom to v17.6.3 [`#3438`](https://github.com/pear-devs/pear-desktop/pull/3438)
- fix(deps): update dependency zod to v3.25.49 [`#3436`](https://github.com/pear-devs/pear-desktop/pull/3436)
- chore(deps): update eslint monorepo to v9.28.0 [`#3437`](https://github.com/pear-devs/pear-desktop/pull/3437)
- fix(deps): update dependency @hono/zod-openapi to v0.19.8 [`#3411`](https://github.com/pear-devs/pear-desktop/pull/3411)
- fix: use gtk 3 switch as workaround [`#3366`](https://github.com/pear-devs/pear-desktop/pull/3366)
- chore(deps): update dependency electron to v36.3.2 [`#3431`](https://github.com/pear-devs/pear-desktop/pull/3431)
- fix(deps): update dependency @xhayper/discord-rpc to v1.2.2 [`#3413`](https://github.com/pear-devs/pear-desktop/pull/3413)
- fix(deps): update dependency happy-dom to v17.5.6 [`#3417`](https://github.com/pear-devs/pear-desktop/pull/3417)
- fix(deps): update dependency @hono/zod-validator to v0.7.0 [`#3414`](https://github.com/pear-devs/pear-desktop/pull/3414)
- chore(deps): update dependency discord-api-types to v0.38.10 [`#3430`](https://github.com/pear-devs/pear-desktop/pull/3430)
- chore(deps): update dependency typescript-eslint to v8.33.1 [`#3416`](https://github.com/pear-devs/pear-desktop/pull/3416)
- chore(docs): Improve README-es.md by adjusting the bad Spanish translation [`#3424`](https://github.com/pear-devs/pear-desktop/pull/3424)
- chore(docs): Improve README.md by removing the extra flag for Spanish translation [`#3422`](https://github.com/pear-devs/pear-desktop/pull/3422)
- chore(deps): update dependency @babel/runtime to v7.27.4 [`#3410`](https://github.com/pear-devs/pear-desktop/pull/3410)
- fix(deps): update dependency ts-morph to v26 [`#3409`](https://github.com/pear-devs/pear-desktop/pull/3409)
- fix(deps): update dependency @ghostery/adblocker-electron-preload to v2.6.1 [`#3407`](https://github.com/pear-devs/pear-desktop/pull/3407)
- fix(deps): update dependency zod to v3.25.30 [`#3408`](https://github.com/pear-devs/pear-desktop/pull/3408)
- fix(precise-volume): replace constructor check for volume slider [`#3362`](https://github.com/pear-devs/pear-desktop/pull/3362)
- chore(deps): update dependency vite-plugin-inspect to v11.1.0 [`#3393`](https://github.com/pear-devs/pear-desktop/pull/3393)
- chore(deps): update dependency eslint-import-resolver-typescript to v4.4.1 [`#3406`](https://github.com/pear-devs/pear-desktop/pull/3406)
- chore(deps): update dependency @stylistic/eslint-plugin-js to v4.4.0 [`#3391`](https://github.com/pear-devs/pear-desktop/pull/3391)
- fix(deps): update dependency i18next to v25.2.1 [`#3405`](https://github.com/pear-devs/pear-desktop/pull/3405)
- chore(deps): update dependency esbuild to v0.25.5 [`#3403`](https://github.com/pear-devs/pear-desktop/pull/3403)
- fix(deps): update dependency @hono/node-server to v1.14.3 [`#3404`](https://github.com/pear-devs/pear-desktop/pull/3404)
- chore(deps): update dependency rollup to v4.41.1 [`#3392`](https://github.com/pear-devs/pear-desktop/pull/3392)
- chore(deps): update eslint monorepo to v9.27.0 [`#3394`](https://github.com/pear-devs/pear-desktop/pull/3394)
- fix(deps): update dependency @ghostery/adblocker-electron to v2.6.1 [`#3395`](https://github.com/pear-devs/pear-desktop/pull/3395)
- fix(deps): update dependency hono to v4.7.10 [`#3390`](https://github.com/pear-devs/pear-desktop/pull/3390)
- chore(deps): update dependency eslint-import-resolver-typescript to v4.3.5 [`#3388`](https://github.com/pear-devs/pear-desktop/pull/3388)
- fix(deps): update dependency @hono/node-server to v1.14.2 [`#3389`](https://github.com/pear-devs/pear-desktop/pull/3389)
- chore(deps): update dependency electron to v36.3.1 [`#3372`](https://github.com/pear-devs/pear-desktop/pull/3372)
- chore(deps): update dependency typescript-eslint to v8.32.1 [`#3364`](https://github.com/pear-devs/pear-desktop/pull/3364)
- fix(deps): update dependency semver to v7.7.2 [`#3365`](https://github.com/pear-devs/pear-desktop/pull/3365)
- fix(album-actions): update playlist and button selectors [`#3367`](https://github.com/pear-devs/pear-desktop/pull/3367)
- fix(deps): update dependency i18next to v25.2.0 [`#3370`](https://github.com/pear-devs/pear-desktop/pull/3370)
- chore(deps): update dependency discord-api-types to v0.38.8 [`#3361`](https://github.com/pear-devs/pear-desktop/pull/3361)
- fix(deps): update dependency solid-js to v1.9.7 [`#3375`](https://github.com/pear-devs/pear-desktop/pull/3375)
- chore(deps): update dependency electron to v36 [`#3307`](https://github.com/pear-devs/pear-desktop/pull/3307)
- fix(deps): update dependency @floating-ui/dom to v1.7.0 [`#3357`](https://github.com/pear-devs/pear-desktop/pull/3357)
- chore(deps): update eslint monorepo to v9.26.0 [`#3356`](https://github.com/pear-devs/pear-desktop/pull/3356)
- chore(deps): update dependency eslint-plugin-prettier to v5.4.0 [`#3355`](https://github.com/pear-devs/pear-desktop/pull/3355)
- fix(deps): update dependency zod to v3.24.4 [`#3354`](https://github.com/pear-devs/pear-desktop/pull/3354)
- fix(deps): update dependency solid-js to v1.9.6 [`#3353`](https://github.com/pear-devs/pear-desktop/pull/3353)
- fix(deps): update dependency @ghostery/adblocker-electron-preload to v2.5.2 [`#3350`](https://github.com/pear-devs/pear-desktop/pull/3350)
- fix(deps): update dependency happy-dom to v17.4.7 [`#3352`](https://github.com/pear-devs/pear-desktop/pull/3352)
- fix(deps): update dependency @ghostery/adblocker-electron to v2.5.2 [`#3349`](https://github.com/pear-devs/pear-desktop/pull/3349)
- chore(deps): update dependency vite to v6.3.5 [`#3346`](https://github.com/pear-devs/pear-desktop/pull/3346)
- chore(deps): update dependency ws to v8.18.2 [`#3347`](https://github.com/pear-devs/pear-desktop/pull/3347)
- feat(plugin): support authenticated proxy [`#3175`](https://github.com/pear-devs/pear-desktop/pull/3175)
- chore(deps): update dependency esbuild to v0.25.4 [`#3344`](https://github.com/pear-devs/pear-desktop/pull/3344)
- chore(deps): update dependency eslint-config-prettier to v10.1.5 [`#3345`](https://github.com/pear-devs/pear-desktop/pull/3345)
- fix(deps): update dependency hono to v4.7.9 [`#3302`](https://github.com/pear-devs/pear-desktop/pull/3302)
- chore(deps): update dependency electron to v34.5.5 [`#3343`](https://github.com/pear-devs/pear-desktop/pull/3343)
- docs: Add Ukrainian translation [`#3338`](https://github.com/pear-devs/pear-desktop/pull/3338)
- chore(deps): update dependency discord-api-types to v0.38.4 [`#3342`](https://github.com/pear-devs/pear-desktop/pull/3342)
- chore(deps): update dependency rollup to v4.40.2 [`#3301`](https://github.com/pear-devs/pear-desktop/pull/3301)
- chore(deps): update dependency @electron/universal to v2.0.3 [`#3341`](https://github.com/pear-devs/pear-desktop/pull/3341)
- fix(deps): update dependency @hono/zod-validator to v0.5.0 [`#3295`](https://github.com/pear-devs/pear-desktop/pull/3295)
- chore(deps): update dependency @babel/runtime to v7.27.1 [`#3340`](https://github.com/pear-devs/pear-desktop/pull/3340)
- fix(deps): update dependency i18next to v25.1.2 [`#3305`](https://github.com/pear-devs/pear-desktop/pull/3305)
- fix(album-actions): use playlist shelf for playlist detection [`#3306`](https://github.com/pear-devs/pear-desktop/pull/3306)
- chore(deps): update dependency typescript-eslint to v8.32.0 [`#3304`](https://github.com/pear-devs/pear-desktop/pull/3304)
- chore(deps): update dependency vite to v6.3.4 [security] [`#3313`](https://github.com/pear-devs/pear-desktop/pull/3313)
- fix(deps): update dependency @hono/zod-openapi to v0.19.6 [`#3294`](https://github.com/pear-devs/pear-desktop/pull/3294)
- fix(deps): update dependency es-hangul to v2.3.3 [`#3293`](https://github.com/pear-devs/pear-desktop/pull/3293)
- fix(api-server): fix #3572 [`#3572`](https://github.com/pear-devs/pear-desktop/issues/3572)
- fix(music-player): fix #3296, and macOS traffic lights [`#3296`](https://github.com/pear-devs/pear-desktop/issues/3296)
- fix: kuromoji zlib and apply rolldown-vite [`f047dd2`](https://github.com/pear-devs/pear-desktop/commit/f047dd2d2df189b55b60188392c451aad65b7a1b)
- fix: apply fix from eslint [`1da83ff`](https://github.com/pear-devs/pear-desktop/commit/1da83ff27c2ccfcdf48c0b0b125033b1a1c194d2)
- feat: refactor [`51b3f53`](https://github.com/pear-devs/pear-desktop/commit/51b3f535695c0f19cd252049985578d11a853ccb)
#### [v3.9.0](https://github.com/pear-devs/pear-desktop/compare/v3.8.1...v3.9.0)
> 27 April 2025
- feat(tuna-obs): added alternativeTitle and tags to tuna [`#3288`](https://github.com/pear-devs/pear-desktop/pull/3288)
- fix: rollback electron version to v34 (for fix #3216) [`#3216`](https://github.com/pear-devs/pear-desktop/issues/3216)
- fix(synced-lyrics): fix #3157 [`#3157`](https://github.com/pear-devs/pear-desktop/issues/3157)
- feat(performance-improvement): added "performance improvement" plugin [`1c76415`](https://github.com/pear-devs/pear-desktop/commit/1c764158461da414cea8bf34c3b514f1f98d7adf)
- chore(i18n): Translated using Weblate (Bosnian) [`a3d620b`](https://github.com/pear-devs/pear-desktop/commit/a3d620ba52b7fa8ae623b9d42b0652a22eaf65e7)
- Update changelog for v3.8.1 [`58cf1a5`](https://github.com/pear-devs/pear-desktop/commit/58cf1a543d98419c1a944e57407c0ea53b8168d8)
#### [v3.8.1](https://github.com/pear-devs/pear-desktop/compare/v3.8.0...v3.8.1)
> 25 April 2025
- chore(deps): update dependency glob to v11.0.2 [`#3283`](https://github.com/pear-devs/pear-desktop/pull/3283)
- fix(deps): update dependency i18next to v25.0.1 [`#3284`](https://github.com/pear-devs/pear-desktop/pull/3284)
- chore(deps): update dependency typescript-eslint to v8.31.0 [`#3286`](https://github.com/pear-devs/pear-desktop/pull/3286)
- chore(deps): update dependency discord-api-types to v0.38.1 [`#3285`](https://github.com/pear-devs/pear-desktop/pull/3285)
- fix(deps): update dependency youtubei.js to v13.4.0 [`#3287`](https://github.com/pear-devs/pear-desktop/pull/3287)
- fix(deps): update dependency zod to v3.24.3 [`#3250`](https://github.com/pear-devs/pear-desktop/pull/3250)
- chore(deps): update dependency vite to v6.3.3 [`#3251`](https://github.com/pear-devs/pear-desktop/pull/3251)
- fix(deps): update dependency @hono/zod-openapi to v0.19.5 [`#3258`](https://github.com/pear-devs/pear-desktop/pull/3258)
- chore(deps): update dependency vite-plugin-inspect to v11.0.1 [`#3259`](https://github.com/pear-devs/pear-desktop/pull/3259)
- chore(deps): update dependency esbuild to v0.25.3 [`#3282`](https://github.com/pear-devs/pear-desktop/pull/3282)
- chore(deps): update eslint monorepo to v9.25.1 [`#3260`](https://github.com/pear-devs/pear-desktop/pull/3260)
- chore(deps): update dependency electron to v35.2.1 [`#3281`](https://github.com/pear-devs/pear-desktop/pull/3281)
- chore(deps): update playwright monorepo to v1.52.0 [`#3256`](https://github.com/pear-devs/pear-desktop/pull/3256)
- chore(deps): update dependency eslint-import-resolver-typescript to v4.3.4 [`#3273`](https://github.com/pear-devs/pear-desktop/pull/3273)
- fix: fix cuted "j" and glow in lyrics [`#3277`](https://github.com/pear-devs/pear-desktop/pull/3277)
- chore(deps): update dependency electron to v35.2.0 [`#3263`](https://github.com/pear-devs/pear-desktop/pull/3263)
- fix(unobtrusive-player): handle shuffle play [`#3247`](https://github.com/pear-devs/pear-desktop/pull/3247)
- fix(deps): update dependency @ghostery/adblocker-electron to v2.5.1 [`#3238`](https://github.com/pear-devs/pear-desktop/pull/3238)
- chore(deps): update dependency vite to v6.3.0 [`#3248`](https://github.com/pear-devs/pear-desktop/pull/3248)
- chore(deps): update dependency typescript-eslint to v8.30.1 [`#3234`](https://github.com/pear-devs/pear-desktop/pull/3234)
- fix(deps): update dependency @ghostery/adblocker-electron-preload to v2.5.1 [`#3239`](https://github.com/pear-devs/pear-desktop/pull/3239)
- fix(deps): update dependency i18next to v25 [`#3243`](https://github.com/pear-devs/pear-desktop/pull/3243)
- fix(deps): update dependency hono to v4.7.7 [`#3245`](https://github.com/pear-devs/pear-desktop/pull/3245)
- chore(deps): update dependency vite to v6.2.6 [`#3189`](https://github.com/pear-devs/pear-desktop/pull/3189)
- feat(Synced-Lyrics): Also search for lyrics with the original title language [`#3206`](https://github.com/pear-devs/pear-desktop/pull/3206)
- chore(deps): update dependency eslint-config-prettier to v10.1.2 [`#3219`](https://github.com/pear-devs/pear-desktop/pull/3219)
- chore(deps): update dependency discord-api-types to v0.37.120 [`#3221`](https://github.com/pear-devs/pear-desktop/pull/3221)
- fix(deps): update dependency @hono/node-server to v1.14.1 [`#3223`](https://github.com/pear-devs/pear-desktop/pull/3223)
- chore(deps): update dependency vite to v6.2.6 [security] [`#3224`](https://github.com/pear-devs/pear-desktop/pull/3224)
- chore(deps): update dependency rollup to v4.40.0 [`#3227`](https://github.com/pear-devs/pear-desktop/pull/3227)
- fix(mpris): keep MPRIS volume in sync with the actual volume [`#3226`](https://github.com/pear-devs/pear-desktop/pull/3226)
- fix(deps): update dependency @hono/zod-openapi to v0.19.4 [`#3215`](https://github.com/pear-devs/pear-desktop/pull/3215)
- chore(deps): update dependency electron to v35.1.5 [`#3218`](https://github.com/pear-devs/pear-desktop/pull/3218)
- fix(deps): update dependency hono to v4.7.6 [`#3217`](https://github.com/pear-devs/pear-desktop/pull/3217)
- docs: add Portuguese README translation and update language shortcuts [`#3192`](https://github.com/pear-devs/pear-desktop/pull/3192)
- fix: custom Video/Audio switcher in Plugins menu [`#3174`](https://github.com/pear-devs/pear-desktop/pull/3174)
- chore(deps): update dependency typescript-eslint to v8.29.1 [`#3214`](https://github.com/pear-devs/pear-desktop/pull/3214)
- chore(deps): update eslint monorepo to v9.24.0 [`#3195`](https://github.com/pear-devs/pear-desktop/pull/3195)
- chore(deps): update dependency typescript to v5.8.3 [`#3196`](https://github.com/pear-devs/pear-desktop/pull/3196)
- chore(deps): update dependency vite to v6.2.5 [security] [`#3194`](https://github.com/pear-devs/pear-desktop/pull/3194)
- fix(deps): update dependency node-id3 to v0.2.9 [`#3191`](https://github.com/pear-devs/pear-desktop/pull/3191)
- chore(deps): update dependency electron to v35.1.4 [`#3184`](https://github.com/pear-devs/pear-desktop/pull/3184)
- chore(deps): update dependency eslint-plugin-prettier to v5.2.6 [`#3182`](https://github.com/pear-devs/pear-desktop/pull/3182)
- chore(deps): update dependency eslint-import-resolver-typescript to v4.3.2 [`#3208`](https://github.com/pear-devs/pear-desktop/pull/3208)
- docs: add Japanese README [`#3180`](https://github.com/pear-devs/pear-desktop/pull/3180)
- chore(deps): update dependency node-gyp to v11.2.0 [`#3177`](https://github.com/pear-devs/pear-desktop/pull/3177)
- chore(deps): update dependency rollup to v4.39.0 [`#3179`](https://github.com/pear-devs/pear-desktop/pull/3179)
- chore(deps): update dependency typescript-eslint to v8.29.0 [`#3169`](https://github.com/pear-devs/pear-desktop/pull/3169)
- fix(downloader): allow downloads for signed out users [`#3145`](https://github.com/pear-devs/pear-desktop/pull/3145)
- fix(README): Fixed typos in some hyperlinks [`#3158`](https://github.com/pear-devs/pear-desktop/pull/3158)
- chore(deps): update dependency vite to v6.2.4 [`#3124`](https://github.com/pear-devs/pear-desktop/pull/3124)
- chore(deps): update dependency eslint-import-resolver-typescript to v4.3.1 [`#3151`](https://github.com/pear-devs/pear-desktop/pull/3151)
- chore(deps): update dependency rollup to v4.38.0 [`#3154`](https://github.com/pear-devs/pear-desktop/pull/3154)
- chore(deps): update dependency esbuild to v0.25.2 [`#3160`](https://github.com/pear-devs/pear-desktop/pull/3160)
- chore(deps): update dependency electron to v35.1.2 [`#3147`](https://github.com/pear-devs/pear-desktop/pull/3147)
- chore(deps): update dependency electron to v35.1.1 [`#3143`](https://github.com/pear-devs/pear-desktop/pull/3143)
- chore(deps): update dependency eslint-import-resolver-typescript to v4.2.5 [`#3144`](https://github.com/pear-devs/pear-desktop/pull/3144)
- chore(deps): update dependency @types/semver to v7.7.0 [`#3141`](https://github.com/pear-devs/pear-desktop/pull/3141)
- fix(deps): update dependency electron-updater to v6.6.2 [`#3142`](https://github.com/pear-devs/pear-desktop/pull/3142)
- chore(i18n): Translated using Weblate (Greek) [`8bb4f44`](https://github.com/pear-devs/pear-desktop/commit/8bb4f4426f6a82b1b5c13a385a6e2b94c25f88a2)
- chore(i18n): Translated using Weblate (Bulgarian) [`89fe072`](https://github.com/pear-devs/pear-desktop/commit/89fe072c0e719026212bb506bb66baf37b31ceb4)
- chore(i18n): Translated using Weblate (Greek) [`5a7daaf`](https://github.com/pear-devs/pear-desktop/commit/5a7daaf2f6d1211c4b9461facf4de1962714bacf)
#### [v3.8.0](https://github.com/pear-devs/pear-desktop/compare/v3.7.5...v3.8.0)
> 26 March 2025
- chore(deps): update dependency typescript-eslint to v8.28.0 [`#3128`](https://github.com/pear-devs/pear-desktop/pull/3128)
- chore(deps): update dependency eslint-plugin-prettier to v5.2.5 [`#3123`](https://github.com/pear-devs/pear-desktop/pull/3123)
- fix(deps): update dependency @hono/node-server to v1.14.0 [`#3131`](https://github.com/pear-devs/pear-desktop/pull/3131)
- chore(deps): update dependency electron to v35.1.0 [`#3136`](https://github.com/pear-devs/pear-desktop/pull/3136)
- fix(deps): update dependency es-hangul to v2.3.2 [`#3138`](https://github.com/pear-devs/pear-desktop/pull/3138)
- chore(deps): update dependency eslint-import-resolver-typescript to v4.2.4 [`#3135`](https://github.com/pear-devs/pear-desktop/pull/3135)
- chore(deps): update eslint monorepo to v9.23.0 [`#3130`](https://github.com/pear-devs/pear-desktop/pull/3130)
- chore(deps): update dependency electron-vite to v3.1.0 [`#3137`](https://github.com/pear-devs/pear-desktop/pull/3137)
- chore(deps): update dependency @babel/runtime to v7.27.0 [`#3127`](https://github.com/pear-devs/pear-desktop/pull/3127)
- feat(synced-lyrics): romanization [`#2790`](https://github.com/pear-devs/pear-desktop/pull/2790)
- feat(plugin): add unobtrusive player plugin [`#3104`](https://github.com/pear-devs/pear-desktop/pull/3104)
- chore(deps): update dependency vite to v6.2.3 [security] [`#3134`](https://github.com/pear-devs/pear-desktop/pull/3134)
- fix(deps): update dependency youtubei.js to v13.3.0 [`#3133`](https://github.com/pear-devs/pear-desktop/pull/3133)
- chore(deps): update dependency electron-builder-squirrel-windows to v26.0.12 [`#3122`](https://github.com/pear-devs/pear-desktop/pull/3122)
- chore(deps): update dependency eslint-import-resolver-typescript to v4.2.2 [`#3106`](https://github.com/pear-devs/pear-desktop/pull/3106)
- chore(deps): update dependency electron-builder to v26.0.12 [`#3121`](https://github.com/pear-devs/pear-desktop/pull/3121)
- fix: Discord Rich Presence Fix [`#3074`](https://github.com/pear-devs/pear-desktop/pull/3074)
- fix(deps): update dependency @xhayper/discord-rpc to v1.2.1 [`#3107`](https://github.com/pear-devs/pear-desktop/pull/3107)
- chore(deps): update dependency typescript-eslint to v8.27.0 [`#3111`](https://github.com/pear-devs/pear-desktop/pull/3111)
- chore(deps): update dependency electron to v35.0.3 [`#3112`](https://github.com/pear-devs/pear-desktop/pull/3112)
- fix(deps): update dependency hono to v4.7.5 [`#3113`](https://github.com/pear-devs/pear-desktop/pull/3113)
- fix(deps): update dependency fast-average-color to v9.5.0 [`#3114`](https://github.com/pear-devs/pear-desktop/pull/3114)
- chore(deps): update dependency rollup to v4.37.0 [`#3103`](https://github.com/pear-devs/pear-desktop/pull/3103)
- chore(deps): update playwright monorepo to v1.51.1 [`#3105`](https://github.com/pear-devs/pear-desktop/pull/3105)
- chore(deps): update dependency eslint-import-resolver-typescript to v4 [`#3102`](https://github.com/pear-devs/pear-desktop/pull/3102)
- chore(deps): update dependency electron to v35.0.2 [`#3099`](https://github.com/pear-devs/pear-desktop/pull/3099)
- fix(deps): update dependency i18next to v24.2.3 [`#3100`](https://github.com/pear-devs/pear-desktop/pull/3100)
- chore(deps): update dependency electron-builder to v26.0.11 [`#3095`](https://github.com/pear-devs/pear-desktop/pull/3095)
- chore(deps): update dependency @babel/runtime to v7.26.10 [security] [`#3094`](https://github.com/pear-devs/pear-desktop/pull/3094)
- chore(deps): update dependency eslint-config-prettier to v10.1.1 [`#3069`](https://github.com/pear-devs/pear-desktop/pull/3069)
- chore(deps): update playwright monorepo to v1.51.0 [`#3065`](https://github.com/pear-devs/pear-desktop/pull/3065)
- chore(deps): update dependency electron-builder-squirrel-windows to v26.0.11 [`#3096`](https://github.com/pear-devs/pear-desktop/pull/3096)
- chore(deps): update dependency esbuild to v0.25.1 [`#3097`](https://github.com/pear-devs/pear-desktop/pull/3097)
- chore(deps): update dependency typescript-eslint to v8.26.1 [`#3098`](https://github.com/pear-devs/pear-desktop/pull/3098)
- chore(deps): update eslint monorepo to v9.22.0 [`#3070`](https://github.com/pear-devs/pear-desktop/pull/3070)
- chore(deps): update dependency rollup to v4.35.0 [`#3071`](https://github.com/pear-devs/pear-desktop/pull/3071)
- chore(deps): update dependency electron to v35.0.1 [`#3075`](https://github.com/pear-devs/pear-desktop/pull/3075)
- fix(deps): update dependency happy-dom to v17.4.4 [`#3068`](https://github.com/pear-devs/pear-desktop/pull/3068)
- chore(deps): update dependency vite to v6.2.2 [`#3067`](https://github.com/pear-devs/pear-desktop/pull/3067)
- fix: Update winget-releaser version to main [`#3091`](https://github.com/pear-devs/pear-desktop/pull/3091)
- feat: Allow scrobbling using alternative song titles [`#3093`](https://github.com/pear-devs/pear-desktop/pull/3093)
- chore(deps): update dependency electron-builder-squirrel-windows to v26.0.10 [`#3054`](https://github.com/pear-devs/pear-desktop/pull/3054)
- chore(deps): update dependency typescript-eslint to v8.26.0 [`#3056`](https://github.com/pear-devs/pear-desktop/pull/3056)
- fix(deps): update dependency hono to v4.7.4 [`#3062`](https://github.com/pear-devs/pear-desktop/pull/3062)
- chore(deps): update dependency electron-builder to v26.0.10 [`#3053`](https://github.com/pear-devs/pear-desktop/pull/3053)
- chore(deps): update dependency electron to v35 [`#3058`](https://github.com/pear-devs/pear-desktop/pull/3058)
- fix(deps): update dependency happy-dom to v17.2.2 [`#3060`](https://github.com/pear-devs/pear-desktop/pull/3060)
- fix(deps): update dependency happy-dom to v17.1.13 [`#3057`](https://github.com/pear-devs/pear-desktop/pull/3057)
- chore(deps): update dependency typescript to v5.8.2 [`#3040`](https://github.com/pear-devs/pear-desktop/pull/3040)
- chore(deps): update dependency rollup to v4.34.9 [`#3043`](https://github.com/pear-devs/pear-desktop/pull/3043)
- fix(deps): update dependency @hono/swagger-ui to v0.5.1 [`#3045`](https://github.com/pear-devs/pear-desktop/pull/3045)
- fix: added French link in general README file [`#3047`](https://github.com/pear-devs/pear-desktop/pull/3047)
- fix(deps): update dependency @hono/zod-openapi to v0.19.2 [`#3046`](https://github.com/pear-devs/pear-desktop/pull/3046)
- chore(deps): update dependency @stylistic/eslint-plugin-js to v4.2.0 [`#3050`](https://github.com/pear-devs/pear-desktop/pull/3050)
- fix(deps): update dependency bgutils-js to v3.2.0 [`#3049`](https://github.com/pear-devs/pear-desktop/pull/3049)
- chore(i18n): Translated using Weblate (Tamil) [`a3601ce`](https://github.com/pear-devs/pear-desktop/commit/a3601cece6a1d291f9887e1a5049fb3c6ad09eb1)
- chore(i18n): Translated using Weblate (Arabic) [`06aaba0`](https://github.com/pear-devs/pear-desktop/commit/06aaba0c7fe9173051701c626d44a347b1bd7574)
- chore(i18n): Translated using Weblate (Spanish) [`dbf8b1c`](https://github.com/pear-devs/pear-desktop/commit/dbf8b1c5c53d88f676c12b7ffca0e23b3efaa541)
#### [v3.7.5](https://github.com/pear-devs/pear-desktop/compare/v3.7.4...v3.7.5)
> 1 March 2025
- chore(deps): update dependency builtin-modules to v5 [`#3038`](https://github.com/pear-devs/pear-desktop/pull/3038)
- chore(deps): update dependency typescript-eslint to v8.25.0 [`#2953`](https://github.com/pear-devs/pear-desktop/pull/2953)
- fix(deps): update dependency happy-dom to v17.1.8 [`#3001`](https://github.com/pear-devs/pear-desktop/pull/3001)
- chore(deps): update dependency eslint-config-prettier to v10.0.2 [`#3035`](https://github.com/pear-devs/pear-desktop/pull/3035)
- chore(deps): update dependency @electron/universal to v2.0.2 [`#3034`](https://github.com/pear-devs/pear-desktop/pull/3034)
- chore(deps): update dependency @stylistic/eslint-plugin-js to v4 [`#2950`](https://github.com/pear-devs/pear-desktop/pull/2950)
- chore(deps): update dependency electron-builder-squirrel-windows to v26.0.9 [`#2930`](https://github.com/pear-devs/pear-desktop/pull/2930)
- fix(no-google-login): Remove Library icon removal code [`#3010`](https://github.com/pear-devs/pear-desktop/pull/3010)
- fix: Updated tray pause icon for consistency [`#3025`](https://github.com/pear-devs/pear-desktop/pull/3025)
- chore(deps): update dependency eslint-import-resolver-typescript to v3.8.3 [`#2992`](https://github.com/pear-devs/pear-desktop/pull/2992)
- fix(deps): update dependency hono to v4.7.2 [`#2999`](https://github.com/pear-devs/pear-desktop/pull/2999)
- fix: Filter for only `MusicResponsiveListItem` in playlist items [`#3022`](https://github.com/pear-devs/pear-desktop/pull/3022)
- fix(deps): update dependency youtubei.js to v13.1.0 [`#3015`](https://github.com/pear-devs/pear-desktop/pull/3015)
- fix: Match engines.pnpm with the pnpm version used to create the lock files [`#2995`](https://github.com/pear-devs/pear-desktop/pull/2995)
- chore(deps): update dependency electron-builder to v26.0.9 [`457e1bb`](https://github.com/pear-devs/pear-desktop/commit/457e1bb48e2bcc742680d22b7d34ffdbe7f33eae)
- chore(deps): update deps [`c8bb1f3`](https://github.com/pear-devs/pear-desktop/commit/c8bb1f386d7053d755c38ca2cac8708af7af1fb9)
- chore(i18n): Translated using Weblate (Thai) [`c9b7901`](https://github.com/pear-devs/pear-desktop/commit/c9b790168130d0cfc9b2ff23cdcb56ab082a4b66)
#### [v3.7.4](https://github.com/pear-devs/pear-desktop/compare/v3.7.3...v3.7.4)
> 18 February 2025
- chore(deps): update dependency rollup to v4.34.8 [`#2982`](https://github.com/pear-devs/pear-desktop/pull/2982)
- fix(plugin-loader): update context filtering logic for backend mode [`#2990`](https://github.com/pear-devs/pear-desktop/pull/2990)
- Update changelog for v3.7.3 [`86c77d1`](https://github.com/pear-devs/pear-desktop/commit/86c77d141f2bec62a4a578fff96d51ed388c05a5)
- HOTFIX: Bump version to 3.7.4 [`0d462ac`](https://github.com/pear-devs/pear-desktop/commit/0d462ac3a26caee23854014cbf5e4b91e2d385e2)
#### [v3.7.3](https://github.com/pear-devs/pear-desktop/compare/v3.7.2...v3.7.3)
> 17 February 2025
- fix(downloader): use the upgrade button to check for premium status [`#2987`](https://github.com/pear-devs/pear-desktop/pull/2987)
- chore(deps): update dependency electron-vite to v3 [`#2986`](https://github.com/pear-devs/pear-desktop/pull/2986)
- chore(deps): update dependency @babel/runtime to v7.26.9 [`#2980`](https://github.com/pear-devs/pear-desktop/pull/2980)
- fix(vite): set server.cors.origin [`#2981`](https://github.com/pear-devs/pear-desktop/pull/2981)
- chore(deps-dev): bump esbuild from 0.24.2 to 0.25.0 [`#2973`](https://github.com/pear-devs/pear-desktop/pull/2973)
- fix(deps): update dependency solid-transition-group to v0.3.0 [`#2949`](https://github.com/pear-devs/pear-desktop/pull/2949)
- fix: remove disable-gpu-memory-buffer-video-frames flag [`#2963`](https://github.com/pear-devs/pear-desktop/pull/2963)
- fix(deps): update dependency semver to v7.7.0 [`#2948`](https://github.com/pear-devs/pear-desktop/pull/2948)
- chore(deps): update playwright monorepo to v1.50.1 [`#2943`](https://github.com/pear-devs/pear-desktop/pull/2943)
- fix(deps): update dependency @hono/node-server to v1.13.8 [`#2944`](https://github.com/pear-devs/pear-desktop/pull/2944)
- fix(deps): update dependency electron-store to v10.0.1 [`#2945`](https://github.com/pear-devs/pear-desktop/pull/2945)
- chore(deps): update dependency rollup to v4.34.1 [`#2946`](https://github.com/pear-devs/pear-desktop/pull/2946)
- chore(deps): update dependency typescript-eslint to v8.22.0 [`#2947`](https://github.com/pear-devs/pear-desktop/pull/2947)
- fix(synced-lyrics): Fix reverse direction of synced lyrics for persian or other rtl languages [`#2940`](https://github.com/pear-devs/pear-desktop/pull/2940)
- chore(deps): update dependency electron to v34.0.2 [`#2942`](https://github.com/pear-devs/pear-desktop/pull/2942)
- chore(deps): update dependency discord-api-types to v0.37.119 [`#2941`](https://github.com/pear-devs/pear-desktop/pull/2941)
- fix(deps): update dependency hono to v4.6.20 [`#2932`](https://github.com/pear-devs/pear-desktop/pull/2932)
- chore(deps): update eslint monorepo to v9.19.0 [`#2935`](https://github.com/pear-devs/pear-desktop/pull/2935)
- fix(deps): update dependency bgutils-js to v3.1.3 [`#2934`](https://github.com/pear-devs/pear-desktop/pull/2934)
- fix(deps): update dependency i18next to v24.2.2 [`#2933`](https://github.com/pear-devs/pear-desktop/pull/2933)
- fix(deps): update dependency happy-dom to v16.8.1 [`#2936`](https://github.com/pear-devs/pear-desktop/pull/2936)
- chore(deps): update dependency @babel/runtime to v7.26.7 [`#2924`](https://github.com/pear-devs/pear-desktop/pull/2924)
- chore(config): migrate renovate config [`#2925`](https://github.com/pear-devs/pear-desktop/pull/2925)
- fix(deps): update dependency @ghostery/adblocker-electron-preload to v2.5.0 [`#2923`](https://github.com/pear-devs/pear-desktop/pull/2923)
- fix(deps): update dependency @ghostery/adblocker-electron to v2.5.0 [`#2922`](https://github.com/pear-devs/pear-desktop/pull/2922)
- chore(deps): update playwright monorepo to v1.50.0 [`#2921`](https://github.com/pear-devs/pear-desktop/pull/2921)
- chore(deps): update dependency vite-plugin-inspect to v10.1.0 [`#2920`](https://github.com/pear-devs/pear-desktop/pull/2920)
- chore(deps): update dependency rollup to v4.32.0 [`#2919`](https://github.com/pear-devs/pear-desktop/pull/2919)
- fix(deps): update dependency hono to v4.6.18 [`#2918`](https://github.com/pear-devs/pear-desktop/pull/2918)
- fix(deps): update dependency deepmerge-ts to v7.1.4 [`#2917`](https://github.com/pear-devs/pear-desktop/pull/2917)
- chore(deps): update dependency vite to v6.0.11 [`#2894`](https://github.com/pear-devs/pear-desktop/pull/2894)
- chore(deps): update dependency electron to v34.0.1 [`#2916`](https://github.com/pear-devs/pear-desktop/pull/2916)
- chore(deps): update dependency electron-builder-squirrel-windows to v26.0.0-alpha.10 [`#2899`](https://github.com/pear-devs/pear-desktop/pull/2899)
- chore(deps): update dependency electron-builder to v26.0.0-alpha.10 [`#2898`](https://github.com/pear-devs/pear-desktop/pull/2898)
- chore(deps): update dependency typescript-eslint to v8.21.0 [`#2901`](https://github.com/pear-devs/pear-desktop/pull/2901)
- chore(deps): update dependency discord-api-types to v0.37.117 [`#2895`](https://github.com/pear-devs/pear-desktop/pull/2895)
- fix(deps): update dependency youtubei.js to v13 [`#2904`](https://github.com/pear-devs/pear-desktop/pull/2904)
- chore(deps): update dependency vite to v6.0.9 [security] [`#2907`](https://github.com/pear-devs/pear-desktop/pull/2907)
- fix(deps): update dependency happy-dom to v16.7.2 [`#2902`](https://github.com/pear-devs/pear-desktop/pull/2902)
- fix(discord-plugin): handle album name padding if length < 2 [`#2903`](https://github.com/pear-devs/pear-desktop/pull/2903)
- feat(navigation): added nav icon padding [`#2905`](https://github.com/pear-devs/pear-desktop/pull/2905)
- chore(deps): update dependency rollup to v4.31.0 [`#2891`](https://github.com/pear-devs/pear-desktop/pull/2891)
- chore(deps): update dependency eslint-plugin-prettier to v5.2.3 [`#2889`](https://github.com/pear-devs/pear-desktop/pull/2889)
- chore(deps): update dependency vite-plugin-inspect to v10.0.7 [`#2882`](https://github.com/pear-devs/pear-desktop/pull/2882)
- fix(deps): update dependency hono to v4.6.17 [`#2883`](https://github.com/pear-devs/pear-desktop/pull/2883)
- fix: bump deps [`e9184e5`](https://github.com/pear-devs/pear-desktop/commit/e9184e5d60c2495473a7c3226ce9748ba89fceb3)
- fix(deps): fix pnpm [`040db75`](https://github.com/pear-devs/pear-desktop/commit/040db7539ccd1ae40f2632fdf38168cdaa26f112)
- chore(i18n): Translated using Weblate (Persian) [`9d18587`](https://github.com/pear-devs/pear-desktop/commit/9d185872dba5b56dabc691e56eafb13dc192b9cd)
#### [v3.7.2](https://github.com/pear-devs/pear-desktop/compare/v3.7.1...v3.7.2)
> 18 January 2025
- feat(api-server): add endpoint to get shuffle state [`#2792`](https://github.com/pear-devs/pear-desktop/pull/2792)
- chore(deps): update dependency discord-api-types to v0.37.116 [`#2877`](https://github.com/pear-devs/pear-desktop/pull/2877)
- chore(deps): update dependency eslint-plugin-prettier to v5.2.2 [`#2875`](https://github.com/pear-devs/pear-desktop/pull/2875)
- chore(deps): update eslint monorepo to v9.18.0 [`#2858`](https://github.com/pear-devs/pear-desktop/pull/2858)
- chore(deps): update dependency glob to v11.0.1 [`#2857`](https://github.com/pear-devs/pear-desktop/pull/2857)
- chore(deps): update dependency electron-builder-squirrel-windows to v26.0.0-alpha.9 [`#2874`](https://github.com/pear-devs/pear-desktop/pull/2874)
- chore(deps): update dependency electron to v34 [`#2867`](https://github.com/pear-devs/pear-desktop/pull/2867)
- chore(deps): update dependency eslint-config-prettier to v10 [`#2866`](https://github.com/pear-devs/pear-desktop/pull/2866)
- chore(deps): update dependency @stylistic/eslint-plugin-js to v2.13.0 [`#2864`](https://github.com/pear-devs/pear-desktop/pull/2864)
- chore(deps): update dependency typescript-eslint to v8.20.0 [`#2865`](https://github.com/pear-devs/pear-desktop/pull/2865)
- chore(deps): update dependency electron-builder to v26.0.0-alpha.9 [`#2869`](https://github.com/pear-devs/pear-desktop/pull/2869)
- fix: fix build.linux.desktop.entry [`#2859`](https://github.com/pear-devs/pear-desktop/pull/2859)
- feat(api-server): add endpoint to get volume state [`#2813`](https://github.com/pear-devs/pear-desktop/pull/2813)
- chore(deps): update dependency vite-plugin-inspect to v10 [`#2856`](https://github.com/pear-devs/pear-desktop/pull/2856)
- chore(deps): update dependency typescript to v5.7.3 [`#2855`](https://github.com/pear-devs/pear-desktop/pull/2855)
- fix(deps): update dependency @floating-ui/dom to v1.6.13 [`#2846`](https://github.com/pear-devs/pear-desktop/pull/2846)
- chore(deps): bump nanoid from 3.3.7 to 3.3.8 [`#2854`](https://github.com/pear-devs/pear-desktop/pull/2854)
- chore(deps): update dependency electron to v33.3.1 [`#2841`](https://github.com/pear-devs/pear-desktop/pull/2841)
- fix(deps): update dependency i18next to v24.2.1 [`#2840`](https://github.com/pear-devs/pear-desktop/pull/2840)
- chore(deps): update dependency typescript-eslint to v8.19.1 [`#2836`](https://github.com/pear-devs/pear-desktop/pull/2836)
- chore(deps): update dependency rollup to v4.30.1 [`#2833`](https://github.com/pear-devs/pear-desktop/pull/2833)
- fix(deps): update dependency solid-js to v1.9.4 [`#2849`](https://github.com/pear-devs/pear-desktop/pull/2849)
- fix(deps): update dependency fast-equals to v5.2.2 [`#2842`](https://github.com/pear-devs/pear-desktop/pull/2842)
- chore: Update README.md [`#2845`](https://github.com/pear-devs/pear-desktop/pull/2845)
- chore: Fixing the Content section in the README-ru.md file. [`#2847`](https://github.com/pear-devs/pear-desktop/pull/2847)
- chore: Create music-player-hu.svg [`#2844`](https://github.com/pear-devs/pear-desktop/pull/2844)
- chore: Create Transalated README-hu.md [`#2843`](https://github.com/pear-devs/pear-desktop/pull/2843)
- chore(deps): update dependency vite to v6.0.7 [`#2819`](https://github.com/pear-devs/pear-desktop/pull/2819)
- chore(deps): update dependency discord-api-types to v0.37.115 [`#2818`](https://github.com/pear-devs/pear-desktop/pull/2818)
- fix(deps): update dependency hono to v4.6.16 [`#2829`](https://github.com/pear-devs/pear-desktop/pull/2829)
- chore(deps): update dependency rollup to v4.29.2 [`#2832`](https://github.com/pear-devs/pear-desktop/pull/2832)
- fix(deps): update dependency fast-equals to v5.2.0 [`#2822`](https://github.com/pear-devs/pear-desktop/pull/2822)
- feat(api-server): add `insertPosition` for `addSongToQueue` [`#2808`](https://github.com/pear-devs/pear-desktop/pull/2808)
- chore(deps): update dependency typescript-eslint to v8.19.0 [`#2812`](https://github.com/pear-devs/pear-desktop/pull/2812)
- fix(deps): update dependency ts-morph to v25 [`#2810`](https://github.com/pear-devs/pear-desktop/pull/2810)
- fix(renderer): update event handler from onVolumeTap to onVolumeClick [`#2791`](https://github.com/pear-devs/pear-desktop/pull/2791)
- fix(deps): update dependency hono to v4.6.15 [`#2796`](https://github.com/pear-devs/pear-desktop/pull/2796)
- chore(deps): update dependency bufferutil to v4.0.9 [`#2787`](https://github.com/pear-devs/pear-desktop/pull/2787)
- feat: Refactor Menu Navigation and Update Media Control Icons [`#2783`](https://github.com/pear-devs/pear-desktop/pull/2783)
- fix(synced-lyrics): Revert font-size behavior for non-fancy modes [`#2788`](https://github.com/pear-devs/pear-desktop/pull/2788)
- fix(downloader): apply poToken [`#2863`](https://github.com/pear-devs/pear-desktop/issues/2863) [`#2780`](https://github.com/pear-devs/pear-desktop/issues/2780)
- chore(deps): update dependency electron-builder to v26 [`67fc0a4`](https://github.com/pear-devs/pear-desktop/commit/67fc0a415cae231a11f2846aadf01edb04f5c677)
- fix: fix lock file [`3339f99`](https://github.com/pear-devs/pear-desktop/commit/3339f997e3c2d4d2c32b3aee95c65d561f123fcb)
- chore(i18n): Translated using Weblate (Romanian) [`845dac3`](https://github.com/pear-devs/pear-desktop/commit/845dac3c0393dadea8efdd03ba1f41b1b36e6191)
#### [v3.7.1](https://github.com/pear-devs/pear-desktop/compare/v3.7.0...v3.7.1)
> 27 December 2024
- fix(deps): update dependency node-html-parser to v7 [`#2776`](https://github.com/pear-devs/pear-desktop/pull/2776)
- chore(deps): update dependency vite to v6.0.6 [`#2774`](https://github.com/pear-devs/pear-desktop/pull/2774)
- feat(api-server): Add queue api [`#2767`](https://github.com/pear-devs/pear-desktop/pull/2767)
- fix(downloader): fix #2234 [`#2234`](https://github.com/pear-devs/pear-desktop/issues/2234)
- fix(downloader): fix #2769 [`#2769`](https://github.com/pear-devs/pear-desktop/issues/2769)
- fix: fix #2645, fix #2741 [`#2645`](https://github.com/pear-devs/pear-desktop/issues/2645) [`#2741`](https://github.com/pear-devs/pear-desktop/issues/2741)
- Update changelog for v3.7.0 [`1cc1530`](https://github.com/pear-devs/pear-desktop/commit/1cc153084d5f354ea928fcde50207f8f6b14ea4c)
- fix: use networkManager.fetch instead of fetch [`80471b0`](https://github.com/pear-devs/pear-desktop/commit/80471b0ca4b3d3efc9e3db87d434290c9ebc79f6)
- chore(i18n): Translated using Weblate (Hindi) [`6d1237c`](https://github.com/pear-devs/pear-desktop/commit/6d1237c2a2ad2408a738e00992ae5ed8a1e900da)
#### [v3.7.0](https://github.com/pear-devs/pear-desktop/compare/v3.6.2...v3.7.0)
> 25 December 2024
- feat(amuse): song query api (add amuse plugin) [`#2723`](https://github.com/pear-devs/pear-desktop/pull/2723)
- feat(api-server): add absolute seek endpoint [`#2748`](https://github.com/pear-devs/pear-desktop/pull/2748)
- feat(api-server): Add repeat mode and seek time API [`#2630`](https://github.com/pear-devs/pear-desktop/pull/2630)
- feat(synced-lyrics): Better-Lyrics Styling for Synced-Lyrics [`#2554`](https://github.com/pear-devs/pear-desktop/pull/2554)
- feat(synced-lyrics): multiple lyric sources [`#2383`](https://github.com/pear-devs/pear-desktop/pull/2383)
- chore(deps): update dependency typescript-eslint to v8.18.2 [`#2763`](https://github.com/pear-devs/pear-desktop/pull/2763)
- chore(deps): update dependency discord-api-types to v0.37.114 [`#2761`](https://github.com/pear-devs/pear-desktop/pull/2761)
- chore(deps): update dependency discord-api-types to v0.37.113 [`#2759`](https://github.com/pear-devs/pear-desktop/pull/2759)
- fix: Set correct window class for X11 and Wayland [`#2758`](https://github.com/pear-devs/pear-desktop/pull/2758)
- feat: Specify flatpak runtime [`#2755`](https://github.com/pear-devs/pear-desktop/pull/2755)
- chore(deps): update dependency rollup to v4.29.1 [`#2749`](https://github.com/pear-devs/pear-desktop/pull/2749)
- chore(deps): update dependency esbuild to v0.24.2 [`#2742`](https://github.com/pear-devs/pear-desktop/pull/2742)
- fix: Add Flatpak permissions needed for MPRIS and tray icon [`#2754`](https://github.com/pear-devs/pear-desktop/pull/2754)
- chore(deps): update dependency vite-plugin-inspect to v0.10.6 [`#2756`](https://github.com/pear-devs/pear-desktop/pull/2756)
- chore(deps): update dependency vite to v6.0.5 [`#2745`](https://github.com/pear-devs/pear-desktop/pull/2745)
- fix(deps): update dependency i18next to v24.2.0 [`#2744`](https://github.com/pear-devs/pear-desktop/pull/2744)
- chore(deps): update dependency vite-plugin-inspect to v0.10.4 [`#2743`](https://github.com/pear-devs/pear-desktop/pull/2743)
- chore(deps): update dependency discord-api-types to v0.37.112 [`#2740`](https://github.com/pear-devs/pear-desktop/pull/2740)
- fix(discord): Fix Album Art failing on Discord RPC [`#2666`](https://github.com/pear-devs/pear-desktop/pull/2666)
- feat: Add equalizer plugin with presets (e.g. bass booster) [`#2575`](https://github.com/pear-devs/pear-desktop/pull/2575)
- chore(deps): update dependency vite to v6.0.4 [`#2738`](https://github.com/pear-devs/pear-desktop/pull/2738)
- fix: Fixed #1796 [`#2736`](https://github.com/pear-devs/pear-desktop/pull/2736)
- chore(deps): update dependency electron-devtools-installer to v4 [`#2734`](https://github.com/pear-devs/pear-desktop/pull/2734)
- Revert "chore(deps): update dependency electron-builder to v25" [`#2732`](https://github.com/pear-devs/pear-desktop/pull/2732)
- chore(deps): update dependency electron-builder to v25 [`#2490`](https://github.com/pear-devs/pear-desktop/pull/2490)
- fix(deps): update dependency i18next to v24.1.2 [`#2727`](https://github.com/pear-devs/pear-desktop/pull/2727)
- chore(deps): update dependency electron-devtools-installer to v3.2.1 [`#2731`](https://github.com/pear-devs/pear-desktop/pull/2731)
- chore(deps): update dependency typescript-eslint to v8.18.1 [`#2724`](https://github.com/pear-devs/pear-desktop/pull/2724)
- fix: tab misalignment [`#2713`](https://github.com/pear-devs/pear-desktop/pull/2713)
- fix(deps): update dependency @hono/zod-validator to v0.4.2 [`#2709`](https://github.com/pear-devs/pear-desktop/pull/2709)
- chore(deps): update eslint monorepo to v9.17.0 [`#2712`](https://github.com/pear-devs/pear-desktop/pull/2712)
- fix(deps): update dependency hono to v4.6.14 [`#2716`](https://github.com/pear-devs/pear-desktop/pull/2716)
- fix: discord rich presence connection status [`#2714`](https://github.com/pear-devs/pear-desktop/pull/2714)
- fix: Laggy scrolling behaviour in large playlists [`#2708`](https://github.com/pear-devs/pear-desktop/pull/2708)
- fix(deps): update dependency youtubei.js to v12.2.0 [`#2705`](https://github.com/pear-devs/pear-desktop/pull/2705)
- fix(deps): update dependency i18next to v24.1.0 [`#2698`](https://github.com/pear-devs/pear-desktop/pull/2698)
- chore(deps): update dependency @stylistic/eslint-plugin-js to v2.12.1 [`#2697`](https://github.com/pear-devs/pear-desktop/pull/2697)
- fix(deps): update dependency zod to v3.24.1 [`#2694`](https://github.com/pear-devs/pear-desktop/pull/2694)
- fix(deps): update dependency youtubei.js to v12.1.0 [`#2695`](https://github.com/pear-devs/pear-desktop/pull/2695)
- chore(deps): update dependency discord-api-types to v0.37.111 [`#2690`](https://github.com/pear-devs/pear-desktop/pull/2690)
- chore(deps): update dependency typescript-eslint to v8.18.0 [`#2692`](https://github.com/pear-devs/pear-desktop/pull/2692)
- chore(deps): update playwright monorepo to v1.49.1 [`#2693`](https://github.com/pear-devs/pear-desktop/pull/2693)
- fix(deps): update dependency hono to v4.6.13 [`#2682`](https://github.com/pear-devs/pear-desktop/pull/2682)
- chore(deps): update dependency rollup to v4.28.1 [`#2683`](https://github.com/pear-devs/pear-desktop/pull/2683)
- fix(deps): update dependency conf to v13.1.0 [`#2686`](https://github.com/pear-devs/pear-desktop/pull/2686)
- chore(deps): update dependency @stylistic/eslint-plugin-js to v2.12.0 [`#2689`](https://github.com/pear-devs/pear-desktop/pull/2689)
- fix(deps): update dependency youtubei.js to v12 [`#2681`](https://github.com/pear-devs/pear-desktop/pull/2681)
- chore(deps): update dependency vite to v6.0.3 [`#2680`](https://github.com/pear-devs/pear-desktop/pull/2680)
- fix(album-actions): Fixed #2312 [`#2676`](https://github.com/pear-devs/pear-desktop/pull/2676)
- chore(deps): update dependency eslint-import-resolver-typescript to v3.7.0 [`#2672`](https://github.com/pear-devs/pear-desktop/pull/2672)
- chore(deps): update dependency node-gyp to v11 [`#2678`](https://github.com/pear-devs/pear-desktop/pull/2678)
- fix(deps): update dependency i18next to v24.0.5 [`#2669`](https://github.com/pear-devs/pear-desktop/pull/2669)
- fix(deps): update dependency i18next to v24.0.4 [`#2668`](https://github.com/pear-devs/pear-desktop/pull/2668)
- chore(deps): update dependency vite to v6.0.2 [`#2662`](https://github.com/pear-devs/pear-desktop/pull/2662)
- chore(deps): update dependency node-gyp to v10.3.1 [`#2665`](https://github.com/pear-devs/pear-desktop/pull/2665)
- chore(deps): update dependency typescript-eslint to v8.17.0 [`#2664`](https://github.com/pear-devs/pear-desktop/pull/2664)
- chore(deps): update dependency vite-plugin-inspect to v0.10.3 [`#2667`](https://github.com/pear-devs/pear-desktop/pull/2667)
- chore(deps): update dependency rollup to v4.28.0 [`#2661`](https://github.com/pear-devs/pear-desktop/pull/2661)
- chore(deps): update dependency discord-api-types to v0.37.110 [`#2653`](https://github.com/pear-devs/pear-desktop/pull/2653)
- fix(deps): update dependency @hono/zod-openapi to v0.18.3 [`#2654`](https://github.com/pear-devs/pear-desktop/pull/2654)
- chore(deps): update eslint monorepo to v9.16.0 [`#2656`](https://github.com/pear-devs/pear-desktop/pull/2656)
- chore(deps): update dependency vite-plugin-inspect to v0.10.2 [`#2657`](https://github.com/pear-devs/pear-desktop/pull/2657)
- fix(music-player.css): Fixed #2514 [`#2659`](https://github.com/pear-devs/pear-desktop/pull/2659)
- fix: Fixed Skip Disliked Song not working [`#2651`](https://github.com/pear-devs/pear-desktop/pull/2651)
- fix(deps): update dependency @hono/zod-openapi to v0.18.2 [`#2650`](https://github.com/pear-devs/pear-desktop/pull/2650)
- chore(deps): update dependency vite-plugin-inspect to v0.10.1 [`#2652`](https://github.com/pear-devs/pear-desktop/pull/2652)
- chore(deps): update dependency electron to v33.2.1 [`#2649`](https://github.com/pear-devs/pear-desktop/pull/2649)
- chore(deps): update dependency vite-plugin-inspect to v0.10.0 [`#2646`](https://github.com/pear-devs/pear-desktop/pull/2646)
- chore(deps): update dependency vite to v6 [`#2644`](https://github.com/pear-devs/pear-desktop/pull/2644)
- fix(deps): update dependency @hono/swagger-ui to v0.5.0 [`#2643`](https://github.com/pear-devs/pear-desktop/pull/2643)
- chore(deps): update dependency discord-api-types to v0.37.109 [`#2642`](https://github.com/pear-devs/pear-desktop/pull/2642)
- chore(deps): update dependency vite-plugin-solid to v2.11.0 [`#2641`](https://github.com/pear-devs/pear-desktop/pull/2641)
- fix(deps): update dependency hono to v4.6.12 [`#2636`](https://github.com/pear-devs/pear-desktop/pull/2636)
- fix(deps): update dependency i18next to v24.0.2 [`#2637`](https://github.com/pear-devs/pear-desktop/pull/2637)
- chore(deps): update dependency discord-api-types to v0.37.108 [`#2638`](https://github.com/pear-devs/pear-desktop/pull/2638)
- chore(deps): update dependency typescript-eslint to v8.16.0 [`#2639`](https://github.com/pear-devs/pear-desktop/pull/2639)
- chore(deps): update dependency rollup to v4.27.4 [`#2632`](https://github.com/pear-devs/pear-desktop/pull/2632)
- fix(deps): update dependency i18next to v24 [`#2633`](https://github.com/pear-devs/pear-desktop/pull/2633)
- chore(deps): update dependency typescript to v5.7.2 [`#2629`](https://github.com/pear-devs/pear-desktop/pull/2629)
- chore(deps): update dependency discord-api-types to v0.37.107 [`#2627`](https://github.com/pear-devs/pear-desktop/pull/2627)
- fix(deps): update dependency @hono/zod-openapi to v0.18.0 [`#2626`](https://github.com/pear-devs/pear-desktop/pull/2626)
- fix(deps): update dependency i18next to v23.16.8 [`#2625`](https://github.com/pear-devs/pear-desktop/pull/2625)
- chore(deps): update dependency vite-plugin-inspect to v0.8.8 [`#2623`](https://github.com/pear-devs/pear-desktop/pull/2623)
- fix(deps): update dependency hono to v4.6.11 [`#2624`](https://github.com/pear-devs/pear-desktop/pull/2624)
- chore(deps): update playwright monorepo to v1.49.0 [`#2617`](https://github.com/pear-devs/pear-desktop/pull/2617)
- chore(deps): update dependency rollup to v4.27.3 [`#2610`](https://github.com/pear-devs/pear-desktop/pull/2610)
- chore(deps): update dependency typescript-eslint to v8.15.0 [`#2611`](https://github.com/pear-devs/pear-desktop/pull/2611)
- chore(deps): update dependency @stylistic/eslint-plugin-js to v2.11.0 [`#2618`](https://github.com/pear-devs/pear-desktop/pull/2618)
- chore(deps): update dependency discord-api-types to v0.37.105 [`#2603`](https://github.com/pear-devs/pear-desktop/pull/2603)
- chore(deps): update dependency rollup to v4.27.2 [`#2604`](https://github.com/pear-devs/pear-desktop/pull/2604)
- chore(deps): update eslint monorepo to v9.15.0 [`#2607`](https://github.com/pear-devs/pear-desktop/pull/2607)
- fix(deps): update dependency @hono/zod-openapi to v0.17.1 [`#2608`](https://github.com/pear-devs/pear-desktop/pull/2608)
- fix(ambient-mode): fix ambient-mode overlapping other elements [`#2609`](https://github.com/pear-devs/pear-desktop/pull/2609)
- fix: Allow media playback control (MPRIS) for flatpak [`#2606`](https://github.com/pear-devs/pear-desktop/pull/2606)
- fix(deps): update dependency @hono/node-server to v1.13.7 [`#2598`](https://github.com/pear-devs/pear-desktop/pull/2598)
- chore(deps): update dependency rollup to v4.26.0 [`#2600`](https://github.com/pear-devs/pear-desktop/pull/2600)
- fix(deps): update dependency hono to v4.6.10 [`#2601`](https://github.com/pear-devs/pear-desktop/pull/2601)
- fix(deps): update dependency @hono/node-server to v1.13.6 [`#2594`](https://github.com/pear-devs/pear-desktop/pull/2594)
- chore(deps): update dependency vite to v5.4.11 [`#2595`](https://github.com/pear-devs/pear-desktop/pull/2595)
- chore(deps): update dependency typescript-eslint to v8.14.0 [`#2596`](https://github.com/pear-devs/pear-desktop/pull/2596)
- chore(deps): update dependency electron to v33.2.0 [`#2591`](https://github.com/pear-devs/pear-desktop/pull/2591)
- fix(deps): update dependency @hono/zod-openapi to v0.17.0 [`#2592`](https://github.com/pear-devs/pear-desktop/pull/2592)
- fix(deps): update dependency i18next to v23.16.5 [`#2589`](https://github.com/pear-devs/pear-desktop/pull/2589)
- fix(deps): update dependency @hono/node-server to v1.13.5 [`#2578`](https://github.com/pear-devs/pear-desktop/pull/2578)
- fix(deps): update dependency hono to v4.6.9 [`#2579`](https://github.com/pear-devs/pear-desktop/pull/2579)
- chore(deps): update dependency discord-api-types to v0.37.104 [`#2588`](https://github.com/pear-devs/pear-desktop/pull/2588)
- chore(deps): update dependency typescript-eslint to v8.13.0 [`#2581`](https://github.com/pear-devs/pear-desktop/pull/2581)
- chore(deps): update dependency rollup to v4.25.0 [`#2580`](https://github.com/pear-devs/pear-desktop/pull/2580)
- chore(docs): Update screenshot [`#2587`](https://github.com/pear-devs/pear-desktop/pull/2587)
- chore(docs): Specify full path to xattr for macOS, fixes #2583 [`#2586`](https://github.com/pear-devs/pear-desktop/pull/2586)
- fix: callback for time-changed event [`#2577`](https://github.com/pear-devs/pear-desktop/pull/2577)
- chore(deps): update eslint monorepo to v9.14.0 [`#2573`](https://github.com/pear-devs/pear-desktop/pull/2573)
- chore(deps): update dependency utf-8-validate to v6.0.5 [`#2572`](https://github.com/pear-devs/pear-desktop/pull/2572)
- chore(deps): update dependency @stylistic/eslint-plugin-js to v2.10.1 [`#2571`](https://github.com/pear-devs/pear-desktop/pull/2571)
- fix(deps): update dependency @hono/node-server to v1.13.4 [`#2570`](https://github.com/pear-devs/pear-desktop/pull/2570)
- chore(deps): update dependency @stylistic/eslint-plugin-js to v2.10.0 [`#2569`](https://github.com/pear-devs/pear-desktop/pull/2569)
- fix(deps): update dependency @floating-ui/dom to v1.6.12 [`#2568`](https://github.com/pear-devs/pear-desktop/pull/2568)
- chore(deps): update dependency rollup to v4.24.3 [`#2565`](https://github.com/pear-devs/pear-desktop/pull/2565)
- fix(deps): update dependency hono to v4.6.8 [`#2564`](https://github.com/pear-devs/pear-desktop/pull/2564)
- chore(deps): update dependency typescript-eslint to v8.12.2 [`#2563`](https://github.com/pear-devs/pear-desktop/pull/2563)
- chore(deps): update dependency typescript-eslint to v8.12.0 [`#2561`](https://github.com/pear-devs/pear-desktop/pull/2561)
- fix(deps): update dependency youtubei.js to v11 [`#2562`](https://github.com/pear-devs/pear-desktop/pull/2562)
- chore(deps): update dependency rollup to v4.24.2 [`#2559`](https://github.com/pear-devs/pear-desktop/pull/2559)
- fix(deps): update dependency @hono/node-server to v1.13.3 [`#2560`](https://github.com/pear-devs/pear-desktop/pull/2560)
- fix(deps): update dependency i18next to v23.16.4 [`#2550`](https://github.com/pear-devs/pear-desktop/pull/2550)
- chore(deps): update playwright monorepo to v1.48.2 [`#2551`](https://github.com/pear-devs/pear-desktop/pull/2551)
- fix(deps): update dependency hono to v4.6.7 [`#2552`](https://github.com/pear-devs/pear-desktop/pull/2552)
- chore(deps): update dependency @babel/runtime to v7.26.0 [`#2548`](https://github.com/pear-devs/pear-desktop/pull/2548)
- chore(deps): update dependency @types/color to v4 [`#2547`](https://github.com/pear-devs/pear-desktop/pull/2547)
- fix(deps): update dependency i18next to v23.16.3 [`#2545`](https://github.com/pear-devs/pear-desktop/pull/2545)
- fix(deps): update dependency solid-js to v1.9.3 [`#2541`](https://github.com/pear-devs/pear-desktop/pull/2541)
- chore(deps): update dependency vite to v5.4.10 [`#2542`](https://github.com/pear-devs/pear-desktop/pull/2542)
- chore(deps): update dependency electron to v33.0.2 [`#2537`](https://github.com/pear-devs/pear-desktop/pull/2537)
- chore(deps): update dependency @babel/runtime to v7.25.9 [`#2538`](https://github.com/pear-devs/pear-desktop/pull/2538)
- chore(deps): update dependency discord-api-types to v0.37.103 [`#2532`](https://github.com/pear-devs/pear-desktop/pull/2532)
- chore(deps): update dependency typescript-eslint to v8.11.0 [`#2534`](https://github.com/pear-devs/pear-desktop/pull/2534)
- fix(deps): update dependency hono to v4.6.6 [`#2536`](https://github.com/pear-devs/pear-desktop/pull/2536)
- fix(tuna-obs): Added song url to tuna-obs plugin [`#2524`](https://github.com/pear-devs/pear-desktop/pull/2524)
- fix(deps): update dependency i18next to v23.16.2 [`#2530`](https://github.com/pear-devs/pear-desktop/pull/2530)
- fix(deps): update dependency i18next to v23.16.1 [`#2529`](https://github.com/pear-devs/pear-desktop/pull/2529)
- chore(deps): update eslint monorepo to v9.13.0 [`#2528`](https://github.com/pear-devs/pear-desktop/pull/2528)
- chore(deps): update dependency typescript-eslint to v8.10.0 [`#2527`](https://github.com/pear-devs/pear-desktop/pull/2527)
- chore(deps): update playwright monorepo to v1.48.1 [`#2516`](https://github.com/pear-devs/pear-desktop/pull/2516)
- chore(deps): update dependency electron to v33.0.1 [`#2523`](https://github.com/pear-devs/pear-desktop/pull/2523)
- fix: disable gpu memory buffer video frames [`#2519`](https://github.com/pear-devs/pear-desktop/pull/2519)
- fix: use HEAD instead of GET in songInfo.imageSrc validation step [`#2766`](https://github.com/pear-devs/pear-desktop/issues/2766)
- fix: Fixed #1796 (#2736) [`#1796`](https://github.com/pear-devs/pear-desktop/issues/1796)
- fix(album-actions): Fixed #2312 (#2676) [`#2312`](https://github.com/pear-devs/pear-desktop/issues/2312) [`#2312`](https://github.com/pear-devs/pear-desktop/issues/2312)
- fix(music-player.css): Fixed #2514 (#2659) [`#2514`](https://github.com/pear-devs/pear-desktop/issues/2514)
- chore(docs): Specify full path to xattr for macOS, fixes #2583 (#2586) [`#2583`](https://github.com/pear-devs/pear-desktop/issues/2583)
- fix: fix pnpm-lock.yaml [`3208bf4`](https://github.com/pear-devs/pear-desktop/commit/3208bf4a6d47d824875b06bd031299694482f02d)
- Revert "feat: use swc and lightningcss" [`3b50cbc`](https://github.com/pear-devs/pear-desktop/commit/3b50cbcb6e3163115d52f05075af5d6f25b80660)
- feat: use swc and lightningcss [`ae3a289`](https://github.com/pear-devs/pear-desktop/commit/ae3a28900576ea388666747bc4794577e1d57e23)
#### [v3.6.2](https://github.com/pear-devs/pear-desktop/compare/v3.6.1...v3.6.2)
> 16 October 2024
- fix(deps): update dependency serve to v14.2.4 [`#2515`](https://github.com/pear-devs/pear-desktop/pull/2515)
- fix(deps): update dependency hono to v4.6.5 [`#2509`](https://github.com/pear-devs/pear-desktop/pull/2509)
- chore(deps): update dependency vite to v5.4.9 [`#2500`](https://github.com/pear-devs/pear-desktop/pull/2500)
- fix(api-server): properly implement next api call [`#2505`](https://github.com/pear-devs/pear-desktop/pull/2505)
- chore(deps): update dependency electron to v33 [`#2507`](https://github.com/pear-devs/pear-desktop/pull/2507)
- chore(deps): update dependency typescript-eslint to v8.9.0 [`#2503`](https://github.com/pear-devs/pear-desktop/pull/2503)
- chore(deps): update dependency discord-api-types to v0.37.102 [`#2501`](https://github.com/pear-devs/pear-desktop/pull/2501)
- fix: trustedTypes issue [`#2339`](https://github.com/pear-devs/pear-desktop/issues/2339)
- chore(i18n): Translated using Weblate (Icelandic) [`5f79b7e`](https://github.com/pear-devs/pear-desktop/commit/5f79b7e788c47b0a27a4967c9f3a9e20b483cd75)
- chore(i18n): Translated using Weblate (Chinese (Traditional Han script)) [`12d6939`](https://github.com/pear-devs/pear-desktop/commit/12d693921e26a5c54015673a404e005d1a7175a4)
- chore(i18n): Translated using Weblate (Ukrainian) [`836cedb`](https://github.com/pear-devs/pear-desktop/commit/836cedb0f317b74bf2fc3ec2d1aa865719f46ec0)
#### [v3.6.1](https://github.com/pear-devs/pear-desktop/compare/v3.6.0...v3.6.1)
> 14 October 2024
- fix(api-server): Various fixes and improvements [`#2496`](https://github.com/pear-devs/pear-desktop/pull/2496)
- fix(deps): update dependency electron-debug to v4.1.0 [`#2499`](https://github.com/pear-devs/pear-desktop/pull/2499)
- fix(renderer): fix force like buttons display logic [`#2493`](https://github.com/pear-devs/pear-desktop/pull/2493)
- fix(deps): update dependency i18next to v23.16.0 [`#2492`](https://github.com/pear-devs/pear-desktop/pull/2492)
- fix(downloader): fix #2371 [`#2371`](https://github.com/pear-devs/pear-desktop/issues/2371)
- fix(ytm-bugs): incorrect video ratio [`#2459`](https://github.com/pear-devs/pear-desktop/issues/2459)
- fix(api-server): fix init/authentication error [`#2497`](https://github.com/pear-devs/pear-desktop/issues/2497)
- fix: RSS feed CORS issue [`#1620`](https://github.com/pear-devs/pear-desktop/issues/1620)
- chore(flatpak-builder): Add more details when failing [`d3acb49`](https://github.com/pear-devs/pear-desktop/commit/d3acb4945a8dcde6598c53d8207bbf16eda8c739)
- chore(i18n): Translated using Weblate (Filipino) [`e428708`](https://github.com/pear-devs/pear-desktop/commit/e4287085a11f30d141148ab0432cc684819fd0d0)
- Bump version to 3.6.1 [`b668730`](https://github.com/pear-devs/pear-desktop/commit/b6687307dfe7ef765517019093c8db3c2ad14417)
#### [v3.6.0](https://github.com/pear-devs/pear-desktop/compare/v3.5.3...v3.6.0)
> 13 October 2024
- feat(api-server): remote control api [`#1909`](https://github.com/pear-devs/pear-desktop/pull/1909)
- chore(deps): update playwright monorepo to v1.48.0 [`#2489`](https://github.com/pear-devs/pear-desktop/pull/2489)
- fix(`synced-lyrics`): Fix 2 issues [`#2441`](https://github.com/pear-devs/pear-desktop/pull/2441)
- chore(deps): update dependency typescript to v5.6.3 [`#2486`](https://github.com/pear-devs/pear-desktop/pull/2486)
- chore(deps): update dependency electron to v32.2.0 [`#2487`](https://github.com/pear-devs/pear-desktop/pull/2487)
- chore(deps): update dependency del-cli to v6 [`#2475`](https://github.com/pear-devs/pear-desktop/pull/2475)
- chore(deps): update dependency typescript-eslint to v8.8.1 [`#2477`](https://github.com/pear-devs/pear-desktop/pull/2477)
- fix(deps): update dependency solid-js to v1.9.2 [`#2480`](https://github.com/pear-devs/pear-desktop/pull/2480)
- Revert "chore(deps): update dependency electron-builder to v25" [`#2488`](https://github.com/pear-devs/pear-desktop/pull/2488)
- chore(deps): update dependency electron-builder to v25 [`#2406`](https://github.com/pear-devs/pear-desktop/pull/2406)
- fix(deps): update dependency deepmerge-ts to v7.1.3 [`#2481`](https://github.com/pear-devs/pear-desktop/pull/2481)
- fix(deps): update dependency ts-morph to v24 [`#2474`](https://github.com/pear-devs/pear-desktop/pull/2474)
- fix(deps): update dependency i18next to v23.15.2 [`#2471`](https://github.com/pear-devs/pear-desktop/pull/2471)
- chore(deps): update eslint monorepo to v9.12.0 [`#2470`](https://github.com/pear-devs/pear-desktop/pull/2470)
- chore(deps): update dependency @stylistic/eslint-plugin-js to v2.9.0 [`#2469`](https://github.com/pear-devs/pear-desktop/pull/2469)
- chore(deps): bump micromatch from 4.0.5 to 4.0.8 [`#2465`](https://github.com/pear-devs/pear-desktop/pull/2465)
- chore(deps): bump braces from 3.0.2 to 3.0.3 [`#2466`](https://github.com/pear-devs/pear-desktop/pull/2466)
- fix(deps): update dependency electron-updater to v6.3.9 [`#2468`](https://github.com/pear-devs/pear-desktop/pull/2468)
- fix(deps): update dependency deepmerge-ts to v7.1.1 [`#2467`](https://github.com/pear-devs/pear-desktop/pull/2467)
- chore(deps): update dependency typescript-eslint to v8.8.0 [`#2457`](https://github.com/pear-devs/pear-desktop/pull/2457)
- chore(deps): update dependency @babel/runtime to v7.25.7 [`#2462`](https://github.com/pear-devs/pear-desktop/pull/2462)
- chore(deps): update dependency rollup to v4.24.0 [`#2458`](https://github.com/pear-devs/pear-desktop/pull/2458)
- chore(deps): update dependency eslint-plugin-import to v2.31.0 [`#2464`](https://github.com/pear-devs/pear-desktop/pull/2464)
- chore(deps): update dependency rollup to v4.22.5 [`#2448`](https://github.com/pear-devs/pear-desktop/pull/2448)
- chore(deps): update dependency typescript-eslint to v8.7.0 [`#2450`](https://github.com/pear-devs/pear-desktop/pull/2450)
- fix(deps): update dependency solid-js to v1.9.1 [`#2451`](https://github.com/pear-devs/pear-desktop/pull/2451)
- chore(deps): update dependency vite to v5.4.8 [`#2449`](https://github.com/pear-devs/pear-desktop/pull/2449)
- chore(deps): update dependency discord-api-types to v0.37.101 [`#2440`](https://github.com/pear-devs/pear-desktop/pull/2440)
- chore(deps): update dependency esbuild to v0.24.0 [`#2439`](https://github.com/pear-devs/pear-desktop/pull/2439)
- chore(deps): update eslint monorepo to v9.11.1 [`#2442`](https://github.com/pear-devs/pear-desktop/pull/2442)
- chore(deps): update dependency @types/howler to v2.2.12 [`#2443`](https://github.com/pear-devs/pear-desktop/pull/2443)
- chore(deps): update dependency vite to v5.4.7 [`#2434`](https://github.com/pear-devs/pear-desktop/pull/2434)
- chore(deps): update playwright monorepo to v1.47.2 [`#2436`](https://github.com/pear-devs/pear-desktop/pull/2436)
- chore(deps): update eslint monorepo to v9.11.0 [`#2437`](https://github.com/pear-devs/pear-desktop/pull/2437)
- fix(deps): update dependency youtubei.js to v10.5.0 [`#2431`](https://github.com/pear-devs/pear-desktop/pull/2431)
- chore(deps): update dependency rollup to v4.22.4 [`#2430`](https://github.com/pear-devs/pear-desktop/pull/2430)
- chore(deps): update dependency electron to v32.1.2 [`#2433`](https://github.com/pear-devs/pear-desktop/pull/2433)
- feat: ESLint Flat Config (v9 support #2229) [`#2426`](https://github.com/pear-devs/pear-desktop/pull/2426)
- fix(taskbar-mediacontrol): fix icon color [`#2485`](https://github.com/pear-devs/pear-desktop/issues/2485)
- chore(eslint): apply eslint-plugin-prettier [`#2438`](https://github.com/pear-devs/pear-desktop/issues/2438)
- fix: apply fix from eslint [`cb1381b`](https://github.com/pear-devs/pear-desktop/commit/cb1381bbb394e2bbb404f44817ef96411dabc8a9)
- chore(i18n): Translated using Weblate (Portuguese (Brazil)) [`bcff26c`](https://github.com/pear-devs/pear-desktop/commit/bcff26c85b18258806f3960309776bc860c3a54e)
- chore(i18n): Translated using Weblate (Persian) [`ead448e`](https://github.com/pear-devs/pear-desktop/commit/ead448ed98095339557903eb0f84c4a6d0f32058)
#### [v3.5.3](https://github.com/pear-devs/pear-desktop/compare/v3.5.2...v3.5.3)
> 17 September 2024
- fix: fix `trustedHTML` issue [`#2339`](https://github.com/pear-devs/pear-desktop/issues/2339)
- chore(deps): update dependency rollup to v4.21.3 [`6edc84a`](https://github.com/pear-devs/pear-desktop/commit/6edc84a8bd6c7e009041117ba0d2004783eb3a47)
- chore(deps): update typescript-eslint monorepo to v8.6.0 [`d4c8a43`](https://github.com/pear-devs/pear-desktop/commit/d4c8a4320d733f7bddc4dcd1de93644790e71d66)
- chore(deps): update dependency eslint to v8.57.1 [`02b7a39`](https://github.com/pear-devs/pear-desktop/commit/02b7a39753528cfd8c0d107d6d2ec6ef78c5afe7)
#### [v3.5.2](https://github.com/pear-devs/pear-desktop/compare/v3.5.1...v3.5.2)
> 7 September 2024
- chore(deps): update typescript-eslint monorepo to v8.4.0 [`#2401`](https://github.com/pear-devs/pear-desktop/pull/2401)
- chore(deps): update dependency @total-typescript/ts-reset to v0.6.1 [`#2396`](https://github.com/pear-devs/pear-desktop/pull/2396)
- chore(deps): update dependency electron to v31.5.0 [`#2397`](https://github.com/pear-devs/pear-desktop/pull/2397)
- chore(deps): update dependency eslint-import-resolver-typescript to v3.6.3 [`#2376`](https://github.com/pear-devs/pear-desktop/pull/2376)
- chore(deps): update dependency discord-api-types to v0.37.100 [`#2394`](https://github.com/pear-devs/pear-desktop/pull/2394)
- fix(deps): update dependency electron-updater to v6.3.4 [`#2395`](https://github.com/pear-devs/pear-desktop/pull/2395)
- chore(deps): update dependency @babel/runtime to v7.25.6 [`#2388`](https://github.com/pear-devs/pear-desktop/pull/2388)
- chore(deps): update dependency vite-plugin-inspect to v0.8.7 [`#2389`](https://github.com/pear-devs/pear-desktop/pull/2389)
- chore(deps): update dependency discord-api-types to v0.37.99 [`#2374`](https://github.com/pear-devs/pear-desktop/pull/2374)
- chore(deps): update dependency vite to v5.4.3 [`#2377`](https://github.com/pear-devs/pear-desktop/pull/2377)
- fix: incorrect regex when splitting artistName [`#2378`](https://github.com/pear-devs/pear-desktop/pull/2378)
- chore(deps): update dependency @babel/runtime to v7.25.4 [`#2373`](https://github.com/pear-devs/pear-desktop/pull/2373)
- synced-lyrics: make the lyrics search more reliable [`#2343`](https://github.com/pear-devs/pear-desktop/pull/2343)
- fix(deps): update dependency solid-js to v1.8.22 [`#2354`](https://github.com/pear-devs/pear-desktop/pull/2354)
- chore(deps): update typescript-eslint monorepo to v8.3.0 [`#2350`](https://github.com/pear-devs/pear-desktop/pull/2350)
- fix(deps): update dependency electron-debug to v4.0.1 [`#2349`](https://github.com/pear-devs/pear-desktop/pull/2349)
- chore(deps): update dependency electron to v31.4.0 [`#2356`](https://github.com/pear-devs/pear-desktop/pull/2356)
- fix: hide native-controls on linux when in-app-menu is used [`#2366`](https://github.com/pear-devs/pear-desktop/pull/2366)
- fix: detect the upgrade btn using the icon [`#2364`](https://github.com/pear-devs/pear-desktop/pull/2364)
- fix: exclude build-id files from rpm [`#2361`](https://github.com/pear-devs/pear-desktop/pull/2361)
- fix(deps): update dependency i18next to v23.12.3 [`#2352`](https://github.com/pear-devs/pear-desktop/pull/2352)
- fix(deps): update dependency @floating-ui/dom to v1.6.10 [`#2340`](https://github.com/pear-devs/pear-desktop/pull/2340)
- fix(deps): update dependency electron-updater to v6.3.3 [`#2347`](https://github.com/pear-devs/pear-desktop/pull/2347)
- fix(deps): update dependency solid-js to v1.8.20 [`#2345`](https://github.com/pear-devs/pear-desktop/pull/2345)
- chore(deps): update dependency vite to v5.4.0 [`#2342`](https://github.com/pear-devs/pear-desktop/pull/2342)
- chore(deps): update typescript-eslint monorepo to v8.0.1 [`#2335`](https://github.com/pear-devs/pear-desktop/pull/2335)
- fix(deps): update dependency @floating-ui/dom to v1.6.9 [`#2337`](https://github.com/pear-devs/pear-desktop/pull/2337)
- chore(deps): update playwright monorepo to v1.46.0 [`#2336`](https://github.com/pear-devs/pear-desktop/pull/2336)
- chore(README): Translation README to Russian and adding Synced Lyrics to main README [`#2338`](https://github.com/pear-devs/pear-desktop/pull/2338)
- chore(deps): update dependency rollup to v4.20.0 [`#2326`](https://github.com/pear-devs/pear-desktop/pull/2326)
- fix(synced-lyric): fix timestamp [`#2323`](https://github.com/pear-devs/pear-desktop/issues/2323) [`#2379`](https://github.com/pear-devs/pear-desktop/issues/2379)
- Revert "fix(MPRIS): Prevents player to start with invalid MPRIS interface (#1996)" [`#2225`](https://github.com/pear-devs/pear-desktop/issues/2225)
- fix(adblocker/inplayer): fix Response.prototype.json [`#2310`](https://github.com/pear-devs/pear-desktop/issues/2310)
- chore(deps): update dependency eslint-plugin-import to v2.30.0 [`f48e46d`](https://github.com/pear-devs/pear-desktop/commit/f48e46d29cf09c76c5172fd56d2d0f705616e4e3)
- Revert "chore(deps): update dependency electron-builder to v25" [`089eff3`](https://github.com/pear-devs/pear-desktop/commit/089eff3152903c8b55ad3e5571b944062a647e27)
- chore(deps): update dependency electron-builder to v25 [`fe4c89c`](https://github.com/pear-devs/pear-desktop/commit/fe4c89c349bb9f4f54d95c2018943095ccfdab0c)
#### [v3.5.1](https://github.com/pear-devs/pear-desktop/compare/v3.5.0...v3.5.1)
> 1 August 2024
- fix(deps): update dependency youtubei.js to v10.3.0 [`#2306`](https://github.com/pear-devs/pear-desktop/pull/2306)
- fix: Window gets stuck offscreen in some instances [`#2303`](https://github.com/pear-devs/pear-desktop/pull/2303)
- fix: Incorrect window size on multi-monitor scaled displays [`#2302`](https://github.com/pear-devs/pear-desktop/pull/2302)
- chore(deps): update dependency rollup to v4.19.2 [`#2304`](https://github.com/pear-devs/pear-desktop/pull/2304)
- chore(deps): update typescript-eslint monorepo to v8 (major) [`#2297`](https://github.com/pear-devs/pear-desktop/pull/2297)
- fix(ambient-mode): fix ambient-mode not working for videos after restart [`#2294`](https://github.com/pear-devs/pear-desktop/pull/2294)
- fix(deps): update dependency @xhayper/discord-rpc to v1.2.0 [`#2291`](https://github.com/pear-devs/pear-desktop/pull/2291)
- fix(synced-lyrics): fix lyric load [`#2295`](https://github.com/pear-devs/pear-desktop/issues/2295)
- fix(ambient-mode): fix ambient-mode not working for videos after restart (#2294) [`#1641`](https://github.com/pear-devs/pear-desktop/issues/1641)
- fix(synced-lyrics): fix i18n [`8750b54`](https://github.com/pear-devs/pear-desktop/commit/8750b54f766c735ff039c6be454427f17d4737e2)
- ts-fix: disambiguate ElectronStore typings [`8775735`](https://github.com/pear-devs/pear-desktop/commit/877573532c1b68af861a3fdc44d093f3097d36ab)
- chore(i18n): Translated using Weblate (Hungarian) [`3537dc1`](https://github.com/pear-devs/pear-desktop/commit/3537dc19eecce7f7deb2478942f70d3c7b72148d)
#### [v3.5.0](https://github.com/pear-devs/pear-desktop/compare/v3.4.1...v3.5.0)
> 31 July 2024
- plugin: Synced Lyrics [`#2207`](https://github.com/pear-devs/pear-desktop/pull/2207)
- chore(deps): update dependency electron to v31.3.1 [`#2290`](https://github.com/pear-devs/pear-desktop/pull/2290)
- chore(deps): update typescript-eslint monorepo to v7.18.0 [`#2292`](https://github.com/pear-devs/pear-desktop/pull/2292)
- fix(deps): update dependency youtubei.js to v10.2.0 [`#2285`](https://github.com/pear-devs/pear-desktop/pull/2285)
- chore(deps): update dependency electron to v31.3.0 [`#2282`](https://github.com/pear-devs/pear-desktop/pull/2282)
- chore(deps): update typescript-eslint monorepo to v7.17.0 [`#2283`](https://github.com/pear-devs/pear-desktop/pull/2283)
- fix(deps): update dependency solid-js to v1.8.19 [`#2280`](https://github.com/pear-devs/pear-desktop/pull/2280)
- fix(deps): update dependency @xhayper/discord-rpc to v1.1.4 [`#2279`](https://github.com/pear-devs/pear-desktop/pull/2279)
- chore(deps): update dependency @babel/runtime to v7.25.0 [`#2281`](https://github.com/pear-devs/pear-desktop/pull/2281)
- fix(deps): update dependency @floating-ui/dom to v1.6.8 [`#2278`](https://github.com/pear-devs/pear-desktop/pull/2278)
- Fix: Incorrect window size on scaled displays [`#2258`](https://github.com/pear-devs/pear-desktop/pull/2258)
- chore(deps): update dependency vite-plugin-resolve to v2.5.2 [`#2276`](https://github.com/pear-devs/pear-desktop/pull/2276)
- chore(deps): update playwright monorepo to v1.45.3 [`#2277`](https://github.com/pear-devs/pear-desktop/pull/2277)
- fix(deps): update dependency deepmerge-ts to v7.1.0 [`#2263`](https://github.com/pear-devs/pear-desktop/pull/2263)
- chore(deps): update dependency typescript to v5.5.4 [`#2274`](https://github.com/pear-devs/pear-desktop/pull/2274)
- chore(deps): update dependency vite to v5.3.5 [`#2275`](https://github.com/pear-devs/pear-desktop/pull/2275)
- fix(deps): update dependency i18next to v23.12.2 [`#2260`](https://github.com/pear-devs/pear-desktop/pull/2260)
- chore(deps): update dependency discord-api-types to v0.37.93 [`#2273`](https://github.com/pear-devs/pear-desktop/pull/2273)
- chore(deps): update dependency rollup to v4.19.1 [`#2261`](https://github.com/pear-devs/pear-desktop/pull/2261)
- fix(deps): update dependency custom-electron-prompt to v1.5.8 [`#2262`](https://github.com/pear-devs/pear-desktop/pull/2262)
- feat(adblocker): add new option AdSpeedup [`#2235`](https://github.com/pear-devs/pear-desktop/pull/2235)
- fix: disable multi-plane format for software video [`#2254`](https://github.com/pear-devs/pear-desktop/pull/2254)
- chore(deps): update dependency eslint-plugin-prettier to v5.2.1 [`#2253`](https://github.com/pear-devs/pear-desktop/pull/2253)
- chore(deps): update dependency vite to v5.3.4 [`#2243`](https://github.com/pear-devs/pear-desktop/pull/2243)
- chore(deps): update typescript-eslint monorepo to v7.16.1 [`#2239`](https://github.com/pear-devs/pear-desktop/pull/2239)
- chore(deps): update playwright monorepo to v1.45.2 [`#2244`](https://github.com/pear-devs/pear-desktop/pull/2244)
- chore(deps): update dependency vite-plugin-inspect to v0.8.5 [`#2252`](https://github.com/pear-devs/pear-desktop/pull/2252)
- fix(deps): update dependency semver to v7.6.3 [`#2250`](https://github.com/pear-devs/pear-desktop/pull/2250)
- chore(deps): update dependency electron to v31.2.1 [`#2241`](https://github.com/pear-devs/pear-desktop/pull/2241)
- chore(i18n): Translated using Weblate (Catalan) [`4a8440c`](https://github.com/pear-devs/pear-desktop/commit/4a8440c281c341977ab3687982cec8cbc5af6cf7)
- Update changelog for v3.4.1 [`18e0b1b`](https://github.com/pear-devs/pear-desktop/commit/18e0b1b86341b13f1cbc713bfbd7b5d7a45ee392)
- fix(synced-lyrics): fix type error [`9357a15`](https://github.com/pear-devs/pear-desktop/commit/9357a15116a8526d22ba6142c0a02f31688743f2)
#### [v3.4.1](https://github.com/pear-devs/pear-desktop/compare/v3.4.0...v3.4.1)
> 15 July 2024
- fix(mpris): fix mpris position [`#2225`](https://github.com/pear-devs/pear-desktop/issues/2225)
- fix(deb): fix depends [`#1983`](https://github.com/pear-devs/pear-desktop/issues/1983)
- fix: fix touchbar icon [`#2183`](https://github.com/pear-devs/pear-desktop/issues/2183)
- fix: fix "Starting page" [`#1822`](https://github.com/pear-devs/pear-desktop/issues/1822)
- fix: fix album actions [`#2202`](https://github.com/pear-devs/pear-desktop/issues/2202)
- fix: fix playback slider [`#2045`](https://github.com/pear-devs/pear-desktop/issues/2045)
- chore(i18n): Translated using Weblate (Spanish) [`91bee48`](https://github.com/pear-devs/pear-desktop/commit/91bee4880ed2c6fdd887814a2620877d89bea311)
- Bump version to 3.4.1 [`02e2fb6`](https://github.com/pear-devs/pear-desktop/commit/02e2fb6a83844f439f760e72cdcb935b86000df2)
#### [v3.4.0](https://github.com/pear-devs/pear-desktop/compare/v3.3.12...v3.4.0)
> 14 July 2024
- fix(deps): update dependency i18next to v23.12.1 [`#2230`](https://github.com/pear-devs/pear-desktop/pull/2230)
- feat(downloader): New option to download on finish [`#1964`](https://github.com/pear-devs/pear-desktop/pull/1964)
- chore(deps): update typescript-eslint monorepo to v8.0.0-alpha.42 [`#2228`](https://github.com/pear-devs/pear-desktop/pull/2228)
- chore(deps): update dependency eslint to v9.7.0 [`#2226`](https://github.com/pear-devs/pear-desktop/pull/2226)
- chore(deps): update dependency @babel/runtime to v7.24.8 [`#2221`](https://github.com/pear-devs/pear-desktop/pull/2221)
- chore(deps): update dependency node-gyp to v10.2.0 [`#2216`](https://github.com/pear-devs/pear-desktop/pull/2216)
- chore(deps): update dependency ws to v8.18.0 [`#2217`](https://github.com/pear-devs/pear-desktop/pull/2217)
- chore(deps): update dependency glob to v11 [`#2219`](https://github.com/pear-devs/pear-desktop/pull/2219)
- chore(deps): update dependency esbuild to v0.23.0 [`#2215`](https://github.com/pear-devs/pear-desktop/pull/2215)
- chore(deps): update dependency electron to v31.2.0 [`#2214`](https://github.com/pear-devs/pear-desktop/pull/2214)
- fix(deps): update dependency youtubei.js to v10.1.0 [`#2218`](https://github.com/pear-devs/pear-desktop/pull/2218)
- chore(deps): update playwright monorepo to v1.45.1 [`#2212`](https://github.com/pear-devs/pear-desktop/pull/2212)
- chore(deps): update typescript-eslint monorepo to v8.0.0-alpha.41 [`#2213`](https://github.com/pear-devs/pear-desktop/pull/2213)
- chore(deps): update dependency rollup to v4.18.1 [`#2210`](https://github.com/pear-devs/pear-desktop/pull/2210)
- chore(deps): update dependency eslint to v9.6.0 [`#2192`](https://github.com/pear-devs/pear-desktop/pull/2192)
- chore(deps): update dependency vite to v5.3.3 [`#2211`](https://github.com/pear-devs/pear-desktop/pull/2211)
- chore(deps): update dependency glob to v10.4.5 [`#2205`](https://github.com/pear-devs/pear-desktop/pull/2205)
- chore(deps): update dependency discord-api-types to v0.37.92 [`#2204`](https://github.com/pear-devs/pear-desktop/pull/2204)
- fix(deps): update dependency solid-js to v1.8.18 [`#2189`](https://github.com/pear-devs/pear-desktop/pull/2189)
- chore(deps): update dependency typescript to v5.5.3 [`#2206`](https://github.com/pear-devs/pear-desktop/pull/2206)
- chore(deps): update dependency electron to v31.1.0 [`#2190`](https://github.com/pear-devs/pear-desktop/pull/2190)
- chore(deps): update typescript-eslint monorepo to v8.0.0-alpha.40 [`#2193`](https://github.com/pear-devs/pear-desktop/pull/2193)
- fix(deps): update dependency @floating-ui/dom to v1.6.7 [`#2196`](https://github.com/pear-devs/pear-desktop/pull/2196)
- chore(deps): update dependency vite to v5.3.2 [`#2188`](https://github.com/pear-devs/pear-desktop/pull/2188)
- chore(deps): update dependency discord-api-types to v0.37.91 [`#2187`](https://github.com/pear-devs/pear-desktop/pull/2187)
- chore(deps): update typescript-eslint monorepo to v8.0.0-alpha.34 [`#2184`](https://github.com/pear-devs/pear-desktop/pull/2184)
- fix(deps): update dependency @floating-ui/dom to v1.6.6 [`#2182`](https://github.com/pear-devs/pear-desktop/pull/2182)
- chore(deps): update playwright monorepo to v1.45.0 [`#2181`](https://github.com/pear-devs/pear-desktop/pull/2181)
- fix(deps): update dependency ts-morph to v23 [`#2180`](https://github.com/pear-devs/pear-desktop/pull/2180)
- chore(deps): update dependency electron-vite to v2.3.0 [`#2178`](https://github.com/pear-devs/pear-desktop/pull/2178)
- fix(deps): update dependency conf to v13.0.1 [`#2175`](https://github.com/pear-devs/pear-desktop/pull/2175)
- chore(deps): update dependency glob to v10.4.2 [`#2168`](https://github.com/pear-devs/pear-desktop/pull/2168)
- chore(deps): update dependency discord-api-types to v0.37.90 [`#2167`](https://github.com/pear-devs/pear-desktop/pull/2167)
- chore(deps): update dependency typescript to v5.5.2 [`#2173`](https://github.com/pear-devs/pear-desktop/pull/2173)
- chore(deps): update dependency electron to v31.0.2 [`#2170`](https://github.com/pear-devs/pear-desktop/pull/2170)
- chore(deps): update dependency ws to v8.17.1 [`#2164`](https://github.com/pear-devs/pear-desktop/pull/2164)
- chore(deps): update dependency eslint to v9.5.0 [`#2162`](https://github.com/pear-devs/pear-desktop/pull/2162)
- fix(deps): update dependency youtubei.js to v10 [`#2136`](https://github.com/pear-devs/pear-desktop/pull/2136)
- chore(deps): update dependency discord-api-types to v0.37.89 [`#2153`](https://github.com/pear-devs/pear-desktop/pull/2153)
- chore(deps): update dependency vite to v5.3.1 [`#2154`](https://github.com/pear-devs/pear-desktop/pull/2154)
- fix(deps): update dependency electron-store to v10 [`#2157`](https://github.com/pear-devs/pear-desktop/pull/2157)
- fix(deps): update dependency conf to v13 [`#2156`](https://github.com/pear-devs/pear-desktop/pull/2156)
- chore(deps): update dependency electron to v31.0.1 [`#2148`](https://github.com/pear-devs/pear-desktop/pull/2148)
- chore(deps): update dependency discord-api-types to v0.37.88 [`#2138`](https://github.com/pear-devs/pear-desktop/pull/2138)
- chore(deps): update typescript-eslint monorepo to v8.0.0-alpha.30 [`#2139`](https://github.com/pear-devs/pear-desktop/pull/2139)
- chore(deps): update dependency electron to v31 [`#2141`](https://github.com/pear-devs/pear-desktop/pull/2141)
- chore(deps): update dependency esbuild to v0.21.5 [`#2135`](https://github.com/pear-devs/pear-desktop/pull/2135)
- chore(deps): update typescript-eslint monorepo to v8.0.0-alpha.29 [`#2132`](https://github.com/pear-devs/pear-desktop/pull/2132)
- fix: rollback eslint version to v8 [`45931a2`](https://github.com/pear-devs/pear-desktop/commit/45931a25b08ab8a406f9e102486585311fd14bf9)
- chore(i18n): Translated using Weblate (Filipino) [`8a20566`](https://github.com/pear-devs/pear-desktop/commit/8a20566e0f2736f72d46282188ada69df1d7076a)
- chore(i18n): Translated using Weblate (Slovenian) [`40f0b9b`](https://github.com/pear-devs/pear-desktop/commit/40f0b9b852dcd9146e1c1e6c741b5baaf55ac079)
#### [v3.3.12](https://github.com/pear-devs/pear-desktop/compare/v3.3.11...v3.3.12)
> 8 June 2024
- hotfix: Revert "chore(deps): update dependencies `@cliqz/adblocker-electron`, `@cliqz/adblocker-electron-preload`" [`3c4abc1`](https://github.com/pear-devs/pear-desktop/commit/3c4abc14187e51f7e47c1ae71b3513f6d8c9912a)
- Update changelog for v3.3.11 [`de22444`](https://github.com/pear-devs/pear-desktop/commit/de224444c2a6d9030aa22a3b263ceacbc4b41914)
- Bump version to 3.3.12 [`89ed7d2`](https://github.com/pear-devs/pear-desktop/commit/89ed7d2345001fea59514944f4c1d56d2b7bd888)
#### [v3.3.11](https://github.com/pear-devs/pear-desktop/compare/v3.3.10...v3.3.11)
> 8 June 2024
- Revert "fix(deps): update dependency @cliqz/adblocker-electron to v1.27.10" [`#2129`](https://github.com/pear-devs/pear-desktop/pull/2129)
- chore(deps): update dependency vite to v5.2.13 [`#2127`](https://github.com/pear-devs/pear-desktop/pull/2127)
- chore(deps): update dependency electron to v30.1.0 [`#2126`](https://github.com/pear-devs/pear-desktop/pull/2126)
- fix(deps): update dependency deepmerge-ts to v7.0.3 [`#2125`](https://github.com/pear-devs/pear-desktop/pull/2125)
- chore(deps): update dependency @babel/runtime to v7.24.7 [`#2124`](https://github.com/pear-devs/pear-desktop/pull/2124)
- chore(deps): update typescript-eslint monorepo to v8.0.0-alpha.28 [`#2121`](https://github.com/pear-devs/pear-desktop/pull/2121)
- fix(deps): update dependency electron-updater to v6.2.1 [`#2120`](https://github.com/pear-devs/pear-desktop/pull/2120)
- chore(deps): update dependency discord-api-types to v0.37.87 [`#2119`](https://github.com/pear-devs/pear-desktop/pull/2119)
- fix(deps): update dependency deepmerge-ts to v7.0.2 [`#2118`](https://github.com/pear-devs/pear-desktop/pull/2118)
- chore(deps): update typescript-eslint monorepo to v8.0.0-alpha.25 [`#2114`](https://github.com/pear-devs/pear-desktop/pull/2114)
- fix(menu): fix menubar items doesn't rendered [`#2113`](https://github.com/pear-devs/pear-desktop/issues/2113)
- chore(i18n): Translated using Weblate (Nepali) [`4ae9a28`](https://github.com/pear-devs/pear-desktop/commit/4ae9a2820e9d453635094956264dd8b42c4997f7)
- chore(i18n): Translated using Weblate (Nepali) [`7e8d311`](https://github.com/pear-devs/pear-desktop/commit/7e8d31172ceb175ba07f307d248fc1246265a4c0)
- fix(deps): update dependency @cliqz/adblocker-electron to v1.27.10 [`d97aa1a`](https://github.com/pear-devs/pear-desktop/commit/d97aa1a8a003f15eea63c8cb2dabd0f215e885f1)
#### [v3.3.10](https://github.com/pear-devs/pear-desktop/compare/v3.3.9...v3.3.10)
> 2 June 2024
- fix(adblocker): fix blank screen [`#2103`](https://github.com/pear-devs/pear-desktop/issues/2103) [`#2105`](https://github.com/pear-devs/pear-desktop/issues/2105)
- chore(i18n): Translated using Weblate (Hungarian) [`25958a7`](https://github.com/pear-devs/pear-desktop/commit/25958a7bb1fea20e59676e7821f3dd8819602b68)
- fix(deps): bump deps [`4fa9762`](https://github.com/pear-devs/pear-desktop/commit/4fa9762a506544ce453894ce2df13033225e6c7d)
- fix(deps): bump `@typescript-eslint/eslint-plugin` version to 8.0.0-alpha.24 [`1e5bea8`](https://github.com/pear-devs/pear-desktop/commit/1e5bea85b31da5de868d9eff8758e5d2d888c2c8)
#### [v3.3.9](https://github.com/pear-devs/pear-desktop/compare/v3.3.8...v3.3.9)
> 1 June 2024
- chore(deps): update dependency eslint to v9.4.0 [`#2106`](https://github.com/pear-devs/pear-desktop/pull/2106)
- fix(adblocker): fix In-Player adblocker [`#1817`](https://github.com/pear-devs/pear-desktop/issues/1817)
- feat(adblocker): improve In-Player adblocker [`5b9e947`](https://github.com/pear-devs/pear-desktop/commit/5b9e947b8feebb57d9a2122ae7b7ab2ff7c37c06)
- chore(i18n): Translated using Weblate (French) [`9e809b0`](https://github.com/pear-devs/pear-desktop/commit/9e809b002d10f6ec0202a7d56d3d0b73f8093012)
- chore(i18n): Translated using Weblate (Malay) [`79151cb`](https://github.com/pear-devs/pear-desktop/commit/79151cb3aa6c087b8d8bb500322f505797b822bd)
#### [v3.3.8](https://github.com/pear-devs/pear-desktop/compare/v3.3.7...v3.3.8)
> 1 June 2024
- fix(adblocker): fix blank screen [`#1942`](https://github.com/pear-devs/pear-desktop/issues/1942) [`#2100`](https://github.com/pear-devs/pear-desktop/issues/2100) [`#2103`](https://github.com/pear-devs/pear-desktop/issues/2103)
- Update changelog for v3.3.7 [`b572623`](https://github.com/pear-devs/pear-desktop/commit/b572623442fc8b45b593dc0c91623fbf814115b4)
- Bump version to 3.3.8 [`5d99a85`](https://github.com/pear-devs/pear-desktop/commit/5d99a854e2f29bdb6682beeffa4e6b9b8be0f60f)
#### [v3.3.7](https://github.com/pear-devs/pear-desktop/compare/v3.3.6...v3.3.7)
> 1 June 2024
- chore(deps): update dependency electron to v30.0.9 [`#2098`](https://github.com/pear-devs/pear-desktop/pull/2098)
- Revert "fix(deps): update dependency @cliqz/adblocker-electron to v1.27.6" [`#2101`](https://github.com/pear-devs/pear-desktop/pull/2101)
- fix(deps): update dependency @cliqz/adblocker-electron to v1.27.6 [`#2096`](https://github.com/pear-devs/pear-desktop/pull/2096)
- chore(deps): update dependency discord-api-types to v0.37.86 [`#2092`](https://github.com/pear-devs/pear-desktop/pull/2092)
- chore(deps): update dependency vite to v5.2.12 [`#2094`](https://github.com/pear-devs/pear-desktop/pull/2094)
- chore(deps): update dependency @typescript-eslint/eslint-plugin to v7.11.0 [`#2093`](https://github.com/pear-devs/pear-desktop/pull/2093)
- chore(docs): Added README-es.md and linked to README.md [`#2090`](https://github.com/pear-devs/pear-desktop/pull/2090)
- fix(deps): update dependency deepmerge-ts to v7 [`#2085`](https://github.com/pear-devs/pear-desktop/pull/2085)
- chore(deps): update dependency builtin-modules to v4 [`#2084`](https://github.com/pear-devs/pear-desktop/pull/2084)
- fix(deps): update dependency electron-debug to v4 [`#2086`](https://github.com/pear-devs/pear-desktop/pull/2086)
- fix(deps): update dependency electron-store to v9 [`#2087`](https://github.com/pear-devs/pear-desktop/pull/2087)
- fix(deps): update dependency conf to v12 [`#1463`](https://github.com/pear-devs/pear-desktop/pull/1463)
- fix(deps): update dependency youtubei.js to v9.4.0 [`#2083`](https://github.com/pear-devs/pear-desktop/pull/2083)
- chore(deps): update playwright monorepo to v1.44.1 [`#2082`](https://github.com/pear-devs/pear-desktop/pull/2082)
- chore(deps): update dependency ws to v8.17.0 [`#2081`](https://github.com/pear-devs/pear-desktop/pull/2081)
- chore(deps): update dependency glob to v10.4.1 [`#2080`](https://github.com/pear-devs/pear-desktop/pull/2080)
- chore(deps): update dependency eslint to v9.3.0 [`#2079`](https://github.com/pear-devs/pear-desktop/pull/2079)
- fix(deps): update dependency peerjs to v1.5.4 [`#2075`](https://github.com/pear-devs/pear-desktop/pull/2075)
- chore(deps): update dependency esbuild to v0.21.4 [`#2078`](https://github.com/pear-devs/pear-desktop/pull/2078)
- fix(deps): update dependency semver to v7.6.2 [`#2076`](https://github.com/pear-devs/pear-desktop/pull/2076)
- chore(deps): update dependency electron-vite to v2.2.0 [`#2077`](https://github.com/pear-devs/pear-desktop/pull/2077)
- fix(deps): update dependency i18next to v23.11.5 [`#2074`](https://github.com/pear-devs/pear-desktop/pull/2074)
- fix(deps): update dependency @cliqz/adblocker-electron to v1.27.3 [`#2071`](https://github.com/pear-devs/pear-desktop/pull/2071)
- chore(deps): update dependency vite to v5.2.11 [`#2070`](https://github.com/pear-devs/pear-desktop/pull/2070)
- fix(deps): update dependency @floating-ui/dom to v1.6.5 [`#2073`](https://github.com/pear-devs/pear-desktop/pull/2073)
- fix(deps): update dependency @cliqz/adblocker-electron-preload to v1.27.3 [`#2072`](https://github.com/pear-devs/pear-desktop/pull/2072)
- chore(deps): update pnpm to v9 [`#1980`](https://github.com/pear-devs/pear-desktop/pull/1980)
- chore(deps): update dependency electron to v30.0.8 [`#2068`](https://github.com/pear-devs/pear-desktop/pull/2068)
- chore(deps-dev): bump ejs from 3.1.9 to 3.1.10 [`#2023`](https://github.com/pear-devs/pear-desktop/pull/2023)
- chore(deps): update dependency utf-8-validate to v6.0.4 [`#2069`](https://github.com/pear-devs/pear-desktop/pull/2069)
- fix(MPRIS): Prevents player to start with invalid MPRIS interface [`#1996`](https://github.com/pear-devs/pear-desktop/pull/1996)
- fix(deps): update dependency solid-js to v1.8.17 [`#2002`](https://github.com/pear-devs/pear-desktop/pull/2002)
- chore(deps): update dependency @typescript-eslint/eslint-plugin to v7.10.0 [`#2000`](https://github.com/pear-devs/pear-desktop/pull/2000)
- chore(deps): update dependency discord-api-types to v0.37.85 [`#1998`](https://github.com/pear-devs/pear-desktop/pull/1998)
- fix(deps): update dependency serve to v14.2.3 [`#1997`](https://github.com/pear-devs/pear-desktop/pull/1997)
- chore(deps): update dependency rollup to v4.18.0 [`#1990`](https://github.com/pear-devs/pear-desktop/pull/1990)
- feat: Enable arm64 for deb and rpm [`#2033`](https://github.com/pear-devs/pear-desktop/pull/2033)
- chore (README-is.md): Replace viðbót with tengiforrit [`#2004`](https://github.com/pear-devs/pear-desktop/pull/2004)
- chore(docs): readme file translated to french [`#2049`](https://github.com/pear-devs/pear-desktop/pull/2049)
- chore(deps): update dependency @babel/runtime to v7.24.6 [`#2039`](https://github.com/pear-devs/pear-desktop/pull/2039)
- Fix substract `margin-top` in fullscreen mode [`#2015`](https://github.com/pear-devs/pear-desktop/pull/2015)
- chore(deps): update pnpm to v8.15.7 [`#1970`](https://github.com/pear-devs/pear-desktop/pull/1970)
- fix(renderer): fix macos traffic lights gap [`#2035`](https://github.com/pear-devs/pear-desktop/issues/2035)
- Fix substract `margin-top` in fullscreen mode [`#2013`](https://github.com/pear-devs/pear-desktop/issues/2013)
- chore(i18n): Translated using Weblate (Hungarian) [`f3de171`](https://github.com/pear-devs/pear-desktop/commit/f3de17112af787437362f31b5c4e2d4149ba1436)
- feat(menu): add theme list in menu [`933b4cc`](https://github.com/pear-devs/pear-desktop/commit/933b4cc8f062b3442afd4516a40eb2938db98fc6)
- chore(i18n): Translated using Weblate (Filipino) [`91392c0`](https://github.com/pear-devs/pear-desktop/commit/91392c0c7efaf3b33da4be4aaa7946af7108d676)
#### [v3.3.6](https://github.com/pear-devs/pear-desktop/compare/v3.3.5...v3.3.6)
> 13 April 2024
- fix: add AdGuard as blocklist sources [`#1966`](https://github.com/pear-devs/pear-desktop/pull/1966)
- chore(deps): update dependency rollup to v4.14.2 [`#1968`](https://github.com/pear-devs/pear-desktop/pull/1968)
- fix(deps): update dependency youtubei.js to v9.3.0 [`#1967`](https://github.com/pear-devs/pear-desktop/pull/1967)
- chore(deps): update playwright monorepo to v1.43.1 [`#1969`](https://github.com/pear-devs/pear-desktop/pull/1969)
- chore(deps): update dependency electron to v29.3.0 [`#1961`](https://github.com/pear-devs/pear-desktop/pull/1961)
- fix(mpris): use global regex to replace minus in the video ID [`#1963`](https://github.com/pear-devs/pear-desktop/pull/1963)
- fix(deps): update dependency @cliqz/adblocker-electron-preload to v1.27.1 [`#1954`](https://github.com/pear-devs/pear-desktop/pull/1954)
- chore(deps): update dependency typescript to v5.4.5 [`#1958`](https://github.com/pear-devs/pear-desktop/pull/1958)
- fix(deps): update dependency youtubei.js to v9.2.1 [`#1957`](https://github.com/pear-devs/pear-desktop/pull/1957)
- fix(deps): update dependency i18next to v23.11.1 [`#1956`](https://github.com/pear-devs/pear-desktop/pull/1956)
- fix(deps): update dependency @cliqz/adblocker-electron to v1.27.1 [`#1953`](https://github.com/pear-devs/pear-desktop/pull/1953)
- chore(deps): update dependency @typescript-eslint/eslint-plugin to v7.6.0 [`#1947`](https://github.com/pear-devs/pear-desktop/pull/1947)
- fix(deps): update dependency i18next to v23.11.0 [`#1946`](https://github.com/pear-devs/pear-desktop/pull/1946)
- chore(deps): update dependency node-gyp to v10.1.0 [`#1941`](https://github.com/pear-devs/pear-desktop/pull/1941)
- chore(deps): update dependency eslint to v9 [`#1940`](https://github.com/pear-devs/pear-desktop/pull/1940)
- chore(deps): update dependency rollup to v4.14.1 [`#1944`](https://github.com/pear-devs/pear-desktop/pull/1944)
- chore(deps): update dependency node-gyp to v10.1.0 [`#1937`](https://github.com/pear-devs/pear-desktop/pull/1937)
- chore(deps): update dependency typescript to v5.4.4 [`#1936`](https://github.com/pear-devs/pear-desktop/pull/1936)
- chore(deps): update playwright monorepo to v1.43.0 [`#1938`](https://github.com/pear-devs/pear-desktop/pull/1938)
- chore(deps): bump undici from 5.28.3 to 5.28.4 [`#1935`](https://github.com/pear-devs/pear-desktop/pull/1935)
- chore(deps): update dependency vite to v5.2.8 [`#1930`](https://github.com/pear-devs/pear-desktop/pull/1930)
- chore(deps): update dependency discord-api-types to v0.37.79 [`#1933`](https://github.com/pear-devs/pear-desktop/pull/1933)
- chore(deps): update dependency node-gyp to v10.1.0 [`#1910`](https://github.com/pear-devs/pear-desktop/pull/1910)
- chore(deps): update dependency node-gyp to v10.1.0 [`#1908`](https://github.com/pear-devs/pear-desktop/pull/1908)
- fix(deps): update dependency @cliqz/adblocker-electron to v1.27.0 [`#1906`](https://github.com/pear-devs/pear-desktop/pull/1906)
- fix(deps): update dependency @cliqz/adblocker-electron-preload to v1.27.0 [`#1907`](https://github.com/pear-devs/pear-desktop/pull/1907)
- chore(deps): update dependency rollup to v4.13.2 [`#1901`](https://github.com/pear-devs/pear-desktop/pull/1901)
- chore(deps): update dependency glob to v10.3.12 [`#1900`](https://github.com/pear-devs/pear-desktop/pull/1900)
- chore(deps): update dependency vite to v5.2.7 [`#1905`](https://github.com/pear-devs/pear-desktop/pull/1905)
- fix(deps): update dependency node-html-parser to v6.1.13 [`#1903`](https://github.com/pear-devs/pear-desktop/pull/1903)
- chore(deps): update dependency discord-api-types to v0.37.77 [`#1899`](https://github.com/pear-devs/pear-desktop/pull/1899)
- chore(deps): update dependency electron to v29.1.6 [`#1898`](https://github.com/pear-devs/pear-desktop/pull/1898)
- Improve video title filters [`#1667`](https://github.com/pear-devs/pear-desktop/pull/1667)
- chore(deps): update dependency rollup to v4.13.1 [`#1896`](https://github.com/pear-devs/pear-desktop/pull/1896)
- chore(deps): update dependency node-gyp to v10.1.0 [`#1890`](https://github.com/pear-devs/pear-desktop/pull/1890)
- chore(deps): update dependency node-gyp to v10.1.0 [`#1889`](https://github.com/pear-devs/pear-desktop/pull/1889)
- fix: fix `switch-repeat` [`#1810`](https://github.com/pear-devs/pear-desktop/issues/1810)
- i18n Translation to Dutch/nl [`0dbf029`](https://github.com/pear-devs/pear-desktop/commit/0dbf0295b805f9883522ee00983b338060fbddbe)
- fix: rollback electron-builder version to 24.9.4 [`4a57cc5`](https://github.com/pear-devs/pear-desktop/commit/4a57cc5ee9ab2ad6835cff75b8b3aead75d9e564)
- chore: update electron-builder to 25.0.0-alpha.6 [`aef03ab`](https://github.com/pear-devs/pear-desktop/commit/aef03ab9fd440fe19c41e315cffab27e976c723d)
#### [v3.3.5](https://github.com/pear-devs/pear-desktop/compare/v3.3.4...v3.3.5)
> 26 March 2024
- chore(deps): update dependency node-gyp to v10.1.0 [`#1885`](https://github.com/pear-devs/pear-desktop/pull/1885)
- chore(deps): update dependency @typescript-eslint/eslint-plugin to v7.4.0 [`#1886`](https://github.com/pear-devs/pear-desktop/pull/1886)
- chore(deps): update dependency vite to v5.2.6 [`#1883`](https://github.com/pear-devs/pear-desktop/pull/1883)
- fix(style): resolve #1887 [`#1887`](https://github.com/pear-devs/pear-desktop/issues/1887)
- chore(i18n): Translated using Weblate (Swedish) [`69087bb`](https://github.com/pear-devs/pear-desktop/commit/69087bbf1fac1ba58e992146deb1d6f1706b1e3c)
- chore(i18n): Translated using Weblate (French) [`af78f15`](https://github.com/pear-devs/pear-desktop/commit/af78f1596ab8db2fa7069fdb1c4f078099ce4446)
- Update changelog for v3.3.4 [`62f7d44`](https://github.com/pear-devs/pear-desktop/commit/62f7d440fab5bdbe9f49a3a5f8c32e7aaf2f28f6)
#### [v3.3.4](https://github.com/pear-devs/pear-desktop/compare/v3.3.3...v3.3.4)
> 24 March 2024
- Update changelog for v3.3.3 [`9769544`](https://github.com/pear-devs/pear-desktop/commit/97695444affbacb71dd73ae7107d4c987e285a37)
- fix(style): fix fullscreen style and in-app-menu [`ed700c2`](https://github.com/pear-devs/pear-desktop/commit/ed700c2916cc7e6ccd2010d0c552364af116eb4f)
- fix(style): fix miniplayer style [`a8bc539`](https://github.com/pear-devs/pear-desktop/commit/a8bc53912d1f4137008ecb2d9d5d9d9eb06ee2a8)
#### [v3.3.3](https://github.com/pear-devs/pear-desktop/compare/v3.3.2...v3.3.3)
> 24 March 2024
- chore(deps): update dependency electron to v29.1.5 [`#1876`](https://github.com/pear-devs/pear-desktop/pull/1876)
- chore(deps): update dependency typescript to v5.4.3 [`#1877`](https://github.com/pear-devs/pear-desktop/pull/1877)
- chore(deps): update dependency discord-api-types to v0.37.76 [`#1878`](https://github.com/pear-devs/pear-desktop/pull/1878)
- chore(deps): update dependency vite to v5.2.4 [`#1881`](https://github.com/pear-devs/pear-desktop/pull/1881)
- Ambient Plugin cleanup [`#1880`](https://github.com/pear-devs/pear-desktop/pull/1880)
- chore(deps): update dependency vite to v5.2.2 [`#1875`](https://github.com/pear-devs/pear-desktop/pull/1875)
- fix(deps): update dependency solid-js to v1.8.16 [`#1873`](https://github.com/pear-devs/pear-desktop/pull/1873)
- chore(deps): update dependency @typescript-eslint/eslint-plugin to v7.3.1 [`#1868`](https://github.com/pear-devs/pear-desktop/pull/1868)
- chore(deps): update dependency discord-api-types to v0.37.75 [`#1867`](https://github.com/pear-devs/pear-desktop/pull/1867)
- chore(deps): update pnpm to v8.15.5 [`#1865`](https://github.com/pear-devs/pear-desktop/pull/1865)
- fix: Fix Miniplayer image size [`#1863`](https://github.com/pear-devs/pear-desktop/pull/1863)
- fix(style): fixed image/video alignment when toggle is active [`#1862`](https://github.com/pear-devs/pear-desktop/pull/1862)
- chore: Update README-is.md [`#1858`](https://github.com/pear-devs/pear-desktop/pull/1858)
- chore(deps): update dependency vite-plugin-solid to v2.10.2 [`#1859`](https://github.com/pear-devs/pear-desktop/pull/1859)
- fix: Ambient Mode intialization improvement [`#1857`](https://github.com/pear-devs/pear-desktop/pull/1857)
- chore(deps): bump follow-redirects from 1.15.5 to 1.15.6 [`#1856`](https://github.com/pear-devs/pear-desktop/pull/1856)
- chore(README): Nicer Readme 2.0 [`#1833`](https://github.com/pear-devs/pear-desktop/pull/1833)
- chore(deps): update dependency discord-api-types to v0.37.74 [`#1854`](https://github.com/pear-devs/pear-desktop/pull/1854)
- chore(deps): update dependency esbuild to v0.20.2 [`#1855`](https://github.com/pear-devs/pear-desktop/pull/1855)
- Improve ambient mode [`#1853`](https://github.com/pear-devs/pear-desktop/pull/1853)
- chore(deps): update dependency electron to v29.1.4 [`#1852`](https://github.com/pear-devs/pear-desktop/pull/1852)
- chore(deps): update dependency electron to v29.1.3 [`#1851`](https://github.com/pear-devs/pear-desktop/pull/1851)
- chore(deps): update dependency rollup to v4.13.0 [`#1850`](https://github.com/pear-devs/pear-desktop/pull/1850)
- fix(deps): update dependency electron-store to v8.2.0 [`#1843`](https://github.com/pear-devs/pear-desktop/pull/1843)
- chore(deps): update dependency electron to v29.1.1 [`#1841`](https://github.com/pear-devs/pear-desktop/pull/1841)
- fix(deps): update dependency i18next to v23.10.1 [`#1842`](https://github.com/pear-devs/pear-desktop/pull/1842)
- chore(deps): update dependency @typescript-eslint/eslint-plugin to v7.2.0 [`#1848`](https://github.com/pear-devs/pear-desktop/pull/1848)
- chore(deps): update dependency vite to v5.1.6 [`#1847`](https://github.com/pear-devs/pear-desktop/pull/1847)
- fix(deps): update dependency async-mutex to v0.5.0 [`#1849`](https://github.com/pear-devs/pear-desktop/pull/1849)
- fix(deps): update dependency ts-morph to v22 [`#1846`](https://github.com/pear-devs/pear-desktop/pull/1846)
- chore(deps): update dependency discord-api-types to v0.37.73 [`#1840`](https://github.com/pear-devs/pear-desktop/pull/1840)
- chore(deps): update dependency rollup to v4.12.1 [`#1837`](https://github.com/pear-devs/pear-desktop/pull/1837)
- chore: Changed a single word (README-is.md) [`#1836`](https://github.com/pear-devs/pear-desktop/pull/1836)
- chore(deps): update dependency typescript to v5.4.2 [`#1838`](https://github.com/pear-devs/pear-desktop/pull/1838)
- chore(deps): update dependency electron-vite to v2.1.0 [`#1823`](https://github.com/pear-devs/pear-desktop/pull/1823)
- chore(deps): update dependency @typescript-eslint/eslint-plugin to v7.1.1 [`#1829`](https://github.com/pear-devs/pear-desktop/pull/1829)
- chore(deps): update dependency vite to v5.1.5 [`#1831`](https://github.com/pear-devs/pear-desktop/pull/1831)
- Revert "chore(deps): update dependency electron-builder to v24.13.3" [`#1818`](https://github.com/pear-devs/pear-desktop/pull/1818)
- chore(deps): update dependency electron-builder to v24.13.3 [`#1774`](https://github.com/pear-devs/pear-desktop/pull/1774)
- chore(deps): update playwright monorepo to v1.42.1 [`#1816`](https://github.com/pear-devs/pear-desktop/pull/1816)
- fix: Add scale ratio for tray icons [`#1811`](https://github.com/pear-devs/pear-desktop/pull/1811)
- Icelandic translation of the readme file [`#1806`](https://github.com/pear-devs/pear-desktop/pull/1806)
- chore(deps): update dependency electron to v29.1.0 [`#1808`](https://github.com/pear-devs/pear-desktop/pull/1808)
- chore(deps): update playwright monorepo to v1.42.0 [`#1805`](https://github.com/pear-devs/pear-desktop/pull/1805)
- chore(deps): update dependency eslint to v8.57.0 [`#1793`](https://github.com/pear-devs/pear-desktop/pull/1793)
- chore(deps): update dependency @typescript-eslint/eslint-plugin to v7.1.0 [`#1800`](https://github.com/pear-devs/pear-desktop/pull/1800)
- chore(deps): update dependency discord-api-types to v0.37.71 [`#1799`](https://github.com/pear-devs/pear-desktop/pull/1799)
- chore(deps): update pnpm to v8.15.4 [`#1795`](https://github.com/pear-devs/pear-desktop/pull/1795)
- chore(deps): update dependency @types/semver to v7.5.8 [`#1797`](https://github.com/pear-devs/pear-desktop/pull/1797)
- fix: center the pause icon [`#1786`](https://github.com/pear-devs/pear-desktop/pull/1786)
- fix(deps): update dependency @cliqz/adblocker-electron to v1.26.16 [`#1788`](https://github.com/pear-devs/pear-desktop/pull/1788)
- fix(deps): update dependency @cliqz/adblocker-electron-preload to v1.26.16 [`#1789`](https://github.com/pear-devs/pear-desktop/pull/1789)
- fix(deps): update dependency youtubei.js to v9.1.0 [`#1790`](https://github.com/pear-devs/pear-desktop/pull/1790)
- fix(deps): update dependency i18next to v23.10.0 [`#1785`](https://github.com/pear-devs/pear-desktop/pull/1785)
- chore(deps): update dependency electron to v29 [`#1773`](https://github.com/pear-devs/pear-desktop/pull/1773)
- chore(deps): update dependency vite to v5.1.4 [`#1778`](https://github.com/pear-devs/pear-desktop/pull/1778)
- chore(deps): bump ip from 2.0.0 to 2.0.1 [`#1777`](https://github.com/pear-devs/pear-desktop/pull/1777)
- fix: add support for Wayland [`#1864`](https://github.com/pear-devs/pear-desktop/issues/1864)
- fix(style): fix navigation bar items are not working [`#1381`](https://github.com/pear-devs/pear-desktop/issues/1381) [`#1396`](https://github.com/pear-devs/pear-desktop/issues/1396) [`#1649`](https://github.com/pear-devs/pear-desktop/issues/1649)
- fix(ytm-bugs): fixed a `scrollbar-color` bug that affected Chromium 121 and later [`#1737`](https://github.com/pear-devs/pear-desktop/issues/1737)
- chore(i18n): Translated using Weblate (Icelandic) [`82fa871`](https://github.com/pear-devs/pear-desktop/commit/82fa8719a96abdfaaa8548a0077f4db2164ec09b)
- chore(i18n): Translated using Weblate (Romanian) [`c871506`](https://github.com/pear-devs/pear-desktop/commit/c871506a69180308ab4fc587b6e8a33f193087e8)
- chore(i18n): Translated using Weblate (Thai) [`a7d0350`](https://github.com/pear-devs/pear-desktop/commit/a7d035022a229f0b245694d1fc7a484befe1c269)
#### [v3.3.2](https://github.com/pear-devs/pear-desktop/compare/v3.3.1...v3.3.2)
> 20 February 2024
- fix: fix bugs in MPRIS, and improve MPRIS [`#1760`](https://github.com/pear-devs/pear-desktop/pull/1760)
- fix(deps): update dependency electron-updater to v6.1.8 [`#1770`](https://github.com/pear-devs/pear-desktop/pull/1770)
- chore(deps): update dependency electron-builder to v24.12.0 [`#1771`](https://github.com/pear-devs/pear-desktop/pull/1771)
- feat(scrobblers): use `BrowserWindow` instead of `shell.openExternal` [`#1758`](https://github.com/pear-devs/pear-desktop/pull/1758)
- chore(deps): update dependency @typescript-eslint/eslint-plugin to v7.0.2 [`#1763`](https://github.com/pear-devs/pear-desktop/pull/1763)
- chore(deps): update dependency esbuild to v0.20.1 [`#1759`](https://github.com/pear-devs/pear-desktop/pull/1759)
- fix(deps): update dependency i18next to v23.9.0 [`#1754`](https://github.com/pear-devs/pear-desktop/pull/1754)
- fix: fixed an issue that caused infinite loops when using Music Together [`#1752`](https://github.com/pear-devs/pear-desktop/issues/1752)
- chore(deps): rollback dependency electron-builder to v24.9.1 [`8bd05f5`](https://github.com/pear-devs/pear-desktop/commit/8bd05f525df98671f0a516b159cccab302b7ae99)
- chore(deps): update dependency electron-builder to v24.13.1 [`47b23b4`](https://github.com/pear-devs/pear-desktop/commit/47b23b414c8feb25c4d9a23d6adb7cbf1ac818fb)
- chore(i18n): Translated using Weblate (German) [`47505e9`](https://github.com/pear-devs/pear-desktop/commit/47505e97482f9e953ee451b968d0950585616ffa)
#### [v3.3.1](https://github.com/pear-devs/pear-desktop/compare/v3.3.0...v3.3.1)
> 18 February 2024
- Update changelog for v3.3.0 [`6d9bb8e`](https://github.com/pear-devs/pear-desktop/commit/6d9bb8eb1cc2d892a5552ffb1f7c20859aa80f67)
- hotfix: in-app-menu position issue [`87acf4c`](https://github.com/pear-devs/pear-desktop/commit/87acf4cf042ba32a000a4aeaec5c17c93501d333)
- release 3.3.1 (HOTFIX) [`a6ed8bf`](https://github.com/pear-devs/pear-desktop/commit/a6ed8bf3aa20ca8e950e85d88f981ccf9edc7498)
#### [v3.3.0](https://github.com/pear-devs/pear-desktop/compare/v3.2.2...v3.3.0)
> 18 February 2024
- fix(deps): update dependency i18next to v23.8.3 [`#1751`](https://github.com/pear-devs/pear-desktop/pull/1751)
- import fixed ./constants [`#1748`](https://github.com/pear-devs/pear-desktop/pull/1748)
- chore(deps): update dependency rollup to v4.12.0 [`#1743`](https://github.com/pear-devs/pear-desktop/pull/1743)
- chore(deps): bump undici from 5.28.2 to 5.28.3 [`#1747`](https://github.com/pear-devs/pear-desktop/pull/1747)
- chore(deps): update dependency vite to v5.1.3 [`#1742`](https://github.com/pear-devs/pear-desktop/pull/1742)
- chore(deps): update dependency vite-plugin-solid to v2.10.1 [`#1734`](https://github.com/pear-devs/pear-desktop/pull/1734)
- chore(deps): update dependency discord-api-types to v0.37.70 [`#1740`](https://github.com/pear-devs/pear-desktop/pull/1740)
- chore(deps): update dependency electron to v28.2.3 [`#1736`](https://github.com/pear-devs/pear-desktop/pull/1736)
- chore(deps): update pnpm to v8.15.3 [`#1739`](https://github.com/pear-devs/pear-desktop/pull/1739)
- chore(deps): update dependency rollup to v4.11.0 [`#1738`](https://github.com/pear-devs/pear-desktop/pull/1738)
- fix(deps): update dependency solid-js to v1.8.15 [`#1735`](https://github.com/pear-devs/pear-desktop/pull/1735)
- chore(deps): update dependency vite to v5.1.2 [`#1733`](https://github.com/pear-devs/pear-desktop/pull/1733)
- chore(deps): update dependency vite-plugin-solid to v2.10.0 [`#1732`](https://github.com/pear-devs/pear-desktop/pull/1732)
- chore(deps): update pnpm to v8.15.2 [`#1729`](https://github.com/pear-devs/pear-desktop/pull/1729)
- Update Copyright - 2024 [`#1730`](https://github.com/pear-devs/pear-desktop/pull/1730)
- chore(deps): update dependency @typescript-eslint/eslint-plugin to v7 [`#1728`](https://github.com/pear-devs/pear-desktop/pull/1728)
- fix(deps): update dependency @floating-ui/dom to v1.6.3 [`#1727`](https://github.com/pear-devs/pear-desktop/pull/1727)
- chore(deps): update dependency electron to v28.2.2 [`#1717`](https://github.com/pear-devs/pear-desktop/pull/1717)
- chore(deps): update dependency vite to v5.1.1 [`#1718`](https://github.com/pear-devs/pear-desktop/pull/1718)
- chore(deps): update dependency @types/semver to v7.5.7 [`#1724`](https://github.com/pear-devs/pear-desktop/pull/1724)
- fix(deps): update dependency @floating-ui/dom to v1.6.2 [`#1725`](https://github.com/pear-devs/pear-desktop/pull/1725)
- chore(deps): update dependency rollup to v4.10.0 [`#1719`](https://github.com/pear-devs/pear-desktop/pull/1719)
- fix(deps): update dependency solid-js to v1.8.14 [`#1713`](https://github.com/pear-devs/pear-desktop/pull/1713)
- chore(deps): update dependency @typescript-eslint/eslint-plugin to v6.21.0 [`#1711`](https://github.com/pear-devs/pear-desktop/pull/1711)
- fix(deps): update dependency semver to v7.6.0 [`#1712`](https://github.com/pear-devs/pear-desktop/pull/1712)
- refactor(in-app-menu): refactor `in-app-menu` plugin [`#1710`](https://github.com/pear-devs/pear-desktop/pull/1710)
- chore(deps): update playwright monorepo to v1.41.2 [`#1706`](https://github.com/pear-devs/pear-desktop/pull/1706)
- chore(deps): update dependency electron to v29.0.0-beta.5 [`#1707`](https://github.com/pear-devs/pear-desktop/pull/1707)
- feat(album-color-theme): support album color theme in all pages [`#1685`](https://github.com/pear-devs/pear-desktop/pull/1685)
- fix(deps): update dependency youtubei.js to v9.0.2 [`#1704`](https://github.com/pear-devs/pear-desktop/pull/1704)
- fix(deps): update dependency i18next to v23.8.2 [`#1702`](https://github.com/pear-devs/pear-desktop/pull/1702)
- feat: Support disabling scrobbling for non-music content [`#1665`](https://github.com/pear-devs/pear-desktop/pull/1665)
- fix(deps): update dependency youtubei.js to v9 [`#1682`](https://github.com/pear-devs/pear-desktop/pull/1682)
- chore(deps): update dependency electron to v29.0.0-beta.4 [`#1698`](https://github.com/pear-devs/pear-desktop/pull/1698)
- fix(deps): update dependency i18next to v23.8.1 [`#1694`](https://github.com/pear-devs/pear-desktop/pull/1694)
- chore(deps): update dependency @typescript-eslint/eslint-plugin to v6.20.0 [`#1700`](https://github.com/pear-devs/pear-desktop/pull/1700)
- chore(deps): update pnpm to v8.15.1 [`#1699`](https://github.com/pear-devs/pear-desktop/pull/1699)
- chore(deps): update dependency esbuild to v0.20.0 [`#1691`](https://github.com/pear-devs/pear-desktop/pull/1691)
- chore(deps): update pnpm to v8.15.0 [`#1692`](https://github.com/pear-devs/pear-desktop/pull/1692)
- fix(deps): update dependency i18next to v23.7.20 [`#1684`](https://github.com/pear-devs/pear-desktop/pull/1684)
- chore(deps): update dependency electron to v29.0.0-beta.3 [`#1683`](https://github.com/pear-devs/pear-desktop/pull/1683)
- chore(deps): update dependency electron to v29.0.0-beta.2 [`#1681`](https://github.com/pear-devs/pear-desktop/pull/1681)
- chore(deps): update dependency rollup to v4.9.6 [`#1663`](https://github.com/pear-devs/pear-desktop/pull/1663)
- chore(deps): update dependency electron to v29.0.0-beta.1 [`#1670`](https://github.com/pear-devs/pear-desktop/pull/1670)
- fix(deps): update dependency i18next to v23.7.19 [`#1680`](https://github.com/pear-devs/pear-desktop/pull/1680)
- chore(deps): update dependency @typescript-eslint/eslint-plugin to v6.19.1 [`#1669`](https://github.com/pear-devs/pear-desktop/pull/1669)
- chore(deps): update pnpm to v8.14.3 [`#1668`](https://github.com/pear-devs/pear-desktop/pull/1668)
- chore(deps): update dependency vite-plugin-inspect to v0.8.3 [`#1672`](https://github.com/pear-devs/pear-desktop/pull/1672)
- chore(deps): update dependency esbuild to v0.19.12 [`#1673`](https://github.com/pear-devs/pear-desktop/pull/1673)
- fix(deps): update dependency @electron/remote to v2.1.2 [`#1676`](https://github.com/pear-devs/pear-desktop/pull/1676)
- chore: Update issue templates [`#1661`](https://github.com/pear-devs/pear-desktop/pull/1661)
- chore(deps): update playwright monorepo to v1.41.1 [`#1660`](https://github.com/pear-devs/pear-desktop/pull/1660)
- fix(deps): update dependency i18next to v23.7.18 [`#1662`](https://github.com/pear-devs/pear-desktop/pull/1662)
- chore(deps): update actions/dependency-review-action action to v4 [`#1654`](https://github.com/pear-devs/pear-desktop/pull/1654)
- chore(deps): update dependency electron to v29.0.0-alpha.11 [`#1656`](https://github.com/pear-devs/pear-desktop/pull/1656)
- chore(deps): update dependency vite to v5.0.12 [security] [`#1659`](https://github.com/pear-devs/pear-desktop/pull/1659)
- fix(deps): update dependency async-mutex to v0.4.1 [`#1653`](https://github.com/pear-devs/pear-desktop/pull/1653)
- chore(deps): update playwright monorepo to v1.41.0 [`#1651`](https://github.com/pear-devs/pear-desktop/pull/1651)
- feat: Better Scrobbler Plugin [`#1640`](https://github.com/pear-devs/pear-desktop/pull/1640)
- chore(deps): update dependency electron to v29.0.0-alpha.10 [`#1645`](https://github.com/pear-devs/pear-desktop/pull/1645)
- chore(deps): update dependency @typescript-eslint/eslint-plugin to v6.19.0 [`#1643`](https://github.com/pear-devs/pear-desktop/pull/1643)
- chore(README): Fix plugins names and add plugins in/to Readme (in menu too) [`#1624`](https://github.com/pear-devs/pear-desktop/pull/1624)
- fix(album-actions): Fixed album actions [`#1639`](https://github.com/pear-devs/pear-desktop/pull/1639)
- chore(deps): update playwright monorepo to v1.41.0-beta-1705101589000 [`#1638`](https://github.com/pear-devs/pear-desktop/pull/1638)
- fix(#1543): fix song control doesn't work [`#1637`](https://github.com/pear-devs/pear-desktop/pull/1637)
- chore(deps): update playwright monorepo to v1.41.0-beta-1705092460000 [`#1635`](https://github.com/pear-devs/pear-desktop/pull/1635)
- chore(deps): update dependency rollup to v4.9.5 [`#1629`](https://github.com/pear-devs/pear-desktop/pull/1629)
- chore(deps): update dependency electron to v29.0.0-alpha.9 [`#1627`](https://github.com/pear-devs/pear-desktop/pull/1627)
- chore(deps): update dependency electron to v29.0.0-alpha.8 [`#1608`](https://github.com/pear-devs/pear-desktop/pull/1608)
- fix(deps): update dependency @cliqz/adblocker-electron to v1.26.15 [`#1615`](https://github.com/pear-devs/pear-desktop/pull/1615)
- chore(deps): update dependency rollup to v4.9.4 [`#1591`](https://github.com/pear-devs/pear-desktop/pull/1591)
- fix(deps): update dependency @cliqz/adblocker-electron-preload to v1.26.15 [`#1616`](https://github.com/pear-devs/pear-desktop/pull/1616)
- chore(deps): update pnpm to v8.14.1 [`#1619`](https://github.com/pear-devs/pear-desktop/pull/1619)
- chore(deps): update dependency eslint-plugin-prettier to v5.1.3 [`#1618`](https://github.com/pear-devs/pear-desktop/pull/1618)
- chore(deps): update dependency @typescript-eslint/eslint-plugin to v6.18.1 [`#1612`](https://github.com/pear-devs/pear-desktop/pull/1612)
- fix(deps): update dependency youtubei.js to v8.2.0 [`#1614`](https://github.com/pear-devs/pear-desktop/pull/1614)
- chore(deps): update dependency electron-vite to v2.0.0 [`#1609`](https://github.com/pear-devs/pear-desktop/pull/1609)
- chore(deps): update dependency @typescript-eslint/eslint-plugin to v6.18.0 [`#1603`](https://github.com/pear-devs/pear-desktop/pull/1603)
- chore(deps): update dependency electron-vite to v2.0.0-beta.4 [`#1602`](https://github.com/pear-devs/pear-desktop/pull/1602)
- fix: fix upgrade button [`#1199`](https://github.com/pear-devs/pear-desktop/issues/1199)
- fix(mpris): fix mpris invalid position [`#1726`](https://github.com/pear-devs/pear-desktop/issues/1726)
- fix: discord RPC (fix #1664) [`#1664`](https://github.com/pear-devs/pear-desktop/issues/1664)
- fix: remove sign-in button (fix #1199) [`#1199`](https://github.com/pear-devs/pear-desktop/issues/1199)
- Fix #1617 [`#1617`](https://github.com/pear-devs/pear-desktop/issues/1617)
- fix(crossfade): fix #1633 [`#1633`](https://github.com/pear-devs/pear-desktop/issues/1633)
- fix: fix #1621 [`#1621`](https://github.com/pear-devs/pear-desktop/issues/1621)
- fix(tuna-obs): partially fix #1596 [`#1596`](https://github.com/pear-devs/pear-desktop/issues/1596)
- fix(discord): fix hide duration button [`#1644`](https://github.com/pear-devs/pear-desktop/issues/1644)
- fix(in-app-menu): fix invalid `margin-top` [`#1597`](https://github.com/pear-devs/pear-desktop/issues/1597)
- fix(README): fix `plugins` path [`#1598`](https://github.com/pear-devs/pear-desktop/issues/1598)
- chore(i18n): Translated using Weblate (Vietnamese) [`0528637`](https://github.com/pear-devs/pear-desktop/commit/05286371353e8b4c36a5b9fe9011ae5dfdc7ee82)
- chore: update pnpm-lock [`fd8d59b`](https://github.com/pear-devs/pear-desktop/commit/fd8d59bada56dab4e156d22394fe0c5efec5abc4)
- fix(in-app-menu): fix app crash in production [`febc63e`](https://github.com/pear-devs/pear-desktop/commit/febc63edef375bd82db48b7fb460ec5a601ab872)
#### [v3.2.2](https://github.com/pear-devs/pear-desktop/compare/v3.2.1...v3.2.2)
> 5 January 2024
- feat(tray): Add song info and paused icon [`#1592`](https://github.com/pear-devs/pear-desktop/pull/1592)
- fix(skip-silences): fix audio distorted [`#1141`](https://github.com/pear-devs/pear-desktop/issues/1141)
- chore(deps): update dependency rollup to v4.9.3 [`0c3c380`](https://github.com/pear-devs/pear-desktop/commit/0c3c3805918adf2a185a7f1dc67ea3af8135863d)
- chore(i18n): Translated using Weblate (Turkish) [`64ea1fd`](https://github.com/pear-devs/pear-desktop/commit/64ea1fdb58fdf2766ae3284ac1a51bfac8894b36)
- fix(music-together): typing [`895386f`](https://github.com/pear-devs/pear-desktop/commit/895386f6f8c649f77ea15c88f6fb7ecc5b775554)
#### [v3.2.1](https://github.com/pear-devs/pear-desktop/compare/v3.2.0...v3.2.1)
> 1 January 2024
- fix: fix #1574 [`#1574`](https://github.com/pear-devs/pear-desktop/issues/1574)
- fix: fix #1575 [`#1575`](https://github.com/pear-devs/pear-desktop/issues/1575)
- chore(i18n): Translated using Weblate [`f5aa179`](https://github.com/pear-devs/pear-desktop/commit/f5aa179cd639eb4b8f70f1264b5b459ebcc16695)
- chore(i18n): Translated using Weblate (English) [`e40916
gitextract_ctpw5b9v/
├── .devcontainer/
│ └── devcontainer.json
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yml
│ │ └── feature_request.yml
│ └── workflows/
│ ├── build.yml
│ ├── dependency-review.yml
│ ├── pr-build-artifacts.yml
│ ├── reviewdog.yml
│ ├── winget-cla.yml
│ └── winget-submission.yml
├── .gitignore
├── .npmrc
├── .prettierrc
├── .vscode/
│ └── launch.json
├── README.md
├── assets/
│ ├── error.html
│ ├── generated/
│ │ └── icons/
│ │ └── mac/
│ │ └── icon.icon/
│ │ └── icon.json
│ └── mdui.css
├── changelog.md
├── electron-builder.yml
├── electron.vite.config.mts
├── eslint.config.mjs
├── license
├── package.json
├── patches/
│ ├── @malept__flatpak-bundler@0.4.0.patch
│ ├── electron-is@3.0.0.patch
│ ├── file-type@16.5.4.patch
│ ├── kuromoji@0.1.2.patch
│ ├── mdui@2.1.4.patch
│ └── vudio@2.1.1.patch
├── renovate.json
├── src/
│ ├── config/
│ │ ├── defaults.ts
│ │ ├── index.ts
│ │ ├── plugins.ts
│ │ └── store.ts
│ ├── custom-electron-prompt.d.ts
│ ├── i18n/
│ │ ├── index.ts
│ │ └── resources/
│ │ ├── @types/
│ │ │ └── index.ts
│ │ ├── ar.json
│ │ ├── az.json
│ │ ├── be.json
│ │ ├── bg.json
│ │ ├── bn.json
│ │ ├── bs.json
│ │ ├── ca.json
│ │ ├── cs.json
│ │ ├── da.json
│ │ ├── de.json
│ │ ├── el.json
│ │ ├── en.json
│ │ ├── es.json
│ │ ├── et.json
│ │ ├── eu.json
│ │ ├── fa.json
│ │ ├── fi.json
│ │ ├── fil.json
│ │ ├── fr.json
│ │ ├── gl.json
│ │ ├── he.json
│ │ ├── hi.json
│ │ ├── hr.json
│ │ ├── hu.json
│ │ ├── id.json
│ │ ├── is.json
│ │ ├── it.json
│ │ ├── ja.json
│ │ ├── ka.json
│ │ ├── kmr.json
│ │ ├── kn.json
│ │ ├── ko.json
│ │ ├── lt.json
│ │ ├── lv.json
│ │ ├── ml.json
│ │ ├── ms.json
│ │ ├── nb.json
│ │ ├── ne.json
│ │ ├── nl.json
│ │ ├── pl.json
│ │ ├── pt-BR.json
│ │ ├── pt.json
│ │ ├── qu.json
│ │ ├── ro.json
│ │ ├── ru.json
│ │ ├── sah.json
│ │ ├── si.json
│ │ ├── sk.json
│ │ ├── sl.json
│ │ ├── sq.json
│ │ ├── sr.json
│ │ ├── sv.json
│ │ ├── ta.json
│ │ ├── te.json
│ │ ├── th.json
│ │ ├── tr.json
│ │ ├── uk.json
│ │ ├── ur.json
│ │ ├── vi.json
│ │ ├── zh-CN.json
│ │ └── zh-TW.json
│ ├── index.html
│ ├── index.ts
│ ├── loader/
│ │ ├── main.ts
│ │ ├── menu.ts
│ │ ├── preload.ts
│ │ └── renderer.ts
│ ├── menu.ts
│ ├── music-player.css
│ ├── navigation.d.ts
│ ├── pear-desktop.ts
│ ├── plugins/
│ │ ├── album-actions/
│ │ │ ├── index.tsx
│ │ │ └── templates/
│ │ │ ├── dislike-button.tsx
│ │ │ ├── index.ts
│ │ │ ├── like-button.tsx
│ │ │ ├── undislike-button.tsx
│ │ │ └── unlike-button.tsx
│ │ ├── album-color-theme/
│ │ │ ├── index.ts
│ │ │ └── style.css
│ │ ├── ambient-mode/
│ │ │ ├── index.ts
│ │ │ ├── menu.ts
│ │ │ ├── style.css
│ │ │ └── types.ts
│ │ ├── amuse/
│ │ │ ├── backend.ts
│ │ │ ├── index.ts
│ │ │ └── types.ts
│ │ ├── api-server/
│ │ │ ├── backend/
│ │ │ │ ├── api-version.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── main.ts
│ │ │ │ ├── routes/
│ │ │ │ │ ├── auth.ts
│ │ │ │ │ ├── control.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── websocket.ts
│ │ │ │ ├── scheme/
│ │ │ │ │ ├── auth.ts
│ │ │ │ │ ├── go-back.ts
│ │ │ │ │ ├── go-forward.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── queue.ts
│ │ │ │ │ ├── search.ts
│ │ │ │ │ ├── seek.ts
│ │ │ │ │ ├── set-fullscreen.ts
│ │ │ │ │ ├── set-volume.ts
│ │ │ │ │ ├── song-info.ts
│ │ │ │ │ └── switch-repeat.ts
│ │ │ │ └── types.ts
│ │ │ ├── config.ts
│ │ │ ├── index.ts
│ │ │ └── menu.ts
│ │ ├── audio-compressor.ts
│ │ ├── auth-proxy-adapter/
│ │ │ ├── backend/
│ │ │ │ ├── index.ts
│ │ │ │ └── types.ts
│ │ │ ├── config.ts
│ │ │ ├── index.ts
│ │ │ └── menu.ts
│ │ ├── blur-nav-bar/
│ │ │ ├── index.ts
│ │ │ └── style.css
│ │ ├── captions-selector/
│ │ │ ├── back.ts
│ │ │ ├── index.ts
│ │ │ ├── renderer.tsx
│ │ │ └── templates/
│ │ │ └── captions-settings-template.tsx
│ │ ├── clock/
│ │ │ ├── index.tsx
│ │ │ ├── style.css
│ │ │ └── types.ts
│ │ ├── compact-sidebar/
│ │ │ └── index.ts
│ │ ├── crossfade/
│ │ │ ├── fader.ts
│ │ │ └── index.ts
│ │ ├── custom-output-device/
│ │ │ ├── index.ts
│ │ │ └── renderer.ts
│ │ ├── disable-autoplay/
│ │ │ └── index.ts
│ │ ├── discord/
│ │ │ ├── constants.ts
│ │ │ ├── discord-service.ts
│ │ │ ├── index.ts
│ │ │ ├── main.ts
│ │ │ ├── menu.ts
│ │ │ ├── timer-manager.ts
│ │ │ └── utils.ts
│ │ ├── downloader/
│ │ │ ├── index.ts
│ │ │ ├── main/
│ │ │ │ ├── index.ts
│ │ │ │ └── utils.ts
│ │ │ ├── menu.ts
│ │ │ ├── renderer.tsx
│ │ │ ├── style.css
│ │ │ ├── templates/
│ │ │ │ └── download.tsx
│ │ │ └── types.ts
│ │ ├── equalizer/
│ │ │ ├── index.ts
│ │ │ └── presets.ts
│ │ ├── exponential-volume/
│ │ │ └── index.ts
│ │ ├── in-app-menu/
│ │ │ ├── constants.ts
│ │ │ ├── index.ts
│ │ │ ├── main.ts
│ │ │ ├── menu.ts
│ │ │ ├── renderer/
│ │ │ │ ├── IconButton.tsx
│ │ │ │ ├── MenuButton.tsx
│ │ │ │ ├── Panel.tsx
│ │ │ │ ├── PanelItem.tsx
│ │ │ │ ├── TitleBar.tsx
│ │ │ │ └── WindowController.tsx
│ │ │ ├── renderer.tsx
│ │ │ └── titlebar.css
│ │ ├── lumiastream/
│ │ │ └── index.ts
│ │ ├── music-together/
│ │ │ ├── connection.ts
│ │ │ ├── element.ts
│ │ │ ├── index.ts
│ │ │ ├── queue/
│ │ │ │ ├── client.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── queue.ts
│ │ │ │ ├── sha1hash.ts
│ │ │ │ ├── song.ts
│ │ │ │ └── utils.ts
│ │ │ ├── style.css
│ │ │ ├── templates/
│ │ │ │ ├── item.html
│ │ │ │ ├── popup.html
│ │ │ │ ├── setting.html
│ │ │ │ └── status.html
│ │ │ ├── types.ts
│ │ │ └── ui/
│ │ │ ├── guest.ts
│ │ │ ├── host.ts
│ │ │ ├── setting.ts
│ │ │ └── status.ts
│ │ ├── navigation/
│ │ │ └── index.tsx
│ │ ├── notifications/
│ │ │ ├── index.ts
│ │ │ ├── interactive.ts
│ │ │ ├── main.ts
│ │ │ ├── menu.ts
│ │ │ └── utils.ts
│ │ ├── performance-improvement/
│ │ │ ├── index.ts
│ │ │ └── scripts/
│ │ │ ├── cpu-tamer/
│ │ │ │ ├── cpu-tamer-by-animationframe.d.ts
│ │ │ │ ├── cpu-tamer-by-animationframe.js
│ │ │ │ ├── cpu-tamer-by-dom-mutation.d.ts
│ │ │ │ ├── cpu-tamer-by-dom-mutation.js
│ │ │ │ └── index.ts
│ │ │ └── rm3/
│ │ │ ├── index.ts
│ │ │ ├── rm3.d.ts
│ │ │ └── rm3.js
│ │ ├── picture-in-picture/
│ │ │ ├── index.ts
│ │ │ ├── keyboardevent-from-electron-accelerator.d.ts
│ │ │ ├── keyboardevents-areequal.d.ts
│ │ │ ├── main.ts
│ │ │ ├── menu.ts
│ │ │ ├── renderer.tsx
│ │ │ ├── style.css
│ │ │ └── templates/
│ │ │ └── picture-in-picture-button.tsx
│ │ ├── playback-speed/
│ │ │ ├── components/
│ │ │ │ └── slider.tsx
│ │ │ ├── index.ts
│ │ │ └── renderer.tsx
│ │ ├── precise-volume/
│ │ │ ├── index.ts
│ │ │ ├── override.ts
│ │ │ ├── renderer.ts
│ │ │ └── volume-hud.css
│ │ ├── quality-changer/
│ │ │ ├── index.tsx
│ │ │ └── templates/
│ │ │ └── quality-setting-button.tsx
│ │ ├── scrobbler/
│ │ │ ├── index.ts
│ │ │ ├── main.ts
│ │ │ ├── menu.ts
│ │ │ └── services/
│ │ │ ├── base.ts
│ │ │ ├── lastfm.ts
│ │ │ └── listenbrainz.ts
│ │ ├── shortcuts/
│ │ │ ├── index.ts
│ │ │ ├── main.ts
│ │ │ ├── menu.ts
│ │ │ ├── mpris-service.d.ts
│ │ │ └── mpris.ts
│ │ ├── skip-disliked-songs/
│ │ │ └── index.ts
│ │ ├── skip-silences/
│ │ │ ├── index.ts
│ │ │ └── renderer.ts
│ │ ├── sponsorblock/
│ │ │ ├── index.ts
│ │ │ ├── segments.ts
│ │ │ ├── tests/
│ │ │ │ └── segments.test.js
│ │ │ └── types.ts
│ │ ├── synced-lyrics/
│ │ │ ├── backend.ts
│ │ │ ├── index.ts
│ │ │ ├── menu.ts
│ │ │ ├── parsers/
│ │ │ │ ├── lrc.test.ts
│ │ │ │ └── lrc.ts
│ │ │ ├── providers/
│ │ │ │ ├── LRCLib.ts
│ │ │ │ ├── LyricsGenius.ts
│ │ │ │ ├── Megalobiz.ts
│ │ │ │ ├── MusixMatch.ts
│ │ │ │ ├── YTMusic.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── renderer.ts
│ │ │ ├── renderer/
│ │ │ │ ├── components/
│ │ │ │ │ ├── ErrorDisplay.tsx
│ │ │ │ │ ├── LoadingKaomoji.tsx
│ │ │ │ │ ├── LyricsPicker.tsx
│ │ │ │ │ ├── NotFoundKaomoji.tsx
│ │ │ │ │ ├── PlainLyrics.tsx
│ │ │ │ │ ├── SyncedLine.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── renderer.tsx
│ │ │ │ ├── store.ts
│ │ │ │ └── utils.tsx
│ │ │ ├── style.css
│ │ │ └── types.ts
│ │ ├── taskbar-mediacontrol/
│ │ │ └── index.ts
│ │ ├── touchbar/
│ │ │ └── index.ts
│ │ ├── transparent-player/
│ │ │ ├── index.ts
│ │ │ ├── style.css
│ │ │ └── types.ts
│ │ ├── tuna-obs/
│ │ │ └── index.ts
│ │ ├── unobtrusive-player/
│ │ │ ├── index.ts
│ │ │ └── style.css
│ │ ├── utils/
│ │ │ ├── common/
│ │ │ │ ├── index.ts
│ │ │ │ └── types.ts
│ │ │ ├── main/
│ │ │ │ ├── css.ts
│ │ │ │ ├── fetch.ts
│ │ │ │ ├── fs.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── types.ts
│ │ │ └── renderer/
│ │ │ ├── check.ts
│ │ │ ├── html.ts
│ │ │ └── index.ts
│ │ ├── video-toggle/
│ │ │ ├── button-switcher.css
│ │ │ ├── force-hide.css
│ │ │ ├── index.tsx
│ │ │ └── templates/
│ │ │ └── video-switch-button.tsx
│ │ └── visualizer/
│ │ ├── butterchurn.d.ts
│ │ ├── empty-player.css
│ │ ├── index.ts
│ │ ├── visualizers/
│ │ │ ├── butterchurn.ts
│ │ │ ├── index.ts
│ │ │ ├── visualizer.ts
│ │ │ ├── vudio.ts
│ │ │ └── wave.ts
│ │ └── vudio.d.ts
│ ├── preload.ts
│ ├── providers/
│ │ ├── app-controls.ts
│ │ ├── decorators.ts
│ │ ├── dom-elements.ts
│ │ ├── extracted-data.ts
│ │ ├── prompt-options.ts
│ │ ├── protocol-handler.ts
│ │ ├── song-controls.ts
│ │ ├── song-info-front.ts
│ │ └── song-info.ts
│ ├── renderer.ts
│ ├── reset.d.ts
│ ├── solit.tsx
│ ├── tray.ts
│ ├── ts-declarations/
│ │ ├── kuroshiro-analyzer-kuromoji.d.ts
│ │ └── kuroshiro.d.ts
│ ├── types/
│ │ ├── contexts.ts
│ │ ├── datahost-get-state.ts
│ │ ├── get-player-response.ts
│ │ ├── icons.ts
│ │ ├── media-icons.ts
│ │ ├── music-player-app-element.ts
│ │ ├── music-player-desktop-internal.ts
│ │ ├── music-player.ts
│ │ ├── player-api-events.ts
│ │ ├── plugins.ts
│ │ ├── queue.ts
│ │ ├── search-box-element.ts
│ │ ├── video-data-changed.ts
│ │ └── video-details.ts
│ ├── utils/
│ │ ├── custom-element.ts
│ │ ├── index.ts
│ │ ├── testing.ts
│ │ ├── trusted-types.ts
│ │ ├── type-utils.ts
│ │ └── wait-for-element.ts
│ ├── virtual-module.d.ts
│ └── yt-web-components.d.ts
├── tests/
│ └── index.test.js
├── tsconfig.json
├── tsconfig.test.json
└── vite-plugins/
├── i18n-importer.mts
├── plugin-importer.mts
└── plugin-loader.mts
SYMBOL INDEX (1172 symbols across 177 files)
FILE: src/config/defaults.ts
type WindowSizeConfig (line 1) | interface WindowSizeConfig {
type WindowPositionConfig (line 6) | interface WindowPositionConfig {
type DefaultConfig (line 11) | interface DefaultConfig {
FILE: src/config/index.ts
type Prev (line 37) | type Prev = [
type Join (line 62) | type Join<K, P> = K extends string | number
type Paths (line 67) | type Paths<T, D extends number = 10> = [D] extends [never]
type SplitKey (line 77) | type SplitKey<K> = K extends `${infer A}.${infer B}` ? [A, B] : [K, stri...
type PathValue (line 78) | type PathValue<T, K extends string> =
FILE: src/config/plugins.ts
function getPlugins (line 10) | function getPlugins() {
function isEnabled (line 14) | async function isEnabled(plugin: string) {
function setOptions (line 28) | function setOptions<T>(
function setMenuOptions (line 49) | function setMenuOptions<T>(
function getOptions (line 60) | function getOptions<T>(plugin: string): T {
function enable (line 64) | function enable(plugin: string) {
function disable (line 68) | function disable(plugin: string) {
FILE: src/config/store.ts
type IStore (line 9) | type IStore = InstanceType<
method '>=3.10.0' (line 14) | '>=3.10.0'(store: IStore) {
method '>=3.3.0' (line 40) | '>=3.3.0'(store: IStore) {
method '>=3.0.0' (line 90) | '>=3.0.0'(store: IStore) {
method '>=2.1.3' (line 112) | '>=2.1.3'(store: IStore) {
method '>=2.1.0' (line 122) | '>=2.1.0'(store: IStore) {
method '>=1.20.0' (line 147) | '>=1.20.0'(store: IStore) {
method '>=1.17.0' (line 162) | '>=1.17.0'(store: IStore) {
method '>=1.14.0' (line 169) | '>=1.14.0'(store: IStore) {
method '>=1.13.0' (line 181) | '>=1.13.0'(store: IStore) {
method '>=1.12.0' (line 186) | '>=1.12.0'(store: IStore) {
method '>=1.11.0' (line 224) | '>=1.11.0'(store: IStore) {
method '>=1.7.0' (line 229) | '>=1.7.0'(store: IStore) {
FILE: src/custom-electron-prompt.d.ts
type SelectOptions (line 4) | type SelectOptions = Record<string, string>;
type CounterOptions (line 6) | interface CounterOptions {
type KeybindOptions (line 12) | interface KeybindOptions {
type InputOptions (line 18) | interface InputOptions {
type BasePromptOptions (line 25) | interface BasePromptOptions<T extends string> {
type InputPromptOptions (line 49) | type InputPromptOptions = BasePromptOptions<'input'>;
type SelectPromptOptions (line 50) | interface SelectPromptOptions extends BasePromptOptions<'select'> {
type CounterPromptOptions (line 53) | interface CounterPromptOptions extends BasePromptOptions<'counter'> {
type MultiInputPromptOptions (line 56) | interface MultiInputPromptOptions
type KeybindPromptOptions (line 60) | interface KeybindPromptOptions extends BasePromptOptions<'keybind'> {
type PromptOptions (line 64) | type PromptOptions<T extends string> = T extends 'input'
type PromptResult (line 76) | type PromptResult<T extends string> = T extends 'input'
FILE: src/i18n/index.ts
constant APPLICATION_NAME (line 5) | const APPLICATION_NAME =
FILE: src/i18n/resources/@types/index.ts
type LanguageResources (line 1) | interface LanguageResources {
FILE: src/index.ts
function onClosed (line 173) | function onClosed() {
function initTheme (line 292) | function initTheme(win: BrowserWindow) {
function createMainWindow (line 321) | async function createMainWindow() {
function showUnresponsiveDialog (line 883) | function showUnresponsiveDialog(
function removeContentSecurityPolicy (line 924) | function removeContentSecurityPolicy(
FILE: src/menu.ts
type MenuTemplate (line 29) | type MenuTemplate = Electron.MenuItemConstructorOptions[];
method click (line 47) | click(item: Electron.MenuItem) {
method click (line 168) | click(item: MenuItem) {
method click (line 176) | click(item: MenuItem) {
method click (line 188) | click() {
method click (line 196) | click() {
method click (line 212) | click(item: MenuItem) {
method click (line 223) | async click() {
method click (line 264) | click() {
method click (line 274) | click() {
method click (line 284) | click() {
method click (line 294) | click(item: MenuItem) {
method click (line 320) | async click() {
method click (line 358) | async click() {
method click (line 377) | click(item: MenuItem) {
method click (line 389) | click(item: MenuItem) {
method click (line 400) | click(item) {
method click (line 425) | click(item) {
method click (line 438) | click() {
method click (line 450) | click() {
method click (line 462) | click() {
method click (line 474) | click(item: MenuItem) {
method click (line 491) | click() {
method click (line 503) | click() {
method click (line 530) | async click(item: MenuItem) {
method click (line 540) | click(item: MenuItem) {
method click (line 550) | click(item: MenuItem) {
method click (line 563) | click(item: MenuItem) {
method click (line 576) | click(item: MenuItem) {
method click (line 587) | click() {
method click (line 606) | click() {
method click (line 664) | click() {
method click (line 672) | click() {
method click (line 680) | click() {
function setProxy (line 730) | async function setProxy(item: Electron.MenuItem, win: BrowserWindow) {
FILE: src/navigation.d.ts
type NavigationOptions (line 3) | interface NavigationOptions {
type NavigationHistoryEntry (line 7) | interface NavigationHistoryEntry extends EventTarget {
type NavigationTransition (line 17) | interface NavigationTransition {
type NavigationResult (line 23) | interface NavigationResult {
type NavigationNavigateOptions (line 28) | interface NavigationNavigateOptions extends NavigationOptions {
type NavigationReloadOptions (line 33) | interface NavigationReloadOptions extends NavigationOptions {
type NavigationUpdateCurrentEntryOptions (line 37) | interface NavigationUpdateCurrentEntryOptions {
type NavigationEventsMap (line 41) | interface NavigationEventsMap {
type Navigation (line 48) | interface Navigation extends EventTarget {
class NavigateEvent (line 71) | class NavigateEvent extends Event {
type NavigationHistoryBehavior (line 86) | type NavigationHistoryBehavior = 'auto' | 'push' | 'replace';
FILE: src/plugins/album-actions/index.tsx
method start (line 40) | start() {
method onPageChange (line 52) | async onPageChange() {
method loadFullList (line 210) | loadFullList(event: MouseEvent) {
method applyToList (line 231) | applyToList(id: string, loader: HTMLElement) {
method stop (line 263) | stop() {
FILE: src/plugins/album-actions/templates/dislike-button.tsx
type DislikeButtonProps (line 1) | interface DislikeButtonProps {
FILE: src/plugins/album-actions/templates/like-button.tsx
type LikeButtonProps (line 1) | interface LikeButtonProps {
FILE: src/plugins/album-actions/templates/undislike-button.tsx
type UnDislikeButtonProps (line 1) | interface UnDislikeButtonProps {
FILE: src/plugins/album-actions/templates/unlike-button.tsx
type UnLikeButtonProps (line 1) | interface UnLikeButtonProps {
FILE: src/plugins/album-color-theme/index.ts
constant COLOR_KEY (line 9) | const COLOR_KEY = '--ytmusic-album-color';
constant DARK_COLOR_KEY (line 10) | const DARK_COLOR_KEY = '--ytmusic-album-color-dark';
constant RATIO_KEY (line 11) | const RATIO_KEY = '--ytmusic-album-color-ratio';
type Config (line 13) | type Config = {
type Renderer (line 19) | type Renderer = {
method click (line 57) | click() {
method click (line 66) | click(item) {
method start (line 83) | start() {
method onPlayerApiReady (line 99) | async onPlayerApiReady(playerApi, { getConfig }) {
method onConfigChange (line 156) | onConfigChange(config) {
method getMixedColor (line 164) | getMixedColor(
method updateColor (line 180) | updateColor(alpha: number) {
FILE: src/plugins/ambient-mode/index.ts
method start (line 44) | async start({ getConfig }) {
method onConfigChange (line 258) | onConfigChange(newConfig) {
method stop (line 269) | stop() {
FILE: src/plugins/ambient-mode/menu.ts
type menuParameters (line 7) | interface menuParameters {
method click (line 43) | click() {
method click (line 56) | click() {
method click (line 67) | click() {
method click (line 80) | click() {
method click (line 93) | click() {
method click (line 106) | click() {
method click (line 115) | click(item: Electron.MenuItem) {
FILE: src/plugins/ambient-mode/types.ts
type AmbientModePluginConfig (line 1) | type AmbientModePluginConfig = {
FILE: src/plugins/amuse/backend.ts
method start (line 38) | start() {
method stop (line 66) | stop() {
FILE: src/plugins/amuse/index.ts
type MusicWidgetConfig (line 5) | interface MusicWidgetConfig {
FILE: src/plugins/amuse/types.ts
type PlayerInfo (line 1) | interface PlayerInfo {
type TrackInfo (line 7) | interface TrackInfo {
type AmuseSongInfo (line 17) | interface AmuseSongInfo {
FILE: src/plugins/api-server/backend/api-version.ts
constant API_VERSION (line 1) | const API_VERSION = 'v1';
FILE: src/plugins/api-server/backend/main.ts
method start (line 30) | async start(ctx) {
method stop (line 59) | stop() {
method onConfigChange (line 62) | onConfigChange(config) {
method init (line 81) | init(backendCtx) {
method run (line 167) | run(config) {
method end (line 199) | end() {
FILE: src/plugins/api-server/backend/routes/control.ts
type PromiseOrValue (line 570) | type PromiseOrValue<T> = T | Promise<T>;
FILE: src/plugins/api-server/backend/routes/websocket.ts
type DataTypes (line 20) | enum DataTypes {
type PlayerState (line 30) | type PlayerState = {
method onOpen (line 132) | onOpen(_, ws) {
method onClose (line 149) | onClose(_, ws) {
FILE: src/plugins/api-server/backend/scheme/auth.ts
type JWTPayload (line 3) | type JWTPayload = z.infer<typeof JWTPayloadSchema>;
FILE: src/plugins/api-server/backend/scheme/song-info.ts
type ResponseSongInfo (line 5) | type ResponseSongInfo = z.infer<typeof SongInfoSchema>;
FILE: src/plugins/api-server/backend/types.ts
type HonoApp (line 9) | type HonoApp = Hono;
type BackendType (line 10) | type BackendType = {
FILE: src/plugins/api-server/config.ts
type AuthStrategy (line 1) | enum AuthStrategy {
type APIServerConfig (line 6) | interface APIServerConfig {
FILE: src/plugins/api-server/menu.ts
method click (line 27) | async click() {
method click (line 51) | async click() {
method click (line 83) | click() {
method click (line 91) | click() {
method click (line 105) | click(menuItem) {
method click (line 112) | async click() {
method click (line 129) | async click() {
FILE: src/plugins/audio-compressor.ts
class Storage (line 27) | class Storage {
method onPlayerApiReady (line 113) | onPlayerApiReady(playerApi) {
method start (line 117) | start() {
method stop (line 128) | stop() {
FILE: src/plugins/auth-proxy-adapter/backend/index.ts
method start (line 30) | async start(ctx: BackendContext<AuthProxyConfig>) {
method stop (line 34) | stop() {
method onConfigChange (line 37) | onConfigChange(config: AuthProxyConfig) {
method startServer (line 53) | startServer(serverConfig: AuthProxyConfig) {
method handleSocks5 (line 100) | handleSocks5(
method processSocks5Request (line 126) | processSocks5Request(
method stopServer (line 238) | stopServer() {
FILE: src/plugins/auth-proxy-adapter/backend/types.ts
type BackendType (line 5) | type BackendType = {
FILE: src/plugins/auth-proxy-adapter/config.ts
type AuthProxyConfig (line 1) | interface AuthProxyConfig {
FILE: src/plugins/auth-proxy-adapter/menu.ts
method click (line 21) | async click() {
method click (line 45) | async click() {
FILE: src/plugins/blur-nav-bar/index.ts
method start (line 14) | async start() {
method stop (line 23) | async stop() {
FILE: src/plugins/captions-selector/back.ts
method start (line 8) | start({ ipc: { handle }, window }) {
method stop (line 30) | stop({ ipc: { removeHandler } }) {
FILE: src/plugins/captions-selector/index.ts
method menu (line 36) | async menu({ getConfig, setConfig }) {
FILE: src/plugins/captions-selector/renderer.tsx
type LanguageOptions (line 12) | interface LanguageOptions {
type CaptionsSelectorConfig (line 25) | interface CaptionsSelectorConfig {
method videoChangeListener (line 47) | videoChangeListener() {
method start (line 69) | async start({ getConfig }) {
method stop (line 72) | stop() {
method onPlayerApiReady (line 83) | onPlayerApiReady(playerApi, { ipc, setConfig }) {
method onConfigChange (line 161) | onConfigChange(newConfig) {
FILE: src/plugins/captions-selector/templates/captions-settings-template.tsx
type CaptionsSettingsButtonProps (line 1) | interface CaptionsSettingsButtonProps {
FILE: src/plugins/clock/index.tsx
method click (line 34) | click(item) {
method click (line 42) | click(item) {
method start (line 58) | async start({ getConfig }) {
method onConfigChange (line 96) | onConfigChange(newConfig) {
method stop (line 101) | stop() {
FILE: src/plugins/clock/types.ts
type ClockPluginConfig (line 1) | type ClockPluginConfig = {
FILE: src/plugins/compact-sidebar/index.ts
method isCompactSidebarDisabled (line 20) | isCompactSidebarDisabled() {
method start (line 27) | start() {
method stop (line 32) | stop() {
method onConfigChange (line 37) | onConfigChange() {
FILE: src/plugins/crossfade/fader.ts
type VolumeLogger (line 29) | type VolumeLogger = <Params extends unknown[]>(
type VolumeFaderOptions (line 33) | interface VolumeFaderOptions {
type VolumeFade (line 52) | interface VolumeFade {
class VolumeFader (line 65) | class VolumeFader {
method constructor (line 84) | constructor(media: HTMLMediaElement, options: VolumeFaderOptions) {
method start (line 197) | start() {
method stop (line 214) | stop() {
method setFadeDuration (line 230) | setFadeDuration(fadeDuration: number) {
method fadeTo (line 255) | fadeTo(targetVolume: number, callback?: () => void) {
method fadeIn (line 286) | fadeIn(callback: () => void) {
method fadeOut (line 290) | fadeOut(callback: () => void) {
method updateVolume (line 298) | updateVolume() {
method exponentialScaler (line 347) | exponentialScaler(input: number, dynamicRange: number) {
method logarithmicScaler (line 370) | logarithmicScaler(input: number, dynamicRange: number) {
FILE: src/plugins/crossfade/index.ts
type CrossfadePluginConfig (line 17) | type CrossfadePluginConfig = {
method menu (line 65) | menu({ window, getConfig, setConfig }) {
method backend (line 169) | async backend({ ipc }) {
method start (line 181) | async start({ ipc, getConfig }) {
method onConfigChange (line 185) | onConfigChange(newConfig) {
method onPlayerApiReady (line 188) | onPlayerApiReady() {
FILE: src/plugins/custom-output-device/index.ts
type CustomOutputPluginConfig (line 8) | interface CustomOutputPluginConfig {
FILE: src/plugins/custom-output-device/renderer.ts
method audioCanPlayHandler (line 46) | async audioCanPlayHandler({ detail: { audioContext } }) {
method onPlayerApiReady (line 51) | async onPlayerApiReady(_: MusicPlayer, context) {
method stop (line 64) | stop() {
method onConfigChange (line 72) | async onConfigChange(config) {
FILE: src/plugins/disable-autoplay/index.ts
type DisableAutoPlayPluginConfig (line 8) | type DisableAutoPlayPluginConfig = {
method click (line 39) | async click() {
method eventListener (line 51) | eventListener(event: CustomEvent<VideoDataChanged>) {
method timeUpdateListener (line 65) | timeUpdateListener(e: Event) {
method start (line 70) | async start({ getConfig }) {
method onPlayerApiReady (line 73) | onPlayerApiReady(api) {
method stop (line 78) | stop() {
method onConfigChange (line 81) | onConfigChange(newConfig) {
FILE: src/plugins/discord/constants.ts
constant PROGRESS_THROTTLE_MS (line 8) | const PROGRESS_THROTTLE_MS = 15_000;
constant TIME_UPDATE_DEBOUNCE_MS (line 12) | const TIME_UPDATE_DEBOUNCE_MS = 5000;
constant HANGUL_FILLER (line 16) | const HANGUL_FILLER = '\u3164';
type TimerKey (line 21) | enum TimerKey {
FILE: src/plugins/discord/discord-service.ts
class DiscordService (line 21) | class DiscordService {
method constructor (line 57) | constructor(
method initializeRpc (line 68) | private initializeRpc() {
method buildActivityInfo (line 108) | private buildActivityInfo(
method setActivityTimeout (line 154) | private setActivityTimeout() {
method resetInfo (line 176) | private resetInfo() {
method connectWithRetry (line 190) | private connectWithRetry(): Promise<void> {
method connect (line 238) | connect(showErrorDialog = false): void {
method disconnect (line 272) | disconnect(): void {
method updateActivity (line 291) | updateActivity(songInfo: SongInfo): void {
method clearActivity (line 383) | clearActivity(): void {
method onConfigChange (line 397) | onConfigChange(newConfig: DiscordPluginConfig): void {
method registerRefreshCallback (line 412) | registerRefreshCallback(cb: () => void): void {
method isConnected (line 420) | isConnected(): boolean {
method cleanup (line 429) | cleanup(): void {
FILE: src/plugins/discord/index.ts
type DiscordPluginConfig (line 8) | type DiscordPluginConfig = {
FILE: src/plugins/discord/main.ts
method start (line 22) | async start(ctx) {
method stop (line 57) | stop() {
method onConfigChange (line 61) | onConfigChange(newConfig) {
FILE: src/plugins/discord/menu.ts
method click (line 49) | click(item: Electron.MenuItem) {
method click (line 63) | click(item: Electron.MenuItem) {
method click (line 76) | click(item: Electron.MenuItem) {
method click (line 87) | click(item: Electron.MenuItem) {
method click (line 97) | click(item: Electron.MenuItem) {
method click (line 124) | click() {
function setInactivityTimeout (line 134) | async function setInactivityTimeout(
FILE: src/plugins/discord/timer-manager.ts
class TimerManager (line 6) | class TimerManager {
method set (line 15) | set(key: TimerKey, fn: () => void, delay: number): void {
method clear (line 24) | clear(key: TimerKey): void {
method clearAll (line 35) | clearAll(): void {
FILE: src/plugins/discord/utils.ts
function sanitizeActivityText (line 28) | function sanitizeActivityText(input: string | undefined, fallback: strin...
FILE: src/plugins/downloader/index.ts
type DownloaderPluginConfig (line 11) | type DownloaderPluginConfig = {
FILE: src/plugins/downloader/main/index.ts
type CustomSongInfo (line 50) | type CustomSongInfo = SongInfo & { trackId?: string };
method logger (line 55) | logger() {}
method progress (line 56) | progress() {}
function downloadSong (line 230) | async function downloadSong(
function downloadSongFromId (line 251) | async function downloadSongFromId(
function downloadSongOnFinishSetup (line 272) | function downloadSongOnFinishSetup({
function downloadSongUnsafe (line 327) | async function downloadSongUnsafe(
function downloadChunks (line 490) | async function downloadChunks(
function iterableStreamToProcessedUint8Array (line 516) | async function iterableStreamToProcessedUint8Array(
function writeID3 (line 594) | async function writeID3(
function downloadPlaylist (line 634) | async function downloadPlaylist(givenUrl?: string | URL) {
function getFFmpegMetadataArgs (line 826) | function getFFmpegMetadataArgs(metadata: CustomSongInfo) {
constant INVALID_PLAYLIST_MODIFIER (line 840) | const INVALID_PLAYLIST_MODIFIER = 'RDAMPL';
FILE: src/plugins/downloader/menu.ts
method click (line 35) | click(item) {
method click (line 52) | click() {
method click (line 84) | click() {
method click (line 102) | click() {
method click (line 120) | async click() {
method click (line 188) | click() {
method click (line 204) | click() {
method click (line 213) | click(item) {
FILE: src/plugins/downloader/types.ts
type Preset (line 1) | interface Preset {
type VideoFormat (line 22) | interface VideoFormat {
FILE: src/plugins/equalizer/index.ts
type EqualizerPluginConfig (line 14) | type EqualizerPluginConfig = {
method click (line 46) | click() {
method start (line 56) | async start({ getConfig }) {
method stop (line 83) | stop() {
FILE: src/plugins/equalizer/presets.ts
type Preset (line 2) | type Preset = (typeof defaultPresets)[number];
type FilterConfig (line 4) | type FilterConfig = {
FILE: src/plugins/exponential-volume/index.ts
method onPlayerApiReady (line 14) | onPlayerApiReady(playerApi) {
FILE: src/plugins/in-app-menu/constants.ts
type InAppMenuConfig (line 1) | interface InAppMenuConfig {
FILE: src/plugins/in-app-menu/menu.ts
method click (line 21) | click(item) {
FILE: src/plugins/in-app-menu/renderer/IconButton.tsx
type CollapseIconButtonProps (line 39) | type CollapseIconButtonProps = JSX.HTMLAttributes<HTMLButtonElement>;
FILE: src/plugins/in-app-menu/renderer/MenuButton.tsx
type MenuButtonProps (line 34) | type MenuButtonProps = JSX.HTMLAttributes<HTMLLIElement> & {
FILE: src/plugins/in-app-menu/renderer/Panel.tsx
type Placement (line 69) | type Placement =
type PanelProps (line 82) | type PanelProps = JSX.HTMLAttributes<HTMLUListElement> & {
method apply (line 107) | apply({ elements, availableWidth, availableHeight }) {
FILE: src/plugins/in-app-menu/renderer/PanelItem.tsx
type BasePanelItemProps (line 152) | type BasePanelItemProps = {
type NormalPanelItemProps (line 159) | type NormalPanelItemProps = BasePanelItemProps & {
type SubmenuItemProps (line 163) | type SubmenuItemProps = BasePanelItemProps & {
type RadioPanelItemProps (line 168) | type RadioPanelItemProps = BasePanelItemProps & {
type CheckboxPanelItemProps (line 173) | type CheckboxPanelItemProps = BasePanelItemProps & {
type PanelItemProps (line 178) | type PanelItemProps =
method apply (line 197) | apply({ rects, elements }) {
FILE: src/plugins/in-app-menu/renderer/TitleBar.tsx
type PanelRendererProps (line 108) | type PanelRendererProps = {
type TitleBarProps (line 181) | type TitleBarProps = {
FILE: src/plugins/in-app-menu/renderer/WindowController.tsx
type WindowControllerProps (line 23) | type WindowControllerProps = {
FILE: src/plugins/lumiastream/index.ts
type LumiaData (line 7) | type LumiaData = {
method backend (line 33) | backend({ ipc }) {
FILE: src/plugins/music-together/connection.ts
type ConnectionEventMap (line 5) | type ConnectionEventMap = {
type ConnectionEventUnion (line 20) | type ConnectionEventUnion = {
type PromiseUtil (line 28) | type PromiseUtil<T> = {
type ConnectionListener (line 34) | type ConnectionListener = (
type ConnectionMode (line 38) | type ConnectionMode = 'host' | 'guest' | 'disconnected';
class Connection (line 39) | class Connection {
method constructor (line 48) | constructor() {
method waitForReady (line 120) | async waitForReady() {
method connect (line 124) | async connect(id: string) {
method disconnect (line 133) | disconnect() {
method id (line 153) | public get id() {
method mode (line 157) | public get mode() {
method getConnections (line 161) | public getConnections() {
method broadcast (line 165) | public async broadcast<Event extends keyof ConnectionEventMap>(
method on (line 177) | public on(listener: ConnectionListener) {
method onConnections (line 183) | public onConnections(listener: (connections?: DataConnection) => void) {
method registerConnection (line 188) | private async registerConnection(conn: DataConnection) {
FILE: src/plugins/music-together/element.ts
type Placement (line 6) | type Placement =
type PopupItem (line 18) | type PopupItem =
type PopupProps (line 23) | type PopupProps = {
method show (line 68) | show(x: number, y: number, anchor?: HTMLElement) {
method showAtAnchor (line 102) | showAtAnchor(anchor: HTMLElement) {
method isShowing (line 107) | isShowing() {
method dismiss (line 111) | dismiss() {
type ItemRendererProps (line 118) | type ItemRendererProps = {
method setIcon (line 140) | setIcon(icon: Element) {
method setText (line 143) | setText(text: string) {
FILE: src/plugins/music-together/index.ts
type RawAccountData (line 29) | type RawAccountData = {
method backend (line 92) | backend({ ipc }) {
method videoChangeListener (line 121) | async videoChangeListener(event: CustomEvent<VideoDataChanged>) {
method videoStateChangeListener (line 146) | async videoStateChangeListener() {
method onHost (line 162) | async onHost() {
method onJoin (line 387) | async onJoin() {
method onStop (line 646) | onStop() {
method putProfile (line 667) | putProfile(id: string, profile?: Profile) {
method showSpinner (line 678) | showSpinner() {
method hideSpinner (line 684) | hideSpinner() {
method initMyProfile (line 690) | async initMyProfile() {
method start (line 731) | start({ ipc }) {
method onPlayerApiReady (line 904) | onPlayerApiReady(playerApi) {
method stop (line 920) | stop() {
FILE: src/plugins/music-together/queue/queue.ts
type QueueOptions (line 105) | type QueueOptions = {
type QueueEventListener (line 111) | type QueueEventListener = (event: ConnectionEventUnion) => void;
class Queue (line 113) | class Queue {
method constructor (line 128) | constructor(options: QueueOptions) {
method videoList (line 139) | get videoList() {
method selectedIndex (line 143) | get selectedIndex() {
method rawItems (line 152) | get rawItems() {
method flatItems (line 156) | get flatItems() {
method setOwner (line 160) | setOwner(owner: Profile) {
method setVideoList (line 165) | async setVideoList(videoList: VideoData[], sync = true) {
method addVideos (line 171) | async addVideos(videos: VideoData[], index?: number) {
method removeVideo (line 230) | removeVideo(index: number) {
method setIndex (line 244) | setIndex(index: number) {
method moveItem (line 253) | moveItem(fromIndex: number, toIndex: number) {
method clear (line 271) | clear() {
method on (line 280) | on(listener: QueueEventListener) {
method off (line 286) | off(listener: QueueEventListener) {
method rollbackInjection (line 290) | rollbackInjection() {
method injection (line 301) | injection() {
method initQueue (line 491) | initQueue() {
method syncVideo (line 509) | async syncVideo() {
method syncQueueOwner (line 537) | syncQueueOwner() {
method removeQueueOwner (line 588) | removeQueueOwner() {
method broadcast (line 608) | private broadcast(event: ConnectionEventUnion) {
FILE: src/plugins/music-together/queue/song.ts
type QueueRendererResponse (line 4) | type QueueRendererResponse = {
FILE: src/plugins/music-together/types.ts
type Profile (line 1) | type Profile = {
type VideoData (line 7) | type VideoData = {
type Permission (line 11) | type Permission = 'host-only' | 'playlist' | 'all';
FILE: src/plugins/music-together/ui/guest.ts
type GuestPopupProps (line 10) | type GuestPopupProps = {
FILE: src/plugins/music-together/ui/host.ts
type HostPopupProps (line 11) | type HostPopupProps = {
FILE: src/plugins/music-together/ui/setting.ts
type SettingPopupProps (line 11) | type SettingPopupProps = {
FILE: src/plugins/navigation/index.tsx
method start (line 20) | start() {
method stop (line 55) | stop() {
FILE: src/plugins/notifications/index.ts
type NotificationsPluginConfig (line 7) | interface NotificationsPluginConfig {
FILE: src/plugins/notifications/interactive.ts
type Accessor (line 26) | type Accessor<T> = () => T;
FILE: src/plugins/performance-improvement/index.ts
method renderer (line 15) | renderer() {
FILE: src/plugins/performance-improvement/scripts/cpu-tamer/cpu-tamer-by-animationframe.js
method constructor (line 44) | constructor(cb = h) {
FILE: src/plugins/performance-improvement/scripts/cpu-tamer/cpu-tamer-by-dom-mutation.js
method constructor (line 44) | constructor(cb = h) {
FILE: src/plugins/performance-improvement/scripts/rm3/rm3.d.ts
class Rm3LinkedArrayNode (line 1) | class Rm3LinkedArrayNode<T> {
class Rm3LinkedArray (line 8) | class Rm3LinkedArray<T> {
class Rm3LimitedSizeSet (line 34) | class Rm3LimitedSizeSet<T> extends Set<T> {
type Rm3EntryRecord (line 43) | type Rm3EntryRecord = [
type Rm3 (line 53) | interface Rm3 {
FILE: src/plugins/performance-improvement/scripts/rm3/rm3.js
function uniq (line 42) | function uniq(array) {
class Node (line 69) | class Node {
method constructor (line 70) | constructor(value) {
class LinkedArray (line 77) | class LinkedArray {
method constructor (line 78) | constructor() {
method push (line 84) | push(value) {
method pop (line 98) | pop() {
method unshift (line 113) | unshift(value) {
method shift (line 127) | shift() {
method size (line 142) | size() {
method getNode (line 147) | getNode(index) {
method get (line 173) | get(index) {
method findNode (line 179) | findNode(value) {
method toArray (line 192) | toArray() {
method insertBeforeNode (line 203) | insertBeforeNode(node, newValue) {
method insertAfterNode (line 227) | insertAfterNode(node, newValue) {
method insertBefore (line 251) | insertBefore(existingValue, newValue) {
method insertAfter (line 258) | insertAfter(existingValue, newValue) {
method deleteNode (line 265) | deleteNode(node) {
class LimitedSizeSet (line 301) | class LimitedSizeSet extends Set {
method constructor (line 302) | constructor(n) {
method add (line 307) | add(key) {
method removeAdd (line 321) | removeAdd(key) {
function digestMessage (line 513) | async function digestMessage(message) {
FILE: src/plugins/picture-in-picture/index.ts
type PictureInPicturePluginConfig (line 9) | type PictureInPicturePluginConfig = {
FILE: src/plugins/picture-in-picture/keyboardevent-from-electron-accelerator.d.ts
type KeyboardEvent (line 2) | interface KeyboardEvent {
FILE: src/plugins/picture-in-picture/keyboardevents-areequal.d.ts
type KeyboardEvent (line 2) | interface KeyboardEvent {
FILE: src/plugins/picture-in-picture/menu.ts
method click (line 24) | click(item) {
method click (line 33) | click(item) {
method click (line 41) | click(item) {
method click (line 49) | async click(item) {
method click (line 84) | click(item) {
FILE: src/plugins/picture-in-picture/templates/picture-in-picture-button.tsx
type PictureInPictureButtonProps (line 1) | interface PictureInPictureButtonProps {
FILE: src/plugins/playback-speed/components/slider.tsx
type PlaybackSpeedSliderProps (line 1) | interface PlaybackSpeedSliderProps {
FILE: src/plugins/playback-speed/renderer.tsx
constant MIN_PLAYBACK_SPEED (line 15) | const MIN_PLAYBACK_SPEED = 0.07;
constant MAX_PLAYBACK_SPEED (line 16) | const MAX_PLAYBACK_SPEED = 16;
FILE: src/plugins/precise-volume/index.ts
type PreciseVolumePluginConfig (line 12) | type PreciseVolumePluginConfig = {
function changeOptions (line 50) | function changeOptions(
function promptVolumeSteps (line 75) | async function promptVolumeSteps(options: PreciseVolumePluginConfig) {
function promptGlobalShortcuts (line 95) | async function promptGlobalShortcuts(
method click (line 151) | click(item) {
method backend (line 171) | async backend({ getConfig, ipc }) {
method start (line 188) | start() {
FILE: src/plugins/precise-volume/override.ts
function overrideAddEventListener (line 8) | function overrideAddEventListener() {
FILE: src/plugins/precise-volume/renderer.ts
function $ (line 8) | function $<E extends Element = Element>(selector: string) {
function firstRun (line 48) | async function firstRun() {
function injectVolumeHud (line 81) | function injectVolumeHud(noVid: boolean) {
function showVolumeHud (line 102) | function showVolumeHud(volume: number) {
function setupVideoPlayerOnwheel (line 115) | function setupVideoPlayerOnwheel() {
function saveVolume (line 126) | function saveVolume(volume: number) {
function setupPlaybar (line 132) | function setupPlaybar() {
function setupSliderObserver (line 155) | function setupSliderObserver() {
function setVolume (line 185) | function setVolume(value: number) {
function changeVolume (line 202) | function changeVolume(toIncrease: boolean) {
function updateVolumeSlider (line 212) | function updateVolumeSlider() {
function showVolumeSlider (line 225) | function showVolumeSlider() {
function setTooltip (line 243) | function setTooltip(volume: number) {
function setupLocalArrowShortcuts (line 252) | function setupLocalArrowShortcuts() {
FILE: src/plugins/quality-changer/index.tsx
method backend (line 20) | backend({ ipc, window }) {
method onPlayerApiReady (line 47) | onPlayerApiReady(api: MusicPlayer, context) {
method stop (line 92) | stop() {
FILE: src/plugins/quality-changer/templates/quality-setting-button.tsx
type QualitySettingButtonProps (line 1) | interface QualitySettingButtonProps {
FILE: src/plugins/scrobbler/index.ts
type ScrobblerPluginConfig (line 7) | interface ScrobblerPluginConfig {
FILE: src/plugins/scrobbler/main.ts
type SetConfType (line 17) | type SetConfType = (
method toggleScrobblers (line 40) | toggleScrobblers(config: ScrobblerPluginConfig, window: BrowserWindow) {
method createSessions (line 57) | async createSessions(config: ScrobblerPluginConfig, setConfig: SetConfTy...
method start (line 65) | async start({ getConfig, setConfig, window }) {
method onConfigChange (line 118) | async onConfigChange(newConfig: ScrobblerPluginConfig) {
FILE: src/plugins/scrobbler/menu.ts
function promptLastFmOptions (line 14) | async function promptLastFmOptions(
function promptListenbrainzOptions (line 60) | async function promptListenbrainzOptions(
method click (line 94) | click(item) {
method click (line 103) | click(item) {
method click (line 112) | click(item) {
method click (line 124) | click(item) {
method click (line 132) | click() {
method click (line 145) | click(item) {
method click (line 153) | click() {
FILE: src/plugins/scrobbler/services/lastfm.ts
type LastFmData (line 13) | interface LastFmData {
type LastFmSongData (line 18) | interface LastFmSongData {
class LastFmScrobbler (line 31) | class LastFmScrobbler extends ScrobblerBase {
method constructor (line 34) | constructor(mainWindow: BrowserWindow) {
method isSessionCreated (line 40) | override isSessionCreated(config: ScrobblerPluginConfig): boolean {
method createSession (line 44) | override async createSession(
method setNowPlaying (line 84) | override setNowPlaying(
method addScrobble (line 100) | override addScrobble(
method postSongDataToAPI (line 119) | private async postSongDataToAPI(
FILE: src/plugins/scrobbler/services/listenbrainz.ts
type ListenbrainzRequestBody (line 10) | interface ListenbrainzRequestBody {
class ListenbrainzScrobbler (line 28) | class ListenbrainzScrobbler extends ScrobblerBase {
method isSessionCreated (line 29) | override isSessionCreated(): boolean {
method createSession (line 33) | override createSession(
method setNowPlaying (line 40) | override setNowPlaying(
method addScrobble (line 56) | override addScrobble(
function createRequestBody (line 75) | function createRequestBody(
function submitListen (line 112) | function submitListen(
FILE: src/plugins/shortcuts/index.ts
type ShortcutMappingType (line 6) | type ShortcutMappingType = {
type ShortcutsPluginConfig (line 11) | type ShortcutsPluginConfig = {
FILE: src/plugins/shortcuts/main.ts
function _registerGlobalShortcut (line 12) | function _registerGlobalShortcut(
function _registerLocalShortcut (line 22) | function _registerLocalShortcut(
function registerAllShortcuts (line 61) | function registerAllShortcuts(container: ShortcutMappingType, type: stri...
FILE: src/plugins/shortcuts/menu.ts
function promptKeybind (line 28) | async function promptKeybind(
FILE: src/plugins/shortcuts/mpris-service.d.ts
type RootInterfaceOptions (line 6) | interface RootInterfaceOptions {
type Track (line 13) | interface Track {
type PlayBackStatus (line 38) | type PlayBackStatus = 'Playing' | 'Paused' | 'Stopped';
type LoopStatus (line 40) | type LoopStatus = 'None' | 'Track' | 'Playlist';
type Interfaces (line 50) | type Interfaces = 'player' | 'trackList' | 'playlists';
type AdditionalPlayerOptions (line 52) | interface AdditionalPlayerOptions {
type PlayerOptions (line 57) | type PlayerOptions = RootInterfaceOptions & AdditionalPlayerOptions;
type Position (line 59) | interface Position {
class Player (line 64) | class Player extends EventEmitter {
type MprisInterface (line 179) | interface MprisInterface extends dbusInterface.Interface {
type RootInterface (line 184) | interface RootInterface {}
type PlayerInterface (line 187) | interface PlayerInterface {}
type TracklistInterface (line 189) | interface TracklistInterface {
type PlaylistsInterface (line 197) | interface PlaylistsInterface {
FILE: src/plugins/shortcuts/mpris.ts
class YTPlayer (line 31) | class YTPlayer extends MprisPlayer {
method constructor (line 38) | constructor(opts: PlayerOptions) {
method setPosition (line 44) | setPosition(t: number) {
method getPosition (line 48) | override getPosition(): number {
method setLoopStatus (line 52) | setLoopStatus(status: LoopStatus) {
method isPlaying (line 56) | isPlaying(): boolean {
method isPaused (line 60) | isPaused(): boolean {
method isStopped (line 64) | isStopped(): boolean {
method setPlaybackStatus (line 68) | setPlaybackStatus(status: PlayBackStatus) {
function setupMPRIS (line 73) | function setupMPRIS() {
function registerMPRIS (line 90) | function registerMPRIS(win: BrowserWindow) {
FILE: src/plugins/skip-disliked-songs/index.ts
method start (line 18) | start() {
method stop (line 36) | stop() {
FILE: src/plugins/skip-silences/index.ts
type SkipSilencesPluginConfig (line 5) | type SkipSilencesPluginConfig = {
FILE: src/plugins/sponsorblock/index.ts
type SponsorBlockPluginConfig (line 12) | type SponsorBlockPluginConfig = {
method backend (line 43) | async backend({ getConfig, ipc }) {
method start (line 107) | start({ ipc }) {
method onPlayerApiReady (line 112) | onPlayerApiReady() {
method stop (line 120) | stop() {
FILE: src/plugins/sponsorblock/types.ts
type Segment (line 1) | type Segment = [number, number];
type SkipSegment (line 3) | interface SkipSegment {
FILE: src/plugins/synced-lyrics/backend.ts
method fetch (line 8) | async fetch(
method start (line 22) | start(ctx) {
method stop (line 27) | stop(ctx) {
FILE: src/plugins/synced-lyrics/menu.ts
method click (line 27) | click() {
method click (line 37) | click() {
method click (line 49) | click(item) {
method click (line 69) | click() {
method click (line 84) | click() {
method click (line 99) | click() {
method click (line 114) | click() {
method click (line 140) | click() {
method click (line 150) | click(item) {
method click (line 174) | click() {
method click (line 189) | click() {
method click (line 204) | click() {
method click (line 217) | click(item) {
method click (line 230) | click(item) {
FILE: src/plugins/synced-lyrics/parsers/lrc.ts
type LRCTag (line 1) | interface LRCTag {
type LRCLine (line 6) | interface LRCLine {
type LRC (line 14) | interface LRC {
constant LRC (line 26) | const LRC = {
FILE: src/plugins/synced-lyrics/providers/LRCLib.ts
class LRCLib (line 8) | class LRCLib implements LyricProvider {
method search (line 12) | async search({
type LRCLIBSearchResponse (line 178) | type LRCLIBSearchResponse = {
FILE: src/plugins/synced-lyrics/providers/LyricsGenius.ts
class LyricsGenius (line 6) | class LyricsGenius implements LyricProvider {
method search (line 12) | async search({ title, artist }: SearchSongInfo): Promise<LyricResult |...
type LyricsGeniusSearch (line 100) | interface LyricsGeniusSearch {
type Response (line 104) | interface Response {
type Section (line 108) | interface Section {
type Result (line 117) | interface Result {
type Artist (line 134) | interface Artist {
type ReleaseDateComponents (line 143) | interface ReleaseDateComponents {
FILE: src/plugins/synced-lyrics/providers/Megalobiz.ts
class Megalobiz (line 17) | class Megalobiz implements LyricProvider {
method search (line 23) | async search({ title, artist, songDuration }: SearchSongInfo): Promise...
type MegalobizSearchResult (line 105) | interface MegalobizSearchResult {
FILE: src/plugins/synced-lyrics/providers/MusixMatch.ts
class MusixMatch (line 8) | class MusixMatch implements LyricProvider {
method search (line 14) | async search(info: SearchSongInfo): Promise<LyricResult | null> {
type Endpoint (line 77) | enum Endpoint {
type Query (line 82) | type Query = {
type Params (line 90) | type Params = {
class MusixMatchAPI (line 158) | class MusixMatchAPI {
method constructor (line 163) | private constructor() {
method new (line 167) | public static async new() {
method reinit (line 173) | public async reinit() {
method query (line 184) | public async query<
method init (line 259) | private async init() {
method getToken (line 288) | private async getToken() {
FILE: src/plugins/synced-lyrics/providers/YTMusic.ts
class YTMusic (line 14) | class YTMusic implements LyricProvider {
method search (line 20) | public async search(
method millisToTime (line 98) | private millisToTime(millis: number) {
method fetchNext (line 110) | private fetchNext(videoId: string) {
method fetchBrowse (line 125) | private fetchBrowse(browseId: string) {
type NextData (line 137) | interface NextData {
type BrowseData (line 162) | interface BrowseData {
type SyncedLyricLine (line 192) | interface SyncedLyricLine {
type CueRange (line 197) | interface CueRange {
type PlainLyricsTextRenderer (line 202) | interface PlainLyricsTextRenderer {
FILE: src/plugins/synced-lyrics/providers/index.ts
type ProviderNames (line 5) | enum ProviderNames {
type ProviderName (line 14) | type ProviderName = z.infer<typeof ProviderNameSchema>;
type ProviderState (line 17) | type ProviderState = {
FILE: src/plugins/synced-lyrics/renderer/components/ErrorDisplay.tsx
type ErrorDisplayProps (line 7) | interface ErrorDisplayProps {
FILE: src/plugins/synced-lyrics/renderer/components/PlainLyrics.tsx
type PlainLyricsProps (line 11) | interface PlainLyricsProps {
FILE: src/plugins/synced-lyrics/renderer/components/SyncedLine.tsx
type SyncedLineProps (line 17) | interface SyncedLineProps {
FILE: src/plugins/synced-lyrics/renderer/index.ts
method onConfigChange (line 28) | onConfigChange(newConfig) {
method observerCallback (line 32) | observerCallback(mutations: MutationRecord[]) {
method onPlayerApiReady (line 47) | async onPlayerApiReady(api: MusicPlayer) {
method videoDataChange (line 54) | async videoDataChange() {
method start (line 77) | async start(ctx: RendererContext<SyncedLyricsPluginConfig>) {
FILE: src/plugins/synced-lyrics/renderer/renderer.tsx
type LyricsRendererChild (line 129) | type LyricsRendererChild =
FILE: src/plugins/synced-lyrics/renderer/store.ts
type LyricsStore (line 16) | type LyricsStore = {
method current (line 34) | get current(): ProviderState {
type VideoId (line 44) | type VideoId = string;
type SearchCacheData (line 46) | type SearchCacheData = Record<ProviderName, ProviderState>;
type SearchCache (line 47) | interface SearchCache {
FILE: src/plugins/synced-lyrics/types.ts
type SyncedLyricsPluginConfig (line 4) | type SyncedLyricsPluginConfig = {
type LineLyricsStatus (line 19) | type LineLyricsStatus = 'previous' | 'current' | 'upcoming';
type LineLyrics (line 21) | type LineLyrics = {
type LineEffect (line 30) | type LineEffect = 'fancy' | 'scale' | 'offset' | 'focus';
type LyricResult (line 32) | interface LyricResult {
type SearchSongInfo (line 41) | type SearchSongInfo = Pick<SongInfo, 'title' | 'alternativeTitle' | 'art...
type LyricProvider (line 43) | interface LyricProvider {
FILE: src/plugins/taskbar-mediacontrol/index.ts
method backend (line 29) | async backend({ window }) {
FILE: src/plugins/touchbar/index.ts
method backend (line 19) | backend({ window }) {
FILE: src/plugins/transparent-player/index.ts
method menu (line 28) | async menu({ getConfig, setConfig }) {
method start (line 59) | async start({ window, getConfig }) {
method onConfigChange (line 66) | onConfigChange(newConfig) {
method stop (line 69) | stop({ window }) {
method start (line 79) | async start({ getConfig }) {
method onConfigChange (line 92) | onConfigChange(newConfig) {
method stop (line 96) | stop() {
method applyVariables (line 104) | applyVariables(this: { props: TransparentPlayerConfig }) {
FILE: src/plugins/transparent-player/types.ts
type MaterialType (line 1) | enum MaterialType {
type TransparentPlayerConfig (line 8) | type TransparentPlayerConfig = {
FILE: src/plugins/tuna-obs/index.ts
type Data (line 9) | interface Data {
method start (line 33) | start({ ipc }) {
FILE: src/plugins/utils/common/types.ts
type Config (line 3) | interface Config {
type Plugin (line 7) | interface Plugin<ConfigType extends Config> {
type RendererPlugin (line 13) | interface RendererPlugin<ConfigType extends Config>
type MainPlugin (line 18) | interface MainPlugin<ConfigType extends Config>
type PreloadPlugin (line 23) | interface PreloadPlugin<ConfigType extends Config>
type MenuPlugin (line 28) | interface MenuPlugin<ConfigType extends Config>
FILE: src/plugins/utils/main/css.ts
type Unregister (line 3) | type Unregister = () => void;
FILE: src/plugins/video-toggle/index.tsx
type VideoTogglePluginConfig (line 16) | type VideoTogglePluginConfig = {
method click (line 47) | click() {
method click (line 55) | click() {
method click (line 63) | click() {
method click (line 76) | click() {
method click (line 84) | click() {
method click (line 92) | click() {
method click (line 102) | click(item) {
method start (line 120) | async start({ getConfig }) {
method onPlayerApiReady (line 156) | async onPlayerApiReady(api, { getConfig }) {
method onConfigChange (line 350) | onConfigChange(newConfig) {
FILE: src/plugins/video-toggle/templates/video-switch-button.tsx
type VideoSwitchButtonProps (line 1) | interface VideoSwitchButtonProps {
FILE: src/plugins/visualizer/butterchurn.d.ts
type VisualizerOptions (line 2) | interface VisualizerOptions {
class Visualizer (line 12) | class Visualizer {
type ButterchurnOptions (line 59) | interface ButterchurnOptions {
class Butterchurn (line 65) | class Butterchurn {
FILE: src/plugins/visualizer/index.ts
type WaveColor (line 11) | type WaveColor = {
type VisualizerPluginConfig (line 16) | type VisualizerPluginConfig = {
type RenderProps (line 59) | type RenderProps = {
method click (line 147) | click() {
method createVisualizer (line 163) | createVisualizer(
method onConfigChange (line 230) | onConfigChange(newConfig) {
method onPlayerApiReady (line 234) | onPlayerApiReady(_, { getConfig }) {
FILE: src/plugins/visualizer/visualizers/butterchurn.ts
class ButterchurnVisualizer (line 8) | class ButterchurnVisualizer extends Visualizer {
method constructor (line 13) | constructor(
method resize (line 41) | resize(width: number, height: number) {
method destroy (line 45) | destroy() {
FILE: src/plugins/visualizer/visualizers/visualizer.ts
method constructor (line 5) | protected constructor(
FILE: src/plugins/visualizer/visualizers/vudio.ts
class VudioVisualizer (line 7) | class VudioVisualizer extends Visualizer {
method constructor (line 10) | constructor(
method resize (line 30) | resize(width: number, height: number) {
method destroy (line 37) | destroy() {
FILE: src/plugins/visualizer/visualizers/wave.ts
class WaveVisualizer (line 7) | class WaveVisualizer extends Visualizer {
method constructor (line 10) | constructor(
method resize (line 36) | resize(_: number, __: number) {}
method destroy (line 38) | destroy() {
FILE: src/plugins/visualizer/vudio.d.ts
type NoneWaveformOptions (line 2) | interface NoneWaveformOptions {
type WaveformOptions (line 12) | interface WaveformOptions extends NoneWaveformOptions {
type VudioOptions (line 17) | interface VudioOptions {
class Vudio (line 25) | class Vudio {
FILE: src/preload.ts
method define (line 19) | define() {}
FILE: src/providers/app-controls.ts
function restartInternal (line 18) | function restartInternal() {
function sendToFrontInternal (line 24) | function sendToFrontInternal(channel: string, ...args: unknown[]) {
FILE: src/providers/decorators.ts
function singleton (line 1) | function singleton<T extends (...params: never[]) => unknown>(fn: T): T {
function debounce (line 14) | function debounce<T extends (...params: never[]) => unknown>(
function cache (line 25) | function cache<T extends (...params: P) => R, P extends never[], R>(
function cacheNoArgs (line 43) | function cacheNoArgs<R>(fn: () => R): () => R {
function throttle (line 57) | function throttle<T extends (...params: unknown[]) => unknown>(
function memoize (line 74) | function memoize<T extends (...params: unknown[]) => unknown>(fn: T): T {
function retry (line 87) | function retry<T extends (...params: unknown[]) => Promise<unknown>>(
FILE: src/providers/protocol-handler.ts
constant APP_PROTOCOL (line 7) | const APP_PROTOCOL =
function setupProtocolHandler (line 12) | function setupProtocolHandler(win: BrowserWindow) {
function handleProtocol (line 31) | function handleProtocol(cmd: string, ...args: string[]) {
function changeProtocolHandler (line 35) | function changeProtocolHandler(
FILE: src/providers/song-controls.ts
type ArgsType (line 7) | type ArgsType<T> = T | string[] | undefined;
FILE: src/providers/song-info-front.ts
constant DATAUPDATED_FALLBACK_TIMEOUT_MS (line 15) | const DATAUPDATED_FALLBACK_TIMEOUT_MS = 1500;
constant LIKE_STATUS_ATTRIBUTE (line 90) | const LIKE_STATUS_ATTRIBUTE = 'like-status';
function sendSongInfo (line 334) | function sendSongInfo(videoData: VideoDataChangeValue) {
FILE: src/providers/song-info.ts
type MediaType (line 9) | enum MediaType {
type SongInfo (line 29) | interface SongInfo {
type SongInfoEvent (line 173) | enum SongInfoEvent {
type SongInfoCallback (line 180) | type SongInfoCallback = (
function cleanupName (line 273) | function cleanupName(name: string): string {
FILE: src/renderer.ts
function listenForApiLoad (line 41) | async function listenForApiLoad() {
function onApiLoaded (line 52) | async function onApiLoaded() {
FILE: src/reset.d.ts
type Compressor (line 12) | interface Compressor {
type DocumentEventMap (line 17) | interface DocumentEventMap {
type Window (line 24) | interface Window {
type Howl (line 46) | interface Howl {
FILE: src/solit.tsx
type LitElementWrapperProps (line 6) | interface LitElementWrapperProps {
FILE: src/tray.ts
type TrayEvent (line 22) | type TrayEvent = (
method click (line 97) | click() {
method click (line 103) | click() {
method click (line 109) | click() {
method click (line 115) | click() {
FILE: src/ts-declarations/kuroshiro-analyzer-kuromoji.d.ts
class KuromojiAnalyzer (line 4) | class KuromojiAnalyzer {
FILE: src/ts-declarations/kuroshiro.d.ts
class Kuroshiro (line 3) | class Kuroshiro {
FILE: src/types/contexts.ts
type BaseContext (line 9) | interface BaseContext<Config extends PluginConfig> {
type BackendContext (line 14) | interface BackendContext<Config extends PluginConfig>
type MenuContext (line 26) | interface MenuContext<Config extends PluginConfig>
type PreloadContext (line 33) | interface PreloadContext<Config extends PluginConfig>
type RendererContext (line 36) | interface RendererContext<Config extends PluginConfig>
FILE: src/types/datahost-get-state.ts
type GetState (line 3) | interface GetState {
type CastStatus (line 19) | interface CastStatus {
type CastConnectionData (line 25) | interface CastConnectionData {
type Download (line 30) | interface Download {
type Entities (line 35) | interface Entities {}
type LikeStatus (line 37) | interface LikeStatus {
type LikeType (line 42) | enum LikeType {
type VolumeState (line 48) | interface VolumeState {
type MultiSelect (line 53) | interface MultiSelect {
type Navigation (line 59) | interface Navigation {
type MainContent (line 68) | interface MainContent {
type MainContentEndpoint (line 73) | interface MainContentEndpoint {
type TriggerElement (line 80) | interface TriggerElement {
type VeData (line 85) | interface VeData {
type Data (line 90) | interface Data {
type SuggestStats (line 95) | interface SuggestStats {
type Response (line 108) | interface Response {
type ResponseContents (line 114) | interface ResponseContents {
type TabbedSearchResultsRenderer (line 118) | interface TabbedSearchResultsRenderer {
type TabbedSearchResultsRendererTab (line 122) | interface TabbedSearchResultsRendererTab {
type PurpleTabRenderer (line 126) | interface PurpleTabRenderer {
type PurpleContent (line 135) | interface PurpleContent {
type SectionListRenderer (line 139) | interface SectionListRenderer {
type SectionListRendererContent (line 146) | interface SectionListRendererContent {
type MusicCardShelfRenderer (line 151) | interface MusicCardShelfRenderer {
type MusicCardShelfRendererButton (line 164) | interface MusicCardShelfRendererButton {
type ButtonButtonRenderer (line 168) | interface ButtonButtonRenderer {
type AccessibilityDataAccessibility (line 180) | interface AccessibilityDataAccessibility {
type AccessibilityPauseDataClass (line 184) | interface AccessibilityPauseDataClass {
type ButtonRendererCommand (line 188) | interface ButtonRendererCommand {
type Target (line 194) | interface Target {
type CommandWatchEndpoint (line 198) | interface CommandWatchEndpoint {
type PurpleWatchEndpointMusicSupportedConfigs (line 204) | interface PurpleWatchEndpointMusicSupportedConfigs {
type PurpleWatchEndpointMusicConfig (line 208) | interface PurpleWatchEndpointMusicConfig {
type MusicVideoType (line 212) | enum MusicVideoType {
type DefaultIconClass (line 218) | interface DefaultIconClass {
type IconType (line 222) | enum IconType {
type Subtitle (line 243) | interface Subtitle {
type ShortBylineTextRun (line 247) | interface ShortBylineTextRun {
type MusicCardShelfRendererContent (line 251) | interface MusicCardShelfRendererContent {
type MessageRenderer (line 256) | interface MessageRenderer {
type MessageRendererStyle (line 262) | interface MessageRendererStyle {
type PurpleMusicResponsiveListItemRenderer (line 266) | interface PurpleMusicResponsiveListItemRenderer {
type FlexColumn (line 277) | interface FlexColumn {
type MusicResponsiveListItemFlexColumnRenderer (line 281) | interface MusicResponsiveListItemFlexColumnRenderer {
type DisplayPriority (line 286) | enum DisplayPriority {
type Text (line 290) | interface Text {
type PurpleRun (line 294) | interface PurpleRun {
type PurpleNavigationEndpoint (line 299) | interface PurpleNavigationEndpoint {
type PurpleBrowseEndpoint (line 305) | interface PurpleBrowseEndpoint {
type BrowseEndpointContextSupportedConfigs (line 310) | interface BrowseEndpointContextSupportedConfigs {
type BrowseEndpointContextMusicConfig (line 314) | interface BrowseEndpointContextMusicConfig {
type PageType (line 318) | enum PageType {
type OnTapWatchEndpoint (line 327) | interface OnTapWatchEndpoint {
type PurpleMenu (line 332) | interface PurpleMenu {
type PurpleMenuRenderer (line 336) | interface PurpleMenuRenderer {
type PurpleItem (line 342) | interface PurpleItem {
type MenuItemRenderer (line 348) | interface MenuItemRenderer {
type MenuNavigationItemRendererNavigationEndpoint (line 356) | interface MenuNavigationItemRendererNavigationEndpoint {
type AddToPlaylistEndpoint (line 365) | interface AddToPlaylistEndpoint {
type ShareEntityEndpoint (line 370) | interface ShareEntityEndpoint {
type SharePanelType (line 375) | enum SharePanelType {
type PurpleWatchEndpoint (line 379) | interface PurpleWatchEndpoint {
type LoggingContext (line 387) | interface LoggingContext {
type VssLoggingContext (line 391) | interface VssLoggingContext {
type WatchPlaylistEndpoint (line 395) | interface WatchPlaylistEndpoint {
type MenuNavigationItemRendererServiceEndpoint (line 400) | interface MenuNavigationItemRendererServiceEndpoint {
type GetReportFormEndpoint (line 407) | interface GetReportFormEndpoint {
type QueueAddEndpoint (line 411) | interface QueueAddEndpoint {
type CommandElement (line 417) | interface CommandElement {
type AddToToastAction (line 422) | interface AddToToastAction {
type AddToToastActionItem (line 426) | interface AddToToastActionItem {
type NotificationTextRenderer (line 430) | interface NotificationTextRenderer {
type QueueInsertPosition (line 435) | enum QueueInsertPosition {
type RemoveFromQueueEndpoint (line 440) | interface RemoveFromQueueEndpoint {
type PurpleToggleMenuServiceItemRenderer (line 446) | interface PurpleToggleMenuServiceItemRenderer {
type PurpleDefaultServiceEndpoint (line 456) | interface PurpleDefaultServiceEndpoint {
type FeedbackEndpoint (line 462) | interface FeedbackEndpoint {
type PurpleLikeEndpoint (line 466) | interface PurpleLikeEndpoint {
type LikeEndpointAction (line 472) | interface LikeEndpointAction {
type MusicLibraryStatusUpdateCommand (line 477) | interface MusicLibraryStatusUpdateCommand {
type PurpleToggledServiceEndpoint (line 482) | interface PurpleToggledServiceEndpoint {
type FluffyLikeEndpoint (line 488) | interface FluffyLikeEndpoint {
type ThumbnailOverlayClass (line 493) | interface ThumbnailOverlayClass {
type ThumbnailOverlayMusicItemThumbnailOverlayRenderer (line 497) | interface ThumbnailOverlayMusicItemThumbnailOverlayRenderer {
type Background (line 504) | interface Background {
type VerticalGradient (line 508) | interface VerticalGradient {
type FluffyContent (line 512) | interface FluffyContent {
type PurpleMusicPlayButtonRenderer (line 516) | interface PurpleMusicPlayButtonRenderer {
type OnTap (line 534) | interface OnTap {
type MusicResponsiveListItemRendererThumbnail (line 539) | interface MusicResponsiveListItemRendererThumbnail {
type MusicThumbnailRenderer (line 543) | interface MusicThumbnailRenderer {
type ThumbnailDetailsClass (line 550) | interface ThumbnailDetailsClass {
type ThumbnailElement (line 554) | interface ThumbnailElement {
type MusicCardShelfRendererHeader (line 560) | interface MusicCardShelfRendererHeader {
type MusicCardShelfHeaderBasicRenderer (line 564) | interface MusicCardShelfHeaderBasicRenderer {
type MusicCardShelfRendererMenu (line 569) | interface MusicCardShelfRendererMenu {
type FluffyMenuRenderer (line 573) | interface FluffyMenuRenderer {
type FluffyItem (line 579) | interface FluffyItem {
type FluffyToggleMenuServiceItemRenderer (line 585) | interface FluffyToggleMenuServiceItemRenderer {
type PurpleServiceEndpoint (line 595) | interface PurpleServiceEndpoint {
type LongBylineText (line 600) | interface LongBylineText {
type LongBylineTextRun (line 604) | interface LongBylineTextRun {
type RunEndpoint (line 609) | interface RunEndpoint {
type Title (line 614) | interface Title {
type FluffyRun (line 618) | interface FluffyRun {
type MusicShelfRenderer (line 623) | interface MusicShelfRenderer {
type BottomEndpointClass (line 632) | interface BottomEndpointClass {
type SearchEndpoint (line 637) | interface SearchEndpoint {
type MusicShelfRendererContent (line 642) | interface MusicShelfRendererContent {
type FluffyMusicResponsiveListItemRenderer (line 646) | interface FluffyMusicResponsiveListItemRenderer {
type FluffyMenu (line 658) | interface FluffyMenu {
type TentacledMenuRenderer (line 662) | interface TentacledMenuRenderer {
type TentacledItem (line 668) | interface TentacledItem {
type TentacledToggleMenuServiceItemRenderer (line 674) | interface TentacledToggleMenuServiceItemRenderer {
type FluffyDefaultServiceEndpoint (line 684) | interface FluffyDefaultServiceEndpoint {
type TentacledLikeEndpoint (line 690) | interface TentacledLikeEndpoint {
type FluffyToggledServiceEndpoint (line 696) | interface FluffyToggledServiceEndpoint {
type StickyLikeEndpoint (line 702) | interface StickyLikeEndpoint {
type PurpleOverlay (line 707) | interface PurpleOverlay {
type PurpleMusicItemThumbnailOverlayRenderer (line 711) | interface PurpleMusicItemThumbnailOverlayRenderer {
type TentacledContent (line 718) | interface TentacledContent {
type FluffyMusicPlayButtonRenderer (line 722) | interface FluffyMusicPlayButtonRenderer {
type PlayNavigationEndpoint (line 740) | interface PlayNavigationEndpoint {
type ShelfDivider (line 746) | interface ShelfDivider {
type MusicShelfDividerRenderer (line 750) | interface MusicShelfDividerRenderer {
type Continuation (line 754) | interface Continuation {
type ReloadContinuationData (line 758) | interface ReloadContinuationData {
type SectionListRendererHeader (line 763) | interface SectionListRendererHeader {
type ChipCloudRenderer (line 767) | interface ChipCloudRenderer {
type ChipCloudRendererChip (line 774) | interface ChipCloudRendererChip {
type PurpleChipCloudChipRenderer (line 778) | interface PurpleChipCloudChipRenderer {
type ChipCloudChipRendererStyle (line 788) | interface ChipCloudChipRendererStyle {
type ResponseResponseContext (line 792) | interface ResponseResponseContext {
type ServiceTrackingParam (line 797) | interface ServiceTrackingParam {
type Param (line 802) | interface Param {
type PlayerPageInfo (line 807) | interface PlayerPageInfo {
type Player (line 812) | interface Player {
type PlayerResponse (line 827) | interface PlayerResponse {
type Annotation (line 845) | interface Annotation {
type PlayerAnnotationsExpandedRenderer (line 849) | interface PlayerAnnotationsExpandedRenderer {
type FeaturedChannel (line 854) | interface FeaturedChannel {
type FeaturedChannelNavigationEndpoint (line 864) | interface FeaturedChannelNavigationEndpoint {
type FluffyBrowseEndpoint (line 869) | interface FluffyBrowseEndpoint {
type SubscribeButtonClass (line 873) | interface SubscribeButtonClass {
type SubscribeButtonRenderer (line 877) | interface SubscribeButtonRenderer {
type SubscribeButtonRendererServiceEndpoint (line 891) | interface SubscribeButtonRendererServiceEndpoint {
type SignalServiceEndpoint (line 897) | interface SignalServiceEndpoint {
type SignalServiceEndpointAction (line 902) | interface SignalServiceEndpointAction {
type OpenPopupAction (line 907) | interface OpenPopupAction {
type Popup (line 912) | interface Popup {
type ConfirmDialogRenderer (line 916) | interface ConfirmDialogRenderer {
type CancelButtonClass (line 923) | interface CancelButtonClass {
type CancelButtonButtonRenderer (line 927) | interface CancelButtonButtonRenderer {
type UnsubscribeCommand (line 936) | interface UnsubscribeCommand {
type SubscribeEndpoint (line 941) | interface SubscribeEndpoint {
type Attestation (line 946) | interface Attestation {
type PlayerAttestationRenderer (line 950) | interface PlayerAttestationRenderer {
type BotguardData (line 955) | interface BotguardData {
type InterpreterSafeURL (line 961) | interface InterpreterSafeURL {
type Captions (line 965) | interface Captions {
type PlayerCaptionsTracklistRenderer (line 969) | interface PlayerCaptionsTracklistRenderer {
type AudioTrack (line 976) | interface AudioTrack {
type CaptionTrack (line 984) | interface CaptionTrack {
type TranslationLanguage (line 993) | interface TranslationLanguage {
type Endscreen (line 998) | interface Endscreen {
type EndscreenRenderer (line 1002) | interface EndscreenRenderer {
type Element (line 1008) | interface Element {
type EndscreenElementRenderer (line 1012) | interface EndscreenElementRenderer {
type EndscreenElementRendererEndpoint (line 1035) | interface EndscreenElementRendererEndpoint {
type EndscreenElementRendererIcon (line 1042) | interface EndscreenElementRendererIcon {
type URLEndpoint (line 1046) | interface URLEndpoint {
type ThumbnailOverlay (line 1050) | interface ThumbnailOverlay {
type ThumbnailOverlayTimeStatusRenderer (line 1054) | interface ThumbnailOverlayTimeStatusRenderer {
type LengthText (line 1059) | interface LengthText {
type HeartbeatParams (line 1064) | interface HeartbeatParams {
type Microformat (line 1073) | interface Microformat {
type MicroformatDataRenderer (line 1077) | interface MicroformatDataRenderer {
type LinkAlternate (line 1110) | interface LinkAlternate {
type PageOwnerDetails (line 1116) | interface PageOwnerDetails {
type MicroformatDataRendererVideoDetails (line 1122) | interface MicroformatDataRendererVideoDetails {
type PlayabilityStatus (line 1128) | interface PlayabilityStatus {
type AudioOnlyPlayability (line 1136) | interface AudioOnlyPlayability {
type AudioOnlyPlayabilityRenderer (line 1140) | interface AudioOnlyPlayabilityRenderer {
type Miniplayer (line 1145) | interface Miniplayer {
type MiniplayerRenderer (line 1149) | interface MiniplayerRenderer {
type PlaybackTracking (line 1153) | interface PlaybackTracking {
type AtrURLClass (line 1165) | interface AtrURLClass {
type HeaderElement (line 1171) | interface HeaderElement {
type HeaderType (line 1175) | enum HeaderType {
type PtrackingURLClass (line 1181) | interface PtrackingURLClass {
type Storyboards (line 1186) | interface Storyboards {
type PlayerStoryboardSpecRenderer (line 1190) | interface PlayerStoryboardSpecRenderer {
type StreamingData (line 1195) | interface StreamingData {
type AdaptiveFormat (line 1202) | interface AdaptiveFormat {
type ColorInfo (line 1227) | interface ColorInfo {
type Range (line 1233) | interface Range {
type ProjectionType (line 1238) | enum ProjectionType {
type Format (line 1242) | interface Format {
type PlayerResponseVideoDetails (line 1260) | interface PlayerResponseVideoDetails {
type PlayerTriggerInfo (line 1279) | interface PlayerTriggerInfo {
type PlayerPage (line 1283) | interface PlayerPage {
type PlayerOverlay (line 1295) | interface PlayerOverlay {
type PlayerOverlayRenderer (line 1299) | interface PlayerOverlayRenderer {
type PlayerOverlayRendererAction (line 1304) | interface PlayerOverlayRendererAction {
type LikeButtonRenderer (line 1308) | interface LikeButtonRenderer {
type ServiceEndpoint (line 1316) | interface ServiceEndpoint {
type ServiceEndpointLikeEndpoint (line 1321) | interface ServiceEndpointLikeEndpoint {
type LikeParams (line 1330) | enum LikeParams {
type BrowserMediaSession (line 1334) | interface BrowserMediaSession {
type BrowserMediaSessionRenderer (line 1338) | interface BrowserMediaSessionRenderer {
type PlayerPageTabElement (line 1342) | interface PlayerPageTabElement {
type PlayerPageTabTabRenderer (line 1346) | interface PlayerPageTabTabRenderer {
type StickyContent (line 1354) | interface StickyContent {
type MusicQueueRenderer (line 1358) | interface MusicQueueRenderer {
type PlayerPageWatchNextResponse (line 1362) | interface PlayerPageWatchNextResponse {
type PlayerPageWatchNextResponseContents (line 1371) | interface PlayerPageWatchNextResponseContents {
type SingleColumnMusicWatchNextResultsRenderer (line 1375) | interface SingleColumnMusicWatchNextResultsRenderer {
type TabbedRenderer (line 1379) | interface TabbedRenderer {
type WatchNextTabbedResultsRenderer (line 1383) | interface WatchNextTabbedResultsRenderer {
type CurrentVideoEndpoint (line 1387) | interface CurrentVideoEndpoint {
type CurrentVideoEndpointWatchEndpoint (line 1392) | interface CurrentVideoEndpointWatchEndpoint {
type PlayerPageWatchNextResponseResponseContext (line 1400) | interface PlayerPageWatchNextResponseResponseContext {
type VideoReporting (line 1404) | interface VideoReporting {
type ReportFormModalRenderer (line 1408) | interface ReportFormModalRenderer {
type Footer (line 1417) | interface Footer {
type FooterRun (line 1421) | interface FooterRun {
type FluffyNavigationEndpoint (line 1426) | interface FluffyNavigationEndpoint {
type OptionsSupportedRenderers (line 1431) | interface OptionsSupportedRenderers {
type OptionsRenderer (line 1435) | interface OptionsRenderer {
type OptionsRendererItem (line 1440) | interface OptionsRendererItem {
type OptionSelectableItemRenderer (line 1444) | interface OptionSelectableItemRenderer {
type SubmitEndpoint (line 1450) | interface SubmitEndpoint {
type FlagEndpoint (line 1455) | interface FlagEndpoint {
type RepeatMode (line 1459) | type RepeatMode = 'NONE' | 'ONE' | 'ALL';
type Queue (line 1461) | interface Queue {
type QueueHeader (line 1487) | interface QueueHeader {
type HeaderButton (line 1494) | interface HeaderButton {
type ButtonChipCloudChipRenderer (line 1498) | interface ButtonChipCloudChipRenderer {
type TentacledNavigationEndpoint (line 1509) | interface TentacledNavigationEndpoint {
type QueueItem (line 1514) | interface QueueItem {
type ItemPlaylistPanelVideoRenderer (line 1519) | interface ItemPlaylistPanelVideoRenderer {
type TentacledMenu (line 1534) | interface TentacledMenu {
type StickyMenuRenderer (line 1538) | interface StickyMenuRenderer {
type StickyItem (line 1544) | interface StickyItem {
type StickyToggleMenuServiceItemRenderer (line 1550) | interface StickyToggleMenuServiceItemRenderer {
type PlaylistPanelVideoRendererNavigationEndpoint (line 1560) | interface PlaylistPanelVideoRendererNavigationEndpoint {
type FluffyWatchEndpoint (line 1565) | interface FluffyWatchEndpoint {
type FluffyWatchEndpointMusicSupportedConfigs (line 1576) | interface FluffyWatchEndpointMusicSupportedConfigs {
type FluffyWatchEndpointMusicConfig (line 1580) | interface FluffyWatchEndpointMusicConfig {
type PlaylistPanelVideoWrapperRenderer (line 1585) | interface PlaylistPanelVideoWrapperRenderer {
type Counterpart (line 1590) | interface Counterpart {
type CounterpartRenderer (line 1595) | interface CounterpartRenderer {
type CounterpartRendererPlaylistPanelVideoRenderer (line 1599) | interface CounterpartRendererPlaylistPanelVideoRenderer {
type StickyMenu (line 1614) | interface StickyMenu {
type IndigoMenuRenderer (line 1618) | interface IndigoMenuRenderer {
type IndigoItem (line 1624) | interface IndigoItem {
type IndigoToggleMenuServiceItemRenderer (line 1630) | interface IndigoToggleMenuServiceItemRenderer {
type FluffyServiceEndpoint (line 1640) | interface FluffyServiceEndpoint {
type SegmentMap (line 1646) | interface SegmentMap {
type Segment (line 1650) | interface Segment {
type PrimaryRenderer (line 1656) | interface PrimaryRenderer {
type ResponsiveSignals (line 1660) | interface ResponsiveSignals {
type VideoInteraction (line 1664) | interface VideoInteraction {
type SteeringChips (line 1671) | interface SteeringChips {
type SteeringChipsChip (line 1676) | interface SteeringChipsChip {
type FluffyChipCloudChipRenderer (line 1680) | interface FluffyChipCloudChipRenderer {
type StickyNavigationEndpoint (line 1689) | interface StickyNavigationEndpoint {
type QueueUpdateCommand (line 1694) | interface QueueUpdateCommand {
type FetchContentsCommand (line 1700) | interface FetchContentsCommand {
type FetchContentsCommandWatchEndpoint (line 1705) | interface FetchContentsCommandWatchEndpoint {
type QueueUpdateSection (line 1712) | enum QueueUpdateSection {
type SubscribeStatus (line 1716) | interface SubscribeStatus {
type ToggleStates (line 1720) | interface ToggleStates {
type UI (line 1724) | interface UI {
type ViewportInfo (line 1729) | interface ViewportInfo {
type Uploads (line 1734) | interface Uploads {
FILE: src/types/get-player-response.ts
type GetPlayerResponse (line 1) | interface GetPlayerResponse {
type Attestation (line 18) | interface Attestation {
type PlayerAttestationRenderer (line 22) | interface PlayerAttestationRenderer {
type BotguardData (line 27) | interface BotguardData {
type InterpreterSafeURL (line 33) | interface InterpreterSafeURL {
type Captions (line 37) | interface Captions {
type PlayerCaptionsTracklistRenderer (line 41) | interface PlayerCaptionsTracklistRenderer {
type AudioTrack (line 48) | interface AudioTrack {
type CaptionTrack (line 52) | interface CaptionTrack {
type Name (line 61) | interface Name {
type Run (line 65) | interface Run {
type TranslationLanguage (line 69) | interface TranslationLanguage {
type Endscreen (line 74) | interface Endscreen {
type EndscreenRenderer (line 78) | interface EndscreenRenderer {
type Element (line 84) | interface Element {
type EndscreenElementRenderer (line 88) | interface EndscreenElementRenderer {
type Endpoint (line 105) | interface Endpoint {
type CommandMetadata (line 112) | interface CommandMetadata {}
type WatchEndpoint (line 114) | interface WatchEndpoint {
type ImageClass (line 118) | interface ImageClass {
type ThumbnailElement (line 122) | interface ThumbnailElement {
type ThumbnailOverlay (line 128) | interface ThumbnailOverlay {
type ThumbnailOverlayTimeStatusRenderer (line 132) | interface ThumbnailOverlayTimeStatusRenderer {
type Title (line 137) | interface Title {
type Accessibility (line 142) | interface Accessibility {
type AccessibilityData (line 146) | interface AccessibilityData {
type HeartbeatParams (line 150) | interface HeartbeatParams {
type Microformat (line 159) | interface Microformat {
type MicroformatDataRenderer (line 163) | interface MicroformatDataRenderer {
type LinkAlternate (line 196) | interface LinkAlternate {
type PageOwnerDetails (line 202) | interface PageOwnerDetails {
type MicroformatDataRendererVideoDetails (line 208) | interface MicroformatDataRendererVideoDetails {
type PlayabilityStatus (line 214) | interface PlayabilityStatus {
type ReplaceDefaultType (line 223) | type ReplaceDefaultType = {
type TransportControlsConfig (line 227) | interface TransportControlsConfig {
type AudioOnlyPlayability (line 233) | interface AudioOnlyPlayability {
type AudioOnlyPlayabilityRenderer (line 237) | interface AudioOnlyPlayabilityRenderer {
type Miniplayer (line 242) | interface Miniplayer {
type MiniplayerRenderer (line 246) | interface MiniplayerRenderer {
type PlaybackTracking (line 250) | interface PlaybackTracking {
type AtrURLClass (line 262) | interface AtrURLClass {
type Header (line 268) | interface Header {
type HeaderType (line 272) | enum HeaderType {
type PtrackingURLClass (line 278) | interface PtrackingURLClass {
type PlayerConfig (line 283) | interface PlayerConfig {
type AudioConfig (line 290) | interface AudioConfig {
type MediaCommonConfig (line 296) | interface MediaCommonConfig {
type DynamicReadaheadConfig (line 300) | interface DynamicReadaheadConfig {
type StreamSelectionConfig (line 306) | interface StreamSelectionConfig {
type WebPlayerConfig (line 310) | interface WebPlayerConfig {
type WebPlayerActionsPorting (line 316) | interface WebPlayerActionsPorting {
type AddToWatchLaterCommand (line 323) | interface AddToWatchLaterCommand {
type AddToWatchLaterCommandPlaylistEditEndpoint (line 328) | interface AddToWatchLaterCommandPlaylistEditEndpoint {
type PurpleAction (line 333) | interface PurpleAction {
type RemoveFromWatchLaterCommand (line 338) | interface RemoveFromWatchLaterCommand {
type RemoveFromWatchLaterCommandPlaylistEditEndpoint (line 343) | interface RemoveFromWatchLaterCommandPlaylistEditEndpoint {
type FluffyAction (line 348) | interface FluffyAction {
type SubscribeCommand (line 353) | interface SubscribeCommand {
type SubscribeEndpoint (line 358) | interface SubscribeEndpoint {
type UnsubscribeCommand (line 363) | interface UnsubscribeCommand {
type ResponseContext (line 368) | interface ResponseContext {
type ServiceTrackingParam (line 373) | interface ServiceTrackingParam {
type Param (line 378) | interface Param {
type Storyboards (line 383) | interface Storyboards {
type PlayerStoryboardSpecRenderer (line 387) | interface PlayerStoryboardSpecRenderer {
type StreamingData (line 392) | interface StreamingData {
type AdaptiveFormat (line 398) | interface AdaptiveFormat {
type ColorInfo (line 423) | interface ColorInfo {
type Range (line 428) | interface Range {
type ProjectionType (line 433) | enum ProjectionType {
type Format (line 437) | interface Format {
type GetPlayerResponseVideoDetails (line 455) | interface GetPlayerResponseVideoDetails {
FILE: src/types/icons.ts
type GeneralIcons (line 1) | type GeneralIcons =
type PaperDropDownMenuIcons (line 311) | type PaperDropDownMenuIcons =
type SocialNetworkIcons (line 315) | type SocialNetworkIcons =
type HashtagLandingPageIcons (line 386) | type HashtagLandingPageIcons =
type LiveChatBadgeIcons (line 391) | type LiveChatBadgeIcons =
type MiniplayerIcons (line 396) | type MiniplayerIcons =
type RottenTomatoesIcons (line 408) | type RottenTomatoesIcons =
type SettingsIcons (line 412) | type SettingsIcons =
type ShortsIcons (line 420) | type ShortsIcons =
type YtIcons (line 425) | type YtIcons =
type YtLogos (line 819) | type YtLogos =
type YtSysIcons (line 825) | type YtSysIcons =
type YtSysIcons12 (line 1294) | type YtSysIcons12 =
type YtSysIcons13 (line 1301) | type YtSysIcons13 =
type YtSysIcons15 (line 1308) | type YtSysIcons15 =
type YtSysIcons16 (line 1311) | type YtSysIcons16 =
type YtSysIcons18 (line 1353) | type YtSysIcons18 =
type YtSysIcons20 (line 1363) | type YtSysIcons20 =
type YtSysIcons36 (line 1369) | type YtSysIcons36 =
type YtSysIcons48 (line 1380) | type YtSysIcons48 =
type YtcpIcons (line 1390) | type YtcpIcons =
type Icons (line 1417) | type Icons =
FILE: src/types/music-player-app-element.ts
type MusicPlayerAppElement (line 1) | interface MusicPlayerAppElement extends HTMLElement {
FILE: src/types/music-player-desktop-internal.ts
type QueueResponse (line 4) | interface QueueResponse {
type WatchNextResponse (line 10) | interface WatchNextResponse {
FILE: src/types/music-player.ts
type MusicPlayer (line 8) | interface MusicPlayer {
FILE: src/types/player-api-events.ts
type AlbumDetails (line 3) | interface AlbumDetails {
type Contents (line 12) | interface Contents {
type SingleColumnMusicWatchNextResultsRenderer (line 16) | interface SingleColumnMusicWatchNextResultsRenderer {
type TabbedRenderer (line 20) | interface TabbedRenderer {
type WatchNextTabbedResultsRenderer (line 24) | interface WatchNextTabbedResultsRenderer {
type Tab (line 28) | interface Tab {
type TabRenderer (line 32) | interface TabRenderer {
type Content (line 39) | interface Content {
type MusicQueueRenderer (line 43) | interface MusicQueueRenderer {
type Endpoint (line 47) | interface Endpoint {
type BrowseEndpoint (line 52) | interface BrowseEndpoint {
type BrowseEndpointContextSupportedConfigs (line 57) | interface BrowseEndpointContextSupportedConfigs {
type BrowseEndpointContextMusicConfig (line 61) | interface BrowseEndpointContextMusicConfig {
type CurrentVideoEndpoint (line 65) | interface CurrentVideoEndpoint {
type WatchEndpoint (line 70) | interface WatchEndpoint {
type LoggingContext (line 78) | interface LoggingContext {
type VssLoggingContext (line 82) | interface VssLoggingContext {
type PlayerOverlays (line 86) | interface PlayerOverlays {
type PlayerOverlayRenderer (line 90) | interface PlayerOverlayRenderer {
type PlayerOverlayRendererAction (line 95) | interface PlayerOverlayRendererAction {
type LikeButtonRenderer (line 99) | interface LikeButtonRenderer {
type ServiceEndpoint (line 107) | interface ServiceEndpoint {
type LikeEndpoint (line 112) | interface LikeEndpoint {
type LikeEndpointAction (line 121) | interface LikeEndpointAction {
type MusicLibraryStatusUpdateCommand (line 126) | interface MusicLibraryStatusUpdateCommand {
type Target (line 131) | interface Target {
type BrowserMediaSession (line 135) | interface BrowserMediaSession {
type BrowserMediaSessionRenderer (line 139) | interface BrowserMediaSessionRenderer {
type Title (line 144) | interface Title {
type TitleRun (line 148) | interface TitleRun {
type ThumbnailDetails (line 152) | interface ThumbnailDetails {
type Thumbnail (line 156) | interface Thumbnail {
type ResponseContext (line 162) | interface ResponseContext {
type ServiceTrackingParam (line 166) | interface ServiceTrackingParam {
type Param (line 171) | interface Param {
type VideoReporting (line 176) | interface VideoReporting {
type ReportFormModalRenderer (line 180) | interface ReportFormModalRenderer {
type Button (line 189) | interface Button {
type ButtonRenderer (line 193) | interface ButtonRenderer {
type Footer (line 200) | interface Footer {
type FooterRun (line 204) | interface FooterRun {
type NavigationEndpoint (line 209) | interface NavigationEndpoint {
type URLEndpoint (line 214) | interface URLEndpoint {
type OptionsSupportedRenderers (line 218) | interface OptionsSupportedRenderers {
type OptionsRenderer (line 222) | interface OptionsRenderer {
type Item (line 227) | interface Item {
type OptionSelectableItemRenderer (line 231) | interface OptionSelectableItemRenderer {
type SubmitEndpoint (line 237) | interface SubmitEndpoint {
type FlagEndpoint (line 242) | interface FlagEndpoint {
type VideoDataChangeValue (line 247) | type VideoDataChangeValue = Record<string, unknown> & {
type PlayerAPIEvents (line 264) | interface PlayerAPIEvents {
FILE: src/types/plugins.ts
type Author (line 10) | type Author = string;
type PluginConfig (line 12) | type PluginConfig = {
type PluginLifecycleSimple (line 16) | type PluginLifecycleSimple<Context, This> = (
type PluginLifecycleExtra (line 20) | type PluginLifecycleExtra<Config, Context, This> = This & {
type RendererPluginLifecycleExtra (line 25) | type RendererPluginLifecycleExtra<Config, Context, This> = This &
type PluginLifecycle (line 34) | type PluginLifecycle<Config, Context, This> =
type RendererPluginLifecycle (line 37) | type RendererPluginLifecycle<Config, Context, This> =
type Platform (line 41) | enum Platform {
type PluginDef (line 48) | interface PluginDef<
FILE: src/types/queue.ts
type StoreState (line 4) | type StoreState = GetState;
type Store (line 5) | type Store = {
type QueueElement (line 13) | type QueueElement = HTMLElement & {
type QueueAPI (line 17) | type QueueAPI = {
type ToastElement (line 26) | type ToastElement = HTMLElement & {
type ToastService (line 44) | interface ToastService {
type AppElement (line 52) | type AppElement = HTMLElement & AppAPI;
type AppAPI (line 53) | type AppAPI = {
FILE: src/types/search-box-element.ts
type SearchBoxElement (line 1) | interface SearchBoxElement extends HTMLElement {
FILE: src/types/video-data-changed.ts
type VideoDataChanged (line 3) | interface VideoDataChanged {
FILE: src/types/video-details.ts
type VideoDetails (line 1) | interface VideoDetails {
FILE: src/utils/index.ts
type Options (line 69) | type Options<Config extends PluginConfig> =
FILE: src/utils/type-utils.ts
type Entries (line 1) | type Entries<T> = {
type ValueOf (line 5) | type ValueOf<T> = T[keyof T];
FILE: src/virtual-module.d.ts
type Plugin (line 4) | type Plugin = PluginDef<unknown, unknown, unknown, PluginConfig>;
FILE: src/yt-web-components.d.ts
type YtFormattedStringProps (line 8) | interface YtFormattedStringProps {
type YtButtonRendererProps (line 17) | interface YtButtonRendererProps {
type YpYtPaperSpinnerLiteProps (line 30) | interface YpYtPaperSpinnerLiteProps {
type TpYtPaperIconButtonProps (line 34) | interface TpYtPaperIconButtonProps {
type PearTransProps (line 38) | interface PearTransProps {
type IntrinsicElements (line 42) | interface IntrinsicElements extends MDUIElements {
Condensed preview — 368 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,209K chars).
[
{
"path": ".devcontainer/devcontainer.json",
"chars": 789,
"preview": "// For format details, see https://aka.ms/devcontainer.json. For config options, see the\n// README at: https://github.co"
},
{
"path": ".editorconfig",
"chars": 147,
"preview": "root = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ni"
},
{
"path": ".gitattributes",
"chars": 29,
"preview": "* text=auto eol=lf\n*.js text\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.yml",
"chars": 3199,
"preview": "name: Bug Report\ndescription: Report a Pear Desktop bug\ntitle: \"[Bug]: \"\nlabels: \"bug :beetle:\"\nbody:\n- type: checkboxes"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.yml",
"chars": 1327,
"preview": "name: Feature Request\ndescription: Suggest an idea for Pear Desktop\ntitle: \"[Feature Request]: \"\nlabels: \"enhancement :s"
},
{
"path": ".github/workflows/build.yml",
"chars": 5583,
"preview": "name: Build Pear Desktop\n\non:\n push:\n branches: [ master ]\n pull_request:\n\nenv:\n NODE_VERSION: \"22.x\"\n\njobs:\n bui"
},
{
"path": ".github/workflows/dependency-review.yml",
"chars": 936,
"preview": "# Dependency Review Action\n#\n# This Action will scan dependency manifest files that change as part of a Pull Reqest, sur"
},
{
"path": ".github/workflows/pr-build-artifacts.yml",
"chars": 4516,
"preview": "name: Build PR Artifacts\n\non:\n pull_request:\n types: [opened, synchronize, reopened]\n\nenv:\n NODE_VERSION: \"22.x\"\n\nj"
},
{
"path": ".github/workflows/reviewdog.yml",
"chars": 979,
"preview": "name: reviewdog\n\non: [pull_request_target]\n\nenv:\n NODE_VERSION: \"22.x\"\n\njobs:\n eslint:\n if: github.event.pull_reque"
},
{
"path": ".github/workflows/winget-cla.yml",
"chars": 522,
"preview": "name: Submit CLA to Winget PR\n\non:\n workflow_dispatch:\n inputs:\n pr_url:\n description: \"Specific PR URL\""
},
{
"path": ".github/workflows/winget-submission.yml",
"chars": 992,
"preview": "name: Submit to Windows Package Manager Community Repository\n\non:\n release:\n types: [ released ]\n workflow_dispatch"
},
{
"path": ".gitignore",
"chars": 180,
"preview": "node_modules\n/dist\n/pack\n.vscode/settings.json\n.idea\n\n.pnp.*\n.pnpm-store\n.yarn/*\n!.yarn/patches\n!.yarn/plugins\n!.yarn/re"
},
{
"path": ".npmrc",
"chars": 50,
"preview": "engine-strict=true\nscripts-prepend-node-path=true\n"
},
{
"path": ".prettierrc",
"chars": 119,
"preview": "{\n \"tabWidth\": 2,\n \"useTabs\": false,\n \"singleQuote\": true,\n \"trailingComma\": \"all\",\n \"quoteProps\": \"consistent\"\n}\n"
},
{
"path": ".vscode/launch.json",
"chars": 481,
"preview": "{\n // Use IntelliSense to learn about possible attributes.\n // Hover to view descriptions of existing attributes.\n"
},
{
"path": "README.md",
"chars": 10959,
"preview": "<div align=\"center\" markdown=\"1\">\n <sup>Special thanks to:</sup>\n <br>\n <br>\n <a href=\"https://go.warp.dev/pear-"
},
{
"path": "assets/error.html",
"chars": 1149,
"preview": "<!doctype html>\n<html>\n <head>\n <meta charset=\"utf-8\" />\n <title>Cannot load Pear Desktop</title>\n <style>\n "
},
{
"path": "assets/generated/icons/mac/icon.icon/icon.json",
"chars": 1305,
"preview": "{\n \"fill\" : {\n \"linear-gradient\" : [\n \"display-p3:1.00000,1.00000,1.00000,1.00000\",\n \"srgb:0.84314,0.84314"
},
{
"path": "assets/mdui.css",
"chars": 19653,
"preview": ":root {\n --mdui-breakpoint-xs: 0px;\n --mdui-breakpoint-sm: 600px;\n --mdui-breakpoint-md: 840px;\n --mdui-breakpoint-l"
},
{
"path": "changelog.md",
"chars": 223446,
"preview": "### Changelog\n\nAll notable changes to this project will be documented in this file. Dates are displayed in UTC.\n\n#### [v"
},
{
"path": "electron-builder.yml",
"chars": 2807,
"preview": "appId: \"com.github.th-ch.\\u0079\\u006f\\u0075\\u0074\\u0075\\u0062\\u0065\\u002d\\u006d\\u0075\\u0073\\u0069\\u0063\"\nproductName: \"\\"
},
{
"path": "electron.vite.config.mts",
"chars": 4077,
"preview": "import { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { defineConfig } f"
},
{
"path": "eslint.config.mjs",
"chars": 3814,
"preview": "//@ts-check\n\nimport eslint from '@eslint/js';\nimport prettier from 'eslint-plugin-prettier/recommended';\nimport solid fr"
},
{
"path": "license",
"chars": 1144,
"preview": "The MIT License (MIT)\n\nCopyright (c) th-ch <th-ch@users.noreply.github.com> (https://github.com/pear-devs/pear-desktop)\n"
},
{
"path": "package.json",
"chars": 7315,
"preview": "{\n \"name\": \"\\u0079\\u006f\\u0075\\u0074\\u0075\\u0062\\u0065\\u002d\\u006d\\u0075\\u0073\\u0069\\u0063\",\n \"desktopName\": \"com.gith"
},
{
"path": "patches/@malept__flatpak-bundler@0.4.0.patch",
"chars": 1132,
"preview": "diff --git a/index.js b/index.js\nindex 5968fcf47b69094993b0f861c03f5560e4a6a9b7..0fe16d4f40612c0abfa57898909ce0083f56944"
},
{
"path": "patches/electron-is@3.0.0.patch",
"chars": 938,
"preview": "diff --git a/is.d.ts b/is.d.ts\nindex fb861f7b401914f0f89cb4edf25c51df5cb05812..82144733cd34d88e2deb2e4713b104418e673f2e "
},
{
"path": "patches/file-type@16.5.4.patch",
"chars": 563,
"preview": "diff --git a/core.js b/core.js\nindex d653e66a4056c27cca777d4e25222acae3b2ec85..a91741d67df85fd9627889a6c7197ac4e6a3a813 "
},
{
"path": "patches/kuromoji@0.1.2.patch",
"chars": 264797,
"preview": "diff --git a/build/kuromoji.js b/build/kuromoji.js\nindex f0f4ae9183ff8965fda64a2042f29936f76506d1..fa481f01cb927401e89e4"
},
{
"path": "patches/mdui@2.1.4.patch",
"chars": 1087,
"preview": "diff --git a/jsx.en.d.ts b/jsx.en.d.ts\nindex 514d455dcdb436aaf7b2ee88deaefe01943c8b4b..48dff045dead4315936afd93133619899"
},
{
"path": "patches/vudio@2.1.1.patch",
"chars": 725,
"preview": "diff --git a/umd/vudio.js b/umd/vudio.js\nindex d0d1127e57125ad4e77442af2db4a26998c7b385..c0b66bd4327c65c31dc6e588bfa4ae6"
},
{
"path": "renovate.json",
"chars": 175,
"preview": "{\n \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n \"extends\": [\"config:recommended\"],\n \"labels\": [\"d"
},
{
"path": "src/config/defaults.ts",
"chars": 1894,
"preview": "export interface WindowSizeConfig {\n width: number;\n height: number;\n}\n\nexport interface WindowPositionConfig {\n x: n"
},
{
"path": "src/config/index.ts",
"chars": 1867,
"preview": "import { deepmergeCustom } from 'deepmerge-ts';\n\nimport { store, type IStore } from './store';\nimport { restart } from '"
},
{
"path": "src/config/plugins.ts",
"chars": 1808,
"preview": "import { deepmerge } from 'deepmerge-ts';\nimport { allPlugins } from 'virtual:plugins';\n\nimport { store } from './store'"
},
{
"path": "src/config/store.ts",
"chars": 8183,
"preview": "import Store from 'electron-store';\n\nimport { defaultConfig as defaults } from './defaults';\n\nimport { DefaultPresetList"
},
{
"path": "src/custom-electron-prompt.d.ts",
"chars": 2517,
"preview": "declare module 'custom-electron-prompt' {\n import { type BrowserWindow } from 'electron';\n\n export type SelectOptions "
},
{
"path": "src/i18n/index.ts",
"chars": 556,
"preview": "import i18next, { init, t as i18t, changeLanguage } from 'i18next';\n\nimport { languageResources } from 'virtual:i18n';\n\n"
},
{
"path": "src/i18n/resources/@types/index.ts",
"chars": 222,
"preview": "export interface LanguageResources {\n [lang: string]: {\n translation: Record<string, unknown> & {\n language?: {"
},
{
"path": "src/i18n/resources/ar.json",
"chars": 31311,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"فشل بدأ الاضافة {{pluginName}}::{{context"
},
{
"path": "src/i18n/resources/az.json",
"chars": 6064,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Plagini icra etmək mümkün olmadı {{plugin"
},
{
"path": "src/i18n/resources/be.json",
"chars": 3,
"preview": "{}\n"
},
{
"path": "src/i18n/resources/bg.json",
"chars": 34224,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Неуспешно изпълнение на плъгин {{pluginNa"
},
{
"path": "src/i18n/resources/bn.json",
"chars": 33012,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"প্লাগইন {{pluginName}}::{{contextName}} ক"
},
{
"path": "src/i18n/resources/bs.json",
"chars": 9263,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Greška u izvršavanju dodatka {{pluginName"
},
{
"path": "src/i18n/resources/ca.json",
"chars": 36576,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Error en l'execució de l'extensió {{plugi"
},
{
"path": "src/i18n/resources/cs.json",
"chars": 32600,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Selhalo spuštění pluginu {{pluginName}}::"
},
{
"path": "src/i18n/resources/da.json",
"chars": 10214,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Fejl ved udføring af plugin {{pluginName}"
},
{
"path": "src/i18n/resources/de.json",
"chars": 36003,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Erweiterung {{pluginName}}::{{contextName"
},
{
"path": "src/i18n/resources/el.json",
"chars": 33697,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Απέτυχε η εκτέλεση του plugin {{pluginNam"
},
{
"path": "src/i18n/resources/en.json",
"chars": 32997,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Failed to execute plugin {{pluginName}}::"
},
{
"path": "src/i18n/resources/es.json",
"chars": 36773,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Error al ejecutar el complemento {{plugin"
},
{
"path": "src/i18n/resources/et.json",
"chars": 12305,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"{{pluginName}}::{{contextName}} lisamoodu"
},
{
"path": "src/i18n/resources/eu.json",
"chars": 92,
"preview": "{\n \"language\": {\n \"code\": \"eu\",\n \"local-name\": \"Euskara\",\n \"name\": \"Basque\"\n }\n}\n"
},
{
"path": "src/i18n/resources/fa.json",
"chars": 32568,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"اجراى {{اسمزمىنه}}::{{اسمپلاگىن}} با خطا "
},
{
"path": "src/i18n/resources/fi.json",
"chars": 27645,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Virhe pluginin lataamisessa: {{pluginName"
},
{
"path": "src/i18n/resources/fil.json",
"chars": 33188,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Nabigong patakbuin ang plugin {{pluginNam"
},
{
"path": "src/i18n/resources/fr.json",
"chars": 36663,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Échec de l'exécution du plugin {{pluginNa"
},
{
"path": "src/i18n/resources/gl.json",
"chars": 7469,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Error ao executar o plugin {{pluginName}}"
},
{
"path": "src/i18n/resources/he.json",
"chars": 14739,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"שגיאה בהרצת התוסף {{pluginName}}::{{conte"
},
{
"path": "src/i18n/resources/hi.json",
"chars": 29351,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"{{pluginName}}::{{contextName}} प्लगइन नि"
},
{
"path": "src/i18n/resources/hr.json",
"chars": 34481,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Neuspješno izvršavanje plugina {{pluginNa"
},
{
"path": "src/i18n/resources/hu.json",
"chars": 33826,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Nem sikerült futtatni a bővítményt {{plug"
},
{
"path": "src/i18n/resources/id.json",
"chars": 34466,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Gagal menjalankan plugin {{pluginName}}::"
},
{
"path": "src/i18n/resources/is.json",
"chars": 28323,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Tókst ekki að framkvæma tengiforrit {{plu"
},
{
"path": "src/i18n/resources/it.json",
"chars": 35138,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"È stato impossibile eseguire il plugin {{"
},
{
"path": "src/i18n/resources/ja.json",
"chars": 26887,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"プラグイン・{{pluginName}}:{{contextName}}の実行に失"
},
{
"path": "src/i18n/resources/ka.json",
"chars": 10902,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"დამატების შესრულების შეცდომა {{pluginName"
},
{
"path": "src/i18n/resources/kmr.json",
"chars": 3,
"preview": "{}\n"
},
{
"path": "src/i18n/resources/kn.json",
"chars": 91,
"preview": "{\n \"language\": {\n \"code\": \"kn\",\n \"local-name\": \"ಕನ್ನಡ\",\n \"name\": \"Kannada\"\n }\n}\n"
},
{
"path": "src/i18n/resources/ko.json",
"chars": 27633,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"확장 {{pluginName}}::{{contextName}}을(를) 실행"
},
{
"path": "src/i18n/resources/lt.json",
"chars": 35553,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Nepavyko įvykdyti įskiepio {{pluginName}}"
},
{
"path": "src/i18n/resources/lv.json",
"chars": 21693,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Problēma ielādēt plaginu {{pluginName}}::"
},
{
"path": "src/i18n/resources/ml.json",
"chars": 4272,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"{{pluginName}}::{{contextName}} പ്ലഗിൻ നട"
},
{
"path": "src/i18n/resources/ms.json",
"chars": 23069,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Pelaksaan plugin gagal {{pluginName}}::{{"
},
{
"path": "src/i18n/resources/nb.json",
"chars": 20464,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Klarte ikke å kjøre programtillegg {{plug"
},
{
"path": "src/i18n/resources/ne.json",
"chars": 31410,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"प्लगइन {{pluginName}}::{{contextName}} को"
},
{
"path": "src/i18n/resources/nl.json",
"chars": 35093,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Mislukt om plugin {{pluginName}}::{{conte"
},
{
"path": "src/i18n/resources/pl.json",
"chars": 34469,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Błąd uruchamiania wtyczki {{pluginName}}:"
},
{
"path": "src/i18n/resources/pt-BR.json",
"chars": 35393,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Falha ao executar plugin {{pluginName}}::"
},
{
"path": "src/i18n/resources/pt.json",
"chars": 34477,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Falha ao executar o plugin {{pluginName}}"
},
{
"path": "src/i18n/resources/qu.json",
"chars": 612,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Pluginta mana ruwayta atirqanchu {{plugin"
},
{
"path": "src/i18n/resources/ro.json",
"chars": 33996,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Nu s-a reusit executarea plugin-ului {{pl"
},
{
"path": "src/i18n/resources/ru.json",
"chars": 34073,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Ошибка при выполнении плагина {{pluginNam"
},
{
"path": "src/i18n/resources/sah.json",
"chars": 387,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Плагины толорор кыаҕа суох {{pluginName}}"
},
{
"path": "src/i18n/resources/si.json",
"chars": 7486,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"ප්ලගිනය ක්රියාත්මක කිරීමට අසමත් විය {{pl"
},
{
"path": "src/i18n/resources/sk.json",
"chars": 31599,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Nepodarilo sa spustiť plugin {{pluginName"
},
{
"path": "src/i18n/resources/sl.json",
"chars": 18896,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Napaka pri inicilizaciji dodatka {{plugin"
},
{
"path": "src/i18n/resources/sq.json",
"chars": 2162,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Dështoi në ekzekutimin e plugin-it {{plug"
},
{
"path": "src/i18n/resources/sr.json",
"chars": 34528,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Neuspešno izvršavanje ekstenzije {{plugin"
},
{
"path": "src/i18n/resources/sv.json",
"chars": 33125,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Misslyckades med att köra tillägget {{plu"
},
{
"path": "src/i18n/resources/ta.json",
"chars": 34256,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"சொருகி செயல்படுத்துவதில் தோல்வி {{pluginN"
},
{
"path": "src/i18n/resources/te.json",
"chars": 2061,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"{{pluginName}}::{{contextName}} ప్లగిన్న"
},
{
"path": "src/i18n/resources/th.json",
"chars": 31697,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"ปลั๊กอิน {{pluginName}}::{{contextName}} "
},
{
"path": "src/i18n/resources/tr.json",
"chars": 35251,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"{{pluginName}}::{{contextName}} eklentisi"
},
{
"path": "src/i18n/resources/uk.json",
"chars": 33647,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Не вдалося виконати плагін {{pluginName}}"
},
{
"path": "src/i18n/resources/ur.json",
"chars": 7890,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"پلگ ان {{pluginName}}::{{contextName}} پر"
},
{
"path": "src/i18n/resources/vi.json",
"chars": 34582,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"Lỗi thực thi plugin {{pluginName}}::{{con"
},
{
"path": "src/i18n/resources/zh-CN.json",
"chars": 25994,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"执行插件 {{pluginName}}::{{contextName}} 失败\","
},
{
"path": "src/i18n/resources/zh-TW.json",
"chars": 26118,
"preview": "{\n \"common\": {\n \"console\": {\n \"plugins\": {\n \"execute-failed\": \"外掛 {{pluginName}} 無法執行::{{contextName}}\","
},
{
"path": "src/index.html",
"chars": 463,
"preview": "<!-- WARNING:\n\n This file only exists for the build system to work properly.\n Any changes done here won't be refle"
},
{
"path": "src/index.ts",
"chars": 27973,
"preview": "import path from 'node:path';\nimport url from 'node:url';\nimport fs from 'node:fs';\n\nimport {\n BrowserWindow,\n app,\n "
},
{
"path": "src/loader/main.ts",
"chars": 4501,
"preview": "import { type BrowserWindow, ipcMain } from 'electron';\n\nimport { deepmerge } from 'deepmerge-ts';\nimport { allPlugins, "
},
{
"path": "src/loader/menu.ts",
"chars": 2416,
"preview": "import { deepmerge } from 'deepmerge-ts';\nimport { allPlugins } from 'virtual:plugins';\n\nimport * as config from '@/conf"
},
{
"path": "src/loader/preload.ts",
"chars": 2998,
"preview": "import { deepmerge } from 'deepmerge-ts';\nimport { allPlugins, preloadPlugins } from 'virtual:plugins';\n\nimport { Logger"
},
{
"path": "src/loader/renderer.ts",
"chars": 3997,
"preview": "import { deepmerge } from 'deepmerge-ts';\n\nimport { rendererPlugins } from 'virtual:plugins';\n\nimport { LoggerPrefix, st"
},
{
"path": "src/menu.ts",
"chars": 25323,
"preview": "import is from 'electron-is';\nimport {\n app,\n type BrowserWindow,\n clipboard,\n dialog,\n Menu,\n type MenuItem,\n sh"
},
{
"path": "src/music-player.css",
"chars": 2042,
"preview": "/**\n * Overriding default style\n */\n\n/* Allow window dragging */\nytmusic-nav-bar {\n position: relative;\n}\nytmusic-nav-b"
},
{
"path": "src/navigation.d.ts",
"chars": 2701,
"preview": "/* eslint-disable @typescript-eslint/no-explicit-any */\n\ninterface NavigationOptions {\n info: any;\n}\n\ninterface Navigat"
},
{
"path": "src/pear-desktop.ts",
"chars": 685,
"preview": "/// <reference types=\"electron-vite/node\" />\n\ndeclare module '*.html' {\n const html: string;\n\n export default html;\n}\n"
},
{
"path": "src/plugins/album-actions/index.tsx",
"chars": 8685,
"preview": "import { render } from 'solid-js/web';\n\nimport { createSignal, Show } from 'solid-js';\n\nimport { t } from '@/i18n';\nimpo"
},
{
"path": "src/plugins/album-actions/templates/dislike-button.tsx",
"chars": 3243,
"preview": "export interface DislikeButtonProps {\n onClick?: (e: MouseEvent) => void;\n maskSize: string;\n}\n\nexport const DislikeBu"
},
{
"path": "src/plugins/album-actions/templates/index.ts",
"chars": 134,
"preview": "export * from './like-button';\nexport * from './dislike-button';\nexport * from './undislike-button';\nexport * from './un"
},
{
"path": "src/plugins/album-actions/templates/like-button.tsx",
"chars": 3153,
"preview": "export interface LikeButtonProps {\n onClick?: (e: MouseEvent) => void;\n maskSize: string;\n}\n\nexport const LikeButton ="
},
{
"path": "src/plugins/album-actions/templates/undislike-button.tsx",
"chars": 3792,
"preview": "export interface UnDislikeButtonProps {\n onClick?: (e: MouseEvent) => void;\n maskSize: string;\n}\n\nexport const UnDisli"
},
{
"path": "src/plugins/album-actions/templates/unlike-button.tsx",
"chars": 3804,
"preview": "export interface UnLikeButtonProps {\n onClick?: (e: MouseEvent) => void;\n maskSize: string;\n}\n\nexport const UnLikeButt"
},
{
"path": "src/plugins/album-color-theme/index.ts",
"chars": 8940,
"preview": "import { FastAverageColor } from 'fast-average-color';\nimport Color, { type ColorInstance } from 'color';\n\nimport style "
},
{
"path": "src/plugins/album-color-theme/style.css",
"chars": 2844,
"preview": "yt-page-navigation-progress {\n --yt-page-navigation-container-color: #00000046 !important;\n --yt-page-navigation-progr"
},
{
"path": "src/plugins/ambient-mode/index.ts",
"chars": 8914,
"preview": "import style from './style.css?inline';\n\nimport { t } from '@/i18n';\nimport { createPlugin } from '@/utils';\nimport { me"
},
{
"path": "src/plugins/ambient-mode/menu.ts",
"chars": 3588,
"preview": "import { type MenuItemConstructorOptions } from 'electron';\n\nimport { t } from '@/i18n';\nimport { type MenuContext } fro"
},
{
"path": "src/plugins/ambient-mode/style.css",
"chars": 997,
"preview": "#song-video canvas.html5-blur-canvas,\n#song-image .html5-blur-image {\n filter: blur(var(--blur, 100px));\n opacity: var"
},
{
"path": "src/plugins/ambient-mode/types.ts",
"chars": 203,
"preview": "export type AmbientModePluginConfig = {\n enabled: boolean;\n quality: number;\n buffer: number;\n interpolationTime: nu"
},
{
"path": "src/plugins/amuse/backend.ts",
"chars": 1719,
"preview": "import { t } from 'i18next';\n\nimport { type Context, Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { serv"
},
{
"path": "src/plugins/amuse/index.ts",
"chars": 516,
"preview": "import { createPlugin } from '@/utils';\nimport backend from './backend';\nimport { APPLICATION_NAME, t } from '@/i18n';\n\n"
},
{
"path": "src/plugins/amuse/types.ts",
"chars": 346,
"preview": "export interface PlayerInfo {\n hasSong: boolean;\n isPaused: boolean;\n seekbarCurrentPosition: number;\n}\n\nexport inter"
},
{
"path": "src/plugins/api-server/backend/api-version.ts",
"chars": 33,
"preview": "export const API_VERSION = 'v1';\n"
},
{
"path": "src/plugins/api-server/backend/index.ts",
"chars": 24,
"preview": "export * from './main';\n"
},
{
"path": "src/plugins/api-server/backend/main.ts",
"chars": 5486,
"preview": "import { createServer as createHttpServer } from 'node:http';\nimport { createServer as createHttpsServer } from 'node:ht"
},
{
"path": "src/plugins/api-server/backend/routes/auth.ts",
"chars": 2352,
"preview": "import { createRoute, z } from '@hono/zod-openapi';\nimport { dialog } from 'electron';\nimport { sign } from 'hono/jwt';\n"
},
{
"path": "src/plugins/api-server/backend/routes/control.ts",
"chars": 20932,
"preview": "import { createRoute, z } from '@hono/zod-openapi';\nimport { ipcMain } from 'electron';\n\nimport { getSongControls } from"
},
{
"path": "src/plugins/api-server/backend/routes/index.ts",
"chars": 169,
"preview": "export { register as registerControl } from './control';\nexport { register as registerAuth } from './auth';\nexport { reg"
},
{
"path": "src/plugins/api-server/backend/routes/websocket.ts",
"chars": 4132,
"preview": "import { createRoute } from '@hono/zod-openapi';\n\nimport { type NodeWebSocket } from '@hono/node-ws';\n\nimport {\n regist"
},
{
"path": "src/plugins/api-server/backend/scheme/auth.ts",
"chars": 183,
"preview": "import { z } from '@hono/zod-openapi';\n\nexport type JWTPayload = z.infer<typeof JWTPayloadSchema>;\nexport const JWTPaylo"
},
{
"path": "src/plugins/api-server/backend/scheme/go-back.ts",
"chars": 106,
"preview": "import { z } from '@hono/zod-openapi';\n\nexport const GoBackSchema = z.object({\n seconds: z.number(),\n});\n"
},
{
"path": "src/plugins/api-server/backend/scheme/go-forward.ts",
"chars": 109,
"preview": "import { z } from '@hono/zod-openapi';\n\nexport const GoForwardScheme = z.object({\n seconds: z.number(),\n});\n"
},
{
"path": "src/plugins/api-server/backend/scheme/index.ts",
"chars": 282,
"preview": "export * from './auth';\nexport * from './song-info';\nexport * from './seek';\nexport * from './go-back';\nexport * from '."
},
{
"path": "src/plugins/api-server/backend/scheme/queue.ts",
"chars": 503,
"preview": "import { z } from '@hono/zod-openapi';\n\nexport const QueueParamsSchema = z.object({\n index: z.coerce.number().int().non"
},
{
"path": "src/plugins/api-server/backend/scheme/search.ts",
"chars": 176,
"preview": "import { z } from '@hono/zod-openapi';\n\nexport const SearchSchema = z.object({\n query: z.string(),\n params: z.string()"
},
{
"path": "src/plugins/api-server/backend/scheme/seek.ts",
"chars": 104,
"preview": "import { z } from '@hono/zod-openapi';\n\nexport const SeekSchema = z.object({\n seconds: z.number(),\n});\n"
},
{
"path": "src/plugins/api-server/backend/scheme/set-fullscreen.ts",
"chars": 112,
"preview": "import { z } from '@hono/zod-openapi';\n\nexport const SetFullscreenSchema = z.object({\n state: z.boolean(),\n});\n"
},
{
"path": "src/plugins/api-server/backend/scheme/set-volume.ts",
"chars": 108,
"preview": "import { z } from '@hono/zod-openapi';\n\nexport const SetVolumeSchema = z.object({\n volume: z.number(),\n});\n"
},
{
"path": "src/plugins/api-server/backend/scheme/song-info.ts",
"chars": 760,
"preview": "import { z } from '@hono/zod-openapi';\n\nimport { MediaType } from '@/providers/song-info';\n\nexport type ResponseSongInfo"
},
{
"path": "src/plugins/api-server/backend/scheme/switch-repeat.ts",
"chars": 114,
"preview": "import { z } from '@hono/zod-openapi';\n\nexport const SwitchRepeatSchema = z.object({\n iteration: z.number(),\n});\n"
},
{
"path": "src/plugins/api-server/backend/types.ts",
"chars": 760,
"preview": "import { type OpenAPIHono as Hono } from '@hono/zod-openapi';\nimport { type serve } from '@hono/node-server';\n\nimport ty"
},
{
"path": "src/plugins/api-server/config.ts",
"chars": 587,
"preview": "export enum AuthStrategy {\n AUTH_AT_FIRST = 'AUTH_AT_FIRST',\n NONE = 'NONE',\n}\n\nexport interface APIServerConfig {\n e"
},
{
"path": "src/plugins/api-server/index.ts",
"chars": 438,
"preview": "import { createPlugin } from '@/utils';\nimport { t } from '@/i18n';\n\nimport { defaultAPIServerConfig } from './config';\n"
},
{
"path": "src/plugins/api-server/menu.ts",
"chars": 4381,
"preview": "import { dialog } from 'electron';\nimport prompt from 'custom-electron-prompt';\n\nimport { t } from '@/i18n';\nimport prom"
},
{
"path": "src/plugins/audio-compressor.ts",
"chars": 3539,
"preview": "import { createPlugin } from '@/utils';\nimport { t } from '@/i18n';\nimport { type MusicPlayer } from '@/types/music-play"
},
{
"path": "src/plugins/auth-proxy-adapter/backend/index.ts",
"chars": 7084,
"preview": "import * as net from 'node:net';\n\nimport { SocksClient, type SocksClientOptions } from 'socks';\nimport is from 'electron"
},
{
"path": "src/plugins/auth-proxy-adapter/backend/types.ts",
"chars": 518,
"preview": "import type net from 'net';\nimport type { AuthProxyConfig } from '../config';\nimport type { Server } from 'http';\n\nexpor"
},
{
"path": "src/plugins/auth-proxy-adapter/config.ts",
"chars": 211,
"preview": "export interface AuthProxyConfig {\n enabled: boolean;\n hostname: string;\n port: number;\n}\n\nexport const defaultAuthPr"
},
{
"path": "src/plugins/auth-proxy-adapter/index.ts",
"chars": 453,
"preview": "import { createPlugin } from '@/utils';\nimport { t } from '@/i18n';\n\nimport { defaultAuthProxyConfig } from './config';\n"
},
{
"path": "src/plugins/auth-proxy-adapter/menu.ts",
"chars": 1903,
"preview": "import prompt from 'custom-electron-prompt';\n\nimport { t } from '@/i18n';\nimport promptOptions from '@/providers/prompt-"
},
{
"path": "src/plugins/blur-nav-bar/index.ts",
"chars": 638,
"preview": "import { createPlugin } from '@/utils';\n\nimport { t } from '@/i18n';\n\nimport style from './style.css?inline';\n\nexport de"
},
{
"path": "src/plugins/blur-nav-bar/style.css",
"chars": 327,
"preview": "#nav-bar-background,\n#header.ytmusic-item-section-renderer {\n background: rgba(0, 0, 0, 0.3) !important;\n backdrop-fil"
},
{
"path": "src/plugins/captions-selector/back.ts",
"chars": 1004,
"preview": "import prompt from 'custom-electron-prompt';\n\nimport promptOptions from '@/providers/prompt-options';\nimport { createBac"
},
{
"path": "src/plugins/captions-selector/index.ts",
"chars": 1436,
"preview": "import { createPlugin } from '@/utils';\nimport { APPLICATION_NAME, t } from '@/i18n';\n\nimport backend from './back';\nimp"
},
{
"path": "src/plugins/captions-selector/renderer.tsx",
"chars": 4967,
"preview": "import { render } from 'solid-js/web';\nimport { createSignal, Show } from 'solid-js';\n\nimport { createRenderer } from '@"
},
{
"path": "src/plugins/captions-selector/templates/captions-settings-template.tsx",
"chars": 1418,
"preview": "export interface CaptionsSettingsButtonProps {\n label: string;\n onClick: (event: MouseEvent) => void;\n}\n\nexport const "
},
{
"path": "src/plugins/clock/index.tsx",
"chars": 2985,
"preview": "import { render } from 'solid-js/web';\nimport { createSignal, onMount } from 'solid-js';\n\nimport style from './style.css"
},
{
"path": "src/plugins/clock/style.css",
"chars": 99,
"preview": ".clock {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n align-self: center;\n}\n"
},
{
"path": "src/plugins/clock/types.ts",
"chars": 103,
"preview": "export type ClockPluginConfig = {\n enabled: boolean;\n displaySeconds: boolean;\n hour12: boolean;\n};\n"
},
{
"path": "src/plugins/compact-sidebar/index.ts",
"chars": 1154,
"preview": "import { createPlugin } from '@/utils';\nimport { t } from '@/i18n';\n\nexport default createPlugin<\n unknown,\n unknown,\n"
},
{
"path": "src/plugins/crossfade/fader.ts",
"chars": 10815,
"preview": "/**\n * VolumeFader\n * Sophisticated Media Volume Fading\n *\n * Requires browser support for:\n * - HTMLMediaElement\n * - r"
},
{
"path": "src/plugins/crossfade/index.ts",
"chars": 9039,
"preview": "import { Innertube } from '\\u0079\\u006f\\u0075\\u0074\\u0075\\u0062\\u0065i.js';\n\nimport prompt from 'custom-electron-prompt'"
},
{
"path": "src/plugins/custom-output-device/index.ts",
"chars": 1443,
"preview": "import prompt from 'custom-electron-prompt';\n\nimport { t } from '@/i18n';\nimport promptOptions from '@/providers/prompt-"
},
{
"path": "src/plugins/custom-output-device/renderer.ts",
"chars": 2191,
"preview": "import { createRenderer } from '@/utils';\n\nimport type { MusicPlayer } from '@/types/music-player';\nimport type { Render"
},
{
"path": "src/plugins/disable-autoplay/index.ts",
"chars": 2186,
"preview": "import { createPlugin } from '@/utils';\n\nimport { t } from '@/i18n';\n\nimport type { VideoDataChanged } from '@/types/vid"
},
{
"path": "src/plugins/discord/constants.ts",
"chars": 776,
"preview": "/**\n * Application ID registered by @th-ch/pear-desktop dev team\n */\nexport const clientId = '1177081335727267940';\n/**\n"
},
{
"path": "src/plugins/discord/discord-service.ts",
"chars": 12878,
"preview": "import { Client as DiscordClient } from '@xhayper/discord-rpc';\nimport { dev } from 'electron-is';\nimport { ActivityType"
},
{
"path": "src/plugins/discord/index.ts",
"chars": 1859,
"preview": "import { StatusDisplayType } from 'discord-api-types/v10';\n\nimport { createPlugin } from '@/utils';\nimport { backend } f"
},
{
"path": "src/plugins/discord/main.ts",
"chars": 2042,
"preview": "import { app } from 'electron';\n\nimport { registerCallback, SongInfoEvent } from '@/providers/song-info';\nimport { creat"
},
{
"path": "src/plugins/discord/menu.ts",
"chars": 4589,
"preview": "import prompt from 'custom-electron-prompt';\n\nimport { StatusDisplayType } from 'discord-api-types/v10';\n\nimport { disco"
},
{
"path": "src/plugins/discord/timer-manager.ts",
"chars": 1071,
"preview": "import type { TimerKey } from './constants';\n\n/**\n * Manages NodeJS Timers, ensuring only one timer exists per key.\n */\n"
},
{
"path": "src/plugins/discord/utils.ts",
"chars": 3346,
"preview": "import { HANGUL_FILLER } from './constants';\n\nimport { APPLICATION_NAME } from '@/i18n';\n\nimport type { GatewayActivityB"
},
{
"path": "src/plugins/downloader/index.ts",
"chars": 1427,
"preview": "import { DefaultPresetList, type Preset } from './types';\n\nimport style from './style.css?inline';\n\nimport { createPlugi"
},
{
"path": "src/plugins/downloader/main/index.ts",
"chars": 24911,
"preview": "import { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { randomBytes }"
},
{
"path": "src/plugins/downloader/main/utils.ts",
"chars": 779,
"preview": "import { app, type BrowserWindow } from 'electron';\nimport is from 'electron-is';\n\nexport const getFolder = (customFolde"
},
{
"path": "src/plugins/downloader/menu.ts",
"chars": 6547,
"preview": "import { dialog } from 'electron';\nimport prompt from 'custom-electron-prompt';\nimport { deepmerge } from 'deepmerge-ts'"
},
{
"path": "src/plugins/downloader/renderer.tsx",
"chars": 3065,
"preview": "import { createSignal } from 'solid-js';\n\nimport { render } from 'solid-js/web';\n\nimport { defaultConfig } from '@/confi"
},
{
"path": "src/plugins/downloader/style.css",
"chars": 684,
"preview": ".ytmd-menu-item {\n display: var(--ytmusic-menu-item_-_display);\n height: var(--ytmusic-menu-item_-_height);\n align-it"
},
{
"path": "src/plugins/downloader/templates/download.tsx",
"chars": 1554,
"preview": "export const DownloadButton = (props: {\n onClick: () => void;\n text: string;\n}) => (\n <a\n class=\"yt-simple-endpoin"
},
{
"path": "src/plugins/downloader/types.ts",
"chars": 14910,
"preview": "export interface Preset {\n extension?: string | null;\n ffmpegArgs: string[];\n}\n\n// Presets for FFmpeg\nexport const Def"
},
{
"path": "src/plugins/equalizer/index.ts",
"chars": 2518,
"preview": "import { createPlugin } from '@/utils';\nimport { t } from '@/i18n';\n\nimport {\n defaultPresets,\n presetConfigs,\n type "
},
{
"path": "src/plugins/equalizer/presets.ts",
"chars": 379,
"preview": "export const defaultPresets = ['bass-booster'] as const;\nexport type Preset = (typeof defaultPresets)[number];\n\nexport t"
},
{
"path": "src/plugins/exponential-volume/index.ts",
"chars": 2661,
"preview": "import { createPlugin } from '@/utils';\nimport { t } from '@/i18n';\n\nimport type { MusicPlayer } from '@/types/music-pla"
},
{
"path": "src/plugins/in-app-menu/constants.ts",
"chars": 585,
"preview": "export interface InAppMenuConfig {\n enabled: boolean;\n hideDOMWindowControls: boolean;\n}\nexport const defaultInAppMenu"
},
{
"path": "src/plugins/in-app-menu/index.ts",
"chars": 678,
"preview": "import titlebarStyle from './titlebar.css?inline';\nimport { createPlugin } from '@/utils';\nimport { onMainLoad } from '."
},
{
"path": "src/plugins/in-app-menu/main.ts",
"chars": 2447,
"preview": "import { register } from 'electron-localshortcut';\n\nimport {\n BrowserWindow,\n Menu,\n type MenuItem,\n ipcMain,\n nati"
},
{
"path": "src/plugins/in-app-menu/menu.ts",
"chars": 704,
"preview": "import is from 'electron-is';\n\nimport { t } from '@/i18n';\n\nimport type { InAppMenuConfig } from './constants';\nimport t"
},
{
"path": "src/plugins/in-app-menu/renderer/IconButton.tsx",
"chars": 861,
"preview": "import { type JSX } from 'solid-js';\nimport { css } from 'solid-styled-components';\n\nimport { cacheNoArgs } from '@/prov"
},
{
"path": "src/plugins/in-app-menu/renderer/MenuButton.tsx",
"chars": 1004,
"preview": "import { type JSX, splitProps } from 'solid-js';\nimport { css } from 'solid-styled-components';\n\nimport { cacheNoArgs } "
},
{
"path": "src/plugins/in-app-menu/renderer/Panel.tsx",
"chars": 4515,
"preview": "import { createSignal, type JSX, Show, splitProps, mergeProps } from 'solid-js';\nimport { Portal } from 'solid-js/web';\n"
},
{
"path": "src/plugins/in-app-menu/renderer/PanelItem.tsx",
"chars": 10850,
"preview": "import { createSignal, Match, Show, Switch } from 'solid-js';\nimport { type JSX } from 'solid-js/jsx-runtime';\nimport { "
},
{
"path": "src/plugins/in-app-menu/renderer/TitleBar.tsx",
"chars": 12948,
"preview": "import { type Menu, type MenuItem } from 'electron';\nimport {\n createEffect,\n createResource,\n createSignal,\n Index,"
},
{
"path": "src/plugins/in-app-menu/renderer/WindowController.tsx",
"chars": 3057,
"preview": "import { css } from 'solid-styled-components';\nimport { Show } from 'solid-js';\n\nimport { IconButton } from './IconButto"
},
{
"path": "src/plugins/in-app-menu/renderer.tsx",
"chars": 1820,
"preview": "import { createSignal } from 'solid-js';\nimport { render } from 'solid-js/web';\n\nimport { TitleBar } from './renderer/Ti"
},
{
"path": "src/plugins/in-app-menu/titlebar.css",
"chars": 2587,
"preview": ":root {\n --titlebar-background-color: var(--ytmusic-color-black3);\n --menu-bar-height: 32px;\n}\n\n/* original style */\ny"
},
{
"path": "src/plugins/lumiastream/index.ts",
"chars": 2836,
"preview": "import { net } from 'electron';\n\nimport { createPlugin } from '@/utils';\nimport { registerCallback } from '@/providers/s"
},
{
"path": "src/plugins/music-together/connection.ts",
"chars": 6488,
"preview": "import { type DataConnection, Peer, type PeerError } from 'peerjs';\n\nimport type { Permission, Profile, VideoData } from"
}
]
// ... and 168 more files (download for full content)
About this extraction
This page contains the full source code of the pear-devs/pear-desktop GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 368 files (2.8 MB), approximately 765.2k tokens, and a symbol index with 1172 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.