Compare commits

...

125 Commits

Author SHA1 Message Date
josselinonduty
d8676754fc
Merge pull request #151 from aunetx/feature/disable-notifications
feat(patch): disable notifications (w/ cli arg or env var)
2025-07-29 23:32:28 +02:00
josselinonduty
7dc1bde5df
chore: update docs and makefile for disable notifications patch. Closes #145 2025-07-29 11:04:14 +02:00
josselinonduty
d7087d9bbc
feat(patch): disable notifications (w/ cli arg or env var) 2025-07-29 10:58:17 +02:00
josselinonduty
a7c7eb234d
Merge pull request #150 from aunetx/update-master-5edcfa9
deezer: Update DeezerDesktopSetup_7.0.110.exe
2025-07-28 13:39:44 +02:00
Flatpak External Data Checker
f0b4123be4 deezer: Update DeezerDesktopSetup_7.0.110.exe 2025-07-28 01:50:30 +00:00
josselinonduty
8f7683238f
Merge pull request #148 from aunetx/josselinonduty/issue147
fix: update patches to support radio stations. Fixes #147
2025-07-23 22:10:45 +02:00
josselinonduty
63db934f26
fix: update patches to support radio stations. Fixes #147 2025-07-23 22:03:24 +02:00
Cezar Lungu
9e2b8ea82f
Merge pull request #146 from aunetx/josselinonduty-update-workflow-reqs
chore: update bug.yml
2025-07-18 08:50:14 +02:00
josselinonduty
d627be3d15
chore: update bug.yml 2025-07-17 23:17:12 +02:00
josselinonduty
f8295006a5
chore: fix faq link in issue template 2025-07-09 20:05:22 +02:00
josselinonduty
64676ca3df
chore: add issue template (#143) 2025-07-09 20:01:30 +02:00
josselinonduty
5eb113d5e9
Merge pull request #141 from aunetx/update-master-b09ea93
deezer: Update DeezerDesktopSetup_7.0.80.exe
2025-07-08 15:04:20 +02:00
josselinonduty
a5b5b91a9e
Merge branch 'master' into update-master-b09ea93 2025-07-08 15:03:36 +02:00
josselinonduty
9ac53b9b4e
Feat: disable animations (cli/env) (#133). Closes #14
add option to disable animations via cli or environment variable
2025-07-08 14:57:08 +02:00
josselinonduty
ab48516655
Merge pull request #124 from aunetx/hide-appoffline-banner
Add patch to optionally hide the "Application is offline" banner

Co-authored-by: Aurélien Hamy <aunetx@yandex.com>
Co-authored-by: ElysaSrc <elysasrc@tuta.com>
2025-07-08 13:14:27 +02:00
josselinonduty
260f182504
chore: add author to patch 2025-07-08 13:11:27 +02:00
josselinonduty
953841da37
fix: improve hide appoffline patch w/ env var + docs 2025-07-08 13:07:21 +02:00
josselinonduty
1b6608b401
Merge pull request #142 from aunetx/josselinonduty/fix-flatpak-build
chore: fix desktop entry file for flatpak builder
2025-07-08 12:37:59 +02:00
josselinonduty
1e6e83ae1c
chore: fix desktop entry file for flatpak builder 2025-07-08 12:36:57 +02:00
josselinonduty
d8e2a9fa88
Merge pull request #139 from aunetx:update-master-db4545d
deezer: Update DeezerDesktopSetup_7.0.80.exe
2025-07-08 12:21:46 +02:00
Flatpak External Data Checker
b76d5c076f deezer: Update DeezerDesktopSetup_7.0.80.exe 2025-07-07 01:43:31 +00:00
Flatpak External Data Checker
bc8546bdcf deezer: Update DeezerDesktopSetup_7.0.80.exe 2025-06-30 01:43:20 +00:00
josselinonduty
0ea9eb377a
Fix: revert changes about class name (#131)
* fix: revert changes about StartupWMClass name

* fix typo
2025-06-29 16:32:21 +02:00
josselinonduty
7b10a66fc8
Feat: migrate to internal dependency (@deezer-community/discord-rpc); small improvements (#126)
* feat: migrate to internal dependency (@deezer-community/discord-rpc); add small improvements
* chore(patch): change package name in old comment
* chore(patch): bump discord-rpc dependency version to 1.0.4 (license change+exact version)
2025-06-09 19:24:09 +09:00
josselinonduty
e9da7c98ff
ci: fix snapcraft build process 2025-05-30 20:22:24 +09:00
josselinonduty
6d86d581b4
Merge pull request #128 from aunetx/josselinonduty/issue53-incorrect-class
fix: deezer doesn't link to its class properly under wayland (incorrect name)
2025-05-29 09:58:49 +09:00
josselinonduty
63d105587f
ci: install snapcraft to build snap packages (#125)
* ci: install snapcraft to build snap packages

* ci: ensure required packages are installed; install snap with apt

* ci: disable snap arm64 target because of build error
2025-05-29 09:55:50 +09:00
josselinonduty
2b84c3843c
fix: deezer doesn't link to its class properly under wayland (incorrect name). Could fix #53 2025-05-29 02:04:13 +09:00
Aurélien Hamy
947b699d25
Update README to document --hide-appoffline-banner 2025-05-26 16:06:55 +02:00
Aurélien Hamy
f9bb477489
Update makefile accordingly 2025-05-26 15:58:22 +02:00
Aurélien Hamy
d5cb310799
Add patch to optionally hide the "Application is offline" banner 2025-05-26 15:55:32 +02:00
josselinonduty
9f42fb1046
Merge pull request #117 from aunetx/update-master-21cd029
deezer: Update DeezerDesktopSetup_7.0.70.exe
2025-05-25 13:31:56 +09:00
josselinonduty
56479b3a04
Merge pull request #121 from aunetx/josselinonduty/issue104
Support IME/virtual keyboard
2025-05-25 13:30:35 +09:00
Aurélien Hamy
01640bf48e
Merge pull request #122 from aunetx/improve-responsiveness
Feature: Improve responsiveness
2025-05-24 23:15:58 +02:00
Aurélien Hamy
d141e6a488
Make the 784px transition seamless and remove weird margins under 808px 2025-05-22 15:52:25 +02:00
Aurélien Hamy
9a71d22a3c
Feature: Improve responsiveness
This is an improvement over #107, to make the application entirely responsive (up t a certain point, but which should not be encountered even on mobile).

Most changes are either very small or only permit a seamless compatibility with low-width displays; the three only "big" changes happening are:
- under 800 pixels wide, the bottom playing bar elements see their relative width change a bit, to allow give enough space for the song name and player control, without having a big blank space on the right
- under 950 pixels wide, the queue tracks list has less margin, to allow to fit way more of the song names
- under 750 pixels wide, the current song's cover and name is hidden from the left of the queue tracks list: this permits to continue fitting the content, and this information is redundant anyway as it is show on the bottom playing bar already
2025-05-21 22:26:20 +02:00
josselinonduty
088833f749
Deezer is not working properly on my Linux Smartphone
Fixes #104
2025-05-22 04:09:47 +09:00
josselinonduty
a173bd7f98
Merge pull request #119 from aunetx/josselinonduty/issue113
Feature: Support Snap
2025-05-22 02:36:24 +09:00
josselinonduty
cfcfb3389d
chore: fix package format in README
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-05-21 17:58:50 +09:00
josselinonduty
1f44368fcf
fix: remove unecessary plugs from snap config 2025-05-21 17:50:35 +09:00
josselinonduty
2cb5be87cb
feat: add build targets for snap; update snap artifact; update README. Fix #113 2025-05-21 15:36:38 +09:00
Cezar Lungu
f8c1544f66
Merge pull request #110 from aunetx/josselinonduty/issue109
Enhancement: update deps
2025-05-20 18:34:13 +02:00
Aurélien Hamy
2f0700674e
Merge pull request #118 from aunetx/remove-funding
Delete .github/FUNDING.yml
2025-05-20 10:53:19 +02:00
Aurélien Hamy
f1f8875e48
Delete .github/FUNDING.yml
Not really my repo anymore :)
2025-05-20 10:42:41 +02:00
josselinonduty
311631902b
fix: revert default kernel to 6.1 and enable privacy by default 2025-05-20 11:43:23 +09:00
josselinonduty
84fcee0eac
chore: fix broken links in README 2025-05-20 11:41:15 +09:00
Flatpak External Data Checker
e8fddae75a deezer: Update DeezerDesktopSetup_7.0.70.exe 2025-05-19 01:39:08 +00:00
josselinonduty
7e4c82a817
Enhancement: update deps; housekeeping
Fixes #109
2025-05-14 17:36:44 +09:00
josselinonduty
68a8c7bebb
Merge pull request #112 from aunetx/update-ae467a5
deezer: Update DeezerDesktopSetup_7.0.60.exe
2025-05-14 14:37:20 +09:00
Flatpak External Data Checker
74383173c1 deezer: Update DeezerDesktopSetup_7.0.60.exe 2025-04-28 01:26:06 +00:00
josselinonduty
b367604028
chore: update node version to 22 in CONTRIBUTING 2025-04-21 00:38:31 +09:00
josselinonduty
713bfb559b
chore: update node version to 22 in workflows 2025-04-21 00:25:46 +09:00
josselinonduty
b199dead1e
chore: add Prettier configuration and update prettier binary 2025-04-21 00:24:19 +09:00
josselinonduty
d12c45308d
chore: update @electron/asar to latest 2025-04-20 23:03:33 +09:00
josselinonduty
bd1afe3cfa
chore: move hardcoded node packages from Makefile to package.json 2025-04-20 23:01:41 +09:00
josselinonduty
3417a68f8f
chore: update desktop entry and sync config with file 2025-04-20 18:30:56 +09:00
josselinonduty
105a00f5b5
chore: update electron-builder version (latest); adjust desktop entry config 2025-04-20 13:24:42 +09:00
josselinonduty
845a09358d
chore: update electron to latest and update electron-builder (behind latest) 2025-04-20 11:55:43 +09:00
josselinonduty
b58911f9f7
Merge pull request #108 from aunetx/update-9d92dee
deezer: Update DeezerDesktopSetup_7.0.50.exe
2025-04-17 21:54:07 +09:00
josselinonduty
5d3ae96a75
Merge pull request #107 from aunetx/josselinonduty/issue105
Feature Request: Remove the minimum Window size requirements.
2025-04-15 03:36:58 +09:00
Flatpak External Data Checker
760fa0f756 deezer: Update DeezerDesktopSetup_7.0.50.exe 2025-04-14 01:24:53 +00:00
josselinonduty
74e8ff28b8
fix: rewrite patch to ensure hunk gets applied 2025-04-12 01:10:28 +09:00
josselinonduty
836419dd02
chore(Makefile): add patch to patch list in makefile 2025-04-12 01:00:23 +09:00
josselinonduty
51e9a2608f
Feature Request: Remove the minimum Window size requirements.
Fixes #105
2025-04-12 00:55:20 +09:00
Aurélien Hamy
97a94348de
Merge pull request #106 from aunetx/update-5c41466
deezer: Update DeezerDesktopSetup_7.0.40.exe
2025-04-07 17:28:41 +02:00
Flatpak External Data Checker
e47eeb980b deezer: Update DeezerDesktopSetup_7.0.40.exe 2025-04-07 01:23:38 +00:00
Aurélien Hamy
3f4767f848
Merge pull request #103 from aunetx/update-1387661
deezer: Update DeezerDesktopSetup_7.0.31.exe
2025-03-17 10:59:02 +01:00
Flatpak External Data Checker
81d6bb7c3b deezer: Update DeezerDesktopSetup_7.0.31.exe 2025-03-17 01:21:43 +00:00
josselinonduty
1e54f060ea
Merge pull request #101 from aunetx/update-763ce1c
deezer: Update DeezerDesktopSetup_7.0.10.exe
2025-03-07 23:44:09 +09:00
github-actions[bot]
da79ac3131
deezer: Update DeezerDesktopSetup_7.0.10.exe 2025-03-07 23:35:20 +09:00
Cezar Lungu
e5cd64a9f3
Merge pull request #95 from josselinonduty/feat/deezer-v7
Release: Deezer v7
2025-03-05 18:41:03 +00:00
josselinonduty
5bd7ead2ca
chore: remove .vscode from ignore files while creating a patch 2025-03-02 15:13:36 +09:00
Cezar Lungu
849f5eb11b
Update 09-log-level-environment-variable.patch 2025-03-01 17:53:00 +00:00
Cezar Lungu
49727f17de
Update 05-remove-os-information.patch
Use the LTS Kernel version - 6.1.0
2025-03-01 17:52:06 +00:00
josselinonduty
96684b3567
chore(CONTRIBUTING): update info to include additional metadata 2025-02-08 23:48:47 +01:00
josselinonduty
bc584343c8
fix(patch): add credits to original author; add default log level based on remove isDev patch 2025-02-01 19:10:56 +01:00
josselinonduty
3ee1a84cd1
chore(README): update npm requirement to allow using yarn as an alternative 2025-02-01 18:33:19 +01:00
josselinonduty
22dcfe4c54
chore: update makefile and docs to allow using npm or yarn independently 2025-02-01 18:31:37 +01:00
josselinonduty
10aa5f2e66
chore(README): update discord rpc arg and clarify faq 2025-02-01 18:31:29 +01:00
josselinonduty
b745827f79
feat: provide duration and url information to mpris and
discord rpc; update rich-presence-builder; make discord rpc opt-in
2025-02-01 17:39:26 +01:00
josselinonduty
0c24e392a4
feat(patch): add log level environment variable (w/ docs); change fallback release to 1.0.0 2025-02-01 12:49:09 +01:00
josselinonduty
48f7c30faf
chore: bump deezer to v7.0.10 2025-02-01 01:27:44 +01:00
josselinonduty
ad63745c28
docs: add contributing guidelines and refactor README 2025-02-01 01:12:42 +01:00
josselinonduty
9d47839fbd
chore: add snap x64 and arm64 commands/targets 2025-02-01 01:12:03 +01:00
josselinonduty
d537f3a0b3
chore(README): improve formatting 2025-01-31 23:30:03 +01:00
josselinonduty
0ed3dd5721
chore(makefile): add patch creation targets 2025-01-31 22:20:09 +01:00
josselinonduty
dd86b22625
chore(makefile): fix missing quotes 2025-01-31 19:04:29 +01:00
josselinonduty
97445fe29e
feat(patch): add discord rich presence with cli argument to disable 2025-01-31 19:01:59 +01:00
josselinonduty
15b9b5af42
chore(makefile): update patch list 2025-01-31 13:11:46 +01:00
josselinonduty
598fe85856
chore(patch): include order of generation in patch name to avoid conflicts when applying 2025-01-31 12:22:40 +01:00
josselinonduty
aa3896377b
fix(patch): update dependencies for better management of MPRIS metadata 2025-01-31 12:05:46 +01:00
josselinonduty
09a385ba10
fix: ensure os release is a valid semver format 2025-01-24 16:06:47 +01:00
josselinonduty
95aa2e7fb8
feat(patch): remove os information to preserve privacy 2025-01-20 19:22:10 +01:00
josselinonduty
02f645c28f
chore: update deprecated package asar to @electron/asar
Co-Authored-By: Meincrakker <50109822+Meincrakker@users.noreply.github.com>
2025-01-20 17:20:51 +01:00
josselinonduty
2504c7cacd
fix(patch): update patch for mpris w/ node-gyp compilation error remaining 2025-01-20 17:00:47 +01:00
josselinonduty
0aa8632373
chore(Makefile): update patch comments 2025-01-20 01:26:28 +01:00
josselinonduty
638638c5cb
fix(patch): remove patch for mpris thanks to electron/project update 2025-01-20 00:52:17 +01:00
josselinonduty
7ca5b2b5d0
fix(patch): disable auto update - useless for this unofficial port 2025-01-20 00:51:05 +01:00
josselinonduty
9d6ad6fd88
fix(patch): update closing behaviour w/ option 2025-01-19 23:28:53 +01:00
josselinonduty
a652d438e7
fix(patch): remove isDev usage thanks to electron update 2025-01-19 23:23:05 +01:00
josselinonduty
8ff9dc5add
fix(patch): update avoid default mimetype 2025-01-19 23:20:39 +01:00
josselinonduty
719197ccbc
fix(patch): update start hidden in tray 2025-01-19 23:11:45 +01:00
josselinonduty
b4699a0df3
fix: update electron version 2025-01-19 21:37:17 +01:00
josselinonduty
987db981bf
fix: patches contain invalid/unappliable hunks. Skipping... 2025-01-19 20:43:47 +01:00
josselinonduty
cf0512f363
feat: update url and sha256 to v7.0.1 2025-01-19 20:22:17 +01:00
Aurélien Hamy
c65da965f2
Merge pull request #64 from randshell/actions-update
Update Github Actions to latest version
2024-06-23 20:09:26 +02:00
Aurélien Hamy
755bd408a4
Merge pull request #63 from randshell/update-checker
Add automatic update checker
2024-06-23 20:08:43 +02:00
Aurélien Hamy
19f4f96c03
Merge pull request #61 from keops-dev/master
MPRIS management update
2024-06-23 19:52:11 +02:00
Aurélien Hamy
3fdb1a32e9
Update Makefile
Just changed the description to match the rest of the makefile
2024-06-23 19:48:58 +02:00
Cezar Lungu
aafecf10b5
Update Github Actions to latest version
This also updates Node to v20
2024-06-22 18:27:48 +02:00
Cezar Lungu
6d5479cfa7
Update actions/checkout to v4 2024-06-22 18:24:38 +02:00
Cezar Lungu
c2cd7e5b6a
Simplify sha256sum check 2024-06-22 17:39:49 +02:00
Cezar Lungu
e6bb283da2
Remove -c option from wget
Compared to deezer.com, e-cdn-content.dzcdn.net does not support resuming a download
2024-06-22 17:38:06 +02:00
Cezar Lungu
11c0432a26
Fix deezer-setup path for sha256sum 2024-06-22 17:18:17 +02:00
Cezar Lungu
8fc400e267
Add SHA256 verification
It is compared against the FlaHub's bot calculated SHA256
2024-06-22 17:00:03 +02:00
Cezar Lungu
9d4fba78a8
Add automatic update checking
This soultion uses the Flathub Bot since it is easy to implement and works well for this use case. A GitHub Action is set to make it run once a week.
Makefile was updated as well to reflect the changes.
2024-06-22 16:58:44 +02:00
Keops
4206090408 MPRIS management added.
https://specifications.freedesktop.org/mpris-spec/latest/
2024-05-11 17:40:09 +02:00
Aurélien Hamy
e3dcd9e252
Version 6.0.110-1 2024-04-16 11:11:43 +02:00
Aurélien Hamy
f8c2b9eba0
Update to 6.0.60 2024-02-05 13:06:05 +01:00
Aurélien Hamy
64bcd449bb
Version 6.0.30 2023-12-27 17:12:09 +01:00
Aurélien Hamy
5382206384
Merge pull request #50 from MiMillieuh/master
Update to version 6.0.10 and new icon
2023-11-09 15:45:36 +01:00
MiMillieuh
f975c3434a
Update tray icon to new design 2023-11-09 15:31:01 +01:00
MiMillieuh
e57e41644e
Update icons to the new design 2023-11-09 15:20:04 +01:00
MiMillieuh
e8c86c7fa2
Update to version 5.30.660 and new icon
Deezer has changed their brand, this will help to catch up
2023-11-09 15:11:44 +01:00
Aurélien Hamy
75b0278aa2
Update readme, and version 5.30.660 2023-09-25 12:42:41 +02:00
41 changed files with 1835 additions and 317 deletions

2
.github/FUNDING.yml vendored
View File

@ -1,2 +0,0 @@
github: aunetx
ko_fi: aunetx

120
.github/ISSUE_TEMPLATE/bug.yml vendored Normal file
View 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

View File

@ -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

View File

@ -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
View 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
View File

@ -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
View File

@ -0,0 +1,8 @@
{
"semi": true,
"singleQuote": false,
"trailingComma": "es5",
"tabWidth": 2,
"useTabs": false,
"arrowParens": "always"
}

153
CONTRIBUTING.md Normal file
View 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
View File

@ -1,86 +1,129 @@
# Maintainer: Aurélien Hamy <aunetx@yandex.com>
APPNAME = dev.aunetx.deezer
PKGVER = 5.30.650
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
View File

@ -1,104 +1,204 @@
# Deezer for linux
**NOTICE:** existing flatpak users NEED to migrate the the flathub repository as soon as possible, as I will delete the flatpak repository from here (it is more than 2Gb in size). In order to do so, simply:
```sh
flatpak uninstall dev.aunetx.deezer
flatpak remote-delete deezer-linux
flatpak install flathub dev.aunetx.deezer
```
---
[![Build](https://github.com/aunetx/deezer-linux/actions/workflows/build.yml/badge.svg)](https://github.com/aunetx/deezer-linux/actions/workflows/build.yml)
[![GitHub release (latest by date)](https://img.shields.io/github/v/release/aunetx/deezer-linux)](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). For the moment, it is still possible to use this github repo as a flatpak repository BUT it will not be the case anymore very soon. **Existing users 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
# or
make build_rpm
# or
make build_snap
# or
make build_7z
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 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 will try to talk to Deezer to ask them if I can upload this on Flathub, but even if they say yes (which is nearly impossible), 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)

View File

@ -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
View 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]+)"
}
}
]
}
]
}

