mirror of
https://github.com/FoxxMD/multi-scrobbler.git
synced 2026-09-03 05:10:00 +03:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b94b2e368c | ||
|
|
ea08239aeb | ||
|
|
7456ab647b | ||
|
|
9ee6a2a01c | ||
|
|
898938cbaf | ||
|
|
b9b81a3152 |
@@ -12,10 +12,10 @@ jobs:
|
||||
name: Deploy to GitHub Pages
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 #v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f #6.3.0
|
||||
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 #7.0.0
|
||||
with:
|
||||
node-version: 24
|
||||
cache: npm
|
||||
@@ -45,7 +45,7 @@ jobs:
|
||||
# Popular action to deploy to GitHub Pages:
|
||||
# Docs: https://github.com/peaceiris/actions-gh-pages#%EF%B8%8F-docusaurus
|
||||
- name: Deploy to GitHub Pages
|
||||
uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e #4.0.0
|
||||
uses: peaceiris/actions-gh-pages@84c30a85c19949d7eee79c4ff27748b70285e453 #4.1.0
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
# Build output to publish to the `gh-pages` branch:
|
||||
|
||||
@@ -13,7 +13,7 @@ jobs:
|
||||
permissions:
|
||||
packages: write
|
||||
steps:
|
||||
- uses: dataaxiom/ghcr-cleanup-action@cd0cdb900b5dbf3a6f2cc869f0dbb0b8211f50c4 #1.0.16
|
||||
- uses: dataaxiom/ghcr-cleanup-action@d52806a0dc70b430571a37da1fde39733ffd640f #1.2.2
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
|
||||
+10
-10
@@ -78,14 +78,14 @@ jobs:
|
||||
|
||||
- name: Login to Docker Hub
|
||||
if: ${{ vars.DOCKERHUB_SLUG != '' }}
|
||||
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
||||
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
if: ${{ vars.GHCR_SLUG != '' }}
|
||||
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
||||
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
@@ -94,13 +94,13 @@ jobs:
|
||||
# metadata extract for docker labels/image names is done in merge job
|
||||
|
||||
- name: Set up Buildx
|
||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 #v3.11.1
|
||||
uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e #v4.3.0
|
||||
|
||||
# https://github.com/docker/build-push-action/issues/671#issuecomment-1619353328
|
||||
# for caching
|
||||
- name: Build and push by digest
|
||||
id: build
|
||||
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 #v6.18.0
|
||||
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a #v7.3.0
|
||||
with:
|
||||
# specify foreign repo#sha from PR that is used to build image
|
||||
context: ${{github.event.pull_request.head.repo.clone_url}}#${{github.event.pull_request.head.sha}}
|
||||
@@ -120,7 +120,7 @@ jobs:
|
||||
touch "/tmp/digests/${digest#sha256:}"
|
||||
|
||||
- name: Upload digest
|
||||
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f #7.0.0
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a #7.0.1
|
||||
with:
|
||||
name: digests-${{ env.PLATFORM_PAIR }}
|
||||
path: /tmp/digests/*
|
||||
@@ -147,25 +147,25 @@ jobs:
|
||||
|
||||
- name: Login to Docker Hub
|
||||
if: ${{ vars.DOCKERHUB_SLUG != '' }}
|
||||
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
||||
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
if: ${{ vars.GHCR_SLUG != '' }}
|
||||
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
||||
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435
|
||||
uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e
|
||||
|
||||
- name: Extract metadata (tags, labels)
|
||||
id: meta
|
||||
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf #6.0.0
|
||||
uses: docker/metadata-action@dc802804100637a589fabce1cb79ff13a1411302 #6.2.0
|
||||
with:
|
||||
images: |
|
||||
${{ vars.DOCKERHUB_SLUG }}
|
||||
@@ -223,7 +223,7 @@ jobs:
|
||||
if: contains(github.event.pull_request.labels.*.name, 'safe to test')
|
||||
steps:
|
||||
- name: Create comment
|
||||
uses: marocchino/sticky-pull-request-comment@d4d6b0936434b21bc8345ad45a440c5f7d2c40ff #3.0.3
|
||||
uses: marocchino/sticky-pull-request-comment@5770ad5eb8f42dd2c4f34da00c94c5381e49af88 #3.0.5
|
||||
with:
|
||||
recreate: true
|
||||
header: "pr-release"
|
||||
|
||||
@@ -74,7 +74,7 @@ jobs:
|
||||
|
||||
|
||||
- name: Check out the repo
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 #v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
@@ -102,14 +102,14 @@ jobs:
|
||||
|
||||
- name: Login to Docker Hub
|
||||
if: ${{ github.event_name != 'pull_request' && vars.DOCKERHUB_SLUG != '' }}
|
||||
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
||||
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
if: ${{ github.event_name != 'pull_request' && vars.GHCR_SLUG != '' }}
|
||||
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
||||
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
@@ -118,13 +118,13 @@ jobs:
|
||||
# metadata extract for docker labels/image names is done in merge job
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 #v3.11.1
|
||||
uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e #v4.3.0
|
||||
|
||||
# https://github.com/docker/build-push-action/issues/671#issuecomment-1619353328
|
||||
# for caching
|
||||
- name: Build and push by digest
|
||||
id: build
|
||||
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 #v6.18.0
|
||||
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a #v7.3.0
|
||||
with:
|
||||
build-args: |
|
||||
APP_BUILD_VERSION=${{steps.appversion.outputs.appversion}}
|
||||
@@ -143,7 +143,7 @@ jobs:
|
||||
env:
|
||||
VARS_DIGEST: ${{ steps.build.outputs.digest }}
|
||||
- name: Upload digest
|
||||
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f #7.0.0
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a #7.0.1
|
||||
with:
|
||||
name: digests-${{ env.PLATFORM_PAIR }}
|
||||
path: /tmp/digests/*
|
||||
@@ -170,25 +170,25 @@ jobs:
|
||||
|
||||
- name: Login to Docker Hub
|
||||
if: ${{ github.event_name != 'pull_request' && vars.DOCKERHUB_SLUG != '' }}
|
||||
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
||||
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
if: ${{ github.event_name != 'pull_request' && vars.GHCR_SLUG != '' }}
|
||||
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
||||
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435
|
||||
uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e
|
||||
|
||||
- name: Extract metadata (tags, labels)
|
||||
id: meta
|
||||
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf #6.0.0
|
||||
uses: docker/metadata-action@dc802804100637a589fabce1cb79ff13a1411302 #6.2.0
|
||||
with:
|
||||
images: |
|
||||
${{ vars.DOCKERHUB_SLUG }}
|
||||
|
||||
@@ -20,16 +20,16 @@ jobs:
|
||||
steps:
|
||||
- name: Check out the repo (gha)
|
||||
if: ${{ !env.ACT }}
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 #v7.0.1
|
||||
with:
|
||||
ref: ${{ inputs.ref }}
|
||||
persist-credentials: false
|
||||
|
||||
- name: Check out the repo (act)
|
||||
if: ${{ env.ACT }}
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 #v7.0.1
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f #6.3.0
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 #7.0.0
|
||||
with:
|
||||
node-version: ${{ inputs.node-version }}
|
||||
cache: 'npm'
|
||||
|
||||
@@ -26,7 +26,7 @@ To monitor and re-scrobble activity **from** Rocksky create a [Rocksky (Source)]
|
||||
|
||||
<DetailsAdmo type="important" summary="Your Data Is Public">
|
||||
|
||||
The default Bluesky PDS is **public**, meaning your scrobbles are also public (read-only). This isn't any different than using Last.fm or Listenbrainz, in terms of privacy.
|
||||
Atproto PDS access is **public**, meaning your scrobbles are also public (read-only). This isn't any different than using Last.fm or Listenbrainz, in terms of privacy.
|
||||
|
||||
</DetailsAdmo>
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ To monitor and re-scrobble activity from a ATProto Profile create a [teal.fm (So
|
||||
|
||||
<DetailsAdmo type="warning" summary="Your Data Is Public">
|
||||
|
||||
The default Bluesky PDS is **public**, meaning your scrobbles are also public (read-only). This isn't any different than using Last.fm or Listenbrainz, in terms of privacy.
|
||||
Atproto PDS access is **public**, meaning your scrobbles are also public (read-only). This isn't any different than using Last.fm or Listenbrainz, in terms of privacy.
|
||||
|
||||
</DetailsAdmo>
|
||||
|
||||
@@ -39,7 +39,6 @@ The default Bluesky PDS is **public**, meaning your scrobbles are also public (r
|
||||
|
||||
To view your teal.fm scrobble data you can:
|
||||
|
||||
* use [teal-relay-production.up.railway.app](https://teal-relay-production.up.railway.app) or [teal-slice.wisp.place](https://tealfm-slice.wisp.place/) for a preview of teal.fm
|
||||
* use [yearinmusic.teal.fm](https://yearinmusic.teal.fm) or [wrapped.baileytownsend.dev](https://wrapped.baileytownsend.dev/) for wrapped-style stats of your teal.fm scrobbles
|
||||
* use [atproto.at](https://atproto.at) to view the raw data (convenience URLs are generated in multi-scrobbler, per scrobble, for you to do this)
|
||||
|
||||
|
||||
@@ -37,7 +37,6 @@ If you absolutely need to host Multi-Scrobbler on a machine that is also accessi
|
||||
If you do not need
|
||||
|
||||
* any [Ingress-based Sources](/configuration/sources/?sourceComm=ingress#by-communication-method) like Webscrobbler, Listenbrainz Endpoint, or Last.fm Endpoint
|
||||
* and do not need authentication callbacks for [Spotify](/configuration/sources/spotify) or [Last.fm](/configuration/clients/lastfm)/[Libre.fm](/configuration/clients/librefm)
|
||||
|
||||
then use of these methods:
|
||||
|
||||
@@ -74,12 +73,11 @@ services:
|
||||
|
||||
Alternatively, use the [Disable Web](/configuration#disable-web) option to completely disable the web server. This is useful if you are not using the docker image or cannot control port exposure in your environment. Note: this will also remove your ability to access the dashboard.
|
||||
|
||||
### With Ingress or Remote Instance
|
||||
### With Ingress or Remote Instance Dashboard
|
||||
|
||||
If you:
|
||||
|
||||
* need to use an [Ingress-based Source](/configuration/sources/?sourceComm=ingress#by-communication-method)
|
||||
* need authentication callbacks for [Spotify](/configuration/sources/spotify) or [Last.fm](/configuration/clients/lastfm)/[Libre.fm](/configuration/clients/librefm)
|
||||
* or your instance is on a machine outside your private network and you cannot/do not want to run it [headlessly](#restrict-docker-port)
|
||||
|
||||
then do one of these:
|
||||
@@ -121,7 +119,6 @@ Routes that need to be unprotected in order for devices to communicate with MS:
|
||||
* `/2.0/` - standard route for [Last.fm Endpoint](/configuration/sources/lastfm-endpoint)
|
||||
* `/api/lastfm*` - custom Last.fm Endpoint with slug
|
||||
* `/api/webscrobbler*` - standard/custom route for [Webscrobbler](/configuration/sources/webscrobbler)
|
||||
* `/*callback*` - wildcard route, used for completing authentication flows for [Spotify](/configuration/sources/spotify), [Last.fm](/configuration/clients/lastfm), and [Libre.fm](/configuration/clients/librefm)
|
||||
|
||||
In the examples below you can remove any of the above routes for Sources/Clients you are not using.
|
||||
|
||||
@@ -142,7 +139,7 @@ Below are examples of protecting all non-ingress and callback routes with basic
|
||||
- "websecure"
|
||||
|
||||
# can remove any set in the parenthesis group that is unused. Order:
|
||||
# LZ endpoint, webscrobbler, LFM endpoint, callback for last.fm/spotify
|
||||
# LZ endpoint, webscrobbler, LFM endpoint
|
||||
#
|
||||
# if not using any then leave only -> Host(`...`)
|
||||
rule: >
|
||||
@@ -156,8 +153,6 @@ Below are examples of protecting all non-ingress and callback routes with basic
|
||||
&& !PathPrefix(`/2.0/`)
|
||||
&& !PathPrefix(`/api/lastfm`)
|
||||
|
||||
&& !PathRegexp(`/.*callback.*/`)
|
||||
|
||||
)
|
||||
|
||||
middlewares:
|
||||
@@ -188,16 +183,22 @@ Below are examples of protecting all non-ingress and callback routes with basic
|
||||
<TabItem value="caddy" label="Caddy">
|
||||
```Caddyfile
|
||||
multi-scrobbler.domain.tld {
|
||||
# remove any paths you are NOT using from `not path` line.
|
||||
# Order: LZ, LZ, WebScrobbler, LFM, LFM
|
||||
@if-not-scrobble {
|
||||
not path /1/* /api/listenbrainz* /api/webscrobbler* /2.0/* /api/lastfm* *callback*
|
||||
not path /1/* /api/listenbrainz* /api/webscrobbler* /2.0/* /api/lastfm*
|
||||
}
|
||||
# if the request is to ANY route not listed above, force client to pass basic auth
|
||||
# if request is to any route not listed above, force client to basic auth
|
||||
# you must hash your password using `caddy hash-password`
|
||||
# https://caddyserver.com/docs/command-line#caddy-hash-password
|
||||
basic_auth @if-not-scrobble {
|
||||
basicAuthUser hashedPassword
|
||||
msUser $2a$14$.UWNn4Zn.cQHY6Z1mkXXrOhO7mg4BC2wiC.4Tb8dNBMidjSRHAw3e
|
||||
}
|
||||
# requests will be proxied only if they are to a scrobble endpoint or basic auth has been passed.
|
||||
# requests will be proxied they are to a scrobble endpoint or basic auth has been passed.
|
||||
# can use container/service name if Caddy & MS are on the same docker network.
|
||||
# otherwise, replace `multi-scrobbler` with host IP
|
||||
reverse_proxy multi-scrobbler:9078
|
||||
}
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
</Tabs>
|
||||
|
||||
@@ -109,6 +109,48 @@ Example of multiple servers:
|
||||
|
||||
</details>
|
||||
|
||||
<DetailsAdmo type="tip" summary="BrainzMash Musicbrainz Server">
|
||||
|
||||
[**BrainzMash**](https://brainzmash.cc) can be used as a supplementary Musicbrainz Server (see **Additional Musicbrainz Servers** above).
|
||||
|
||||
BrainzMash is a community-run pool of read-only hybrid Musicbrainz/[Lidarr](https://lidarr.audio/) metadata servers. Requests are made to one endpoint that load-balances traffic out to all participating servers. This service is **publicly available** and can be treated like a normal Musicbrainz server from Multi-Scrobbler's perspective.
|
||||
|
||||
There are pros and cons to using this service. Read these carefully before using BrainzMash:
|
||||
|
||||
* **Pros**
|
||||
* Higher rate limit than official Musicbrainz server -- Multi-scrobbler can make requests more often and faster
|
||||
* Potentially less downtime due to distributed nature
|
||||
* **Cons**
|
||||
* There is implicit trust in how BrainzMash handles your traffic:
|
||||
* you do not know which community server is getting your traffic and what the operator *may* be logging/collecting in terms of metrics
|
||||
* the load balancer endpoint collects minimal metrics: it retains anonymized recent searches and network data for presenting aggregate stats on BrainzMash public dashboard
|
||||
* Musicbrainz DB data is updated on a weekly basis so new entries and recent edits will lag behind the official server
|
||||
|
||||
If these trade-offs are acceptable to you, add BrainzMash to your Musicbrainz config like this:
|
||||
|
||||
```json5
|
||||
{
|
||||
"contact": "anything@notused.com",
|
||||
"url": "https://api.brainzmash.cc"
|
||||
}
|
||||
```
|
||||
|
||||
The public dashboard can be found here: [https://dash.brainzmash.cc](https://dash.brainzmash.cc)
|
||||
|
||||
Learn more about BrainzMash:
|
||||
|
||||
* [Main website](https://brainzmash.cc/)
|
||||
* Join the [Discord server](https://discord.gg/MSTteNvANt) for updates, support, and lidarr instructions
|
||||
* Contribute your server to the community pool by deploying [brainzmash-hearring-aid](https://github.com/statichum/brainzmash-hearring-aid)
|
||||
|
||||
:::important[Support and Bugs]
|
||||
|
||||
If you have issues with the Musicbrainz Transformer and API communication then [**create an issue for Multi-Scrobbler first**](https://github.com/FoxxMD/multi-scrobbler/issues), do not use BrainzMash discord for general help.
|
||||
|
||||
:::
|
||||
|
||||
</DetailsAdmo>
|
||||
|
||||
### Stage Configuration
|
||||
|
||||
All of the properties found in [**Matching with Musicbrainz**](#matching-with-musicbrainz) section are configured in [Stage Configuration](/configuration/transforms#configuring-stages) as `defaults`.
|
||||
|
||||
Reference in New Issue
Block a user