diff --git a/TODO.md b/TODO.md index fe7ca72..543987d 100644 --- a/TODO.md +++ b/TODO.md @@ -1,11 +1,10 @@ # TODO - Create a web interface - Proper Error handling for requests.go -- Use struct instead of string in many places - Tell which language Detect Language chose -- Add speech to text with Vosk perhaps - Finish simplytranslate-py compatible API for translations - Alternative words - Dictionary - Use the TranslateServerWebui API instead of scraping Google Translate Legacy - ICIBA +- Add speech to text with Vosk perhaps diff --git a/pages/api.go b/pages/api.go index 17757d7..f204f8b 100644 --- a/pages/api.go +++ b/pages/api.go @@ -67,14 +67,14 @@ func HandleTTS(c *fiber.Ctx) error { } else if lang == "" { return c.SendStatus(fiber.StatusBadRequest) } - var data string + var data []byte if engine == "google" { data = utils.TTSGoogle(lang, text) } else if engine == "reverso" { data = utils.TTSReverso(lang, text) } c.Set("Content-Type", "audio/mpeg") - return c.Send([]byte(data)) + return c.Send(data) } func HandleTranslate(c *fiber.Ctx) error { engine := utils.Sanitize(c.Query("engine"), "alpha") @@ -84,8 +84,9 @@ func HandleTranslate(c *fiber.Ctx) error { if engine == "" && from == "" && to == "" && text == ""{ return fiber.NewError(fiber.StatusBadRequest, "from, to, engine, text are required query strings.") } - var data utils.LangOut var err error + var data utils.LangOut + var dataarr []utils.LangOut if engine == "google" { data, err = utils.TranslateGoogle(to, from, text) } else if engine == "libre" { @@ -102,11 +103,15 @@ func HandleTranslate(c *fiber.Ctx) error { data, err = utils.TranslateMyMemory(to, from, text) } else if engine == "duckduckgo" { data, err = utils.TranslateDuckDuckGo(to, from, text) + } else if engine == "all" { + dataarr = utils.TranslateAll(to, from, text) } if err != nil { return fiber.NewError(fiber.StatusInternalServerError, err.Error()) } - data.SourceLang = from - data.TargetLang = to - return c.JSON(data) + if engine == "all" { + return c.JSON(dataarr) + } else { + return c.JSON(data) + } } diff --git a/utils/engines.go b/utils/engines.go index 2b36ccf..0918b51 100644 --- a/utils/engines.go +++ b/utils/engines.go @@ -11,13 +11,16 @@ import ( ) type LangOut struct { - OutputText string `json:"translated-text"` + Engine string `json:"engine"` AutoDetect string `json:"detected"` + OutputText string `json:"translated-text"` SourceLang string `json:"source_language"` TargetLang string `json:"target_language"` } func TranslateGoogle(to string, from string, text string) (LangOut, error) { + ToOrig := to + FromOrig := from // For some reason google uses no for norwegian instead of nb like the rest of the translators. This is for the All function primarily if to == "nb" { to = "no" @@ -65,9 +68,14 @@ func TranslateGoogle(to string, from string, text string) (LangOut, error) { sc.Visit(url) var langout LangOut langout.OutputText = answer + langout.Engine = "google" + langout.SourceLang = FromOrig + langout.TargetLang = ToOrig return langout, nil } func TranslateReverso(to string, from string, query string) (LangOut, error) { + ToOrig := to + FromOrig := from var ToValid bool var FromValid bool for _, v := range LangListReverso("sl") { @@ -92,9 +100,14 @@ func TranslateReverso(to string, from string, query string) (LangOut, error) { gjsonArr := reversoOut.Get("translation").Array() var langout LangOut langout.OutputText = gjsonArr[0].String() + langout.Engine = "reverso" + langout.SourceLang = FromOrig + langout.TargetLang = ToOrig return langout, nil } func TranslateLibreTranslate(to string, from string, query string) (LangOut, error) { + ToOrig := to + FromOrig := from var ToValid bool var FromValid bool for _, v := range LangListLibreTranslate("sl") { @@ -120,9 +133,14 @@ func TranslateLibreTranslate(to string, from string, query string) (LangOut, err gjsonArr := libreTranslateOut.Get("translatedText").Array() var langout LangOut langout.OutputText = gjsonArr[0].String() + langout.Engine = "libretranslate" + langout.SourceLang = FromOrig + langout.TargetLang = ToOrig return langout, nil } func TranslateWatson(to string, from string, query string) (LangOut, error) { + FromOrig := from + ToOrig := to var ToValid bool var FromValid bool for _, v := range LangListWatson("sl") { @@ -147,9 +165,14 @@ func TranslateWatson(to string, from string, query string) (LangOut, error) { gjsonArr := watsonOut.Get("payload.translations.0.translation").Array() var langout LangOut langout.OutputText = gjsonArr[0].String() + langout.Engine = "watson" + langout.SourceLang = FromOrig + langout.TargetLang = ToOrig return langout, nil } func TranslateMyMemory(to string, from string, text string) (LangOut, error) { + FromOrig := from + ToOrig := to var ToValid bool var FromValid bool for _, v := range LangListMyMemory("sl") { @@ -179,9 +202,14 @@ func TranslateMyMemory(to string, from string, text string) (LangOut, error) { gjsonArr := myMemoryOut.Get("responseData.translatedText").Array() var langout LangOut langout.OutputText = gjsonArr[0].String() + langout.Engine = "mymemory" + langout.SourceLang = FromOrig + langout.TargetLang = ToOrig return langout, nil } func TranslateYandex(to string, from string, text string) (LangOut, error) { + FromOrig := from + ToOrig := to var ToValid bool var FromValid bool for _, v := range LangListYandex("sl") { @@ -216,9 +244,14 @@ func TranslateYandex(to string, from string, text string) (LangOut, error) { gjsonArr := yandexOut.Get("text.0").Array() var langout LangOut langout.OutputText = gjsonArr[0].String() + langout.Engine = "yandex" + langout.SourceLang = FromOrig + langout.TargetLang = ToOrig return langout, nil } func TranslateDeepl(to string, from string, text string) (LangOut, error) { + FromOrig := from + ToOrig := to var ToValid bool var FromValid bool for _, v := range LangListDeepl("sl") { @@ -246,9 +279,14 @@ func TranslateDeepl(to string, from string, text string) (LangOut, error) { ans := answer1["data"].(string) var langout LangOut langout.OutputText = ans + langout.Engine = "deepl" + langout.SourceLang = FromOrig + langout.TargetLang = ToOrig return langout, nil } func TranslateDuckDuckGo(to string, from string, query string) (LangOut, error) { + FromOrig := from + ToOrig := to var ToValid bool var FromValid bool for _, v := range LangListDuckDuckGo("sl") { @@ -272,9 +310,12 @@ func TranslateDuckDuckGo(to string, from string, query string) (LangOut, error) gjsonArr := duckDuckGoOut.Get("translated").Array() var langout LangOut langout.OutputText = gjsonArr[0].String() + langout.Engine = "duckduckgo" + langout.SourceLang = FromOrig + langout.TargetLang = ToOrig return langout, nil } -func TranslateAll(to string, from string, query string) (string, string, string, string, string, string, string, string) { +func TranslateAll(to string, from string, query string) ([]LangOut) { reverso, _ := TranslateReverso(to, from, query) google, _ := TranslateGoogle(to, from, query) libretranslate, _ := TranslateLibreTranslate(to, from, query) @@ -283,5 +324,7 @@ func TranslateAll(to string, from string, query string) (string, string, string, yandex, _ := TranslateYandex(to, from, query) deepl, _ := TranslateDeepl(to, from, query) duckduckgo, _ := TranslateDuckDuckGo(to, from, query) - return google.OutputText, reverso.OutputText, libretranslate.OutputText, watson.OutputText, mymemory.OutputText, yandex.OutputText, deepl.OutputText, duckduckgo.OutputText + + langout := []LangOut{reverso, google, libretranslate, watson, mymemory, yandex, deepl, duckduckgo} + return langout } diff --git a/utils/tts.go b/utils/tts.go index 74cb47b..956bcab 100644 --- a/utils/tts.go +++ b/utils/tts.go @@ -13,7 +13,7 @@ type ReversoTTS struct { Voice string } -func TTSGoogle(lang string, text string) string { +func TTSGoogle(lang string, text string) []byte { type Options struct { Lang string `url:"tl"` Text string `url:"q"` @@ -31,9 +31,9 @@ func TTSGoogle(lang string, text string) string { if err != nil { file = "" } - return file + return []byte(file) } -func TTSReverso(lang string, text string) string { +func TTSReverso(lang string, text string) []byte { var TTSData = []ReversoTTS{ // http://voice.reverso.net/RestPronunciation.svc/v1/output=json/GetAvailableVoices with randomized deduplication ReversoTTS{ @@ -149,5 +149,5 @@ func TTSReverso(lang string, text string) string { if err != nil { file = "" } - return file + return []byte(file) }