commit 978298d616a5c72ef42e0ca57522ca83a23aab7c
parent 4c423ee4dc265ea073580c663d8c664d9d6337df
Author: mtmn <miro@haravara.org>
Date: Sun, 12 Apr 2026 20:50:31 +0200
chore: add footer, update readme, tidy
Diffstat:
3 files changed, 28 insertions(+), 24 deletions(-)
diff --git a/README.md b/README.md
@@ -2,5 +2,4 @@
| | |
| :--- | ---: |
-| Scorpus is a [ListenBrainz](https://listenbrainz.org) frontend built with PureScript and Halogen. Under the hood it stores track metadata in DuckDB and cover images in a S3 bucket. | <img src="docs/korpus.webp" width="400" alt="Korpus"> |
-
+| **Scorpus** is an alternative [ListenBrainz](https://listenbrainz.org) dashboard written in [PureScript](https://www.purescript.org). It stores listens metadata in [DuckDB](https://duckdb.org) and caches cover art in a blob storage.
diff --git a/src/Client.purs b/src/Client.purs
@@ -154,13 +154,15 @@ component =
]
StatsTab ->
renderStatsView state.expandedSections state.stats
- , HH.p
- [ HP.id "last-updated"
+ , HH.div
+ [ HP.id "footer"
, HP.class_ (H.ClassName "small")
]
- [ HH.text $ fromMaybe "" state.lastCheck ]
+ [ HH.span_ [ HH.text $ fromMaybe "" state.lastCheck ]
+ ]
]
+
renderStatsView _ Nothing =
HH.div [ HP.class_ (H.ClassName "loading") ] [ HH.text "Loading stats..." ]
renderStatsView expandedSections (Just (Stats { genres, labels, years })) =
diff --git a/src/Main.purs b/src/Main.purs
@@ -895,11 +895,12 @@ fetchMusicBrainzRelease mbid = do
Just { head } -> fromString head
Nothing -> Nothing
Log.info $ "Enriched " <> mbid <> ": genre=" <> show genre <> " label=" <> show label <> " year=" <> show year
-
+
-- Warn if all fields are empty
- when (genre == Nothing && label == Nothing && year == Nothing) $
- Log.warn $ "All fields empty for " <> mbid <> " - possible parsing issue or missing data"
-
+ when (genre == Nothing && label == Nothing && year == Nothing)
+ $ Log.warn
+ $ "All fields empty for " <> mbid <> " - possible parsing issue or missing data"
+
pure $ Just { genre, label, year }
Right fr | fr.status == 404 -> do
Log.info $ "MusicBrainz 404 for " <> mbid
@@ -927,13 +928,14 @@ fetchLastfmGenre artist release = do
Log.error $ "Last.fm genre JSON error: " <> Exception.message err
pure Nothing
Right json -> do
- let genre = do
- obj <- toObject json
- album <- Object.lookup "album" obj >>= toObject
- tags <- Object.lookup "tags" album >>= toObject
- tagArray <- Object.lookup "tag" tags >>= toArray
- firstTag <- tagArray !! 0 >>= toObject
- Object.lookup "name" firstTag >>= toString
+ let
+ genre = do
+ obj <- toObject json
+ album <- Object.lookup "album" obj >>= toObject
+ tags <- Object.lookup "tags" album >>= toObject
+ tagArray <- Object.lookup "tag" tags >>= toArray
+ firstTag <- tagArray !! 0 >>= toObject
+ Object.lookup "name" firstTag >>= toString
pure genre
_ -> do
Log.warn "Last.fm genre API request failed"
@@ -959,12 +961,13 @@ fetchDiscogsGenre artist release = do
Log.error $ "Discogs genre JSON error: " <> Exception.message err
pure Nothing
Right json -> do
- let genre = do
- obj <- toObject json
- results <- Object.lookup "results" obj >>= toArray
- firstResult <- results !! 0 >>= toObject
- genres <- Object.lookup "genres" firstResult >>= toArray
- genres !! 0 >>= toString
+ let
+ genre = do
+ obj <- toObject json
+ results <- Object.lookup "results" obj >>= toArray
+ firstResult <- results !! 0 >>= toObject
+ genres <- Object.lookup "genres" firstResult >>= toArray
+ genres !! 0 >>= toString
pure genre
_ -> do
Log.warn "Discogs genre API request failed"
@@ -1007,11 +1010,11 @@ enrichMetadata conn isSyncing = forever do
Nothing -> do
-- Try Discogs as final fallback
fetchDiscogsGenre artist release
-
+
-- Update with the best genre we found
let finalMbdata = mbdata { genre = finalGenre }
upsertReleaseMetadata conn mbid finalMbdata.genre finalMbdata.label finalMbdata.year
-
+
case finalGenre of
Just genre -> Log.info $ "Added fallback genre from " <> (if lastfmGenre /= Nothing then "Last.fm" else "Discogs") <> " for " <> mbid <> ": " <> genre
Nothing -> do