package hostimport "context"// ScrobbleRef represents one instance of a scrobble (instance id, file id, submission time)type ScrobbleRef struct {// The ID of the scrobble. Useful if duplicate scrobbles happen for the same timeID int64 `json:"id"`// The ID of the MediaFile submitted at this timeMediaFileID string `json:"mediaFileId"`// The UNIX timestamp this scrobble was submittedSubmissionTime int64 `json:"submissionTime"`}// ScrobbleOptions carries optional parameters for retrieving user scrobblestype ScrobbleOptions struct {// The starting unix timestamp to query for scrobbles (inclusive).// If not specified, start from the first scrobbleFromTimestamp *int64 `json:"fromTimestamp,omitempty"`// The ending unix timestamp to query for scrobbles (inclusive).// If not specified, go up to the last scrobbleToTimestamp *int64 `json:"toTimestamp,omitempty"`// If true, return scrobbles from newest to oldest. Defaults to oldest firstDescending bool `json:"descending"`// The maximum number of items to retrieve. This is capped at 5000, the// default if not specifiedMaxItems int `json:"maxItems"`// Pagination state managed by GetScrobbles; only meaningful on the options it returns.// Never set it or combine it with your own timestamps — scrobbles may be silently skippedOffset int `json:"offset,omitempty"`}// ScrobbleCountOptions carries optional parameters for counting user scrobblestype ScrobbleCountOptions struct {// The starting unix timestamp to query for scrobbles (inclusive).// If not specified, start from the first scrobbleFromTimestamp *int64 `json:"fromTimestamp,omitempty"`// The ending unix timestamp to query for scrobbles (inclusive).// If not specified, go up to the last scrobbleToTimestamp *int64 `json:"toTimestamp,omitempty"`}// ScrobbleRetrieverService allows a plugin to retrieve scrobbles for one or more authorized users.// It will only provide the media_file ID and submission time, which can be combined with the MatcherService// to fetch deduped tracks////nd:hostservice name=ScrobbleRetriever permission=scrobbleRetrievertype ScrobbleRetrieverService interface {// GetFirstTimestamp returns the unix timestamp of the oldest scrobble for the user.// If the user has no scrobbles, returns nil//nd:hostfuncGetFirstTimestamp(ctx context.Context, username string) (*int64, error)// GetLastTimestamp returns the unix timestamp of the most recent scrobble for the user// If the user has no scrobbles, return nil//nd:hostfuncGetLastTimestamp(ctx context.Context, username string) (*int64, error)// GetScrobbles returns one page of scrobbles for a user.//// Parameters:// - username: the user to query for scrobbles// - options.FromTimestamp: If specified, the first UNIX timestamp to start fetching scrobbles (inclusive). Otherwise, start from the first scrobble// - options.ToTimestamp: If specified, the last UNIX timestamp to fetch (inclusive). Otherwise, end at the last scrobble// - options.Descending: If true, order from newest to oldest. Otherwise, oldest to newest// - options.MaxItems: The maximum number of items to retrieve. The maximum value (and default) if not specified is 5000// - options.Offset: Pagination state; only valid as received on the options returned by a previous call. Never set it manually//// Returns:// - scrobbles: The scrobbles in the requested range, ordered by submission time// (ties broken by scrobble ID) in the direction given by options.Descending// - next: The options for the following page, or nil once no scrobbles remain.// Pass it back to GetScrobbles unchanged and repeat until it is nil. It carries an// adjusted FromTimestamp/ToTimestamp, so keep a copy if you still need the original range//nd:hostfuncGetScrobbles(ctx context.Context, username string, options ScrobbleOptions) (scrobbles []ScrobbleRef, next *ScrobbleOptions, err error)// GetScrobbleCount returns the number of scrobbles for a user in a given range//// Parameters:// - username: the user to query for scrobbles// - options.FromTimestamp: If specified, the first UNIX timestamp to start fetching scrobbles (inclusive). Otherwise, start from the first scrobble// - options.ToTimestamp: If specified, the last UNIX timestamp to fetch (inclusive). Otherwise, end at the last scrobble//// Returns:// - the number of scrobbles in the given range, or 0//nd:hostfuncGetScrobbleCount(ctx context.Context, username string, options ScrobbleCountOptions) (int64, error)}