### Install and Start Multi-scrobbler Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/development/dev-common.md Clone the repository, install dependencies, and start the application. Ensure you are using the correct Node.js version, optionally using nvm. ```shell git clone https://github.com/FoxxMD/multi-scrobbler.git . cd multi-scrobbler nvm use # optional, sets correct node version when running without devcontainer npm install npm run start ``` -------------------------------- ### Configuration File Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/installation/installation.mdx Example configuration file (`./config/config.json`) for setting up sources like Jellyfin and clients like Maloja. ```json { "sources": [ { "type": "jellyfin", "clients": ["myConfig"], "name": "myJellyfinSource", "data": { "apiKey": "a89cba1569901a0671d5a9875fed4be1", "url": "http://192.168.0.101:8096", "user": "MyUser" } } ], "clients": [ { "type": "maloja", "name": "myConfig", "data": { "url": "http://localhost:42010", "apiKey": "myMalojaKey" } } ], } ``` -------------------------------- ### Start Application Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/installation/installation.mdx Start the multi-scrobbler application after configuring it via a file. ```shell npm run start ``` -------------------------------- ### Install and Run Flatpak Application Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/development/flatpak.md Append `--install --user` to the `flatpak-builder` command to install the application immediately after building. Run the installed application using `flatpak run`. ```shell flatpak run -u io.github.foxxmd.multiscrobbler ``` -------------------------------- ### Start Local Development Server Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/README.md Starts a local development server for live preview. Changes are reflected without server restart. ```bash yarn start ``` -------------------------------- ### Docker Compose Configuration Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/installation/installation.mdx This example demonstrates a typical docker-compose.yml setup for running multi-scrobbler. It includes environment variables for service configuration, volume mappings for persistent data, and port exposure. Ensure to adjust environment variables like API keys, URLs, and user IDs to match your specific setup. ```yaml services: multi-scrobbler: image: foxxmd/multi-scrobbler container_name: multi-scrobbler environment: - TZ=Etc/GMT # Specify timezone from TZ Database name found here https://en.wikipedia.org/wiki/List_of_tz_database_time_zones - JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56bd6540c - JELLYFIN_URL=192.168.0.101:8096 - JELLYFIN_USER=MyUser - BASE_URL=http://192.168.0.100:9078 - MALOJA_URL=http://domain.tld:42010 - MALOJA_API_KEY=1234 - PUID=1000 - PGID=1000 # uncomment along with valkey service/volume below for better caching #- CACHE_METADATA=valkey #- CACHE_METADATA_CONN=redis://valkey:6379 volumes: - ./config:/config ports: - 9078:9078 restart: unless-stopped #valkey: # image: valkey/valkey # volumes: # - valkeydata:/data #volumes: # valkeydata: # driver: local ``` -------------------------------- ### MusicCast Source Configuration Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/sources/yamaha-musiccast.mdx Example of environment variables for configuring a MusicCast source. MCAST_ID and MCAST_URL are required. ```bash # Required: MCAST_ID=unique_id MCAST_URL=http://192.168.0.101 # Optional: MCAST_NAME=My MusicCast Device ``` -------------------------------- ### Plex Configuration Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/sources/plex.mdx This is an example configuration for Plex. It includes placeholders for your Plex URL, port, and token. Ensure these are correctly set for Multi-scrobbler to connect to your Plex instance. ```json { "plex": { "url": "http://localhost:32400", "token": "YOUR_PLEX_TOKEN", "usersAllow": [] } } ``` -------------------------------- ### Maloja Docker Compose Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/clients/maloja.mdx Example docker-compose.yml for setting up a Maloja server. Ensure to uncomment the environment section and set MALOJA_FORCE_PASSWORD. ```yaml https://github.com/krateng/maloja/blob/master/example-compose.yml ``` -------------------------------- ### Koito Base URL Examples Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/clients/koito.mdx Examples demonstrating how to correctly set the KOITO_URL environment variable based on your Koito server's accessibility and configuration. ```text | `KOITO_URL` | | :-------------------------------------------- | :------------------------------ | :--------------------------------------------------- | | `http://192.168.0.100:4110` | `http://192.168.0.100:4110` | `http://192.168.0.100:4110/apis/listenbrainz/1` | | `https://koito.mydomain.com` | `https://koito.mydomain.com` | `https://koito.mydomain.com/apis/listenbrainz/1` | | `http://192.168.0.100:4110/apis/listenbrainz` | `http://192.168.0.100:4110` | `http://192.168.0.100:4110/apis/listenbrainz/1` | | `http://192.0.168.100:80/koito` | `http://192.168.0.100:80/koito` | `http://192.168.0.100:80/koito/apis/listenbrainz/1` | ``` -------------------------------- ### Docker ENV Configuration Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/configuration.mdx Use environment variables for configuration in Docker containers. This method is suitable for simple setups or single-user instances. ```shell docker run -e "SPOTIFY_CLIENT_ID=yourId" -e "SPOTIFY_CLIENT_SECRET=yourSecret" ... ``` -------------------------------- ### Spotify File Configuration Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/configuration.mdx Example of a Spotify client configuration file. This file should be placed in the directory specified by the CONFIG_DIR environment variable and named 'spotify.json'. ```json5 { "clientId": "yourId", "clientSecret": "yourSecret" } ``` -------------------------------- ### Icecast Configuration Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/sources/icecast.mdx Example configuration for an Icecast source, specifying the base URL and additional supported metadata sources. ```json5 [ { "name": "myIcy", "enable": true, "data": { "url": "http://myIcecast.com/radio", "sources": ["icy", "ogg", "sevenhtml"] } } ] ``` -------------------------------- ### Custom Libre.fm Instance URL Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/clients/librefm.mdx Provides an example of how to configure a custom Libre.fm instance URL. This includes the protocol, domain, and any path prefix. ```text https://my.cool.libre.com/2.0/ ``` -------------------------------- ### Local ENV Configuration Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/configuration.mdx Set environment variables before running Multi Scrobbler in a local or Node.js installation. This is useful for development or single-user setups. ```shell SPOTIFY_CLIENT_ID=yourId SPOTIFY_CLIENT_SECRET=yourSecret npm run start ``` -------------------------------- ### Run Setup Script for Flatpak Build Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/development/flatpak.md Execute the setup script to automate the generation of offline sources and the building of the Flatpak app. Use the `-o` flag to overwrite existing sources, `-b` to specify the build directory, and `-y` to confirm settings without prompting. ```shell ./setup.sh -o -b /path/to/flatpak/build/dir ``` -------------------------------- ### Listenbrainz Source Configuration Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/sources/listenbrainz-source.mdx Example configuration for the Listenbrainz source. This JSON file should be placed in the config directory and named 'listenbrainz.json.example'. ```json { "id": "unique-id", "token": "your-user-token", "user": "your-username", "url": "https://api.listenbrainz.org/", "name": "optional-vanity-name" } ``` -------------------------------- ### Install Dependencies Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/README.md Installs project dependencies using Yarn. ```bash yarn ``` -------------------------------- ### Last.fm Source Configuration Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/sources/lastfm-source.mdx This example shows the configuration for the Last.fm source. It requires API credentials and optionally accepts a redirect URI and session. ```json { "configureAs": "source", "id": "my-lastfm-source", "apiKey": "YOUR_API_KEY", "secret": "YOUR_SECRET", "redirectUri": "http://localhost:9078/lastfm/callback", "session": "YOUR_SESSION_ID" } ``` -------------------------------- ### Subsonic Source Configuration Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/sources/subsonic.mdx Example JSON configuration for the Subsonic source. This file is typically loaded by the application. ```json { "SUBSONIC_ID": "your-unique-id", "SUBSONIC_USER": "your-username", "SUBSONIC_PASSWORD": "your-password", "SUBSONIC_URL": "http://your-subsonic-server.com/rest", "SUBSONIC_NAME": "My Subsonic Server" } ``` -------------------------------- ### ListenBrainz Client Configuration Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/clients/listenbrainz.mdx This example shows the structure of the ListenBrainz client configuration, including environment variables for authentication and server details. Ensure you replace placeholders with your actual ListenBrainz credentials and server information. ```json { "LZE_ID": "your_unique_id", "LZ_TOKEN": "your_user_token", "LZ_USER": "your_lz_username", "LZ_URL": "https://api.listenbrainz.org/", "LZ_NAME": "optional_vanity_name" } ``` -------------------------------- ### Example Docker Compose for Yandex Music Bridge Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/sources/yandex-music.mdx This snippet shows a complete Docker Compose setup including both the Multi-Scrobbler service and the yandex-music-bridge service. It highlights the necessary environment variables for each service to communicate and function correctly. Ensure you replace placeholder API keys and tokens with your actual credentials. ```yaml services: multi-scrobbler: image: foxxmd/multi-scrobbler container_name: multi-scrobbler environment: - TZ=Etc/GMT # ...your other sources/clients here # add for yandex music - YMBRIDGE_URL=http://yandex-music-bridge:9980 - YMBRIDGE_API_KEY=change-me volumes: - "./config:/config" ports: - "9078:9078" restart: unless-stopped yandex-music-bridge: image: ghcr.io/druidblack/yandex-music-bridge:latest environment: - TZ=Europe/Moscow - YM_TOKEN=AgAAAAACO3_345345 - YM_API_KEY=change-me - YM_PORT=9980 - YM_LANGUAGE=ru - YM_ENABLE_YNISON=true - YM_PUSH_TTL=45 - YM_QUEUE_CACHE_TTL=15 - YM_LOG_LEVEL=INFO ports: - "9980:9980" restart: unless-stopped ``` -------------------------------- ### Webhook Configuration Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/configuration.mdx Configure multiple webhook servers of different types within the main config.json file. This example shows how to set up Gotify and Ntfy webhooks. ```json5 { "sources": [ //... ], "clients": [ //... ], "webhooks": [ { "name": "FirstGotifyServer", "type": "gotify", "url": "http://192.168.0.100:8070", "token": "abcd" }, { "name": "SecondGotifyServer", "type": "gotify", //... }, { "name": "NtfyServerOne", "type": "ntfy", //... }, //... ] } ``` -------------------------------- ### Kodi URL Transformation Examples Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/sources/kodi.mdx Examples illustrating how different 'url' configurations in your file are transformed into the final URL used by multi-scrobbler to connect to Kodi. ```text | `url` | Transformed URL | |---------------------------------------|----------------------------------------------| | (none set) | `http://localhost:8080/jsonrpc` | | `kodi.mydomain.com` | `http://kodi.mydomain.com:8080/jsonrpc` | | `192.168.0.101:3456` | `http://192.168.0.101:3456/jsonprc` | | `mydomain.com:80/kodiReverse/jsonrpc` | `http://mydomain.com:80/kodiReverse/jsonrpc` | ``` -------------------------------- ### Last.fm Client Configuration Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/clients/lastfm.mdx Provides an example of the JSON configuration for the Last.fm client, including essential API credentials and optional settings like redirect URI and session. ```json { "id": "lastfm", "name": "My Last.fm Account", "apiKey": "YOUR_API_KEY", "secret": "YOUR_API_SECRET", "redirectUri": "http://localhost:9078/lastfm/callback", "session": "YOUR_SESSION_ID" } ``` -------------------------------- ### Configuration Example: Localhost to IP Address Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/FAQ.md This example demonstrates how to change the callback URL from a localhost address to a specific IP address when configuring sources like Spotify or Deezer. This is necessary if Multi-Scrobbler is not running on the same machine as your browser. ```text EX `http://localhost:9078/api/webscrobbler` -> `http://192.168.0.140:9078/api/webscrobbler` ``` -------------------------------- ### Clone Repository and Install Dependencies Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/installation/installation.mdx Clone the latest release tag of the repository and install project dependencies using npm. ```shell git clone --branch https://github.com/FoxxMD/multi-scrobbler.git cd multi-scrobbler nvm use # optional, to set correct Node version npm install npm run docs:install && npm run build npm run start ``` -------------------------------- ### Jellyfin Configuration Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/sources/jellyfin.mdx Example JSON configuration for Jellyfin. This includes API key, URL, and user settings. Ensure your Jellyfin server version is 10.7 or greater. ```json { "jellyfin": { "url": "http://localhost:8096", "apiKey": "YOUR_JELLYFIN_API_KEY", "usersAllow": [ "jellyfin_username" ], "librariesAllow": [ "Movies", "TV Shows" ], "additionalAllowedLibraryTypes": [ "Music", "Mixed" ], "allowMediaTypes": [ "Audio", "Book" ] } } ``` -------------------------------- ### Rocksky Source Configuration Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/sources/rocksky-source.mdx When using file-based configuration, ensure you include `"configureAs": "source"` to designate this as a source. This example shows the required environmental variables for Rocksky source configuration. ```json { "configureAs": "source", "SOURCE_ROCKSKY_ID": "your_unique_id", "SOURCE_ROCKSKY_HANDLE": "your_handle.bsky.social", "SOURCE_ROCKSKY_KEY": "your_rocksky_api_key" } ``` -------------------------------- ### Koito API Key Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/clients/koito.mdx An example of a Koito API key. This key is used for authentication when connecting to your Koito server. ```text pM195xPV98CDpk0QW47FIIOR8AKATAX5DblBF-Jq0t1MbbKL ``` -------------------------------- ### Example Docker Compose with MusicBrainz Configuration Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/transforms/musicbrainz.mdx Demonstrates a full Docker deployment using Jellyfin and Maloja, configuring MusicBrainz transforms via environment variables. ```yaml services: multi-scrobbler: image: foxxmd/multi-scrobbler container_name: multi-scrobbler environment: - MB_CONTACT=contact@mydomain.com - MB_PRESETS=default,sensible,native - JELLYFIN_URL=192.168.0.110:8096 - JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56b - JELLYFIN_USER=MyUser - JELLYFIN_TRANSFORMS=musicbrainz - MALOJA_URL=http://192.168.0.100:42010 - MALOJA_API_KEY=myApiKey volumes: - "./config:/config" ports: - "9078:9078" restart: unless-stopped ``` -------------------------------- ### Configuration Example: Spotify/Deezer Callback URL Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/FAQ.md This example shows how to update the callback URL for services like LastFM when Multi-Scrobbler is hosted on a different IP address than localhost. Ensure the web interface is accessible from your browser using this address. ```text EX `http://localhost:9078/lastfm/callback` -> `http://192.168.0.220:9078/lastfm/callback` ``` -------------------------------- ### Manage Systemd User Service Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/installation/service.md Reloads Systemd to recognize the new service, enables it to start on login, and starts the service immediately. ```bash systemctl daemon-reload systemctl --user enable multi-scrobbler.service systemctl --user start multi-scrobbler.service ``` -------------------------------- ### Artist Extraction from Common Patterns Example 2 Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/duplicates.mdx Shows another example of extracting artists from a string with common joiners like 'feat.' and track information. ```text Childish Gambino - 12.38 (feat. 21 Savage, Ink & Kadhja Bonet) becomes Childish Gambino, 21 Savage, Ink, Kadhja Bonet - 12.38 ``` -------------------------------- ### Azuracast Station Shortcode JSON Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/sources/azuracast.mdx An example JSON response from the Azuracast API, showing where to find the 'shortcode' property for a station, which can be used as its identifier. ```json [ { "id": 1, "name": "My Cool Station", "shortcode": "my-cool-station", "description": "Re-broadcasts of my cool music", "frontend": "icecast", "backend": "liquidsoap", ... } ] ``` -------------------------------- ### Azuracast WebSocket URL Examples Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/sources/azuracast.mdx Examples of how multi-scrobbler constructs the WebSocket URL for Azuracast based on the provided configuration. MS automatically appends the required path if not explicitly given. ```text URL From Config => MS Uses 'ws://192.168.0.101' => ws://192.168.0.101/api/live/nowplaying/websocket 'ws://azura.mydomain.com' => ws://azura.mydomain.com.com/api/live/nowplaying/websocket 'wss://mydomain.com/custom/azura/ws' => wss://mydomain.com/custom/azura/ws ``` -------------------------------- ### Example AIO Configuration Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/configuration.mdx This is an example of an All-In-One (AIO) configuration file for Multi Scrobbler. It is used when you have many sources, multiple accounts of the same type, or multiple scrobble clients. It allows for setting default options for sources, clients, and global settings for Multi Scrobbler itself. ```json5 { "sources": [ { "name": "Plex Account 1", "type": "plex", "options": { "baseUrl": "https://your-plex-server.com", "token": "YOUR_PLEX_TOKEN" } }, { "name": "Spotify Account 1", "type": "spotify", "options": { "clientId": "YOUR_SPOTIFY_CLIENT_ID", "clientSecret": "YOUR_SPOTIFY_CLIENT_SECRET", "refreshToken": "YOUR_SPOTIFY_REFRESH_TOKEN" } } ], "clients": [ { "name": "Maloja Server 1", "type": "maloja", "options": { "baseUrl": "https://your-maloja-server.com", "apiKey": "YOUR_MALOJA_API_KEY" } } ], "defaults": { "sources": { "options": { "quality": "highest" } }, "clients": { "options": { "batchSize": 100 } } }, "options": { "logLevel": "info", "monitoring": { "enabled": true, "webhookUrl": "https://your-monitoring-service.com/webhook" } } } ``` -------------------------------- ### Native Stage Rules Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/transforms/native.mdx Demonstrates how to apply rules to control the Native Stage's transformations on specific fields like title, artists, and album. ```json5 { "type": "native", "title": false, "artists": { "when": {/* ... */} }, "album": true } ``` -------------------------------- ### Character and String Normalization Examples Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/duplicates.mdx Demonstrates how symbols, multiple whitespaces, and character casing are normalized, and how non-ASCII characters are converted to their ASCII counterparts. ```text this string! is the. same => this string is the same this string is the same => this string is the same ThIs STRING iS THe SAMe => this string is the same Dina Ögon => Dina Ogon Nanã => Nana ``` -------------------------------- ### Customized Flow Control Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/transforms/transforms.mdx Illustrates customized flow control where a stage's execution is explicitly managed. This example configures the 'musicbrainz' stage to stop subsequent stages on success and continue only on failure, ensuring the 'native' stage runs only if 'musicbrainz' fails to find a match. ```json5 // ... "options": { "playTransform": { "preCompare": [ { // if musicbrainz is successful then do NOT run native, // only run native if musicbrainz fails to find a match (onFailure) "type": "musicbrainz", "name": "MyMB" "onSuccess": "stop", "onFailure": "continue" }, { "type": "native", "name": "MyNative" } ] } } ``` -------------------------------- ### Mopidy HTTP Configuration Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/sources/mopidy.mdx Ensure the hostname and port in your Mopidy configuration match the connection details used by multi-scrobbler. ```ini [http] hostname = localhost port = 6680 ``` -------------------------------- ### Libre.fm Redirect URL Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/clients/librefm.mdx Specifies the base URL for the redirect callback after authentication. This should match the multi-scrobbler dashboard URL followed by '/librefm/callback'. ```text http://192.168.0.100:9078/librefm/callback ``` -------------------------------- ### Docker Compose ENV Configuration Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/configuration.mdx Configure Multi Scrobbler using environment variables within a Docker Compose setup. This allows for declarative management of environment variables for the service. ```yaml services: multi-scrobbler: image: foxxmd/multi-scrobbler environment: - SPOTIFY_CLIENT_ID=yourId - SPOTIFY_CLIENT_SECRET=yourSecret - MALOJA_URL=http://domain.tld:42010 - MALOJA_API_KEY=1234 # ... # ... ``` -------------------------------- ### File Configuration Structure Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/src/components/GenericConfiguration.mdx Displays the structure of the File Configuration for a specific type of client or source, showing all possible properties, their shape, and descriptions. Use this to understand how to write a valid config file. ```json { "sources": { "my-source": { "name": "my-source", "type": "my-source", "config": { "some_property": "some_value" } } }, "clients": { "my-client": { "name": "my-client", "type": "my-client", "config": { "another_property": "another_value" } } } } ``` -------------------------------- ### Example Scrobble Data Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/transforms/musicbrainz.mdx Example JSON representing a scrobbled track with its title, artists, and album. ```json { "track": "Price", "artists": ["ATLUS Sound Team"], "album": "PERSONA5 ORIGINAL SOUNDTRACK" } ``` -------------------------------- ### Update Local Node.js Installation Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/updating/updating.mdx For local installations cloned from the repository, pull the latest changes and restart the application. ```shell git pull ``` -------------------------------- ### Start Maloja Docker Container Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/clients/maloja.mdx Command to start the Maloja Docker container in detached mode from the ~/malojaData directory. ```shell docker compose up -d ``` -------------------------------- ### Libre.fm Source Configuration Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/sources/librefm-source.mdx Configuration for the Libre.fm source. Use the same registration instructions as the Libre.fm client, but set `"configureAs": "source"`. ```json { "configureAs": "source", "id": "unique-id", "clients": [ { "id": "client-id", "name": "client-name" } ] } ``` -------------------------------- ### Discord Artwork URL Examples (Not HTTPS) Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/clients/discord/discord-headless.mdx These examples demonstrate artwork URLs that will not be used because they are not using the HTTPS protocol. ```text http://foobar.com/cool.jpg <-- NOT allowed, not http http://192.168.0.112/fun.png <-- NOT allowed, not http ``` -------------------------------- ### URI Blacklist Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/sources/mopidy.mdx Use 'uriBlacklist' to prevent scrobbling from specific Mopidy sources. This example prevents scrobbling from SoundCloud. ```json { "uriBlacklist": ["soundcloud"] } ``` -------------------------------- ### Update Docker Compose Installation Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/updating/updating.mdx Use these commands to pull the latest Docker image and restart the containers for a Docker Compose installation. ```shell docker compose pull docker compose up -d ``` -------------------------------- ### Word-Order Invariant Text Similarity Example 2 Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/duplicates.mdx Illustrates another example of word-order invariant text similarity normalization for comparison. ```text String A: you, doin hwat are => you doin hwat are String B: what are you doing => you doing what are ``` -------------------------------- ### Discord Artwork URL Examples (DISCORD_ARTWORK=true) Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/clients/discord/discord-headless.mdx When DISCORD_ARTWORK is set to 'true', these examples show that all HTTPS URLs are allowed, regardless of the service. ```text https://archive.org/my/dir/myimage.jpg <-- allowed, is https and known service http://foobar.com/cool.jpg <-- NOT allowed, not http https://example.com/cool.jpg <-- allowed, is https https://anything.com/neat.jpg <-- allowed, is https ``` -------------------------------- ### Full Docker Deploy with ENV Configuration Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/transforms/native.mdx Example of a full Docker deployment using environment variables to configure multi-scrobbler, including setting the native transform stage for Jellyfin source. ```yaml services: multi-scrobbler: image: foxxmd/multi-scrobbler container_name: multi-scrobbler environment: - JELLYFIN_URL=192.168.0.110:8096 - JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56b - JELLYFIN_USER=MyUser - JELLYFIN_TRANSFORMS=native # applies native Stage to preTransform of Jellyfin source - MALOJA_URL=http://192.168.0.100:42010 # maloja receives enhanced scrobble from Jellyfin - MALOJA_API_KEY=myApiKey volumes: - "./config:/config" ports: - "9078:9078" restart: unless-stopped ``` -------------------------------- ### Teal.fm Client Configuration Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/clients/tealfm.mdx Configuration for the Teal.fm client, including required environment variables for ID, ATProto handle/DID, and App Password. An optional vanity name can also be set. ```json { "TEAMFM_ID": "your_unique_id", "TEALFM_IDENTIFIER": "your_handle.bsky.social or your_did", "TEALFM_APP_PW": "your_app_password", "TEALFM_NAME": "optional_vanity_name" } ``` -------------------------------- ### Example Play Data Transformation Rules Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/transforms/transforms.mdx Demonstrates how to configure rules to apply transformations to specific parts of Play data like title, artists, album, and meta. Use 'when' conditions for targeted application. ```json5 { "type": "native", // ... "title": false, // will not apply any changes to Play title "artists": { "when": {/* ... */}, // will only apply changes to Play artists if "when" is satisfied /* ... */ }, "albumArtists": true, // will always apply changes to Play album artists "album": true, // will always apply changes to Play album "duration": true, // will always apply changes to Play duration (length of track) "meta": true, // will always apply changes to Play meta (MBIDs, spotify links, etc...) } ``` -------------------------------- ### Spotify Configuration File Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/_kitchensink_configs/_multi-sources-clients.mdx Configure Spotify source using a JSON5 file. Ensure the 'id' matches the one used in other configurations. ```json5 [ { "id": "foxxSpotify", "name": "Foxx Spotify", "data": { "clientId": "a89cba1569901a0671d5a9875fed4be1", "clientSecret": "ec42e09d5ae0ee0f0816ca151008412a", "redirectUri": "http://localhost:9078/callback", "interval": 60 } } ] ``` -------------------------------- ### Native Stage Configuration Options Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/transforms/native.mdx Illustrates the configuration properties available for the Native Stage, including custom delimiters, ignored artists, and parsing sources. ```json5 { "type": "native", "delimitersExtra": [",", "/", "|"], "delimiters": [" - "], "artistsIgnore": ["^The$', /^The\s.+$/"], "artistsParseFrom": ["artists", "title"], "artistsParseMonolithicOnly": true } ``` -------------------------------- ### YouTubeTV Authentication Code Example Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/sources/youtube-music.mdx This is an example of an error message that includes an authentication code for YouTubeTV. Due to Google restrictions, this authentication method is unlikely to work. ```text ERROR: Sign in with the code 'CLV-KFA-BVKY' using the authentication link on the dashboard or https://www.google.com/device ``` -------------------------------- ### MusicCast URL Examples Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/sources/yamaha-musiccast.mdx Shows how to format the URL for MusicCast devices. If only a domain/IP:PORT is provided, the default API path is appended. For custom URLs or reverse proxies, provide the explicit base path. ```text http://192.168.0.101 http://mydomain.com/reverseProxy/cast ``` -------------------------------- ### Run with Environment Variables Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/installation/installation.mdx Execute the application using environment variables for configuration, specifying API keys and URLs for services like Jellyfin and Maloja. ```shell JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56bd6540c JELLYFIN_URL=192.168.0.101:8096 JELLYFIN_USER=MyUser MALOJA_URL="http://domain.tld" node src/index.js ``` -------------------------------- ### Deploy Website (using SSH) Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/README.md Builds and deploys the website using SSH. Assumes GitHub pages hosting. ```bash USE_SSH=true yarn deploy ``` -------------------------------- ### Discord Artwork URL Examples (Default, No DISCORD_ARTWORK) Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/clients/discord/discord-headless.mdx When DISCORD_ARTWORK is not set, these examples show which HTTPS artwork URLs are allowed based on known music services. ```text https://archive.org/download/dir/myimage.jpg <-- allowed, is https and known service https://spotify.com/assets/cover.png?size=1000 <-- allowed, is https and known service https://example.com/cool.jpg <-- NOT allowed, is https but not a known service and DISCORD_ARTWORK is not set https://anything.com/neat.jpg <-- NOT allowed, is https but not a known service and DISCORD_ARTWORK is not set ``` -------------------------------- ### Koito Client Configuration File Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/_kitchensink_configs/_multi-sources-clients.mdx Configure Koito as a client using a JSON5 file. Provide the token, username, and URL for the Koito service. ```json5 [ { "id": "foxxKoi", "name": "Foxx Koito", "configureAs": "client", "data": { "token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b", "username": "admin", "url": "http://192.168.0.100:4110" } } ] ``` -------------------------------- ### Discord Artwork URL Examples (DISCORD_ARTWORK=mycdn,jellyfin) Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/clients/discord/discord-headless.mdx When DISCORD_ARTWORK is set to a list of keywords, these examples show that HTTPS URLs are allowed only if they contain one of the specified keywords. ```text https://archive.org/my/dir/myimage.jpg <-- allowed, is https and known service http://foobar.com/cool.jpg <-- NOT allowed, not http https://example.com/cool.jpg <-- NOT allowed, is https but does not contain "mycdn" or "jellyfin" https://jellyfin.mydomain.com/neat.jpg <-- allowed, is https and contains "jellyfin" ``` -------------------------------- ### Using the Compare Hook Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/configuration/transforms/transforms.mdx This example demonstrates the structure for using the 'compare' hook, which allows modifications to be made specifically for comparison purposes and does not affect downstream data. It shows how to modify 'candidate' and 'existing' Play data. ```json5 [ { "name": "myLastFm", // ... "options": { "playTransform": { "compare": [ { "candidate": {/* ... */}, // modify the "new" Play being compared "existing": {/* ... */}, // modify all "existing" Play/Scrobbles the new Play is being compared against } ], } } } ] ``` -------------------------------- ### Example of Debug Data JSON Structure Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/help.mdx This is an example of how debug data should be formatted when pasted into an issue or comment using fenced code blocks. It helps preserve the structure for clarity. ```json { "input": { "aProperty: 123, "foo": "bar" } } ``` -------------------------------- ### Build Static Website Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/README.md Generates static website content into the build directory for hosting. ```bash yarn build ``` -------------------------------- ### Example YTM History Change Log Source: https://github.com/foxxmd/multi-scrobbler/blob/master/docsite/docs/FAQ.md This is an example of the log output generated when `logDiff` is enabled, showing how YTM history items have changed. This output is essential for diagnosing scrobble detection problems. ```log [Ytmusic - MyYTM] Changes from last seen list: 1. (tuhe1CpHRxY) KNOWER - I’m The President --- undefined => Moved - Originally at 6 2. (Mtg8V6Xa2nc) Vulfpeck - Romanian Drinking Song --- Schvitz => Moved - Originally at 1 3. (rxbCaiyYSXM) Nightmares On Wax - You Wish --- In A Space Outta Sound => Moved - Originally at 2 4. (tMt_YXr90AM) Gorillaz - O Green World --- undefined => Moved - Originally at 3 ... ```