Documentation
¶
Index ¶
- Variables
- func BuildTitleZapScript(systemID, name string, tags []TagInfo) string
- func CheckSchemaVersion(db *sql.DB, migrationFiles embed.FS, migrationDir string) error
- func GroupTagFiltersByOperator(filters []zapscript.TagFilter) (and, not, or []zapscript.TagFilter)
- func MediaKey(systemID, path string) string
- func MigrateUp(db *sql.DB, migrationFiles embed.FS, migrationDir string) error
- func TagKey(tagType, tagValue string) string
- func TitleKey(systemID, slug string) string
- type BrowseCursor
- type BrowseDirectoryResult
- type BrowseFilesOptions
- type BrowseVirtualScheme
- type Client
- type Database
- type FileInfo
- type GenericDBI
- type HistoryEntry
- type InboxMessage
- type JournalMode
- type Mapping
- type Media
- type MediaDBI
- type MediaHistoryEntry
- type MediaHistoryTopEntry
- type MediaQuery
- type MediaTag
- type MediaTagLink
- type MediaTitle
- type MediaWithFullPath
- type ScanState
- type SearchFilters
- type SearchResult
- type SearchResultWithCursor
- type System
- type Tag
- type TagInfo
- type TagType
- type TitleWithSystem
- type UserDBI
Constants ¶
This section is empty.
Variables ¶
var ErrSchemaAhead = errors.New("database schema is newer than this binary supports")
ErrSchemaAhead is returned when the database schema version is newer than the binary supports. This happens when switching from a newer binary (e.g. beta) to an older one (e.g. stable).
var ZapScriptTagTypes = []string{"year", "players", "rev", "developer", "publisher", "credit", "edition", "release"}
ZapScriptTagTypes defines which tag types are eligible for inclusion in ZapScript title commands. Only these types are considered when checking for disambiguation.
Functions ¶
func BuildTitleZapScript ¶ added in v2.10.0
BuildTitleZapScript builds a ZapScript title command string from a system ID, media name, and disambiguating tags. Format: @SystemID/Name (year:YYYY) (type:value) Only includes tags that are present in the provided slice.
func CheckSchemaVersion ¶ added in v2.11.0
CheckSchemaVersion compares the database's migration version against the latest migration embedded in the current binary. Returns ErrSchemaAhead if the database is ahead, preventing the older binary from running against an incompatible schema.
func GroupTagFiltersByOperator ¶ added in v2.7.0
GroupTagFiltersByOperator groups tag filters by operator type for consistent processing. Returns (andFilters, notFilters, orFilters) to enable both SQL generation and in-memory filtering to use the same grouping logic.
func MediaKey ¶ added in v2.9.1
MediaKey builds a composite key for media deduplication: "systemID:path"
func MigrateUp ¶ added in v2.7.0
MigrateUp provides thread-safe database migration using goose. It locks access to goose's global state to prevent race conditions between multiple databases setting their migration filesystems.
Types ¶
type BrowseCursor ¶ added in v2.10.0
BrowseCursor holds the keyset pagination state for browse queries. SortValue is the value of the sort column (Name or Path) from the last result, and LastID is the DBID tiebreaker.
type BrowseDirectoryResult ¶ added in v2.10.0
BrowseDirectoryResult represents a subdirectory found during browse navigation.
type BrowseFilesOptions ¶ added in v2.10.0
type BrowseFilesOptions struct {
Cursor *BrowseCursor
Letter *string
PathPrefix string
Sort string
Limit int
}
BrowseFilesOptions contains parameters for the BrowseFiles query.
type BrowseVirtualScheme ¶ added in v2.10.0
BrowseVirtualScheme represents a virtual URI scheme with indexed content.
type Client ¶ added in v2.11.0
type Client struct {
ClientID string `json:"clientId"`
ClientName string `json:"clientName"`
AuthToken string `json:"-"`
PairingKey []byte `json:"-"`
DBID int64 `json:"-"`
CreatedAt int64 `json:"createdAt"`
LastSeenAt int64 `json:"lastSeenAt"`
}
Client represents a paired API client. AuthToken and PairingKey are hidden from JSON (API uses models.PairedClient instead).
type GenericDBI ¶
type HistoryEntry ¶
type HistoryEntry struct {
Time time.Time `json:"time"`
CreatedAt time.Time `json:"createdAt,omitempty"`
SyncedAt *time.Time `json:"syncedAt,omitempty"`
DeviceID *string `json:"deviceId,omitempty"`
BootUUID string `json:"bootUuid,omitempty"`
ID string `json:"uuid,omitempty"`
TokenData string `json:"tokenData"`
TokenValue string `json:"tokenValue"`
TokenID string `json:"tokenId"`
Type string `json:"type"`
DBID int64 `db:"DBID" json:"id"`
MonotonicStart int64 `json:"monotonicStart,omitempty"`
Success bool `json:"success"`
ClockReliable bool `json:"clockReliable"`
IsDeleted bool `json:"isDeleted,omitempty"`
}
type InboxMessage ¶ added in v2.8.0
type JournalMode ¶ added in v2.7.0
type JournalMode string
JournalMode represents SQLite journal mode
const ( JournalModeWAL JournalMode = "WAL" JournalModeDELETE JournalMode = "DELETE" )
Journal mode constants
type MediaDBI ¶
type MediaDBI interface {
GenericDBI
BeginTransaction(batchEnabled bool) error
CommitTransaction() error
RollbackTransaction() error
Exists() bool
UpdateLastGenerated() error
GetLastGenerated() (time.Time, error)
SetOptimizationStatus(status string) error
GetOptimizationStatus() (string, error)
SetOptimizationStep(step string) error
GetOptimizationStep() (string, error)
RunBackgroundOptimization(statusCallback func(optimizing bool), pauser *syncutil.Pauser)
WaitForBackgroundOperations()
TrackBackgroundOperation()
BackgroundOperationDone()
InvalidateCountCache() error
RebuildSlugSearchCache() error
RebuildTagCache() error
// Slug resolution cache methods
GetCachedSlugResolution(
ctx context.Context, systemID, slug string, tagFilters []zapscript.TagFilter,
) (int64, string, bool)
SetCachedSlugResolution(
ctx context.Context, systemID, slug string, tagFilters []zapscript.TagFilter, mediaDBID int64, strategy string,
) error
InvalidateSlugCache(ctx context.Context) error
InvalidateSlugCacheForSystems(ctx context.Context, systemIDs []string) error
GetMediaByDBID(ctx context.Context, mediaDBID int64) (SearchResultWithCursor, error)
GetZapScriptTagsBySystemAndPath(ctx context.Context, systemID, path string) ([]TagInfo, error)
SetIndexingCacheSize(enable bool)
DropSecondaryIndexes() error
CreateSecondaryIndexes() error
SetIndexingStatus(status string) error
GetIndexingStatus() (string, error)
SetLastIndexedSystem(systemID string) error
GetLastIndexedSystem() (string, error)
SetIndexingSystems(systemIDs []string) error
GetIndexingSystems() ([]string, error)
TruncateSystems(systemIDs []string) error
SearchMediaPathExact(systems []systemdefs.System, query string) ([]SearchResult, error)
SearchMediaWithFilters(ctx context.Context, filters *SearchFilters) ([]SearchResultWithCursor, error)
SearchMediaBySlug(
ctx context.Context, systemID string, slug string, tags []zapscript.TagFilter,
) ([]SearchResultWithCursor, error)
SearchMediaBySecondarySlug(
ctx context.Context, systemID string, secondarySlug string, tags []zapscript.TagFilter,
) ([]SearchResultWithCursor, error)
SearchMediaBySlugPrefix(
ctx context.Context, systemID string, slugPrefix string, tags []zapscript.TagFilter,
) ([]SearchResultWithCursor, error)
SearchMediaBySlugIn(
ctx context.Context, systemID string, slugs []string, tags []zapscript.TagFilter,
) ([]SearchResultWithCursor, error)
GetTitlesWithPreFilter(
ctx context.Context, systemID string, minLength, maxLength, minWordCount, maxWordCount int,
) ([]MediaTitle, error)
GetLaunchCommandForMedia(ctx context.Context, systemID, path string) (string, error)
GetTags(ctx context.Context, systems []systemdefs.System) ([]TagInfo, error)
GetAllUsedTags(ctx context.Context) ([]TagInfo, error)
PopulateSystemTagsCache(ctx context.Context) error
PopulateSystemTagsCacheForSystems(ctx context.Context, systems []systemdefs.System) error
RefreshSlugSearchCacheForSystems(ctx context.Context, systemIDs []string) error
GetSystemTagsCached(ctx context.Context, systems []systemdefs.System) ([]TagInfo, error)
InvalidateSystemTagsCache(ctx context.Context, systems []systemdefs.System) error
SearchMediaPathGlob(systems []systemdefs.System, query string) ([]SearchResult, error)
// Browse methods for directory-style navigation of indexed content
BrowseDirectories(ctx context.Context, pathPrefix string) ([]BrowseDirectoryResult, error)
BrowseFiles(ctx context.Context, opts *BrowseFilesOptions) ([]SearchResultWithCursor, error)
BrowseFileCount(ctx context.Context, pathPrefix string, letter *string) (int, error)
BrowseVirtualSchemes(ctx context.Context) ([]BrowseVirtualScheme, error)
BrowseRootCounts(ctx context.Context, rootDirs []string) (map[string]*int, error)
PopulateBrowseCache(ctx context.Context) error
IndexedSystems() ([]string, error)
SystemIndexed(system *systemdefs.System) bool
RandomGame(systems []systemdefs.System) (SearchResult, error)
RandomGameWithQuery(query *MediaQuery) (SearchResult, error)
GetTotalMediaCount() (int, error)
FindSystem(row System) (System, error)
FindSystemBySystemID(systemID string) (System, error)
InsertSystem(row System) (System, error)
FindOrInsertSystem(row System) (System, error)
FindMediaTitle(row *MediaTitle) (MediaTitle, error)
InsertMediaTitle(row *MediaTitle) (MediaTitle, error)
FindOrInsertMediaTitle(row *MediaTitle) (MediaTitle, error)
FindMedia(row Media) (Media, error)
InsertMedia(row Media) (Media, error)
FindOrInsertMedia(row Media) (Media, error)
UpdateMediaTitle(mediaDBID, mediaTitleDBID int64) error
DeleteMediaTags(mediaDBID int64) error
DeleteMediaTag(mediaDBID, tagDBID int64) error
FindTagType(row TagType) (TagType, error)
InsertTagType(row TagType) (TagType, error)
FindOrInsertTagType(row TagType) (TagType, error)
FindTag(row Tag) (Tag, error)
InsertTag(row Tag) (Tag, error)
FindOrInsertTag(row Tag) (Tag, error)
FindMediaTag(row MediaTag) (MediaTag, error)
InsertMediaTag(row MediaTag) (MediaTag, error)
FindOrInsertMediaTag(row MediaTag) (MediaTag, error)
// Missing media methods for persistent indexing
BulkSetMediaMissing(dbids map[int]struct{}) error
ResetMissingFlags(systemDBIDs []int) error
// GetMax*ID methods for resume functionality
GetMaxSystemID() (int64, error)
GetMaxTitleID() (int64, error)
GetMaxMediaID() (int64, error)
GetMaxTagTypeID() (int64, error)
GetMaxTagID() (int64, error)
GetMaxMediaTagID() (int64, error)
// GetAll* methods for populating scan state maps
GetAllSystems() ([]System, error)
GetAllMediaTitles() ([]MediaTitle, error)
GetAllMedia() ([]Media, error)
GetAllTags() ([]Tag, error)
GetAllTagTypes() ([]TagType, error)
// Optimized JOIN query methods for populating scan state
GetTitlesWithSystems() ([]TitleWithSystem, error)
GetMediaWithFullPath() ([]MediaWithFullPath, error)
// Optimized JOIN query methods for selective indexing (excluding specified systems)
GetSystemsExcluding(excludeSystemIDs []string) ([]System, error)
GetTitlesWithSystemsExcluding(excludeSystemIDs []string) ([]TitleWithSystem, error)
GetMediaWithFullPathExcluding(excludeSystemIDs []string) ([]MediaWithFullPath, error)
// Per-system query methods for lazy loading during resume
GetTitlesBySystemID(systemID string) ([]TitleWithSystem, error)
GetMediaBySystemID(systemID string) ([]MediaWithFullPath, error)
GetMediaTagsBySystemID(systemID string) ([]MediaTagLink, error)
}
type MediaHistoryEntry ¶ added in v2.7.0
type MediaHistoryEntry struct {
StartTime time.Time `json:"startTime"`
UpdatedAt time.Time `json:"updatedAt,omitempty"`
CreatedAt time.Time `json:"createdAt,omitempty"`
EndTime *time.Time `json:"endTime,omitempty"`
SyncedAt *time.Time `json:"syncedAt,omitempty"`
DeviceID *string `json:"deviceId,omitempty"`
BootUUID string `json:"bootUuid,omitempty"`
ClockSource string `json:"clockSource,omitempty"`
SystemID string `json:"systemId"`
ID string `json:"uuid,omitempty"`
LauncherID string `json:"launcherId"`
SystemName string `json:"systemName"`
MediaPath string `json:"mediaPath"`
MediaName string `json:"mediaName"`
DBID int64 `db:"DBID" json:"id"`
WallDuration int `json:"wallDuration"`
DurationSec int `json:"durationSec"`
MonotonicStart int64 `json:"monotonicStart,omitempty"`
PlayTime int `json:"playTime"`
TimeSkewFlag bool `json:"timeSkewFlag"`
ClockReliable bool `json:"clockReliable"`
IsDeleted bool `json:"isDeleted,omitempty"`
}
type MediaHistoryTopEntry ¶ added in v2.10.0
type MediaQuery ¶ added in v2.7.0
type MediaQuery struct {
PathGlob string `json:"pathGlob,omitempty"`
PathPrefix string `json:"pathPrefix,omitempty"`
Systems []string `json:"systems,omitempty"`
Tags []zapscript.TagFilter `json:"tags,omitempty"`
}
MediaQuery represents parameters for querying media counts used in random selection
type MediaTagLink ¶ added in v2.11.0
type MediaTitle ¶
type MediaWithFullPath ¶ added in v2.7.0
type MediaWithFullPath struct {
Path string
TitleSlug string
SystemID string
DBID int64
MediaTitleDBID int64
}
MediaWithFullPath represents a Media item with its associated title and system information
type ScanState ¶
type ScanState struct {
SystemIDs map[string]int
TitleIDs map[string]int
MediaIDs map[string]int
MediaTitleIDs map[int]int // Existing media DBID -> MediaTitleDBID for persistent reconciliation
MediaTagIDs map[int]map[int]struct{}
TagTypeIDs map[string]int
TagIDs map[string]int
MissingMedia map[int]struct{} // DBIDs of media not yet re-found during scan
SystemsIndex int
TitlesIndex int
MediaIndex int
TagTypesIndex int
TagsIndex int
}
type SearchFilters ¶ added in v2.7.0
type SearchFilters struct {
Cursor *int64 `json:"cursor,omitempty"`
Letter *string `json:"letter,omitempty"`
Query string `json:"query"`
Systems []systemdefs.System `json:"systems,omitempty"`
Tags []zapscript.TagFilter `json:"tags,omitempty"`
Limit int `json:"limit"`
}
SearchFilters represents parameters for filtered media search
type SearchResult ¶
type SearchResultWithCursor ¶ added in v2.7.0
type SearchResultWithCursor struct {
SystemID string
Name string
Path string
Tags []TagInfo
ZapScriptTags []TagInfo // Disambiguating tags only (tags that differ across sibling variants)
MediaID int64
}
func (*SearchResultWithCursor) ZapScript ¶ added in v2.10.0
func (r *SearchResultWithCursor) ZapScript() string
ZapScript returns the ZapScript title command string for this search result. Uses ZapScriptTags (disambiguating tags only). If ZapScriptTags has not been computed (nil), no tags are emitted — callers that need disambiguation must ensure ZapScriptTags is populated via computeZapScriptTags or equivalent.
type TitleWithSystem ¶ added in v2.7.0
TitleWithSystem represents a MediaTitle with its associated System information
type UserDBI ¶
type UserDBI interface {
GenericDBI
AddHistory(entry *HistoryEntry) error
GetHistory(lastID int64) ([]HistoryEntry, error)
CleanupHistory(retentionDays int) (int64, error)
AddMediaHistory(entry *MediaHistoryEntry) (int64, error)
UpdateMediaHistoryTime(dbid int64, playTime int) error
CloseMediaHistory(dbid int64, endTime time.Time, playTime int) error
GetMediaHistory(systemIDs []string, lastID int64, limit int) ([]MediaHistoryEntry, error)
GetMediaHistoryTop(systemIDs []string, since *time.Time, limit int) ([]MediaHistoryTopEntry, error)
CloseHangingMediaHistory() error
CleanupMediaHistory(retentionDays int) (int64, error)
HealTimestamps(bootUUID string, trueBootTime time.Time) (int64, error)
AddMapping(m *Mapping) error
GetMapping(id int64) (Mapping, error)
DeleteMapping(id int64) error
UpdateMapping(id int64, m *Mapping) error
GetAllMappings() ([]Mapping, error)
GetEnabledMappings() ([]Mapping, error)
UpdateZapLinkHost(host string, zapscript int) error
GetZapLinkHost(host string) (bool, bool, error)
GetSupportedZapLinkHosts() ([]string, error)
PruneExpiredZapLinkHosts(olderThan time.Duration) (int64, error)
UpdateZapLinkCache(url string, zapscript string) error
GetZapLinkCache(url string) (string, error)
AddInboxMessage(msg *InboxMessage) (*InboxMessage, error)
GetInboxMessages() ([]InboxMessage, error)
DeleteInboxMessage(id int64) error
DeleteAllInboxMessages() (int64, error)
CreateClient(c *Client) error
GetClientByToken(authToken string) (*Client, error)
ListClients() ([]Client, error)
DeleteClient(clientID string) error
UpdateClientLastSeen(authToken string, lastSeenAt int64) error
CountClients() (int, error)
}