Merge pull request #95 from josselinonduty/feat/deezer-v7
Release: Deezer v7
This commit is contained in:
commit
e5cd64a9f3
|
@ -3,6 +3,7 @@ flatpak
|
|||
source
|
||||
app
|
||||
package-lock.json
|
||||
yarn.lock
|
||||
artifacts
|
||||
package.json
|
||||
.vscode/launch.json
|
||||
|
|
|
@ -0,0 +1,144 @@
|
|||
# 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 (20 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, commit your changes, and then generate the patch:
|
||||
|
||||
```sh
|
||||
make patch-gen
|
||||
```
|
||||
|
||||
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!
|
93
Makefile
93
Makefile
|
@ -5,89 +5,118 @@ 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_ADD_CMD) @electron/asar@3.2.18 --engine-strict
|
||||
@$(PACKAGE_MANAGER) $(PACKAGE_MANAGER_ADD_CMD) prettier@2.8.8
|
||||
|
||||
prepare: clean install_build_deps
|
||||
@mkdir -p source
|
||||
@mkdir -p $(SOURCE_DIR)
|
||||
|
||||
@echo "Download installer"
|
||||
@wget -nv $(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/deezer-setup-$(PKGVER).exe" | sha256sum -c --status || exit 1
|
||||
@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
|
||||
@node_modules/@electron/asar/bin/asar.js 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"
|
||||
@node_modules/prettier/bin-prettier.js --write "$(APP_DIR)/build/*.js"
|
||||
|
||||
@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)"
|
||||
@echo "Add a better management of MPRIS (https://github.com/aunetx/deezer-linux/pull/61)"
|
||||
$(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 Discord Rich Presence (https://github.com/aunetx/deezer-linux/pull/82)"
|
||||
@echo "08 - Add option to disable Discord Rich Presence (https://github.com/aunetx/deezer-linux/pull/95)"
|
||||
@echo "09 - Add environment variable to change log level (https://github.com/aunetx/deezer-linux/pull/95)"
|
||||
@echo "10 - Add track duration and url, various fixes (https://github.com/aunetx/deezer-linux/pull/95)"
|
||||
$(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"
|
||||
@npm i
|
||||
@$(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:
|
||||
@cd $(APP_DIR) && git format-patch -1 HEAD --stdout > ../patches/$(shell date +%y%m%d-%s).patch
|
||||
|
||||
#! UTILS
|
||||
|
||||
|
@ -107,4 +136,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.json
|
||||
|
|
184
README.md
184
README.md
|
@ -1,104 +1,170 @@
|
|||
# Deezer for linux
|
||||
|
||||
**NOTICE:** existing flatpak users NEED to migrate the the flathub repository as soon as possible, as I deleted the flatpak repository from here (it was more than 2Gb in size). In order to do so (normally without losing any data), simply:
|
||||
|
||||
```sh
|
||||
flatpak uninstall dev.aunetx.deezer
|
||||
flatpak remote-delete deezer-linux
|
||||
flatpak install flathub dev.aunetx.deezer
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
[](https://github.com/aunetx/deezer-linux/actions/workflows/build.yml)
|
||||
[](https://github.com/aunetx/deezer-linux/releases/latest)
|
||||
|
||||
This repo is an UNOFFICIAL linux port of the official windows-only Deezer app. Being based on the native Windows app, it allows downloading your songs to listen to them offline!
|
||||
This repo is an UNOFFICIAL linux port ([legal notice](#legal-disclaimer)) of the official windows-only Deezer app. Being based on the native Windows app, it allows downloading your songs to listen to them offline!
|
||||
|
||||
It packages the app in a number of formats:
|
||||
|
||||
- Flatpak, [available on flathub](https://flathub.org/apps/dev.aunetx.deezer)
|
||||
- Snap (not tested yet)
|
||||
- AppImage (can't automatically login without desktop integration)
|
||||
- AppImage
|
||||
- `rpm` (Fedora, Red Hat, CentOS, openSUSE, ...)
|
||||
- `deb` (Debian, Ubuntu, Pop!_OS, elementary OS, ...)
|
||||
- `7z` to install anywhere else
|
||||
- `deb` (Debian, Ubuntu, Pop!\_OS, elementary OS, ...)
|
||||
- `tar.xz` to install anywhere else
|
||||
|
||||
It was done thanks to the hard work of [SibrenVasse](https://github.com/SibrenVasse), who [packaged the app for the AUR](https://github.com/SibrenVasse/deezer).
|
||||
Special thanks to [SibrenVasse](https://github.com/SibrenVasse) who made the [original AUR package](https://github.com/SibrenVasse/deezer) for this app!
|
||||
|
||||
## Installation
|
||||
|
||||
You can find all of the packages on [the release page](https://github.com/aunetx/deezer-linux/releases/latest).
|
||||
|
||||
To install the flatpak version, you can simply go to https://flathub.org/apps/dev.aunetx.deezer (or use your favorite flatpak package manager). **Old users using this repo as a flatpak repository should migrate as soon as they can toward Flathub.**
|
||||
To install the flatpak version, you can simply go to https://flathub.org/apps/dev.aunetx.deezer (or use your favorite flatpak package manager).
|
||||
|
||||
> [!Important]
|
||||
> Old flatpak users must migrate to the flathub repository as soon as possible, as the flatpak repository was deleted from this repo (it weighed more that 2GB). In order to do so, you can use the following commands:
|
||||
>
|
||||
> ```sh
|
||||
> flatpak uninstall dev.aunetx.deezer
|
||||
> flatpak remote-delete deezer-linux
|
||||
> flatpak install flathub dev.aunetx.deezer
|
||||
> ```
|
||||
>
|
||||
> You _should_ not lose any data by doing this.
|
||||
|
||||
Other packages can be installed from you package manager, either by clicking on them or from the command-line.
|
||||
|
||||
Please note that even though it is automatically generated, the snapcraft package has never been tested; Please tell me if there is any issue with it!
|
||||
## Usage
|
||||
|
||||
## From source
|
||||
| Option | Description |
|
||||
| ----------------------- | ----------------------------------------------------------------------------------------------- |
|
||||
| `--start-in-tray` | Start the app in the tray (see [patch](./patches/01-start-hidden-in-tray.patch)) |
|
||||
| `--disable-systray` | Quit the app when the window is closed (see [patch](./patches/03-quit.patch)) |
|
||||
| `--disable-features` | Disable some features (see [patch](./patches/06-better-management-of-MPRIS.patch)) |
|
||||
| `--enable-discord-rpc` | Enable Discord RPC integration (see [patch](./patches/08-discord-rich-presence-disable.patch)) |
|
||||
|
||||
You will probably need to install some things in order to generate the packages from source:
|
||||
| Environment variable | Options | Description |
|
||||
| -------------------- | -------------------------------------------------- | ---------------------------------------------------------------------------------- |
|
||||
| `LOG_LEVEL` | `silly`,`debug`,`verbose`,`info`,`warning`,`error` | Set the log level (see [patch](./patches/09-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 (see [FAQ](#faq))
|
||||
|
||||
> [!NOTE]
|
||||
> Please open an issue if you want a specific target to be added.
|
||||
|
||||
### Requirements
|
||||
|
||||
- Node.js (20 recommended)
|
||||
- npm (or yarn, see [FAQ](#i-want-to-use-yarn-instead-of-npm-is-it-possible))
|
||||
- 7z (try installing `p7zip` and `p7zip-full`)
|
||||
- make
|
||||
- wget
|
||||
|
||||
### Setup
|
||||
|
||||
To build the project, you need to install the dependencies first:
|
||||
|
||||
```sh
|
||||
make install_deps
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> You don't need to use `make install_deps` everytime you start a build, however you need to call it at least once. Everything should be generated in `artifacts/{arch}`.
|
||||
|
||||
### AppImage
|
||||
|
||||
To build the AppImage image from source, use:
|
||||
To build the AppImage x64 image, you can use:
|
||||
|
||||
```sh
|
||||
make install_deps
|
||||
make build_appimage
|
||||
make build_appimage_x64
|
||||
```
|
||||
|
||||
And the image should be in the `artifacts/x64` folder.
|
||||
Artifacts will be generated in `artifacts/x64`.
|
||||
|
||||
Because of the way AppImage works, except if you use `appimaged`, you will not be able to login from the browser; then you are not redirected to the application.
|
||||
To make it work, you must first open a instance of the app, and copy the link shown in `https://www.deezer.com/desktop/login/electron/callback`. In a terminal
|
||||
(where the .AppImage file is), use:
|
||||
> [!WARNING]
|
||||
> You _may_ encounter a problem with the AppImage, where you are not able to login. This is a known issue, and is due to the way AppImage works. In this case, you can copy the link shown in `https://www.deezer.com/desktop/login/electron/callback`.
|
||||
>
|
||||
> In the same directory as the AppImage file, use:
|
||||
>
|
||||
> ```sh
|
||||
> deezer-desktop-*.AppImage deezer://autolog/...
|
||||
> ```
|
||||
>
|
||||
> You should now be logged in.
|
||||
>
|
||||
> For more information, see [issue #29](https://github.com/aunetx/deezer-linux/issues/29)
|
||||
|
||||
> [!Caution]
|
||||
> If you want to open an issue about this, please do not share your own `deezer://autolog/...` link, as it would allow anyone to log into your account without your consent.
|
||||
|
||||
### rpm / deb / tar.xz
|
||||
|
||||
To generate the `rpm`/`deb`/`tar.xz` packages, you can use:
|
||||
|
||||
```sh
|
||||
deezer-desktop-*.AppImage deezer://autolog/...
|
||||
make build_{target}_{arch}
|
||||
```
|
||||
|
||||
And you should be automatically logged in.
|
||||
|
||||
**IMPORTANT:** If you want to open an issue about this, please do NOT share your own `deezer://autolog/...` link, as it would permit anybody to log into your account without the need for a password!
|
||||
|
||||
See [this issue](https://github.com/aunetx/deezer-linux/issues/29) for more informations about login in AppImage.
|
||||
|
||||
## rpm / deb / snap / 7z
|
||||
|
||||
To generate the `rpm`/`deb`/`snap`/`7z` packages, you can use:
|
||||
Example:
|
||||
|
||||
```sh
|
||||
# prepare the build
|
||||
make install_deps
|
||||
|
||||
# and then
|
||||
|
||||
make build_deb_x64
|
||||
# or
|
||||
make build_rpm_x64
|
||||
# or
|
||||
make build_snap_x64
|
||||
# or
|
||||
make build_tar.xz_x64
|
||||
make build_rpm_arm64
|
||||
```
|
||||
|
||||
Note that you don't need to use `make install_deps` everytime you start a build, but you need to call it at least once. Everything should be generated in `artifacts/x64`.
|
||||
Artifacts will be generated in `artifacts/{arch}`.
|
||||
|
||||
If you generate the 7z package, you can run it directly by extracting to a directory, and calling `./deezer-desktop` from there.
|
||||
> [!WARNING]
|
||||
> Building can take a long time. Be patient.
|
||||
|
||||
## **IMPORTANT NOTICE**
|
||||
If you generate the `tar.xz` package, you can run it directly by extracting to a directory, and calling `./deezer-desktop` from there.
|
||||
|
||||
This work is UNOFFICIAL, and Deezer does not officially support Linux yet.
|
||||
## Development
|
||||
|
||||
Installing/using this is consequently probably outside of the scope of the Deezer EULA, and I am not responsible for your usage of this.
|
||||
If you want to contribute to this project, please read the [contribution guidelines](CONTRIBUTING.md) file.
|
||||
|
||||
I ***tried*** to talk to Deezer to ask them if I am authorized to upload this on Flathub, but when they answer, even if they say yes, this work is still unofficial.
|
||||
## 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 can't I get the snap package?
|
||||
|
||||
Please see [this issue](https://github.com/babluboy/bookworm/issues/178) or [this issue](https://github.com/babluboy/nutty/issues/68). Prefer using Flatpak or AppImage.
|
||||
|
||||
### 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
|
||||
```
|
||||
|
||||
## **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)
|
||||
|
|
|
@ -6,8 +6,8 @@
|
|||
"sources": [
|
||||
{
|
||||
"type": "archive",
|
||||
"url": "https://e-cdn-content.dzcdn.net/builds/deezer-desktop/8cF2rAuKxLcU1oMDmCYm8Uiqe19Ql0HTySLssdzLkQ9ZWHuDTp2JBtQOvdrFzWPA/win32/x86/6.0.150/DeezerDesktopSetup_6.0.150.exe",
|
||||
"sha256": "0ecf85dc7988bc1c26bf12f22b800eeb813b943b7453b8ac5fa9a103ccc075f5",
|
||||
"url": "https://e-cdn-content.dzcdn.net/builds/deezer-desktop/8cF2rAuKxLcU1oMDmCYm8Uiqe19Ql0HTySLssdzLkQ9ZWHuDTp2JBtQOvdrFzWPA/win32/x86/7.0.10/DeezerDesktopSetup_7.0.10.exe",
|
||||
"sha256": "8b1f2369f5d9513c2746bab037c6d913527780f98bca067ec7139dede40a5958",
|
||||
"only-arches": ["x86_64"],
|
||||
"dest": "archive",
|
||||
"x-checker-data": {
|
||||
|
|
|
@ -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": "^33.2.0",
|
||||
"electron-builder": "^23.0.3"
|
||||
},
|
||||
"build": {
|
||||
"files": [
|
||||
"**"
|
||||
],
|
||||
"files": ["**"],
|
||||
"directories": {
|
||||
"buildResources": "build",
|
||||
"output": "../artifacts/${arch}"
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
From 9c19490f706350a2ca8cceae7a998916d21de89b Mon Sep 17 00:00:00 2001
|
||||
From: josselinonduty <contact@josselinonduty.fr>
|
||||
Date: Sun, 19 Jan 2025 22:59:38 +0100
|
||||
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 | 11 +++++++----
|
||||
1 file changed, 7 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index c15e2c3..b883a28 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -3085,10 +3085,13 @@
|
||||
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();
|
||||
}
|
||||
--
|
||||
2.43.0
|
||||
|
|
@ -1,8 +1,17 @@
|
|||
From e45c184e8c23aa72f77767c09e6051363806b5f5 Mon Sep 17 00:00:00 2001
|
||||
From: josselinonduty <contact@josselinonduty.fr>
|
||||
Date: Sun, 19 Jan 2025 23:18:25 +0100
|
||||
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 b883a28..60117e3 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -2897,12 +2897,7 @@
|
||||
@@ -2854,12 +2854,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
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
From ef715c38d754bbed026a4e6c3e9cae0180eeeb4b Mon Sep 17 00:00:00 2001
|
||||
From: josselinonduty <contact@josselinonduty.fr>
|
||||
Date: Sun, 19 Jan 2025 23:27:32 +0100
|
||||
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 60117e3..9ea7c18 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -3037,7 +3037,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
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
From 864e07d4bac769cbc077a4a3d50a431f2158080c Mon Sep 17 00:00:00 2001
|
||||
From: josselinonduty <contact@josselinonduty.fr>
|
||||
Date: Mon, 20 Jan 2025 00:46:23 +0100
|
||||
Subject: [PATCH] fix: disable autoupdater for linux
|
||||
|
||||
---
|
||||
build/main.js | 5 ++---
|
||||
1 file changed, 2 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index 9ea7c18..10a80fa 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -2322,9 +2322,8 @@
|
||||
}
|
||||
}
|
||||
init() {
|
||||
- this.arch &&
|
||||
- ((isPlatform(PLATFORM.LINUX) && !process.env.APPIMAGE) ||
|
||||
- isWindowsStore() ||
|
||||
+ this.arch && !isPlatform(PLATFORM.LINUX) && (
|
||||
+ isWindowsStore() ||
|
||||
"yes" === process.env.DZ_DISABLE_UPDATE ||
|
||||
((external_electron_updater_namespaceObject.autoUpdater.autoDownload =
|
||||
!0),
|
||||
--
|
||||
2.43.0
|
||||
|
|
@ -0,0 +1,111 @@
|
|||
From 08ea86075592efe9c02c4beb7cbdfc6935ca0b1c Mon Sep 17 00:00:00 2001
|
||||
From: josselinonduty <contact@josselinonduty.fr>
|
||||
Date: Fri, 24 Jan 2025 16:03:43 +0100
|
||||
Subject: [PATCH] fix: ensure os release is valid
|
||||
|
||||
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 | 11 ++++++++++-
|
||||
build/preload.js | 10 +++++++++-
|
||||
build/renderer.js | 10 +++++++++-
|
||||
build/titlebar.js | 11 ++++++++++-
|
||||
4 files changed, 38 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index 10a80fa..9219f4f 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -5,7 +5,16 @@
|
||||
module.exports = require("macos-version");
|
||||
},
|
||||
857: (module) => {
|
||||
- module.exports = require("os");
|
||||
+ var __module_os = require("os");
|
||||
+ const release = __module_os.release();
|
||||
+ __module_os.release = () => {
|
||||
+ const matcher = /(\d+\.\d+\.\d+)\.*/
|
||||
+ var result = release.match(matcher);
|
||||
+ //if (result[1])
|
||||
+ // return result[1];
|
||||
+ return "6.1.0";
|
||||
+ }
|
||||
+ module.exports = __module_os;
|
||||
},
|
||||
},
|
||||
__webpack_module_cache__ = {};
|
||||
diff --git a/build/preload.js b/build/preload.js
|
||||
index 9716411..ec603d0 100644
|
||||
--- a/build/preload.js
|
||||
+++ b/build/preload.js
|
||||
@@ -5,7 +5,15 @@
|
||||
module.exports = require("macos-version");
|
||||
},
|
||||
857: (module) => {
|
||||
- module.exports = require("os");
|
||||
+ var __module_os = require("os");
|
||||
+ const release = __module_os.release();
|
||||
+ __module_os.release = () => {
|
||||
+ const matcher = /(\d+\.\d+\.\d+)\.*/;
|
||||
+ var result = release.match(matcher);
|
||||
+ //if (result[1]) return result[1];
|
||||
+ return "6.1.0";
|
||||
+ };
|
||||
+ module.exports = __module_os;
|
||||
},
|
||||
},
|
||||
__webpack_module_cache__ = {};
|
||||
diff --git a/build/renderer.js b/build/renderer.js
|
||||
index 7241bcb..fb02453 100644
|
||||
--- a/build/renderer.js
|
||||
+++ b/build/renderer.js
|
||||
@@ -5,7 +5,15 @@
|
||||
module.exports = require("macos-version");
|
||||
},
|
||||
857: (module) => {
|
||||
- module.exports = require("os");
|
||||
+ var __module_os = require("os");
|
||||
+ const release = __module_os.release();
|
||||
+ __module_os.release = () => {
|
||||
+ const matcher = /(\d+\.\d+\.\d+)\.*/;
|
||||
+ var result = release.match(matcher);
|
||||
+ //if (result[1]) return result[1];
|
||||
+ return "6.1.0";
|
||||
+ };
|
||||
+ module.exports = __module_os;
|
||||
},
|
||||
},
|
||||
__webpack_module_cache__ = {};
|
||||
diff --git a/build/titlebar.js b/build/titlebar.js
|
||||
index 65520fb..7919288 100644
|
||||
--- a/build/titlebar.js
|
||||
+++ b/build/titlebar.js
|
||||
@@ -5,7 +5,16 @@
|
||||
module.exports = require("macos-version");
|
||||
},
|
||||
857: (module) => {
|
||||
- module.exports = require("os");
|
||||
+ var __module_os = require("os");
|
||||
+ const release = __module_os.release();
|
||||
+ __module_os.release = () => {
|
||||
+ const matcher = /(\d+\.\d+\.\d+)\.*/
|
||||
+ var result = release.match(matcher);
|
||||
+ //if (result[1])
|
||||
+ // return result[1];
|
||||
+ return "6.1.0";
|
||||
+ }
|
||||
+ module.exports = __module_os;
|
||||
},
|
||||
},
|
||||
__webpack_module_cache__ = {};
|
||||
--
|
||||
2.43.0
|
||||
|
|
@ -1,17 +1,29 @@
|
|||
--- a/build/main.js 2024-05-10 19:00:37.087094880 +0200
|
||||
+++ b/build/main.js 2024-05-11 17:21:00.996945543 +0200
|
||||
@@ -72,6 +72,10 @@
|
||||
var external_url_default = __webpack_require__.n(
|
||||
external_url_namespaceObject
|
||||
);
|
||||
+ const external_electron_mpris_namespaceObject = require("mpris-service");
|
||||
From 16026d3b586904af7d8ca32248abe0be9eddaa84 Mon Sep 17 00:00:00 2001
|
||||
From: josselinonduty <contact@josselinonduty.fr>
|
||||
Date: Fri, 31 Jan 2025 11:55:37 +0100
|
||||
Subject: [PATCH] fix: update deps for mpris patch - @jellybrick/mpris-service
|
||||
|
||||
---
|
||||
build/main.js | 72 ++++++++++++++++++++++++++++++++++++++++++---------
|
||||
package.json | 1 +
|
||||
2 files changed, 61 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index 9219f4f..34be768 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -88,6 +88,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
|
||||
+ );
|
||||
const external_inversify_namespaceObject = require("inversify"),
|
||||
external_events_namespaceObject = require("events"),
|
||||
external_semver_namespaceObject =
|
||||
@@ -1221,8 +1225,9 @@
|
||||
function isPlatform(platform) {
|
||||
switch (platform) {
|
||||
case PLATFORM.WINDOWS:
|
||||
@@ -1188,8 +1192,9 @@
|
||||
};
|
||||
};
|
||||
let MediaService = class extends external_events_namespaceObject.EventEmitter {
|
||||
|
@ -22,7 +34,7 @@
|
|||
(this.smtc = null),
|
||||
(this.track = {}),
|
||||
(this.player = {}),
|
||||
@@ -1230,6 +1235,11 @@
|
||||
@@ -1197,6 +1202,11 @@
|
||||
(this.debounceOptions = { leading: !0, maxWait: 500 }),
|
||||
(this.ipc = ipc),
|
||||
(this.user = user),
|
||||
|
@ -34,12 +46,12 @@
|
|||
isPlatform(PLATFORM.LINUX) &&
|
||||
(this.user.addListener(UserEvents.LoggedIn, () => {
|
||||
this.start();
|
||||
@@ -1237,6 +1247,19 @@
|
||||
@@ -1204,6 +1214,19 @@
|
||||
this.user.addListener(UserEvents.LoggedOut, () => {
|
||||
this.stop();
|
||||
}));
|
||||
+ this.initMprisPlayerControls();
|
||||
+ }
|
||||
+ 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));
|
||||
|
@ -50,35 +62,37 @@
|
|||
+ 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());
|
||||
+ this.mprisPlayer.on('raise', () => this.app.getWindow().show())
|
||||
}
|
||||
play() {
|
||||
this.ipc.send("channel-player-media-control", MediaPlayerControl.Play);
|
||||
@@ -1264,11 +1287,22 @@
|
||||
@@ -1231,11 +1254,23 @@
|
||||
}
|
||||
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]
|
||||
+ });
|
||||
+ '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.mprisPlayer.playbackStatus =
|
||||
+ this.player.state === 'playing'
|
||||
+ ? external_electron_mpris_namespaceObject.PLAYBACK_STATUS_PLAYING
|
||||
+ : external_electron_mpris_namespaceObject.PLAYBACK_STATUS_PAUSED);
|
||||
- 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;
|
||||
@@ -1328,7 +1362,11 @@
|
||||
@@ -1295,7 +1330,11 @@
|
||||
1,
|
||||
(0, external_inversify_namespaceObject.inject)(SERVICE_USER)
|
||||
),
|
||||
|
@ -91,31 +105,36 @@
|
|||
],
|
||||
MediaService
|
||||
);
|
||||
@@ -2766,14 +2804,18 @@
|
||||
@@ -2733,14 +2772,20 @@
|
||||
const PlayerIpc_ipc = main_di.get(SERVICE_IPC),
|
||||
media = main_di.get(SERVICE_MEDIA),
|
||||
powerSave = main_di.get(SERVICE_POWER_SAVE);
|
||||
+ let powerSaveTimoutId;
|
||||
PlayerIpc_ipc.on(
|
||||
"channel-player-state-update",
|
||||
- PlayerIpc_ipc.on(
|
||||
- "channel-player-state-update",
|
||||
- external_lodash_debounce_default()((event, state) => {
|
||||
- media.setPlayerInfo({ state }),
|
||||
+ (event, state) => {
|
||||
+ media.setPlayerInfo({ state });
|
||||
+ clearTimeout(powerSaveTimoutId);
|
||||
+ powerSaveTimoutId = setTimeout(()=> {
|
||||
state === MediaPlayerState.Playing
|
||||
- state === MediaPlayerState.Playing
|
||||
- ? powerSave.start()
|
||||
- : powerSave.stop();
|
||||
- }, 3e3)
|
||||
+ ? powerSave.start()
|
||||
+ : powerSave.stop();
|
||||
+ }, 3e3);
|
||||
+ }
|
||||
+ 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
|
||||
+ );
|
||||
+ }
|
||||
),
|
||||
PlayerIpc_ipc.on(
|
||||
"channel-player-track-update",
|
||||
@@ -2865,6 +2907,9 @@
|
||||
@@ -2828,6 +2873,9 @@
|
||||
"autoplay-policy",
|
||||
"no-user-gesture-required"
|
||||
),
|
||||
|
@ -125,14 +144,18 @@
|
|||
external_electron_namespaceObject.app.on(
|
||||
"second-instance",
|
||||
(event, argv) => {
|
||||
diff --git a/package.json b/package.json
|
||||
index 290f49a..394b4f4 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.1.8",
|
||||
--
|
||||
2.43.0
|
||||
|
||||
--- a/package.json 2024-05-10 19:00:37.091094948 +0200
|
||||
+++ b/package.json 2024-05-10 21:54:32.411123286 +0200
|
||||
@@ -25,6 +25,7 @@
|
||||
"lodash.debounce": "^4.0.8",
|
||||
"lodash.get": "^4.4.2",
|
||||
"macos-version": "^5.2.1",
|
||||
+ "mpris-service": "^2.1.2",
|
||||
"object.assign": "^4.1.2",
|
||||
"raven": "^2.6.4",
|
||||
"reflect-metadata": "^0.1.13",
|
|
@ -0,0 +1,97 @@
|
|||
From dac6e3d0e3ca49ef6f123a6f6595cd37578913be Mon Sep 17 00:00:00 2001
|
||||
From: josselinonduty <contact@josselinonduty.fr>
|
||||
Date: Fri, 31 Jan 2025 16:43:09 +0100
|
||||
Subject: [PATCH] feat(patch): add discord rich presence support
|
||||
|
||||
---
|
||||
build/main.js | 33 +++++++++++++++++++++++++++++++--
|
||||
package.json | 1 +
|
||||
2 files changed, 32 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index 34be768..69ce1f1 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -92,6 +92,11 @@
|
||||
var external_electron_mpris_default = __webpack_require__.n(
|
||||
external_electron_mpris_namespaceObject
|
||||
);
|
||||
+ const external_rich_presence_builder_namespaceObject = require("rich-presence-builder");
|
||||
+ var external_rich_presence_builder_default = __webpack_require__.n(
|
||||
+ external_rich_presence_builder_namespaceObject
|
||||
+ );
|
||||
+ var rpcConnection;
|
||||
function isPlatform(platform) {
|
||||
switch (platform) {
|
||||
case PLATFORM.WINDOWS:
|
||||
@@ -1215,6 +1220,7 @@
|
||||
this.stop();
|
||||
}));
|
||||
this.initMprisPlayerControls();
|
||||
+ this.initDiscordRichPresence();
|
||||
}
|
||||
initMprisPlayerControls() {
|
||||
// Events => ['raise', 'quit', 'next', 'previous', 'pause', 'playpause', 'stop', 'play', 'seek', 'position', 'open', 'volume', 'loopStatus', 'shuffle'];
|
||||
@@ -1228,6 +1234,27 @@
|
||||
this.mprisPlayer.on('loopStatus', this.setRepeatMode.bind(this));
|
||||
this.mprisPlayer.on('raise', () => this.app.getWindow().show())
|
||||
}
|
||||
+ initDiscordRichPresence() {
|
||||
+ rpcConnection = new external_rich_presence_builder_namespaceObject({
|
||||
+ clientID: "1244016234203185183",
|
||||
+ });
|
||||
+ };
|
||||
+ updateDiscordRichPresence(track) {
|
||||
+ if (!rpcConnection) return;
|
||||
+ rpcConnection.setSmallImage(
|
||||
+ this.player.state === "playing" ? "play" : "pause",
|
||||
+ this.player.state === "playing" ? "Playing" : "Paused"
|
||||
+ );
|
||||
+ if (track) {
|
||||
+ rpcConnection.setLargeImage(track.coverUrl);
|
||||
+ rpcConnection.setDescription(track.title);
|
||||
+ if (track.title === track.album)
|
||||
+ rpcConnection.setState(`${track.artist}`);
|
||||
+ else
|
||||
+ rpcConnection.setState(`${track.artist} - ${track.album}`);
|
||||
+ }
|
||||
+ rpcConnection.go().catch();
|
||||
+ }
|
||||
play() {
|
||||
this.ipc.send("channel-player-media-control", MediaPlayerControl.Play);
|
||||
}
|
||||
@@ -1261,7 +1288,8 @@
|
||||
'xesam:title': track.title,
|
||||
'xesam:album': track.album,
|
||||
'xesam:artist': [track.artist]
|
||||
- });
|
||||
+ }),
|
||||
+ this.updateDiscordRichPresence(track);
|
||||
}
|
||||
setPlayerInfo(player) {
|
||||
(this.player = Object.assign(this.player, player)),
|
||||
@@ -1270,7 +1298,8 @@
|
||||
this.player.state === 'playing'
|
||||
? external_electron_mpris_namespaceObject.PLAYBACK_STATUS_PLAYING
|
||||
: external_electron_mpris_namespaceObject.PLAYBACK_STATUS_PAUSED
|
||||
- );
|
||||
+ ),
|
||||
+ this.updateDiscordRichPresence();
|
||||
}
|
||||
getTrackInfo() {
|
||||
return this.track;
|
||||
diff --git a/package.json b/package.json
|
||||
index 394b4f4..1d48b24 100644
|
||||
--- a/package.json
|
||||
+++ b/package.json
|
||||
@@ -14,6 +14,7 @@
|
||||
"dependencies": {
|
||||
"@electron/remote": "2.1.2",
|
||||
"@jellybrick/mpris-service": "2.1.5",
|
||||
+ "rich-presence-builder": "0.1.1",
|
||||
"electron-log": "^5.1.2",
|
||||
"electron-settings": "4.0.4",
|
||||
"electron-updater": "^6.1.8",
|
||||
--
|
||||
2.43.0
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
From 0fe9042e22b8c8c05d0d3aed550d18b511e0abd5 Mon Sep 17 00:00:00 2001
|
||||
From: josselinonduty <contact@josselinonduty.fr>
|
||||
Date: Fri, 31 Jan 2025 17:56:13 +0100
|
||||
Subject: [PATCH] feat: add cli argument to disable discord rpc
|
||||
|
||||
---
|
||||
build/main.js | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index 69ce1f1..8b645c6 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -1235,6 +1235,7 @@
|
||||
this.mprisPlayer.on('raise', () => this.app.getWindow().show())
|
||||
}
|
||||
initDiscordRichPresence() {
|
||||
+ if (process.argv.some(arg => arg === '--disable-discord-rpc')) return;
|
||||
rpcConnection = new external_rich_presence_builder_namespaceObject({
|
||||
clientID: "1244016234203185183",
|
||||
});
|
||||
--
|
||||
2.43.0
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
From 43e2a95ada8852ffda95a9ea08bb7914d26c6d2f Mon Sep 17 00:00:00 2001
|
||||
From: josselinonduty <contact@josselinonduty.fr>
|
||||
Date: Sat, 1 Feb 2025 19:05:39 +0100
|
||||
Subject: [PATCH] fix: set default log level to "warn" to respect Deezer TOS
|
||||
|
||||
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 | 39 ++++++++++++++++++++++++++++++++++-----
|
||||
1 file changed, 34 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index 8b645c6..686ac80 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -67,6 +67,35 @@
|
||||
var external_electron_log_default = __webpack_require__.n(
|
||||
external_electron_log_namespaceObject
|
||||
);
|
||||
+ // function updateLogLevel() {
|
||||
+ // const level = process.env.LOG_LEVEL;
|
||||
+ // if (level) {
|
||||
+ // if (level !== "silly")
|
||||
+ // external_electron_log_default().silly = () => {};
|
||||
+ // else return;
|
||||
+
|
||||
+ // if (level !== "debug")
|
||||
+ // external_electron_log_default().debug = () => {};
|
||||
+ // else return;
|
||||
+
|
||||
+ // if (level !== "verbose")
|
||||
+ // external_electron_log_default().verbose = () => {};
|
||||
+ // else return;
|
||||
+
|
||||
+ // if (level !== "info")
|
||||
+ // external_electron_log_default().info = () => {};
|
||||
+ // else return;
|
||||
+
|
||||
+ // if (level !== "warn")
|
||||
+ // external_electron_log_default().warn = () => {};
|
||||
+ // else return;
|
||||
+
|
||||
+ // if (level !== "error")
|
||||
+ // external_electron_log_default().error = () => {};
|
||||
+ // else return;
|
||||
+ // }
|
||||
+ // }
|
||||
+ // updateLogLevel();
|
||||
const external_electron_settings_namespaceObject = require("electron-settings");
|
||||
var external_electron_settings_default = __webpack_require__.n(
|
||||
external_electron_settings_namespaceObject
|
||||
@@ -3329,11 +3358,11 @@
|
||||
(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"
|
||||
+ (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
|
||||
- ? "silly"
|
||||
+ (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 &&
|
||||
--
|
||||
2.43.0
|
||||
|
|
@ -0,0 +1,288 @@
|
|||
From 493f6f6a6433882cc2d50b4ae352cd808bf0c23e Mon Sep 17 00:00:00 2001
|
||||
From: josselinonduty <contact@josselinonduty.fr>
|
||||
Date: Sat, 1 Feb 2025 17:34:11 +0100
|
||||
Subject: [PATCH] feat: provide duration and url information to mpris and
|
||||
discord rpc; update rich-presence-builder; make discord rpc opt-in
|
||||
|
||||
---
|
||||
build/main.js | 144 ++++++++++++++++++++++++++++++++++------------
|
||||
build/renderer.js | 10 ++--
|
||||
package.json | 2 +-
|
||||
3 files changed, 113 insertions(+), 43 deletions(-)
|
||||
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index c62943b..66c1a45 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -120,11 +120,11 @@
|
||||
var external_electron_mpris_default = __webpack_require__.n(
|
||||
external_electron_mpris_namespaceObject
|
||||
);
|
||||
- const external_rich_presence_builder_namespaceObject = require("rich-presence-builder");
|
||||
+ const external_rich_presence_builder_namespaceObject = require("@josselinonduty/rich-presence-builder");
|
||||
var external_rich_presence_builder_default = __webpack_require__.n(
|
||||
external_rich_presence_builder_namespaceObject
|
||||
);
|
||||
- var rpcConnection;
|
||||
+ var rpcConnection, rpcData, rpcStartedAt, rpcPausedAt;
|
||||
function isPlatform(platform) {
|
||||
switch (platform) {
|
||||
case PLATFORM.WINDOWS:
|
||||
@@ -1248,7 +1248,6 @@
|
||||
this.stop();
|
||||
}));
|
||||
this.initMprisPlayerControls();
|
||||
- this.initDiscordRichPresence();
|
||||
}
|
||||
initMprisPlayerControls() {
|
||||
// Events => ['raise', 'quit', 'next', 'previous', 'pause', 'playpause', 'stop', 'play', 'seek', 'position', 'open', 'volume', 'loopStatus', 'shuffle'];
|
||||
@@ -1262,27 +1261,92 @@
|
||||
this.mprisPlayer.on('loopStatus', this.setRepeatMode.bind(this));
|
||||
this.mprisPlayer.on('raise', () => this.app.getWindow().show())
|
||||
}
|
||||
- initDiscordRichPresence() {
|
||||
- if (process.argv.some(arg => arg === '--disable-discord-rpc')) return;
|
||||
- rpcConnection = new external_rich_presence_builder_namespaceObject({
|
||||
- clientID: "1244016234203185183",
|
||||
- });
|
||||
- };
|
||||
- updateDiscordRichPresence(track) {
|
||||
- if (!rpcConnection) return;
|
||||
- rpcConnection.setSmallImage(
|
||||
- this.player.state === "playing" ? "play" : "pause",
|
||||
- this.player.state === "playing" ? "Playing" : "Paused"
|
||||
- );
|
||||
- if (track) {
|
||||
- rpcConnection.setLargeImage(track.coverUrl);
|
||||
- rpcConnection.setDescription(track.title);
|
||||
- if (track.title === track.album)
|
||||
- rpcConnection.setState(`${track.artist}`);
|
||||
- else
|
||||
- rpcConnection.setState(`${track.artist} - ${track.album}`);
|
||||
+ updateDiscordRichPresence(track, data) {
|
||||
+ if (!process.argv.some(arg => arg === '--enable-discord-rpc')) return;
|
||||
+
|
||||
+ if (track && data) {
|
||||
+ // Update track information
|
||||
+ const duration = data?.trackInfo?.song?.DURATION;
|
||||
+ if (!duration) return;
|
||||
+
|
||||
+ rpcStartedAt = Date.now();
|
||||
+ rpcPausedAt = undefined;
|
||||
+ rpcData = {
|
||||
+ type: 2,
|
||||
+ smallImage: {
|
||||
+ image: "play",
|
||||
+ text: "Playing"
|
||||
+ },
|
||||
+ largeImage: track.coverUrl,
|
||||
+ description: track.title,
|
||||
+ state: track.title === track.album ?
|
||||
+ `${track.artist}`
|
||||
+ : `${track.artist} - ${track.album}`,
|
||||
+ startTimestamp: rpcStartedAt,
|
||||
+ button: {
|
||||
+ label: "Listen on Deezer",
|
||||
+ url: `https://deezer.com/track/${data.trackInfo.song.SNG_ID}`
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ rpcConnection = new external_rich_presence_builder_namespaceObject({
|
||||
+ clientID: "1244016234203185183",
|
||||
+ })
|
||||
+ .setType(rpcData.type)
|
||||
+ .setSmallImage(
|
||||
+ rpcData.smallImage.image,
|
||||
+ rpcData.smallImage.text
|
||||
+ )
|
||||
+ .setLargeImage(rpcData.largeImage)
|
||||
+ .setDescription(rpcData.description)
|
||||
+ .setState(rpcData.state)
|
||||
+ .setStartTimestamp(rpcData.startTimestamp)
|
||||
+ .addButton(rpcData.button.label, rpcData.button.url);
|
||||
+ rpcConnection
|
||||
+ .go().catch()
|
||||
+ } else {
|
||||
+ // Update playing state only
|
||||
+ if (!rpcConnection) return;
|
||||
+
|
||||
+ if (this.player.state === "playing") {
|
||||
+ if (rpcPausedAt) {
|
||||
+ const elapsed = rpcPausedAt - rpcStartedAt;
|
||||
+ rpcStartedAt = Date.now() - elapsed;
|
||||
+ rpcData.startTimestamp = rpcStartedAt;
|
||||
+ }
|
||||
+ rpcPausedAt = undefined;
|
||||
+ rpcData.smallImage = {
|
||||
+ image: "play",
|
||||
+ text: "Playing"
|
||||
+ }
|
||||
+ } else {
|
||||
+ rpcData.startTimestamp = undefined;
|
||||
+ rpcPausedAt = Date.now();
|
||||
+ rpcData.smallImage = {
|
||||
+ image: "pause",
|
||||
+ text: "Paused"
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ rpcConnection = new external_rich_presence_builder_namespaceObject({
|
||||
+ clientID: "1244016234203185183",
|
||||
+ })
|
||||
+ .setType(rpcData.type)
|
||||
+ .setSmallImage(
|
||||
+ rpcData.smallImage.image,
|
||||
+ rpcData.smallImage.text
|
||||
+ )
|
||||
+ .setLargeImage(rpcData.largeImage)
|
||||
+ .setDescription(rpcData.description)
|
||||
+ .setState(rpcData.state)
|
||||
+ .addButton(rpcData.button.label, rpcData.button.url);
|
||||
+
|
||||
+ if (rpcData.startTimestamp)
|
||||
+ rpcConnection.setStartTimestamp(rpcData.startTimestamp);
|
||||
+
|
||||
+ rpcConnection
|
||||
+ .go().catch()
|
||||
}
|
||||
- rpcConnection.go().catch();
|
||||
}
|
||||
play() {
|
||||
this.ipc.send("channel-player-media-control", MediaPlayerControl.Play);
|
||||
@@ -1308,19 +1372,25 @@
|
||||
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 = {
|
||||
+ 'mpris:length': data?.trackInfo?.song?.DURATION
|
||||
+ ? data.trackInfo.song.DURATION * 1000
|
||||
+ : undefined,
|
||||
'mpris:trackid': this.mprisPlayer.objectPath('track/0'),
|
||||
'mpris:artUrl': track.coverUrl,
|
||||
'xesam:title': track.title,
|
||||
'xesam:album': track.album,
|
||||
- 'xesam:artist': [track.artist]
|
||||
- }),
|
||||
- this.updateDiscordRichPresence(track);
|
||||
+ 'xesam:artist': [track.artist],
|
||||
+ 'xesam:url': data?.trackInfo?.song
|
||||
+ ? `https://deezer.com/track/${data.trackInfo.song.SNG_ID}`
|
||||
+ : undefined
|
||||
+ });
|
||||
+ this.updateDiscordRichPresence(track, data);
|
||||
}
|
||||
- setPlayerInfo(player) {
|
||||
+ setPlayerInfo(player, data) {
|
||||
(this.player = Object.assign(this.player, player)),
|
||||
this.emit(MediaEvents.PlayerUpdated, this.player),
|
||||
(this.mprisPlayer.playbackStatus =
|
||||
@@ -2833,8 +2903,8 @@
|
||||
var powerSaveTimeoutId;
|
||||
PlayerIpc_ipc.on(
|
||||
"channel-player-state-update",
|
||||
- (event, state) => {
|
||||
- media.setPlayerInfo({ state }),
|
||||
+ (event, state, data) => {
|
||||
+ media.setPlayerInfo({ state }, data),
|
||||
clearTimeout(powerSaveTimeoutId),
|
||||
powerSaveTimeoutId = setTimeout(
|
||||
() => {
|
||||
@@ -2847,15 +2917,15 @@
|
||||
),
|
||||
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-shuffle-update", (event, player, data) => {
|
||||
+ media.setPlayerInfo(player, data);
|
||||
}),
|
||||
- PlayerIpc_ipc.on("channel-player-repeat-mode-update", (event, player) => {
|
||||
- media.setPlayerInfo(player);
|
||||
+ 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);
|
||||
@@ -2864,7 +2934,7 @@
|
||||
});
|
||||
const UserIpc_ipc = main_di.get(SERVICE_IPC),
|
||||
user = main_di.get(SERVICE_USER);
|
||||
- UserIpc_ipc.on("channel-user-store-updated", (event, userData) => {
|
||||
+ UserIpc_ipc.on("channel-user-store-updated", (event, userData, data) => {
|
||||
user.setUserInfo(userData);
|
||||
});
|
||||
var application_awaiter = function (thisArg, _arguments, P, generator) {
|
||||
diff --git a/build/renderer.js b/build/renderer.js
|
||||
index fb02453..4328ccd 100644
|
||||
--- a/build/renderer.js
|
||||
+++ b/build/renderer.js
|
||||
@@ -354,7 +354,7 @@
|
||||
offerId: user.OFFER_ID,
|
||||
country: user.COUNTRY,
|
||||
gatekeeps: user.__DZR_GATEKEEPS__,
|
||||
- });
|
||||
+ }, event.data);
|
||||
break;
|
||||
}
|
||||
case "player-repeat-changed":
|
||||
@@ -363,7 +363,7 @@
|
||||
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", {
|
||||
@@ -371,14 +371,14 @@
|
||||
canPrev: event.data.player.hasPrev,
|
||||
canNext: event.data.player.hasNext,
|
||||
canShuffle: event.data.player.hasShuffle,
|
||||
- });
|
||||
+ }, event.data);
|
||||
break;
|
||||
case "player-playing-changed": {
|
||||
const state =
|
||||
!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": {
|
||||
@@ -414,7 +414,7 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
diff --git a/package.json b/package.json
|
||||
index 6c78c7d..cee7ce4 100644
|
||||
--- a/package.json
|
||||
+++ b/package.json
|
||||
@@ -14,7 +14,7 @@
|
||||
"dependencies": {
|
||||
"@electron/remote": "2.1.2",
|
||||
"@jellybrick/mpris-service": "2.1.5",
|
||||
- "rich-presence-builder": "0.1.1",
|
||||
+ "@josselinonduty/rich-presence-builder": "0.1.2",
|
||||
"electron-log": "^5.1.2",
|
||||
"electron-settings": "4.0.4",
|
||||
"electron-updater": "^6.1.8",
|
||||
--
|
||||
2.43.0
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
From: Dorian Stoll <dorian.stoll@tmsp.io>
|
||||
Date: Sat, 5 Feb 2022 07:05:16 +0100
|
||||
Subject: [PATCH] Fix isDev() usage
|
||||
|
||||
This stops the excessive logging, since parts of the app will not run in development
|
||||
mode anymore. It also stops the app from logging the urls for the mp3 files, which is
|
||||
against the Deezer TOS.
|
||||
---
|
||||
build/main.js | 6 +++---
|
||||
build/preload.js | 2 +-
|
||||
2 files changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index 2da2ed1..88135ae 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -1979,7 +1979,7 @@
|
||||
tags: Object.assign(
|
||||
{ country: user.country, offerId: user.offerId },
|
||||
{
|
||||
- environment: isDev ? "development" : "production",
|
||||
+ environment: isDev() ? "development" : "production",
|
||||
os: `${external_os_default().type()} ${external_os_default().release()}`,
|
||||
"os.name": external_os_default().type(),
|
||||
arch: process.arch,
|
||||
@@ -3268,10 +3268,10 @@
|
||||
(external_electron_log_default().transports.console.format = `{h}:{i}:{s}.{ms} ({processType}/{level}) ${
|
||||
isPlatform(PLATFORM.WINDOWS) ? ">" : "›"
|
||||
} {text}`),
|
||||
- (external_electron_log_default().transports.console.level = isDev
|
||||
+ (external_electron_log_default().transports.console.level = isDev()
|
||||
? "silly"
|
||||
: "warn"),
|
||||
- (external_electron_log_default().transports.file.level = isDev
|
||||
+ (external_electron_log_default().transports.file.level = isDev()
|
||||
? "silly"
|
||||
: "warn"),
|
||||
(external_electron_log_default().transports.sentry = function (msg) {
|
||||
diff --git a/build/preload.js b/build/preload.js
|
||||
index a8bb8d6..73dc8b4 100644
|
||||
--- a/build/preload.js
|
||||
+++ b/build/preload.js
|
||||
@@ -490,7 +490,7 @@
|
||||
}
|
||||
getSentryTags() {
|
||||
return {
|
||||
- environment: isDev ? "development" : "production",
|
||||
+ environment: isDev() ? "development" : "production",
|
||||
os: `${external_os_default().type()} ${external_os_default().release()}`,
|
||||
"os.name": external_os_default().type(),
|
||||
arch: process.arch,
|
||||
--
|
||||
2.34.1
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
diff --git a/build/main.js b/build/main.js
|
||||
index 5066eef..46b04c5 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -3083,7 +3083,10 @@
|
||||
this._adjustViewToContentSize(),
|
||||
mainView.setAutoResize({ width: !0, height: !0 });
|
||||
} else this.appService.setWindow(this.window, void 0);
|
||||
- if ((this.appService.setUserAgent(), isPlatform(PLATFORM.DARWIN))) {
|
||||
+ if (
|
||||
+ (this.appService.setUserAgent(), isPlatform(PLATFORM.LINUX))
|
||||
+ && !process.argv.some(arg => arg === '--disable-systray')
|
||||
+ ) {
|
||||
let isQuitting = !1;
|
||||
external_electron_namespaceObject.app.on(
|
||||
"before-quit",
|
|
@ -1,83 +0,0 @@
|
|||
From: Dorian Stoll <dorian.stoll@tmsp.io>
|
||||
Date: Sat, 29 Jan 2022 12:30:00 +0100
|
||||
Subject: [PATCH] Remove kernel version from User-Agent
|
||||
|
||||
The application sends the kernel version as part of the User-Agent.
|
||||
However, the Deezer API seems to assume the number to follow semver,
|
||||
and can get confused when it doesn't. This then leads to some features
|
||||
like dark mode being reported as unavailable.
|
||||
|
||||
e.g: 5.11.0-16-generic works, while 5.15.14-200.fc35.x86_64 doesn't.
|
||||
|
||||
The solution is to ignore the actual version and send bogus data that
|
||||
is known to work.
|
||||
---
|
||||
build/main.js | 4 +++-
|
||||
build/preload.js | 4 +++-
|
||||
build/renderer.js | 4 +++-
|
||||
build/titlebar.js | 4 +++-
|
||||
4 files changed, 12 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/build/main.js b/build/main.js
|
||||
index b8e2459..2da2ed1 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -5,7 +5,9 @@
|
||||
module.exports = require("macos-version");
|
||||
},
|
||||
87: (module) => {
|
||||
- module.exports = require("os");
|
||||
+ var m = require("os");
|
||||
+ m.release = function() { return "0.0.0"; }
|
||||
+ module.exports = m;
|
||||
},
|
||||
},
|
||||
__webpack_module_cache__ = {};
|
||||
diff --git a/build/preload.js b/build/preload.js
|
||||
index 912f8ee..a8bb8d6 100644
|
||||
--- a/build/preload.js
|
||||
+++ b/build/preload.js
|
||||
@@ -5,7 +5,9 @@
|
||||
module.exports = require("macos-version");
|
||||
},
|
||||
87: (module) => {
|
||||
- module.exports = require("os");
|
||||
+ var m = require("os");
|
||||
+ m.release = function() { return "0.0.0"; }
|
||||
+ module.exports = m;
|
||||
},
|
||||
},
|
||||
__webpack_module_cache__ = {};
|
||||
diff --git a/build/renderer.js b/build/renderer.js
|
||||
index 6e7787f..026c052 100644
|
||||
--- a/build/renderer.js
|
||||
+++ b/build/renderer.js
|
||||
@@ -5,7 +5,9 @@
|
||||
module.exports = require("macos-version");
|
||||
},
|
||||
87: (module) => {
|
||||
- module.exports = require("os");
|
||||
+ var m = require("os");
|
||||
+ m.release = function() { return "0.0.0"; }
|
||||
+ module.exports = m;
|
||||
},
|
||||
},
|
||||
__webpack_module_cache__ = {};
|
||||
diff --git a/build/titlebar.js b/build/titlebar.js
|
||||
index 3d2aaca..052553b 100644
|
||||
--- a/build/titlebar.js
|
||||
+++ b/build/titlebar.js
|
||||
@@ -5,7 +5,9 @@
|
||||
module.exports = require("macos-version");
|
||||
},
|
||||
87: (module) => {
|
||||
- module.exports = require("os");
|
||||
+ var m = require("os");
|
||||
+ m.release = function() { return "0.0.0"; }
|
||||
+ module.exports = m;
|
||||
},
|
||||
},
|
||||
__webpack_module_cache__ = {};
|
||||
--
|
||||
2.34.1
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
diff --git a/build/main.js b/build/main.js
|
||||
index 5066eef..592a6bc 100644
|
||||
--- a/build/main.js
|
||||
+++ b/build/main.js
|
||||
@@ -3122,8 +3122,12 @@
|
||||
finalMinSize[1]
|
||||
);
|
||||
}
|
||||
- isDev() ? this.window.showInactive() : this.window.show(),
|
||||
- this.thumbar.init();
|
||||
+ if (!process.argv.some(arg => arg === '--start-in-tray')) {
|
||||
+ isDev() ? this.window.showInactive() : this.window.show(),
|
||||
+ this.thumbar.init();
|
||||
+ } else {
|
||||
+ this.window.hide();
|
||||
+ }
|
||||
}),
|
||||
this.appService.enableDevMode();
|
||||
}
|
Loading…
Reference in New Issue