Documentation
      ¶
    
    
  
    
  
    Index ¶
- Constants
 - Variables
 - func ACAOHeaderOverwriteMiddleware(next echo.HandlerFunc) echo.HandlerFunc
 - func Resized(ext string, read io.ReadSeeker, width, height int, mode string) (resized io.ReadSeeker, w int, h int)
 - type AudioAnalysisResult
 - type AudioPreview
 - type BlobMetric
 - type BlobMetrics
 - type ByteRange
 - type ContactResponse
 - type DailyMetrics
 - type DelistEntity
 - type DelistStatus
 - type FFProbeResult
 - type FileReader
 - type GeoLocation
 - type GeoResult
 - type HealthCheckResponse
 - type HealthCheckResponseData
 - type HostAttrSniff
 - type HostTuple
 - type HostTuples
 - type JobTemplate
 - type MediorumConfig
 - type MediorumServer
 - type Metrics
 - type MonthlyMetrics
 - type PeerHealth
 - type PlayEvent
 - type PlayEventQueue
 - type QmAudioAnalysis
 - type RendezvousHasher
 - type RepairTracker
 - type StorageAndDbSize
 - type StorageService
 - func (s *StorageService) GetHealth(context.Context, *connect.Request[v1.GetHealthRequest]) (*connect.Response[v1.GetHealthResponse], error)
 - func (s *StorageService) GetIPData(ctx context.Context, req *connect.Request[v1.GetIPDataRequest]) (*connect.Response[v1.GetIPDataResponse], error)
 - func (s *StorageService) GetRendezvousNodes(ctx context.Context, req *connect.Request[v1.GetRendezvousNodesRequest]) (*connect.Response[v1.GetRendezvousNodesResponse], error)
 - func (s *StorageService) GetStatus(context.Context, *connect.Request[v1.GetStatusRequest]) (*connect.Response[v1.GetStatusResponse], error)
 - func (s *StorageService) GetStreamURL(ctx context.Context, req *connect.Request[v1.GetStreamURLRequest]) (*connect.Response[v1.GetStreamURLResponse], error)
 - func (s *StorageService) GetUpload(ctx context.Context, req *connect.Request[v1.GetUploadRequest]) (*connect.Response[v1.GetUploadResponse], error)
 - func (s *StorageService) Ping(context.Context, *connect.Request[v1.PingRequest]) (*connect.Response[v1.PingResponse], error)
 - func (s *StorageService) SetMediorum(mediorum *MediorumServer)
 - func (s *StorageService) StreamTrack(ctx context.Context, req *connect.Request[v1.StreamTrackRequest], ...) error
 - func (s *StorageService) UploadFiles(ctx context.Context, req *connect.Request[v1.UploadFilesRequest]) (*connect.Response[v1.UploadFilesResponse], error)
 
- type TranscodeStats
 - type UpdateUploadBody
 - type Upload
 - type UploadCursor
 
Constants ¶
      View Source
      
  const ( JobStatusNew = "new" JobStatusError = "error" JobStatusBusy = "busy" JobStatusTimeout = "timeout" JobStatusAudioAnalysis = "audio_analysis" JobStatusBusyAudioAnalysis = "busy_audio_analysis" JobStatusDone = "done" )
Job statuses
      View Source
      
  const ( StreamTrack string = "stream_track" ServeImage string = "serve_image" )
Metric actions
      View Source
      
  
    const ( DelistStatusPollingInterval = 20 * time.Second HTTPTimeout = 5 * time.Minute DelistBatchSize = 5000 TimeFormat = "2006-01-02 15:04:05.999999-07" Tracks DelistEntity = "tracks" Users DelistEntity = "users" )
      View Source
      
  
    const AUTO = -1
    
      View Source
      
  
    const MAX_TRIES = 3
    
      View Source
      
  
    const PercentSeededThreshold = 50
    
      View Source
      
  
const PullLimit = 10000
    Variables ¶
      View Source
      
  
