diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..98c3969 --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ +compile: generate clean build + +generate: + @printf "Generating code\n" + @go generate ./... + +VERSION = $(shell git describe --always --abbrev=40 --dirty) + +build: + @printf "Compiling\n" + @mkdir bin/ &> /dev/null || exit 0 + @go build + @printf "\n" + +clean: + @rm -fr ./bin \ No newline at end of file diff --git a/internal/static/static.go b/internal/static/static.go new file mode 100644 index 0000000..8db3663 --- /dev/null +++ b/internal/static/static.go @@ -0,0 +1,3 @@ +package static + +//go:generate go-bindata -pkg $GOPACKAGE --prefix "../../static/" ../../static/... diff --git a/internal/templates/templates.go b/internal/templates/templates.go new file mode 100644 index 0000000..64a8e61 --- /dev/null +++ b/internal/templates/templates.go @@ -0,0 +1,3 @@ +package templates + +//go:generate go-bindata -pkg $GOPACKAGE --prefix "../../templates/" ../../templates/... diff --git a/main.go b/main.go index c50a7a0..56bef8e 100644 --- a/main.go +++ b/main.go @@ -1,40 +1,17 @@ package main import ( - "bytes" "encoding/json" "fmt" "git.fuyu.moe/Fuyu/router" - "io/ioutil" - "mime" "net/http" - "path" - "path/filepath" "strconv" - "strings" - "time" ) -func main() { - //fmt.Println("Hello world") - r := router.New() - r.GET(`/static/*asset`, getStatic) - r.GET(`/`, home) - r.GET(`/compare/:user`, compare) - err := r.Start(`:8070`) - check(err) -} +// nolint: errcheck type jikanAPIUserList struct { - RequestHash string `json:"request_hash"` - RequestCached bool `json:"request_cached"` - RequestCacheExpiry int `json:"request_cache_expiry"` - Completed int `json:"completed"` - Watching int `json:"watching"` - Dropped int `json:"dropped"` - PlanToWatch int `json:"plan_to_watch"` - OnHold int `json:"on_hold"` - Anime []jikanAPIAnime `json:"anime"` + Anime []jikanAPIAnime `json:"anime"` } type jikanAPIAnime struct { @@ -74,6 +51,16 @@ type meikanAPIIDs struct { AnidbID int `json:"anidb"` } +func main() { + r := router.New() + r.Renderer = NewRenderer() + r.GET(`/static/*asset`, getStatic) + r.GET(`/`, home) + r.GET(`/compare/:user`, compare) + err := r.Start(`:8070`) + check(err) +} + func check(e error) { if e != nil { panic(e) @@ -81,31 +68,19 @@ func check(e error) { } func home(c *router.Context) error { - return c.String(200, "Test") + return c.Render(200, `index`, ``) } func compare(c *router.Context) error { - start := time.Now() user := c.Param(`user`) //https://api.jikan.moe/v3/user/nekomata1037/animelist/all //https://api.meikan.moe/v1/ids/anime jikanList := jikanAPIGetUserAnimelist(user) var anime []meikanListItem - //fmt.Println(result) fmt.Println("Getting IDs") IDs := meikanAPIGetIDs() - confMap := map[int]int{} - for _, v := range IDs { - confMap[v.MyanimelistID] = v.MeikanID - } - fmt.Printf("35248 is %d \n", confMap[35248]) for i := 0; i < len(jikanList.Anime); i++ { - //fmt.Println(result.Anime[i].Title) - for d := 0; d < len(IDs); d++ { - if jikanList.Anime[i].MyanimelistID == IDs[d].MyanimelistID { - jikanList.Anime[i].MeikanID = IDs[d].MeikanID - } - } + jikanList.Anime[i].MeikanID = IDs[jikanList.Anime[i].MyanimelistID] temp := meikanListItem{Anime: meikanAnime{ID: jikanList.Anime[i].MeikanID, Title: jikanList.Anime[i].Title, Type: jikanList.Anime[i].Type, @@ -114,19 +89,14 @@ func compare(c *router.Context) error { Rating: jikanList.Anime[i].Score} switch jikanList.Anime[i].WatchingStatus { case 1: - jikanList.Completed++ temp.State = "Watching" case 2: - jikanList.Completed++ temp.State = "Finished" case 3: - jikanList.OnHold++ temp.State = "On Hold" case 4: - jikanList.Dropped++ temp.State = "Dropped" case 6: - jikanList.PlanToWatch++ temp.State = "Plan to watch" } switch jikanList.Anime[i].AiringStatus { @@ -135,69 +105,33 @@ func compare(c *router.Context) error { } anime = append(anime, temp) } - //fmt.Println(anime) - //resJSON, err := json.MarshalIndent(result, "", "\t") - //check(err) - //jsonfile := []byte(resJSON) - elapsed := time.Since(start) - fmt.Printf("Generating json took %s\n", elapsed) + return c.JSON(200, anime) } func jikanAPIGetUserAnimelist(user string) jikanAPIUserList { - var result jikanAPIUserList - start := time.Now() + var userList jikanAPIUserList for i := 1; ; i++ { resp, err := http.Get("https://api.jikan.moe/v3/user/" + user + "/animelist/all/" + strconv.Itoa(i)) check(err) - defer resp.Body.Close() var tempResult jikanAPIUserList - body, err := ioutil.ReadAll(resp.Body) - check(err) - if i == 1 { - _ = json.NewDecoder(bytes.NewReader(body)).Decode(&result) - elapsed := time.Since(start) - fmt.Printf("Searching page 1 took %s\n", elapsed) - continue - } else { - _ = json.NewDecoder(bytes.NewReader(body)).Decode(&tempResult) - result.Anime = append(result.Anime, tempResult.Anime...) - elapsed := time.Since(start) - fmt.Printf("Searching page %d took %s\n", i, elapsed) - } + _ = json.NewDecoder(resp.Body).Decode(&tempResult) + userList.Anime = append(userList.Anime, tempResult.Anime...) if len(tempResult.Anime) == 0 { break } - elapsed := time.Since(start) - fmt.Printf("Searching the userlist took %s\n", elapsed) } - return result + return userList } -func meikanAPIGetIDs() []meikanAPIIDs { - start := time.Now() +func meikanAPIGetIDs() map[int]int { resp, err := http.Get("https://api.meikan.moe/v1/ids/anime") check(err) - defer resp.Body.Close() var result []meikanAPIIDs - body, err := ioutil.ReadAll(resp.Body) - check(err) - _ = json.NewDecoder(bytes.NewReader(body)).Decode(&result) - elapsed := time.Since(start) - fmt.Printf("Getting all the IDs took %s\n", elapsed) - return result -} - -func getStatic(c *router.Context) error { - path := path.Clean(strings.TrimPrefix(c.Request.URL.Path, `/static/`)) - - data, err := ioutil.ReadFile(`./static/` + path) - if err != nil { - return c.String(404, `Resource not found`) + _ = json.NewDecoder(resp.Body).Decode(&result) + IDsMap := map[int]int{} + for _, id := range result { + IDsMap[id.MyanimelistID] = id.MeikanID } - - c.Response.Header().Set(`Content-Type`, mime.TypeByExtension(filepath.Ext(path))) - c.Response.Write(data) - - return nil + return IDsMap } diff --git a/pages/index.html b/pages/index.html new file mode 100644 index 0000000..0d92a3c --- /dev/null +++ b/pages/index.html @@ -0,0 +1,9 @@ + + + + This is a page + + + + + \ No newline at end of file diff --git a/render.go b/render.go new file mode 100644 index 0000000..1e13188 --- /dev/null +++ b/render.go @@ -0,0 +1,88 @@ +package main + +import ( + "fmt" + "html/template" + "io" + "mime" + "path" + "path/filepath" + "strings" + + "git.fuyu.moe/Fuyu/router" + "git.fuyu.moe/Tracreed/mal-importer/internal/static" + "git.fuyu.moe/Tracreed/mal-importer/internal/templates" +) + +// Renderer rendders templates +type Renderer struct { + templates map[string]*template.Template +} + +// NewRenderer loads all templates +func NewRenderer() *Renderer { + t := &Renderer{} + if t.templates == nil { + t.templates = make(map[string]*template.Template) + } + + components := template.New(``) + pages := []string{} + for _, v := range templates.AssetNames() { + if strings.HasPrefix(v, `pages/`) { + pages = append(pages, v) + continue + } + + data, err := templates.Asset(v) + if err != nil { + panic(err) + } + template.Must(components.New(v).Parse(string(data))) + } + + for _, page := range pages { + data, err := templates.Asset(page) + if err != nil { + panic(err) + } + tmpl, _ := components.Clone() + + name := removeExt(strings.TrimPrefix(page, `pages/`)) + t.templates[name] = template.Must(tmpl.New(page).Parse(string(data))) + } + + return t +} + +// Render implements echo's Renderer interface +func (t *Renderer) Render(w io.Writer, name string, data interface{}, c *router.Context) error { + tmpl, ok := t.templates[name] + if !ok { + return fmt.Errorf(`template '%s' not found`, name) + } + + templateData := struct { + Content interface{} + }{data} + + return tmpl.ExecuteTemplate(w, `base`, templateData) +} + +func removeExt(s string) string { + return strings.TrimSuffix(s, path.Ext(s)) +} + +func getStatic(c *router.Context) error { + path := path.Clean(strings.TrimPrefix(c.Request.URL.Path, `/static/`)) + + data, err := static.Asset(path) + if err != nil { + return c.String(404, `Resource not found`) + } + + c.Response.Header().Set(`Content-Type`, mime.TypeByExtension(filepath.Ext(path))) + _, _ = c.Response.Write(data) + + return nil +} diff --git a/static/stylesheet.css b/static/stylesheet.css new file mode 100644 index 0000000..6b9c06d --- /dev/null +++ b/static/stylesheet.css @@ -0,0 +1,3 @@ +body { + color: black; +} \ No newline at end of file diff --git a/templates/components/base.gohtml b/templates/components/base.gohtml new file mode 100644 index 0000000..4c0a4e8 --- /dev/null +++ b/templates/components/base.gohtml @@ -0,0 +1,18 @@ +{{ define "base" }} + + + + + + + Meikan data - {{ block "title" . }}Home{{ end }} + + + + +
+ {{ block "body" . }}{{ end }} +
+ + +{{ end }} \ No newline at end of file diff --git a/templates/pages/index.gohtml b/templates/pages/index.gohtml new file mode 100644 index 0000000..4d64d5a --- /dev/null +++ b/templates/pages/index.gohtml @@ -0,0 +1,3 @@ +{{ define "body" }} +

Hello, 世界!

+{{ end }} \ No newline at end of file