View File

@ -1,16 +1,16 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" version="1">
<rect style="opacity:0.2" width="56" height="59" x="-61" y="-62" rx="2.8" ry="2.95" transform="matrix(0,-1,-1,0,0,0)"/>
<rect style="fill:#3f3f3f" width="56" height="59" x="-60" y="-62" rx="2.8" ry="2.95" transform="matrix(0,-1,-1,0,0,0)"/>
<path style="fill:#16be71" d="M 57,15 H 47 v 6 h 10 z"/>
<path style="fill:#05ac9c" d="M 57,24 H 47 v 6 h 10 z"/>
<path style="fill:#026ed2" d="M 57,33 H 47 v 6 h 10 z"/>
<path style="fill:#f6a500" d="M 18,42 H 8 v 6 h 10 z"/>
<path style="fill:#e74b32" d="M 31,42 H 21 v 6 h 10 z"/>
<path style="fill:#3446d9" d="M 57,42 H 47 v 6 h 10 z"/>
<path style="fill:#9e2bbb" d="M 44,39 H 34 v -6 h 10 z"/>
<path style="fill:#b72b68" d="M 44,48 H 34 v -6 h 10 z"/>
<path style="fill:#f57524" d="M 31,33 H 21 v 6 h 10 z"/>
<path style="fill:#fabc45" d="M 31,24 H 21 v 6 h 10 z"/>
<path style="opacity:0.2" d="M 47 21 L 47 22 L 57 22 L 57 21 L 47 21 z M 21 30 L 21 31 L 31 31 L 31 30 L 21 30 z M 47 30 L 47 31 L 57 31 L 57 30 L 47 30 z M 21 39 L 21 40 L 31 40 L 31 39 L 21 39 z M 34 39 L 34 40 L 44 40 L 44 39 L 34 39 z M 47 39 L 47 40 L 57 40 L 57 39 L 47 39 z M 8 48 L 8 49 L 18 49 L 18 48 L 8 48 z M 21 48 L 21 49 L 31 49 L 31 48 L 21 48 z M 34 48 L 34 49 L 44 49 L 44 48 L 34 48 z M 47 48 L 47 49 L 57 49 L 57 48 L 47 48 z"/>
<path style="fill:#ffffff;opacity:0.1" d="M 5.9492188 4 C 4.3149189 4 3 5.2495813 3 6.8007812 L 3 7.8007812 C 3 6.2495813 4.3149189 5 5.9492188 5 L 59.050781 5 C 60.685081 5 62 6.2495813 62 7.8007812 L 62 6.8007812 C 62 5.2495813 60.685081 4 59.050781 4 L 5.9492188 4 z"/>
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Calque_1" data-name="Calque 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<defs>
<style>
.cls-1 {
fill: #a238ff;
}
.cls-1, .cls-2 {
stroke-width: 0px;
}
</style>
</defs>
<rect class="cls-1" x="52" y="65" width="425" height="406" rx="12" ry="12"/>
<path class="cls-2" d="m445.21,0H66.79C30.06,0,0,30.06,0,66.79v378.42c0,2.45.13,4.86.4,7.24,3.63,33.36,32.11,59.55,66.39,59.55h378.42c35.48,0,64.73-28.04,66.68-63.06.08-1.23.11-2.48.11-3.73V66.79c0-36.73-30.06-66.79-66.79-66.79Zm-41.51,247.11c-4.04.15-4.43-4.47-5.41-7.53-1.74-5.39-2.61-10.99-3.09-16.64.02-12.14-.79-23.32,2.08-34.28.53-2.04,1.06-4.1,1.8-6.07.91-2.41,1.38-5.79,4.73-5.56,3.01.2,3.92,3.37,4.78,5.82,3.27,9.33,3.64,19.18,3.63,28.84,0,9.11.12,18.45-2.88,27.32-1.1,3.26-1.49,7.94-5.64,8.1Zm-287.6-21.06c-1,6.36-1.44,11.89-3.81,16.93-.86,1.83-1.64,4.24-4.28,4.21-2.83-.04-3.75-2.44-4.62-4.55-1.97-4.81-2.62-9.91-3.07-15.05-1.29-14.72-1.49-29.38,2.69-43.76.43-1.51,1.02-3.04,1.86-4.35,2.28-3.54,4.51-3.41,6.62.54,3.15,5.9,3.8,12.48,4.65,18.98,1.18,9.02,1.17,18.04-.04,27.05Zm247.76,61.72c-1.26,7.78-2.24,14.67-3.51,21.5-2.11,11.33-4.69,22.57-10.57,32.66-5.72,9.82-11.7,9.73-17.65-.06-3.74-6.15-5.58-13.03-7.34-19.92-.78-3.06-1.1-6.25-2.96-9.72-3.1,6.87-1.92,13.84-2.95,20.42-2.44,15.57-3.82,31.34-9.58,46.19-1.72,4.44-3.32,10.22-8.7,10.37-5.96.16-7.36-6.05-8.97-10.6-2.34-6.62-3.99-13.48-5.96-20.35-2.71,1.2-1.83,3.44-2.05,5.2-2.37,19.26-5.89,38.22-14.73,55.75-2.76,5.48-6.04,11.46-12.79,11.53-7.26.07-10.7-6.11-13.61-11.98-4.28-8.62-7.36-17.67-9.48-27.05-3.02-11.31-3.74-22.13-5.57-33.29-3.41,1.96-2.87,5.14-3.48,7.59-1.64,6.56-3.36,13.07-6.77,18.95-3.55,6.14-7.9,6.26-11.71.26-5.15-8.12-6.86-17.44-8.6-26.67-2.63-13.94-4.46-28-5.39-42.16-.06-1.02.02-2.21-2.02-2.8-2.37,4.03-2.43,8.89-3.79,13.28-2,6.48-4.17,12.84-8.42,18.23-4.43,5.62-9.29,5.66-13.49-.17-6.8-9.45-9.37-20.58-11.64-31.71-1.42-6.94-2.27-13.99-3.39-20.99-.22-1.35-.05-2.9-2.16-3.78-1.28,2.84-2.42,5.76-3.89,8.52-2.92,5.47-6.87,5.62-9.78.14-4.47-8.43-5.99-17.8-7.35-27.07-4.21-28.58-4.45-57.23-1.54-85.98,1.22-12.04,2.88-23.94,6.79-35.39,1.27-3.69,2.1-9.07,6.98-8.97,4.67.1,5.69,5.32,7.06,9.04,1.67,4.56,2.8,9.31,4.78,14,3-5,2.84-10.74,4.38-15.99,2.3-7.85,4.46-15.72,8.98-22.63,4.67-7.15,10.31-7.28,15.11-.16,7.03,10.41,9.17,22.59,11.58,34.59,1.46,7.25,2.5,14.58,3.86,22.6,2.94-3.62,2.54-7.45,3.21-10.91,1.59-8.18,3.05-16.43,6.73-23.98,1.66-3.39,3.23-7.97,7.75-7.92,4.75.06,6.5,4.66,7.98,8.38,5.43,13.59,7.98,27.92,9.86,42.35,1.03,7.9,1.58,15.87,2.4,23.8.15,1.52-.19,3.26,1.89,4.64,2.07-5.87,4.01-11.61,6.11-17.3,1.59-4.34,3.65-8.48,6.25-12.31,6.01-8.8,14.05-9.03,20.23-.31,5.3,7.47,8.14,16.11,10.69,24.83.57,1.94.34,4.29,2.84,6.11.93-8.69,1.68-17.01,2.73-25.3,2.01-15.82,4.4-31.59,10.5-46.49,1.51-3.7,2.83-8.55,7.72-8.47,4.97.09,6.57,4.96,8.26,8.79,3.61,8.17,5.45,16.87,6.89,25.65.39,2.37.49,4.82,1.91,6.99,2.21-1.24,1.81-3.17,2.04-4.86,1.96-14.41,4.31-28.74,9.58-42.4,1.28-3.33,2.92-6.49,5.15-9.28,4.8-6,9.83-5.88,14.19.51,5.09,7.44,7.63,15.98,9.79,24.61,1.22,4.88,2.16,9.83,4.32,14.77,1.47-4.81,2.73-9.68,4.48-14.38,1.38-3.69,2.25-8.97,7.12-8.85,4.75.12,5.7,5.39,7.01,9.1,3.85,10.93,5.6,22.37,6.71,33.83,1.93,19.97,2.75,40.01,1.15,60.08-1.38,17.31-2.6,34.65-8.85,51.11-.31.83-.6,1.7-1.06,2.44-1.3,2.08-2.38,4.68-5.4,4.48-2.6-.17-3.72-2.39-4.95-4.39-1.53-2.48-1.61-5.75-4.91-8.7Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 512 B

After

Width:  |  Height:  |  Size: 437 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 651 B

After

Width:  |  Height:  |  Size: 876 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 896 B

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 712 B

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -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
View File

@ -0,0 +1,10 @@
{
"dependencies": {
"@electron/asar": "3.4.1",
"prettier": "3.5.3"
},
"scripts": {
"asar": "asar",
"prettier": "prettier"
}
}

View 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

View File

@ -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
View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View File

@ -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

View File

@ -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",

View File

@ -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

View File

@ -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();
}