var ( ErrDiskFull = errors.New("disk is too full to accept new uploads") ErrInvalidTemplate = errors.New("invalid template") ErrUploadToPlacementHosts = errors.New("if placement_hosts is specified, you must upload to one of the placement_hosts") ErrAllPlacementHostsMustBeRegisteredSigners = errors.New("all placement_hosts must be registered signers") ErrInvalidPreviewStartSeconds = errors.New("invalid preview start seconds") ErrUploadProcessFailed = errors.New("upload process failed") )
Functions ¶
func ACAOHeaderOverwriteMiddleware ¶
func ACAOHeaderOverwriteMiddleware(next echo.HandlerFunc) echo.HandlerFunc
Types ¶
type AudioAnalysisResult ¶
type AudioPreview ¶
type BlobMetric ¶
type BlobMetrics ¶
type BlobMetrics struct {
	Data []BlobMetric `json:"data"`
}
    type ContactResponse ¶
type ContactResponse struct {
	Email string `json:"email"`
}
    type DailyMetrics ¶
type DelistEntity ¶
type DelistEntity string
type DelistStatus ¶
type DelistStatus struct {
	CreatedAt time.Time `json:"-"`
	Delisted  bool      `json:"delisted"`
	Reason    string    `json:"reason"`
	// fields specific to TrackDelistStatus
	TrackID  int    `json:"trackId,omitempty"`
	TrackCID string `json:"trackCid,omitempty"`
	OwnerID  int    `json:"ownerId,omitempty"`
	// field specific to UserDelistStatus
	UserID int `json:"userId,omitempty"`
}
    func (*DelistStatus) UnmarshalJSON ¶
func (ds *DelistStatus) UnmarshalJSON(data []byte) error
type FFProbeResult ¶
type FileReader ¶
type FileReader interface {
	Filename() string
	Open() (io.ReadCloser, error)
}
    type GeoLocation ¶
type GeoLocation struct {
	Country struct {
		ISOCode string            `maxminddb:"iso_code"`
		Names   map[string]string `maxminddb:"names"`
	} `maxminddb:"country"`
	City struct {
		Names map[string]string `maxminddb:"names"`
	} `maxminddb:"city"`
	Location struct {
		Latitude  float64 `maxminddb:"latitude"`
		Longitude float64 `maxminddb:"longitude"`
	} `maxminddb:"location"`
	Subdivisions []struct {
		ISOCode string            `maxminddb:"iso_code"`
		Names   map[string]string `maxminddb:"names"`
	} `maxminddb:"subdivisions"`
}
    type HealthCheckResponse ¶
type HealthCheckResponse struct {
	Data      HealthCheckResponseData `json:"data"`
	Signer    string                  `json:"signer"`
	Signature string                  `json:"signature"`
	Timestamp time.Time               `json:"timestamp"`
}
    type HealthCheckResponseData ¶
type HealthCheckResponseData struct {
	Healthy                   bool                       `json:"healthy"`
	Version                   string                     `json:"version"`
	Service                   string                     `json:"service"` // used by registerWithDelegate()
	IsSeeding                 bool                       `json:"isSeeding"`
	IsAudiusdManaged          bool                       `json:"isAudiusdManaged"`
	BuiltAt                   string                     `json:"builtAt"`
	StartedAt                 time.Time                  `json:"startedAt"`
	SPID                      int                        `json:"spID"`
	SPOwnerWallet             string                     `json:"spOwnerWallet"`
	Git                       string                     `json:"git"`
	AudiusDockerCompose       string                     `json:"audiusDockerCompose"`
	MediorumPathUsed          uint64                     `json:"mediorumPathUsed"`   // bytes
	MediorumPathSize          uint64                     `json:"mediorumPathSize"`   // bytes
	StorageExpectation        uint64                     `json:"storageExpectation"` // bytes
	DatabaseSize              uint64                     `json:"databaseSize"`       // bytes
	DbSizeErr                 string                     `json:"dbSizeErr"`
	LastSuccessfulRepair      RepairTracker              `json:"lastSuccessfulRepair"`
	LastSuccessfulCleanup     RepairTracker              `json:"lastSuccessfulCleanup"`
	UploadsCount              int64                      `json:"uploadsCount"`
	UploadsCountErr           string                     `json:"uploadsCountErr"`
	AutoUpgradeEnabled        bool                       `json:"autoUpgradeEnabled"`
	TrustedNotifier           *ethcontracts.NotifierInfo `json:"trustedNotifier"`
	Env                       string                     `json:"env"`
	Self                      registrar.Peer             `json:"self"`
	WalletIsRegistered        bool                       `json:"wallet_is_registered"`
	Signers                   []registrar.Peer           `json:"signers"`
	ReplicationFactor         int                        `json:"replicationFactor"`
	Dir                       string                     `json:"dir"`
	BlobStorePrefix           string                     `json:"blobStorePrefix"`
	MoveFromBlobStorePrefix   string                     `json:"moveFromBlobStorePrefix"`
	ListenPort                string                     `json:"listenPort"`
	TrustedNotifierID         int                        `json:"trustedNotifierId"`
	PeerHealths               map[string]*PeerHealth     `json:"peerHealths"`
	UnreachablePeers          []string                   `json:"unreachablePeers"`
	FailsPeerReachability     bool                       `json:"failsPeerReachability"`
	StoreAll                  bool                       `json:"storeAll"`
	IsDbLocalhost             bool                       `json:"isDbLocalhost"`
	DiskHasSpace              bool                       `json:"diskHasSpace"`
	IsDiscoveryListensEnabled bool                       `json:"isDiscoveryListensEnabled"`
	TranscodeQueueLength      int                        `json:"transcodeQueueLength"`
	TranscodeStats            *TranscodeStats            `json:"transcodeStats"`
}
    type HostAttrSniff ¶
