media

package
v1.1.10 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 15, 2026 License: AGPL-3.0 Imports: 17 Imported by: 0

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

Constants

This section is empty.

Variables

View Source
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 is returned when user is not authorized to access/modify media
	ErrMediaUnauthorizedAccess = errors.InsufficientPermissions("media access")
)

Media service specific errors

View Source
var (
	// ErrTranscodingServiceUnavailable is returned when transcoding service is not available
	ErrTranscodingServiceUnavailable = errors.New("transcoding service unavailable")
	// ErrManifestServiceUnavailable is returned when manifest service is not available
	ErrManifestServiceUnavailable = errors.New("manifest service unavailable")
	// ErrCloudFrontServiceUnavailable is returned when CloudFront service is not available
	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

func IsNSFWBlocked(err error) bool

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 Result

type Result struct {
	Media  *models.Media      `json:"media"`
	Events []*streaming.Event `json:"events"`
}

Result contains media and associated events that were emitted

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) GetMedia

func (s *Service) GetMedia(ctx context.Context, query *GetMediaQuery) (*models.Media, error)

GetMedia retrieves media with privacy checks

func (*Service) GetMediaRenditions

func (s *Service) GetMediaRenditions(ctx context.Context, mediaID string) (*Renditions, error)

GetMediaRenditions retrieves available renditions for a media item

func (*Service) GetStreamingURL

func (s *Service) GetStreamingURL(ctx context.Context, mediaID string) (*model.MediaStream, error)

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

func (s *Service) MarkMediaFailed(ctx context.Context, mediaID string, errorMsg string) error

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

func (s *Service) PreloadMedia(ctx context.Context, mediaIDs []string) ([]string, error)

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

func (s *Service) SetMaxFileSize(maxSize int64)

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

func (s *Service) UpdateMediaFromTranscodingJob(ctx context.Context, jobID string) error

UpdateMediaFromTranscodingJob updates media record with transcoding job results

func (*Service) UploadMedia

func (s *Service) UploadMedia(ctx context.Context, cmd *UploadMediaCommand) (*Result, error)

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

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL