source: code/trunk/cmd/simplytranslate/main.go@ 55

Last change on this file since 55 was 55, checked in by yakumo.izuru, 17 months ago

「swagger」サポートを削除し、あちこちのバグを修正

File size: 5.9 KB
RevLine 
[53]1package main
2
3import (
4 "bytes"
5 "net/http"
6 "net/url"
7 "time"
[55]8 "runtime"
[53]9
10 "git.chaotic.ninja/yakumo.izuru/simplytranslate/engines"
11 "github.com/gofiber/fiber/v2"
12 "github.com/gofiber/template/html/v2"
13)
14
15var conf struct {
16 listen string
17 staticpath string
18 tmplpath string
19}
20func main() {
[55]21 parseFlags()
[53]22
23 if configfile != "" {
24 readConf(configfile)
25 }
26
[55]27 // Default settings
[53]28 conf.listen = "127.0.0.1:5000"
29 conf.staticpath = "./static"
30 conf.tmplpath = "./views"
31
32 engine := html.New(conf.tmplpath, ".html")
33 engine.AddFunc("inc", func(i int) int { return i + 1 })
34
35 app := fiber.New(fiber.Config{
36 Views: engine,
37 })
38
[55]39 api := app.Group("/api")
40
[53]41 app.All("/", func(c *fiber.Ctx) error {
42 engine := c.Cookies("engine")
43 if c.Query("engine") != "" {
44 engine = c.Query("engine")
45 }
46 if _, ok := engines.Engines[engine]; !ok {
47 engine = "google"
48 }
49 targetLanguages, err := engines.Engines[engine].TargetLanguages()
50 if err != nil {
51 return c.SendStatus(500)
52 }
53 sourceLanguages, err := engines.Engines[engine].SourceLanguages()
54 if err != nil {
55 return c.SendStatus(500)
56 }
57 originalText := ""
58 translatedText := ""
59 from := ""
60 to := ""
61 ttsFrom := ""
62 ttsTo := ""
63 sourceLanguage := ""
64
65 var translation engines.TranslationResult
66 if c.Method() == "POST" {
67 from = c.FormValue("from")
68 to = c.FormValue("to")
69 originalText = c.FormValue("text")
70 if result, err := engines.Engines[engine].Translate(originalText, from, to); err != nil {
71 return c.SendStatus(500)
72 } else {
73 translatedText = result.TranslatedText
74 translation = result
75 sourceLanguage = result.SourceLanguage
76 }
77
78 ttsFromURL, _ := url.Parse("api/tts")
79 fromQuery := url.Values{}
80 fromQuery.Add("lang", from)
81 fromQuery.Add("text", originalText)
82 ttsFromURL.RawQuery = fromQuery.Encode()
83 ttsFrom = ttsFromURL.String()
84
85 ttsToURL, _ := url.Parse("api/tts")
86 toQuery := url.Values{}
87 toQuery.Add("lang", to)
88 toQuery.Add("text", translatedText)
89 ttsToURL.RawQuery = toQuery.Encode()
90 ttsTo = ttsToURL.String()
91
92 fromCookie := new(fiber.Cookie)
93 fromCookie.Name = "from"
94 fromCookie.Value = from
95 fromCookie.Expires = time.Now().Add(time.Hour * 24 * 365)
96 c.Cookie(fromCookie)
97
98 toCookie := new(fiber.Cookie)
99 toCookie.Name = "to"
100 toCookie.Value = to
101 toCookie.Expires = time.Now().Add(time.Hour * 24 * 365)
102 c.Cookie(toCookie)
103
104 engineCookie := new(fiber.Cookie)
105 engineCookie.Name = "engine"
106 engineCookie.Value = engine
107 engineCookie.Expires = time.Now().Add(time.Hour * 24 * 365)
108 c.Cookie(engineCookie)
109 } else if c.Method() == "GET" {
110 from = c.Cookies("from")
111 to = c.Cookies("to")
112 } else {
113 return c.SendStatus(400)
114 }
115
116 if from == "" {
117 from = "auto"
118 }
119
120 enginesNames := map[string]string{}
121 for k, v := range engines.Engines {
122 enginesNames[k] = v.DisplayName()
123 }
124
125 return c.Render("index", fiber.Map{
126 "Engine": engine,
127 "enginesNames": enginesNames,
128 "SourceLanguages": sourceLanguages,
129 "TargetLanguages": targetLanguages,
130 "OriginalText": originalText,
131 "Translation": translation,
132 "From": from,
133 "To": to,
134 "TtsFrom": ttsFrom,
135 "TtsTo": ttsTo,
136 "SourceLanguage": sourceLanguage,
137 })
138 })
139
[55]140 api.All("/api/translate", func(c *fiber.Ctx) error {
[53]141 from := ""
142 to := ""
143 engine := ""
144 text := ""
145 if c.Method() == "GET" {
146 engine = c.Query("engine")
147 text = c.Query("text")
148 from = c.Query("from")
149 to = c.Query("to")
150 } else if c.Method() == "POST" {
151 engine = c.FormValue("engine")
152 text = c.FormValue("text")
153 from = c.FormValue("from")
154 to = c.FormValue("to")
155 } else {
156 return c.SendStatus(400)
157 }
158 if _, ok := engines.Engines[engine]; !ok || engine == "" {
159 engine = "google"
160 }
161 if to == "" {
162 return c.SendStatus(400)
163 }
164 if result, err := engines.Engines[engine].Translate(text, from, to); err != nil {
165 return c.SendStatus(500)
166 } else {
167 return c.JSON(result)
168 }
169 })
170
[55]171 api.Get("/api/source_languages", func(c *fiber.Ctx) error {
[53]172 engine := c.Query("engine")
173 if _, ok := engines.Engines[engine]; !ok || engine == "" {
174 engine = "google"
175 }
176 if result, err := engines.Engines[engine].SourceLanguages(); err != nil {
177 return c.SendStatus(500)
178 } else {
179 return c.JSON(result)
180 }
181 })
182
[55]183 api.Get("/api/target_languages", func(c *fiber.Ctx) error {
[53]184 engine := c.Query("engine")
185 if _, ok := engines.Engines[engine]; !ok || engine == "" {
186 engine = "google"
187 }
188 if result, err := engines.Engines[engine].TargetLanguages(); err != nil {
189 return c.SendStatus(500)
190 } else {
191 return c.JSON(result)
192 }
193 })
194
[55]195 api.Get("/api/tts", func(c *fiber.Ctx) error {
[53]196 engine := c.Query("engine")
197 if _, ok := engines.Engines[engine]; !ok || engine == "" {
198 engine = "google"
199 }
200
201 text := c.Query("text")
202 if text == "" {
203 return c.SendStatus(400)
204 }
205
206 lang := c.Query("lang")
207
208 if url, err := engines.Engines[engine].Tts(text, lang); err != nil {
209 return c.SendStatus(500)
210 } else {
211 if response, err := http.Get(url); err != nil {
212 return c.SendStatus(500)
213 } else {
214 defer response.Body.Close()
215 var buf bytes.Buffer
216 response.Write(&buf)
217 c.Context().SetContentType("audio/mpeg")
218 return c.Send(buf.Bytes())
219 }
220 }
221 })
[55]222 api.Get("/version", func(c *fiber.Ctx) error {
223 return c.JSON(fiber.Map{
224 "fiberversion": fiber.Version,
225 "goversion": runtime.Version(),
226 })
227 })
[53]228 app.Post("/switchlanguages", func(c *fiber.Ctx) error {
229 if c.Cookies("from") != "" {
230 fromCookie := new(fiber.Cookie)
231 fromCookie.Name = "from"
232 fromCookie.Value = c.Cookies("to")
233 fromCookie.Expires = time.Now().Add(24 * time.Hour * 365)
234
235 toCookie := new(fiber.Cookie)
236 toCookie.Name = "to"
237 toCookie.Value = c.Cookies("from")
238 toCookie.Expires = time.Now().Add(24 * time.Hour * 365)
239
240 c.Cookie(fromCookie)
241 c.Cookie(toCookie)
242 }
243 return c.Redirect("/")
244 })
245 app.Static("/static", conf.staticpath, fiber.Static{
246 Compress: true,
247 ByteRange: true,
248 Browse: true,
249 })
250 app.Listen(conf.listen)
251}
Note: See TracBrowser for help on using the repository browser.