feat: v0.0.10 (#23)

* feat: single SOT for themes + basic custom support

* fix: adjust colors for yuu theme

* feat: Allow loading of environment variables from file (#20)

* feat: allow loading of environment variables from file

* Panic if a file for an environment variable cannot be read

* Use log.Fatalf + os.Exit instead of panic

* fix: remove supurfluous call to os.Exit()

---------

Co-authored-by: adaexec <nixos-git.s1pht@simplelogin.com>
Co-authored-by: Gabe Farrell <90876006+gabehf@users.noreply.github.com>

* chore: add pr test workflow

* chore: changelog

* feat: make all activity grids configurable

* fix: adjust activity grid style

* fix: make background gradient consistent size

* revert: remove year from activity grid opts

* style: adjust top item list min size to 200px

* feat: add support for custom themes

* fix: stabilized the order of top items

* chore: update changelog

* feat: native import & export

* fix: use correct request body for alias requests

* fix: clear input when closing edit modal

* chore: changelog

* docs: make endpoint clearer for some apps

* feat: add ui and handler for export

* fix: fix pr test workflow

---------

Co-authored-by: adaexec <78047743+adaexec@users.noreply.github.com>
Co-authored-by: adaexec <nixos-git.s1pht@simplelogin.com>
This commit is contained in:
Gabe Farrell 2025-06-18 08:48:19 -04:00 committed by GitHub
parent 486f5d0269
commit c16b557c21
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
51 changed files with 1754 additions and 866 deletions

View file

@ -128,6 +128,7 @@ func (d *Psql) SaveArtistAliases(ctx context.Context, id int32, aliases []string
}
defer tx.Rollback(ctx)
qtx := d.q.WithTx(tx)
l.Debug().Msgf("Fetching existing artist aliases for artist %d...", id)
existing, err := qtx.GetAllArtistAliases(ctx, id)
if err != nil {
return fmt.Errorf("SaveArtistAliases: GetAllArtistAliases: %w", err)
@ -135,8 +136,10 @@ func (d *Psql) SaveArtistAliases(ctx context.Context, id int32, aliases []string
for _, v := range existing {
aliases = append(aliases, v.Alias)
}
l.Debug().Msgf("Ensuring aliases are unique...")
utils.Unique(&aliases)
for _, alias := range aliases {
l.Debug().Msgf("Inserting alias %s for artist with id %d", alias, id)
alias = strings.TrimSpace(alias)
if alias == "" {
return errors.New("SaveArtistAliases: aliases cannot be blank")

View file

@ -0,0 +1,59 @@
package psql
import (
"context"
"encoding/json"
"fmt"
"github.com/gabehf/koito/internal/db"
"github.com/gabehf/koito/internal/models"
"github.com/gabehf/koito/internal/repository"
)
func (d *Psql) GetExportPage(ctx context.Context, opts db.GetExportPageOpts) ([]*db.ExportItem, error) {
rows, err := d.q.GetListensExportPage(ctx, repository.GetListensExportPageParams{
UserID: opts.UserID,
TrackID: opts.TrackID,
Limit: opts.Limit,
ListenedAt: opts.ListenedAt,
})
if err != nil {
return nil, fmt.Errorf("GetExportPage: %w", err)
}
ret := make([]*db.ExportItem, len(rows))
for i, row := range rows {
var trackAliases []models.Alias
err = json.Unmarshal(row.TrackAliases, &trackAliases)
if err != nil {
return nil, fmt.Errorf("GetExportPage: json.Unmarshal trackAliases: %w", err)
}
var albumAliases []models.Alias
err = json.Unmarshal(row.ReleaseAliases, &albumAliases)
if err != nil {
return nil, fmt.Errorf("GetExportPage: json.Unmarshal albumAliases: %w", err)
}
var artists []models.ArtistWithFullAliases
err = json.Unmarshal(row.Artists, &artists)
if err != nil {
return nil, fmt.Errorf("GetExportPage: json.Unmarshal artists: %w", err)
}
ret[i] = &db.ExportItem{
TrackID: row.TrackID,
ListenedAt: row.ListenedAt,
UserID: row.UserID,
Client: row.Client,
TrackMbid: row.TrackMbid,
TrackDuration: row.TrackDuration,
TrackAliases: trackAliases,
ReleaseID: row.ReleaseID,
ReleaseMbid: row.ReleaseMbid,
ReleaseImageSource: row.ReleaseImageSource.String,
VariousArtists: row.VariousArtists,
ReleaseAliases: albumAliases,
Artists: artists,
}
}
return ret, nil
}