porting all github actions from bluesky-social/indigo to tangled CI

get cid from url

+2 -1
automod/engine/account_meta.go
··· 25 25 26 26 type ProfileSummary struct { 27 27 HasAvatar bool 28 - Avatar *string 28 + AvatarCid *string 29 + BannerCid *string 29 30 Description *string 30 31 DisplayName *string 31 32 }
+42
automod/engine/cid_from_cdn_test.go
··· 1 + package engine 2 + 3 + import ( 4 + "github.com/stretchr/testify/assert" 5 + "testing" 6 + ) 7 + 8 + func TestCidFromCdnUrl(t *testing.T) { 9 + assert := assert.New(t) 10 + 11 + fixCid := "abcdefghijk" 12 + 13 + fixtures := []struct { 14 + url string 15 + cid *string 16 + }{ 17 + { 18 + url: "https://cdn.bsky.app/img/avatar/plain/did:plc:abc123/abcdefghijk@jpeg", 19 + cid: &fixCid, 20 + }, 21 + { 22 + url: "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:abc123/abcdefghijk@jpeg", 23 + cid: &fixCid, 24 + }, 25 + { 26 + url: "https://cdn.bsky.app/img/feed_fullsize", 27 + cid: nil, 28 + }, 29 + { 30 + url: "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:abc123/abcdefghijk", 31 + cid: &fixCid, 32 + }, 33 + { 34 + url: "https://cdn.asky.app/img/feed_fullsize/plain/did:plc:abc123/abcdefghijk@jpeg", 35 + cid: nil, 36 + }, 37 + } 38 + 39 + for _, fix := range fixtures { 40 + assert.Equal(fix.cid, CidFromCdnUrl(&fix.url)) 41 + } 42 + }
+23 -1
automod/engine/fetch_account_meta.go
··· 5 5 "encoding/json" 6 6 "errors" 7 7 "fmt" 8 + "net/url" 9 + "strings" 8 10 "time" 9 11 10 12 comatproto "github.com/bluesky-social/indigo/api/atproto" ··· 16 18 ) 17 19 18 20 var newAccountRetryDuration = 3 * 1000 * time.Millisecond 21 + 22 + // get the cid from a bluesky cdn url 23 + func CidFromCdnUrl(str *string) *string { 24 + if str == nil { 25 + return nil 26 + } 27 + 28 + u, err := url.Parse(*str) 29 + if err != nil || u.Host != "cdn.bsky.app" { 30 + return nil 31 + } 32 + 33 + parts := strings.Split(u.Path, "/") 34 + if len(parts) != 6 { 35 + return nil 36 + } 37 + 38 + return &strings.Split(parts[5], "@")[0] 39 + } 19 40 20 41 // Helper to hydrate metadata about an account from several sources: PDS (if access), mod service (if access), public identity resolution 21 42 func (e *Engine) GetAccountMeta(ctx context.Context, ident *identity.Identity) (*AccountMeta, error) { ··· 75 96 76 97 am.Profile = ProfileSummary{ 77 98 HasAvatar: pv.Avatar != nil, 78 - Avatar: pv.Avatar, 99 + AvatarCid: cidFromCdnUrl(pv.Avatar), 100 + BannerCid: cidFromCdnUrl(pv.Banner), 79 101 Description: pv.Description, 80 102 DisplayName: pv.DisplayName, 81 103 }
+24
automod/engine/util.go
··· 1 1 package engine 2 2 3 + import ( 4 + "net/url" 5 + "strings" 6 + ) 7 + 3 8 func dedupeStrings(in []string) []string { 4 9 var out []string 5 10 seen := make(map[string]bool) ··· 11 16 } 12 17 return out 13 18 } 19 + 20 + // get the cid from a bluesky cdn url 21 + func cidFromCdnUrl(str *string) *string { 22 + if str == nil { 23 + return nil 24 + } 25 + 26 + u, err := url.Parse(*str) 27 + if err != nil || u.Host != "cdn.bsky.app" { 28 + return nil 29 + } 30 + 31 + parts := strings.Split(u.Path, "/") 32 + if len(parts) != 6 { 33 + return nil 34 + } 35 + 36 + return &strings.Split(parts[5], "@")[0] 37 + }