From 9f27fad2357cfdeaa549d425a07a715a8b0b421f Mon Sep 17 00:00:00 2001 From: mitteneer Date: Mon, 23 Jun 2025 17:02:08 -0400 Subject: [PATCH] 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 --- README.md | 101 +++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 81 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 06f45c2..903f88f 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,27 @@ -# Zuletzt +# Zuletzt **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 -language, reintroducing myself to programming, and combining -the functionality of the aforementioned inspirations. +**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 +language, reintroducing myself to programming, and combining the functionality +of the aforementioned inspirations. Zuletzt means "last" in German. Licensed under MIT. -## Usage +## Usage 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` file from lastfmstats.com), or by providing a Last.FM username and connecting 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) - 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 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: - [ ] Entity statistics @@ -80,7 +106,8 @@ If two artists have the same name, they are necessarily listed as the same artis - [ ] Genres - [ ] Owned - [ ] Holiday -- [ ] [MusicBrainz integration](https://musicbrainz.org/doc/libmusicbrainz)[^11] +- [ ] [MusicBrainz + integration](https://musicbrainz.org/doc/libmusicbrainz)[^11] - [ ] Concerts - [ ] Import from Setlist.fm[^5] - [ ] Ratings @@ -90,27 +117,61 @@ If two artists have the same name, they are necessarily listed as the same artis - [ ] "Playlists"[^8] - [ ] 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 -[^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 -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.