Documentation
¶
Overview ¶
Package media provides the core Media Service for the Lesser project's API alignment. This service handles all media operations including file uploads, processing, metadata updates, and storage management. It emits appropriate events for real-time streaming and queues async processing for thumbnails and optimization.
Package media provides streaming pipeline integration
Index ¶
- Variables
- func IsNSFWBlocked(err error) bool
- type GetMediaQuery
- type JobMessage
- type JobQueueService
- type ListMediaQuery
- type ListMediaResult
- type NSFWBlockedError
- type ProcessingQueue
- type RenditionVariant
- type Renditions
- type Result
- type S3Service
- type Service
- func (s *Service) GenerateSignedStreamURL(ctx context.Context, mediaID string, quality *string) (*StreamSession, error)
- func (s *Service) GetMedia(ctx context.Context, query *GetMediaQuery) (*models.Media, error)
- func (s *Service) GetMediaRenditions(ctx context.Context, mediaID string) (*Renditions, error)
- func (s *Service) GetStreamingURL(ctx context.Context, mediaID string) (*model.MediaStream, error)
- func (s *Service) ListMedia(ctx context.Context, query *ListMediaQuery) (*ListMediaResult, error)
- func (s *Service) MarkMediaFailed(ctx context.Context, mediaID string, errorMsg string) error
- func (s *Service) MarkMediaProcessed(ctx context.Context, mediaID string, variants map[string]models.MediaVariant) error
- func (s *Service) PreloadMedia(ctx context.Context, mediaIDs []string) ([]string, error)
- func (s *Service) SetCloudFrontService(cloudfrontService cloudfrontService)
- func (s *Service) SetManifestService(manifestService manifestService)
- func (s *Service) SetMaxFileSize(maxSize int64)
- func (s *Service) SetTranscodingService(transcoder transcoderService)
- func (s *Service) SubmitTranscodeJob(ctx context.Context, cmd *SubmitTranscodeJobCommand) (*TranscodeJobResult, error)
- func (s *Service) UpdateMedia(ctx context.Context, cmd *UpdateMediaCommand) (*UpdateResult, error)
- func (s *Service) UpdateMediaFromTranscodingJob(ctx context.Context, jobID string) error
- func (s *Service) UploadMedia(ctx context.Context, cmd *UploadMediaCommand) (*Result, error)
- type StreamSession
- type SubmitTranscodeJobCommand
- type TranscodeJobResult
- type UpdateMediaCommand
- type UpdateResult
- type UploadMediaCommand
Constants ¶
This section is empty.
Variables ¶
var ( // ErrMediaNotFound is returned when media is not found ErrMediaNotFound = errors.NewAppError(errors.CodeNotFound, errors.CategoryMedia, "media not found") // ErrMediaCreateFailed is returned when media creation fails ErrMediaCreateFailed = errors.FailedToCreate("media", stdErrors.New("failed to create media")) // ErrMediaUpdateFailed is returned when media update fails ErrMediaUpdateFailed = errors.FailedToUpdate("media", stdErrors.New("failed to update media")) // ErrMediaDeleteFailed is returned when media deletion fails ErrMediaDeleteFailed = errors.FailedToDelete("media", stdErrors.New("failed to delete media")) // ErrMediaAccessDenied is returned when media access is denied ErrMediaAccessDenied = errors.AccessDeniedForResource("media", "unknown") // ErrMediaProcessingFailed is returned when media processing fails ErrMediaProcessingFailed = errors.ProcessingFailed("media processing", stdErrors.New("media processing failed")) // ErrDatabaseOperation is returned when database operations fail ErrDatabaseOperation = errors.NewStorageError(errors.CodeInternal, "database error") // ErrMediaStorageFailed is returned when media storage fails ErrMediaStorageFailed = errors.FailedToStore("media record", stdErrors.New("failed to store media record")) // ErrMediaRetrievalFailed is returned when media retrieval fails ErrMediaRetrievalFailed = errors.FailedToGet("media", stdErrors.New("failed to get media")) // ErrMediaFileDataRequired is returned when file data is required but missing ErrMediaFileDataRequired = errors.NewValidationError("file_data", "required") // ErrMediaFileTooLarge is returned when file size exceeds maximum limit ErrMediaFileTooLarge = errors.NewValidationError("file_size", "too large") // ErrMediaUnsupportedType is returned when content type is not supported ErrMediaUnsupportedType = errors.ContentTypeNotAllowed("unknown") // ErrMediaFileExtensionMismatch is returned when file extension doesn't match content type ErrMediaFileExtensionMismatch = errors.NewValidationError("file_extension", "does not match content type") // ErrMediaNotReady is returned when media is not ready for viewing ErrMediaNotReady = errors.MediaAttachmentNotReady("unknown") // ErrMediaProcessingQueueFailed is returned when media processing queue operation fails ErrMediaProcessingQueueFailed = errors.ProcessingFailed("media processing queue", stdErrors.New("media processing queue failed")) // ErrMediaNotReadyForStreaming is returned when media is not ready for streaming ErrMediaNotReadyForStreaming = errors.NewValidationError("media_streaming", "not ready for streaming") // ErrMediaValidationFailed is returned when media validation fails ErrMediaValidationFailed = errors.MediaAttachmentValidationFailed("unknown reason") ErrMediaUnauthorizedAccess = errors.InsufficientPermissions("media access") )
Media service specific errors
var ( ErrTranscodingServiceUnavailable = errors.New("transcoding service unavailable") ErrManifestServiceUnavailable = errors.New("manifest service unavailable") ErrCloudFrontServiceUnavailable = errors.New("cloudfront service unavailable") // ErrTranscodingJobNotFound is returned when a transcoding job is not found ErrTranscodingJobNotFound = errors.New("transcoding job not found") )
Functions ¶
func IsNSFWBlocked ¶
IsNSFWBlocked checks if an error is an NSFW blocked error
Types ¶
type GetMediaQuery ¶
type GetMediaQuery struct {
MediaID string `json:"media_id" validate:"required"`
ViewerID string `json:"viewer_id"` // User requesting the media (for privacy checks)
}
GetMediaQuery contains parameters for retrieving media
type JobMessage ¶
type JobMessage struct {
JobID string `json:"job_id"`
MediaID string `json:"media_id"`
Username string `json:"username"`
Timestamp int64 `json:"timestamp"`
}
JobMessage represents a message for media processing
type JobQueueService ¶
type JobQueueService interface {
QueueMediaJob(ctx context.Context, msg JobMessage) error
}
JobQueueService defines the interface for job queue operations
type ListMediaQuery ¶
type ListMediaQuery struct {
Owner string `json:"owner"`
Requester string `json:"requester"`
MediaType string `json:"media_type"`
MimeType string `json:"mime_type"`
Cursor string `json:"cursor"`
Limit int `json:"limit"`
Since *time.Time `json:"since"`
Until *time.Time `json:"until"`
}
ListMediaQuery contains parameters for listing media with filters
type ListMediaResult ¶
type ListMediaResult struct {
Items []*models.Media `json:"items"`
NextCursor string `json:"next_cursor"`
HasMore bool `json:"has_more"`
Total int64 `json:"total"`
}
ListMediaResult contains paginated media results
type NSFWBlockedError ¶
type NSFWBlockedError struct {
// contains filtered or unexported fields
}
NSFWBlockedError represents an error when NSFW content is blocked
func NewNSFWBlockedError ¶
func NewNSFWBlockedError(message string) *NSFWBlockedError
NewNSFWBlockedError creates a new NSFW blocked error
func (*NSFWBlockedError) Error ¶
func (e *NSFWBlockedError) Error() string
type ProcessingQueue ¶
type ProcessingQueue interface {
QueueMediaProcessing(ctx context.Context, mediaID string, processingType string) error
}
ProcessingQueue defines the interface for async media processing
type RenditionVariant ¶
type RenditionVariant struct {
Quality string
Width int
Height int
Bitrate int
Codec string
HLSPlaylistURL string
DASHSegmentURL string
FileSize int64
Format string
}
RenditionVariant represents a transcoded variant
type Renditions ¶
type Renditions struct {
MediaID string
HLSMasterURL string
DASHManifestURL string
Variants []RenditionVariant
ThumbnailURLs []string
TranscodingStatus string
LastUpdated time.Time
}
Renditions contains available renditions for a media item
type S3Service ¶
type S3Service interface {
UploadFile(ctx context.Context, bucket, key string, data []byte, contentType string) (string, error)
DeleteFile(ctx context.Context, bucket, key string) error
GeneratePresignedURL(ctx context.Context, bucket, key string, expiry time.Duration) (string, error)
}
S3Service defines the interface for S3 operations (for abstraction/mocking)
type Service ¶
type Service struct {
// contains filtered or unexported fields
}
Service provides media operations
func NewService ¶
func NewService( mediaRepo interfaces.MediaRepository, accountRepo accountPreferencesRepository, publisher streaming.Publisher, jobQueue JobQueueService, logger *zap.Logger, s3Bucket string, cdnDomain string, ) *Service
NewService creates a new Media Service with the required dependencies
func (*Service) GenerateSignedStreamURL ¶
func (s *Service) GenerateSignedStreamURL(ctx context.Context, mediaID string, quality *string) (*StreamSession, error)
GenerateSignedStreamURL generates a signed streaming URL for a media item
func (*Service) GetMediaRenditions ¶
GetMediaRenditions retrieves available renditions for a media item
func (*Service) GetStreamingURL ¶
GetStreamingURL returns a media streaming URL and metadata for GraphQL
func (*Service) ListMedia ¶
func (s *Service) ListMedia(ctx context.Context, query *ListMediaQuery) (*ListMediaResult, error)
ListMedia returns paginated media filtered by owner and type
func (*Service) MarkMediaFailed ¶
MarkMediaFailed marks media as failed and emits events
func (*Service) MarkMediaProcessed ¶
func (s *Service) MarkMediaProcessed(ctx context.Context, mediaID string, variants map[string]models.MediaVariant) error
MarkMediaProcessed marks media as successfully processed and emits events
func (*Service) PreloadMedia ¶
PreloadMedia preloads manifests and primes CDN cache for media items
func (*Service) SetCloudFrontService ¶
func (s *Service) SetCloudFrontService(cloudfrontService cloudfrontService)
SetCloudFrontService sets the CloudFront service (optional)
func (*Service) SetManifestService ¶
func (s *Service) SetManifestService(manifestService manifestService)
SetManifestService sets the manifest service (optional)
func (*Service) SetMaxFileSize ¶
SetMaxFileSize sets the maximum allowed file size
func (*Service) SetTranscodingService ¶
func (s *Service) SetTranscodingService(transcoder transcoderService)
SetTranscodingService sets the transcoding service (optional)
func (*Service) SubmitTranscodeJob ¶
func (s *Service) SubmitTranscodeJob(ctx context.Context, cmd *SubmitTranscodeJobCommand) (*TranscodeJobResult, error)
SubmitTranscodeJob submits a media item for transcoding
func (*Service) UpdateMedia ¶
func (s *Service) UpdateMedia(ctx context.Context, cmd *UpdateMediaCommand) (*UpdateResult, error)
UpdateMedia updates media metadata (alt text, focus points) and emits events
func (*Service) UpdateMediaFromTranscodingJob ¶
UpdateMediaFromTranscodingJob updates media record with transcoding job results
func (*Service) UploadMedia ¶
UploadMedia uploads a new media file, validates it, stores it in S3, creates the record, and queues async processing for thumbnails and analysis
type StreamSession ¶
type StreamSession struct {
SessionID string
MediaID string
URL string
Quality string
Format string
ExpiresAt time.Time
Bitrate int
BufferHealth float64
}
StreamSession contains streaming session information
type SubmitTranscodeJobCommand ¶
type SubmitTranscodeJobCommand struct {
MediaID string
UserID string
Username string
SourceBucket string
SourceKey string
ContentType string
Duration int
Width int
Height int
QualityLevels []string // ["480p", "720p", "1080p"]
GenerateHLS bool
GenerateDASH bool
ThumbnailCount int
}
SubmitTranscodeJobCommand contains parameters for submitting a transcode job
type TranscodeJobResult ¶
type TranscodeJobResult struct {
JobID string
MediaConvertJobID string
EstimatedCostUSD float64
EstimatedDuration time.Duration
QualityLevels []string
Status string
}
TranscodeJobResult contains the result of submitting a transcode job
type UpdateMediaCommand ¶
type UpdateMediaCommand struct {
MediaID string `json:"media_id" validate:"required"`
UserID string `json:"user_id" validate:"required"` // Must be the media owner
Description string `json:"description" validate:"max=1500"` // Alt text
Focus string `json:"focus"` // Focus point for cropping (x,y)
}
UpdateMediaCommand contains all data needed to update media metadata
type UpdateResult ¶
type UpdateResult struct {
Media *models.Media `json:"media"`
Events []*streaming.Event `json:"events"`
}
UpdateResult contains updated media and events
type UploadMediaCommand ¶
type UploadMediaCommand struct {
UserID string `json:"user_id" validate:"required"`
FileName string `json:"file_name" validate:"required"`
ContentType string `json:"content_type" validate:"required"`
FileData []byte `json:"file_data" validate:"required"`
Description string `json:"description" validate:"max=1500"` // Alt text
Focus string `json:"focus"` // Focus point for cropping (x,y)
Sensitive bool `json:"sensitive"`
SpoilerText string `json:"spoiler_text"`
MediaCategory models.MediaCategory `json:"media_category"`
}
UploadMediaCommand contains all data needed to upload a media file
Directories
¶
| Path | Synopsis |
|---|---|
|
Package transcoding provides CloudFront signed URL generation
|
Package transcoding provides CloudFront signed URL generation |