package photos import ( "encoding/json" "fmt" ) type Bridge interface { RequestAccess() error ListAlbums() ([]Album, error) ListAssets(albumID string) ([]Asset, int, error) ListTree() ([]CollectionNode, error) ExportAlbumPreviews(albumID, outputDir string, targetSize int) (int, error) ExportAlbumOriginals(albumID, outputDir string) (int, error) ExportPreview(assetID, outputDir string, targetSize, index int) (ExportResult, error) ExportOriginal(assetID, outputDir string, index int) (ExportResult, error) BackupAll(outputDir string, targetSize int, originals bool) (int, error) Cancel() } func ParseAlbumsJSON(jsonStr string) ([]Album, error) { var resp AlbumsResponse if err := json.Unmarshal([]byte(jsonStr), &resp); err != nil { return nil, err } return resp.Albums, nil } func ParseAssetsJSON(jsonStr string) ([]Asset, int, error) { var errResp ErrorResponse if err := json.Unmarshal([]byte(jsonStr), &errResp); err == nil && errResp.Error != "" { return nil, 0, fmt.Errorf("%s", errResp.Error) } var resp AssetsResponse if err := json.Unmarshal([]byte(jsonStr), &resp); err != nil { return nil, 0, err } return resp.Assets, resp.Total, nil } func ParseTreeJSON(jsonStr string) ([]CollectionNode, error) { var errResp ErrorResponse if err := json.Unmarshal([]byte(jsonStr), &errResp); err == nil && errResp.Error != "" { return nil, fmt.Errorf("%s", errResp.Error) } var resp TreeResponse if err := json.Unmarshal([]byte(jsonStr), &resp); err != nil { return nil, err } return resp.Collections, nil } func ParseExportResultJSON(jsonStr string) (ExportResult, error) { var resp ExportResultResponse if err := json.Unmarshal([]byte(jsonStr), &resp); err != nil { return ExportResult{}, err } if resp.Error != "" { return ExportResult{}, fmt.Errorf("%s", resp.Error) } return resp.ExportResult, nil } func InterpretExportResult(rc int) (int, error) { switch rc { case -1: return 0, fmt.Errorf("invalid arguments or directory creation failed") case -2: return 0, fmt.Errorf("could not create output directory") case -3: return 0, fmt.Errorf("album not found") case -4: return 0, fmt.Errorf("all exports failed") case -5: return 0, fmt.Errorf("cancelled") default: if rc < 0 { return 0, fmt.Errorf("unknown error (code %d)", rc) } return rc, nil } }