type HostAttrSniff struct {
	Host           string
	Attr           *blob.Attributes
	RendezvousRank int
}
    type HostTuples ¶
type HostTuples []HostTuple
func (HostTuples) Len ¶
func (s HostTuples) Len() int
func (HostTuples) Less ¶
func (s HostTuples) Less(i, j int) bool
func (HostTuples) Swap ¶
func (s HostTuples) Swap(i, j int)
type JobTemplate ¶
type JobTemplate string
Upload templates
const ( JobTemplateAudio JobTemplate = "audio" JobTemplateImgSquare JobTemplate = "img_square" JobTemplateImgBackdrop JobTemplate = "img_backdrop" )
type MediorumConfig ¶
type MediorumConfig struct {
	Env                       string
	Self                      registrar.Peer
	Peers                     []registrar.Peer
	Signers                   []registrar.Peer
	ReplicationFactor         int
	Dir                       string `default:"/tmp/mediorum"`
	BlobStoreDSN              string `json:"-"`
	MoveFromBlobStoreDSN      string `json:"-"`
	PostgresDSN               string `json:"-"`
	PrivateKey                string `json:"-"`
	ListenPort                string
	TrustedNotifierID         int
	SPID                      int
	SPOwnerWallet             string
	GitSHA                    string
	AudiusDockerCompose       string
	AutoUpgradeEnabled        bool
	WalletIsRegistered        bool
	StoreAll                  bool
	VersionJson               version.VersionJson
	DiscoveryListensEndpoints []string
	LogLevel                  string
	ProgrammableDistributionEnabled bool
	// contains filtered or unexported fields
}
    type MediorumServer ¶
type MediorumServer struct {
	StartedAt time.Time
	Config    MediorumConfig
	// contains filtered or unexported fields
}
    func New ¶
func New(lc *lifecycle.Lifecycle, logger *zap.Logger, config MediorumConfig, provider registrar.PeerProvider, posChannel chan pos.PoSRequest, core *coreServer.CoreService) (*MediorumServer, error)
func (*MediorumServer) MustStart ¶
func (ss *MediorumServer) MustStart() error
func (*MediorumServer) Stop ¶
func (ss *MediorumServer) Stop()
type MonthlyMetrics ¶
type PeerHealth ¶
type PlayEvent ¶
type PlayEvent struct {
	RowID            int
	UserID           string
	TrackID          string
	PlayTime         time.Time
	Signature        string
	City             string
	Region           string
	Country          string
	RequestSignature string
}
    func (PlayEvent) MarshalLogObject ¶
func (e PlayEvent) MarshalLogObject(enc zapcore.ObjectEncoder) error
Marshal a single PlayEvent
type PlayEventQueue ¶
type PlayEventQueue struct {
	// contains filtered or unexported fields
}
    func NewPlayEventQueue ¶
