@@ -241,13 +241,16 @@ type artifact struct {
241241 ID string `json:"id"`
242242 CreatedAt string `json:"createdAt"`
243243 UpdatedAt string `json:"updatedAt"`
244+ Name string `json:"name"`
245+ MediaType string `json:"mediaType"`
244246 UserID int `json:"userId"`
245247 CreatedBy int `json:"createdBy"`
246248 TaskID string `json:"taskId"`
247249 ParentAssetGroupId string `json:"parentAssetGroupId"`
248250 Filename string `json:"filename"`
249251 URL string `json:"url"`
250- FileSize string `json:"fileSize"`
252+ FileSize any `json:"fileSize"`
253+ FileExtension string `json:"fileExtStandardized"`
251254 IsDirectory bool `json:"isDirectory"`
252255 PreviewURLs []string `json:"previewUrls"`
253256 Private bool `json:"private"`
@@ -261,10 +264,10 @@ type artifact struct {
261264 } `json:"metadata"`
262265}
263266
264- func (c * Client ) Generate (ctx context.Context , assetURL , textPrompt string , interpolate , upscale , watermark , extend bool ) (string , error ) {
267+ func (c * Client ) Generate (ctx context.Context , assetURL , textPrompt string , interpolate , upscale , watermark , extend bool ) (string , string , error ) {
265268 // Load team ID
266269 if err := c .loadTeamID (ctx ); err != nil {
267- return "" , fmt .Errorf ("runway: couldn't load team id: %w" , err )
270+ return "" , "" , fmt .Errorf ("runway: couldn't load team id: %w" , err )
268271 }
269272
270273 // Generate seed
@@ -311,35 +314,36 @@ func (c *Client) Generate(ctx context.Context, assetURL, textPrompt string, inte
311314 }
312315 var taskResp taskResponse
313316 if err := c .do (ctx , "POST" , "tasks" , createReq , & taskResp ); err != nil {
314- return "" , fmt .Errorf ("runway: couldn't create task: %w" , err )
317+ return "" , "" , fmt .Errorf ("runway: couldn't create task: %w" , err )
315318 }
316319
317320 // Wait for task to finish
318321 for {
319322 switch taskResp .Task .Status {
320323 case "SUCCEEDED" :
321324 if len (taskResp .Task .Artifacts ) == 0 {
322- return "" , fmt .Errorf ("runway: no artifacts returned" )
325+ return "" , "" , fmt .Errorf ("runway: no artifacts returned" )
323326 }
324- if taskResp .Task .Artifacts [0 ].URL == "" {
325- return "" , fmt .Errorf ("runway: empty artifact url" )
327+ artifact := taskResp .Task .Artifacts [0 ]
328+ if artifact .URL == "" {
329+ return "" , "" , fmt .Errorf ("runway: empty artifact url" )
326330 }
327- return taskResp . Task . Artifacts [ 0 ] .URL , nil
331+ return artifact . ID , artifact .URL , nil
328332 case "PENDING" , "RUNNING" :
329333 c .log ("runway: task %s: %s" , taskResp .Task .ID , taskResp .Task .ProgressRatio )
330334 default :
331- return "" , fmt .Errorf ("runway: task failed: %s" , taskResp .Task .Status )
335+ return "" , "" , fmt .Errorf ("runway: task failed: %s" , taskResp .Task .Status )
332336 }
333337
334338 select {
335339 case <- ctx .Done ():
336- return "" , fmt .Errorf ("runway: %w" , ctx .Err ())
340+ return "" , "" , fmt .Errorf ("runway: %w" , ctx .Err ())
337341 case <- time .After (5 * time .Second ):
338342 }
339343
340344 path := fmt .Sprintf ("tasks/%s?asTeamId=%d" , taskResp .Task .ID , c .teamID )
341345 if err := c .do (ctx , "GET" , path , nil , & taskResp ); err != nil {
342- return "" , fmt .Errorf ("runway: couldn't get task: %w" , err )
346+ return "" , "" , fmt .Errorf ("runway: couldn't get task: %w" , err )
343347 }
344348 }
345349}
@@ -351,7 +355,10 @@ type assetDeleteResponse struct {
351355 Success bool `json:"success"`
352356}
353357
354- // TODO: Delete asset by url instead
358+ type assetResponse struct {
359+ Asset artifact `json:"asset"`
360+ }
361+
355362func (c * Client ) DeleteAsset (ctx context.Context , id string ) error {
356363 path := fmt .Sprintf ("assets/%s" , id )
357364 var resp assetDeleteResponse
@@ -364,6 +371,18 @@ func (c *Client) DeleteAsset(ctx context.Context, id string) error {
364371 return nil
365372}
366373
374+ func (c * Client ) GetAsset (ctx context.Context , id string ) (string , error ) {
375+ path := fmt .Sprintf ("assets/%s" , id )
376+ var resp assetResponse
377+ if err := c .do (ctx , "GET" , path , nil , & resp ); err != nil {
378+ return "" , fmt .Errorf ("runway: couldn't get asset %s: %w" , id , err )
379+ }
380+ if resp .Asset .URL == "" {
381+ return "" , fmt .Errorf ("runway: empty asset url" )
382+ }
383+ return resp .Asset .URL , nil
384+ }
385+
367386func (c * Client ) log (format string , args ... interface {}) {
368387 if c .debug {
369388 format += "\n "
0 commit comments