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
+
+
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"}}