stash/internal/dlna/paging.go
DingDongSoLong4 c364346a59
Model refactor (#3915)
* Add mockery config file
* Move basic file/folder structs to models
* Fix hack due to import loop
* Move file interfaces to models
* Move folder interfaces to models
* Move scene interfaces to models
* Move scene marker interfaces to models
* Move image interfaces to models
* Move gallery interfaces to models
* Move gallery chapter interfaces to models
* Move studio interfaces to models
* Move movie interfaces to models
* Move performer interfaces to models
* Move tag interfaces to models
* Move autotag interfaces to models
* Regenerate mocks
2023-09-01 10:39:29 +10:00

86 lines
2 KiB
Go

package dlna
import (
"context"
"fmt"
"math"
"strconv"
"github.com/stashapp/stash/pkg/models"
"github.com/stashapp/stash/pkg/scene"
)
type scenePager struct {
sceneFilter *models.SceneFilterType
parentID string
}
func (p *scenePager) getPageID(page int) string {
return p.parentID + "/page/" + strconv.Itoa(page)
}
func (p *scenePager) getPages(ctx context.Context, r models.SceneQueryer, total int) ([]interface{}, error) {
var objs []interface{}
// get the first scene of each page to set an appropriate title
pages := int(math.Ceil(float64(total) / float64(pageSize)))
singlePageSize := 1
sort := "title"
findFilter := &models.FindFilterType{
PerPage: &singlePageSize,
Sort: &sort,
}
for page := 1; page <= pages; page++ {
// TODO - this is really slow. Not sure if there's a better way
title := fmt.Sprintf("Page %d", page)
if pages <= 10 || (page-1)%(pages/10) == 0 {
thisPage := ((page - 1) * pageSize) + 1
findFilter.Page = &thisPage
scenes, err := scene.Query(ctx, r, p.sceneFilter, findFilter)
if err != nil {
return nil, err
}
sceneTitle := scenes[0].GetTitle()
// use the first three letters as a prefix
if len(sceneTitle) > 3 {
sceneTitle = sceneTitle[0:3]
}
title += fmt.Sprintf(" (%s...)", sceneTitle)
}
objs = append(objs, makeStorageFolder(p.getPageID(page), title, p.parentID))
}
return objs, nil
}
func (p *scenePager) getPageVideos(ctx context.Context, r SceneFinder, f models.FileGetter, page int, host string, sort string, direction models.SortDirectionEnum) ([]interface{}, error) {
var objs []interface{}
findFilter := &models.FindFilterType{
PerPage: &pageSize,
Page: &page,
Sort: &sort,
Direction: &direction,
}
scenes, err := scene.Query(ctx, r, p.sceneFilter, findFilter)
if err != nil {
return nil, err
}
for _, s := range scenes {
if err := s.LoadPrimaryFile(ctx, f); err != nil {
return nil, err
}
objs = append(objs, sceneToContainer(s, p.parentID, host))
}
return objs, nil
}