mirror of
https://github.com/aunetx/deezer-linux.git
synced 2025-07-31 01:24:20 +02:00
Compare commits
120 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
d8676754fc | ||
|
7dc1bde5df | ||
|
d7087d9bbc | ||
|
a7c7eb234d | ||
|
f0b4123be4 | ||
|
8f7683238f | ||
|
63db934f26 | ||
|
9e2b8ea82f | ||
|
d627be3d15 | ||
|
f8295006a5 | ||
|
64676ca3df | ||
|
5eb113d5e9 | ||
|
a5b5b91a9e | ||
|
9ac53b9b4e | ||
|
ab48516655 | ||
|
260f182504 | ||
|
953841da37 | ||
|
1b6608b401 | ||
|
1e6e83ae1c | ||
|
d8e2a9fa88 | ||
|
b76d5c076f | ||
|
bc8546bdcf | ||
|
0ea9eb377a | ||
|
7b10a66fc8 | ||
|
e9da7c98ff | ||
|
6d86d581b4 | ||
|
63d105587f | ||
|
2b84c3843c | ||
|
947b699d25 | ||
|
f9bb477489 | ||
|
d5cb310799 | ||
|
9f42fb1046 | ||
|
56479b3a04 | ||
|
01640bf48e | ||
|
d141e6a488 | ||
|
9a71d22a3c | ||
|
088833f749 | ||
|
a173bd7f98 | ||
|
cfcfb3389d | ||
|
1f44368fcf | ||
|
2cb5be87cb | ||
|
f8c1544f66 | ||
|
2f0700674e | ||
|
f1f8875e48 | ||
|
311631902b | ||
|
84fcee0eac | ||
|
e8fddae75a | ||
|
7e4c82a817 | ||
|
68a8c7bebb | ||
|
74383173c1 | ||
|
b367604028 | ||
|
713bfb559b | ||
|
b199dead1e | ||
|
d12c45308d | ||
|
bd1afe3cfa | ||
|
3417a68f8f | ||
|
105a00f5b5 | ||
|
845a09358d | ||
|
b58911f9f7 | ||
|
5d3ae96a75 | ||
|
760fa0f756 | ||
|
74e8ff28b8 | ||
|
836419dd02 | ||
|
51e9a2608f | ||
|
97a94348de | ||
|
e47eeb980b | ||
|
3f4767f848 | ||
|
81d6bb7c3b | ||
|
1e54f060ea | ||
|
da79ac3131 | ||
|
e5cd64a9f3 | ||
|
5bd7ead2ca | ||
|
849f5eb11b | ||
|
49727f17de | ||
|
96684b3567 | ||
|
bc584343c8 | ||
|
3ee1a84cd1 | ||
|
22dcfe4c54 | ||
|
10aa5f2e66 | ||
|
b745827f79 | ||
|
0c24e392a4 | ||
|
48f7c30faf | ||
|
ad63745c28 | ||
|
9d47839fbd | ||
|
d537f3a0b3 | ||
|
0ed3dd5721 | ||
|
dd86b22625 | ||
|
97445fe29e | ||
|
15b9b5af42 | ||
|
598fe85856 | ||
|
aa3896377b | ||
|
09a385ba10 | ||
|
95aa2e7fb8 | ||
|
02f645c28f | ||
|
2504c7cacd | ||
|
0aa8632373 | ||
|
638638c5cb | ||
|
7ca5b2b5d0 | ||
|
9d6ad6fd88 | ||
|
a652d438e7 | ||
|
8ff9dc5add | ||
|
719197ccbc | ||
|
b4699a0df3 | ||
|
987db981bf | ||
|
cf0512f363 | ||
|
c65da965f2 | ||
|
755bd408a4 | ||
|
19f4f96c03 | ||
|
3fdb1a32e9 | ||
|
aafecf10b5 | ||
|
6d5479cfa7 | ||
|
c2cd7e5b6a | ||
|
e6bb283da2 | ||
|
11c0432a26 | ||
|
8fc400e267 | ||
|
9d4fba78a8 | ||
|
4206090408 | ||
|
e3dcd9e252 | ||
|
f8c2b9eba0 | ||
|
64bcd449bb |
2
.github/FUNDING.yml
vendored
2
.github/FUNDING.yml
vendored
@ -1,2 +0,0 @@
|
||||
github: aunetx
|
||||
ko_fi: aunetx
|
120
.github/ISSUE_TEMPLATE/bug.yml
vendored
Normal file
120
.github/ISSUE_TEMPLATE/bug.yml
vendored
Normal file
@ -0,0 +1,120 @@
|
||||
name: 🐛 Bug Report
|
||||
description: Report a reproducible issue for the project on Linux systems
|
||||
title: "[BUG] <Short bug description>"
|
||||
labels: [bug]
|
||||
assignees: [josselinonduty]
|
||||
|
||||
body:
|
||||
- type: checkboxes
|
||||
id: precheck
|
||||
attributes:
|
||||
label: Preliminary Checks
|
||||
options:
|
||||
- label: I am using a **recent version** of the project.
|
||||
required: true
|
||||
- label: I have **read the [FAQ section](https://github.com/aunetx/deezer-linux?tab=readme-ov-file#faq)** of the documentation.
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: description
|
||||
attributes:
|
||||
label: Short Description
|
||||
description: A concise description of the bug.
|
||||
placeholder: "e.g., Application crashes when launched with --example-flag"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: reproduction
|
||||
attributes:
|
||||
label: Steps to Reproduce
|
||||
description: List the precise steps to reproduce the issue.
|
||||
placeholder: |
|
||||
1. Run '...'
|
||||
2. Click on '...'
|
||||
3. Observe '...'
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: observed
|
||||
attributes:
|
||||
label: Observed Behavior
|
||||
description: Describe what actually happened.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: expected
|
||||
attributes:
|
||||
label: Expected Behavior
|
||||
description: Describe what you expected to happen instead.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: environment-os
|
||||
attributes:
|
||||
label: Operating System
|
||||
description: |
|
||||
Please provide the results of the following command:
|
||||
```bash
|
||||
lsb_release -a ; uname -mr
|
||||
```
|
||||
placeholder: |
|
||||
e.g.
|
||||
Distributor ID: Ubuntu
|
||||
Description: Ubuntu 22.04.1 LTS
|
||||
Release: 22.04
|
||||
Codename: jammy
|
||||
6.7.0-26-generic x86_64
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: environment-version
|
||||
attributes:
|
||||
label: Project Version and Package
|
||||
description: |
|
||||
Please provide information about the package version and architecture.
|
||||
|
||||
For flatpak users, you can find this information with:
|
||||
```bash
|
||||
flatpak info dev.aunetx.deezer
|
||||
```
|
||||
For snap users, you can find this information with:
|
||||
```bash
|
||||
snap list deezer-desktop
|
||||
```
|
||||
placeholder: "e.g. deezer-desktop-7.0.110-arm64.AppImage"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: environment-env
|
||||
attributes:
|
||||
label: Environment Variables
|
||||
description: |
|
||||
It is highly recommended to fill this section if your issue is related to running or logging into the app.
|
||||
|
||||
You may provide a **redacted** version of the following command:
|
||||
```bash
|
||||
env
|
||||
```
|
||||
Make sure to remove any sensitive or private data.
|
||||
placeholder: |
|
||||
e.g.
|
||||
PATH=/usr/bin:...
|
||||
HOME=/home/<redacted>
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: textarea
|
||||
id: extra
|
||||
attributes:
|
||||
label: Additional Information (Optional)
|
||||
description: |
|
||||
Any additional context, logs, screenshots, or configuration details that could help us investigate the issue.
|
||||
render: markdown
|
||||
validations:
|
||||
required: false
|
18
.github/workflows/build-artifacts.yml
vendored
18
.github/workflows/build-artifacts.yml
vendored
@ -11,10 +11,13 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: checkout repo
|
||||
uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
uses: actions/checkout@v4
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 18
|
||||
node-version: 22
|
||||
- name: prepare runner
|
||||
run: |
|
||||
sudo snap install snapcraft --classic
|
||||
|
||||
- name: install_deps
|
||||
run: make install_deps
|
||||
@ -25,6 +28,8 @@ jobs:
|
||||
run: make build_rpm_x64
|
||||
- name: build_appimage_x64
|
||||
run: make build_appimage_x64
|
||||
- name: build_snap_x64
|
||||
run: make build_snap_x64
|
||||
- name: build_tar.xz_x64
|
||||
run: make build_tar.xz_x64
|
||||
|
||||
@ -34,6 +39,8 @@ jobs:
|
||||
run: make build_rpm_arm64
|
||||
- name: build_appimage_arm64
|
||||
run: make build_appimage_arm64
|
||||
# - name: build_snap_arm64 # This step is currently disabled due to issues with snapcraft + arm64 on github runners
|
||||
# run: make build_snap_arm64
|
||||
- name: build_tar.xz_arm64
|
||||
run: make build_tar.xz_arm64
|
||||
|
||||
@ -41,10 +48,10 @@ jobs:
|
||||
run: echo "version=${GITHUB_REF/refs\/tags\//}" >> "$GITHUB_ENV"
|
||||
|
||||
- name: Generate sha256
|
||||
run: echo "$(sha256sum artifacts/{x64,arm64}/*.{deb,rpm,AppImage,tar.xz})" > sha256
|
||||
run: echo "$(sha256sum artifacts/{x64,arm64}/*.{deb,rpm,AppImage,tar.xz} artifacts/x64/*.snap)" > sha256
|
||||
|
||||
- name: create release
|
||||
uses: softprops/action-gh-release@v1
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
tag_name: ${{ env.version }}
|
||||
body: 'Update to version ${{ env.version }}'
|
||||
@ -53,6 +60,7 @@ jobs:
|
||||
artifacts/x64/*.deb
|
||||
artifacts/x64/*.rpm
|
||||
artifacts/x64/*.AppImage
|
||||
artifacts/x64/*.snap
|
||||
artifacts/x64/*.tar.xz
|
||||
artifacts/arm64/*.deb
|
||||
artifacts/arm64/*.rpm
|
||||
|
10
.github/workflows/build.yml
vendored
10
.github/workflows/build.yml
vendored
@ -9,10 +9,10 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: checkout repo
|
||||
uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
uses: actions/checkout@v4
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 18
|
||||
node-version: 22
|
||||
|
||||
- name: install_deps
|
||||
run: make install_deps
|
||||
@ -21,11 +21,11 @@ jobs:
|
||||
- name: build_appimage_arm64
|
||||
run: make build_appimage_arm64
|
||||
|
||||
- uses: actions/upload-artifact@v2
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: deezer-desktop-nightly-build-x64.AppImage
|
||||
path: artifacts/x64/deezer-desktop-*.AppImage
|
||||
- uses: actions/upload-artifact@v2
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: deezer-desktop-nightly-build-arm64.AppImage
|
||||
path: artifacts/arm64/deezer-desktop-*.AppImage
|
||||
|
29
.github/workflows/update-check.yml
vendored
Normal file
29
.github/workflows/update-check.yml
vendored
Normal file
@ -0,0 +1,29 @@
|
||||
name: Check for updates
|
||||
on:
|
||||
schedule: # for scheduling to work this file must be in the default branch
|
||||
- cron: "0 0 * * 1" # run every Monday
|
||||
workflow_dispatch: # can be manually dispatched under GitHub's "Actions" tab
|
||||
|
||||
jobs:
|
||||
flatpak-external-data-checker:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
branch: [ master ] # list all branches to check
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ matrix.branch }}
|
||||
|
||||
- uses: docker://ghcr.io/flathub/flatpak-external-data-checker:latest
|
||||
env:
|
||||
GIT_AUTHOR_NAME: Flatpak External Data Checker
|
||||
GIT_COMMITTER_NAME: Flatpak External Data Checker
|
||||
# email sets "github-actions[bot]" as commit author, see https://github.community/t/github-actions-bot-email-address/17204/6
|
||||
GIT_AUTHOR_EMAIL: 41898282+github-actions[bot]@users.noreply.github.com
|
||||
GIT_COMMITTER_EMAIL: 41898282+github-actions[bot]@users.noreply.github.com
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
args: --update --never-fork dev.aunetx.deezer.json
|
13
.gitignore
vendored
13
.gitignore
vendored
@ -1,7 +1,8 @@
|
||||
node_modules
|
||||
flatpak
|
||||
source
|
||||
app
|
||||
source/
|
||||
node_modules/
|
||||
flatpak/
|
||||
app/
|
||||
artifacts/
|
||||
.vscode/
|
||||
package-lock.json
|
||||
artifacts
|
||||
package.json
|
||||
yarn.lock
|
||||
|
8
.prettierrc.json
Normal file
8
.prettierrc.json
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"semi": true,
|
||||
"singleQuote": false,
|
||||
"trailingComma": "es5",
|
||||
"tabWidth": 2,
|
||||
"useTabs": false,
|
||||
"arrowParens": "always"
|
||||
}
|
153
CONTRIBUTING.md
Normal file
153
CONTRIBUTING.md
Normal file
@ -0,0 +1,153 @@
|
||||
# Contributing to Deezer Linux
|
||||
|
||||
Thank you for considering contributing to the unofficial Deezer Linux port! This document provides guidelines for contributing to the project.
|
||||
|
||||
## Code of Conduct
|
||||
|
||||
By participating in this project, you agree to maintain a respectful and inclusive environment for everyone.
|
||||
|
||||
## How to Contribute
|
||||
|
||||
### Reporting Bugs
|
||||
|
||||
- Before creating an issue, please check if it hasn't been reported already
|
||||
- Use the issue template if available
|
||||
- Include detailed steps to reproduce the bug
|
||||
- Specify your system information (OS, architecture, package type)
|
||||
|
||||
### Suggesting Enhancements
|
||||
|
||||
- Use clear and descriptive titles
|
||||
- Provide a step-by-step description of the suggested enhancement
|
||||
- Explain why this enhancement would be useful
|
||||
|
||||
### Pull Requests
|
||||
|
||||
1. Fork the repository
|
||||
2. Create a new branch (`git checkout -b feature/your-feature`)
|
||||
3. Make your changes
|
||||
4. Build one or more packages
|
||||
5. Commit your changes (`git commit -m 'feat: Add some feature'`)
|
||||
6. Push to the branch (`git push origin feature/your-feature`)
|
||||
7. Open a Pull Request
|
||||
8. Provide information about the changes made and the packages built and manually tested
|
||||
|
||||
### Build Requirements
|
||||
|
||||
Ensure you have all required dependencies:
|
||||
|
||||
- Node.js (22 recommended)
|
||||
- npm
|
||||
- 7z
|
||||
- make
|
||||
- wget
|
||||
|
||||
## Development Setup
|
||||
|
||||
```sh
|
||||
make install_deps
|
||||
```
|
||||
|
||||
## Patching
|
||||
|
||||
### Creating a Patch
|
||||
|
||||
To create a patch, clone the repository and run:
|
||||
|
||||
```sh
|
||||
make patch-new
|
||||
```
|
||||
|
||||
Edit the files you want to change in the `app` directory.
|
||||
|
||||
> [!TIP]
|
||||
> You do not need to generate a patch file to test your changes. Open the `app` folder after running `make patch-new` and make your changes. Then run `make build_{target}_{arch}` to try your changes.
|
||||
|
||||
When you are done, make sure that the only files you modified are the ones you want to include in the patch. You can check this by running:
|
||||
|
||||
```sh
|
||||
git status
|
||||
```
|
||||
|
||||
Then, generate the patch:
|
||||
|
||||
```sh
|
||||
make patch-gen
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> This command will take care of pretty printing your patch and creating a patch file.
|
||||
|
||||
The patch will be saved in the `patches` directory. Make sure to rename the patch file to something meaningful and follow the naming convention. Add the patch to the echoed list in the `Makefile`.
|
||||
|
||||
> [!TIP]
|
||||
> If possible, you may want to add a switch to allow the users to use the feature you added or not. Do not forget to [mention it](./README.md#usage).
|
||||
|
||||
You can now try your patch by building and executing the package:
|
||||
|
||||
```sh
|
||||
make build_{target}_{arch}
|
||||
```
|
||||
|
||||
### Applying a Patch
|
||||
|
||||
To manually apply a patch, run:
|
||||
|
||||
```sh
|
||||
apply -p1 -dapp < patches/{name}.patch
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> Deezer does not provide all the information needed to implement some features.
|
||||
>
|
||||
> Deezer provides:
|
||||
>
|
||||
> - Player state (playing, paused)
|
||||
> - Track metadata (title, artist, album, cover URL, duration, and more)
|
||||
> - Shuffle and repeat state
|
||||
>
|
||||
> Deezer does not provide:
|
||||
>
|
||||
> - Track position
|
||||
|
||||
## Updating
|
||||
|
||||
### Updating the Source Executable
|
||||
|
||||
_This section is automated via GitHub Actions, but can be done manually._
|
||||
|
||||
1. Update the source executable URL:
|
||||
|
||||
```sh
|
||||
curl -Ls -o /dev/null -w %{url_effective} https://www.deezer.com/desktop/download\?platform\=win32\&architecture\=x86
|
||||
```
|
||||
|
||||
2. Update the source executable SHA256:
|
||||
|
||||
```sh
|
||||
curl -Ls https://www.deezer.com/desktop/download\?platform\=win32\&architecture\=x86 | sha256sum
|
||||
```
|
||||
|
||||
### Updating the Electron Version
|
||||
|
||||
_This section is not automated via GitHub Actions._
|
||||
|
||||
To get the Electron version used, run:
|
||||
|
||||
```sh
|
||||
strings ./source/Deezer.exe | grep '^Chrome/[0-9.]* Electron/[0-9.]*'
|
||||
```
|
||||
|
||||
## Legal Notes
|
||||
|
||||
Remember that this is an unofficial port. Any contribution must:
|
||||
|
||||
- Respect Deezer's intellectual property
|
||||
- Not modify core Deezer functionality
|
||||
- Follow software distribution best practices
|
||||
|
||||
## Questions?
|
||||
|
||||
Open an issue for any questions not covered by this guide.
|
||||
|
||||
Thank you for contributing!
|
105
Makefile
105
Makefile
@ -1,86 +1,129 @@
|
||||
# Maintainer: Aurélien Hamy <aunetx@yandex.com>
|
||||
|
||||
APPNAME = dev.aunetx.deezer
|
||||
PKGVER = 6.0.10
|
||||
BASE_URL = https://www.deezer.com/desktop/download/artifact/win32/x86/$(PKGVER)
|
||||
BASE_URL = $(shell jq ".modules[0].sources[0].url" dev.aunetx.deezer.json)
|
||||
SHA256 = $(shell jq ".modules[0].sources[0].sha256" dev.aunetx.deezer.json)
|
||||
PKGVER = $(shell echo $(BASE_URL) | grep -Eo "([0-9]+\.[0-9]+\.[0-9]+)" | head -1)
|
||||
VERSION_REGEX = ^v$(PKGVER)-[0-9]{1,}$$
|
||||
|
||||
SOURCE_DIR ?= ./source
|
||||
APP_DIR ?= ./app
|
||||
PACKAGE_MANAGER ?= npm
|
||||
PACKAGE_MANAGER_SUBDIR_ARG ?= --prefix
|
||||
PACKAGE_MANAGER_INSTALL_CMD ?= install
|
||||
PACKAGE_MANAGER_ADD_CMD ?= install
|
||||
|
||||
install_build_deps:
|
||||
@npm install --engine-strict asar
|
||||
@npm install prettier@2.8.8
|
||||
@$(PACKAGE_MANAGER) $(PACKAGE_MANAGER_INSTALL_CMD)
|
||||
|
||||
prepare: clean install_build_deps
|
||||
@mkdir -p source
|
||||
@mkdir -p $(SOURCE_DIR)
|
||||
|
||||
@echo "Download installer"
|
||||
@wget -nv -c $(BASE_URL) -O source/deezer-setup-$(PKGVER).exe
|
||||
@wget -nv $(BASE_URL) -O $(SOURCE_DIR)/deezer-setup-$(PKGVER).exe
|
||||
|
||||
@echo "Verify installer"
|
||||
@echo "$(SHA256) $(SOURCE_DIR)/deezer-setup-$(PKGVER).exe" | sha256sum -c --status || exit 1
|
||||
|
||||
@echo "Extract app archive from installer"
|
||||
@cd source && 7z x -so deezer-setup-$(PKGVER).exe '$$PLUGINSDIR/app-32.7z' > app-32.7z
|
||||
@cd $(SOURCE_DIR) && 7z x -so deezer-setup-$(PKGVER).exe '$$PLUGINSDIR/app-32.7z' > app-32.7z
|
||||
|
||||
@echo "Extract app from app archive"
|
||||
@cd source && 7z x -y -bsp0 -bso0 app-32.7z
|
||||
@cd $(SOURCE_DIR) && 7z x -y -bsp0 -bso0 app-32.7z
|
||||
|
||||
@echo "Extract app sources from the app"
|
||||
@node_modules/asar/bin/asar.js extract source/resources/app.asar app
|
||||
@npm run asar extract "$(SOURCE_DIR)/resources/app.asar" "$(APP_DIR)"
|
||||
|
||||
@echo "Prettier the sources to patch successfully"
|
||||
@node_modules/prettier/bin-prettier.js --write "app/build/*.js"
|
||||
@cp .prettierrc.json $(APP_DIR)/
|
||||
@npm run prettier -- --write "$(APP_DIR)/build/*.{js,html}" --config .prettierrc.json --ignore-path /dev/null
|
||||
|
||||
@echo "Apply patches from ./patches, default ones:"
|
||||
@echo "Hide to tray when closing (https://github.com/SibrenVasse/deezer/issues/4)"
|
||||
@echo "Start in tray cli option (https://github.com/SibrenVasse/deezer/pull/12)"
|
||||
@echo "Remove kernel version from User-Agent (https://github.com/aunetx/deezer-linux/pull/9)"
|
||||
@echo "Avoid to set the text/html mime type (https://github.com/aunetx/deezer-linux/issues/13)"
|
||||
$(foreach p, $(wildcard ./patches/*), patch -p1 -dapp < $(p);)
|
||||
@echo "Apply patches from ./patches:"
|
||||
@echo "01 - Hide to tray when closing (https://github.com/SibrenVasse/deezer/issues/4)"
|
||||
@echo "02 - Start in tray cli option (https://github.com/SibrenVasse/deezer/pull/12)"
|
||||
@echo "03 - Avoid to set the text/html mime type (https://github.com/aunetx/deezer-linux/issues/13)"
|
||||
@echo "04 - Disable auto updater (https://github.com/aunetx/deezer-linux/pull/95)"
|
||||
@echo "05 - Remove OS information (https://github.com/aunetx/deezer-linux/pull/95)"
|
||||
@echo "06 - Add a better management of MPRIS (https://github.com/aunetx/deezer-linux/pull/61)"
|
||||
@echo "07 - Add environment variable to change log level (https://github.com/aunetx/deezer-linux/pull/95)"
|
||||
@echo "08 - Provide additional metadata (https://github.com/aunetx/deezer-linux/pull/95)"
|
||||
@echo "09 - Add Discord Rich Presence (https://github.com/aunetx/deezer-linux/pull/82)"
|
||||
@echo "10 - Improve responsiveness on small devices (https://github.com/aunetx/deezer-linux/pull/122)"
|
||||
@echo "11 - Hide Application is offline banner (https://github.com/aunetx/deezer-linux/pull/124)"
|
||||
@echo "12 - Disable animations (https://github.com/aunetx/deezer-linux/pull/133)"
|
||||
@echo "13 - Disable notifications (https://github.com/aunetx/deezer-linux/pull/151)"
|
||||
|
||||
@$(foreach p, $(wildcard ./patches/*), patch -p 1 -d $(APP_DIR) < $(p);)
|
||||
|
||||
@echo "Append `package-append.json` to the `package.json` of the app"
|
||||
@echo "Adds electron, elecron-builder dependencies, and build directives"
|
||||
@head -n -1 app/package.json > tmp.txt && mv tmp.txt app/package.json
|
||||
@cat package-append.json | tee -a app/package.json
|
||||
@echo "Adds electron, elecron-builder dependencies, prod and build directives"
|
||||
@jq -s '.[0] * .[1]' $(APP_DIR)/package.json package-append.json > $(APP_DIR)/tmp.json && mv $(APP_DIR)/tmp.json $(APP_DIR)/package.json
|
||||
|
||||
@echo "Download new packages"
|
||||
@$(PACKAGE_MANAGER) $(PACKAGE_MANAGER_INSTALL_CMD)
|
||||
|
||||
#! PACKAGES
|
||||
|
||||
install_deps: prepare
|
||||
@echo "Install yarn dependencies to pack them later"
|
||||
@yarn --cwd=app install
|
||||
@echo "Install $(PACKAGE_MANAGER) dependencies to pack them later"
|
||||
@$(PACKAGE_MANAGER) $(PACKAGE_MANAGER_SUBDIR_ARG) $(APP_DIR) $(PACKAGE_MANAGER_INSTALL_CMD)
|
||||
|
||||
|
||||
build_tar.xz_x64:
|
||||
@echo "Build tar.xz archive"
|
||||
@yarn --cwd=app run build-tar.xz-x64
|
||||
@$(PACKAGE_MANAGER) $(PACKAGE_MANAGER_SUBDIR_ARG) $(APP_DIR) run build-tar.xz-x64
|
||||
|
||||
build_deb_x64:
|
||||
@echo "Build deb package"
|
||||
@yarn --cwd=app run build-deb-x64
|
||||
@$(PACKAGE_MANAGER) $(PACKAGE_MANAGER_SUBDIR_ARG) $(APP_DIR) run build-deb-x64
|
||||
|
||||
build_rpm_x64:
|
||||
@echo "Build rpm package"
|
||||
@yarn --cwd=app run build-rpm-x64
|
||||
@$(PACKAGE_MANAGER) $(PACKAGE_MANAGER_SUBDIR_ARG) $(APP_DIR) run build-rpm-x64
|
||||
|
||||
build_appimage_x64:
|
||||
@echo "Build AppImage binary"
|
||||
@yarn --cwd=app run build-appimage-x64
|
||||
@$(PACKAGE_MANAGER) $(PACKAGE_MANAGER_SUBDIR_ARG) $(APP_DIR) run build-appimage-x64
|
||||
|
||||
build_snap_x64:
|
||||
@echo "Build Snap package"
|
||||
@$(PACKAGE_MANAGER) $(PACKAGE_MANAGER_SUBDIR_ARG) $(APP_DIR) run build-snap-x64
|
||||
|
||||
|
||||
build_tar.xz_arm64:
|
||||
@echo "Build tar.xz archive"
|
||||
@yarn --cwd=app run build-tar.xz-arm64
|
||||
@$(PACKAGE_MANAGER) $(PACKAGE_MANAGER_SUBDIR_ARG) $(APP_DIR) run build-tar.xz-arm64
|
||||
|
||||
build_deb_arm64:
|
||||
@echo "Build deb package"
|
||||
@yarn --cwd=app run build-deb-arm64
|
||||
@$(PACKAGE_MANAGER) $(PACKAGE_MANAGER_SUBDIR_ARG) $(APP_DIR) run build-deb-arm64
|
||||
|
||||
build_rpm_arm64:
|
||||
@echo "Build rpm package"
|
||||
@yarn --cwd=app run build-rpm-arm64
|
||||
@$(PACKAGE_MANAGER) $(PACKAGE_MANAGER_SUBDIR_ARG) $(APP_DIR) run build-rpm-arm64
|
||||
|
||||
build_appimage_arm64:
|
||||
@echo "Build AppImage binary"
|
||||
@yarn --cwd=app run build-appimage-arm64
|
||||
@$(PACKAGE_MANAGER) $(PACKAGE_MANAGER_SUBDIR_ARG) $(APP_DIR) run build-appimage-arm64
|
||||
|
||||
build_snap_arm64:
|
||||
@echo "Build Snap package"
|
||||
@$(PACKAGE_MANAGER) $(PACKAGE_MANAGER_SUBDIR_ARG) $(APP_DIR) run build-snap-arm64
|
||||
|
||||
#! DEV
|
||||
|
||||
patch-new: install_deps
|
||||
@echo "Setting up the development environment..."
|
||||
@cd $(APP_DIR) && echo "node_modules\n*.diff\n*.orig" > .gitignore && git init && git add .
|
||||
@cd $(APP_DIR) && git commit -m "initial commit"
|
||||
@echo "You can now edit the sources in the $(APP_DIR) directory"
|
||||
@echo "When you are done, commit your changes, run 'make patch-gen'."
|
||||
@echo "Don't forget to rename your patch."
|
||||
|
||||
patch-gen:
|
||||
@npm run prettier -- --write "$(APP_DIR)/build/*.{js,html}" --config .prettierrc.json --ignore-path /dev/null
|
||||
@cd $(APP_DIR) && git add .
|
||||
@cd $(APP_DIR) && git commit
|
||||
@cd $(APP_DIR) && git format-patch -1 HEAD --stdout > ../patches/$(shell date +%y%m%d-%s).patch
|
||||
|
||||
#! UTILS
|
||||
|
||||
@ -100,4 +143,4 @@ release: prepare-release
|
||||
|
||||
|
||||
clean:
|
||||
@rm -rf app flatpak node_modules source artifacts package-lock.json package.json
|
||||
@rm -rf ./$(APP_DIR) flatpak node_modules ./$(SOURCE_DIR) artifacts package-lock.json yarn.lock
|
||||
|
218
README.md
218
README.md
@ -1,104 +1,204 @@
|
||||
# Deezer for linux
|
||||
|
||||
**NOTICE:** existing flatpak users NEED to migrate the the flathub repository as soon as possible, as I deleted the flatpak repository from here (it was more than 2Gb in size). In order to do so (normally without losing any data), simply:
|
||||
|
||||
```sh
|
||||
flatpak uninstall dev.aunetx.deezer
|
||||
flatpak remote-delete deezer-linux
|
||||
flatpak install flathub dev.aunetx.deezer
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
[](https://github.com/aunetx/deezer-linux/actions/workflows/build.yml)
|
||||
[](https://github.com/aunetx/deezer-linux/releases/latest)
|
||||
|
||||
This repo is an UNOFFICIAL linux port of the official windows-only Deezer app. Being based on the native Windows app, it allows downloading your songs to listen to them offline!
|
||||
This repo is an UNOFFICIAL linux port ([legal notice](#legal-disclaimer)) of the official windows-only Deezer app. Being based on the native Windows app, it allows downloading your songs to listen to them offline!
|
||||
|
||||
It packages the app in a number of formats:
|
||||
|
||||
- Flatpak, [available on flathub](https://flathub.org/apps/dev.aunetx.deezer)
|
||||
- Snap (not tested yet)
|
||||
- AppImage (can't automatically login without desktop integration)
|
||||
- AppImage
|
||||
- Snapcraft
|
||||
- `rpm` (Fedora, Red Hat, CentOS, openSUSE, ...)
|
||||
- `deb` (Debian, Ubuntu, Pop!_OS, elementary OS, ...)
|
||||
- `7z` to install anywhere else
|
||||
- `deb` (Debian, Ubuntu, Pop!\_OS, elementary OS, ...)
|
||||
- `tar.xz` to install anywhere else
|
||||
|
||||
It was done thanks to the hard work of [SibrenVasse](https://github.com/SibrenVasse), who [packaged the app for the AUR](https://github.com/SibrenVasse/deezer).
|
||||
Special thanks to [SibrenVasse](https://github.com/SibrenVasse) who made the [original AUR package](https://github.com/SibrenVasse/deezer) for this app!
|
||||
|
||||
## Installation
|
||||
|
||||
You can find all of the packages on [the release page](https://github.com/aunetx/deezer-linux/releases/latest).
|
||||
|
||||
To install the flatpak version, you can simply go to https://flathub.org/apps/dev.aunetx.deezer (or use your favorite flatpak package manager). **Old users using this repo as a flatpak repository should migrate as soon as they can toward Flathub.**
|
||||
To install the flatpak version, you can simply go to https://flathub.org/apps/dev.aunetx.deezer (or use your favorite flatpak package manager).
|
||||
|
||||
> [!Important]
|
||||
> Old flatpak users must migrate to the flathub repository as soon as possible, as the flatpak repository was deleted from this repo (it weighed more that 2GB). In order to do so, you can use the following commands:
|
||||
>
|
||||
> ```sh
|
||||
> flatpak uninstall dev.aunetx.deezer
|
||||
> flatpak remote-delete deezer-linux
|
||||
> flatpak install flathub dev.aunetx.deezer
|
||||
> ```
|
||||
>
|
||||
> You _should_ not lose any data by doing this.
|
||||
|
||||
Other packages can be installed from you package manager, either by clicking on them or from the command-line.
|
||||
|
||||
Please note that even though it is automatically generated, the snapcraft package has never been tested; Please tell me if there is any issue with it!
|
||||
## Usage
|
||||
|
||||
## From source
|
||||
| Option | Description |
|
||||
| ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `--start-in-tray` | Start the app in the tray (see [patch](./patches/01-start-hidden-in-tray.patch)) |
|
||||
| `--disable-systray` | Quit the app when the window is closed (see [patch](./patches/03-quit.patch)) |
|
||||
| `--keep-kernel` | Use the exact kernel version (see [patch](./patches/05-remove-os-information.patch)) <br/> _This feature impacts privacy._ |
|
||||
| `--disable-features` | Disable some features (see [patch](./patches/06-better-management-of-MPRIS.patch)) |
|
||||
| `--enable-discord-rpc` | Enable Discord RPC integration (see [patch](./patches/09-discord-rich-presence.patch)) |
|
||||
| `--hide-appoffline-banner` | Hide the "Application is offline" banner that appears when using a VPN or DNS blocker (see [patch](./patches/11-hide-appoffline-banner.patch)) |
|
||||
| `--disable-animations` | Disable animations (see [patch](./patches/12-disable-animations.patch)) |
|
||||
| `--disable-notifications` | Disable notifications (see [patch](./patches/13-disable-notifications.patch)) |
|
||||
| `--enable-wayland-ime` `--ozone-platform-hint=auto` `--wayland-text-input-version=3` | Enable IME keyboard support on Wayland |
|
||||
|
||||
You will probably need to install some things in order to generate the packages from source:
|
||||
| Environment variable | Options | Description |
|
||||
| --------------------------- | -------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
|
||||
| `DZ_HIDE_APPOFFLINE_BANNER` | `yes`,`no` | Hide the "Application is offline" banner (see [patch](./patches/11-hide-appoffline-banner.patch)) |
|
||||
| `DZ_DISABLE_ANIMATIONS` | `yes`,`no` | Disable animations (see [patch](./patches/12-disable-animations.patch)) |
|
||||
| `DZ_DISABLE_NOTIFICATIONS` | `yes`,`no` | Disable notifications (see [patch](./patches/13-disable-notifications.patch)) |
|
||||
| `LOG_LEVEL` | `silly`,`debug`,`verbose`,`info`,`warning`,`error` | Set the log level (see [patch](./patches/07-log-level-environment-variable.patch)) |
|
||||
| `DZ_DEVTOOLS` | `yes`,`no` | Enable the developer console (ctrl+shift+i) |
|
||||
|
||||
- nodejs
|
||||
- npm
|
||||
- yarn
|
||||
- 7z by installing `p7zip` and `p7zip-full`
|
||||
## Building from source
|
||||
|
||||
### Available targets
|
||||
|
||||
| Target | arm64 | x64 |
|
||||
| -------- | ----- | --- |
|
||||
| appimage | ⚠️ | ✅ |
|
||||
| deb | ⚠️ | ✅ |
|
||||
| rpm | ⚠️ | ✅ |
|
||||
| tar.xz | ⚠️ | ✅ |
|
||||
| snap | ⚠️ | ✅ |
|
||||
|
||||
✅ Available ; ⚠️ Not tested ; ❌ Not available ; ⛔ Not planned
|
||||
|
||||
> [!NOTE]
|
||||
> Please open an issue if you want a specific target to be tested or added.
|
||||
|
||||
### Requirements
|
||||
|
||||
- Node.js (22+ recommended)
|
||||
- npm (or yarn, see [FAQ](#i-want-to-use-yarn-instead-of-npm-is-it-possible))
|
||||
- 7z (try installing `p7zip` and `p7zip-full`)
|
||||
- make
|
||||
- wget
|
||||
|
||||
### Setup
|
||||
|
||||
To build the project, you need to install the dependencies first:
|
||||
|
||||
```sh
|
||||
make install_deps
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> You don't need to use `make install_deps` everytime you start a build, however you need to call it at least once. Everything should be generated in `artifacts/{arch}`.
|
||||
|
||||
### AppImage
|
||||
|
||||
To build the AppImage image from source, use:
|
||||
To build the AppImage x64 image, you can use:
|
||||
|
||||
```sh
|
||||
make install_deps
|
||||
make build_appimage
|
||||
make build_appimage_x64
|
||||
```
|
||||
|
||||
And the image should be in the `artifacts/x64` folder.
|
||||
Artifacts will be generated in `artifacts/x64`.
|
||||
|
||||
Because of the way AppImage works, except if you use `appimaged`, you will not be able to login from the browser; then you are not redirected to the application.
|
||||
To make it work, you must first open a instance of the app, and copy the link shown in `https://www.deezer.com/desktop/login/electron/callback`. In a terminal
|
||||
(where the .AppImage file is), use:
|
||||
> [!WARNING]
|
||||
> You _may_ encounter a problem with the AppImage, where you are not able to login. This is a known issue, and is due to the way AppImage works. In this case, you can copy the link shown in `https://www.deezer.com/desktop/login/electron/callback`.
|
||||
>
|
||||
> In the same directory as the AppImage file, use:
|
||||
>
|
||||
> ```sh
|
||||
> deezer-desktop-*.AppImage deezer://autolog/...
|
||||
> ```
|
||||
>
|
||||
> You should now be logged in.
|
||||
>
|
||||
> For more information, see [issue #29](https://github.com/aunetx/deezer-linux/issues/29)
|
||||
|
||||
> [!Caution]
|
||||
> If you want to open an issue about this, please do not share your own `deezer://autolog/...` link, as it would allow anyone to log into your account without your consent.
|
||||
|
||||
### rpm / deb / tar.xz
|
||||
|
||||
To generate the `rpm`/`deb`/`tar.xz` packages, you can use:
|
||||
|
||||
```sh
|
||||
deezer-desktop-*.AppImage deezer://autolog/...
|
||||
make build_{target}_{arch}
|
||||
```
|
||||
|
||||
And you should be automatically logged in.
|
||||
|
||||
**IMPORTANT:** If you want to open an issue about this, please do NOT share your own `deezer://autolog/...` link, as it would permit anybody to log into your account without the need for a password!
|
||||
|
||||
See [this issue](https://github.com/aunetx/deezer-linux/issues/29) for more informations about login in AppImage.
|
||||
|
||||
## rpm / deb / snap / 7z
|
||||
|
||||
To generate the `rpm`/`deb`/`snap`/`7z` packages, you can use:
|
||||
Example:
|
||||
|
||||
```sh
|
||||
# prepare the build
|
||||
make install_deps
|
||||
|
||||
# and then
|
||||
|
||||
make build_deb_x64
|
||||
# or
|
||||
make build_rpm_x64
|
||||
# or
|
||||
make build_snap_x64
|
||||
# or
|
||||
make build_tar.xz_x64
|
||||
make build_rpm_arm64
|
||||
```
|
||||
|
||||
Note that you don't need to use `make install_deps` everytime you start a build, but you need to call it at least once. Everything should be generated in `artifacts/x64`.
|
||||
Artifacts will be generated in `artifacts/{arch}`.
|
||||
|
||||
If you generate the 7z package, you can run it directly by extracting to a directory, and calling `./deezer-desktop` from there.
|
||||
> [!WARNING]
|
||||
> Building can take a long time. Be patient.
|
||||
|
||||
## **IMPORTANT NOTICE**
|
||||
If you generate the `tar.xz` package, you can run it directly by extracting to a directory, and calling `./deezer-desktop` from there.
|
||||
|
||||
This work is UNOFFICIAL, and Deezer does not officially support Linux yet.
|
||||
### snap
|
||||
|
||||
Installing/using this is consequently probably outside of the scope of the Deezer EULA, and I am not responsible for your usage of this.
|
||||
To build the `snap` package, you can use:
|
||||
|
||||
I tried to talk to Deezer to ask them if I am authorized to upload this on Flathub, but when they answer, even if they say yes, this work is still unofficial.
|
||||
```sh
|
||||
make build_snap_{arch}
|
||||
```
|
||||
|
||||
Then, you can install the package using:
|
||||
|
||||
```sh
|
||||
sudo snap install ./artifacts/{arch}/deezer_desktop_{version}_{arch}.snap --dangerous --classic
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> Snap packages require classic mode because of electron.
|
||||
> Because of this, it is not able to use your usual browser.
|
||||
> It will launch a clean instance of the browser, without extensions, settings, history, etc.
|
||||
|
||||
## Development
|
||||
|
||||
If you want to contribute to this project, please read the [contribution guidelines](CONTRIBUTING.md) file.
|
||||
|
||||
## FAQ
|
||||
|
||||
### Why does this project exist?
|
||||
|
||||
Deezer can be used on Linux through the web interface, but it does not allow downloading songs for offline listening. This project allows you to use the official Deezer app on Linux, with the same features as on Windows (plus some Linux-specific features).
|
||||
|
||||
### Why are the patches published but not the app's source code? patches?
|
||||
|
||||
The source code of the Deezer app is not open-source. Reverse-engineering the app would be illegal and would violate the Deezer EULA. This project is a port of the official Windows app, and does not contain any reverse-engineered code, rather it bundles the official Windows app with a compatibility layer.
|
||||
|
||||
### I want to use yarn instead of npm, is it possible?
|
||||
|
||||
Yes, you can use yarn instead of npm. Execute the following command before building the project:
|
||||
|
||||
```sh
|
||||
export PACKAGE_MANAGER=yarn
|
||||
export PACKAGE_MANAGER_SUBDIR_ARG=--cwd
|
||||
export PACKAGE_MANAGER_ADD_CMD=add
|
||||
export PACKAGE_MANAGER_INSTALL_CMD=install
|
||||
```
|
||||
|
||||
### How can I use my IME/virtual keyboard on Deezer under Wayland?
|
||||
|
||||
_IME: Input Method Editor. Usually used for languages like Chinese, Japanese, Korean, etc._
|
||||
|
||||
You should launch the app with the following arguments:
|
||||
|
||||
```sh
|
||||
--enable-wayland-ime --ozone-platform-hint=auto --wayland-text-input-version=3
|
||||
```
|
||||
|
||||
## **LEGAL DISCLAIMER**
|
||||
|
||||
This work is UNOFFICIAL. Deezer does not officially support Linux and cannot be held responsible for any misuse of this port.
|
||||
|
||||
The installation and use of this software is outside the scope of the Deezer EULA. No author or contributor to this project can be held responsible for the use you make of it.
|
||||
|
||||
> [!NOTE]
|
||||
> Deezer was contacted to ask for permission to upload this on Flathub, but no answer was given. This work remains unofficial and is not supported by Deezer. See [this thread (FR)](https://fr.deezercommunity.com/application-ordinateur-et-site-web-58/mettre-en-ligne-l-application-deezer-sur-flathub-pour-linux-40620)
|
||||
|
@ -4,12 +4,15 @@ Name=Deezer
|
||||
GenericName=Online music streaming service
|
||||
Comment=Listen and download all your favorite music
|
||||
StartupNotify=true
|
||||
Icon=dev.aunetx.deezer
|
||||
TryExec=run.sh
|
||||
Exec=run.sh %U
|
||||
Icon=dev.aunetx.deezer.svg
|
||||
Terminal=false
|
||||
MimeType=x-scheme-handler/deezer;
|
||||
Categories=Audio;Music;Player;AudioVideo;
|
||||
Keywords=Music;Player;Streaming;Online;
|
||||
StartupWMClass=Deezer
|
||||
SingleMainWindow=true
|
||||
X-GNOME-UsesNotifications=true
|
||||
|
||||
# Used by flatpak/flathub
|
||||
Exec=run.sh %U
|
||||
TryExec=run.sh
|
24
dev.aunetx.deezer.json
Normal file
24
dev.aunetx.deezer.json
Normal file
@ -0,0 +1,24 @@
|
||||
{
|
||||
"app-id": "dev.aunetx.deezer",
|
||||
"modules": [
|
||||
{
|
||||
"name": "deezer",
|
||||
"sources": [
|
||||
{
|
||||
"type": "archive",
|
||||
"url": "https://cdn-content.dzcdn.net/builds/deezer-desktop/8cF2rAuKxLcU1oMDmCYm8Uiqe19Ql0HTySLssdzLkQ9ZWHuDTp2JBtQOvdrFzWPA/win32/x86/7.0.120/DeezerDesktopSetup_7.0.120.exe",
|
||||
"sha256": "8d4bc1f458b28899c222e4e3a04aad6ed11e318f4ee4922e698721e69a7b20f2",
|
||||
"only-arches": [
|
||||
"x86_64"
|
||||
],
|
||||
"dest": "archive",
|
||||
"x-checker-data": {
|
||||
"type": "rotating-url",
|
||||
"url": "https://www.deezer.com/desktop/download?platform=win32&architecture=x86",
|
||||
"pattern": "([\\d]+\\.[\\d]+\\.[\\d]+)"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
@ -1,4 +1,5 @@
|
||||
,"scripts": {
|
||||
{
|
||||
"scripts": {
|
||||
"copy-resources": "mkdir -p resources/linux && cp ../extra/linux/* ./resources/linux",
|
||||
"start": "yarn run copy-resources && electron .",
|
||||
"prepare-flatpak": "electron-builder --linux --dir",
|
||||
@ -12,16 +13,15 @@
|
||||
"build-tar.xz-arm64": "electron-builder --arm64 --linux tar.xz",
|
||||
"build-deb-arm64": "electron-builder --arm64 --linux deb",
|
||||
"build-rpm-arm64": "electron-builder --arm64 --linux rpm",
|
||||
"build-snap-arm64": "electron-builder --arm64 --linux snap",
|
||||
"build-appimage-arm64": "electron-builder --arm64 --linux AppImage"
|
||||
},
|
||||
"devDependencies": {
|
||||
"electron": "^13.6.9",
|
||||
"electron-builder": "^23.0.3"
|
||||
"electron": "^35.0.0",
|
||||
"electron-builder": "^26.0.0"
|
||||
},
|
||||
"build": {
|
||||
"files": [
|
||||
"**"
|
||||
],
|
||||
"files": ["**"],
|
||||
"directories": {
|
||||
"buildResources": "build",
|
||||
"output": "../artifacts/${arch}"
|
||||
@ -41,20 +41,63 @@
|
||||
"linux": {
|
||||
"maintainer": "aunetx <me@aunetx.dev>",
|
||||
"icon": "../icons",
|
||||
"category": "Utility;AudioVideo;Audio;Player;Music;",
|
||||
"category": "AudioVideo;Audio;Player;Music;",
|
||||
"desktop": {
|
||||
"Name": "Deezer",
|
||||
"entry": {
|
||||
"Type": "Application",
|
||||
"Name": "Deezer",
|
||||
"GenericName": "Online music streaming service",
|
||||
"Comment": "Listen and download all your favorite music",
|
||||
"StartupNotify": "true",
|
||||
"Terminal": "false",
|
||||
"MimeType": "x-scheme-handler/deezer;",
|
||||
"Categories": "Audio;Music;Player;AudioVideo;",
|
||||
"Keywords": "Music;Player;Streaming;Online;",
|
||||
"StartupWMClass": "Deezer"
|
||||
"StartupWMClass": "Deezer",
|
||||
"SingleMainWindow": "true",
|
||||
"X-GNOME-UsesNotifications": "true"
|
||||
}
|
||||
},
|
||||
"artifactName": "${productName}-${version}-${arch}.${ext}"
|
||||
},
|
||||
"snap": {
|
||||
"artifactName": "${productName}_${version}_${arch}.${ext}"
|
||||
"artifactName": "${productName}_${version}_${arch}.${ext}",
|
||||
"publish": [
|
||||
{
|
||||
"provider": "generic",
|
||||
"url": "https://null/"
|
||||
}
|
||||
],
|
||||
"base": "core22",
|
||||
"grade": "stable",
|
||||
"confinement": "classic",
|
||||
"after": ["desktop-gtk4", "libnotify-bin"],
|
||||
"slots": [
|
||||
{
|
||||
"mpris": {
|
||||
"name": "deezer"
|
||||
},
|
||||
"desktop": {
|
||||
"name": "deezer"
|
||||
}
|
||||
}
|
||||
],
|
||||
"plugs": [
|
||||
"desktop",
|
||||
"desktop-legacy",
|
||||
"wayland",
|
||||
"x11",
|
||||
"unity7",
|
||||
"alsa",
|
||||
"avahi-observe",
|
||||
"browser-support",
|
||||
"gsettings",
|
||||
"network",
|
||||
"opengl",
|
||||
"audio-playback",
|
||||
"screen-inhibit-control",
|
||||
"upower-observe"
|
||||
]
|
||||
},
|
||||
"deb": {
|
||||
"artifactName": "${productName}_${version}_${arch}.${ext}"
|
||||
|
10
package.json
Normal file
10
package.json
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"@electron/asar": "3.4.1",
|
||||
"prettier": "3.5.3"
|
||||
},
|
||||
"scripts": {
|
||||
"asar": "asar",
|
||||
"prettier": "prettier"
|
||||
}
|
||||
}
|
57
patches/01-start-hidden-in-tray.patch
Normal file
57
patches/01-start-hidden-in-tray.patch
Normal file
@ -0,0 +1,57 @@
|
||||
From 7e317aa696aa2c1a69f2df0e4d7bb3b3df41d4df Mon Sep 17 00:00:00 2001
|
||||
From: josselinonduty <contact@josselinonduty.fr>
|
||||
Date: Mon, 21 Apr 2025 00:37:21 +0900
|
||||
Subject: [PATCH] fix: reduce to systray on close
|
||||
|
||||
Original patch: Dorian Stoll <dorian.stoll@tmsp.io>
|
||||
This stops the excessive logging, since parts of the app will not run in development
|
||||
mode anymore. It also stops the app from logging the urls for the mp3 files, which is
|
||||
against the Deezer TOS.
|
||||
---
|
||||
build/main.js | 24 ++++++++++++------------
|
||||
1 file changed, 12 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index 7349ee9..9284b6b 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -3097,24 +3097,24 @@
|
||||
finalMinSize[1]
|
||||
);
|
||||
}
|
||||
- isDev(external_electron_namespaceObject.app)
|
||||
- ? this.window.showInactive()
|
||||
- : this.window.show(),
|
||||
- this.thumbar.init();
|
||||
+ if (!process.argv.some((arg) => arg === "--start-in-tray"))
|
||||
+ isDev(external_electron_namespaceObject.app)
|
||||
+ ? this.window.showInactive()
|
||||
+ : this.window.show(),
|
||||
+ this.thumbar.init();
|
||||
+ else this.window.hide();
|
||||
}),
|
||||
this.appService.enableDevMode();
|
||||
}
|
||||
_adjustViewToContentSize() {
|
||||
if (!this.isFrameless) return;
|
||||
const currentSize = this.window.getContentSize();
|
||||
- this.appService
|
||||
- .getViewContainer()
|
||||
- .setBounds({
|
||||
- x: 0,
|
||||
- y: 32,
|
||||
- width: currentSize[0],
|
||||
- height: currentSize[1] - 32,
|
||||
- });
|
||||
+ this.appService.getViewContainer().setBounds({
|
||||
+ x: 0,
|
||||
+ y: 32,
|
||||
+ width: currentSize[0],
|
||||
+ height: currentSize[1] - 32,
|
||||
+ });
|
||||
}
|
||||
loadWindow() {
|
||||
const report = () => {
|
||||
--
|
||||
2.43.0
|
||||
|
@ -1,8 +1,17 @@
|
||||
From 3255d0db5760601c9a16fb4b175085cc40b27df2 Mon Sep 17 00:00:00 2001
|
||||
From: josselinonduty <contact@josselinonduty.fr>
|
||||
Date: Mon, 21 Apr 2025 00:47:43 +0900
|
||||
Subject: [PATCH] fix: unset text/html as default mimetype
|
||||
|
||||
---
|
||||
build/main.js | 7 +------
|
||||
1 file changed, 1 insertion(+), 6 deletions(-)
|
||||
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index de51acb..e2c0b9e 100644
|
||||
index 9284b6b..9623b50 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -2897,12 +2897,7 @@
|
||||
@@ -2851,12 +2851,7 @@
|
||||
this.tray.init(),
|
||||
this.updater.init(),
|
||||
this.network.watch(),
|
||||
@ -16,3 +25,6 @@ index de51acb..e2c0b9e 100644
|
||||
const dzrFilter = { urls: ["*://*/*"] },
|
||||
DOMAINS_WHITELIST = [
|
||||
"deezer.com",
|
||||
--
|
||||
2.43.0
|
||||
|
29
patches/03-quit.patch
Normal file
29
patches/03-quit.patch
Normal file
@ -0,0 +1,29 @@
|
||||
From 4dbe17674fef2f48b638cd4dc164b66042d03213 Mon Sep 17 00:00:00 2001
|
||||
From: josselinonduty <contact@josselinonduty.fr>
|
||||
Date: Mon, 21 Apr 2025 00:50:26 +0900
|
||||
Subject: [PATCH] fix: reduce to systray on close with respect to execution
|
||||
option
|
||||
|
||||
---
|
||||
build/main.js | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index 9623b50..c904158 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -3049,7 +3049,10 @@
|
||||
this._adjustViewToContentSize(),
|
||||
mainView.setAutoResize({ width: !0, height: !0 });
|
||||
} else this.appService.setWindow(this.window, void 0);
|
||||
- if ((this.appService.setUserAgent(), isPlatform(PLATFORM.DARWIN))) {
|
||||
+ if (
|
||||
+ (this.appService.setUserAgent(), isPlatform(PLATFORM.LINUX)) &&
|
||||
+ !process.argv.some((arg) => arg === "--disable-systray")
|
||||
+ ) {
|
||||
let isQuitting = !1;
|
||||
external_electron_namespaceObject.app.on(
|
||||
"before-quit",
|
||||
--
|
||||
2.43.0
|
||||
|
27
patches/04-disable-auto-updater.patch
Normal file
27
patches/04-disable-auto-updater.patch
Normal file
@ -0,0 +1,27 @@
|
||||
From 7a0b04d742ca93adcf73c0d520e877f0c4bef6d4 Mon Sep 17 00:00:00 2001
|
||||
From: josselinonduty <contact@josselinonduty.fr>
|
||||
Date: Mon, 21 Apr 2025 00:54:17 +0900
|
||||
Subject: [PATCH] fix: disable autoupdater for linux
|
||||
|
||||
---
|
||||
build/main.js | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index c904158..a667632 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -2320,8 +2320,8 @@
|
||||
}
|
||||
init() {
|
||||
this.arch &&
|
||||
- ((isPlatform(PLATFORM.LINUX) && !process.env.APPIMAGE) ||
|
||||
- isWindowsStore() ||
|
||||
+ !isPlatform(PLATFORM.LINUX) &&
|
||||
+ (isWindowsStore() ||
|
||||
"yes" === process.env.DZ_DISABLE_UPDATE ||
|
||||
((external_electron_updater_namespaceObject.autoUpdater.autoDownload =
|
||||
!0),
|
||||
--
|
||||
2.43.0
|
||||
|
118
patches/05-remove-os-information.patch
Normal file
118
patches/05-remove-os-information.patch
Normal file
@ -0,0 +1,118 @@
|
||||
From 9250fb3bf514256f68ad844b53e7345b2efc4b37 Mon Sep 17 00:00:00 2001
|
||||
From: josselinonduty <contact@josselinonduty.fr>
|
||||
Date: Mon, 21 Apr 2025 01:08:23 +0900
|
||||
Subject: [PATCH] fix: ensure os release is valid; add cli argument to use
|
||||
exact kernel version
|
||||
|
||||
Original patch: Dorian Stoll <dorian.stoll@tmsp.io>
|
||||
The application sends the kernel version as part of the User-Agent.
|
||||
However, the Deezer API seems to assume the number to follow semver,
|
||||
and can get confused when it doesn't. This then leads to some features
|
||||
like dark mode being reported as unavailable.
|
||||
|
||||
e.g: 5.11.0-16-generic works, while 5.15.14-200.fc35.x86_64 doesn't.
|
||||
|
||||
The solution is to ignore the actual version and send bogus data that
|
||||
is known to work.
|
||||
---
|
||||
build/main.js | 12 +++++++++++-
|
||||
build/preload.js | 12 +++++++++++-
|
||||
build/renderer.js | 12 +++++++++++-
|
||||
build/titlebar.js | 12 +++++++++++-
|
||||
4 files changed, 44 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index a667632..e03556c 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -5,7 +5,17 @@
|
||||
module.exports = require("macos-version");
|
||||
},
|
||||
857: (module) => {
|
||||
- module.exports = require("os");
|
||||
+ var __module_os = require("os");
|
||||
+ const release = __module_os.release();
|
||||
+ __module_os.release = () => {
|
||||
+ if (!process.argv.some((arg) => arg === "--keep-kernel"))
|
||||
+ return "6.1.0";
|
||||
+
|
||||
+ const matcher = /(\d+\.\d+\.\d+)\.*/;
|
||||
+ var result = release.match(matcher);
|
||||
+ return result ? result[1] : "6.1.0";
|
||||
+ };
|
||||
+ module.exports = __module_os;
|
||||
},
|
||||
},
|
||||
__webpack_module_cache__ = {};
|
||||
diff --git a/build/preload.js b/build/preload.js
|
||||
index 4029c6d..f625122 100644
|
||||
--- a/build/preload.js
|
||||
+++ b/build/preload.js
|
||||
@@ -5,7 +5,17 @@
|
||||
module.exports = require("macos-version");
|
||||
},
|
||||
857: (module) => {
|
||||
- module.exports = require("os");
|
||||
+ var __module_os = require("os");
|
||||
+ const release = __module_os.release();
|
||||
+ __module_os.release = () => {
|
||||
+ if (!process.argv.some((arg) => arg === "--keep-kernel"))
|
||||
+ return "6.1.0";
|
||||
+
|
||||
+ const matcher = /(\d+\.\d+\.\d+)\.*/;
|
||||
+ var result = release.match(matcher);
|
||||
+ return result ? result[1] : "6.1.0";
|
||||
+ };
|
||||
+ module.exports = __module_os;
|
||||
},
|
||||
},
|
||||
__webpack_module_cache__ = {};
|
||||
diff --git a/build/renderer.js b/build/renderer.js
|
||||
index ca6c307..24b119f 100644
|
||||
--- a/build/renderer.js
|
||||
+++ b/build/renderer.js
|
||||
@@ -5,7 +5,17 @@
|
||||
module.exports = require("macos-version");
|
||||
},
|
||||
857: (module) => {
|
||||
- module.exports = require("os");
|
||||
+ var __module_os = require("os");
|
||||
+ const release = __module_os.release();
|
||||
+ __module_os.release = () => {
|
||||
+ if (!process.argv.some((arg) => arg === "--keep-kernel"))
|
||||
+ return "6.1.0";
|
||||
+
|
||||
+ const matcher = /(\d+\.\d+\.\d+)\.*/;
|
||||
+ var result = release.match(matcher);
|
||||
+ return result ? result[1] : "6.1.0";
|
||||
+ };
|
||||
+ module.exports = __module_os;
|
||||
},
|
||||
},
|
||||
__webpack_module_cache__ = {};
|
||||
diff --git a/build/titlebar.js b/build/titlebar.js
|
||||
index 5414c90..4f3c6a3 100644
|
||||
--- a/build/titlebar.js
|
||||
+++ b/build/titlebar.js
|
||||
@@ -5,7 +5,17 @@
|
||||
module.exports = require("macos-version");
|
||||
},
|
||||
857: (module) => {
|
||||
- module.exports = require("os");
|
||||
+ var __module_os = require("os");
|
||||
+ const release = __module_os.release();
|
||||
+ __module_os.release = () => {
|
||||
+ if (!process.argv.some((arg) => arg === "--keep-kernel"))
|
||||
+ return "6.1.0";
|
||||
+
|
||||
+ const matcher = /(\d+\.\d+\.\d+)\.*/;
|
||||
+ var result = release.match(matcher);
|
||||
+ return result ? result[1] : "6.1.0";
|
||||
+ };
|
||||
+ module.exports = __module_os;
|
||||
},
|
||||
},
|
||||
__webpack_module_cache__ = {};
|
||||
--
|
||||
2.43.0
|
||||
|
157
patches/06-better-management-of-MPRIS.patch
Normal file
157
patches/06-better-management-of-MPRIS.patch
Normal file
@ -0,0 +1,157 @@
|
||||
From a808839d950d6f4ad50763d7255a7edbbd32e516 Mon Sep 17 00:00:00 2001
|
||||
From: josselinonduty <contact@josselinonduty.fr>
|
||||
Date: Mon, 21 Apr 2025 01:43:50 +0900
|
||||
Subject: [PATCH] fix: add better management of MPRIS
|
||||
|
||||
---
|
||||
build/main.js | 65 +++++++++++++++++++++++++++++++++++++++++++--------
|
||||
package.json | 1 +
|
||||
2 files changed, 56 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index e03556c..1878712 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -89,6 +89,10 @@
|
||||
external_semver_default = __webpack_require__.n(
|
||||
external_semver_namespaceObject
|
||||
);
|
||||
+ const external_electron_mpris_namespaceObject = require("@jellybrick/mpris-service");
|
||||
+ var external_electron_mpris_default = __webpack_require__.n(
|
||||
+ external_electron_mpris_namespaceObject
|
||||
+ );
|
||||
function isPlatform(platform) {
|
||||
switch (platform) {
|
||||
case PLATFORM.WINDOWS:
|
||||
@@ -1187,8 +1191,9 @@
|
||||
};
|
||||
};
|
||||
let MediaService = class extends external_events_namespaceObject.EventEmitter {
|
||||
- constructor(ipc, user) {
|
||||
+ constructor(ipc, user, app) {
|
||||
super(),
|
||||
+ (this.app = app),
|
||||
(this.smtc = null),
|
||||
(this.track = {}),
|
||||
(this.player = {}),
|
||||
@@ -1196,6 +1201,11 @@
|
||||
(this.debounceOptions = { leading: !0, maxWait: 500 }),
|
||||
(this.ipc = ipc),
|
||||
(this.user = user),
|
||||
+ (this.mprisPlayer = new external_electron_mpris_namespaceObject({
|
||||
+ name: "deezer",
|
||||
+ identity: "Deezer",
|
||||
+ supportedInterfaces: ["player"],
|
||||
+ })),
|
||||
isPlatform(PLATFORM.LINUX) &&
|
||||
(this.user.addListener(UserEvents.LoggedIn, () => {
|
||||
this.start();
|
||||
@@ -1203,6 +1213,21 @@
|
||||
this.user.addListener(UserEvents.LoggedOut, () => {
|
||||
this.stop();
|
||||
}));
|
||||
+ this.initMprisPlayerControls();
|
||||
+ }
|
||||
+ initMprisPlayerControls() {
|
||||
+ // Events => ['raise', 'quit', 'next', 'previous', 'pause', 'playpause', 'stop', 'play', 'seek', 'position', 'open', 'volume', 'loopStatus', 'shuffle'];
|
||||
+ this.mprisPlayer.on("play", this.play.bind(this));
|
||||
+ this.mprisPlayer.on("pause", this.pause.bind(this));
|
||||
+ this.mprisPlayer.on("playpause", () =>
|
||||
+ this.player.state === "playing" ? this.pause() : this.play()
|
||||
+ );
|
||||
+ this.mprisPlayer.on("stop", this.stop.bind(this));
|
||||
+ this.mprisPlayer.on("next", this.next.bind(this));
|
||||
+ this.mprisPlayer.on("previous", this.prev.bind(this));
|
||||
+ this.mprisPlayer.on("shuffle", this.setSuffle.bind(this));
|
||||
+ this.mprisPlayer.on("loopStatus", this.setRepeatMode.bind(this));
|
||||
+ this.mprisPlayer.on("raise", () => this.app.getWindow().show());
|
||||
}
|
||||
play() {
|
||||
this.ipc.send("channel-player-media-control", MediaPlayerControl.Play);
|
||||
@@ -1230,11 +1255,22 @@
|
||||
}
|
||||
setTrackInfo(track) {
|
||||
(this.track = Object.assign(this.track, track)),
|
||||
- this.emit(MediaEvents.TrackUpdated, this.track);
|
||||
+ this.emit(MediaEvents.TrackUpdated, this.track),
|
||||
+ (this.mprisPlayer.metadata = {
|
||||
+ "mpris:trackid": this.mprisPlayer.objectPath("track/0"),
|
||||
+ "mpris:artUrl": track.coverUrl,
|
||||
+ "xesam:title": track.title,
|
||||
+ "xesam:album": track.album,
|
||||
+ "xesam:artist": [track.artist],
|
||||
+ });
|
||||
}
|
||||
setPlayerInfo(player) {
|
||||
(this.player = Object.assign(this.player, player)),
|
||||
- this.emit(MediaEvents.PlayerUpdated, this.player);
|
||||
+ this.emit(MediaEvents.PlayerUpdated, this.player),
|
||||
+ (this.mprisPlayer.playbackStatus =
|
||||
+ this.player.state === "playing"
|
||||
+ ? external_electron_mpris_namespaceObject.PLAYBACK_STATUS_PLAYING
|
||||
+ : external_electron_mpris_namespaceObject.PLAYBACK_STATUS_PAUSED);
|
||||
}
|
||||
getTrackInfo() {
|
||||
return this.track;
|
||||
@@ -1294,7 +1330,11 @@
|
||||
1,
|
||||
(0, external_inversify_namespaceObject.inject)(SERVICE_USER)
|
||||
),
|
||||
- MediaService_metadata("design:paramtypes", [Object, Object]),
|
||||
+ MediaService_param(
|
||||
+ 2,
|
||||
+ (0, external_inversify_namespaceObject.inject)(SERVICE_APPLICATION)
|
||||
+ ),
|
||||
+ MediaService_metadata("design:paramtypes", [Object, Object, Object]),
|
||||
],
|
||||
MediaService
|
||||
);
|
||||
@@ -2732,15 +2772,16 @@
|
||||
const PlayerIpc_ipc = main_di.get(SERVICE_IPC),
|
||||
media = main_di.get(SERVICE_MEDIA),
|
||||
powerSave = main_di.get(SERVICE_POWER_SAVE);
|
||||
- PlayerIpc_ipc.on(
|
||||
- "channel-player-state-update",
|
||||
- external_lodash_debounce_default()((event, state) => {
|
||||
- media.setPlayerInfo({ state }),
|
||||
+ var powerSaveTimeoutId;
|
||||
+ PlayerIpc_ipc.on("channel-player-state-update", (event, state) => {
|
||||
+ media.setPlayerInfo({ state }),
|
||||
+ clearTimeout(powerSaveTimeoutId),
|
||||
+ (powerSaveTimeoutId = setTimeout(() => {
|
||||
state === MediaPlayerState.Playing
|
||||
? powerSave.start()
|
||||
: powerSave.stop();
|
||||
- }, 3e3)
|
||||
- ),
|
||||
+ }, 3e3));
|
||||
+ }),
|
||||
PlayerIpc_ipc.on(
|
||||
"channel-player-track-update",
|
||||
(event, track, player) => {
|
||||
@@ -2827,6 +2868,10 @@
|
||||
"autoplay-policy",
|
||||
"no-user-gesture-required"
|
||||
),
|
||||
+ external_electron_namespaceObject.app.commandLine.appendSwitch(
|
||||
+ "disable-features",
|
||||
+ "HardwareMediaKeyHandling"
|
||||
+ ),
|
||||
external_electron_namespaceObject.app.on(
|
||||
"second-instance",
|
||||
(event, argv) => {
|
||||
diff --git a/package.json b/package.json
|
||||
index cec017c..2182f77 100644
|
||||
--- a/package.json
|
||||
+++ b/package.json
|
||||
@@ -13,6 +13,7 @@
|
||||
"main": "build/main.js",
|
||||
"dependencies": {
|
||||
"@electron/remote": "2.1.2",
|
||||
+ "@jellybrick/mpris-service": "2.1.5",
|
||||
"electron-log": "^5.1.2",
|
||||
"electron-settings": "4.0.4",
|
||||
"electron-updater": "^6.3.9",
|
||||
--
|
||||
2.43.0
|
||||
|
42
patches/07-log-level-environment-variable.patch
Normal file
42
patches/07-log-level-environment-variable.patch
Normal file
@ -0,0 +1,42 @@
|
||||
From 5cc1a232e85c96163cba700321df9079ea4e4379 Mon Sep 17 00:00:00 2001
|
||||
From: josselinonduty <contact@josselinonduty.fr>
|
||||
Date: Wed, 14 May 2025 14:55:20 +0900
|
||||
Subject: [PATCH] fix: set default log level to "warn" to respect Deezer TOS;
|
||||
control log level from environment variable
|
||||
|
||||
Original patch: Dorian Stoll <dorian.stoll@tmsp.io>
|
||||
This stops the excessive logging, since parts of the app will not run in development
|
||||
mode anymore. It also stops the app from logging the urls for the mp3 files, which is
|
||||
against the Deezer TOS.
|
||||
---
|
||||
build/main.js | 14 ++++++++------
|
||||
1 file changed, 8 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index eabc5e1..485b953 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -3305,12 +3305,14 @@
|
||||
processType: isProcessMain() ? "main" : process.type,
|
||||
}),
|
||||
(external_electron_log_default().transports.console.format = `{h}:{i}:{s}.{ms} ({processType}/{level}) ${isPlatform(PLATFORM.WINDOWS) ? ">" : "›"} {text}`),
|
||||
- (external_electron_log_default().transports.console.level = isDev
|
||||
- ? "silly"
|
||||
- : "warn"),
|
||||
- (external_electron_log_default().transports.file.level = isDev
|
||||
- ? "silly"
|
||||
- : "warn"),
|
||||
+ (external_electron_log_default().transports.console.level =
|
||||
+ isDev({ isPackaged: true }) || process.env.LOG_LEVEL
|
||||
+ ? process.env.LOG_LEVEL
|
||||
+ : "warn"),
|
||||
+ (external_electron_log_default().transports.file.level =
|
||||
+ isDev({ isPackaged: true }) || !process.env.LOG_LEVEL
|
||||
+ ? process.env.LOG_LEVEL
|
||||
+ : "warn"),
|
||||
(external_electron_log_default().transports.sentry = function (msg) {
|
||||
"error" === msg.level &&
|
||||
(msg.data[0] instanceof Error
|
||||
--
|
||||
2.43.0
|
||||
|
184
patches/08-additional-metadata.patch
Normal file
184
patches/08-additional-metadata.patch
Normal file
@ -0,0 +1,184 @@
|
||||
From 89a8e44da29ae59e04adf7122374be4f621ec2ee Mon Sep 17 00:00:00 2001
|
||||
From: josselinonduty <contact@josselinonduty.fr>
|
||||
Date: Wed, 23 Jul 2025 20:36:49 +0200
|
||||
Subject: [PATCH] feat: provide additional information to mpris (and future
|
||||
patches)
|
||||
|
||||
---
|
||||
build/main.js | 42 +++++++++++++++++++++++++---------------
|
||||
build/renderer.js | 49 +++++++++++++++++++++++++++++++----------------
|
||||
2 files changed, 60 insertions(+), 31 deletions(-)
|
||||
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index 82f5c11..8332c3a 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -1253,18 +1253,24 @@
|
||||
setRepeatMode(repeatMode) {
|
||||
this.ipc.send("channel-player-repeat-mode-update", repeatMode);
|
||||
}
|
||||
- setTrackInfo(track) {
|
||||
+ setTrackInfo(track, data) {
|
||||
(this.track = Object.assign(this.track, track)),
|
||||
this.emit(MediaEvents.TrackUpdated, this.track),
|
||||
(this.mprisPlayer.metadata = {
|
||||
+ ...(data?.trackInfo?.song?.DURATION && {
|
||||
+ "mpris:length": data.trackInfo.song.DURATION * 1000,
|
||||
+ }),
|
||||
"mpris:trackid": this.mprisPlayer.objectPath("track/0"),
|
||||
"mpris:artUrl": track.coverUrl,
|
||||
"xesam:title": track.title,
|
||||
"xesam:album": track.album,
|
||||
"xesam:artist": [track.artist],
|
||||
+ ...(data?.trackInfo?.song?.SNG_ID && {
|
||||
+ "xesam:url": `https://deezer.com/track/${data.trackInfo.song.SNG_ID}`,
|
||||
+ }),
|
||||
});
|
||||
}
|
||||
- setPlayerInfo(player) {
|
||||
+ setPlayerInfo(player, data) {
|
||||
(this.player = Object.assign(this.player, player)),
|
||||
this.emit(MediaEvents.PlayerUpdated, this.player),
|
||||
(this.mprisPlayer.playbackStatus =
|
||||
@@ -2530,7 +2536,7 @@
|
||||
(this.ipc = ipc),
|
||||
(this.app = app);
|
||||
}
|
||||
- setUserInfo(userInfo) {
|
||||
+ setUserInfo(userInfo, data) {
|
||||
const previousUserID = this.user.id;
|
||||
(this.user = Object.assign(this.user, userInfo)),
|
||||
previousUserID !== this.user.id &&
|
||||
@@ -2773,8 +2779,8 @@
|
||||
media = main_di.get(SERVICE_MEDIA),
|
||||
powerSave = main_di.get(SERVICE_POWER_SAVE);
|
||||
var powerSaveTimeoutId;
|
||||
- PlayerIpc_ipc.on("channel-player-state-update", (event, state) => {
|
||||
- media.setPlayerInfo({ state }),
|
||||
+ PlayerIpc_ipc.on("channel-player-state-update", (event, state, data) => {
|
||||
+ media.setPlayerInfo({ state }, data),
|
||||
clearTimeout(powerSaveTimeoutId),
|
||||
(powerSaveTimeoutId = setTimeout(() => {
|
||||
state === MediaPlayerState.Playing
|
||||
@@ -2784,16 +2790,22 @@
|
||||
}),
|
||||
PlayerIpc_ipc.on(
|
||||
"channel-player-track-update",
|
||||
- (event, track, player) => {
|
||||
- media.setPlayerInfo(player), media.setTrackInfo(track);
|
||||
+ (event, track, player, data) => {
|
||||
+ media.setPlayerInfo(player, data), media.setTrackInfo(track, data);
|
||||
}
|
||||
),
|
||||
- PlayerIpc_ipc.on("channel-player-shuffle-update", (event, player) => {
|
||||
- media.setPlayerInfo(player);
|
||||
- }),
|
||||
- PlayerIpc_ipc.on("channel-player-repeat-mode-update", (event, player) => {
|
||||
- media.setPlayerInfo(player);
|
||||
- });
|
||||
+ PlayerIpc_ipc.on(
|
||||
+ "channel-player-shuffle-update",
|
||||
+ (event, player, data) => {
|
||||
+ media.setPlayerInfo(player, data);
|
||||
+ }
|
||||
+ ),
|
||||
+ PlayerIpc_ipc.on(
|
||||
+ "channel-player-repeat-mode-update",
|
||||
+ (event, player, data) => {
|
||||
+ media.setPlayerInfo(player, data);
|
||||
+ }
|
||||
+ );
|
||||
const UpdaterIpc_ipc = main_di.get(SERVICE_IPC),
|
||||
autoUpdater = main_di.get(SERVICE_UPDATER);
|
||||
UpdaterIpc_ipc.on("channel-updater-install", () => {
|
||||
@@ -2801,8 +2813,8 @@
|
||||
});
|
||||
const UserIpc_ipc = main_di.get(SERVICE_IPC),
|
||||
user = main_di.get(SERVICE_USER);
|
||||
- UserIpc_ipc.on("channel-user-store-updated", (event, userData) => {
|
||||
- user.setUserInfo(userData);
|
||||
+ UserIpc_ipc.on("channel-user-store-updated", (event, userData, data) => {
|
||||
+ user.setUserInfo(userData, data);
|
||||
});
|
||||
var application_awaiter = function (thisArg, _arguments, P, generator) {
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
diff --git a/build/renderer.js b/build/renderer.js
|
||||
index 9761e62..4992d17 100644
|
||||
--- a/build/renderer.js
|
||||
+++ b/build/renderer.js
|
||||
@@ -349,23 +349,31 @@
|
||||
isFamily =
|
||||
multiAccount &&
|
||||
(multiAccount.ENABLED || multiAccount.CHILD_COUNT > 0);
|
||||
- renderer_ipc.send("channel-user-store-updated", {
|
||||
- id: userMetadata.USER_ID,
|
||||
- isFamily,
|
||||
- isEmployee: userMetadata.SETTING.global.is_employee,
|
||||
- offerId: user.OFFER_ID,
|
||||
- country: user.COUNTRY,
|
||||
- gatekeeps: user.__DZR_GATEKEEPS__,
|
||||
- });
|
||||
+ renderer_ipc.send(
|
||||
+ "channel-user-store-updated",
|
||||
+ {
|
||||
+ id: userMetadata.USER_ID,
|
||||
+ isFamily,
|
||||
+ isEmployee: userMetadata.SETTING.global.is_employee,
|
||||
+ offerId: user.OFFER_ID,
|
||||
+ country: user.COUNTRY,
|
||||
+ gatekeeps: user.__DZR_GATEKEEPS__,
|
||||
+ },
|
||||
+ event.data
|
||||
+ );
|
||||
break;
|
||||
}
|
||||
case "player-repeat-changed":
|
||||
- renderer_ipc.send("channel-player-repeat-mode-update", {
|
||||
- repeatMode: event.data.player.repeat,
|
||||
- canPrev: event.data.player.hasPrev,
|
||||
- canNext: event.data.player.hasNext,
|
||||
- canRepeat: event.data.player.hasRepeat,
|
||||
- });
|
||||
+ renderer_ipc.send(
|
||||
+ "channel-player-repeat-mode-update",
|
||||
+ {
|
||||
+ repeatMode: event.data.player.repeat,
|
||||
+ canPrev: event.data.player.hasPrev,
|
||||
+ canNext: event.data.player.hasNext,
|
||||
+ canRepeat: event.data.player.hasRepeat,
|
||||
+ },
|
||||
+ event.data
|
||||
+ );
|
||||
break;
|
||||
case "player-shuffle-changed":
|
||||
renderer_ipc.send("channel-player-shuffle-update", {
|
||||
@@ -380,7 +388,11 @@
|
||||
!0 === event.data.isPlaying
|
||||
? MediaPlayerState.Playing
|
||||
: MediaPlayerState.Paused;
|
||||
- renderer_ipc.send("channel-player-state-update", state);
|
||||
+ renderer_ipc.send(
|
||||
+ "channel-player-state-update",
|
||||
+ state,
|
||||
+ event.data
|
||||
+ );
|
||||
break;
|
||||
}
|
||||
case "player-track-updated": {
|
||||
@@ -409,7 +421,12 @@
|
||||
canRepeat: event.data.player.hasRepeat,
|
||||
canShuffle: event.data.player.hasShuffle,
|
||||
};
|
||||
- renderer_ipc.send("channel-player-track-update", track, player);
|
||||
+ renderer_ipc.send(
|
||||
+ "channel-player-track-update",
|
||||
+ track,
|
||||
+ player,
|
||||
+ event.data
|
||||
+ );
|
||||
break;
|
||||
}
|
||||
}
|
||||
--
|
||||
2.48.1
|
||||
|
232
patches/09-discord-rich-presence.patch
Normal file
232
patches/09-discord-rich-presence.patch
Normal file
@ -0,0 +1,232 @@
|
||||
From c53a3132b676ecaa30f8dcb30ecbaaabbbd63f76 Mon Sep 17 00:00:00 2001
|
||||
From: josselinonduty <contact@josselinonduty.fr>
|
||||
Date: Wed, 23 Jul 2025 21:36:05 +0200
|
||||
Subject: [PATCH] feat: add discord rich presence support (w/ opt-in arg.)
|
||||
|
||||
---
|
||||
build/main.js | 175 +++++++++++++++++++++++++++++++++++++++++++++++++-
|
||||
package.json | 1 +
|
||||
2 files changed, 175 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index 8332c3a..aba4098 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -93,6 +93,13 @@
|
||||
var external_electron_mpris_default = __webpack_require__.n(
|
||||
external_electron_mpris_namespaceObject
|
||||
);
|
||||
+ const external_discord_rpc_namespaceObject = require("@deezer-community/discord-rpc");
|
||||
+ var external_discord_rpc_default = __webpack_require__.n(
|
||||
+ external_discord_rpc_namespaceObject
|
||||
+ );
|
||||
+ /** @type {import("@deezer-community/discord-rpc").Client} */
|
||||
+ var rpcClient;
|
||||
+ var rpcData, rpcStartedAt, rpcPausedAt;
|
||||
function isPlatform(platform) {
|
||||
switch (platform) {
|
||||
case PLATFORM.WINDOWS:
|
||||
@@ -1229,6 +1236,170 @@
|
||||
this.mprisPlayer.on("loopStatus", this.setRepeatMode.bind(this));
|
||||
this.mprisPlayer.on("raise", () => this.app.getWindow().show());
|
||||
}
|
||||
+ updateDiscordRichPresence(track, data) {
|
||||
+ if (!process.argv.some((arg) => arg === "--enable-discord-rpc")) return;
|
||||
+
|
||||
+ if (!rpcClient) {
|
||||
+ rpcClient = new external_discord_rpc_namespaceObject.Client({
|
||||
+ clientId: "1244016234203185183",
|
||||
+ transport: "ipc",
|
||||
+ });
|
||||
+ rpcClient.on("ready", () => {
|
||||
+ external_electron_log_default().info(
|
||||
+ "[Discord] Rich presence client is ready."
|
||||
+ );
|
||||
+ });
|
||||
+ rpcClient.on("close", () => {
|
||||
+ external_electron_log_default().info(
|
||||
+ "[Discord] Rich presence client disconnected."
|
||||
+ );
|
||||
+ });
|
||||
+ rpcClient
|
||||
+ .login()
|
||||
+ .then(() => {
|
||||
+ external_electron_log_default().info(
|
||||
+ "[Discord] Rich presence client logged in successfully."
|
||||
+ );
|
||||
+ })
|
||||
+ .catch((err) => {
|
||||
+ external_electron_log_default().error(
|
||||
+ `[Discord] Rich presence client login error: ${err}`
|
||||
+ );
|
||||
+
|
||||
+ rpcClient = null;
|
||||
+ });
|
||||
+ }
|
||||
+
|
||||
+ if (track && data) {
|
||||
+ const duration = data?.trackInfo?.song?.DURATION;
|
||||
+ const livestream = data?.trackInfo?.song?.LIVE_STREAM || false;
|
||||
+
|
||||
+ external_electron_log_default().debug(
|
||||
+ "[Discord] Updating rich presence with track information."
|
||||
+ );
|
||||
+ rpcStartedAt = livestream
|
||||
+ ? rpcData.startTimestamp || Date.now()
|
||||
+ : Date.now();
|
||||
+ rpcPausedAt = null;
|
||||
+ rpcData = {
|
||||
+ type: external_discord_rpc_namespaceObject.ActivityType.Listening,
|
||||
+ smallImage: {
|
||||
+ image: "play",
|
||||
+ text: "Playing",
|
||||
+ },
|
||||
+ largeImage: track.coverUrl,
|
||||
+ description: track.title,
|
||||
+ state:
|
||||
+ !track.album || track.title === track.album
|
||||
+ ? `${track.artist}`
|
||||
+ : `${track.artist} - ${track.album}`,
|
||||
+ startTimestamp: rpcStartedAt,
|
||||
+ ...(duration && {
|
||||
+ endTimestamp: rpcStartedAt + duration * 1e3,
|
||||
+ duration: duration * 1e3,
|
||||
+ }),
|
||||
+ ...(data?.trackInfo?.song?.SNG_ID && {
|
||||
+ button: {
|
||||
+ label: "Listen on Deezer",
|
||||
+ url: `https://deezer.com/track/${data.trackInfo.song.SNG_ID}`,
|
||||
+ },
|
||||
+ }),
|
||||
+ };
|
||||
+
|
||||
+ rpcClient
|
||||
+ ?.setActivity({
|
||||
+ state: rpcData.state,
|
||||
+ type: rpcData.type,
|
||||
+ details: rpcData.description,
|
||||
+ assets: {
|
||||
+ large_image: rpcData.largeImage,
|
||||
+ small_image: rpcData.smallImage.image,
|
||||
+ small_text: rpcData.smallImage.text,
|
||||
+ },
|
||||
+ timestamps: {
|
||||
+ start: rpcData.startTimestamp,
|
||||
+ end: rpcData.endTimestamp,
|
||||
+ },
|
||||
+ ...(rpcData.button && {
|
||||
+ buttons: [
|
||||
+ {
|
||||
+ label: rpcData.button.label,
|
||||
+ url: rpcData.button.url,
|
||||
+ },
|
||||
+ ],
|
||||
+ }),
|
||||
+ })
|
||||
+ .then(() => {
|
||||
+ external_electron_log_default().debug(
|
||||
+ "[Discord] Rich presence updated successfully."
|
||||
+ );
|
||||
+ })
|
||||
+ .catch((err) => {
|
||||
+ external_electron_log_default().error(
|
||||
+ `[Discord] Error updating rich presence: ${err}`
|
||||
+ );
|
||||
+ });
|
||||
+ } else {
|
||||
+ if (!rpcClient) return;
|
||||
+ if (!rpcData) {
|
||||
+ external_electron_log_default().debug(
|
||||
+ "[Discord] No track data available for rich presence."
|
||||
+ );
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ if (this.player.state === "playing") {
|
||||
+ if (rpcPausedAt) {
|
||||
+ const elapsed = rpcPausedAt - rpcStartedAt;
|
||||
+ rpcStartedAt = Date.now() - elapsed;
|
||||
+ rpcData.startTimestamp = rpcStartedAt;
|
||||
+ rpcData.endTimestamp = rpcStartedAt + (rpcData.duration || 0);
|
||||
+ }
|
||||
+ rpcPausedAt = undefined;
|
||||
+ rpcData.smallImage = {
|
||||
+ image: "play",
|
||||
+ text: "Playing",
|
||||
+ };
|
||||
+ } else {
|
||||
+ rpcData.startTimestamp = undefined;
|
||||
+ rpcData.endTimestamp = undefined;
|
||||
+ rpcPausedAt = Date.now();
|
||||
+ rpcData.smallImage = {
|
||||
+ image: "pause",
|
||||
+ text: "Paused",
|
||||
+ };
|
||||
+ }
|
||||
+
|
||||
+ rpcClient
|
||||
+ ?.setActivity({
|
||||
+ state: rpcData.state,
|
||||
+ type: rpcData.type,
|
||||
+ details: rpcData.description,
|
||||
+ assets: {
|
||||
+ large_image: rpcData.largeImage,
|
||||
+ small_image: rpcData.smallImage.image,
|
||||
+ small_text: rpcData.smallImage.text,
|
||||
+ },
|
||||
+ timestamps: {
|
||||
+ start: rpcData.startTimestamp,
|
||||
+ end: rpcData.endTimestamp,
|
||||
+ },
|
||||
+ ...(rpcData.button && {
|
||||
+ buttons: [
|
||||
+ {
|
||||
+ label: rpcData.button.label,
|
||||
+ url: rpcData.button.url,
|
||||
+ },
|
||||
+ ],
|
||||
+ }),
|
||||
+ })
|
||||
+ .catch((err) => {
|
||||
+ external_electron_log_default().error(
|
||||
+ `[Discord] Error updating rich presence: ${err}`
|
||||
+ );
|
||||
+ });
|
||||
+ }
|
||||
+ }
|
||||
play() {
|
||||
this.ipc.send("channel-player-media-control", MediaPlayerControl.Play);
|
||||
}
|
||||
@@ -1269,6 +1440,7 @@
|
||||
"xesam:url": `https://deezer.com/track/${data.trackInfo.song.SNG_ID}`,
|
||||
}),
|
||||
});
|
||||
+ this.updateDiscordRichPresence(track, data);
|
||||
}
|
||||
setPlayerInfo(player, data) {
|
||||
(this.player = Object.assign(this.player, player)),
|
||||
@@ -1276,7 +1448,8 @@
|
||||
(this.mprisPlayer.playbackStatus =
|
||||
this.player.state === "playing"
|
||||
? external_electron_mpris_namespaceObject.PLAYBACK_STATUS_PLAYING
|
||||
- : external_electron_mpris_namespaceObject.PLAYBACK_STATUS_PAUSED);
|
||||
+ : external_electron_mpris_namespaceObject.PLAYBACK_STATUS_PAUSED),
|
||||
+ this.updateDiscordRichPresence();
|
||||
}
|
||||
getTrackInfo() {
|
||||
return this.track;
|
||||
diff --git a/package.json b/package.json
|
||||
index 0dd2a5c..8aedf53 100644
|
||||
--- a/package.json
|
||||
+++ b/package.json
|
||||
@@ -12,6 +12,7 @@
|
||||
"author": "Deezer <support@deezer.com>",
|
||||
"main": "build/main.js",
|
||||
"dependencies": {
|
||||
+ "@deezer-community/discord-rpc": "1.0.4",
|
||||
"@electron/remote": "2.1.2",
|
||||
"@jellybrick/mpris-service": "2.1.5",
|
||||
"electron-log": "^5.1.2",
|
||||
--
|
||||
2.48.1
|
||||
|
126
patches/10-improve-responsiveness.patch
Normal file
126
patches/10-improve-responsiveness.patch
Normal file
@ -0,0 +1,126 @@
|
||||
From 33ed1cce4b8831fc6412ca482d9867a9dff9ffec Mon Sep 17 00:00:00 2001
|
||||
From: Aurélien Hamy <me@aunetx.dev>
|
||||
Date: Thu, 22 May 2025 15:50:44 +0200
|
||||
Subject: [PATCH] feat: improve responsiveness on small devices
|
||||
|
||||
Based on patch by josselinonduty <contact@josselinonduty.fr>
|
||||
Makes it possible to use the application for with a width as low as 550 pixels
|
||||
without problems, and is usable even below. Should not change anything for
|
||||
devices larger than 950 pixels, and nearly nothing above 800 pixels wide.
|
||||
---
|
||||
build/index.html | 83 ++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
build/main.js | 4 +--
|
||||
2 files changed, 85 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/build/index.html b/build/index.html
|
||||
index 8016bc8..4efcd23 100644
|
||||
--- a/build/index.html
|
||||
+++ b/build/index.html
|
||||
@@ -4,6 +4,89 @@
|
||||
<meta charset="utf-8" />
|
||||
<title>Deezer</title>
|
||||
<script defer="defer" src="./renderer.js"></script>
|
||||
+ <style>
|
||||
+ #page_topbar {
|
||||
+ min-width: 0px !important;
|
||||
+ }
|
||||
+
|
||||
+ .naboo {
|
||||
+ min-width: auto !important;
|
||||
+ }
|
||||
+
|
||||
+ .page-main {
|
||||
+ min-width: auto !important;
|
||||
+ }
|
||||
+
|
||||
+ /* this removes an unuseful margin that breaks on low width */
|
||||
+ @media screen and (max-width: 850px) {
|
||||
+ .carousel {
|
||||
+ margin-right: -24px !important;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /* this prevents the content from overflowing */
|
||||
+ @media screen and (max-width: 808px) {
|
||||
+ .container > .carousel-wrapper {
|
||||
+ width: 100% !important;
|
||||
+ margin: 0px;
|
||||
+ padding: 0px;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /* this makes the width transition seamless for carousels */
|
||||
+ @media only screen and (max-width: 784px) {
|
||||
+ .container {
|
||||
+ width: 100% !important;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /* this makes the track list responsive */
|
||||
+ @media screen and (max-width: 950px) {
|
||||
+ .page-player .player-full {
|
||||
+ min-width: auto !important;
|
||||
+ }
|
||||
+
|
||||
+ .page-player .player-queuelist .player-container {
|
||||
+ margin: 32px 2% 0 !important;
|
||||
+ }
|
||||
+
|
||||
+ .page-player .queuelist-cover {
|
||||
+ width: 180px !important;
|
||||
+ margin-right: 2% !important;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /* this hides the unuseful cover in track list for small screens */
|
||||
+ @media screen and (max-width: 750px) {
|
||||
+ .page-player .queuelist-cover {
|
||||
+ display: none !important;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /* this makes the bottom player bar responsive */
|
||||
+ @media screen and (max-width: 800px) {
|
||||
+ #page_player > div:first-child {
|
||||
+ min-width: auto !important;
|
||||
+ }
|
||||
+
|
||||
+ /* icon and name */
|
||||
+ #page_player > div:first-child > div:first-child {
|
||||
+ width: calc(49% - 52px) !important;
|
||||
+ }
|
||||
+
|
||||
+ /* player controls */
|
||||
+ #page_player > div:first-child > div:nth-child(2) {
|
||||
+ padding-inline-start: unset !important;
|
||||
+ padding-inline-end: unset !important;
|
||||
+ width: calc(49% - 52px) !important;
|
||||
+ }
|
||||
+
|
||||
+ /* queue, volume and audio quality */
|
||||
+ #page_player > div:first-child > div:last-child {
|
||||
+ width: auto !important;
|
||||
+ }
|
||||
+ }
|
||||
+ </style>
|
||||
</head>
|
||||
<body class="electron">
|
||||
<div id="dzr-app"></div>
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index 22b50ff..99935cb 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -3245,8 +3245,8 @@
|
||||
},
|
||||
windowOptions = {
|
||||
title: "Deezer Desktop",
|
||||
- minWidth: 990,
|
||||
- minHeight: 600,
|
||||
+ minWidth: 450,
|
||||
+ minHeight: 450,
|
||||
icon: external_electron_namespaceObject.nativeImage.createFromPath(
|
||||
getAppIcon(external_electron_namespaceObject.app)
|
||||
),
|
||||
--
|
||||
2.49.0
|
||||
|
66
patches/11-hide-appoffline-banner.patch
Normal file
66
patches/11-hide-appoffline-banner.patch
Normal file
@ -0,0 +1,66 @@
|
||||
From bbb88f846c94978959f4816069332b4d9f9f4dab Mon Sep 17 00:00:00 2001
|
||||
From: josselinonduty <contact@josselinonduty.fr>
|
||||
Date: Tue, 8 Jul 2025 12:54:19 +0200
|
||||
Subject: [PATCH] feat: add toggle to hide application offline banner
|
||||
|
||||
Original patch: Aurélien Hamy <aunetx@yandex.com>
|
||||
This solves #123 by adding the `--hide-appoffline-banner` command-line argument
|
||||
to hide the annoying "Application is offline" banner, that sometimes appears when
|
||||
using a VPN or DNS level blocker.
|
||||
---
|
||||
build/index.html | 6 ++++++
|
||||
build/main.js | 5 +++++
|
||||
build/preload.js | 4 ++++
|
||||
3 files changed, 15 insertions(+)
|
||||
|
||||
diff --git a/build/index.html b/build/index.html
|
||||
index 4efcd23..4be829c 100644
|
||||
--- a/build/index.html
|
||||
+++ b/build/index.html
|
||||
@@ -86,6 +86,12 @@
|
||||
width: auto !important;
|
||||
}
|
||||
}
|
||||
+
|
||||
+ /* hide the offline alert when needed */
|
||||
+ .hide-AppOffline-banner
|
||||
+ .alert-wrapper:has(> div[data-testid="alert-AppOffline"]) {
|
||||
+ display: none !important;
|
||||
+ }
|
||||
</style>
|
||||
</head>
|
||||
<body class="electron">
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index 99935cb..1c16dbe 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -3166,6 +3166,11 @@
|
||||
getRealPath(external_electron_namespaceObject.app, __dirname),
|
||||
"preload.js"
|
||||
),
|
||||
+ additionalArguments: [
|
||||
+ (process.argv.some((arg) => arg === "--hide-appoffline-banner") ||
|
||||
+ "yes" === process.env.DZ_HIDE_APPOFFLINE_BANNER) &&
|
||||
+ "--hide-appoffline-banner",
|
||||
+ ].filter(Boolean),
|
||||
},
|
||||
windowOptions = {
|
||||
title: "Deezer Desktop",
|
||||
diff --git a/build/preload.js b/build/preload.js
|
||||
index 1301e93..05939c4 100644
|
||||
--- a/build/preload.js
|
||||
+++ b/build/preload.js
|
||||
@@ -538,6 +538,10 @@
|
||||
external_i18next_default().dir(external_i18next_default().language)
|
||||
? "rtl"
|
||||
: "ltr");
|
||||
+ if (process.argv.some((arg) => arg === "--hide-appoffline-banner"))
|
||||
+ document
|
||||
+ .getElementsByTagName("body")[0]
|
||||
+ .classList.add("hide-AppOffline-banner");
|
||||
});
|
||||
})(),
|
||||
(module.exports = __webpack_exports__);
|
||||
--
|
||||
2.48.1
|
||||
|
60
patches/12-disable-animations.patch
Normal file
60
patches/12-disable-animations.patch
Normal file
@ -0,0 +1,60 @@
|
||||
From a220daa47a06d19ff6a995d567c0f46e42d14f6b Mon Sep 17 00:00:00 2001
|
||||
From: josselinonduty <contact@josselinonduty.fr>
|
||||
Date: Tue, 8 Jul 2025 14:37:23 +0200
|
||||
Subject: [PATCH] feat(patch): disable animations (cli/env)
|
||||
|
||||
---
|
||||
build/index.html | 6 ++++++
|
||||
build/main.js | 3 +++
|
||||
build/preload.js | 4 ++++
|
||||
3 files changed, 13 insertions(+)
|
||||
|
||||
diff --git a/build/index.html b/build/index.html
|
||||
index 4be829c..2ef7709 100644
|
||||
--- a/build/index.html
|
||||
+++ b/build/index.html
|
||||
@@ -92,6 +92,12 @@
|
||||
.alert-wrapper:has(> div[data-testid="alert-AppOffline"]) {
|
||||
display: none !important;
|
||||
}
|
||||
+
|
||||
+ /* Disable animations */
|
||||
+ .disable-animations * {
|
||||
+ animation: none !important;
|
||||
+ transition: none !important;
|
||||
+ }
|
||||
</style>
|
||||
</head>
|
||||
<body class="electron">
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index 8fa4b6f..61028cd 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -3246,6 +3246,9 @@
|
||||
(process.argv.some((arg) => arg === "--hide-appoffline-banner") ||
|
||||
"yes" === process.env.DZ_HIDE_APPOFFLINE_BANNER) &&
|
||||
"--hide-appoffline-banner",
|
||||
+ (process.argv.some((arg) => arg === "--disable-animations") ||
|
||||
+ "yes" === process.env.DZ_DISABLE_ANIMATIONS) &&
|
||||
+ "--disable-animations",
|
||||
].filter(Boolean),
|
||||
},
|
||||
windowOptions = {
|
||||
diff --git a/build/preload.js b/build/preload.js
|
||||
index 05939c4..0df9150 100644
|
||||
--- a/build/preload.js
|
||||
+++ b/build/preload.js
|
||||
@@ -542,6 +542,10 @@
|
||||
document
|
||||
.getElementsByTagName("body")[0]
|
||||
.classList.add("hide-AppOffline-banner");
|
||||
+ if (process.argv.some((arg) => arg === "--disable-animations"))
|
||||
+ document
|
||||
+ .getElementsByTagName("body")[0]
|
||||
+ .classList.add("disable-animations");
|
||||
});
|
||||
})(),
|
||||
(module.exports = __webpack_exports__);
|
||||
--
|
||||
2.48.1
|
||||
|
40
patches/13-disable-notifications.patch
Normal file
40
patches/13-disable-notifications.patch
Normal file
@ -0,0 +1,40 @@
|
||||
From fead13c466b3f5fde6f6fdd62c77b22a070e8d97 Mon Sep 17 00:00:00 2001
|
||||
From: josselinonduty <contact@josselinonduty.fr>
|
||||
Date: Tue, 29 Jul 2025 10:46:31 +0200
|
||||
Subject: [PATCH] feat(patch): disable notifications (w/ cli arg or env var)
|
||||
|
||||
---
|
||||
build/main.js | 3 +++
|
||||
build/preload.js | 2 ++
|
||||
2 files changed, 5 insertions(+)
|
||||
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index 5034587..315cab4 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -3259,6 +3259,9 @@
|
||||
(process.argv.some((arg) => arg === "--disable-animations") ||
|
||||
"yes" === process.env.DZ_DISABLE_ANIMATIONS) &&
|
||||
"--disable-animations",
|
||||
+ (process.argv.some((arg) => arg === "--disable-notifications") ||
|
||||
+ "yes" === process.env.DZ_DISABLE_NOTIFICATIONS) &&
|
||||
+ "--disable-notifications",
|
||||
].filter(Boolean),
|
||||
},
|
||||
windowOptions = {
|
||||
diff --git a/build/preload.js b/build/preload.js
|
||||
index 0df9150..aa4bb78 100644
|
||||
--- a/build/preload.js
|
||||
+++ b/build/preload.js
|
||||
@@ -546,6 +546,8 @@
|
||||
document
|
||||
.getElementsByTagName("body")[0]
|
||||
.classList.add("disable-animations");
|
||||
+ if (process.argv.some((arg) => arg === "--disable-notifications"))
|
||||
+ delete window.Notification;
|
||||
});
|
||||
})(),
|
||||
(module.exports = __webpack_exports__);
|
||||
--
|
||||
2.48.1
|
||||
|
@ -1,54 +0,0 @@
|
||||
From: Dorian Stoll <dorian.stoll@tmsp.io>
|
||||
Date: Sat, 5 Feb 2022 07:05:16 +0100
|
||||
Subject: [PATCH] Fix isDev() usage
|
||||
|
||||
This stops the excessive logging, since parts of the app will not run in development
|
||||
mode anymore. It also stops the app from logging the urls for the mp3 files, which is
|
||||
against the Deezer TOS.
|
||||
---
|
||||
build/main.js | 6 +++---
|
||||
build/preload.js | 2 +-
|
||||
2 files changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index 2da2ed1..88135ae 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -1979,7 +1979,7 @@
|
||||
tags: Object.assign(
|
||||
{ country: user.country, offerId: user.offerId },
|
||||
{
|
||||
- environment: isDev ? "development" : "production",
|
||||
+ environment: isDev() ? "development" : "production",
|
||||
os: `${external_os_default().type()} ${external_os_default().release()}`,
|
||||
"os.name": external_os_default().type(),
|
||||
arch: process.arch,
|
||||
@@ -3268,10 +3268,10 @@
|
||||
(external_electron_log_default().transports.console.format = `{h}:{i}:{s}.{ms} ({processType}/{level}) ${
|
||||
isPlatform(PLATFORM.WINDOWS) ? ">" : "›"
|
||||
} {text}`),
|
||||
- (external_electron_log_default().transports.console.level = isDev
|
||||
+ (external_electron_log_default().transports.console.level = isDev()
|
||||
? "silly"
|
||||
: "warn"),
|
||||
- (external_electron_log_default().transports.file.level = isDev
|
||||
+ (external_electron_log_default().transports.file.level = isDev()
|
||||
? "silly"
|
||||
: "warn"),
|
||||
(external_electron_log_default().transports.sentry = function (msg) {
|
||||
diff --git a/build/preload.js b/build/preload.js
|
||||
index a8bb8d6..73dc8b4 100644
|
||||
--- a/build/preload.js
|
||||
+++ b/build/preload.js
|
||||
@@ -490,7 +490,7 @@
|
||||
}
|
||||
getSentryTags() {
|
||||
return {
|
||||
- environment: isDev ? "development" : "production",
|
||||
+ environment: isDev() ? "development" : "production",
|
||||
os: `${external_os_default().type()} ${external_os_default().release()}`,
|
||||
"os.name": external_os_default().type(),
|
||||
arch: process.arch,
|
||||
--
|
||||
2.34.1
|
||||
|
@ -1,16 +0,0 @@
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index 5066eef..46b04c5 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -3083,7 +3083,10 @@
|
||||
this._adjustViewToContentSize(),
|
||||
mainView.setAutoResize({ width: !0, height: !0 });
|
||||
} else this.appService.setWindow(this.window, void 0);
|
||||
- if ((this.appService.setUserAgent(), isPlatform(PLATFORM.DARWIN))) {
|
||||
+ if (
|
||||
+ (this.appService.setUserAgent(), isPlatform(PLATFORM.LINUX))
|
||||
+ && !process.argv.some(arg => arg === '--disable-systray')
|
||||
+ ) {
|
||||
let isQuitting = !1;
|
||||
external_electron_namespaceObject.app.on(
|
||||
"before-quit",
|
@ -1,83 +0,0 @@
|
||||
From: Dorian Stoll <dorian.stoll@tmsp.io>
|
||||
Date: Sat, 29 Jan 2022 12:30:00 +0100
|
||||
Subject: [PATCH] Remove kernel version from User-Agent
|
||||
|
||||
The application sends the kernel version as part of the User-Agent.
|
||||
However, the Deezer API seems to assume the number to follow semver,
|
||||
and can get confused when it doesn't. This then leads to some features
|
||||
like dark mode being reported as unavailable.
|
||||
|
||||
e.g: 5.11.0-16-generic works, while 5.15.14-200.fc35.x86_64 doesn't.
|
||||
|
||||
The solution is to ignore the actual version and send bogus data that
|
||||
is known to work.
|
||||
---
|
||||
build/main.js | 4 +++-
|
||||
build/preload.js | 4 +++-
|
||||
build/renderer.js | 4 +++-
|
||||
build/titlebar.js | 4 +++-
|
||||
4 files changed, 12 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index b8e2459..2da2ed1 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -5,7 +5,9 @@
|
||||
module.exports = require("macos-version");
|
||||
},
|
||||
87: (module) => {
|
||||
- module.exports = require("os");
|
||||
+ var m = require("os");
|
||||
+ m.release = function() { return "0.0.0"; }
|
||||
+ module.exports = m;
|
||||
},
|
||||
},
|
||||
__webpack_module_cache__ = {};
|
||||
diff --git a/build/preload.js b/build/preload.js
|
||||
index 912f8ee..a8bb8d6 100644
|
||||
--- a/build/preload.js
|
||||
+++ b/build/preload.js
|
||||
@@ -5,7 +5,9 @@
|
||||
module.exports = require("macos-version");
|
||||
},
|
||||
87: (module) => {
|
||||
- module.exports = require("os");
|
||||
+ var m = require("os");
|
||||
+ m.release = function() { return "0.0.0"; }
|
||||
+ module.exports = m;
|
||||
},
|
||||
},
|
||||
__webpack_module_cache__ = {};
|
||||
diff --git a/build/renderer.js b/build/renderer.js
|
||||
index 6e7787f..026c052 100644
|
||||
--- a/build/renderer.js
|
||||
+++ b/build/renderer.js
|
||||
@@ -5,7 +5,9 @@
|
||||
module.exports = require("macos-version");
|
||||
},
|
||||
87: (module) => {
|
||||
- module.exports = require("os");
|
||||
+ var m = require("os");
|
||||
+ m.release = function() { return "0.0.0"; }
|
||||
+ module.exports = m;
|
||||
},
|
||||
},
|
||||
__webpack_module_cache__ = {};
|
||||
diff --git a/build/titlebar.js b/build/titlebar.js
|
||||
index 3d2aaca..052553b 100644
|
||||
--- a/build/titlebar.js
|
||||
+++ b/build/titlebar.js
|
||||
@@ -5,7 +5,9 @@
|
||||
module.exports = require("macos-version");
|
||||
},
|
||||
87: (module) => {
|
||||
- module.exports = require("os");
|
||||
+ var m = require("os");
|
||||
+ m.release = function() { return "0.0.0"; }
|
||||
+ module.exports = m;
|
||||
},
|
||||
},
|
||||
__webpack_module_cache__ = {};
|
||||
--
|
||||
2.34.1
|
||||
|
@ -1,19 +0,0 @@
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index 5066eef..592a6bc 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -3122,8 +3122,12 @@
|
||||
finalMinSize[1]
|
||||
);
|
||||
}
|
||||
- isDev() ? this.window.showInactive() : this.window.show(),
|
||||
- this.thumbar.init();
|
||||
+ if (!process.argv.some(arg => arg === '--start-in-tray')) {
|
||||
+ isDev() ? this.window.showInactive() : this.window.show(),
|
||||
+ this.thumbar.init();
|
||||
+ } else {
|
||||
+ this.window.hide();
|
||||
+ }
|
||||
}),
|
||||
this.appService.enableDevMode();
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user