Low memory media storage and metadata tracker. With "virtual objects", can select from multiple objects depending on requested content type, width, and height. While primarily for images it can store other common file types too.
- Uploading Objects
- Creating Virtual Objects
- Asserting Virtual Object relationships
- File lookup by object path
- Virtual object path lookup
- Refactor and improve content type to extension mapping
- Extension to content type mapping
- Refactor lookup handler code
- Support multiple path lookup for virtual object
- Parse content extension and encoding extension
- Refactored content type and extension code
- Refactored object, virtual object, find, and hash code
- Redo file extension as content type parameter
- Store content encoding (as input) onto record
- Override extension to content type
- Override encoding to content encoding
- Handler path supports
r<w>x<h>/
prefixing instead of query params - Parse form file name into content encoding and content type
- Add support for responding with content encoding depending on extension
- Custom file copy method, Rocket's persist method does not work across devices
- Custom NamedFile response (FileContent)
- Refactor to use a route handler instead of a guard and handler
- Virtual Object info endpoint
- No longer rely upon public path on object
- Create virtual object for content hash
- Create virtual object for object if path is set
- Upsert should update content encoding
- Upsert should update content type
- Use tokio async file for writing data and hashing files
- Plan Dynamic resizing and format conversions
- Support Header Last-Modified
- Support Header x-content-type-options
- Support Header Age (0)
- Reduce etag length, obscure internal hash
- Set custom server header
- Add HMAC key env for hashing content
- Lazy load content file path from environment variable
- Always overwrite uploaded file, do so before database updates
- Use transaction around inserts with last insert id
- Image transformation chain structure, encoder and decoder
- Custom Byte response
- Add dynamic image processing
- Add crop filter support
- Add blur filter support
- Add background filter support
- Add resize and scale filter support
- Remove ouroboros dependency
- Add WebP encoding
- Fix Avif being on the slowest mode
- Add Quality parameter
- Fix WebP decoding
- Use Tokio Async to load, process, and encode images
- Async identify dimensions of uploaded images and set width and height
- Introduce semaphore so async processing does not consume too much memory
- Update Object for object derivation, transforms
- Update Virtual Object for derivation, background color, transforms, primary object relation
- Add quality to object
- Create derived transformed object, hashed etc.
- WebP encoding supports quality
- Replace rather than add relations on object upload
- Use Longer file names / virtual object paths
- Add derivation endpoint
- Add blurhash support
- Custom error type and error response (Soundness)
- Virtual Object tags (G2)
- Virtual Object path prefixes (G2)
- Look for exact match in db before iterating over all
- Filter content type in database query (Performance)
- Determine content type and encoding by extension during upload (e.g.
.js.gz => text/javascript gzip
) (G1)https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding
- Virtual Object can list prioritized content type in case user content type is not specified (G1, G2)
- Better virtual object choice by resolution (G1, G2)
- Insert / Update custom headers (No Goal Alignment)
- Adjust diesel Object to use json map for headers (No Goal Alignment)
- Actually use accept-encoding header
- Vary (G1) https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Vary
- Accept-Encoding
- If Modified Since (G1) https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Modified-Since
- Note that If-None-Match is present, this header should be supported
- If None Match (G1) https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-None-Match
- Upload zip and it automatically creates objects and so on
- Dynamic Cache Control (G1)
- Send headers on objects with custom named file response (No Goal Alignment)
- Store headers on objects (No Goal Alignment)
- CORS? (No Goal Alignment) - This is its own project, custom headers would come first
- Send custom headers on objects (No Goal Alignment)
- Support content range requests (No Goal Alignment)
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Range
- accept-ranges: bytes (the only supported value) https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Ranges
- Support OPTIONS request method (Not necessary for content)
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS
- https://developer.mozilla.org/en-US/docs/Glossary/Preflight_request
- Correct implementation may be Method Not Allowed
- Add content type to parameters
- Find Exact resolution match, sort by lossless then lossy, filter by supported content types and content encodings
- Find Double (or higher) resolution match, sort by ...
- Find max resolution, sort by ...
- Add parent path to upload function
- Add client provided filter chain to upload function
- Add text overlay support (this will require an additional few libraries...)
- Add requested image filter variants in vobj PUT (synchronously create)
- Add durable queue for image filter variants
- Plan signed urls (G4)