func NewPlayEventQueue() *PlayEventQueue
type QmAudioAnalysis ¶
type QmAudioAnalysis struct {
	CID        string               `json:"cid" gorm:"primaryKey;column:cid"`
	Mirrors    []string             `json:"mirrors" gorm:"serializer:json"`
	Status     string               `json:"status"`
	Error      string               `json:"error,omitempty"`
	ErrorCount int                  `json:"error_count"`
	AnalyzedBy string               `json:"analyzed_by"`
	AnalyzedAt time.Time            `json:"analyzed_at"`
	Results    *AudioAnalysisResult `json:"results" gorm:"serializer:json"`
}
    type RendezvousHasher ¶
type RendezvousHasher struct {
	// contains filtered or unexported fields
}
    func NewRendezvousHasher ¶
func NewRendezvousHasher(hosts []string) *RendezvousHasher
func (*RendezvousHasher) Rank ¶
func (rh *RendezvousHasher) Rank(key string) []string
type RepairTracker ¶
type RepairTracker struct {
	StartedAt        time.Time `gorm:"primaryKey;not null"`
	UpdatedAt        time.Time `gorm:"not null"`
	FinishedAt       time.Time
	CleanupMode      bool           `gorm:"not null"`
	CursorI          int            `gorm:"not null"`
	CursorUploadID   string         `gorm:"not null"`
	CursorPreviewCID string         ``
	CursorQmCID      string         `gorm:"not null"`
	Counters         map[string]int `gorm:"not null;serializer:json"`
	ContentSize      int64          `gorm:"not null"`
	Duration         time.Duration  `gorm:"not null"`
	AbortedReason    string         `gorm:"not null"`
}
    type StorageAndDbSize ¶
type StorageAndDbSize struct {
	LoggedAt           time.Time `gorm:"primaryKey;not null"`
	Host               string    `gorm:"primaryKey;not null"`
	StorageBackend     string    `gorm:"not null"`
	DbUsed             uint64    `gorm:"not null"`
	MediorumDiskUsed   uint64    `gorm:"not null"`
	MediorumDiskSize   uint64    `gorm:"not null"`
	StorageExpectation uint64    `gorm:"not null;default:0"`
	LastRepairSize     int64     `gorm:"not null"`
	LastCleanupSize    int64     `gorm:"not null"`
}
    type StorageService ¶
type StorageService struct {
	// contains filtered or unexported fields
}
    func NewStorageService ¶
func NewStorageService() *StorageService
func (*StorageService) GetHealth ¶
func (s *StorageService) GetHealth(context.Context, *connect.Request[v1.GetHealthRequest]) (*connect.Response[v1.GetHealthResponse], error)
GetHealth implements v1connect.StorageServiceHandler.
func (*StorageService) GetIPData ¶
func (s *StorageService) GetIPData(ctx context.Context, req *connect.Request[v1.GetIPDataRequest]) (*connect.Response[v1.GetIPDataResponse], error)
GetIPData implements v1connect.StorageServiceHandler.
func (*StorageService) GetRendezvousNodes ¶
func (s *StorageService) GetRendezvousNodes(ctx context.Context, req *connect.Request[v1.GetRendezvousNodesRequest]) (*connect.Response[v1.GetRendezvousNodesResponse], error)
GetRendezvousNodes implements v1connect.StorageServiceHandler.
func (*StorageService) GetStatus ¶
func (s *StorageService) GetStatus(context.Context, *connect.Request[v1.GetStatusRequest]) (*connect.Response[v1.GetStatusResponse], error)
GetStatus implements v1connect.StorageServiceHandler.
func (*StorageService) GetStreamURL ¶
func (s *StorageService) GetStreamURL(ctx context.Context, req *connect.Request[v1.GetStreamURLRequest]) (*connect.Response[v1.GetStreamURLResponse], error)
GetStreamURL implements v1connect.StorageServiceHandler.
func (*StorageService) GetUpload ¶
func (s *StorageService) GetUpload(ctx context.Context, req *connect.Request[v1.GetUploadRequest]) (*connect.Response[v1.GetUploadResponse], error)
GetUpload implements v1connect.StorageServiceHandler.
func (*StorageService) Ping ¶
func (s *StorageService) Ping(context.Context, *connect.Request[v1.PingRequest]) (*connect.Response[v1.PingResponse], error)
Ping implements v1connect.StorageServiceHandler.
func (*StorageService) SetMediorum ¶
func (s *StorageService) SetMediorum(mediorum *MediorumServer)
func (*StorageService) StreamTrack ¶
func (s *StorageService) StreamTrack(ctx context.Context, req *connect.Request[v1.StreamTrackRequest], stream *connect.ServerStream[v1.StreamTrackResponse]) error
StreamTrack implements v1connect.StorageServiceHandler.
func (*StorageService) UploadFiles ¶
func (s *StorageService) UploadFiles(ctx context.Context, req *connect.Request[v1.UploadFilesRequest]) (*connect.Response[v1.UploadFilesResponse], error)
UploadFiles implements v1connect.StorageServiceHandler.
type TranscodeStats ¶
type TranscodeStats struct {
	Since              time.Time `db:"since"`
	UploadCount        int       `db:"upload_count"`
	MinTranscodeTime   float64   `db:"min_transcode_time"`
	AvgTranscodeTime   float64   `db:"avg_transcode_time"`
	MaxTranscodeTime   float64   `db:"max_transcode_time"`
	TotalTranscodeTime float64   `db:"total_transcode_time"`
	TotalBytes         int       `db:"total_bytes"`
	TranscodeRate      float64   `db:"transcode_rate"`
}
    type UpdateUploadBody ¶
