1
1
package main
2
2
3
3
import (
4
- "bytes"
5
4
"encoding/json"
6
5
"fmt"
7
- "io/ioutil"
8
- "mime/multipart"
9
6
"net/http"
10
7
"os"
11
- "path/filepath"
12
- "strings"
13
8
"time"
14
9
10
+ "github.com/Maaarcocr/rmsync"
15
11
"github.com/peterhellberg/link"
16
12
)
17
13
@@ -60,70 +56,6 @@ type ZoteroDirData struct {
60
56
Relations interface {} `json:"relations"`
61
57
}
62
58
63
- type RemarkableFile struct {
64
- Filename string
65
- VisibleName string
66
- }
67
-
68
- func getMetadataFilenames () ([]string , error ) {
69
- var filenames []string
70
- err := filepath .Walk (BaseDir , func (path string , info os.FileInfo , err error ) error {
71
- if err != nil {
72
- return err
73
- }
74
- if info .IsDir () || filepath .Ext (path ) != ".metadata" {
75
- return nil
76
- }
77
- filenames = append (filenames , path )
78
- return nil
79
- })
80
- if err != nil {
81
- return nil , err
82
- }
83
- return filenames , nil
84
- }
85
-
86
- func getDirectories (filenames []string ) ([]RemarkableFile , error ) {
87
- var directories []RemarkableFile
88
- for _ , filename := range filenames {
89
- filecontent , err := ioutil .ReadFile (filename )
90
- if err != nil {
91
- return nil , err
92
- }
93
- var metadata Metadata
94
- err = json .Unmarshal (filecontent , & metadata )
95
- if err != nil {
96
- return nil , err
97
- }
98
- if metadata .Type == "CollectionType" {
99
- directories = append (directories , RemarkableFile {filename , metadata .VisibleName })
100
- }
101
- }
102
- return directories , nil
103
- }
104
-
105
- func getPdfFiles (filenames []string ) ([]RemarkableFile , error ) {
106
- var pdfFiles []RemarkableFile
107
- for _ , filename := range filenames {
108
- filecontent , err := ioutil .ReadFile (filename )
109
- if err != nil {
110
- return nil , err
111
- }
112
- var metadata Metadata
113
- err = json .Unmarshal (filecontent , & metadata )
114
- if err != nil {
115
- return nil , err
116
- }
117
- if metadata .Type == "DocumentType" {
118
- pdfFilename := strings .TrimSuffix (filename , filepath .Ext (filename )) + ".pdf"
119
- if _ , err := os .Stat (pdfFilename ); ! os .IsNotExist (err ) {
120
- pdfFiles = append (pdfFiles , RemarkableFile {pdfFilename , metadata .VisibleName })
121
- }
122
- }
123
- }
124
- return pdfFiles , nil
125
- }
126
-
127
59
func getJson (url string , target interface {}) (* http.Response , error ) {
128
60
req , _ := http .NewRequest ("GET" , url , nil )
129
61
req .Header .Set ("Zotero-API-Key" , ApiKey )
@@ -147,11 +79,15 @@ func getZoteroDirectories() ([]ZoteroDirectory, error) {
147
79
148
80
func getZoteroItemsForDirectory (directory ZoteroDirectory ) ([]ZoteroItem , error ) {
149
81
var zoteroItems []ZoteroItem
82
+ fmt .Println (BaseZoteroURL + UserId + "/collections/" + directory .Key + "/items" )
150
83
res , err := getJson (BaseZoteroURL + UserId + "/collections/" + directory .Key + "/items" , & zoteroItems )
151
84
if err != nil {
152
85
return nil , err
153
86
}
154
- next := link .ParseResponse (res )["next" ].String ()
87
+ next := ""
88
+ if val , ok := link .ParseResponse (res )["next" ]; ok {
89
+ next = val .String ()
90
+ }
155
91
for next != "" {
156
92
var tempZoteroItems []ZoteroItem
157
93
res , err := getJson (next , & tempZoteroItems )
@@ -178,15 +114,15 @@ func getZoteroPdfsFromItems(items []ZoteroItem) []ZoteroItem {
178
114
return zoteroPdfs
179
115
}
180
116
181
- func createRemarkableFileMap (files []RemarkableFile ) map [string ]struct {} {
117
+ func createRemarkableFileMap (files []rmsync. RemarkableFile ) map [string ]struct {} {
182
118
fileMap := make (map [string ]struct {}, 0 )
183
119
for _ , file := range files {
184
120
fileMap [file .VisibleName ] = struct {}{}
185
121
}
186
122
return fileMap
187
123
}
188
124
189
- func getSharedDirectories (directories []RemarkableFile , zoteroDirectories []ZoteroDirectory ) []ZoteroDirectory {
125
+ func getSharedDirectories (directories []rmsync. RemarkableFile , zoteroDirectories []ZoteroDirectory ) []ZoteroDirectory {
190
126
var sharedDirectories []ZoteroDirectory
191
127
dirMap := createRemarkableFileMap (directories )
192
128
for _ , zoteroDirectory := range zoteroDirectories {
@@ -197,60 +133,19 @@ func getSharedDirectories(directories []RemarkableFile, zoteroDirectories []Zote
197
133
return sharedDirectories
198
134
}
199
135
200
- func downloadPdfFile (url string ) ([]byte , error ) {
201
- r , err := myClient .Get (url )
202
- if err != nil {
203
- return nil , err
204
- }
205
- defer r .Body .Close ()
206
- fileContents , err := ioutil .ReadAll (r .Body )
207
- if err != nil {
208
- return nil , err
136
+ func createRemarkableFilesToSync (pdfs []ZoteroItem ) []rmsync.FileToSync {
137
+ files := make ([]rmsync.FileToSync , 0 )
138
+ for _ , pdf := range pdfs {
139
+ files = append (files , rmsync.FileToSync {pdf .Data .Filename , pdf .Data .Url })
209
140
}
210
- return fileContents , nil
211
- }
212
-
213
- func uploadPdfToTablet (fileContents []byte , filename string ) error {
214
- body := new (bytes.Buffer )
215
- writer := multipart .NewWriter (body )
216
- part , err := writer .CreateFormFile ("file" , filename )
217
- if err != nil {
218
- return err
219
- }
220
- part .Write (fileContents )
221
-
222
- err = writer .Close ()
223
- if err != nil {
224
- return err
225
- }
226
- req , err := http .NewRequest ("POST" , "http://10.11.99.1/upload" , body )
227
- req .Header .Set ("Content-Type" , writer .FormDataContentType ())
228
- req .Header .Set ("Accept" , "*/*" )
229
- req .Header .Set ("Connection" , "keep-alive" )
230
- if err != nil {
231
- return err
232
- }
233
- _ , err = myClient .Do (req )
234
- if err != nil {
235
- return err
236
- }
237
- return nil
141
+ return files
238
142
}
239
143
240
144
func sync () error {
241
- filenames , err := getMetadataFilenames ()
145
+ directories , err := rmsync . GetDirectoriesMetadataFiles ()
242
146
if err != nil {
243
147
return err
244
148
}
245
- directories , err := getDirectories (filenames )
246
- if err != nil {
247
- return err
248
- }
249
- pdfFiles , err := getPdfFiles (filenames )
250
- if err != nil {
251
- return err
252
- }
253
- pdfFileMap := createRemarkableFileMap (pdfFiles )
254
149
zoteroDirectories , err := getZoteroDirectories ()
255
150
if err != nil {
256
151
return err
@@ -262,18 +157,10 @@ func sync() error {
262
157
return err
263
158
}
264
159
pdfs := getZoteroPdfsFromItems (items )
265
- for _ , item := range pdfs {
266
- if _ , ok := pdfFileMap [item .Data .Filename ]; ! ok {
267
- fmt .Println (item .Data .Url )
268
- fileContents , err := downloadPdfFile (item .Data .Url )
269
- if err != nil {
270
- return err
271
- }
272
- err = uploadPdfToTablet (fileContents , item .Data .Filename )
273
- if err != nil {
274
- return err
275
- }
276
- }
160
+ filesToSync := createRemarkableFilesToSync (pdfs )
161
+ err = rmsync .Sync (filesToSync )
162
+ if err != nil {
163
+ return err
277
164
}
278
165
}
279
166
return nil
0 commit comments