Files
yellowjacket/frontend/bindings/yellowjacket/backend/explore/models.ts
T
logan 41c41a860e feat(explore): carry the local row id on a top result
`TopResult` was the one projection here that shipped `inLibrary` and no
local id, so the top-results cards had no choice but to read the weaker
flag. Every sibling model — `MBArtist`, `MBReleaseGroup`, `MBRecording`
— already carries `LocalID`, and the candidate builders had the value
in hand at every construction site.

`LocalID` is set and cleared by a test against `audio_files`, so it
means "there is something of mine here". `InLibrary` is written by the
same pass but is a one-way ratchet the prune can only clear alongside a
local id; it stays for scoring, which is where an approximate answer is
fine.
2026-08-19 00:37:57 -04:00

474 lines
12 KiB
TypeScript

// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
// This file is automatically generated. DO NOT EDIT
/**
* AlbumCompleteFunc answers "is the local album with this id complete",
* i.e. do its files declare a track total the library actually has.
*/
export type AlbumCompleteFunc = any;
/**
* CreditPart is one credited artist within a credit, in credit order.
*
* CreditedName is the name *as credited*, which is not the artist's own
* name: MusicBrainz credits "Snoop Dogg" on a track by the artist
* called "Snoop Doggy Dogg". Display uses it; navigation uses
* ArtistMBID. JoinPhrase is the literal connector that follows this
* part, so a credit renders by concatenation and never by searching a
* name inside a credit string.
*/
export interface CreditPart {
"position": number;
"artistMbid": string;
"creditedName": string;
"joinPhrase": string;
}
/**
* IndexStatus is the full index build status, exposed to the frontend.
*/
export interface IndexStatus {
"building": boolean;
"ready": boolean;
/**
* RFC3339 timestamp of last complete build
*/
"lastBuilt"?: string;
"tiers": TierStatus[] | null;
"artists": number;
"recordings": number;
"releaseGroups": number;
"totalRows": number;
}
/**
* LBSimilarArtist represents a similar artist from the
* ListenBrainz labs API.
*/
export interface LBSimilarArtist {
"artistMbid": string;
"name": string;
"score": number;
}
/**
* LBTopRecording represents a popular recording from the
* ListenBrainz popularity API.
*
* JSON tags use camelCase for Wails→frontend serialization.
* The API response uses snake_case, so we unmarshal into
* lbTopRecordingWire first, then convert.
*/
export interface LBTopRecording {
"recordingMbid": string;
"artistName": string;
"trackName": string;
"totalListenCount": number;
"caaReleaseMbid": string;
/**
* ReleaseGroupMBID is resolved from CAAReleaseMBID so a top-track
* row can link to its album page with the track highlighted.
*/
"releaseGroupMbid"?: string;
"releaseName": string;
/**
* milliseconds (from LB API)
*/
"length": number;
"inLibrary": boolean;
"localId"?: number;
}
/**
* LBTopReleaseGroup represents a popular release group from the
* ListenBrainz popularity API.
*/
export interface LBTopReleaseGroup {
"releaseGroupMbid": string;
"title": string;
"artistName": string;
"type": string;
"date": string;
"totalListenCount": number;
"caaReleaseMbid": string;
"inLibrary": boolean;
"localId"?: number;
}
/**
* LyricsResult is a single lyric-search hit, mapped from the DB layer
* into the camelCase shape the frontend consumes.
*/
export interface LyricsResult {
"audioFileId": number;
"filePath": string;
"lengthMs": number;
"title": string;
"artist": string;
"album": string;
}
/**
* MBArtist is a Wails-friendly projection of a MusicBrainz artist.
*/
export interface MBArtist {
"mbid": string;
"name": string;
"sortName": string;
"englishName"?: string;
"type": string;
"country": string;
"disambiguation": string;
"score": number;
/**
* raw LB listen count (0 if unknown)
*/
"popularity": number;
"listenerCount": number;
/**
* true if the user owns music by this artist
*/
"inLibrary": boolean;
/**
* local artist row ID for navigation
*/
"localId"?: number;
}
/**
* MBRecording is a Wails-friendly projection of a MusicBrainz
* recording.
*/
export interface MBRecording {
"mbid": string;
"title": string;
"length": number;
"artistCredit": string;
/**
* for linking the artist to its detail page
*/
"artistMbid"?: string;
"score": number;
/**
* raw LB listen count (0 if unknown)
*/
"popularity": number;
"listenerCount": number;
/**
* parent release, for album navigation
*/
"caaReleaseMbid"?: string;
/**
* ReleaseGroupMBID is resolved from CAAReleaseMBID so a track can
* link to its album page with the track highlighted, matching how
* tracks behave everywhere else.
*/
"releaseGroupMbid"?: string;
/**
* album title
*/
"releaseName"?: string;
/**
* true if the user owns this recording
*/
"inLibrary": boolean;
/**
* local recording row ID
*/
"localId"?: number;
}
/**
* MBRelease is a Wails-friendly projection of a MusicBrainz release.
*/
export interface MBRelease {
"mbid": string;
"title": string;
"date": string;
"country": string;
"status": string;
"artistCredit"?: string;
"tracks"?: MBTrack[] | null;
/**
* ReleaseGroupMBID is the parent release group's MBID. Empty unless
* the lookup requested the "release-groups" include (LookupRelease
* does); used to resolve a release-level MBID (what many taggers
* write) back to the release-group MBID everything else on the
* album page is keyed by.
*/
"releaseGroupMbid"?: string;
}
/**
* MBReleaseGroup is a Wails-friendly projection of a MusicBrainz
* release group.
*/
export interface MBReleaseGroup {
"mbid": string;
"title": string;
"primaryType": string;
"secondaryTypes"?: string[] | null;
"firstReleaseDate": string;
"artistCredit": string;
/**
* for linking the artist to its detail page
*/
"artistMbid"?: string;
/**
* raw LB listen count (0 if unknown)
*/
"popularity": number;
"listenerCount": number;
/**
* true if the user owns this album
*/
"inLibrary": boolean;
/**
* local release_group row ID
*/
"localId"?: number;
/**
* TotalTracks is the catalog's track count for this release group,
* or 0 for "the catalog does not say". It answers "how much of
* this album do I have" for an album whose files declared no total
* -- the case GetAlbumCompleteness cannot answer -- and it is not
* filled by the MusicBrainz path below, which has the real
* tracklist and does not need a denominator.
*/
"totalTracks": number;
}
/**
* MBSearchResult aggregates the three searchable entity types
* returned by the MusicBrainz search API.
*/
export interface MBSearchResult {
"artists"?: MBArtist[] | null;
"releaseGroups"?: MBReleaseGroup[] | null;
"recordings"?: MBRecording[] | null;
"topResults"?: TopResult[] | null;
}
/**
* MBTrack is a Wails-friendly projection of a MusicBrainz track.
*/
export interface MBTrack {
"position": number;
"discNumber": number;
"title": string;
"length": number;
"mbid": string;
"inLibrary": boolean;
"localId"?: number;
}
/**
* Shelf is one horizontal row on the Explore page.
*
* A shelf carries albums or artists, never both: they route to
* different pages and render as different cards, and a row that is
* sometimes one and sometimes the other is two components pretending to
* be one.
*/
export interface Shelf {
"id": string;
"kind": ShelfKind;
/**
* Title is the row heading.
*/
"title": string;
/**
* Subtitle says why these are here. As on Home it is not
* decoration: without it a shelf is indistinguishable from a
* random grid.
*/
"subtitle": string;
"albums"?: MBReleaseGroup[] | null;
"artists"?: MBArtist[] | null;
}
/**
* ShelfKind identifies what a shelf is built from, so the frontend can
* pick an icon and a spec can assert on a shelf without matching
* display copy.
*/
export enum ShelfKind {
/**
* The Go zero value for the underlying type of the enum.
*/
$zero = "",
/**
* Shelf kinds.
*/
ShelfPopularAlbums = "popular-albums",
ShelfPopularArtists = "popular-artists",
ShelfMoreFromOwned = "more-from-owned",
};
/**
* ShelfPage is what Explore renders before a query.
*
* State exists because "no shelves" has three different causes here and
* the page must not present them identically — a blank panel is the bug
* this whole feature is fixing, and a blank panel that says nothing
* about why is the same bug with more code behind it.
*/
export interface ShelfPage {
"shelves": Shelf[] | null;
/**
* State is one of:
*
* "ready" — the catalog is here and the shelves are below.
* "building" — it is being fetched or built right now.
* "no-index" — there is no catalog. Search still works over
* whatever is in the index, which may be nothing;
* the page says so and points at Settings.
*/
"state": string;
}
/**
* ThumbnailRequest is a single item in a batch thumbnail request.
*/
export interface ThumbnailRequest {
"mbid": string;
"albumName": string;
"artistName": string;
}
/**
* TierStatus represents the state of a single index tier.
*/
export interface TierStatus {
"name": string;
/**
* "pending", "running", "complete", "error", "skipped"
*/
"state": string;
"total": number;
"completed": number;
"error"?: string;
/**
* Detail is a human-readable progress line for stages whose raw
* completed/total numbers say little on their own — the listens
* stream reports "42.3 / 205.1 GB · 18 MB/s · ~3h20m left" here.
*/
"detail"?: string;
}
/**
* TopResult represents a single top-result card shown above the
* categorized search lists. Computed by intent scoring after all
* reranking is complete.
*/
export interface TopResult {
/**
* "artist", "release_group", "recording"
*/
"entityType": string;
"mbid": string;
"name": string;
/**
* for tracks/albums
*/
"artistCredit"?: string;
/**
* for linking the artist subtitle
*/
"artistMbid"?: string;
"intentScore": number;
/**
* Artist-specific
* "Group", "Person"
*/
"artistType"?: string;
"country"?: string;
/**
* Album-specific
*/
"primaryType"?: string;
"year"?: string;
/**
* Track-specific. ReleaseGroupMBID is resolved (from CAAReleaseMBID)
* so a track click can open its album page with the track highlighted,
* matching how tracks behave everywhere else. ReleaseName is the album
* title used for the album page header.
*/
"length"?: number;
"caaReleaseMbid"?: string;
"releaseGroupMbid"?: string;
"releaseName"?: string;
/**
* Library status — populated from index cross-reference columns.
*
* LocalID is the one the cards read. It is the local row behind
* this entity — an album, a file, an artist — and it is set and
* cleared by a test against `audio_files`, so it means "there is
* something of mine here". InLibrary is written by the same pass
* but is a one-way ratchet the prune can only clear alongside a
* local id, so it is the weaker of the two and stays for scoring
* (`fwInLibrary`), which is where an approximate answer is fine.
*/
"inLibrary": boolean;
"localId"?: number;
}
/**
* TrackLyrics is the stored or freshly-fetched lyrics for one track.
* Source is "embedded" (from the file's tags / library DB), "lrclib"
* (fetched on demand), or "" when none are available.
*/
export interface TrackLyrics {
"plain": string;
"synced": string;
"instrumental": boolean;
"source": string;
}
/**
* TrackThumbnailRequest is a single item in a batch track thumbnail
* request. Either ReleaseMBID or ReleaseGroupMBID may be empty;
* the proxy tries whichever is present.
*/
export interface TrackThumbnailRequest {
/**
* stable key used in the returned map
*/
"key": string;
"releaseMbid": string;
"releaseGroupMbid": string;
"albumName": string;
"artistName": string;
}