November 19, 20205 yr Application Name: multi-scrobbler Application Site: https://github.com/FoxxMD/multi-scrobbler Github Repo: https://github.com/FoxxMD/multi-scrobbler Docker Hub: https://hub.docker.com/r/foxxmd/multi-scrobbler Template Repo: https://github.com/FoxxMD/unraid-docker-templates Overview multi-scrobbler is a web application for scrobbling music you play from multiple sources to multiple scrobble clients. It's aim is 1) to provide a self-hosted alternative to capturing track plays and 2) fill in the gaps for track sources and scrobble clients that don't have existing methods of communication. I am the developer of multi-scrobbler. Current state of connectivity for m-s: Track Sources (can capture plays from): Spotify Plex or Tautulli Subsonic API compatible media servers (like Airsonic) Jellyfin Deezer Last.fm Youtube Music Mopidy ListenBrainz JRiver Kodi Scrobble Clients (can scrobble plays to): Maloja Last.fm ListenBrainz Feature highlights of m-s: Support configuration for single or multiple users (scrobble for your friends and family!) Handles Spotify, Last.fm, and Dzzer authentication for unattended use after first-time setup Logs track discovery/scrobbles to rotating daily files Configurable using JSON files or environmental variables (through Docker or Node) Provides static web page for displaying source/client status, discovery statistics, and recent log activity Usage/Configuration Configuration of m-s is done through JSON config files or through environmental variables (set in the unraid docker template). The CA template has default settings to map a config and logs directory. logs is optional and config is only required if you are using spotify. There is a minimal setup example on the readme for using Docker to scrobble from Spotify to Maloja. In the docker example change the environmental variables into Variables in your unraid template. Otherwise you can find examples of more thorough JSON setups in the configuration docs or in the kitchen sink example. Support/Feature Request Please feel free to give me any feedback on anything (unclear instructions, features you'd like to see, problems you are experiencing, etc.) as I am still developing this app: Refer first to the FAQ Please use github issues if you can as this will be easier for me to track. 2023-02-22 Update If you have an existing multi-scrobbler container and have just updated you may need to update your unraid app configuration! See here for all 0.4.0 changes but the TLDR for unraid: Add Variable PUID=99 Add Variable PGID=100 Remove Path "Logs" Change Path "Config" Container Path from /home/node/config to /config Edited March 20, 20233 yr by FoxxMD add more sources/clients to description
September 28, 20214 yr Trying to get this setup and working and having issues with the last.fm client. It is telling me "Status: Auth Interaction Required". When I click the link to (re)authenticate or initialize I get various forms of failure. I have created an API key and put the values in to the config.json. I am unsure of how it should function when I get passed to lastfm and then back to the server http://tower.local:9078//lastfm/callback?state=FrankLFM&token=XXXXXXXXXXXX At this point the page says OK and that is it. Heading back to the application it still says that last.fm is not authenticated. Any idea what I am missing? 2021-09-28T09:33:10-04:00 info : [App ] Server started at http://localhost:9078 2021-09-28T09:33:10-04:00 info : [Sources ] (partyPlex) plex source initialized 2021-09-28T09:33:10-04:00 info : [Source - Plex - partyPlex] Initializing with the following filters => Users: N/A | Libraries: party | Servers: N/A 2021-09-28T09:33:10-04:00 info : [Sources ] (FrankPlex) plex source initialized 2021-09-28T09:33:10-04:00 info : [Source - Plex - FrankPlex] Initializing with the following filters => Users: frank | Libraries: N/A | Servers: N/A 2021-09-28T09:33:10-04:00 warn : [Scrobblers ] (FrankLFM) lastfm client auth failed. 2021-09-28T09:33:10-04:00 error : [Client Lastfm - FrankLFM] Error: Invalid session key - Please re-authenticate at CWD/node_modules/lastfm-node-client/lib/ApiRequest.js:136:11 at processTicksAndRejections (internal/process/task_queues.js:95:5) at async LastfmApiClient.callApi (file://CWD/apis/LastfmApiClient.js:84:20) at async LastfmApiClient.testAuth (file://CWD/apis/LastfmApiClient.js:148:30) at async LastfmScrobbler.testAuth (file://CWD/clients/LastfmScrobbler.js:34:27) at async ScrobbleClients.addClient (file://CWD/clients/ScrobbleClients.js:240:27) at async ScrobbleClients.buildClientsFromConfig (file://CWD/clients/ScrobbleClients.js:195:17) at async file://CWD/index.js:128:9 2021-09-28T09:33:10-04:00 error : [Client Lastfm - FrankLFM] Could not successfully communicate with Last.fm API 2021-09-28T09:33:10-04:00 error : [API - Lastfm - FrankLFM] Testing auth failed 2021-09-28T09:33:10-04:00 info : [Scrobblers] (FrankLFM) lastfm client initialized Edited September 28, 20214 yr by Syco54645
September 28, 20214 yr Author @Syco54645 I'm going to need more detail than that. Quote When I click the link to (re)authenticate or initialize I get various forms of failure. What failures exactly? Do you see anything in the logs for the multi-scrobbler container? I think most likely your callback url is incorrect -- it has to be registered with your last.fm application and it needs to be exactly where last.fm will redirect back to multi-scrobbler.
September 28, 20214 yr 5 hours ago, FoxxMD said: @Syco54645 I'm going to need more detail than that. What failures exactly? Do you see anything in the logs for the multi-scrobbler container? I think most likely your callback url is incorrect -- it has to be registered with your last.fm application and it needs to be exactly where last.fm will redirect back to multi-scrobbler. I posted on github after I saw the message to post there instead so will continue there. Posting a reply currently as it looks like all config values are correct. To answer the various failures were caused by not including a callback url. The comment for that line in the json samples is down a line and caused confusion on my end. Edited September 28, 20214 yr by Syco54645
February 22, 20233 yr Author 2023-02-22 Update If you have an existing multi-scrobbler container and are updating you may need to update your unraid app configuration! See here for all 0.4.0 changes but the TLDR for unraid: Add Variable PUID=99 Add Variable PGID=100 Remove Path "Logs" Change Path "Config" Container Path from /home/node/config to /config Edited February 27, 20233 yr by FoxxMD
September 21, 20241 yr Can someone tell me why my connected lastfm account doesn't send recent scrobbles to multi-scrobber? Maybe it helps, I cant access this docker via "localhost" domain. Instead of that I use IP:PORT.
September 23, 20241 yr Author @rogales multi-scrobbler is like middleware that gets your listening activity from Sources like Spotify, Plex, etc... and then forwards them to Clients like Last.fm, Listenbrainz, and Maloja. In your screenshot you have Last.fm configured as a Client (MS will sends scrobbles to it) but you do not have Sources configured to get scrobbles from.
September 23, 20241 yr Ohh. so that's my problem. is there any possibility to add sources to multiscrobber?
September 23, 20241 yr Author @rogales There are many existing Sources to choose from. You can even use some Clients as Sources like a relay IE Your favorite app scrobbles to Last.FM -> mutli-scrobbler uses Last.fm as a Source -> Scrobbles to Maloja If you are talking about adding a new Source not already coded for yeah I can do that but it depends on if the program/service provides connectivity. You can describe your scenario here but I'd prefer a new issue on github as it's easier for me to keep track of (and take a look at existing issues to see if your Source has already been requested). Edited September 23, 20241 yr by FoxxMD
October 10, 20241 yr Hey. I've managed to make multi-scrobbler work like I wanted to, but now I'm trying to import my last.fm library, but it fails. I've posted my problem here: https://github.com/krateng/maloja/issues/382 so if You had time, could you take a look on this one? Any help would be much apperaciated. Thanks UPDATE: resolved my issue with a small script. Your maloja docker repo still has https://benjaminbenben.com/lastfm-to-csv/ way of importing. Unfortunately site stops while trying to fetch the whole list, so... I've downloaded my list through https://lastfm.ghan.nl/export/ site, and after that, I've used script below to convert whole library to benjaminsbenben code. and after the whole process maloja import .csv file was imported completely. import csv from datetime import datetime # Funkcja do konwersji formatu daty def convert_date(date_str): # Usuwanie przecinka i przekształcanie daty na format bez przecinka return datetime.strptime(date_str, "%d %b %Y, %H:%M").strftime("%d %b %Y %H:%M") # Ścieżki plików (zamień na własne ścieżki) input_file = 'rogal.csv' output_file = 'proper.csv' # Otwieranie pliku wejściowego with open(input_file, 'r', newline='', encoding='utf-8') as csvfile: # Czytanie danych z pliku CSV reader = csv.DictReader(csvfile) # Otwieranie pliku wyjściowego with open(output_file, 'w', newline='', encoding='utf-8') as outfile: # Zapisz nowy plik CSV writer = csv.writer(outfile) # Iteracja przez każdą linię w pliku wejściowym for row in reader: artist = row['artist'] # Wykonawca album = row['album'] # Tytuł płyty track = row['track'] # Tytuł utworu date = convert_date(row['utc_time']) # Data (zmieniona na nowy format) # Zapisz dane w nowym formacie writer.writerow([artist, album, track, date]) print("Konwersja zakończona. Wynik zapisano w pliku 'wyjsciowy.csv'.") (and here small detail, on how to put Your docker in a shell mode:) docker run -it --entrypoint sh -v /mnt/user/appdata/maloja:/config -e MALOJA_DATA_DIRECTORY=/config krateng/maloja Edited October 17, 20241 yr by rogales
November 14, 20241 yr Hi! i'm trying to set up a Multi-Scrobbler instance on my server but i'm not able to make it work From source, i want to use mpd, installed with MoOde on a Raspberry Pi, and for client i want to use a listenbrainz.org instance. I manage to connect to both, and make it work. I mean, Multi-scrobbles see both. But, it does not scrobble. Usually it demands at least 240 seconds to scrobble, wich is huge and many songs are under this time, and then it says there are an error with de Musicbrainz api. I put a scren of the log if someone can help me. Thx you in advance.
November 14, 20241 yr First of all; You want Your ListenBrainz instance as a client, or as source? Secondly, You have 400 Error so it's not capable to connect to.
November 14, 20241 yr Hi, i specify it on my first post: "From source, i want to use mpd, installed with MoOde on a Raspberry Pi, and for client i want to use a listenbrainz.org instance" Afer, i must understand, from your message, that my issue is that listenbrainz is not capable to connect? it can be, but, if is the case, it is a bug because my instance is well config. and, anything of this, answer my question: why 240s is the fixed length to scrobble a song, even if the song does not have so much seconds Edited November 14, 20241 yr by Calaat
November 14, 20241 yr Now it is working, but it is missinng almost the half of tracks, the ones that not have the 240s and others not recognized, which make non sense because the tags are well set, because i have set myself.
January 23Jan 23 Hello,i get an error in ms which i can't solve by myself. Scrobbling stoped working in ms and maloja sees no new songs. I'm totally clueless... deezer.json should be fine, arl is still correct. I found the "agressive" and "true" mode for double song import. But that didn't helped here.[2026-01-24 00:24:30.655 +0100] ERROR : [App] [Sources] [Deezer - DeezerARL] Cannot start polling because error occurred while processing backlog Error: Cannot start polling because error occurred while processing backlog at DeezerInternalSource.poll (CWD/src/backend/sources/AbstractSource.ts:344:31) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) caused by: Error: Error occurred while fetching backlogged plays at DeezerInternalSource.processBacklog (CWD/src/backend/sources/AbstractSource.ts:283:23) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async DeezerInternalSource.poll (CWD/src/backend/sources/AbstractSource.ts:342:13) caused by: TypeError: resp.results.error is not iterable at DeezerInternalSource.getRecentlyPlayed (CWD/src/backend/sources/DeezerInternalSource.ts:143:37) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async DeezerInternalSource.getBackloggedPlays (CWD/src/backend/sources/DeezerInternalSource.ts:203:83) at async DeezerInternalSource.processBacklog (CWD/src/backend/sources/AbstractSource.ts:281:32) at async DeezerInternalSource.poll (CWD/src/backend/sources/AbstractSource.ts:342:13) Edited January 24Jan 24 by Domin1k
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.