153 lines
4 KiB
Go
153 lines
4 KiB
Go
// Package api has type definitions for pcloud
|
|
//
|
|
// Converted from the API docs with help from https://mholt.github.io/json-to-go/
|
|
package api
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
// Sun, 16 Mar 2014 17:26:04 +0000
|
|
timeFormat = `"` + time.RFC1123Z + `"`
|
|
)
|
|
|
|
// Time represents represents date and time information for the
|
|
// pcloud API, by using RFC1123Z
|
|
type Time time.Time
|
|
|
|
// MarshalJSON turns a Time into JSON (in UTC)
|
|
func (t *Time) MarshalJSON() (out []byte, err error) {
|
|
timeString := (*time.Time)(t).Format(timeFormat)
|
|
return []byte(timeString), nil
|
|
}
|
|
|
|
// UnmarshalJSON turns JSON into a Time
|
|
func (t *Time) UnmarshalJSON(data []byte) error {
|
|
newT, err := time.Parse(timeFormat, string(data))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
*t = Time(newT)
|
|
return nil
|
|
}
|
|
|
|
// Error is returned from pcloud when things go wrong
|
|
//
|
|
// If result is 0 then everything is OK
|
|
type Error struct {
|
|
Result int `json:"result"`
|
|
ErrorString string `json:"error"`
|
|
}
|
|
|
|
// Error returns a string for the error and statistifes the error interface
|
|
func (e *Error) Error() string {
|
|
return fmt.Sprintf("pcloud error: %s (%d)", e.ErrorString, e.Result)
|
|
}
|
|
|
|
// Update returns err directly if it was != nil, otherwise it returns
|
|
// an Error or nil if no error was detected
|
|
func (e *Error) Update(err error) error {
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if e.Result == 0 {
|
|
return nil
|
|
}
|
|
return e
|
|
}
|
|
|
|
// Check Error statisfies the error interface
|
|
var _ error = (*Error)(nil)
|
|
|
|
// Item describes a folder or a file as returned by Get Folder Items and others
|
|
type Item struct {
|
|
Path string `json:"path"`
|
|
Name string `json:"name"`
|
|
Created Time `json:"created"`
|
|
IsMine bool `json:"ismine"`
|
|
Thumb bool `json:"thumb"`
|
|
Modified Time `json:"modified"`
|
|
Comments int `json:"comments"`
|
|
ID string `json:"id"`
|
|
IsShared bool `json:"isshared"`
|
|
IsDeleted bool `json:"isdeleted"`
|
|
Icon string `json:"icon"`
|
|
IsFolder bool `json:"isfolder"`
|
|
ParentFolderID int64 `json:"parentfolderid"`
|
|
FolderID int64 `json:"folderid,omitempty"`
|
|
Height int `json:"height,omitempty"`
|
|
FileID int64 `json:"fileid,omitempty"`
|
|
Width int `json:"width,omitempty"`
|
|
Hash uint64 `json:"hash,omitempty"`
|
|
Category int `json:"category,omitempty"`
|
|
Size int64 `json:"size,omitempty"`
|
|
ContentType string `json:"contenttype,omitempty"`
|
|
Contents []Item `json:"contents"`
|
|
}
|
|
|
|
// ModTime returns the modification time of the item
|
|
func (i *Item) ModTime() (t time.Time) {
|
|
t = time.Time(i.Modified)
|
|
if t.IsZero() {
|
|
t = time.Time(i.Created)
|
|
}
|
|
return t
|
|
}
|
|
|
|
// ItemResult is returned from the /listfolder, /createfolder, /deletefolder, /deletefile etc methods
|
|
type ItemResult struct {
|
|
Error
|
|
Metadata Item `json:"metadata"`
|
|
}
|
|
|
|
// Hashes contains the supported hashes
|
|
type Hashes struct {
|
|
SHA1 string `json:"sha1"`
|
|
MD5 string `json:"md5"`
|
|
}
|
|
|
|
// UploadFileResponse is the response from /uploadfile
|
|
type UploadFileResponse struct {
|
|
Error
|
|
Items []Item `json:"metadata"`
|
|
Checksums []Hashes `json:"checksums"`
|
|
Fileids []int64 `json:"fileids"`
|
|
}
|
|
|
|
// GetFileLinkResult is returned from /getfilelink
|
|
type GetFileLinkResult struct {
|
|
Error
|
|
Dwltag string `json:"dwltag"`
|
|
Hash uint64 `json:"hash"`
|
|
Size int64 `json:"size"`
|
|
Expires Time `json:"expires"`
|
|
Path string `json:"path"`
|
|
Hosts []string `json:"hosts"`
|
|
}
|
|
|
|
// IsValid returns whether the link is valid and has not expired
|
|
func (g *GetFileLinkResult) IsValid() bool {
|
|
if g == nil {
|
|
return false
|
|
}
|
|
if len(g.Hosts) == 0 {
|
|
return false
|
|
}
|
|
return time.Time(g.Expires).Sub(time.Now()) > 30*time.Second
|
|
}
|
|
|
|
// URL returns a URL from the Path and Hosts. Check with IsValid
|
|
// before calling.
|
|
func (g *GetFileLinkResult) URL() string {
|
|
// FIXME rotate the hosts?
|
|
return "https://" + g.Hosts[0] + g.Path
|
|
}
|
|
|
|
// ChecksumFileResult is returned from /checksumfile
|
|
type ChecksumFileResult struct {
|
|
Error
|
|
Hashes
|
|
Metadata Item `json:"metadata"`
|
|
}
|