slight pushback on the “not URIs” bit – even JSON strings that aren’t in normal form are still identifiers because “audience” is defined in a way that types its values as identifiers. it could be disambiguated by expanding those (in effect relative) identifiers against a base URI, but you can’t make this part of the definition of “audience” without confusing others who don’t share this definition. and “audience” is also already defined by AS2 which requires that you MUST NOT override or change its definitions. I think the earlier recommendation to map these to existing identifiers still holds: FEP-be68: Audio Objects - #10 by trwnh
This is fine as long as everyone agrees on what the “instance URL” is. The service itself isn’t necessarily always represented by the HTTP resource /. I think for the Funkwhale concept of instance you could mint an identifier like https://funkwhale.example/users/ and have it represent all users on the host funkwhale.example. You could then describe that as a Collection, as well:
{
"@context": "https://www.w3.org/ns/activitystreams",
"id": "https://funkwhale.example/users/",
"type": "Collection",
"name": "funkwhale.example's users"
"summary": "Represents every user on funkwhale.example"
}
and then another-funkwhale.example would have its own users:
{
"@context": "https://www.w3.org/ns/activitystreams",
"id": "https://another-funkwhale.example/users/",
"type": "Collection",
"name": "another-funkwhale.example's users"
"summary": "Represents every user on another-funkwhale.example"
}
Your local instance should know its own local users collection ID. If you knew the collection ID of another instance’s users, you could in theory send them activities that would be forwarded (or not) by that other instance. (Say you knew of an “instance actor” that linked to its “users” collection.)
If you used relative identifiers and implicitly expand them against the current network location, it could look like this:
{
"@context": [
"@base": "https://funkwhale.example/", // insert your own instance name here
"https://www.w3.org/ns/activitystreams"
],
"audience": "/users/" // only you need to know what this means, so there aren't any compatibility/interop concerns
}
If you used absolute identifiers it would look like this:
{
"@context": "https://www.w3.org/ns/activitystreams",
"audience": "https://funkwhale.example/users/"
}
Would it be correct to interpret this as Funkwhale allowing anonymous objects? (Fudging the vocab here a bit):
{
"@context": "https://www.w3.org/ns/activitystreams",
"actor": {
"name": "a"
},
"type": "Listen",
"object": {
"name": "House of Leaves",
"attributedTo": {
"name": "Circa Survive"
}
}
}
You could specify any “id” here to enable reuse, but on its own, this document contains enough information to describe a useful activity: a listened to "House of Leaves" by Circa Survive. You could progressively enhance this with other statements, like when the Listen occurred, or so on. You just don’t know which specific <actor whose name is "a"> we’re talking about here, although you can probably be reasonably sure you know what is meant by <the thing i listened to which is named "House of Leaves"> and <the thing which is named "Circa Survive"> by context clues – specifically, that since this is a Listen activity, the Listen.object is probably some listenable thing like a Track, and then a Track.attributedTo is probably the attribution of a Track to an Artist, and then you fill in the gaps that way to understand that we are both talking about the band Circa Survive and their work “House of Leaves”.
This is all known as “identity by description”, as opposed to “identity by name” which is a thing you can do to enable easier reuse. (The third way to identify something is “identity by possession”. If this sounds familiar at all, it’s because they map to the concept of “authentication factors” – “what you know”, “what you are”, and “what you have”.)
Couldn’t you just link Audio objects to the Track? Or the other way around could work, too.
For Funkwhale this is like saying:
- I have a Library containing an Audio, and the Audio references a Track; or
- I have a Track referencing an Audio contained in a Library.
I assume Funkwhale doesn’t store an index of which Tracks correspond to which Audio objects (since what I have seen so far without looking deeply is that Funkwhale prefers to index Audio objects that individually refer to a Track), but it’s doable. It would also allow searching for a Track and finding any Library that contains an Audio object referencing that Track (“which libraries contain audio for this track” rather than “which track does this audio represent”).
I think this is what you mean by this bit?
The “responsibility” is implicitly tied to the id. If you have a “metadata provider” then you can notify them of any new Audio objects referencing it (which is I think what you are proposing with the “source of the track” stuff described above?).
{
"type": "Activity",
"summary": "Letting you know that your Track was uploaded as Audio",
"audience": "https://track-owner.example/",
"object": "https://audio.example"
}
If you’re using Musicbrainz to provide Track metadata then why not use their database directly?
Otherwise, you could link a metadata provider’s data by declaring it as being equivalent to the Musicbrainz entities.
{
"@id": "https://musicbrainz.org/work/38df7f57-de90-437f-8a61-3dd8f4e2f9af"
}
Although this does raise the issue of what to do when the metadata of the Audio doesn’t actually match the metadata provider’s information. For example, according to Musicbrainz, the Recording is https://musicbrainz.org/recording/7a3fad60-938e-4c17-bc83-342acd713c04 “Meet Me In Montauk”, which contains the titular work followed by ~7 minutes of silence, and then the hidden “bonus track” follows afterward. In my personal library, the audio I’m playing has actually been extracted from the official release, so that my copy of “Meet Me In Montauk” is only about 2 minutes long instead of 14:39, and my copy of “House of Leaves” represents something that was never officially released as a singular Track.
If we take the activity from before, then the question is this: what did I actually listen to?
- I didn’t listen to “Meet Me In Montauk”.
- I didn’t listen to the 7 minutes of silence.
- I listened to “House of Leaves”.
- What I listened to is not described in Musicbrainz as a Recording.
- It is described by Musicbrainz as a Work (specifically a Song).
What ends up in the Funkwhale concept of a “Track”? Which musicbrainzId do you use? Does it get an id?