nicovideo-translator 0.1.0.0 → 0.1.0.1
raw patch · 8 files changed
+122/−105 lines, 8 filesdep +cmdargsdep +naver-translatedep +text-formatdep −aesondep −lens-aesondep −randomdep ~basesetup-changed
Dependencies added: cmdargs, naver-translate, text-format
Dependencies removed: aeson, lens-aeson, random
Dependency ranges changed: base
Files
- README.md +21/−8
- Setup.hs +1/−1
- lib/NicovideoTranslator/Main.hs +80/−0
- lib/NicovideoTranslator/Proxy.hs +1/−1
- lib/NicovideoTranslator/Translate.hs +5/−37
- nicovideo-translator.cabal +12/−13
- nicovideo-translator.sig binary
- src/Main.hs +2/−45
README.md view
@@ -1,6 +1,12 @@ Nico Nico Douga (ニコニコ動画) Comment Translator ================================================= +[![Build Status][0]][1]++[0]: https://travis-ci.org/dahlia/nicovideo-translator.svg+[1]: https://travis-ci.org/dahlia/nicovideo-translator++ Installation ------------ @@ -14,12 +20,12 @@ To make the translator to intercept comments from Nico Nico comment server, you have to alias Nico Nico comment server domain (`msg.nicovideo.jp`) to-your localhost (`127.0.0.1`). Open your [hosts file][1] using text editor+your localhost (`127.0.0.1`). Open your [hosts file][2] using text editor (you probably need administrator permission), and then add the following line: 127.0.0.1 msg.nicovideo.jp -[1]: http://en.wikipedia.org/wiki/Hosts_%28file%29+[2]: http://en.wikipedia.org/wiki/Hosts_%28file%29 Proxy server@@ -30,22 +36,29 @@ (you probably need administrator permission to listen 80 port): $ nicovideo-translator+ Running on http://0.0.0.0:80/ (Press ^C to quit)+ Upstream: msg.nicovideo.jp (202.248.110.173) You can terminate the server by pressing Ctrl-C. +It can optionally take the target language which is a two-letter+e.g. `en`, `ko` through `-l`/`--language` option: + $ nicovideo-translator --language ko++ Open source ----------- -It's written by [Hong Minhee][2], and distributed under [AGPLv3[].-You can find the source code from the [Git repository][3]:+It's written by [Hong Minhee][3], and distributed under [AGPLv3][].+You can find the source code from the [Git repository][4]: $ git clone git://github.com/dahlia/nicovideo-translator -Please report bugs to the [issue tracker][4] if you find.+Please report bugs to the [issue tracker][5] if you find. Pull requests welcome! -[2]: http://hongminhee.org/-[3]: https://github.com/dahlia/nicovideo-translator-[4]: https://github.com/dahlia/nicovideo-translator/issues+[3]: http://hongminhee.org/+[4]: https://github.com/dahlia/nicovideo-translator+[5]: https://github.com/dahlia/nicovideo-translator/issues [AGPLv3]: http://www.gnu.org/licenses/agpl-3.0.html
Setup.hs view
@@ -1,3 +1,3 @@-import Distribution.Simple+import Distribution.Simple (defaultMain) main = defaultMain
+ lib/NicovideoTranslator/Main.hs view
@@ -0,0 +1,80 @@+{-# LANGUAGE DeriveDataTypeable, OverloadedStrings #-}+module NicovideoTranslator.Main (main) where++import Data.Char (toLower)+import System.IO (stderr, stdout)+import System.IO.Error (catchIOError)++import Data.Data (Data)+import qualified Data.LanguageCodes as L+import qualified Data.Text as T+import Data.Text.Encoding (encodeUtf8)+import Data.Text.Format (Format, format)+import Data.Text.Format.Params (Params)+import Data.Text.Format.Types (Only(Only))+import Data.Text.IO (hPutStrLn)+import qualified Data.Text.Lazy as LT+import Data.Typeable (Typeable)+import Network.DNS.Resolver (defaultResolvConf, makeResolvSeed, withResolver)+import Network.DNS.Lookup (lookupA)+import Network.Wai.Handler.Warp (Port, run)+import System.Console.CmdArgs (cmdArgs, help, typ, (&=))+import System.Locale.SetLocale (Category(LC_CTYPE), setLocale)++import NicovideoTranslator.Proxy (ProxyConfiguration(ProxyConfiguration), app)++data Translator = Translator { port :: Port+ , language :: String+ } deriving (Show, Data, Typeable)++formatIoError :: Params ps => Format -> ps -> IO a+formatIoError fmt ps = ioError $ userError $ LT.unpack $ format fmt ps ++readLanguageCode :: [Char] -> IO L.ISO639_1+readLanguageCode (x:y:[]) =+ case L.fromChars (toLower x) (toLower y) of+ Just lang -> return lang+ _ -> formatIoError "{} is wrong language code" (Only (x:y:[]))+readLanguageCode lang = formatIoError "{} is wrong language code" (Only lang)++currentLanguage :: IO L.ISO639_1+currentLanguage = do+ currentLocale <- setLocale LC_CTYPE Nothing+ case currentLocale of+ Just s -> readLanguageCode s+ Nothing -> formatIoError "locale is not set" ()++defaultUpstreamHost :: T.Text+defaultUpstreamHost = "msg.nicovideo.jp"++translateCmdArgs :: String -> Translator+translateCmdArgs lang =+ Translator { language = lang &= typ "LANG"+ &= help "Target language to translate to [en]"+ , port = 80 &= typ "PORT"+ &= help "Port number to listen [80]"+ }++main :: IO ()+main = do+ currentLang <- catchIOError currentLanguage (\_ -> return L.EN)+ opts <- cmdArgs $ translateCmdArgs $ L.language currentLang+ lang <- readLanguageCode $ language opts+ let portNum = port opts+ hPutStrLn stdout $ LT.toStrict $+ format "Running on http://0.0.0.0:{}/ (Press ^C to quit)" (Only portNum)+ rs <- makeResolvSeed defaultResolvConf+ resolution <- withResolver rs $+ \resolver -> lookupA resolver (encodeUtf8 defaultUpstreamHost)+ case resolution of+ Right (resolvedHost:_) ->+ let upstreamHost = T.pack $ show resolvedHost+ in do+ hPutStrLn stdout $ T.concat ["Upstream: "+ , defaultUpstreamHost+ , " (", upstreamHost, ")"+ ]+ run portNum $ app (ProxyConfiguration lang upstreamHost)+ _ -> hPutStrLn stderr $ T.concat [ "error: failed to resolve "+ , defaultUpstreamHost+ ]
lib/NicovideoTranslator/Proxy.hs view
@@ -87,7 +87,7 @@ request "POST" = postWith request "PUT" = putWith request "DELETE" = \options url _ -> deleteWith options url-request _= \_ _ _ -> ioError $ userError $ "unsupported method"+request _ = \_ _ _ -> ioError $ userError $ "unsupported method" translateResponse :: ISO639_1 -> LB.ByteString -> IO LB.ByteString translateResponse lang response = case parseLBS def response of
lib/NicovideoTranslator/Translate.hs view
@@ -5,44 +5,12 @@ , translateMultiple ) where -import Control.Lens ((^?))-import Data.Aeson.Lens (key)-import Data.Aeson.Types (Value(String))-import Data.LanguageCodes (ISO639_1, language)-import Data.Text (Text, cons, intercalate, pack, snoc, splitOn, strip)-import Network.Wreq (FormParam((:=)), post, responseBody)-import System.Random (getStdRandom, randomR)+import qualified Language.Translate.Naver as Naver+import Data.LanguageCodes (ISO639_1(JA))+import Data.Text (Text) translate :: ISO639_1 -> Text -> IO Text-translate lang text =- let response =- post- "http://translate.naver.com/translate.dic"- [ "query" := text- , "srcLang" := ("ja" :: Text)- , "tarLang" := (pack $ language lang)- , "highlight" := ("0" :: Text)- , "hurigana" := ("0" :: Text)]- getResultData resp = resp ^? responseBody . key "resultData"- resultData = response >>= return . getResultData- in- resultData >>= \dat -> case dat of- Just (String translated) -> return translated- _ -> ioError $ userError "translate.naver.com sent invalid response"--arbitraryNumericLength :: Int-arbitraryNumericLength = 20--arbitraryNumeric :: IO Text-arbitraryNumeric =- let- randomDigit i = getStdRandom (randomR (if i > 1 then '0' else '1', '9'))- string = sequence $ map randomDigit [1..arbitraryNumericLength]- in- string >>= return . pack+translate = Naver.translate JA translateMultiple :: ISO639_1 -> [Text] -> IO [Text]-translateMultiple lang texts = do- spliter <- arbitraryNumeric- result <- translate lang $ intercalate (snoc (cons ' ' spliter) ' ') texts- return $ map strip $ splitOn spliter result+translateMultiple = Naver.translateMultiple JA
nicovideo-translator.cabal view
@@ -1,5 +1,5 @@ name: nicovideo-translator-version: 0.1.0.0+version: 0.1.0.1 synopsis: Nico Nico Douga (ニコニコ動画) Comment Translator homepage: https://github.com/dahlia/nicovideo-translator bug-reports: https://github.com/dahlia/nicovideo-translator/issues@@ -15,21 +15,25 @@ library hs-source-dirs: lib- exposed-modules: NicovideoTranslator.Proxy,+ exposed-modules: NicovideoTranslator.Main,+ NicovideoTranslator.Proxy, NicovideoTranslator.Translate- build-depends: aeson >=0.7.0.6 && <0.8.0.0,- base >=4.7 && <4.8,+ build-depends: base >=4.5.0.0 && <4.8.0.0, bytestring >=0.10.4.0 && <0.11.0.0, case-insensitive >=1.2.0.0 && <1.3.0.0,+ cmdargs >=0.10.12 && <0.11.0, containers,+ dns >=1.4.4 && <1.5.0, http-client >=0.4.9 && <0.5.0, http-types >=0.8.6 && <0.9.0, iso639, lens >=4.8 && <4.9,- lens-aeson >=1.0.0.3 && <1.1.0.0,- random >=1.0.1.1 && <1.1.0.0,+ naver-translate >=0.1.0.0 && <0.2.0.0,+ setlocale >=1.0.0.2 && <1.1.0.0, text >=1.1.0.0 && <1.2.0.0,+ text-format >=0.3.1.1 && <0.4.0.0, wai >=3.0.2.3 && <3.1.0.0,+ warp >=3.0.10 && <3.1.0, wreq >=0.3.0.1 && <0.4.0.0, xml-conduit >=1.2.3.3 && <1.3.0.0 default-language: Haskell2010@@ -39,12 +43,7 @@ executable nicovideo-translator hs-source-dirs: src main-is: Main.hs- build-depends: base >=4.7 && <4.8,- dns >=1.4.4 && <1.5.0,- iso639,- nicovideo-translator,- setlocale >=1.0.0.2 &&<1.1.0.0,- text >=1.1.0.0 && <1.2.0.0,- warp >=3.0.10 && <3.1.0+ build-depends: base >=4.5.0.0 && <4.8.0.0,+ nicovideo-translator default-language: Haskell2010 ghc-options: -Wall -fwarn-incomplete-uni-patterns -threaded
− nicovideo-translator.sig
binary file changed (287 → absent bytes)
src/Main.hs view
@@ -1,49 +1,6 @@-{-# LANGUAGE OverloadedStrings #-} module Main (main) where -import Data.Char (toLower)-import System.IO (stderr, stdout)-import System.IO.Error (catchIOError)--import Data.LanguageCodes (ISO639_1(EN), fromChars)-import qualified Data.Text as T-import Data.Text.Encoding (encodeUtf8)-import Data.Text.IO (hPutStrLn)-import Network.DNS.Resolver (defaultResolvConf, makeResolvSeed, withResolver)-import Network.DNS.Lookup (lookupA)-import Network.Wai.Handler.Warp (run)-import System.Locale.SetLocale (Category(LC_CTYPE), setLocale)--import NicovideoTranslator.Proxy (ProxyConfiguration(ProxyConfiguration), app)--language :: IO ISO639_1-language = do- currentLocale <- setLocale LC_CTYPE Nothing- case currentLocale of- Just (x:y:ys) -> case fromChars (toLower x) (toLower y) of- Just lang -> return lang- _ -> ioError $ userError $ (x:y:ys) ++ " is wrong LC_CTYPE value"- _ -> ioError $ userError "locale is not set"--defaultUpstreamHost :: T.Text-defaultUpstreamHost = "msg.nicovideo.jp"+import qualified NicovideoTranslator.Main as M main :: IO ()-main = do- putStrLn "Running on http://0.0.0.0:80/ (Press ^C to quit)"- lang <- catchIOError language (\_ -> return EN)- rs <- makeResolvSeed defaultResolvConf- resolution <- withResolver rs $- \resolver -> lookupA resolver (encodeUtf8 defaultUpstreamHost)- case resolution of- Right (resolvedHost:_) ->- let upstreamHost = T.pack $ show resolvedHost- in do- hPutStrLn stdout $ T.concat ["Upstream: "- , defaultUpstreamHost- , " (", upstreamHost, ")"- ]- run 80 $ app (ProxyConfiguration lang upstreamHost)- _ -> hPutStrLn stderr $ T.concat [ "error: failed to resolve "- , defaultUpstreamHost- ]+main = M.main