A website inspired by Last.fm that will keep track of your listening statistics
lastfm music statistics
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Make the mediaprovider able to process images for releases (cover art) as well.

oscar345 eb9bd386 74ea6081

+78 -9
+75 -8
internal/providers/image.go
··· 2 2 3 3 import ( 4 4 "context" 5 + "errors" 5 6 "log" 6 7 "path" 7 8 "sync" ··· 12 13 ) 13 14 14 15 type MediaProvider struct { 15 - storage storagesvc.Storage 16 - artistImageFetcher image.ArtistImageFetcher 16 + storage storagesvc.Storage 17 + artistImageFetcher image.ArtistImageFetcher 18 + releaseImageFetcher image.ReleaseImageFetcher 17 19 } 18 20 19 - func NewMediaProvider(storage storagesvc.Storage, artistImageFetcher image.ArtistImageFetcher) *MediaProvider { 21 + func NewMediaProvider( 22 + storage storagesvc.Storage, 23 + artistImageFetcher image.ArtistImageFetcher, 24 + releaseImageFetcher image.ReleaseImageFetcher, 25 + ) *MediaProvider { 20 26 return &MediaProvider{ 21 - storage: storage, 22 - artistImageFetcher: artistImageFetcher, 27 + storage: storage, 28 + artistImageFetcher: artistImageFetcher, 29 + releaseImageFetcher: releaseImageFetcher, 23 30 } 24 31 } 25 32 ··· 36 43 } 37 44 38 45 if len(images) == 0 { 39 - return "", nil 46 + return "", errors.New("no images found") 40 47 } 41 48 image := images[0] 42 49 ··· 59 66 result := make(map[string]string, len(mbids)) 60 67 61 68 for _, mbid := range mbids { 62 - mbid := mbid 63 69 g.Go(func() error { 64 70 if url, err := mp.GetArtistImage(ctx, mbid); err == nil { 65 71 mu.Lock() ··· 72 78 }) 73 79 } 74 80 75 - _ = g.Wait() 81 + if err := g.Wait(); err != nil { 82 + return nil, err 83 + } 84 + 76 85 return result, nil 77 86 } 78 87 79 88 func createArtistImageFilename(mbid string) string { 80 89 return path.Join("images", "artists", mbid) 81 90 } 91 + 92 + func createReleaseImageFilename(mbid string) string { 93 + return path.Join("images", "releases", mbid) 94 + } 95 + 96 + func (mp *MediaProvider) GetReleaseImage(ctx context.Context, mbid string) (string, error) { 97 + filename := createReleaseImageFilename(mbid) 98 + if mp.storage.Exists(filename) { 99 + return mp.storage.GetURL(filename), nil 100 + } 101 + 102 + images, err := mp.releaseImageFetcher.ListImages(ctx, mbid) 103 + if err != nil { 104 + return "", err 105 + } 106 + 107 + if len(images) == 0 { 108 + return "", errors.New("no images found") 109 + } 110 + 111 + image := images[0] 112 + 113 + content, err := mp.releaseImageFetcher.FetchImage(ctx, image) 114 + if err != nil { 115 + return "", err 116 + } 117 + 118 + if err := mp.storage.Save(content, filename); err != nil { 119 + return "", err 120 + } 121 + 122 + return mp.storage.GetURL(filename), nil 123 + } 124 + 125 + func (mp *MediaProvider) ListReleasesImages(ctx context.Context, mbids []string) (map[string]string, error) { 126 + g, ctx := errgroup.WithContext(ctx) 127 + 128 + var mu sync.Mutex 129 + result := make(map[string]string, len(mbids)) 130 + 131 + for _, mbid := range mbids { 132 + g.Go(func() error { 133 + if image, err := mp.GetReleaseImage(ctx, mbid); err != nil { 134 + mu.Lock() 135 + result[mbid] = image 136 + mu.Unlock() 137 + } 138 + 139 + return nil 140 + }) 141 + } 142 + 143 + if err := g.Wait(); err != nil { 144 + return nil, err 145 + } 146 + 147 + return result, nil 148 + }
+3 -1
internal/server/server.go
··· 76 76 userRepo := db.NewUserRepoDB(musicbrainzDB) 77 77 userFollowRepo := db.NewUserFollowRepoDB(musicbrainzDB) 78 78 79 + releaseImageFetcher := image.NewReleaseImageFetcherCoverArtArchive() 80 + 79 81 storage := storagesvc.NewDiskStorage("/public", s.config.Storage.Disk.Path) 80 82 81 - mediaProvider := providers.NewMediaProvider(storage, artistImageFetcher) 83 + mediaProvider := providers.NewMediaProvider(storage, artistImageFetcher, releaseImageFetcher) 82 84 83 85 return Services{ 84 86 Artist: services.NewArtistService(