diff --git a/backend/database/sql/queries/audio_files.sql b/backend/database/sql/queries/audio_files.sql index 54fde5e..d0350c0 100644 --- a/backend/database/sql/queries/audio_files.sql +++ b/backend/database/sql/queries/audio_files.sql @@ -95,7 +95,9 @@ SELECT af.bit_depth, af.channels, af.bitrate, - af.file_size + af.file_size, + af.play_count, + COALESCE(af.last_played, '') AS last_played FROM audio_files af JOIN recordings r ON af.recording_id = r.id JOIN artist_credit ac ON r.artist_credit_id = ac.id @@ -159,7 +161,9 @@ SELECT af.bit_depth, af.channels, af.bitrate, - af.file_size + af.file_size, + af.play_count, + COALESCE(af.last_played, '') AS last_played FROM audio_files af JOIN recordings r ON af.recording_id = r.id JOIN artist_credit ac ON r.artist_credit_id = ac.id diff --git a/backend/database/sql/sqlcgen/audio_files.sql.go b/backend/database/sql/sqlcgen/audio_files.sql.go index 232ae91..84539c8 100644 --- a/backend/database/sql/sqlcgen/audio_files.sql.go +++ b/backend/database/sql/sqlcgen/audio_files.sql.go @@ -253,7 +253,9 @@ SELECT af.bit_depth, af.channels, af.bitrate, - af.file_size + af.file_size, + af.play_count, + COALESCE(af.last_played, '') AS last_played FROM audio_files af JOIN recordings r ON af.recording_id = r.id JOIN artist_credit ac ON r.artist_credit_id = ac.id @@ -279,6 +281,8 @@ type GetAllTracksWithFullMetadataRow struct { Channels int64 Bitrate int64 FileSize int64 + PlayCount int64 + LastPlayed string } func (q *Queries) GetAllTracksWithFullMetadata(ctx context.Context) ([]GetAllTracksWithFullMetadataRow, error) { @@ -307,6 +311,8 @@ func (q *Queries) GetAllTracksWithFullMetadata(ctx context.Context) ([]GetAllTra &i.Channels, &i.Bitrate, &i.FileSize, + &i.PlayCount, + &i.LastPlayed, ); err != nil { return nil, err } @@ -344,7 +350,9 @@ SELECT af.bit_depth, af.channels, af.bitrate, - af.file_size + af.file_size, + af.play_count, + COALESCE(af.last_played, '') AS last_played FROM audio_files af JOIN recordings r ON af.recording_id = r.id JOIN artist_credit ac ON r.artist_credit_id = ac.id @@ -371,6 +379,8 @@ type GetAllTracksWithFullMetadataByLibraryRow struct { Channels int64 Bitrate int64 FileSize int64 + PlayCount int64 + LastPlayed string } func (q *Queries) GetAllTracksWithFullMetadataByLibrary(ctx context.Context, libraryID int64) ([]GetAllTracksWithFullMetadataByLibraryRow, error) { @@ -399,6 +409,8 @@ func (q *Queries) GetAllTracksWithFullMetadataByLibrary(ctx context.Context, lib &i.Channels, &i.Bitrate, &i.FileSize, + &i.PlayCount, + &i.LastPlayed, ); err != nil { return nil, err } diff --git a/backend/library/query.go b/backend/library/query.go index e707e77..84a2dd9 100644 --- a/backend/library/query.go +++ b/backend/library/query.go @@ -65,6 +65,8 @@ func mapTrackRow( year int64, composer, fileType string, sampleRate, bitDepth, channels, bitrate, fileSize int64, + playCount int64, + lastPlayed string, ) Track { return Track{ TrackName: title, @@ -83,6 +85,8 @@ func mapTrackRow( Channels: channels, Bitrate: bitrate, FileSize: fileSize, + PlayCount: playCount, + LastPlayed: lastPlayed, } } @@ -146,6 +150,8 @@ func (l *Library) GetAllTracks() ([]Track, error) { row.Channels, row.Bitrate, row.FileSize, + row.PlayCount, + row.LastPlayed, )) } @@ -198,6 +204,7 @@ func (l *Library) SearchTracks( row.Channels, row.Bitrate, row.FileSize, + 0, "", )) } @@ -237,6 +244,7 @@ func (l *Library) GetAlbumTracks(albumID int64) ([]Track, error) { row.Channels, row.Bitrate, row.FileSize, + 0, "", )) } @@ -411,6 +419,7 @@ func (l *Library) GetTracksByGenre( row.Channels, row.Bitrate, row.FileSize, + 0, "", )) } @@ -492,6 +501,8 @@ func (l *Library) GetAllTracksByLibrary( row.Channels, row.Bitrate, row.FileSize, + row.PlayCount, + row.LastPlayed, )) } @@ -724,6 +735,7 @@ func (l *Library) GetTracksByGenreByLibrary( row.Channels, row.Bitrate, row.FileSize, + 0, "", )) } @@ -775,6 +787,7 @@ func (l *Library) GetAlbumTracksByLibrary( row.Channels, row.Bitrate, row.FileSize, + 0, "", )) } @@ -822,6 +835,7 @@ func (l *Library) SearchTracksByLibrary( row.Channels, row.Bitrate, row.FileSize, + 0, "", )) } diff --git a/frontend/src/components/track-list/columns.ts b/frontend/src/components/track-list/columns.ts index d1b40e4..726b810 100644 --- a/frontend/src/components/track-list/columns.ts +++ b/frontend/src/components/track-list/columns.ts @@ -186,6 +186,16 @@ export const COLUMN_DEFS: Record = { comparator: (a, b) => compareNum(a.FileSize, b.FileSize), }, + playCount: { + id: 'playCount', + label: 'Plays', + accessor: (t) => + t.PlayCount ? String(t.PlayCount) : '', + defaultWidth: '60px', + align: 'right', + comparator: (a, b) => + compareNum(a.PlayCount, b.PlayCount), + }, }; /** diff --git a/frontend/wailsjs/go/models.ts b/frontend/wailsjs/go/models.ts index ad94455..b35f67d 100755 --- a/frontend/wailsjs/go/models.ts +++ b/frontend/wailsjs/go/models.ts @@ -266,6 +266,8 @@ export namespace library { Channels: number; Bitrate: number; FileSize: number; + PlayCount: number; + LastPlayed: string; static createFrom(source: any = {}) { return new Track(source); @@ -289,6 +291,8 @@ export namespace library { this.Channels = source["Channels"]; this.Bitrate = source["Bitrate"]; this.FileSize = source["FileSize"]; + this.PlayCount = source["PlayCount"]; + this.LastPlayed = source["LastPlayed"]; } }