Skip to content

Commit

Permalink
Merge pull request #301 from damongolding/task/release
Browse files Browse the repository at this point in the history
v0.16.1
  • Loading branch information
damongolding authored Feb 11, 2025
2 parents 30d7d3a + 2069cdb commit 0966a0c
Show file tree
Hide file tree
Showing 18 changed files with 246 additions and 103 deletions.
2 changes: 1 addition & 1 deletion frontend/public/assets/css/kiosk.css
Original file line number Diff line number Diff line change
Expand Up @@ -449,7 +449,7 @@ form {
align-items: center;
gap: 0.5rem;
}
.asset--metadata--is-first .asset--metadata--icon {
.right-align-icons .asset--metadata--icon {
-moz-box-ordinal-group: 3;
order: 2;
}
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/css/image.css
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@
gap: 0.5rem;
}

.asset--metadata--is-first .asset--metadata--icon {
.right-align-icons .asset--metadata--icon {
order: 2;
}

Expand Down
10 changes: 9 additions & 1 deletion internal/common/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
"github.com/charmbracelet/log"
"github.com/damongolding/immich-kiosk/internal/config"
"github.com/damongolding/immich-kiosk/internal/immich"
"github.com/damongolding/immich-kiosk/internal/kiosk"
"github.com/damongolding/immich-kiosk/internal/utils"
"github.com/labstack/echo/v4"
)
Expand Down Expand Up @@ -99,7 +100,7 @@ type ViewImageData struct {
ImageData string // ImageData contains the image as base64 data
ImageBlurData string // ImageBlurData contains the blurred image as base64 data
ImageDate string // ImageDate contains the date of the image
User string
User string // User the user api key used
}

// ViewData contains all the data needed to render a view in the application
Expand All @@ -112,6 +113,13 @@ type ViewData struct {
config.Config // Config contains the instance configuration
}

type ViewImageDataOptions struct {
RelativeAssetWanted bool
RelativeAssetBucket kiosk.Source
RelativeAssetBucketID string
ImageOrientation immich.ImageOrientation
}

