1
1
package main
2
2
3
3
import (
4
+ "encoding/json"
4
5
"flag"
5
- "github.com/bitly/go-simplejson"
6
- "github.com/iikira/baidu-tools/util"
6
+ "fmt"
7
+ "github.com/iikira/BaiduPCS-Go/pcsutil"
8
+ "github.com/iikira/BaiduPCS-Go/requester"
9
+ "github.com/iikira/BaiduPCS-Go/uploader"
7
10
"io/ioutil"
8
11
"log"
12
+ "net/http"
9
13
"os"
10
14
"path/filepath"
11
15
)
12
16
17
+ const (
18
+ Version = "v1.0"
19
+ )
20
+
13
21
var (
14
- isOverWrite = flag .Bool ("w" , false , "over write mode" )
22
+ isOverWrite = false
23
+ printVersion = false
15
24
)
16
25
17
26
func init () {
27
+ flag .BoolVar (& isOverWrite , "w" , false , "overwrite" )
28
+ flag .BoolVar (& printVersion , "v" , false , "print version" )
29
+
18
30
flag .Parse ()
19
- baiduUtil .SetLogPrefix ()
20
- baiduUtil .SetTimeout (3e11 )
31
+
32
+ if printVersion {
33
+ fmt .Printf ("TinyPNG client, Version %s\n " , Version )
34
+ fmt .Println ("Copyright (c) 2017-2018, iikira/tinypng: https://github.com/iikira/tinypng" )
35
+ os .Exit (0 )
36
+ }
37
+ pcsutil .SetLogPrefix ()
21
38
}
22
39
23
40
func main () {
24
41
if len (os .Args ) <= 1 {
25
- log .Println ("请输入参数" )
26
42
flag .Usage ()
27
43
return
28
44
}
@@ -44,64 +60,108 @@ func main() {
44
60
}
45
61
}
46
62
}
63
+ }
47
64
65
+ type UploadedData struct {
66
+ Input InputData `json:"input"`
67
+ Output OutputData `json:"output"`
68
+ Error string `json:"error"`
69
+ Message string `json:"message"`
70
+ }
71
+
72
+ type InputData struct {
73
+ Size int64 `json:"size"`
74
+ Type string `json:"type"`
75
+ }
76
+
77
+ type OutputData struct {
78
+ InputData
79
+ Width uint `json:"width"`
80
+ Height uint `json:"height"`
81
+ Ratio float64 `json:"ratio"`
82
+ URL string `json:"url"`
48
83
}
49
84
50
85
func do (filename string ) (code int ) {
51
86
log .Printf ("[%s] 正在上传图片\n " , filename )
52
- data , err := ioutil . ReadFile (filename )
87
+ file , err := os . OpenFile (filename , os . O_RDONLY , 0666 )
53
88
if err != nil {
54
89
log .Println (err )
55
90
return 1
56
91
}
57
92
58
- imgJSON , err := baiduUtil .Fetch ("POST" , "https://tinypng.com/web/shrink" , nil , data , map [string ]string {
59
- // "Content-Type": "application/x-www-form-urlencoded",
60
- "Content-Encoding" : "gzip" ,
61
- })
62
- if err != nil {
63
- log .Println (err )
64
- return 2
93
+ // 保留权限
94
+ mode := os .FileMode (0666 )
95
+ info , err := file .Stat ()
96
+ if err == nil {
97
+ mode = info .Mode ()
65
98
}
66
99
67
- json , err := simplejson .NewJson (imgJSON )
68
- if err != nil {
69
- log .Println (err )
70
- return 3
71
- }
100
+ uploader .DoUpload ("https://tinypng.com/web/shrink" , false , uploader .NewFileReaderLen (file ), func (resp * http.Response , err error ) {
101
+ file .Close ()
102
+ fmt .Println ()
72
103
73
- if j , ok := json .CheckGet ("error" ); ok {
74
- log .Printf ("[%s] Error, %s: %s\n " , filename , j .MustString (), json .Get ("message" ).MustString ())
75
- return 1
76
- }
104
+ if err != nil {
105
+ log .Println (err )
106
+ code = 2
107
+ return
108
+ }
77
109
78
- outputJSON := json .Get ("output" )
79
- url := outputJSON .Get ("url" ).MustString ()
110
+ imgJSON , err := ioutil .ReadAll (resp .Body )
111
+ if err != nil {
112
+ log .Println (err )
113
+ code = 1
114
+ return
115
+ }
80
116
81
- log .Printf ("[%s] 上传图片成功, 正在下载压缩后的图片...\n " , filename )
82
- img , err := baiduUtil .Fetch ("GET" , url , nil , nil , nil )
83
- if err != nil {
84
- log .Println (err )
85
- return 2
86
- }
117
+ resp .Body .Close ()
87
118
88
- outputSize := outputJSON .Get ("size" ).MustFloat64 ()
89
- if len (img ) != int (outputSize ) {
90
- log .Printf ("[%s] 图片下载失败, 文件大小不一致\n " , filename )
91
- return 2
92
- }
119
+ data := new (UploadedData )
93
120
94
- var newName string
95
- if * isOverWrite {
96
- newName = filename
97
- } else {
98
- newName = filepath .Dir (filename ) + "/tinified-" + filepath .Base (filename )
99
- }
100
- err = ioutil .WriteFile (newName , img , 0666 )
101
- if err != nil {
102
- log .Println (err )
103
- return 1
104
- }
105
- log .Printf ("[%s] 图片保存成功, 保存位置: %s, 图片类型: %s, 原始图片大小: %s, 压缩后图片大小: %s, 压缩比率: %f%%\n " , filename , newName , outputJSON .Get ("type" ).MustString (), convertSize (json .GetPath ("input" , "size" ).MustFloat64 ()), convertSize (outputSize ), outputJSON .Get ("ratio" ).MustFloat64 ()* 100 )
106
- return 0
121
+ err = json .Unmarshal (imgJSON , data )
122
+ if err != nil {
123
+ log .Println (err )
124
+ code = 3
125
+ return
126
+ }
127
+
128
+ if data .Error != "" {
129
+ log .Printf ("[%s] Error, %s: %s\n " , filename , data .Error , data .Message )
130
+ code = 1
131
+ return
132
+ }
133
+
134
+ log .Printf ("[%s] 上传图片成功, 正在下载压缩后的图片...\n " , filename )
135
+
136
+ img , err := requester .DefaultClient .Fetch ("GET" , data .Output .URL , nil , nil )
137
+ if err != nil {
138
+ log .Println (err )
139
+ code = 2
140
+ return
141
+ }
142
+
143
+ imgLen := int64 (len (img ))
144
+ if imgLen != data .Output .Size {
145
+ log .Printf ("[%s] 图片下载失败, 文件大小不一致, 已下载: %d, 远程: %d\n " , filename , imgLen , data .Output .Size )
146
+ code = 2
147
+ return
148
+ }
149
+
150
+ var newName string
151
+ if isOverWrite {
152
+ newName = filename
153
+ } else {
154
+ newName = filepath .Dir (filename ) + string (os .PathSeparator ) + "tinified-" + filepath .Base (filename )
155
+ }
156
+
157
+ err = ioutil .WriteFile (newName , img , mode )
158
+ if err != nil {
159
+ log .Println (err )
160
+ code = 1
161
+ return
162
+ }
163
+ log .Printf ("[%s] 图片保存成功, 保存位置: %s, 图片类型: %s, 图片宽度: %d, 图片高度: %d, 原始图片大小: %s, 压缩后图片大小: %s, 压缩比率: %f%%\n " , filename , newName , data .Output .Type , data .Output .Width , data .Output .Height , pcsutil .ConvertFileSize (data .Input .Size ), pcsutil .ConvertFileSize (data .Output .Size ), data .Output .Ratio * 100 )
164
+ })
165
+
166
+ return code
107
167
}
0 commit comments