aboutsummaryrefslogblamecommitdiff
path: root/connector/mediaobject.go
blob: 244e5715d1fa3fe55c830b6332ce9efa0e9cafc6 (plain) (tree)
1
2
3
4


                 
               







































                                             




                                                  






                                                         










































                                                        









                                             
                                       























                                                                  

















































                                                                  
package connector

import (
	"bytes"
	"io"
	"net/http"
	"os"
	"path/filepath"

	log "github.com/sirupsen/logrus"
)

type FileMediaObject struct {
	Path string
}

func (m *FileMediaObject) Filename() string {
	return filepath.Base(m.Path)
}

func (m *FileMediaObject) Size() int64 {
	fi, err := os.Stat(m.Path)
	if err != nil {
		log.Fatal(err)
	}
	return fi.Size()
}

func (m *FileMediaObject) Mimetype() string {
	f, err := os.Open(m.Path)
	if err != nil {
		log.Fatal(err)
	}
	defer f.Close()

	buffer := make([]byte, 512)
	_, err = f.Read(buffer)
	if err != nil {
		log.Fatal(err)
	}

	return http.DetectContentType(buffer)
}

func (m *FileMediaObject) ImageSize() *ImageSize {
	// TODO but not really usefull
	return nil
}

func (m *FileMediaObject) Read() (io.ReadCloser, error) {
	return os.Open(m.Path)
}

func (m *FileMediaObject) URL() string {
	return ""
}

// ----

type UrlMediaObject struct {
	ObjectFilename string
	ObjectSize int64
	ObjectMimetype string
	ObjectURL string
	ObjectImageSize *ImageSize
}

func (m *UrlMediaObject) Filename() string {
	return m.ObjectFilename
}

func (m *UrlMediaObject) Size() int64 {
	return m.ObjectSize
}

func (m *UrlMediaObject) Mimetype() string {
	return m.ObjectMimetype
}

func (m *UrlMediaObject) ImageSize() *ImageSize {
	return m.ObjectImageSize
}

func (m *UrlMediaObject) Read() (io.ReadCloser, error) {
	resp, err := http.Get(m.ObjectURL)
	if err != nil {
		return nil, err
	}
	return resp.Body, nil
}

func (m *UrlMediaObject) URL() string {
	return m.ObjectURL
}

// ----

type BlobMediaObject struct {
	ObjectFilename string
	ObjectMimetype string
	ObjectImageSize *ImageSize
	ObjectData []byte
}

func (m *BlobMediaObject) Filename() string {
	return m.ObjectFilename
}

func (m *BlobMediaObject) Size() int64 {
	return int64(len(m.ObjectData))
}

func (m *BlobMediaObject) Mimetype() string {
	return m.ObjectMimetype
}

func (m *BlobMediaObject) ImageSize() *ImageSize {
	return m.ObjectImageSize
}

func (m *BlobMediaObject) Read() (io.ReadCloser, error) {
	return nullCloseReader{bytes.NewBuffer(m.ObjectData)}, nil
}

func (m *BlobMediaObject) URL() string {
	return ""
}

type nullCloseReader struct {
	io.Reader
}
func (ncr nullCloseReader) Close() error {
	return nil
}

// ----

type LazyBlobMediaObject struct {
	ObjectFilename string
	ObjectMimetype string
	ObjectImageSize *ImageSize
	ObjectData []byte

	GetFn func(o *LazyBlobMediaObject) error
}

func (m *LazyBlobMediaObject) Filename() string {
	return m.ObjectFilename
}

func (m *LazyBlobMediaObject) Size() int64 {
	if m.ObjectData == nil {
		m.GetFn(m)
	}
	return int64(len(m.ObjectData))
}

func (m *LazyBlobMediaObject) Mimetype() string {
	if m.ObjectData == nil {
		m.GetFn(m)
	}
	return m.ObjectMimetype
}

func (m *LazyBlobMediaObject) ImageSize() *ImageSize {
	if m.ObjectData == nil {
		m.GetFn(m)
	}
	return m.ObjectImageSize
}

func (m *LazyBlobMediaObject) Read() (io.ReadCloser, error) {
	if m.ObjectData == nil {
		err := m.GetFn(m)
		if err != nil {
			return nil, err
		}
	}
	return nullCloseReader{bytes.NewBuffer(m.ObjectData)}, nil
}

func (m *LazyBlobMediaObject) URL() string {
	return ""
}