// ContextCopy stores a copy of key HTTP context information including URL and headers
type ContextCopy struct {
URL url.URL // The request URL
Expand Down
14 changes: 11 additions & 3 deletions internal/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -430,14 +430,22 @@ func (c *Config) Load() error {
return nil
}

// ResetBuckets clears all the asset bucket slice fields (Person, Album, Date)
// in the Config structure. This is typically used when applying new query parameters
// to ensure old values don't persist. When querying specific buckets, the previous
// values need to be cleared to avoid mixing unintended assets.
func (c *Config) ResetBuckets() {
c.Person = []string{}
c.Album = []string{}
c.Date = []string{}
}

// ConfigWithOverrides overwrites base config with ones supplied via URL queries
func (c *Config) ConfigWithOverrides(queries url.Values, e echo.Context) error {

// check for person or album in quries and empty baseconfig slice if found
if queries.Has("person") || queries.Has("album") || queries.Has("date") || queries.Has("memories") {
c.Person = []string{}
c.Album = []string{}
c.Date = []string{}
c.ResetBuckets()
}

err := e.Bind(c)
Expand Down
3 changes: 3 additions & 0 deletions internal/immich/immich.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (

"github.com/damongolding/immich-kiosk/internal/config"
"github.com/damongolding/immich-kiosk/internal/immich_open_api"
"github.com/damongolding/immich-kiosk/internal/kiosk"
)

type ImageOrientation string
Expand Down Expand Up @@ -176,6 +177,8 @@ type ImmichAsset struct {
IsLandscape bool `json:"-"`
MemoryTitle string `json:"-"`
AppearsIn []string `json:"-"`
Bucket kiosk.Source `json:"-"`
BucketID string `json:"-"`
}

type ImmichAlbum struct {
Expand Down
7 changes: 5 additions & 2 deletions internal/immich/immich_album.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ func (i *ImmichAsset) albums(requestID, deviceID string, shared bool, contains s

apiUrl.RawQuery = queryParams.Encode()

immichApiCall := immichApiCallDecorator(i.immichApiCall, requestID, deviceID, albums)
immichApiCall := withImmichApiCache(i.immichApiCall, requestID, deviceID, albums)
body, err := immichApiCall("GET", apiUrl.String(), nil)
if err != nil {
return immichApiFail(albums, err, body, apiUrl.String())
Expand Down Expand Up @@ -112,7 +112,7 @@ func (i *ImmichAsset) albumAssets(albumID, requestID, deviceID string) (ImmichAl
Path: path.Join("api", "albums", albumID),
}

immichApiCall := immichApiCallDecorator(i.immichApiCall, requestID, deviceID, album)
immichApiCall := withImmichApiCache(i.immichApiCall, requestID, deviceID, album)
body, err := immichApiCall("GET", apiUrl.String(), nil)
if err != nil {
return immichApiFail(album, err, body, apiUrl.String())
Expand Down Expand Up @@ -269,6 +269,9 @@ func (i *ImmichAsset) ImageFromAlbum(albumID string, albumAssetsOrder ImmichAsse

}

asset.Bucket = kiosk.SourceAlbums
asset.BucketID = album.ID

*i = asset

return nil
Expand Down
6 changes: 4 additions & 2 deletions internal/immich/immich_date.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ func (i *ImmichAsset) RandomImageInDateRange(dateRange, requestID, deviceID stri
return fmt.Errorf("marshaling request body: %w", err)
}

immichApiCall := immichApiCallDecorator(i.immichApiCall, requestID, deviceID, immichAssets)
immichApiCall := withImmichApiCache(i.immichApiCall, requestID, deviceID, immichAssets)
apiBody, err := immichApiCall("POST", apiUrl.String(), jsonBody)
if err != nil {
_, _, err = immichApiFail(immichAssets, err, apiBody, apiUrl.String())
Expand Down Expand Up @@ -120,7 +120,6 @@ func (i *ImmichAsset) RandomImageInDateRange(dateRange, requestID, deviceID stri
continue
}


if requestConfig.Kiosk.Cache {
// Remove the current image from the slice
immichAssetsToCache := append(immichAssets[:immichAssetIndex], immichAssets[immichAssetIndex+1:]...)
Expand All @@ -137,6 +136,9 @@ func (i *ImmichAsset) RandomImageInDateRange(dateRange, requestID, deviceID stri
}
}

asset.Bucket = kiosk.SourceDateRangeAlbum
asset.BucketID = dateRange

*i = asset

return nil
Expand Down
2 changes: 1 addition & 1 deletion internal/immich/immich_faces.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ func (i *ImmichAsset) CheckForFaces(requestID, deviceID string) {
RawQuery: "id=" + i.ID,
}

immichApiCall := immichApiCallDecorator(i.immichApiCall, requestID, deviceID, faceResponse)
immichApiCall := withImmichApiCache(i.immichApiCall, requestID, deviceID, faceResponse)
body, err := immichApiCall("GET", apiUrl.String(), nil)
if err != nil {
_, _, err = immichApiFail(faceResponse, err, body, apiUrl.String())
Expand Down
9 changes: 6 additions & 3 deletions internal/immich/immich_favourites.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ func (i *ImmichAsset) favouriteImagesCount(requestID, deviceID string) (int, err
return allFavouritesCount, err
}

immichApiCall := immichApiCallDecorator(i.immichApiCall, requestID, deviceID, favourites)
immichApiCall := withImmichApiCache(i.immichApiCall, requestID, deviceID, favourites)
apiBody, err := immichApiCall("POST", apiUrl.String(), jsonBody)
if err != nil {
_, _, err = immichApiFail(favourites, err, apiBody, apiUrl.String())
Expand Down Expand Up @@ -153,7 +153,7 @@ func (i *ImmichAsset) RandomImageFromFavourites(requestID, deviceID string, allo
return fmt.Errorf("marshaling request body: %w", err)
}

immichApiCall := immichApiCallDecorator(i.immichApiCall, requestID, deviceID, immichAssets)
immichApiCall := withImmichApiCache(i.immichApiCall, requestID, deviceID, immichAssets)
apiBody, err := immichApiCall("POST", apiUrl.String(), jsonBody)
if err != nil {
_, _, err = immichApiFail(immichAssets, err, apiBody, apiUrl.String())
Expand Down Expand Up @@ -189,7 +189,6 @@ func (i *ImmichAsset) RandomImageFromFavourites(requestID, deviceID string, allo
continue
}


if requestConfig.Kiosk.Cache {
// Remove the current image from the slice
immichAssetsToCache := append(immichAssets[:immichAssetIndex], immichAssets[immichAssetIndex+1:]...)
Expand All @@ -206,7 +205,11 @@ func (i *ImmichAsset) RandomImageFromFavourites(requestID, deviceID string, allo
}
}

asset.Bucket = kiosk.SourceAlbums
asset.BucketID = kiosk.AlbumKeywordFavourites

*i = asset

return nil
}

Expand Down
9 changes: 3 additions & 6 deletions internal/immich/immich_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ func immichApiFail[T ImmichApiResponse](value T, err error, body []byte, apiUrl
return value, apiUrl, fmt.Errorf("%s : %v", immichError.Error, immichError.Message)
}

// immichApiCallDecorator Decorator to impliment cache for the immichApiCall func
func immichApiCallDecorator[T ImmichApiResponse](immichApiCall ImmichApiCall, requestID, deviceID string, jsonShape T) ImmichApiCall {
// withImmichApiCache Decorator to implement cache for the immichApiCall func
func withImmichApiCache[T ImmichApiResponse](immichApiCall ImmichApiCall, requestID, deviceID string, jsonShape T) ImmichApiCall {
return func(method, apiUrl string, body []byte, headers ...map[string]string) ([]byte, error) {

if !requestConfig.Kiosk.Cache {
Expand All @@ -41,9 +41,6 @@ func immichApiCallDecorator[T ImmichApiResponse](immichApiCall ImmichApiCall, re
apiCacheKey := cache.ApiCacheKey(apiUrl, deviceID, requestConfig.SelectedUser)

if apiData, found := cache.Get(apiCacheKey); found {
if requestConfig.Kiosk.DebugVerbose {
log.Debug(requestID+" Cache hit", "url", apiUrl)
}
log.Debug(requestID+" Cache hit", "url", apiUrl)
return apiData.([]byte), nil
}
Expand Down Expand Up @@ -271,7 +268,7 @@ func (i *ImmichAsset) AssetInfo(requestID, deviceID string) error {
Path: path.Join("api", "assets", i.ID),
}

immichApiCall := immichApiCallDecorator(i.immichApiCall, requestID, deviceID, immichAsset)
immichApiCall := withImmichApiCache(i.immichApiCall, requestID, deviceID, immichAsset)
body, err := immichApiCall("GET", apiUrl.String(), nil)
if err != nil {
_, _, err = immichApiFail(immichAsset, err, body, apiUrl.String())
Expand Down
7 changes: 4 additions & 3 deletions internal/immich/immich_memories.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ func (i *ImmichAsset) memories(requestID, deviceID string, assetCount bool) (Mem
apiUrl.RawQuery += "&count=true"
}

immichApiCall := immichApiCallDecorator(i.immichApiCall, requestID, deviceID, memoryLane)
immichApiCall := withImmichApiCache(i.immichApiCall, requestID, deviceID, memoryLane)
body, err := immichApiCall("GET", apiUrl.String(), nil)
if err != nil {
return immichApiFail(memoryLane, err, body, apiUrl.String())
Expand Down Expand Up @@ -156,9 +156,10 @@ func (i *ImmichAsset) RandomMemoryLaneImage(requestID, deviceID string, isPrefet
}
}

*i = asset
asset.Bucket = kiosk.SourceMemories
asset.MemoryTitle = memories[pickedMemoryIndex].Title

i.MemoryTitle = memories[pickedMemoryIndex].Title
*i = asset

return nil
}
Expand Down
8 changes: 5 additions & 3 deletions internal/immich/immich_person.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ func (i *ImmichAsset) PersonImageCount(personID, requestID, deviceID string) (in
Path: path.Join("api", "people", personID, "statistics"),
}

immichApiCall := immichApiCallDecorator(i.immichApiCall, requestID, deviceID, personStatistics)
immichApiCall := withImmichApiCache(i.immichApiCall, requestID, deviceID, personStatistics)
body, err := immichApiCall("GET", apiUrl.String(), nil)
if err != nil {
_, _, err = immichApiFail(personStatistics, err, body, apiUrl.String())
Expand Down Expand Up @@ -113,7 +113,7 @@ func (i *ImmichAsset) RandomImageOfPerson(personID, requestID, deviceID string,
return err
}

immichApiCall := immichApiCallDecorator(i.immichApiCall, requestID, deviceID, immichAssets)
immichApiCall := withImmichApiCache(i.immichApiCall, requestID, deviceID, immichAssets)
apiBody, err := immichApiCall("POST", apiUrl.String(), jsonBody)
if err != nil {
_, _, err = immichApiFail(immichAssets, err, apiBody, apiUrl.String())
Expand Down Expand Up @@ -149,7 +149,6 @@ func (i *ImmichAsset) RandomImageOfPerson(personID, requestID, deviceID string,
continue
}


if requestConfig.Kiosk.Cache {
// Remove the current image from the slice
immichAssetsToCache := append(immichAssets[:immichAssetIndex], immichAssets[immichAssetIndex+1:]...)
Expand All @@ -166,6 +165,9 @@ func (i *ImmichAsset) RandomImageOfPerson(personID, requestID, deviceID string,
}
}

asset.Bucket = kiosk.SourcePerson
asset.BucketID = personID

*i = asset

return nil
Expand Down
6 changes: 4 additions & 2 deletions internal/immich/immich_random.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ func (i *ImmichAsset) RandomImage(requestID, deviceID string, isPrefetch bool) e
return err
}

immichApiCall := immichApiCallDecorator(i.immichApiCall, requestID, deviceID, immichAssets)
immichApiCall := withImmichApiCache(i.immichApiCall, requestID, deviceID, immichAssets)
apiBody, err := immichApiCall("POST", apiUrl.String(), jsonBody)
if err != nil {
_, _, err = immichApiFail(immichAssets, err, apiBody, apiUrl.String())
Expand Down Expand Up @@ -109,7 +109,6 @@ func (i *ImmichAsset) RandomImage(requestID, deviceID string, isPrefetch bool) e
continue
}


if requestConfig.Kiosk.Cache {
// Remove the current image from the slice
immichAssetsToCache := append(immichAssets[:immichAssetIndex], immichAssets[immichAssetIndex+1:]...)
Expand All @@ -126,7 +125,10 @@ func (i *ImmichAsset) RandomImage(requestID, deviceID string, isPrefetch bool) e
}
}

asset.Bucket = kiosk.SourceRandom

*i = asset

return nil
}

Expand Down
5 changes: 5 additions & 0 deletions internal/kiosk/kiosk.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,10 @@ const (
SourceRandom Source = "RANDOM"
SourceMemories Source = "MEMORIES"

LayoutLandscape string = "landscape"
LayoutPortrait string = "portrait"
LayoutSplitview string = "splitview"
LayoutSplitviewLandscape string = "splitview-landscape"

TagSkip string = "kiosk-skip"
)
7 changes: 7 additions & 0 deletions internal/routes/routes.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,13 @@ type PersonOrAlbum struct {
ID string
}

// requestMetadata holds information about the current request context
type requestMetadata struct {
requestID string
deviceID string
urlString string
}

func ShouldDrawFacesOnImages() bool {
return drawFacesOnImages == "true"
}
Expand Down
Loading

0 comments on commit 0966a0c

Please sign in to comment.