Skip to content

Commit

Permalink
Merge branch 'Fix-#42--better-handling-of-google-photos-albums' into …
Browse files Browse the repository at this point in the history
…Use-the-new-stacking-feature-to-group-jpg-and-raw-images,-same-for-burst-#45
  • Loading branch information
simulot committed Oct 29, 2023
2 parents 9308e5a + 2d01ebb commit 5aa7f53
Show file tree
Hide file tree
Showing 5 changed files with 104 additions and 9 deletions.
61 changes: 57 additions & 4 deletions cmdupload/upload.go
Original file line number Diff line number Diff line change
Expand Up @@ -110,13 +110,18 @@ func UploadCommand(ctx context.Context, ic *immich.ImmichClient, log *logger.Log
return err
}

log.MessageContinue(logger.OK, "Get server's assets...")
log.OK("Ask for server's assets...")
var list []*immich.Asset
list, err = app.Immich.GetAllAssets(ctx, nil)
err = app.Immich.GetAllAssetsWithFilter(ctx, nil, func(a *immich.Asset) {
if a.IsTrashed {
return
}
list = append(list, a)
})
if err != nil {
return err
}
log.MessageTerminate(logger.OK, " %d received", len(list))
log.OK("%d asset(s) received", len(list))

app.AssetIndex = &AssetIndex{
assets: list,
Expand Down Expand Up @@ -295,6 +300,54 @@ func (app *UpCmd) handleAsset(ctx context.Context, a *assets.LocalAssetFile) err

}

func NewUpCmd(ctx context.Context, ic *immich.ImmichClient, logger *logger.Logger, args []string) (*UpCmd, error) {
var err error
cmd := flag.NewFlagSet("upload", flag.ExitOnError)

app := UpCmd{
updateAlbums: map[string]map[string]any{},
logger: logger,
Immich: ic,
}
cmd.BoolVar(&app.DryRun, "dry-run", false, "display actions but don't touch source or destination")
cmd.BoolVar(&app.GooglePhotos, "google-photos", false, "Import GooglePhotos takeout zip files")
cmd.BoolVar(&app.Delete, "delete", false, "Delete local assets after upload")
cmd.BoolVar(&app.KeepTrashed, "keep-trashed", false, "Import also trashed items")
cmd.BoolVar(&app.KeepPartner, "keep-partner", true, "Import also partner's items")
cmd.BoolVar(&app.CreateAlbumAfterFolder, "create-album-folder", false, "Create albums for assets based on the parent folder or a given name")
cmd.StringVar(&app.ImportIntoAlbum, "album", "", "All assets will be added to this album.")
cmd.StringVar(&app.PartnerAlbum, "partner-album", "", "Assets from partner will be added to this album. (Must already exist)")
cmd.Var(&app.DateRange, "date", "Date of capture range.")
cmd.StringVar(&app.ImportFromAlbum, "from-album", "", "Import only from this album")
cmd.BoolVar(&app.CreateAlbums, "create-albums", true, "Create albums like there were in the source")
cmd.BoolVar(&app.ForceSidecar, "force-sidecar", false, "Upload the photo and a sidecar file with known information like date and GPS coordinates. With GooglePhotos, information comes from the metadata files. (DEFAULT false)")
err = cmd.Parse(args)
if err != nil {
return nil, err
}

for _, f := range cmd.Args() {
if !fshelper.HasMagic(f) {
app.Paths = append(app.Paths, f)
} else {
m, err := filepath.Glob(f)
if err != nil {
return nil, fmt.Errorf("can't use this file argument %q: %w", f, err)
}
if len(m) == 0 {
return nil, fmt.Errorf("no file matches %q", f)
}
app.Paths = append(app.Paths, m...)
}
}

if len(app.Paths) == 0 {
err = errors.Join(err, errors.New("must specify at least one path for local assets"))
}
return &app, err

}

func (a *UpCmd) ReadGoogleTakeOut(ctx context.Context, fsys fs.FS) (assets.Browser, error) {
a.Delete = false
return gp.NewTakeout(ctx, fsys)
Expand Down Expand Up @@ -373,7 +426,7 @@ func (app *UpCmd) DeleteLocalAssets() error {
return err
}
} else {
app.logger.Warning("file %q not delested, dry run mode", a.Title)
app.logger.Warning("file %q not deleted, dry run mode", a.Title)
}

}
Expand Down
5 changes: 2 additions & 3 deletions docs/releases.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,14 @@

## Release next

<<<<<<< HEAD
### Fix #47: error when importing from a folder
PANIC when a file wasn't readable because of rights.
=======
### Readme resturcturation

### Better getAssets handling
Filter out trashed asset when getting the list from the server
>>>>>>> Use-the-new-stacking-feature-to-group-jpg-and-raw-images,-same-for-burst-#45

### Use-the-new-stacking-feature-to-group-jpg-and-raw-images,-same-for-burst-#45

## Release 0.4.0

Expand Down
5 changes: 5 additions & 0 deletions immich/asset.go
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,11 @@ func (ic *ImmichClient) GetAllAssets(ctx context.Context, opt *GetAssetOptions)

}

func (ic *ImmichClient) GetAllAssetsWithFilter(ctx context.Context, opt *GetAssetOptions, filter func(*Asset)) error {
err := ic.newServerCall(ctx, "GetAllAssets").do(get("/asset", setUrlValues(opt.Values()), setAcceptJSON()), responseJSONWithFilter(filter))
return err
}

type deleteResponse []struct {
ID string `json:"id"`
Status string `json:"status"`
Expand Down
40 changes: 39 additions & 1 deletion immich/call.go
Original file line number Diff line number Diff line change
Expand Up @@ -280,14 +280,15 @@ func setUrlValues(values url.Values) serverRequestOption {

type serverResponseOption func(sc *serverCall, resp *http.Response) error

func responseJSON(object any) serverResponseOption {
func responseJSON[T any](object *T) serverResponseOption {
return func(sc *serverCall, resp *http.Response) error {
if resp != nil {
if resp.Body != nil {
defer resp.Body.Close()
if resp.StatusCode == http.StatusNoContent {
return nil
}

if sc.joinError(json.NewDecoder(resp.Body).Decode(object)) != nil {
return sc.err
}
Expand All @@ -297,3 +298,40 @@ func responseJSON(object any) serverResponseOption {
return errors.New("can't decode nil response")
}
}

func responseJSONWithFilter[T any](filter func(*T)) serverResponseOption {
return func(sc *serverCall, resp *http.Response) error {
if resp != nil {
if resp.Body != nil {
defer resp.Body.Close()
if resp.StatusCode == http.StatusNoContent {
return nil
}
dec := json.NewDecoder(resp.Body)
// read open bracket "["
_, err := dec.Token()
if sc.joinError(err) != nil {
return sc.err
}

// while the array contains values
for dec.More() {
var o T
// decode an array value (Message)
err := dec.Decode(&o)
if sc.joinError(err) != nil {
return sc.err
}
filter(&o)
}
// read closing bracket "]"
_, err = dec.Token()
if sc.joinError(err) != nil {
return sc.err
}
return nil
}
}
return errors.New("can't decode nil response")
}
}
2 changes: 1 addition & 1 deletion immich/logger/logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ func (l *Logger) Progress(level Level, f string, v ...any) {
if level > l.displayLevel {
return
}
fmt.Printf("\r"+f, v...)
fmt.Printf("\r\033[2K"+f, v...)
l.needCR = true
}

Expand Down

0 comments on commit 5aa7f53

Please sign in to comment.