[READ-ONLY] Mirror of https://github.com/FoxxMD/multi-scrobbler. Scrobble plays from multiple sources to multiple clients docs.multi-scrobbler.app
deezer docker jellyfin koito lastfm listenbrainz maloja mopidy mpris music music-assistant plex scrobble self-hosted spotify subsonic tautulli youtube-music
0

Configure Feed

Select the types of activity you want to include in your feed.

docs(deezer): Rewrite Deezer Source with ARL implementation

* Add ARL implementation docs and warnings
* Update json examples to include both types of deezer configs

FoxxMD (Jun 17, 2025, 3:16 PM UTC) 69f73ff0 305f3c42

+157 -48
+1 -1
README.md
··· 23 23 * [ListenBrainz](https://foxxmd.github.io/multi-scrobbler/docs/configuration#listenbrainz-source) 24 24 * [Koito](https://foxxmd.github.io/multi-scrobbler/docs/configuration#listenbrainz-source) using Listenbrainz Source 25 25 * [ListenBrainz (Endpoint)](https://foxxmd.github.io/multi-scrobbler/docs/configuration#listenbrainz-endpoint) 26 - * [~~Deezer~~](https://foxxmd.github.io/multi-scrobbler/docs/configuration#deezer) 26 + * [Deezer](https://foxxmd.github.io/multi-scrobbler/docs/configuration#deezer) 27 27 * [MPRIS (Linux Desktop)](https://foxxmd.github.io/multi-scrobbler/docs/configuration#mpris) 28 28 * [Mopidy](https://foxxmd.github.io/multi-scrobbler/docs/configuration#mopidy) 29 29 * [JRiver](https://foxxmd.github.io/multi-scrobbler/docs/configuration#jriver)
+13
config/deezer-deprecated.json.example
··· 1 + [ 2 + { 3 + "name": "DeezerOfficalDeprecated", 4 + "enable": true, 5 + "clients": [], 6 + "data": { 7 + "clientId": "a89cba1569901a0671d5a9875fed4be1", 8 + "clientSecret": "ec42e09d5ae0ee0f0816ca151008412a", 9 + "redirectUri": "http://localhost:9078/deezer/callback", 10 + "interval": 60 11 + } 12 + } 13 + ]
+2 -5
config/deezer.json.example
··· 1 1 [ 2 2 { 3 - "name": "FoxxMDeezer", 3 + "name": "DeezerARL", 4 4 "enable": true, 5 5 "clients": [], 6 6 "data": { 7 - "clientId": "a89cba1569901a0671d5a9875fed4be1", 8 - "clientSecret": "ec42e09d5ae0ee0f0816ca151008412a", 9 - "redirectUri": "http://localhost:9078/deezer/callback", 10 - "interval": 60 7 + "arl": "UOsRPjT3U5Dhaaup3xQ30DWFoSgqugdSYzL3QE743waaVy2eur2ckyJcZ4RV123Q3PsbKXkLwA6ahc9XmEfev6BtfSP8LujE3JswWRQogZCDUOwVzWO5sAig", 11 8 } 12 9 } 13 10 ]
+139 -40
docsite/docs/configuration/configuration.mdx
··· 12 12 import AIOConfig from '!!raw-loader!../../../config/config.json.example'; 13 13 import AzuracastConfig from '!!raw-loader!../../../config/azuracast.json.example'; 14 14 import ChromecastConfig from '!!raw-loader!../../../config/chromecast.json.example'; 15 - import DeezerConfig from '!!raw-loader!../../../config/chromecast.json.example'; 15 + import DeezerConfig from '!!raw-loader!../../../config/deezer.json.example'; 16 + import DeezerDeprecatedConfig from '!!raw-loader!../../../config/deezer-deprecated.json.example'; 16 17 import IcecastConfig from '!!raw-loader!../../../config/icecast.json.example'; 17 18 import JellyfinConfig from '!!raw-loader!../../../config/jellyfin.json.example'; 18 19 import JriverfinConfig from '!!raw-loader!../../../config/jriver.json.example'; ··· 872 873 </TabItem> 873 874 </Tabs> 874 875 875 - ### [~~Deezer~~](https://deezer.com/) 876 + ### [Deezer](https://deezer.com/) 876 877 877 - :::warning 878 + <Tabs groupId="deezerSource" queryString> 879 + <TabItem value="arl" label="Unofficial ARL"> 880 + :::warning 878 881 879 - **This Source is DEPRECATED because Deezer has dropped official API support.** This Source will **not** be removed but no further support or fixes will be given. 882 + This Source uses unofficial methods to access Deezer data that are likely in violation of Deezer's TOS. Deezer may change or remove these methods at any time, breaking functionality. Use this Source at your own risk. 880 883 881 - Users cannot create new applications on Deezer Developers and there is no guarantee existing applications will continue to work. 884 + ::: 882 885 883 - As a workaround consider integrating Deezer with last.fm and then using [last.fm as a Source](#lastfm-source). 886 + :::info 884 887 885 - Users with existing Deezer applications in use with multi-scrobbler should consider this change as well to avoid future breaking issues with the unsupported API. 888 + This Source will work only if you have a **Premium** Deezer account. 886 889 887 - [See this issue for more discussion.](https://github.com/FoxxMD/multi-scrobbler/issues/175#issuecomment-2296776625) 890 + ::: 888 891 889 - ::: 892 + ##### Retrieve ARL 890 893 891 - Create a new application at [Deezer Developers](https://developers.deezer.com/myapps) 894 + The `arl` is a browser cookie that Deezer uses to store your login information. Multi-scrobbler uses the `arl` value to make authorized requests to Deezer's API where it can retrieve listening history. 892 895 893 - * Application Domain must be the same as your multi-scrobbler domain. Default is `localhost:9078` 894 - * Redirect URL must end in `deezer/callback` 895 - * Default would be `http://localhost:9078/deezer/callback` 896 + **After logging into Deezer**, use one of the methods below to retrieve the `arl` cookie value: 896 897 897 - After application creation you should have credentials displayed in the "My Apps" dashboard. You will need: 898 + <Tabs groupId="arlRetrival"> 899 + <TabItem value="chrome" label="Chrome"> 900 + 1. On deezer.com, press F12 to open the Developer Tools window. 901 + 2. Go to the Applications tab. Press the '>>' More tabs icon if it's hidden. 902 + 3. Under the Cookies Filter, click deezer.com, then the text bar name `arl`. 903 + 4. Copy all the contents shown in the **Cookie Value** pane. 904 + </TabItem> 905 + <TabItem value="firefox" label="Firefox"> 906 + 1. On deezer.com, hit Ctrl+Shift+I to open Developer Tools 907 + 2. Go to the Storage Tab, then expand Cookies in the sidebar and select deezer.com 908 + 3. Find the row with `arl` as the name, then double click the Value column and right click -> copy the value 909 + </TabItem> 910 + </Tabs> 898 911 899 - * **Application ID** 900 - * **Secret Key** 901 - * **Redirect URL** (if not the default) 912 + #### Configuration 902 913 903 - **If no access token is provided...** 914 + <Tabs groupId="configType" queryString> 915 + <TabItem value="env" label="ENV"> 916 + | Environmental Variable | Required? | Default | Description | 917 + | :--------------------- | --------- | ------- | ------------------------------------------------ | 918 + | `DEEZER_ARL` | Yes | | The ARL cookie value retrieved from your browser | 919 + </TabItem> 920 + <TabItem value="file" label="File"> 921 + <details> 904 922 905 - After starting multi-scrobbler with credentials in-place open the dashboard (`http://localhost:9078`) and find your Deezer source. Click **(Re)authenticate and (re)start polling** to start the login process. After login is complete polling will begin automatically. 923 + <summary>Example</summary> 906 924 907 - #### Configuration 925 + <CodeBlock title="CONFIG_DIR/deezer.json" language="json5">{DeezerConfig}</CodeBlock> 908 926 909 - <Tabs groupId="configType" queryString> 910 - <TabItem value="env" label="ENV"> 911 - | Environmental Variable | Required? | Default | Description | 912 - |------------------------|-----------|-----------------------------------------|-----------------------------------| 913 - | `DEEZER_CLIENT_ID` | Yes | | Your **Application ID** | 914 - | `DEEZER_CLIENT_SECRET` | Yes | | Your **Secret Key** | 915 - | `DEEZER_REDIRECT_URI` | No | `http://localhost:9078/deezer/callback` | URI must end in `deezer/callback` | 916 - </TabItem> 917 - <TabItem value="file" label="File"> 918 - <details> 927 + </details> 919 928 920 - <summary>Example</summary> 929 + or <SchemaLink lower objectName="DeezerSourceConfig"/> 930 + </TabItem> 931 + <TabItem value="aio" label="AIO"> 932 + <details> 921 933 922 - <CodeBlock title="CONFIG_DIR/deezer.json" language="json5">{DeezerConfig}</CodeBlock> 934 + <summary>Example</summary> 923 935 924 - </details> 936 + <AIOExample data={DeezerConfig} name="deezer"/> 925 937 926 - or <SchemaLink lower objectName="DeezerSourceConfig"/> 927 - </TabItem> 928 - <TabItem value="aio" label="AIO"> 929 - <details> 938 + </details> 939 + 940 + or <SchemaLink lower objectName="DeezerSourceConfig"/> 941 + </TabItem> 942 + </Tabs> 930 943 931 - <summary>Example</summary> 932 944 933 - <AIOExample data={DeezerConfig} name="deezer"/> 945 + ##### Duplicate detection 934 946 947 + Third party integrations with Deezer (Sonos) may cause Deezer to [report the same track many times in listening history.](https://github.com/FoxxMD/multi-scrobbler/pull/296#issuecomment-2922374738) If you experience this issue modify your Deezer Source config (file-based only) to include the option `"fuzzyDiscoveryIgnore": "aggressive"` 948 + 949 + <details> 950 + 951 + <summary>deezer.json example</summary> 952 + 953 + ```json title="deezer.json" 954 + [ 955 + { 956 + "name": "MyDeezer", 957 + "data": { 958 + "arl": "UOsRPjT3U5Dhaaup3x...", 959 + }, 960 + "options": { 961 + "fuzzyDiscoveryIgnore": "aggressive" 962 + } 963 + } 964 + ] 965 + ``` 935 966 </details> 936 967 937 - or <SchemaLink lower objectName="DeezerSourceConfig"/> 968 + This option comes with some trade-offs: MS will aggressively detect repeated tracks within a window of time that should eliminate all duplicates. However, this will also prevent *intentionally* repeated tracks from being scrobbled. See [this thread](https://github.com/FoxxMD/multi-scrobbler/pull/296#issuecomment-2970417070) for more information on how this works. 969 + 938 970 </TabItem> 971 + <TabItem value="official" label="Official API"> 972 + 973 + :::warning 974 + 975 + **This Source is DEPRECATED because Deezer has dropped official API support.** This Source will **not** be removed but no further support or fixes will be given. [See this issue for more discussion.](https://github.com/FoxxMD/multi-scrobbler/issues/175#issuecomment-2296776625) 976 + 977 + Users cannot create new applications on Deezer Developers and there is no guarantee existing applications will continue to work. 978 + 979 + As a workaround consider: 980 + 981 + * Using the alternative [Deezer Source that uses unofficial, internal API via ARL](./?deezerSource=arl#deezer) 982 + * Connect Deezer with Last.fm and then use [Last.fm as a Source](#lastfm-source) 983 + 984 + ::: 985 + 986 + Create a new application at [Deezer Developers](https://developers.deezer.com/myapps) 987 + 988 + * Application Domain must be the same as your multi-scrobbler domain. Default is `localhost:9078` 989 + * Redirect URL must end in `deezer/callback` 990 + * Default would be `http://localhost:9078/deezer/callback` 991 + 992 + After application creation you should have credentials displayed in the "My Apps" dashboard. You will need: 993 + 994 + * **Application ID** 995 + * **Secret Key** 996 + * **Redirect URL** (if not the default) 997 + 998 + **If no access token is provided...** 999 + 1000 + After starting multi-scrobbler with credentials in-place open the dashboard (`http://localhost:9078`) and find your Deezer source. Click **(Re)authenticate and (re)start polling** to start the login process. After login is complete polling will begin automatically. 1001 + 1002 + #### Configuration 1003 + 1004 + <Tabs groupId="configType" queryString> 1005 + <TabItem value="env" label="ENV"> 1006 + | Environmental Variable | Required? | Default | Description | 1007 + |------------------------|-----------|-----------------------------------------|-----------------------------------| 1008 + | `DEEZER_CLIENT_ID` | Yes | | Your **Application ID** | 1009 + | `DEEZER_CLIENT_SECRET` | Yes | | Your **Secret Key** | 1010 + | `DEEZER_REDIRECT_URI` | No | `http://localhost:9078/deezer/callback` | URI must end in `deezer/callback` | 1011 + </TabItem> 1012 + <TabItem value="file" label="File"> 1013 + <details> 1014 + 1015 + <summary>Example</summary> 1016 + 1017 + <CodeBlock title="CONFIG_DIR/deezer.json" language="json5">{DeezerDeprecatedConfig}</CodeBlock> 1018 + 1019 + </details> 1020 + 1021 + or <SchemaLink lower objectName="DeezerSourceConfig"/> 1022 + </TabItem> 1023 + <TabItem value="aio" label="AIO"> 1024 + <details> 1025 + 1026 + <summary>Example</summary> 1027 + 1028 + <AIOExample data={DeezerDeprecatedConfig} name="deezer"/> 1029 + 1030 + </details> 1031 + 1032 + or <SchemaLink lower objectName="DeezerSourceConfig"/> 1033 + </TabItem> 1034 + </Tabs> 1035 + 1036 + </TabItem> 939 1037 </Tabs> 1038 + 940 1039 941 1040 ### [Youtube Music](https://music.youtube.com) 942 1041
+1 -1
docsite/src/pages/index.mdx
··· 24 24 * [ListenBrainz](docs/configuration#listenbrainz-source) 25 25 * [Koito](docs/configuration#listenbrainz-source) using Listenbrainz Source 26 26 * [ListenBrainz (Endpoint)](docs/configuration#listenbrainz-endpoint) 27 - * [~~Deezer~~](docs/configuration#deezer) 27 + * [Deezer](docs/configuration#deezer) 28 28 * [MPRIS (Linux Desktop)](docs/configuration#mpris) 29 29 * [Mopidy](docs/configuration#mopidy) 30 30 * [JRiver](docs/configuration#jriver)
+1 -1
src/backend/sources/DeezerSource.ts
··· 91 91 } 92 92 93 93 protected async doBuildInitData(): Promise<true | string | undefined> { 94 - this.logger.warn('This Source is DEPRECATED! Deezer has dropped support official API support. New apps cannot be created and existing apps are not guaranteed to continue working. See the documentation or this issue for more information: https://github.com/FoxxMD/multi-scrobbler/issues/175#issuecomment-2296776625'); 94 + this.logger.warn('This Source is DEPRECATED! Deezer has dropped support official API support. New apps cannot be created and existing apps are not guaranteed to continue working. Refer to the MS documentation for a new Deezer Source implementation.'); 95 95 96 96 try { 97 97 const credFile = await readJson(this.workingCredsPath, {throwOnNotFound: false});