diff --git a/e2e/index.fixture b/e2e/index.fixture index 7730655..4858a17 100755 --- a/e2e/index.fixture +++ b/e2e/index.fixture @@ -145,6 +145,16 @@ + +
test.index.tinytune
+ +
  • + + + + + +
    sample.txt
  • diff --git a/e2e/preview-video.fixture b/e2e/preview-video.fixture index ec03c80..0496e47 100755 Binary files a/e2e/preview-video.fixture and b/e2e/preview-video.fixture differ diff --git a/internal/templates.go b/internal/templates.go index 55e2538..797e91d 100644 --- a/internal/templates.go +++ b/internal/templates.go @@ -12,9 +12,7 @@ import ( func loadTemplates(src fs.FS, streaming map[string]struct{}) map[string]*template.Template { templates := make(map[string]*template.Template) funcs := template.FuncMap{ - "ext": extension, - "width": width, - "height": height, + "ext": extension, "eqMinusOne": func(x int, y int) bool { return x == y-1 }, @@ -29,20 +27,12 @@ func loadTemplates(src fs.FS, streaming map[string]struct{}) map[string]*templat func extension(name string) string { extension := path.Ext(name) if extension != "" { - return extension[1:] + return strings.ToLower(extension[1:]) } return "" } -func width(res string) string { - return strings.Split(res, "x")[0] -} - -func height(res string) string { - return strings.Split(res, "x")[1] -} - func getStreaming(files map[string]struct{}) func(path string) bool { return func(path string) bool { _, ok := files[path] diff --git a/pkg/index/builder.go b/pkg/index/builder.go index 3f3b337..e7c2b0e 100644 --- a/pkg/index/builder.go +++ b/pkg/index/builder.go @@ -130,7 +130,9 @@ func (ib *indexBuilder) loadFile( } metaItem.Duration = preview.Duration() - metaItem.Resolution = preview.Resolution() + width, height := preview.Resolution() + metaItem.Resolution.Width = width + metaItem.Resolution.Height = height metaItem.Preview = PreviewLocation{ Length: uint32(len(preview.Data())), } diff --git a/pkg/index/builder_test.go b/pkg/index/builder_test.go index ddd044d..e2324a9 100644 --- a/pkg/index/builder_test.go +++ b/pkg/index/builder_test.go @@ -16,13 +16,14 @@ func TestIndexBuilder(t *testing.T) { require.NoError(err) index, err := NewIndex(context.Background(), indexFile) require.NoError(err) - require.Len(index.meta, 14) + require.Len(index.meta, 15) sample, ok := index.meta["005f6b0265"] require.True(ok) require.True(sample.IsVideo()) require.Equal("sample_960x400_ocean_with_audio.flv", sample.Name) - require.Equal("960x400", sample.Resolution) - require.EqualValues(11590, sample.Preview.Length) + require.Equal(960, sample.Resolution.Width) + require.Equal(400, sample.Resolution.Height) + require.EqualValues(37618, sample.Preview.Length) require.EqualValues(72046, sample.Preview.Offset) require.EqualValues(7222114, sample.OriginSize) require.LessOrEqual(sample.Preview.Offset+sample.Preview.Length, uint32(len(index.data))) diff --git a/pkg/index/index_test.go b/pkg/index/index_test.go index f2b0ed5..7c33f98 100644 --- a/pkg/index/index_test.go +++ b/pkg/index/index_test.go @@ -113,8 +113,8 @@ func (m mockPreviewData) Data() []byte { return m.data } -func (m mockPreviewData) Resolution() string { - return "0x0" +func (m mockPreviewData) Resolution() (int, int) { + return 0, 0 } func (m mockPreviewData) Duration() time.Duration { diff --git a/pkg/index/meta.go b/pkg/index/meta.go index 089ade4..0a336b7 100644 --- a/pkg/index/meta.go +++ b/pkg/index/meta.go @@ -32,7 +32,7 @@ type Meta struct { IsDir bool `json:"isDir"` Preview PreviewLocation `json:"preview"` Duration time.Duration `json:"duration"` - Resolution string `json:"resolution"` + Resolution Resolution `json:"resolution"` Type int `json:"type"` } @@ -41,6 +41,11 @@ type PreviewLocation struct { Offset uint32 `json:"offset"` } +type Resolution struct { + Width int `json:"width"` + Height int `json:"height"` +} + func (m *Meta) Size() int64 { return m.OriginSize } diff --git a/pkg/preview/data.go b/pkg/preview/data.go index 226d9b3..d7d7bb9 100644 --- a/pkg/preview/data.go +++ b/pkg/preview/data.go @@ -1,25 +1,28 @@ package preview -import "time" +import ( + "time" +) type Data interface { Data() []byte Duration() time.Duration - Resolution() string + Resolution() (int, int) } type data struct { - duration time.Duration - resolution string - data []byte + duration time.Duration + width int + height int + data []byte } func (d data) Duration() time.Duration { return d.duration } -func (d data) Resolution() string { - return d.resolution +func (d data) Resolution() (int, int) { + return d.width, d.height } func (d data) Data() []byte { diff --git a/pkg/preview/image.go b/pkg/preview/image.go index 099dcfd..97a8429 100644 --- a/pkg/preview/image.go +++ b/pkg/preview/image.go @@ -39,7 +39,7 @@ func init() { } func imagePreview(path string) (data, error) { - preview := data{resolution: "0x0"} + preview := data{} image, err := vips.NewImageFromFile(path) if err != nil { @@ -47,7 +47,7 @@ func imagePreview(path string) (data, error) { } defer image.Close() - preview.resolution = fmt.Sprintf("%dx%d", image.Width(), image.Height()) + preview.width, preview.height = image.Width(), image.Height() preview.data, err = downScale(image, imageDefault) diff --git a/pkg/preview/image_test.go b/pkg/preview/image_test.go index bd39751..c615d0b 100644 --- a/pkg/preview/image_test.go +++ b/pkg/preview/image_test.go @@ -16,7 +16,10 @@ func TestPreviewImage(t *testing.T) { preview, err := imagePreview("../../test/image.jpg") require.NoError(t, err) assert.Len(preview.Data(), 8620) - assert.Equal("1527x898", preview.Resolution()) + width, height := preview.Resolution() + assert.Equal(1527, width) + assert.Equal(898, height) + hash := sha256.Sum256(preview.Data()) assert.Equal("64de9c944a91c93e750d097577c8fc5992100a7bb186d376534e78705aefbbbd", hex.EncodeToString(hash[:])) } diff --git a/pkg/preview/preview.go b/pkg/preview/preview.go index f31962f..6a982af 100644 --- a/pkg/preview/preview.go +++ b/pkg/preview/preview.go @@ -73,7 +73,7 @@ func ifMaxPass(maxNewItems *int64) bool { //nolint:cyclop,ireturn,nolintlint //it's very simple method... func (p Previewer) Pull(src Source) (Data, error) { - defaultPreview := data{resolution: "0x0"} + defaultPreview := data{} biggestThenMaxFileSize := p.maxFileSize != -1 && src.Size() > p.maxFileSize toImage := src.IsImage() && p.image && ifMaxPass(&p.maxImages) @@ -108,7 +108,8 @@ func (p Previewer) Pull(src Source) (Data, error) { if src.IsVideo() { // default resolution for video player - defaultPreview.resolution = "1280x720" + defaultPreview.width = 1280 + defaultPreview.height = 720 } return defaultPreview, nil diff --git a/pkg/preview/video.go b/pkg/preview/video.go index 6c10101..0063fd3 100644 --- a/pkg/preview/video.go +++ b/pkg/preview/video.go @@ -183,43 +183,41 @@ func getVideoStream(streams []probeStream) *probeStream { return nil } -func probeOutputFrames(a string) (string, time.Duration, error) { +func probeOutputFrames(a string) (int, int, time.Duration, error) { data := probeData{} - resolution := "0x0" if err := json.Unmarshal([]byte(a), &data); err != nil { - return resolution, 0, fmt.Errorf("%w: %w", ErrMetaInfoUnmarshal, err) + return 0, 0, 0, fmt.Errorf("%w: %w", ErrMetaInfoUnmarshal, err) } seconds, err := strconv.ParseFloat(data.Format.Duration, 64) if err != nil { - return resolution, 0, fmt.Errorf("%w: %w", ErrMetaInfoDurationParse, err) + return 0, 0, 0, fmt.Errorf("%w: %w", ErrMetaInfoDurationParse, err) } videoStream := getVideoStream(data.Streams) if videoStream == nil { - return resolution, 0, ErrVideoStreamNotFound + return 0, 0, 0, ErrVideoStreamNotFound } - resolution = fmt.Sprintf("%dx%d", videoStream.Width, videoStream.Height) - - return resolution, time.Duration(seconds) * time.Second, nil + return videoStream.Width, videoStream.Height, time.Duration(seconds) * time.Second, nil } func videoPreview(path string, params VideoParams) (data, error) { - preview := data{resolution: "0x0"} + preview := data{} metaJSON, err := videoProbe(path, params.timeout) if err != nil { return preview, err } - resolution, duration, err := probeOutputFrames(metaJSON) + width, height, duration, err := probeOutputFrames(metaJSON) if err != nil { return preview, err } - preview.resolution = resolution + preview.width = width + preview.height = height preview.duration = duration if preview.data, err = produceVideoPreview(path, duration, params); err != nil { diff --git a/pkg/preview/video_test.go b/pkg/preview/video_test.go index 69ab02d..2472591 100644 --- a/pkg/preview/video_test.go +++ b/pkg/preview/video_test.go @@ -19,7 +19,10 @@ func TestPreviewVideo(t *testing.T) { require.NoError(t, err) assert.Len(preview.Data(), 105634, fmt.Sprintf("got %d", len(preview.Data()))) assert.EqualValues(time.Second*5, preview.Duration()) - assert.Equal("1280x720", preview.Resolution()) + width, height := preview.Resolution() + assert.Equal(1280, width) + assert.Equal(720, height) + hash := sha256.Sum256(preview.Data()) assert.Equal("ab9e213afa42466148583b1ddab5bc00f8218ecac230cc7f8b6797e9e5179ba2", hex.EncodeToString(hash[:])) } @@ -31,6 +34,7 @@ func TestPreviewVideoFLV(t *testing.T) { preview, err := videoPreview("../../test/video/sample_960x400_ocean_with_audio.flv", VideoParams{timeout: time.Minute}) require.NoError(t, err) assert.Len(preview.Data(), 37618, fmt.Sprintf("got %d", len(preview.Data()))) + hash := sha256.Sum256(preview.Data()) assert.Equal("30d4dcd9d15d17939a74bfbc7c4a19126a61369504d308bc11847f1bb45e4627", hex.EncodeToString(hash[:])) } diff --git a/test/test.index.tinytune b/test/test.index.tinytune index dde9fa4..a2aedcc 100755 Binary files a/test/test.index.tinytune and b/test/test.index.tinytune differ diff --git a/web/templates/item-image.html b/web/templates/item-image.html index a8a886e..fb23a38 100644 --- a/web/templates/item-image.html +++ b/web/templates/item-image.html @@ -1,5 +1,5 @@ {{define "image-item"}}
    - {{ if eq .Resolution "0x0" }} + {{ if eq .Resolution.Width 0 }} {{ template "icon-image" .}} {{ else }}