Add section on SongGroups

They don't exist yet, but I was trying to decide in my head if there was a meaningful difference between emrging two songs, and a SongGroup, and I decided they are indeed different, but really only in a small way
This commit is contained in:
mitteneer 2025-06-23 17:02:08 -04:00
parent 6f6aaecb8f
commit 9f27fad235

101
README.md
View file

@ -1,23 +1,27 @@
# Zuletzt # Zuletzt
**Zuletzt** gives you the statistics of your music listening habits. **Zuletzt** gives you the statistics of your music listening habits.
Inspired by [Last.fm](https://last.fm), [Maloja](https://github.com/krateng/maloja), and [Lastfmstats.com](https://www.lastfmstats.com). Inspired by [Last.fm](https://last.fm),
[Maloja](https://github.com/krateng/maloja), and
[Lastfmstats.com](https://www.lastfmstats.com).
**Z**uletzt is written with [**Z**ig](https://github.com/ziglang/zig) and [Jetzig](https://github.com/jetzig-framework/jetzig) as a means of learning the **Z**uletzt is written with [**Z**ig](https://github.com/ziglang/zig) and
language, reintroducing myself to programming, and combining [Jetzig](https://github.com/jetzig-framework/jetzig) as a means of learning the
the functionality of the aforementioned inspirations. language, reintroducing myself to programming, and combining the functionality
of the aforementioned inspirations.
Zuletzt means "last" in German. Zuletzt means "last" in German.
Licensed under MIT. Licensed under MIT.
## Usage ## Usage
Zuletzt allows uploads of Scrobbles at the `/upload` page, where you Zuletzt allows uploads of Scrobbles at the `/upload` page, where you
can import Scrobbles from a Spotify data export, Last.FM data export (a `.json` can import Scrobbles from a Spotify data export, Last.FM data export (a `.json`
file from lastfmstats.com), or by providing a Last.FM username and connecting file from lastfmstats.com), or by providing a Last.FM username and connecting
to Last.FM directly. to Last.FM directly.
Zuletzt will not make any assumptions about the data, and only change metadata when asked to by a rule. Two albums will be considered the same if: Zuletzt will not make any assumptions about the data, and only change metadata
when asked to by a rule. Two albums will be considered the same if:
- They share the same title (case/diacritic sensitive) - They share the same title (case/diacritic sensitive)
- The album artist(s) are the same - The album artist(s) are the same
@ -38,7 +42,29 @@ them (see "Once In Royal David's City" on Sufjan Stevens's "Songs For
Christmas", for example). Every artist that performs on those songs with Christmas", for example). Every artist that performs on those songs with
receive attribution for the combined song. receive attribution for the combined song.
If two artists have the same name, they are necessarily listed as the same artist, but can be separated with a rule, or after the fact, with a disambiguation string. If two artists have the same name, they are necessarily listed as the same
artist, but can be separated with a rule, or after the fact, with a
disambiguation string.
## Quirks
Zuletzt does not assume any two songs are the same song unless they
share the exact same metadata. However, there are plenty of situations where a
song might appear on more than one album (consider a greatest hits album).
Thus, a song which was played on one album 30 times, and also played on a
different album 20 times, would not receive the credit of being played a total
of 50 times. To resolve this, Zuletzt lets the user specify that these two
songs are the same. This is, however, different from SongGroups. SongGroups,
while superficially providing very similar functionality, does not permanently
combine the statistics of the two songs, but will show their combined
statistics anyways. This is useful if, for example, one song is a remix of
another - they are, in reality, different songs, but there is a clear
connection between them, and it may be interesting to see what their combined
statistics are. The decision to merge songs or make a SongGroup, or neither, is
left to the user, but the general thought is:
- If they're the *exact* same song, merge them, and the data becomes more
accurate for that song
- If one is somehow remixed/covered/altered in some way, make a SongGroup, and
see the combined info *as if* you had merged them.
## To-Do List: ## To-Do List:
- [ ] Entity statistics - [ ] Entity statistics
@ -80,7 +106,8 @@ If two artists have the same name, they are necessarily listed as the same artis
- [ ] Genres - [ ] Genres
- [ ] Owned - [ ] Owned
- [ ] Holiday - [ ] Holiday
- [ ] [MusicBrainz integration](https://musicbrainz.org/doc/libmusicbrainz)[^11] - [ ] [MusicBrainz
integration](https://musicbrainz.org/doc/libmusicbrainz)[^11]
- [ ] Concerts - [ ] Concerts
- [ ] Import from Setlist.fm[^5] - [ ] Import from Setlist.fm[^5]
- [ ] Ratings - [ ] Ratings
@ -90,27 +117,61 @@ If two artists have the same name, they are necessarily listed as the same artis
- [ ] "Playlists"[^8] - [ ] "Playlists"[^8]
- [ ] First launch setup - [ ] First launch setup
[^1]: I do not intend to exactly replicate all the statistics Lastfmstats.com provides, but I would at least like to give the user the option to see those kinds of statistics, or generate them themselves (see 7). [^1]: I do not intend to exactly replicate all the statistics Lastfmstats.com
provides, but I would at least like to give the user the option to see those
kinds of statistics, or generate them themselves (see 7).
[^2]: I do not intend to provide the level of granularity that Discogs provides, but a simple toggle that means "I own some version of this release" is all that is necessary. [^2]: I do not intend to provide the level of granularity that Discogs
provides, but a simple toggle that means "I own some version of this release"
is all that is necessary.
[^3]: I have not investigated any other service for downloading your listening history from Last.fm, but providing the listening history as a JSON rather than a CSV is highly preferred. I may eventually provide my own way of downloading Last.fm data as a JSON, but I would prefer to allow users to enter their username, or authenticate, and avoid needing to upload a file altogether. [^3]: I have not investigated any other service for downloading your listening
history from Last.fm, but providing the listening history as a JSON rather than
a CSV is highly preferred. I may eventually provide my own way of downloading
Last.fm data as a JSON, but I would prefer to allow users to enter their
username, or authenticate, and avoid needing to upload a file altogether.
[^4]: I only intend to allow imports from Last.fm and Spotify at the moment because those are the only data sources I currently rely on. To that extent, I imagine I could import from other sources as well fairly easily, although I do not know what their data dumps look like. [^4]: I only intend to allow imports from Last.fm and Spotify at the moment
because those are the only data sources I currently rely on. To that extent, I
imagine I could import from other sources as well fairly easily, although I do
not know what their data dumps look like.
[^5]: I only intend to allow imports from Setlist.fm at the moment because that is the only data source I currently rely on. [^5]: I only intend to allow imports from Setlist.fm at the moment because that
is the only data source I currently rely on.
[^6]: RYM has the most data, and once it has an API, will be the only user-driven review site that *has* an API. In this context, "integration" simply means displaying the critic score and user score next to the album. You will be able to write reviews and ranks songs/albums(/artists?), but not for them to be published to RYM. [^6]: RYM has the most data, and once it has an API, will be the only
user-driven review site that *has* an API. In this context, "integration"
simply means displaying the critic score and user score next to the album. You
will be able to write reviews and ranks songs/albums(/artists?), but not for
them to be published to RYM.
[^7]: I envision something akin to the Custom Reports from [Actual Budget](https://github.com/actualbudget/actual) that will allow users to create their own ways of rating/ranking songs/albums, and view their listening habits. [^7]: I envision something akin to the Custom Reports from [Actual
Budget](https://github.com/actualbudget/actual) that will allow users to create
their own ways of rating/ranking songs/albums, and view their listening habits.
[^8]: Misleading title, but same functionality as "Lists" on AlbumOfTheYear, although I would like to allow albums and songs to appear on the same list. [^8]: Misleading title, but same functionality as "Lists" on AlbumOfTheYear,
although I would like to allow albums and songs to appear on the same list.
[^9]: This is a working title, but I have sources (iPods) that provide a play count, but no play dates, so I can't list them among my usual Scrobbles. However, I would still like to display that information along with everything else, so I would like to provide a way of entering this data into a separate category that can be toggled to display alongside "official" Scrobbles. [^9]: This is a working title, but I have sources (iPods) that provide a play
count, but no play dates, so I can't list them among my usual Scrobbles.
However, I would still like to display that information along with everything
else, so I would like to provide a way of entering this data into a separate
category that can be toggled to display alongside "official" Scrobbles.
[^10]: Would probably select the album with the most scrobbles [^10]: Would probably select the album with the most scrobbles
[^11]: I probably don't understand it well enough, but it appears that I should be able to do this using `@cImport` and/or `translate-c` on the original MusicBrainz source, but it's not all clear to me on how that would work yet. This is a necessary step for what I have planned however, so we'll see where it goes. **Update 3/25/25:** A Zig implementation for what Zuletzt requires (and *only* what Zuletzt requires) has been (mostly) written. [^11]: I probably don't understand it well enough, but it appears that I should
be able to do this using `@cImport` and/or `translate-c` on the original
MusicBrainz source, but it's not all clear to me on how that would work yet.
This is a necessary step for what I have planned however, so we'll see where it
goes. **Update 3/25/25:** A Zig implementation for what Zuletzt requires (and
*only* what Zuletzt requires) has been (mostly) written.
## Contributing ## Contributing
I am a math student who is interested in programming. I will not be writing quality code. That said, Zuletzt is something that, at the moment, I am very excited about making, and using to relearn some things about programming. Unless contributions are given in the form of code review, or some kind of constructive criticism, it's not likely that I accept pull requests. The project is, however, licensed under the MIT License, so feel free to do what you like with it in your own way. I am a math student who is interested in programming. I will
not be writing quality code. That said, Zuletzt is something that, at the
moment, I am very excited about making, and using to relearn some things about
programming. Unless contributions are given in the form of code review, or some
kind of constructive criticism, it's not likely that I accept pull requests.
The project is, however, licensed under the MIT License, so feel free to do
what you like with it in your own way.