Documentation ¶
Index ¶
- Constants
- Variables
- func GetMediaOriginalURL(owner, mediaId string) (string, error)
- func GetResizedImage(owner, mediaId string, width int, maxBytes int) ([]byte, string, error)
- func GetResizedImageURL(owner, mediaId string, width int) (string, error)
- func Init(repository ARepositoryAdapter, store StoreAdapter, cache CacheAdapter, ...)
- func LoadImagesInCache(ctx context.Context, images ...*ImageToResize) (int, error)
- func Relocate(owner string, ids []string, targetFolder string) error
- func Store(request *StoreRequest) (string, error)
- func SupportResize(filename string) bool
- func WarmUpCacheByFolder(owner, missedStoreKey string, width int) error
- type ARepositoryAdapter
- type AsyncJobAdapter
- type Cache
- type CacheAdapter
- type DestructuredKey
- type ImageToResize
- type ResizerAdapter
- type StoreAdapter
- type StoreRequest
Constants ¶
const ( MiniatureCachedWidth = 360 // MiniatureCachedWidth is the minimum size in which images are stored. Under that, the MiniatureCachedWidth is stored and the image will be re-scaled down on the fly MediumQualityCachedWidth = 2400 // MediumQualityCachedWidth is the highest cacheable resolution, consumer should not request above that )
const DownloadUrlValidityDuration = 5 * time.Minute
Variables ¶
var ( NotFoundError = errors.New("media is not present in the archive") MediaOverflowError = errors.New("media at the requested width is bigger that what the consumer can support") CacheableWidths = []int{MediumQualityCachedWidth, MiniatureCachedWidth} // CacheableWidths are the only resolution cached, array must be sorted DESC. )
Functions ¶
func GetMediaOriginalURL ¶
GetMediaOriginalURL returns a pre-signed URL to download the content. URL only valid a certain time.
func GetResizedImage ¶
GetResizedImage returns the image in the requested size (or rounded up), and the media type.
func GetResizedImageURL ¶
GetResizedImageURL returns a pre-signed URL to download the resized image ; GetResizedImage must have been called before.
func Init ¶
func Init(repository ARepositoryAdapter, store StoreAdapter, cache CacheAdapter, jobQueue AsyncJobAdapter)
func LoadImagesInCache ¶
func LoadImagesInCache(ctx context.Context, images ...*ImageToResize) (int, error)
LoadImagesInCache generates resized images and store them in the cache. Returns how many has been processed
func Store ¶
func Store(request *StoreRequest) (string, error)
Store save the file content, register it, and generates miniature. Return the new filename.
func SupportResize ¶
SupportResize will return true if the file format can be resized (and cached)
func WarmUpCacheByFolder ¶
WarmUpCacheByFolder list medias missing in the cache and load them
Types ¶
type ARepositoryAdapter ¶
type ARepositoryAdapter interface { // FindById returns found location (key) of the media, or a NotFoundError FindById(owner, id string) (string, error) // FindByIds searches multiple physical location at once FindByIds(owner string, ids []string) (map[string]string, error) // AddLocation adds (or override) the media location with the new key AddLocation(owner, id, key string) error // UpdateLocations will update or set location for each id UpdateLocations(owner string, locations map[string]string) error // FindIdsFromKeyPrefix returns a map id -> storeKey FindIdsFromKeyPrefix(keyPrefix string) (map[string]string, error) }
ARepositoryAdapter is storing the mapping between keys in the main storage and the media ids.
type AsyncJobAdapter ¶
type AsyncJobAdapter interface { WarmUpCacheByFolder(owner, missedStoreKey string, width int) error LoadImagesInCache(images ...*ImageToResize) error }
AsyncJobAdapter gives an opportunity to detach heavy processes and run them asynchronously
func NewSyncJobAdapter ¶
func NewSyncJobAdapter() AsyncJobAdapter
type Cache ¶
type Cache struct {
// contains filtered or unexported fields
}
func (*Cache) GetOrStore ¶
func (c *Cache) GetOrStore(cacheKey string, contentGenerator func() ([]byte, string, error), postProcess func(io.ReadCloser, int, string, error) ([]byte, string, error)) ([]byte, string, error)
GetOrStore will return cached value if present, or call contentGenerator to cache and return its result.
type CacheAdapter ¶
type CacheAdapter interface { // Get retrieve the file store at this key, raise a NotFoundError if the key doesn't exist Get(key string) (io.ReadCloser, int, string, error) // Put stores the content by overriding exiting file if any Put(key string, mediaType string, content io.Reader) error // SignedURL returns a pre-authorised URL to download the content SignedURL(key string, duration time.Duration) (string, error) // WalkCacheByPrefix call the observer for each key found in the cache WalkCacheByPrefix(prefix string, observer func(string)) error }
CacheAdapter is the adapter where the re-sized medias are stored (hot storage - not long term safe)
type DestructuredKey ¶
DestructuredKey indicates the preferred key: Prefix + Suffix. A counter can be added between the 2 to make the name unique.
type ImageToResize ¶
type ImageToResize struct { Owner string // Owner is mandatory MediaId string // MediaId is mandatory StoreKey string // StoreKey is optional Widths []int // Widths must have at least 1 value Open func() (io.ReadCloser, error) // Open is optional }
ImageToResize is a request to cache resized image ; optional arguments might be used when processed synchronously but not when queued.
type ResizerAdapter ¶
type ResizerAdapter interface { ResizeImage(reader io.Reader, width int, fast bool) ([]byte, string, error) ResizeImageAtDifferentWidths(reader io.Reader, width []int) (map[int][]byte, string, error) }
ResizerAdapter reduces the image weight and dimensions
var (
ResizerPort ResizerAdapter = image_resize.NewResizer() // ResizerPort can be overrided for testing purpose
)
type StoreAdapter ¶
type StoreAdapter interface { // Download retrieves the file store at this key, raise a NotFoundError if the key doesn't exist Download(key string) (io.ReadCloser, error) // Upload stores online the file and return the final key used Upload(values DestructuredKey, content io.Reader) (string, error) // Copy copied the file to a different location, without overriding existing file Copy(origin string, destination DestructuredKey) (string, error) // Delete permanently stored files (certainly after having been moved. Delete(locations []string) error // SignedURL returns a pre-authorised URL to download the content SignedURL(key string, duration time.Duration) (string, error) }
StoreAdapter is the adapter where the original medias are stored (cool storage - safe for long term)
type StoreRequest ¶
type StoreRequest struct { DateTime time.Time // DateTime is used to name the final file FolderName string // FolderName is the location where the file must be physically stored Id string // Id is the unique identifier from 'catalog' Open func() (io.ReadCloser, error) // Open creates a new reader to this file OriginalFilename string // OriginalFilename is used to preserve the right extension Owner string // Owner is he tenant to which this media belongs SignatureSha256 string // SignatureSha256 is the hash of file content, mainly used to generate the filename }
StoreRequest is used to archive a media