diff --git a/conf/configuration.go b/conf/configuration.go
index 20d222ce5..0e0af4a43 100644
--- a/conf/configuration.go
+++ b/conf/configuration.go
@@ -69,6 +69,7 @@ type configOptions struct {
DevOldCacheLayout bool
DevActivityPanel bool
DevEnableShare bool
+ DevEnableScrobble bool
}
type scannerOptions struct {
@@ -227,6 +228,7 @@ func init() {
viper.SetDefault("devFastAccessCoverArt", false)
viper.SetDefault("devactivitypanel", true)
viper.SetDefault("devenableshare", false)
+ viper.SetDefault("devenablescrobble", false)
}
func InitConfig(cfgFile string) {
diff --git a/server/serve_index.go b/server/serve_index.go
index 8f6ff0efa..ab1d79a92 100644
--- a/server/serve_index.go
+++ b/server/serve_index.go
@@ -44,6 +44,7 @@ func serveIndex(ds model.DataStore, fs fs.FS) http.HandlerFunc {
"devFastAccessCoverArt": conf.Server.DevFastAccessCoverArt,
"enableUserEditing": conf.Server.EnableUserEditing,
"devEnableShare": conf.Server.DevEnableShare,
+ "devEnableScrobble": conf.Server.DevEnableScrobble,
}
auth := handleLoginFromHeaders(ds, r)
if auth != nil {
diff --git a/server/serve_index_test.go b/server/serve_index_test.go
index 8ed084397..2e54d34ca 100644
--- a/server/serve_index_test.go
+++ b/server/serve_index_test.go
@@ -199,6 +199,16 @@ var _ = Describe("serveIndex", func() {
config := extractAppConfig(w.Body.String())
Expect(config).To(HaveKeyWithValue("devEnableShare", false))
})
+
+ It("sets the devEnableScrobble", func() {
+ r := httptest.NewRequest("GET", "/index.html", nil)
+ w := httptest.NewRecorder()
+
+ serveIndex(ds, fs)(w, r)
+
+ config := extractAppConfig(w.Body.String())
+ Expect(config).To(HaveKeyWithValue("devEnableScrobble", false))
+ })
})
var appConfigRegex = regexp.MustCompile(`(?m)window.__APP_CONFIG__="([^"]*)`)
diff --git a/ui/src/config.js b/ui/src/config.js
index 5d8f9123c..0d4e86e84 100644
--- a/ui/src/config.js
+++ b/ui/src/config.js
@@ -19,6 +19,7 @@ const defaultConfig = {
defaultTheme: 'Dark',
enableUserEditing: true,
devEnableShare: true,
+ devEnableScrobble: true,
}
let config
diff --git a/ui/src/personal/Personal.js b/ui/src/personal/Personal.js
index 1a1925886..f7f077062 100644
--- a/ui/src/personal/Personal.js
+++ b/ui/src/personal/Personal.js
@@ -5,6 +5,8 @@ import { SelectLanguage } from './SelectLanguage'
import { SelectTheme } from './SelectTheme'
import { SelectDefaultView } from './SelectDefaultView'
import { NotificationsToggle } from './NotificationsToggle'
+import { ScrobbleToggle } from './ScrobbleToggle'
+import config from '../config'
const useStyles = makeStyles({
root: { marginTop: '1em' },
@@ -22,6 +24,7 @@ const Personal = () => {
+ {config.devEnableScrobble && }
)
diff --git a/ui/src/personal/ScrobbleToggle.js b/ui/src/personal/ScrobbleToggle.js
new file mode 100644
index 000000000..d80eae105
--- /dev/null
+++ b/ui/src/personal/ScrobbleToggle.js
@@ -0,0 +1,43 @@
+import { useNotify, useTranslate } from 'react-admin'
+import { useDispatch, useSelector } from 'react-redux'
+import { setNotificationsState } from '../actions'
+import {
+ FormControl,
+ FormControlLabel,
+ LinearProgress,
+ Switch,
+} from '@material-ui/core'
+import { useState } from 'react'
+import { openInNewTab } from '../utils'
+
+export const ScrobbleToggle = (props) => {
+ const translate = useTranslate()
+ const [linked, setLinked] = useState(false)
+
+ const toggleScrobble = (event) => {
+ if (!linked) {
+ openInNewTab(
+ 'https://www.last.fm/api/auth/?api_key=c2918986bf01b6ba353c0bc1bdd27bea'
+ )
+ }
+ setLinked(!linked)
+ }
+
+ return (
+
+
+ }
+ label={{translate('Scrobble to Last.FM')}}
+ />
+ {linked && }
+
+ )
+}