type UpdateUploadBody struct {
	PreviewStartSeconds string `json:"previewStartSeconds"`
}
    type Upload ¶
type Upload struct {
	ID string `json:"id"` // base32 file hash
	UserWallet        sql.NullString `json:"user_wallet"`
	Template          JobTemplate    `json:"template"`
	OrigFileName      string         `json:"orig_filename"`
	OrigFileCID       string         `json:"orig_file_cid" gorm:"column:orig_file_cid;index:idx_uploads_orig_file_cid"` //
	SelectedPreview   sql.NullString `json:"selected_preview"`
	FFProbe           *FFProbeResult `json:"probe" gorm:"serializer:json"`
	Error             string         `json:"error,omitempty"`
	ErrorCount        int            `json:"error_count,omitempty"`
	Mirrors           []string       `json:"mirrors" gorm:"serializer:json"`
	TranscodedMirrors []string       `json:"transcoded_mirrors" gorm:"serializer:json"`
	Status            string         `json:"status" gorm:"index"`
	PlacementHosts    []string       `json:"placement_hosts" gorm:"serializer:json"`
	CreatedBy string    `json:"created_by" `
	CreatedAt time.Time `json:"created_at" gorm:"autoCreateTime:false"`
	UpdatedAt time.Time `json:"updated_at" gorm:"autoCreateTime:false"`
	TranscodedBy      string            `json:"transcoded_by"`
	TranscodeProgress float64           `json:"transcode_progress"`
	TranscodedAt      time.Time         `json:"transcoded_at"`
	TranscodeResults  map[string]string `json:"results" gorm:"serializer:json"`
	AudioAnalysisStatus     string               `json:"audio_analysis_status"`
	AudioAnalysisError      string               `json:"audio_analysis_error,omitempty"`
	AudioAnalysisErrorCount int                  `json:"audio_analysis_error_count"`
	AudioAnalyzedBy         string               `json:"audio_analyzed_by"`
	AudioAnalyzedAt         time.Time            `json:"audio_analyzed_at"`
	AudioAnalysisResults    *AudioAnalysisResult `json:"audio_analysis_results" gorm:"serializer:json"`
}
    type UploadCursor ¶
      
      Source Files
      ¶
    
- audio_analysis.go
 - connect.go
 - db.go
 - delist_statuses.go
 - geoip.go
 - helpers.go
 - id3.go
 - monitor.go
 - peer_health.go
 - peer_req.go
 - placement.go
 - play_event_queue.go
 - pos.go
 - qm_fix_truncated.go
 - qm_sync.go
 - repair.go
 - replicate.go
 - serve_blob.go
 - serve_blob_grpc.go
 - serve_contact.go
 - serve_crud.go
 - serve_health.go
 - serve_image.go
 - serve_metrics.go
 - serve_upload.go
 - serve_upload_grpc.go
 - server.go
 - server_basic_auth.go
 - sniff.go
 - tagged_stream.go
 - transcode.go
 - transcode_preview.go
 - transcode_stats.go
 - upload_client.go
 - version.go
 
 Click to show internal directories. 
   Click to hide internal directories.