[feature] Parse funkwhale Album as Statusable to allow barebones interacting with bandwagon (#3931)

* bump activity version

* parse funkwhale / bandwagon album as statusable
This commit is contained in:
tobi 2025-03-24 11:56:42 +01:00 committed by GitHub
commit 27171a78de
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
131 changed files with 26449 additions and 3098 deletions

View file

@ -434,9 +434,10 @@ func (c *Converter) ASStatusToStatus(ctx context.Context, statusable ap.Statusab
return nil, gtserror.SetMalformed(err)
}
// Status was sent to us or dereffed
// by us so it must be federated.
// Status was sent to us or dereffed by
// us so it must be federated and not local.
status.Federated = util.Ptr(true)
status.Local = util.Ptr(false)
// Derive interaction policy for this status.
status.InteractionPolicy = ap.ExtractInteractionPolicy(
@ -446,9 +447,11 @@ func (c *Converter) ASStatusToStatus(ctx context.Context, statusable ap.Statusab
// Set approvedByURI if present,
// for later dereferencing.
approvedByURI := ap.GetApprovedBy(statusable)
if approvedByURI != nil {
status.ApprovedByURI = approvedByURI.String()
if ipa, ok := statusable.(ap.InteractionPolicyAware); ok {
approvedByURI := ap.GetApprovedBy(ipa)
if approvedByURI != nil {
status.ApprovedByURI = approvedByURI.String()
}
}
// Assume not pending approval; this may

View file

@ -21,7 +21,6 @@ import (
"bytes"
"context"
"encoding/json"
"fmt"
"io"
"testing"
@ -224,8 +223,7 @@ func (suite *ASToInternalTestSuite) TestParseOwncastService() {
b, err := json.Marshal(apiAcct)
suite.NoError(err)
fmt.Printf("\n\n\n%s\n\n\n", string(b))
suite.NotNil(b)
}
func (suite *ASToInternalTestSuite) TestParseBookwyrmStatus() {
@ -282,6 +280,65 @@ func (suite *ASToInternalTestSuite) TestParseBookwyrmStatus() {
suite.Len(status.Attachments, 1)
}
func (suite *ASToInternalTestSuite) TestParseBandwagonAlbum() {
authorAccount := suite.testAccounts["remote_account_1"]
raw := `{
"@context": [
"https://www.w3.org/ns/activitystreams",
"https://w3id.org/security/v1",
{
"discoverable": "toot:discoverable",
"indexable": "toot:indexable",
"toot": "https://joinmastodon.org/ns#"
},
"https://funkwhale.audio/ns"
],
"artists": [
{
"id": "https://bandwagon.fm/@67a0a0808121f77ed3466870",
"name": "Luka Prinčič",
"type": "Artist"
}
],
"attachment": [
{
"mediaType": "image/webp",
"name": "image",
"type": "Document",
"url": "https://bandwagon.fm/67a0a219f050061c8b4ce427/attachments/67a0a21bf050061c8b4ce429"
}
],
"attributedTo": "` + authorAccount.URI + `",
"content": "... a transgenre mutation, a fluid entity, jagged pop, electro-funk, techno-cabaret, a schlager, and soft alternative, queer to the core, satire and tragedy, sharp and fun indulgence for the dance of bodies and brains, activism and hedonism, which would all like to steal your attention.\r\n\r\nDRAGX̶FUNK is pronounced /dɹæɡɑːfʌŋk/.\r\n\r\n---\r\n\r\n## Buy digital\r\n💳 [Stripe](https://buy.stripe.com/6oE8x52iG1Kq5pKeV3)\r\n\r\n---\r\n\r\n## Buy dl/merch\r\n🎵 [Bandcamp](https://lukaprincic.bandcamp.com/album/dragx-funk) \r\n\r\n---\r\n\r\n## More:\r\n🌐 [prin.lu](https://prin.lu/music/241205_dragx-funk/) \r\n👉 [kamizdat.si](https://kamizdat.si/releases/dragx-funk-2/)\r\n",
"context": "https://bandwagon.fm/67a0a219f050061c8b4ce427",
"id": "https://bandwagon.fm/67a0a219f050061c8b4ce427",
"library": "https://bandwagon.fm/67a0a219f050061c8b4ce427/pub/children",
"license": "CC-BY-NC-SA",
"name": "DRAGX̶FUNK",
"published": "2025-03-17T11:40:53Z",
"to": [
"https://www.w3.org/ns/activitystreams#Public"
],
"tracks": "https://bandwagon.fm/67a0a219f050061c8b4ce427/pub/children",
"type": "Album",
"url": "https://bandwagon.fm/67a0a219f050061c8b4ce427"
}`
t := suite.jsonToType(raw)
asArticle, ok := t.(ap.Statusable)
if !ok {
suite.FailNow("type not coercible")
}
s, err := suite.typeconverter.ASStatusToStatus(context.Background(), asArticle)
if err != nil {
suite.FailNow(err.Error())
}
suite.NotNil(s)
suite.NoError(err)
}
func (suite *ASToInternalTestSuite) TestParseFlag1() {
reportedAccount := suite.testAccounts["local_account_1"]
reportingAccount := suite.testAccounts["remote_account_1"]

View file

@ -705,35 +705,38 @@ func (c *Converter) StatusToAS(ctx context.Context, s *gtsmodel.Status) (ap.Stat
status.SetActivityStreamsSensitive(sensitiveProp)
// interactionPolicy
var p *gtsmodel.InteractionPolicy
if s.InteractionPolicy != nil {
// Use InteractionPolicy
// set on the status.
p = s.InteractionPolicy
} else {
// Fall back to default policy
// for the status's visibility.
p = gtsmodel.DefaultInteractionPolicyFor(s.Visibility)
}
policy, err := c.InteractionPolicyToASInteractionPolicy(ctx, p, s)
if err != nil {
return nil, fmt.Errorf("error creating interactionPolicy: %w", err)
}
policyProp := streams.NewGoToSocialInteractionPolicyProperty()
policyProp.AppendGoToSocialInteractionPolicy(policy)
status.SetGoToSocialInteractionPolicy(policyProp)
// Parse + set approvedBy.
if s.ApprovedByURI != "" {
approvedBy, err := url.Parse(s.ApprovedByURI)
if ipa, ok := status.(ap.InteractionPolicyAware); ok {
var p *gtsmodel.InteractionPolicy
if s.InteractionPolicy != nil {
// Use InteractionPolicy
// set on the status.
p = s.InteractionPolicy
} else {
// Fall back to default policy
// for the status's visibility.
p = gtsmodel.DefaultInteractionPolicyFor(s.Visibility)
}
policy, err := c.InteractionPolicyToASInteractionPolicy(ctx, p, s)
if err != nil {
return nil, fmt.Errorf("error parsing approvedBy: %w", err)
return nil, fmt.Errorf("error creating interactionPolicy: %w", err)
}
approvedByProp := streams.NewGoToSocialApprovedByProperty()
approvedByProp.Set(approvedBy)
status.SetGoToSocialApprovedBy(approvedByProp)
// Set interaction policy.
policyProp := streams.NewGoToSocialInteractionPolicyProperty()
policyProp.AppendGoToSocialInteractionPolicy(policy)
ipa.SetGoToSocialInteractionPolicy(policyProp)
// Parse + set approvedBy.
if s.ApprovedByURI != "" {
approvedBy, err := url.Parse(s.ApprovedByURI)
if err != nil {
return nil, fmt.Errorf("error parsing approvedBy: %w", err)
}
approvedByProp := streams.NewGoToSocialApprovedByProperty()
approvedByProp.Set(approvedBy)
ipa.SetGoToSocialApprovedBy(approvedByProp)
}
}
return status, nil