-
Notifications
You must be signed in to change notification settings - Fork 0
/
pedalup.go
124 lines (95 loc) · 2.47 KB
/
pedalup.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package main
import (
"encoding/json"
"errors"
"flag"
"fmt"
"log"
"os"
"path/filepath"
"strings"
"github.com/shirou/gopsutil/disk"
strava "github.com/strava/go.strava"
"gopkg.in/ini.v1"
)
func findFile(targetDir string, pattern []string) []string {
for _, v := range pattern {
matches, err := filepath.Glob(targetDir + v)
if err != nil {
fmt.Println(err)
}
if len(matches) != 0 {
return matches
}
}
return []string{}
}
func getFitFiles(targetDirectory string) []string {
fitFilesGlob := []string{"Lezyne/Activities/*.fit"}
return findFile(targetDirectory+"/", fitFilesGlob)
}
func findLezyneGPSVolume() (string, error) {
var found string
lezyneIniFilename := "autorun.inf"
partitions, _ := disk.Partitions(false)
for _, partition := range partitions {
if strings.Contains(partition.Mountpoint, "/Volumes") {
file, _ := os.Stat(partition.Mountpoint + "/" + lezyneIniFilename)
if file != nil {
found = partition.Mountpoint
}
}
}
if len(found) > 0 {
cfg, err := ini.Load(found + "/" + lezyneIniFilename)
if err != nil {
fmt.Printf("Fail to read file: %v", err)
os.Exit(1)
}
autorunLabel := cfg.Section("autorun").Key("label").String()
if strings.Contains(autorunLabel, "Lezyne GPS") {
return found, nil
}
}
return "", errors.New("Lezyne GPS Volume not found")
}
func main() {
var accessToken string
// Provide an access token, with write permissions.
// You'll need to complete the oauth flow to get one.
flag.StringVar(&accessToken, "token", "", "Access Token")
flag.Parse()
if accessToken == "" {
fmt.Println("\nPlease provide an access_token")
flag.PrintDefaults()
os.Exit(1)
}
lezyne, err := findLezyneGPSVolume()
if err != nil {
log.Fatal(err)
}
fitFiles := getFitFiles(lezyne)
client := strava.NewClient(accessToken)
service := strava.NewUploadsService(client)
fmt.Printf("Uploading data...\n")
for _, fitFile := range fitFiles {
r, err := os.Open(fitFile)
if err != nil {
log.Fatal(err)
}
fmt.Println(fitFile)
upload, err := service.
Create(strava.FileDataTypes.FIT, filepath.Base(fitFile), r).
Private().
Do()
if err != nil {
if e, ok := err.(strava.Error); ok && e.Message == "Authorization Error" {
log.Printf("Make sure your token has 'write' permissions. You'll need implement the oauth process to get one")
}
log.Fatal(err)
}
log.Printf("Upload Complete...")
jsonForDisplay, _ := json.Marshal(upload)
log.Printf(string(jsonForDisplay))
}
}